From fcc42bc277f7db74236fb8bf57caa50c4189e958 Mon Sep 17 00:00:00 2001 From: Bartek Kryza Date: Sat, 5 Feb 2022 15:22:14 +0100 Subject: [PATCH] Added include! directive to config files allowing nesting diagram configs --- .clang-uml | 120 ++------------------------- .clang-uml.example | 39 --------- src/config/config.cc | 71 ++++++++++++---- src/main.cc | 9 +- src/util/util.h | 5 +- uml/class_model_class_diagram.yml | 13 +++ uml/common_model_class_diagram.yml | 13 +++ uml/config_class_diagram.yml | 13 +++ uml/decorators_class_diagram.yml | 13 +++ uml/diagram_model_class_diagram.yml | 22 +++++ uml/main_package_diagram.yml | 12 +++ uml/package_model_class_diagram.yml | 13 +++ uml/sequence_model_class_diagram.yml | 13 +++ 13 files changed, 184 insertions(+), 172 deletions(-) delete mode 100644 .clang-uml.example create mode 100644 uml/class_model_class_diagram.yml create mode 100644 uml/common_model_class_diagram.yml create mode 100644 uml/config_class_diagram.yml create mode 100644 uml/decorators_class_diagram.yml create mode 100644 uml/diagram_model_class_diagram.yml create mode 100644 uml/main_package_diagram.yml create mode 100644 uml/package_model_class_diagram.yml create mode 100644 uml/sequence_model_class_diagram.yml diff --git a/.clang-uml b/.clang-uml index 192bfc80..32bdc7f0 100644 --- a/.clang-uml +++ b/.clang-uml @@ -2,122 +2,18 @@ compilation_database_dir: debug output_directory: docs/diagrams diagrams: main_package: - type: package - glob: - - src/**/*.h - - src/**/*.cc - include: - namespaces: - - clanguml - using_namespace: - - clanguml - plantuml: - before: - - 'title clang-uml namespaces' + include!: uml/main_package_diagram.yml config_class: - type: class - include_relations_also_as_members: false - glob: - - src/config/config.h - - src/config/config.cc - include: - namespaces: - - clanguml::config - using_namespace: - - clanguml::config - plantuml: - before: - - 'title clang-uml configuration model' + include!: uml/config_class_diagram.yml decorators_class: - type: class - include_relations_also_as_members: false - glob: - - src/decorators/decorators.h - - src/decorators/decorators.cc - include: - namespaces: - - clanguml::decorators - using_namespace: - - clanguml::decorators - plantuml: - before: - - 'title clang-uml decorators model' + include!: uml/decorators_class_diagram.yml common_model_class: - type: class - include_relations_also_as_members: false - glob: - - src/common/model/*.h - - src/common/model/*.cc - include: - namespaces: - - clanguml::common::model - using_namespace: - - clanguml::common::model - plantuml: - before: - - 'title clang-uml common diagram model' + include!: uml/common_model_class_diagram.yml class_model_class: - type: class - include_relations_also_as_members: false - glob: - - src/class_diagram/model/*.h - - src/class_diagram/model/*.cc - include: - namespaces: - - clanguml::class_diagram::model - using_namespace: - - clanguml::class_diagram::model - plantuml: - before: - - 'title clang-uml class diagram model' + include!: uml/class_model_class_diagram.yml sequence_model_class: - type: class - include_relations_also_as_members: false - glob: - - src/sequence_diagram/model/*.h - - src/sequence_diagram/model/*.cc - include: - namespaces: - - clanguml::sequence_diagram::model - using_namespace: - - clanguml::sequence_diagram::model - plantuml: - before: - - 'title clang-uml sequence diagram model' + include!: uml/sequence_model_class_diagram.yml package_model_class: - type: class - include_relations_also_as_members: false - glob: - - src/package_diagram/model/*.h - - src/package_diagram/model/*.cc - include: - namespaces: - - clanguml::package_diagram::model - using_namespace: - - clanguml::package_diagram::model - plantuml: - before: - - 'title clang-uml package diagram model' + include!: uml/package_model_class_diagram.yml diagram_model_class: - type: class - include_relations_also_as_members: false - glob: - - src/common/model/*.h - - src/common/model/*.cc - - src/class_diagram/model/*.h - - src/class_diagram/model/*.cc - - src/sequence_diagram/model/*.h - - src/sequence_diagram/model/*.cc - - src/package_diagram/model/*.h - - src/package_diagram/model/*.cc - include: - namespaces: - - clanguml::common::model - - clanguml::class_diagram::model - - clanguml::sequence_diagram::model - - clanguml::package_diagram::model - using_namespace: - - clanguml - plantuml: - before: - - 'title clang-uml diagram model' \ No newline at end of file + include!: uml/diagram_model_class_diagram.yml \ No newline at end of file diff --git a/.clang-uml.example b/.clang-uml.example deleted file mode 100644 index 9c8e85e6..00000000 --- a/.clang-uml.example +++ /dev/null @@ -1,39 +0,0 @@ -compilation_database_dir: build -output_directory: puml -diagrams: - myproject_class: - type: class - glob: - - src/**.h - - src/**.cc - using_namespace: - - myproject - include: - namespaces: - - myproject - exclude: - namespaces: - - myproject::detail - plantuml: - after: - - 'note left of @A(MyProjectMain) : Main class of myproject library.' - main_sequence_diagram: - type: sequence - glob: - - src/main.cc - using_namespace: - - "" - start_from: - - function: "main()" - include: - namespaces: - - clanguml - exclude: - namespaces: - - std - - CLI - plantuml: - before: - - "' main test sequence diagram" - after: - - "' end" diff --git a/src/config/config.cc b/src/config/config.cc index f94dc9d1..5c0d1517 100644 --- a/src/config/config.cc +++ b/src/config/config.cc @@ -22,9 +22,19 @@ namespace config { config load(const std::string &config_file) { - YAML::Node doc = YAML::LoadFile(config_file); + try { + YAML::Node doc = YAML::LoadFile(config_file); - return doc.as(); + return doc.as(); + } + catch (YAML::BadFile &e) { + throw std::runtime_error(fmt::format( + "Could not open config file {}: {}", config_file, e.what())); + } + catch (YAML::Exception &e) { + throw std::runtime_error(fmt::format( + "Cannot parse YAML file {}: {}", config_file, e.what())); + } } std::string to_string(const diagram_type t) @@ -321,6 +331,34 @@ template <> struct convert { } }; +std::shared_ptr parse_diagram_config(const Node &d) +{ + const auto diagram_type = d["type"].as(); + + if (diagram_type == "class") { + return std::make_shared(d.as()); + } + else if (diagram_type == "sequence") { + return std::make_shared(d.as()); + } + else if (diagram_type == "package") { + return std::make_shared(d.as()); + } + + LOG_WARN("Diagrams of type {} are not supported... ", diagram_type); + + return {}; +} + +inline bool has_key(const YAML::Node &n, const std::string &key) +{ + assert(n.Type() == NodeType::Map); + + return std::count_if(n.begin(), n.end(), [&key](auto &&n) { + return n.first.template as() == key; + }) > 0; +} + // // config Yaml decoder // @@ -342,26 +380,23 @@ template <> struct convert { assert(diagrams.Type() == NodeType::Map); for (const auto &d : diagrams) { - const auto diagram_type = d.second["type"].as(); auto name = d.first.as(); - if (diagram_type == "class") { - rhs.diagrams[name] = std::make_shared( - d.second.as()); - } - else if (diagram_type == "sequence") { - rhs.diagrams[name] = std::make_shared( - d.second.as()); - } - else if (diagram_type == "package") { - rhs.diagrams[name] = std::make_shared( - d.second.as()); + std::shared_ptr diagram_config; + + if (has_key(d.second, "include!")) { + YAML::Node node = + YAML::LoadFile(d.second["include!"].as()); + + diagram_config = parse_diagram_config(node); } else { - LOG_WARN( - "Diagrams of type {} are not supported at the moment... ", - diagram_type); + diagram_config = parse_diagram_config(d.second); + } + + if (diagram_config) { + diagram_config->name = name; + rhs.diagrams[name] = diagram_config; } - rhs.diagrams[name]->name = name; } return true; diff --git a/src/main.cc b/src/main.cc index 8118c1ea..a60f2e53 100644 --- a/src/main.cc +++ b/src/main.cc @@ -74,7 +74,14 @@ int main(int argc, const char *argv[]) LOG_INFO("Loading clang-uml config from {}", config_path); - auto config = clanguml::config::load(config_path); + clanguml::config::config config; + try { + config = clanguml::config::load(config_path); + } + catch (std::runtime_error &e) { + LOG_ERROR(e.what()); + return 1; + } if (list_diagrams) { print_diagrams_list(config); diff --git a/src/util/util.h b/src/util/util.h index dd65930d..d3ece03a 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -181,9 +181,10 @@ bool contains(const T &container, const E &element) container.end(); } else { - return std::find(container.cbegin(), container.cend(), element) != - container.cend(); + return std::find(container.begin(), container.end(), element) != + container.end(); } } + } // namespace util } // namespace clanguml \ No newline at end of file diff --git a/uml/class_model_class_diagram.yml b/uml/class_model_class_diagram.yml new file mode 100644 index 00000000..d5c70e5b --- /dev/null +++ b/uml/class_model_class_diagram.yml @@ -0,0 +1,13 @@ +type: class +include_relations_also_as_members: false +glob: + - src/class_diagram/model/*.h + - src/class_diagram/model/*.cc +include: + namespaces: + - clanguml::class_diagram::model +using_namespace: + - clanguml::class_diagram::model +plantuml: + before: + - 'title clang-uml class diagram model' \ No newline at end of file diff --git a/uml/common_model_class_diagram.yml b/uml/common_model_class_diagram.yml new file mode 100644 index 00000000..267f3f77 --- /dev/null +++ b/uml/common_model_class_diagram.yml @@ -0,0 +1,13 @@ +type: class +include_relations_also_as_members: false +glob: + - src/common/model/*.h + - src/common/model/*.cc +include: + namespaces: + - clanguml::common::model +using_namespace: + - clanguml::common::model +plantuml: + before: + - 'title clang-uml common diagram model' \ No newline at end of file diff --git a/uml/config_class_diagram.yml b/uml/config_class_diagram.yml new file mode 100644 index 00000000..69592b20 --- /dev/null +++ b/uml/config_class_diagram.yml @@ -0,0 +1,13 @@ +type: class +include_relations_also_as_members: false +glob: + - src/config/config.h + - src/config/config.cc +include: + namespaces: + - clanguml::config +using_namespace: + - clanguml::config +plantuml: + before: + - 'title clang-uml configuration model' \ No newline at end of file diff --git a/uml/decorators_class_diagram.yml b/uml/decorators_class_diagram.yml new file mode 100644 index 00000000..e2e5c548 --- /dev/null +++ b/uml/decorators_class_diagram.yml @@ -0,0 +1,13 @@ +type: class +include_relations_also_as_members: false +glob: + - src/decorators/decorators.h + - src/decorators/decorators.cc +include: + namespaces: + - clanguml::decorators +using_namespace: + - clanguml::decorators +plantuml: + before: + - 'title clang-uml decorators model' \ No newline at end of file diff --git a/uml/diagram_model_class_diagram.yml b/uml/diagram_model_class_diagram.yml new file mode 100644 index 00000000..2264ce80 --- /dev/null +++ b/uml/diagram_model_class_diagram.yml @@ -0,0 +1,22 @@ +type: class +include_relations_also_as_members: false +glob: + - src/common/model/*.h + - src/common/model/*.cc + - src/class_diagram/model/*.h + - src/class_diagram/model/*.cc + - src/sequence_diagram/model/*.h + - src/sequence_diagram/model/*.cc + - src/package_diagram/model/*.h + - src/package_diagram/model/*.cc +include: + namespaces: + - clanguml::common::model + - clanguml::class_diagram::model + - clanguml::sequence_diagram::model + - clanguml::package_diagram::model +using_namespace: + - clanguml +plantuml: + before: + - 'title clang-uml diagram model' \ No newline at end of file diff --git a/uml/main_package_diagram.yml b/uml/main_package_diagram.yml new file mode 100644 index 00000000..384631c1 --- /dev/null +++ b/uml/main_package_diagram.yml @@ -0,0 +1,12 @@ +type: package +glob: + - src/**/*.h + - src/**/*.cc +include: + namespaces: + - clanguml +using_namespace: + - clanguml +plantuml: + before: + - 'title clang-uml namespaces' \ No newline at end of file diff --git a/uml/package_model_class_diagram.yml b/uml/package_model_class_diagram.yml new file mode 100644 index 00000000..4a85a917 --- /dev/null +++ b/uml/package_model_class_diagram.yml @@ -0,0 +1,13 @@ +type: class +include_relations_also_as_members: false +glob: + - src/package_diagram/model/*.h + - src/package_diagram/model/*.cc +include: + namespaces: + - clanguml::package_diagram::model +using_namespace: + - clanguml::package_diagram::model +plantuml: + before: + - 'title clang-uml package diagram model' \ No newline at end of file diff --git a/uml/sequence_model_class_diagram.yml b/uml/sequence_model_class_diagram.yml new file mode 100644 index 00000000..ed54cf72 --- /dev/null +++ b/uml/sequence_model_class_diagram.yml @@ -0,0 +1,13 @@ +type: class +include_relations_also_as_members: false +glob: + - src/sequence_diagram/model/*.h + - src/sequence_diagram/model/*.cc +include: + namespaces: + - clanguml::sequence_diagram::model +using_namespace: + - clanguml::sequence_diagram::model +plantuml: + before: + - 'title clang-uml sequence diagram model' \ No newline at end of file