Added support for 'together' layout hint in package diagrams
This commit is contained in:
@@ -142,7 +142,7 @@ std::vector<std::string> diagram::get_translation_units() const
|
|||||||
return translation_units;
|
return translation_units;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::optional<std::string> class_diagram::get_together_group(
|
std::optional<std::string> diagram::get_together_group(
|
||||||
const std::string &full_name) const
|
const std::string &full_name) const
|
||||||
{
|
{
|
||||||
const auto relative_name = using_namespace().relative(full_name);
|
const auto relative_name = using_namespace().relative(full_name);
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ struct inheritable_diagram_options {
|
|||||||
option<bool> generate_packages{"generate_packages", false};
|
option<bool> generate_packages{"generate_packages", false};
|
||||||
option<generate_links_config> generate_links{"generate_links"};
|
option<generate_links_config> generate_links{"generate_links"};
|
||||||
option<git_config> git{"git"};
|
option<git_config> git{"git"};
|
||||||
|
option<layout_hints> layout{"layout"};
|
||||||
option<std::filesystem::path> base_directory{"__parent_path"};
|
option<std::filesystem::path> base_directory{"__parent_path"};
|
||||||
option<std::filesystem::path> relative_to{"relative_to"};
|
option<std::filesystem::path> relative_to{"relative_to"};
|
||||||
option<bool> generate_system_headers{"generate_system_headers", false};
|
option<bool> generate_system_headers{"generate_system_headers", false};
|
||||||
@@ -172,6 +173,9 @@ struct diagram : public inheritable_diagram_options {
|
|||||||
|
|
||||||
std::vector<std::string> get_translation_units() const;
|
std::vector<std::string> get_translation_units() const;
|
||||||
|
|
||||||
|
std::optional<std::string> get_together_group(
|
||||||
|
const std::string &full_name) const;
|
||||||
|
|
||||||
void initialize_type_aliases();
|
void initialize_type_aliases();
|
||||||
|
|
||||||
std::string name;
|
std::string name;
|
||||||
@@ -182,11 +186,6 @@ struct class_diagram : public diagram {
|
|||||||
|
|
||||||
common::model::diagram_t type() const override;
|
common::model::diagram_t type() const override;
|
||||||
|
|
||||||
option<layout_hints> layout{"layout"};
|
|
||||||
|
|
||||||
std::optional<std::string> get_together_group(
|
|
||||||
const std::string &full_name) const;
|
|
||||||
|
|
||||||
void initialize_relationship_hints();
|
void initialize_relationship_hints();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -202,16 +201,12 @@ struct package_diagram : public diagram {
|
|||||||
~package_diagram() override = default;
|
~package_diagram() override = default;
|
||||||
|
|
||||||
common::model::diagram_t type() const override;
|
common::model::diagram_t type() const override;
|
||||||
|
|
||||||
option<layout_hints> layout{"layout"};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct include_diagram : public diagram {
|
struct include_diagram : public diagram {
|
||||||
~include_diagram() override = default;
|
~include_diagram() override = default;
|
||||||
|
|
||||||
common::model::diagram_t type() const override;
|
common::model::diagram_t type() const override;
|
||||||
|
|
||||||
option<layout_hints> layout{"layout"};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct config : public inheritable_diagram_options {
|
struct config : public inheritable_diagram_options {
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ namespace clanguml::package_diagram::generators::plantuml {
|
|||||||
|
|
||||||
generator::generator(diagram_config &config, diagram_model &model)
|
generator::generator(diagram_config &config, diagram_model &model)
|
||||||
: common_generator<diagram_config, diagram_model>{config, model}
|
: common_generator<diagram_config, diagram_model>{config, model}
|
||||||
|
, together_group_stack_{false}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,6 +63,8 @@ void generator::generate(const package &p, std::ostream &ostr) const
|
|||||||
{
|
{
|
||||||
LOG_DBG("Generating package {}", p.name());
|
LOG_DBG("Generating package {}", p.name());
|
||||||
|
|
||||||
|
together_group_stack_.enter();
|
||||||
|
|
||||||
const auto &uns = m_config.using_namespace();
|
const auto &uns = m_config.using_namespace();
|
||||||
|
|
||||||
// Don't generate packages from namespaces filtered out by
|
// Don't generate packages from namespaces filtered out by
|
||||||
@@ -84,15 +87,29 @@ void generator::generate(const package &p, std::ostream &ostr) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (const auto &subpackage : p) {
|
for (const auto &subpackage : p) {
|
||||||
if (m_model.should_include(dynamic_cast<package &>(*subpackage)))
|
auto &pkg = dynamic_cast<package &>(*subpackage);
|
||||||
generate(dynamic_cast<const package &>(*subpackage), ostr);
|
if (m_model.should_include(pkg)) {
|
||||||
|
auto together_group =
|
||||||
|
m_config.get_together_group(pkg.full_name(false));
|
||||||
|
if (together_group) {
|
||||||
|
together_group_stack_.group_together(
|
||||||
|
together_group.value(), &pkg);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
generate(pkg, ostr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
generate_groups(ostr);
|
||||||
|
|
||||||
if (!uns.starts_with({p.full_name(false)})) {
|
if (!uns.starts_with({p.full_name(false)})) {
|
||||||
ostr << "}" << '\n';
|
ostr << "}" << '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
generate_notes(ostr, p);
|
generate_notes(ostr, p);
|
||||||
|
|
||||||
|
together_group_stack_.leave();
|
||||||
}
|
}
|
||||||
|
|
||||||
void generator::generate(std::ostream &ostr) const
|
void generator::generate(std::ostream &ostr) const
|
||||||
@@ -104,9 +121,21 @@ void generator::generate(std::ostream &ostr) const
|
|||||||
generate_plantuml_directives(ostr, m_config.puml().before);
|
generate_plantuml_directives(ostr, m_config.puml().before);
|
||||||
|
|
||||||
for (const auto &p : m_model) {
|
for (const auto &p : m_model) {
|
||||||
if (m_model.should_include(dynamic_cast<package &>(*p)))
|
auto &pkg = dynamic_cast<package &>(*p);
|
||||||
generate(dynamic_cast<package &>(*p), ostr);
|
if (m_model.should_include(pkg)) {
|
||||||
|
auto together_group =
|
||||||
|
m_config.get_together_group(pkg.full_name(false));
|
||||||
|
if (together_group) {
|
||||||
|
together_group_stack_.group_together(
|
||||||
|
together_group.value(), &pkg);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
generate(pkg, ostr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
generate_groups(ostr);
|
||||||
|
|
||||||
// Process package relationships
|
// Process package relationships
|
||||||
for (const auto &p : m_model) {
|
for (const auto &p : m_model) {
|
||||||
@@ -120,4 +149,19 @@ void generator::generate(std::ostream &ostr) const
|
|||||||
|
|
||||||
ostr << "@enduml" << '\n';
|
ostr << "@enduml" << '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void generator::generate_groups(std::ostream &ostr) const
|
||||||
|
{
|
||||||
|
for (const auto &[group_name, group_elements] :
|
||||||
|
together_group_stack_.get_current_groups()) {
|
||||||
|
ostr << "together {\n";
|
||||||
|
|
||||||
|
for (auto *pkg : group_elements) {
|
||||||
|
generate(*pkg, ostr);
|
||||||
|
}
|
||||||
|
|
||||||
|
ostr << "}\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace clanguml::package_diagram::generators::plantuml
|
} // namespace clanguml::package_diagram::generators::plantuml
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "common/generators/nested_element_stack.h"
|
||||||
#include "common/generators/plantuml/generator.h"
|
#include "common/generators/plantuml/generator.h"
|
||||||
#include "common/model/package.h"
|
#include "common/model/package.h"
|
||||||
#include "common/model/relationship.h"
|
#include "common/model/relationship.h"
|
||||||
@@ -58,6 +59,12 @@ public:
|
|||||||
void generate(const package &e, std::ostream &ostr) const;
|
void generate(const package &e, std::ostream &ostr) const;
|
||||||
|
|
||||||
void generate(std::ostream &ostr) const override;
|
void generate(std::ostream &ostr) const override;
|
||||||
|
|
||||||
|
void generate_groups(std::ostream &ostr) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
mutable common::generators::nested_element_stack<common::model::package>
|
||||||
|
together_group_stack_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace plantuml
|
} // namespace plantuml
|
||||||
|
|||||||
17
tests/t30009/.clang-uml
Normal file
17
tests/t30009/.clang-uml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
compilation_database_dir: ..
|
||||||
|
output_directory: puml
|
||||||
|
diagrams:
|
||||||
|
t30009_package:
|
||||||
|
type: package
|
||||||
|
glob:
|
||||||
|
- ../../tests/t30009/t30009.cc
|
||||||
|
include:
|
||||||
|
namespaces:
|
||||||
|
- clanguml::t30009
|
||||||
|
using_namespace:
|
||||||
|
- clanguml::t30009
|
||||||
|
layout:
|
||||||
|
One::A:
|
||||||
|
- together: [One::C]
|
||||||
|
Two::B:
|
||||||
|
- together: [Two::C, Two::D]
|
||||||
22
tests/t30009/t30009.cc
Normal file
22
tests/t30009/t30009.cc
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
namespace clanguml::t30009 {
|
||||||
|
namespace One {
|
||||||
|
namespace A {
|
||||||
|
}
|
||||||
|
namespace B {
|
||||||
|
}
|
||||||
|
namespace C {
|
||||||
|
}
|
||||||
|
namespace D {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
namespace Two {
|
||||||
|
namespace A {
|
||||||
|
}
|
||||||
|
namespace B {
|
||||||
|
}
|
||||||
|
namespace C {
|
||||||
|
}
|
||||||
|
namespace D {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
46
tests/t30009/test_case.h
Normal file
46
tests/t30009/test_case.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/**
|
||||||
|
* tests/t30009/test_case.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021-2023 Bartek Kryza <bkryza@gmail.com>
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
TEST_CASE("t30009", "[test-case][package]")
|
||||||
|
{
|
||||||
|
auto [config, db] = load_config("t30009");
|
||||||
|
|
||||||
|
auto diagram = config.diagrams["t30009_package"];
|
||||||
|
|
||||||
|
REQUIRE(diagram->name == "t30009_package");
|
||||||
|
|
||||||
|
auto model = generate_package_diagram(*db, diagram);
|
||||||
|
|
||||||
|
REQUIRE(model->name() == "t30009_package");
|
||||||
|
|
||||||
|
auto puml = generate_package_puml(diagram, *model);
|
||||||
|
AliasMatcher _A(puml);
|
||||||
|
|
||||||
|
REQUIRE_THAT(puml, StartsWith("@startuml"));
|
||||||
|
REQUIRE_THAT(puml, EndsWith("@enduml\n"));
|
||||||
|
|
||||||
|
// Check if all packages exist
|
||||||
|
REQUIRE_THAT(puml, IsPackage("One"));
|
||||||
|
REQUIRE_THAT(puml, IsPackage("Two"));
|
||||||
|
REQUIRE_THAT(puml, IsPackage("A"));
|
||||||
|
REQUIRE_THAT(puml, IsPackage("B"));
|
||||||
|
REQUIRE_THAT(puml, IsPackage("C"));
|
||||||
|
REQUIRE_THAT(puml, IsPackage("D"));
|
||||||
|
|
||||||
|
save_puml(config.output_directory() + "/" + diagram->name + ".puml", puml);
|
||||||
|
}
|
||||||
@@ -297,6 +297,7 @@ using namespace clanguml::test::matchers;
|
|||||||
#include "t30006/test_case.h"
|
#include "t30006/test_case.h"
|
||||||
#include "t30007/test_case.h"
|
#include "t30007/test_case.h"
|
||||||
#include "t30008/test_case.h"
|
#include "t30008/test_case.h"
|
||||||
|
#include "t30009/test_case.h"
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Include diagram tests
|
/// Include diagram tests
|
||||||
|
|||||||
@@ -272,6 +272,9 @@ test_cases:
|
|||||||
- name: t30008
|
- name: t30008
|
||||||
title: Dependants and dependencies package diagram filter test
|
title: Dependants and dependencies package diagram filter test
|
||||||
description:
|
description:
|
||||||
|
- name: t30009
|
||||||
|
title: Together layout hint test
|
||||||
|
description:
|
||||||
Include diagrams:
|
Include diagrams:
|
||||||
- name: t40001
|
- name: t40001
|
||||||
title: Basic include graph diagram test case
|
title: Basic include graph diagram test case
|
||||||
|
|||||||
Reference in New Issue
Block a user