Added diagram templates to config
This commit is contained in:
@@ -18,6 +18,7 @@
|
|||||||
#include "enums.h"
|
#include "enums.h"
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
namespace clanguml::common::model {
|
namespace clanguml::common::model {
|
||||||
|
|
||||||
@@ -135,4 +136,18 @@ std::string to_string(const diagram_t t)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
diagram_t from_string(const std::string &s)
|
||||||
|
{
|
||||||
|
if (s == "class")
|
||||||
|
return diagram_t::kClass;
|
||||||
|
else if (s == "sequence")
|
||||||
|
return diagram_t::kSequence;
|
||||||
|
else if (s == "include")
|
||||||
|
return diagram_t::kInclude;
|
||||||
|
else if (s == "package")
|
||||||
|
return diagram_t::kPackage;
|
||||||
|
else
|
||||||
|
throw std::runtime_error{"Invalid diagram type: " + s};
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace clanguml::common::model
|
} // namespace clanguml::common::model
|
||||||
|
|||||||
@@ -80,4 +80,6 @@ std::string to_string(message_t m);
|
|||||||
|
|
||||||
std::string to_string(diagram_t r);
|
std::string to_string(diagram_t r);
|
||||||
|
|
||||||
|
diagram_t from_string(const std::string &s);
|
||||||
|
|
||||||
} // namespace clanguml::common::model
|
} // namespace clanguml::common::model
|
||||||
|
|||||||
@@ -50,6 +50,11 @@ struct plantuml {
|
|||||||
void append(const plantuml &r);
|
void append(const plantuml &r);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct diagram_template {
|
||||||
|
common::model::diagram_t type;
|
||||||
|
std::string jinja_template;
|
||||||
|
};
|
||||||
|
|
||||||
struct filter {
|
struct filter {
|
||||||
std::vector<common::model::namespace_> namespaces;
|
std::vector<common::model::namespace_> namespaces;
|
||||||
|
|
||||||
@@ -218,6 +223,9 @@ struct config : public inheritable_diagram_options {
|
|||||||
"compilation_database_dir", "."};
|
"compilation_database_dir", "."};
|
||||||
option<std::string> output_directory{"output_directory"};
|
option<std::string> output_directory{"output_directory"};
|
||||||
|
|
||||||
|
option<std::map<std::string, diagram_template>> diagram_templates{
|
||||||
|
"diagram_templates"};
|
||||||
|
|
||||||
std::map<std::string, std::shared_ptr<diagram>> diagrams;
|
std::map<std::string, std::shared_ptr<diagram>> diagrams;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ using clanguml::common::model::access_t;
|
|||||||
using clanguml::common::model::relationship_t;
|
using clanguml::common::model::relationship_t;
|
||||||
using clanguml::config::class_diagram;
|
using clanguml::config::class_diagram;
|
||||||
using clanguml::config::config;
|
using clanguml::config::config;
|
||||||
|
using clanguml::config::diagram_template;
|
||||||
using clanguml::config::filter;
|
using clanguml::config::filter;
|
||||||
using clanguml::config::generate_links_config;
|
using clanguml::config::generate_links_config;
|
||||||
using clanguml::config::git_config;
|
using clanguml::config::git_config;
|
||||||
@@ -101,6 +102,21 @@ void get_option<clanguml::config::comment_parser_t>(const Node &node,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
void get_option<std::map<std::string, clanguml::config::diagram_template>>(
|
||||||
|
const Node &node,
|
||||||
|
clanguml::config::option<
|
||||||
|
std::map<std::string, clanguml::config::diagram_template>> &option)
|
||||||
|
{
|
||||||
|
if (!node[option.name]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
option.set(
|
||||||
|
node[option.name]
|
||||||
|
.as<std::map<std::string, clanguml::config::diagram_template>>());
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<clanguml::config::diagram> parse_diagram_config(const Node &d)
|
std::shared_ptr<clanguml::config::diagram> parse_diagram_config(const Node &d)
|
||||||
{
|
{
|
||||||
const auto diagram_type = d["type"].as<std::string>();
|
const auto diagram_type = d["type"].as<std::string>();
|
||||||
@@ -526,6 +542,31 @@ template <> struct convert<relationship_hint_t> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// diagram_template Yaml decoder
|
||||||
|
//
|
||||||
|
template <> struct convert<diagram_template> {
|
||||||
|
static bool decode(const Node &node, diagram_template &rhs)
|
||||||
|
{
|
||||||
|
assert(node.Type() == NodeType::Map || node.Type() == NodeType::Scalar);
|
||||||
|
|
||||||
|
if (node.Type() == NodeType::Scalar) {
|
||||||
|
// Check that the template provided as string is at least valid YAML
|
||||||
|
const auto yaml_node = Load(node.as<std::string>());
|
||||||
|
const auto diagram_type = yaml_node["type"].as<std::string>();
|
||||||
|
rhs.type = clanguml::common::model::from_string(diagram_type);
|
||||||
|
rhs.jinja_template = Dump(yaml_node);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const auto diagram_type = node["type"].as<std::string>();
|
||||||
|
rhs.type = clanguml::common::model::from_string(diagram_type);
|
||||||
|
rhs.jinja_template = Dump(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// config Yaml decoder
|
// config Yaml decoder
|
||||||
//
|
//
|
||||||
@@ -547,6 +588,8 @@ template <> struct convert<config> {
|
|||||||
rhs.base_directory.set(node["__parent_path"].as<std::string>());
|
rhs.base_directory.set(node["__parent_path"].as<std::string>());
|
||||||
get_option(node, rhs.relative_to);
|
get_option(node, rhs.relative_to);
|
||||||
|
|
||||||
|
get_option(node, rhs.diagram_templates);
|
||||||
|
|
||||||
auto diagrams = node["diagrams"];
|
auto diagrams = node["diagrams"];
|
||||||
|
|
||||||
assert(diagrams.Type() == NodeType::Map);
|
assert(diagrams.Type() == NodeType::Map);
|
||||||
|
|||||||
@@ -259,3 +259,46 @@ TEST_CASE("Test config emitters", "[unit-test]")
|
|||||||
|
|
||||||
std::filesystem::remove(tmp_file);
|
std::filesystem::remove(tmp_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("Test config diagram_templates", "[unit-test]")
|
||||||
|
{
|
||||||
|
auto cfg =
|
||||||
|
clanguml::config::load("./test_config_data/diagram_templates.yml");
|
||||||
|
|
||||||
|
REQUIRE(cfg.diagram_templates().size() == 3);
|
||||||
|
|
||||||
|
REQUIRE(cfg.diagram_templates()["bases_hierarchy_tmpl"].type ==
|
||||||
|
clanguml::common::model::diagram_t::kClass);
|
||||||
|
REQUIRE(cfg.diagram_templates()["bases_hierarchy_tmpl"].jinja_template ==
|
||||||
|
R"(name: "{{ class_name }}_parents_hierarchy"
|
||||||
|
type: class
|
||||||
|
include:
|
||||||
|
parents: "{{ class_name }}"
|
||||||
|
namespaces: "{{ namespace_name }}"
|
||||||
|
relationships:
|
||||||
|
- inheritance
|
||||||
|
exclude:
|
||||||
|
access: [public, protected, private]
|
||||||
|
plantuml:
|
||||||
|
before:
|
||||||
|
- left to right direction)");
|
||||||
|
|
||||||
|
REQUIRE(cfg.diagram_templates()["children_hierarchy_tmpl"].type ==
|
||||||
|
clanguml::common::model::diagram_t::kClass);
|
||||||
|
REQUIRE(cfg.diagram_templates()["children_hierarchy_tmpl"].jinja_template ==
|
||||||
|
R"(name: "{{ class_name }}_children_hierarchy"
|
||||||
|
type: class
|
||||||
|
include:
|
||||||
|
subclasses: "{{ class_name }}"
|
||||||
|
namespaces: "{{ namespace_name }}"
|
||||||
|
relationships:
|
||||||
|
- inheritance
|
||||||
|
exclude:
|
||||||
|
access: [public, protected, private]
|
||||||
|
plantuml:
|
||||||
|
before:
|
||||||
|
- left to right direction)");
|
||||||
|
|
||||||
|
REQUIRE(cfg.diagram_templates()["main_sequence_tmpl"].type ==
|
||||||
|
clanguml::common::model::diagram_t::kSequence);
|
||||||
|
}
|
||||||
|
|||||||
39
tests/test_config_data/diagram_templates.yml
Normal file
39
tests/test_config_data/diagram_templates.yml
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
compilation_database_dir: debug
|
||||||
|
output_directory: output
|
||||||
|
|
||||||
|
diagram_templates:
|
||||||
|
bases_hierarchy_tmpl:
|
||||||
|
name: '{{ class_name }}_parents_hierarchy'
|
||||||
|
type: class
|
||||||
|
include:
|
||||||
|
parents: '{{ class_name }}'
|
||||||
|
namespaces: '{{ namespace_name }}'
|
||||||
|
relationships:
|
||||||
|
- inheritance
|
||||||
|
exclude:
|
||||||
|
access: [public, protected, private]
|
||||||
|
plantuml:
|
||||||
|
before:
|
||||||
|
- left to right direction
|
||||||
|
children_hierarchy_tmpl: |
|
||||||
|
name: '{{ class_name }}_children_hierarchy'
|
||||||
|
type: class
|
||||||
|
include:
|
||||||
|
subclasses: '{{ class_name }}'
|
||||||
|
namespaces: '{{ namespace_name }}'
|
||||||
|
relationships:
|
||||||
|
- inheritance
|
||||||
|
exclude:
|
||||||
|
access: [public, protected, private]
|
||||||
|
plantuml:
|
||||||
|
before:
|
||||||
|
- left to right direction
|
||||||
|
main_sequence_tmpl: |
|
||||||
|
name: main_sequence_diargam
|
||||||
|
type: sequence
|
||||||
|
glob: [ {{ }} ]
|
||||||
|
start_from:
|
||||||
|
- function: 'main(int,const char**)'
|
||||||
|
diagrams:
|
||||||
|
diagram1:
|
||||||
|
type: class
|
||||||
Reference in New Issue
Block a user