How-To model Architecture with Sphinx-Needs
Structure Model: Deployment-Diagram
Sphinx-Needs offers a build in represenatation of elements with needflow [1], needarch [2], and needuml [3].
You can use needs-flow-configs to change repesentation in needflow. You can use needs-render-context [4] to extend the data available in needarch and needuml.
Needflow expects to get plantuml deployment-diagram [5] elements as representation. With flow() you can get this repesentation even in needarch and needuml.
Visial representation of UML Ports in Sphinx-Needs
Pay attention: We do use :input:
and :output:
in the same datamodel.
This is only because to see the differences in the output of plantuml tooling.
Especially the ordering of links like A -> B
vs B <- A
.
Example 1: Definiton of a super structure element
.. lib:: My lib
:id: LIB_MY_LIB
.. needarch::
:key: Deployment
:debug:
left to right direction
'top to bottom direction
'Define elements
'{{need()}}
{{flow(need().id)}} {
{% for e in need().part_of_back %}
'{{e}}
{% if needs[e].type == "comp" %}{{uml(e, 'Deployment')}}{% endif %}
{% endfor %}
}
'Extra link to make diagramm nice looking
C_A --[hidden] C_B
'Link defined elements
{% for e in need().part_of_back %}
'e = {{e}}
{%- if needs[e].type == "comp" -%}
{% for f in needs[e].parent_needs_back %}
'f = {{f}}
{%- if (needs[f].type == "inport") -%}
{% for g in needs[f].input %}
'g = {{g}}
{{g}} -[#000000]-> {{f}}
{% endfor %}
{%- endif -%}
{% endfor %}
{%- endif -%}
{% endfor %}
}
.. needarch::
:key: Deployment2
:debug:
'Define elements
'{{need()}}
{{flow(need().id)}} {
{% for e in need().part_of_back %}
'{{e}}
{% if needs[e].type == "comp" %}{{flow(e)}}{% endif %}
{% endfor %}
}
'Extra link to make diagramm nice looking
C_A --[hidden] C_B
'Link defined elements
{% for e in need().part_of_back %}
'e = {{e}}
{%- if needs[e].type == "comp" -%}
{% for f in needs[e].parent_needs_back %}
'f = {{f}}
{%- if (needs[f].type == "inport") -%}
{% for g in needs[f].input %}
'g = {{g}}
{{needs[g].parent_need}} #-# {{e}}
{% endfor %}
{%- endif -%}
{% endfor %}
{%- endif -%}
{% endfor %}
}
@startuml left to right direction 'top to bottom direction 'Define elements '{'docname': 'architecture-examples', 'lineno': 32, 'lineno_content': 35, 'doctype': '.rst', 'content': '.. needarch::\n :key: Deployment\n :debug:\n\n left to right direction\n \'top to bottom direction\n\n \'Define elements\n \'{{need()}}\n {{flow(need().id)}} {\n {% for e in need().part_of_back %}\n \'{{e}}\n {% if needs[e].type == "comp" %}{{uml(e, \'Deployment\')}}{% endif %}\n {% endfor %}\n }\n\n \'Extra link to make diagramm nice looking\n C_A --[hidden] C_B\n\n \'Link defined elements\n {% for e in need().part_of_back %}\n \'e = {{e}}\n {%- if needs[e].type == "comp" -%}\n {% for f in needs[e].parent_needs_back %}\n \'f = {{f}}\n {%- if (needs[f].type == "inport") -%}\n {% for g in needs[f].input %}\n \'g = {{g}}\n {{g}} -[#000000]-> {{f}}\n {% endfor %}\n {%- endif -%}\n {% endfor %}\n {%- endif -%}\n {% endfor %}\n }\n\n.. needarch::\n :key: Deployment2\n :debug:\n\n \'Define elements\n \'{{need()}}\n {{flow(need().id)}} {\n {% for e in need().part_of_back %}\n \'{{e}}\n {% if needs[e].type == "comp" %}{{flow(e)}}{% endif %}\n {% endfor %}\n }\n\n \'Extra link to make diagramm nice looking\n C_A --[hidden] C_B\n\n \'Link defined elements\n {% for e in need().part_of_back %}\n \'e = {{e}}\n {%- if needs[e].type == "comp" -%}\n {% for f in needs[e].parent_needs_back %}\n \'f = {{f}}\n {%- if (needs[f].type == "inport") -%}\n {% for g in needs[f].input %}\n \'g = {{g}}\n {{needs[g].parent_need}} #-# {{e}}\n {% endfor %}\n {%- endif -%}\n {% endfor %}\n {%- endif -%}\n {% endfor %}\n }', 'type': 'lib', 'type_name': 'Library ', 'type_prefix': 'LIB_', 'type_color': '#abcdef', 'type_style': 'rectangle', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'LIB_MY_LIB', 'title': 'My lib', 'collapse': False, 'arch': {'Deployment': 'left to right direction\n\'top to bottom direction\n\n\'Define elements\n\'{{need()}}\n{{flow(need().id)}} {\n{% for e in need().part_of_back %}\n\'{{e}}\n{% if needs[e].type == "comp" %}{{uml(e, \'Deployment\')}}{% endif %}\n{% endfor %}\n}\n\n\'Extra link to make diagramm nice looking\nC_A --[hidden] C_B\n\n\'Link defined elements\n{% for e in need().part_of_back %}\n\'e = {{e}}\n{%- if needs[e].type == "comp" -%}\n{% for f in needs[e].parent_needs_back %}\n\'f = {{f}}\n{%- if (needs[f].type == "inport") -%}\n{% for g in needs[f].input %}\n\'g = {{g}}\n{{g}} -[#000000]-> {{f}}\n{% endfor %}\n{%- endif -%}\n{% endfor %}\n{%- endif -%}\n{% endfor %}\n}', 'Deployment2': '\'Define elements\n\'{{need()}}\n{{flow(need().id)}} {\n{% for e in need().part_of_back %}\n\'{{e}}\n{% if needs[e].type == "comp" %}{{flow(e)}}{% endif %}\n{% endfor %}\n}\n\n\'Extra link to make diagramm nice looking\nC_A --[hidden] C_B\n\n\'Link defined elements\n{% for e in need().part_of_back %}\n\'e = {{e}}\n{%- if needs[e].type == "comp" -%}\n{% for f in needs[e].parent_needs_back %}\n\'f = {{f}}\n{%- if (needs[f].type == "inport") -%}\n{% for g in needs[f].input %}\n\'g = {{g}}\n{{needs[g].parent_need}} #-# {{e}}\n{% endfor %}\n{%- endif -%}\n{% endfor %}\n{%- endif -%}\n{% endfor %}\n}'}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'LIB_MY_LIB', 'id_complete': 'LIB_MY_LIB', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Visial representation of UML Ports in Sphinx-Needs', 'Structure Model: Deployment-Diagram', 'How-To model Architecture with Sphinx-Needs'], 'section_name': 'Visial representation of UML Ports in Sphinx-Needs', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-examples.rst#L32', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': ['C_A', 'C_B', 'C_C', 'C_D'], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []} rectangle "<size:12>Library </size>\n**My lib**\n<size:10>LIB_MY_LIB</size>" as LIB_MY_LIB [[../architecture-examples.html#LIB_MY_LIB]] #abcdef { 'C_A component "<size:12>Component</size>\n**Component A**\n<size:10>C_A</size>" as C_A [[../architecture-examples.html#C_A]] #abcdef { portout "**out**" as OP_C_A_OUT [[../architecture-examples.html#OP_C_A_OUT]] #abcdef card "Deployment Diagram" as C_A.Deployment [[../architecture-examples.html#C_A.Deployment]] } 'C_B component "<size:12>Component</size>\n**Component B**\n<size:10>C_B</size>" as C_B [[../architecture-examples.html#C_B]] #abcdef { portout "**out**" as OP_C_B_OUT [[../architecture-examples.html#OP_C_B_OUT]] #abcdef card "Deployment Diagram" as C_B.Deployment [[../architecture-examples.html#C_B.Deployment]] } 'C_C component "<size:12>Component</size>\n**Component C**\n<size:10>C_C</size>" as C_C [[../architecture-examples.html#C_C]] #abcdef { portin "**in**" as IP_C_C_IN [[../architecture-examples.html#IP_C_C_IN]] #abcdef portin "**in**" as IP_C_C_IN2 [[../architecture-examples.html#IP_C_C_IN2]] #abcdef portout "**out**" as OP_C_C_OUT [[../architecture-examples.html#OP_C_C_OUT]] #abcdef card "Deployment Diagram" as C_C.Deployment [[../architecture-examples.html#C_C.Deployment]] } 'C_D component "<size:12>Component</size>\n**Component D**\n<size:10>C_D</size>" as C_D [[../architecture-examples.html#C_D]] #abcdef { portin "**in**" as IP_C_D_IN [[../architecture-examples.html#IP_C_D_IN]] #abcdef card "Deployment Diagram" as C_D.Deployment [[../architecture-examples.html#C_D.Deployment]] } } 'Extra link to make diagramm nice looking C_A --[hidden] C_B 'Link defined elements 'e = C_A 'f = OP_C_A_OUT 'e = C_B 'f = OP_C_B_OUT 'e = C_C 'f = IP_C_C_IN 'g = OP_C_A_OUT OP_C_A_OUT -[#000000]-> IP_C_C_IN 'f = IP_C_C_IN2 'g = OP_C_B_OUT OP_C_B_OUT -[#000000]-> IP_C_C_IN2 'f = OP_C_C_OUT 'e = C_D 'f = IP_C_D_IN 'g = OP_C_C_OUT OP_C_C_OUT -[#000000]-> IP_C_D_IN } @enduml
@startuml 'Define elements '{'docname': 'architecture-examples', 'lineno': 32, 'lineno_content': 35, 'doctype': '.rst', 'content': '.. needarch::\n :key: Deployment\n :debug:\n\n left to right direction\n \'top to bottom direction\n\n \'Define elements\n \'{{need()}}\n {{flow(need().id)}} {\n {% for e in need().part_of_back %}\n \'{{e}}\n {% if needs[e].type == "comp" %}{{uml(e, \'Deployment\')}}{% endif %}\n {% endfor %}\n }\n\n \'Extra link to make diagramm nice looking\n C_A --[hidden] C_B\n\n \'Link defined elements\n {% for e in need().part_of_back %}\n \'e = {{e}}\n {%- if needs[e].type == "comp" -%}\n {% for f in needs[e].parent_needs_back %}\n \'f = {{f}}\n {%- if (needs[f].type == "inport") -%}\n {% for g in needs[f].input %}\n \'g = {{g}}\n {{g}} -[#000000]-> {{f}}\n {% endfor %}\n {%- endif -%}\n {% endfor %}\n {%- endif -%}\n {% endfor %}\n }\n\n.. needarch::\n :key: Deployment2\n :debug:\n\n \'Define elements\n \'{{need()}}\n {{flow(need().id)}} {\n {% for e in need().part_of_back %}\n \'{{e}}\n {% if needs[e].type == "comp" %}{{flow(e)}}{% endif %}\n {% endfor %}\n }\n\n \'Extra link to make diagramm nice looking\n C_A --[hidden] C_B\n\n \'Link defined elements\n {% for e in need().part_of_back %}\n \'e = {{e}}\n {%- if needs[e].type == "comp" -%}\n {% for f in needs[e].parent_needs_back %}\n \'f = {{f}}\n {%- if (needs[f].type == "inport") -%}\n {% for g in needs[f].input %}\n \'g = {{g}}\n {{needs[g].parent_need}} #-# {{e}}\n {% endfor %}\n {%- endif -%}\n {% endfor %}\n {%- endif -%}\n {% endfor %}\n }', 'type': 'lib', 'type_name': 'Library ', 'type_prefix': 'LIB_', 'type_color': '#abcdef', 'type_style': 'rectangle', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'LIB_MY_LIB', 'title': 'My lib', 'collapse': False, 'arch': {'Deployment': 'left to right direction\n\'top to bottom direction\n\n\'Define elements\n\'{{need()}}\n{{flow(need().id)}} {\n{% for e in need().part_of_back %}\n\'{{e}}\n{% if needs[e].type == "comp" %}{{uml(e, \'Deployment\')}}{% endif %}\n{% endfor %}\n}\n\n\'Extra link to make diagramm nice looking\nC_A --[hidden] C_B\n\n\'Link defined elements\n{% for e in need().part_of_back %}\n\'e = {{e}}\n{%- if needs[e].type == "comp" -%}\n{% for f in needs[e].parent_needs_back %}\n\'f = {{f}}\n{%- if (needs[f].type == "inport") -%}\n{% for g in needs[f].input %}\n\'g = {{g}}\n{{g}} -[#000000]-> {{f}}\n{% endfor %}\n{%- endif -%}\n{% endfor %}\n{%- endif -%}\n{% endfor %}\n}', 'Deployment2': '\'Define elements\n\'{{need()}}\n{{flow(need().id)}} {\n{% for e in need().part_of_back %}\n\'{{e}}\n{% if needs[e].type == "comp" %}{{flow(e)}}{% endif %}\n{% endfor %}\n}\n\n\'Extra link to make diagramm nice looking\nC_A --[hidden] C_B\n\n\'Link defined elements\n{% for e in need().part_of_back %}\n\'e = {{e}}\n{%- if needs[e].type == "comp" -%}\n{% for f in needs[e].parent_needs_back %}\n\'f = {{f}}\n{%- if (needs[f].type == "inport") -%}\n{% for g in needs[f].input %}\n\'g = {{g}}\n{{needs[g].parent_need}} #-# {{e}}\n{% endfor %}\n{%- endif -%}\n{% endfor %}\n{%- endif -%}\n{% endfor %}\n}'}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'LIB_MY_LIB', 'id_complete': 'LIB_MY_LIB', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Visial representation of UML Ports in Sphinx-Needs', 'Structure Model: Deployment-Diagram', 'How-To model Architecture with Sphinx-Needs'], 'section_name': 'Visial representation of UML Ports in Sphinx-Needs', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-examples.rst#L32', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': ['C_A', 'C_B', 'C_C', 'C_D'], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []} rectangle "<size:12>Library </size>\n**My lib**\n<size:10>LIB_MY_LIB</size>" as LIB_MY_LIB [[../architecture-examples.html#LIB_MY_LIB]] #abcdef { 'C_A component "<size:12>Component</size>\n**Component A**\n<size:10>C_A</size>" as C_A [[../architecture-examples.html#C_A]] #abcdef 'C_B component "<size:12>Component</size>\n**Component B**\n<size:10>C_B</size>" as C_B [[../architecture-examples.html#C_B]] #abcdef 'C_C component "<size:12>Component</size>\n**Component C**\n<size:10>C_C</size>" as C_C [[../architecture-examples.html#C_C]] #abcdef 'C_D component "<size:12>Component</size>\n**Component D**\n<size:10>C_D</size>" as C_D [[../architecture-examples.html#C_D]] #abcdef } 'Extra link to make diagramm nice looking C_A --[hidden] C_B 'Link defined elements 'e = C_A 'f = OP_C_A_OUT 'e = C_B 'f = OP_C_B_OUT 'e = C_C 'f = IP_C_C_IN 'g = OP_C_A_OUT C_A #-# C_C 'f = IP_C_C_IN2 'g = OP_C_B_OUT C_B #-# C_C 'f = OP_C_C_OUT 'e = C_D 'f = IP_C_D_IN 'g = OP_C_C_OUT C_C #-# C_D } @enduml |
Example 2: Definition of elements within the super structure
.. comp:: Component A
:id: C_A
:part_of: LIB_MY_LIB
.. outport:: out
:id: OP_C_A_OUT
:output: IP_C_C_IN
.. comp:: Component B
:id: C_B
:part_of: LIB_MY_LIB
.. outport:: out
:id: OP_C_B_OUT
:output: IP_C_C_IN2
.. comp:: Component C
:id: C_C
:part_of: LIB_MY_LIB
.. inport:: in
:id: IP_C_C_IN
:input: OP_C_A_OUT
.. inport:: in
:id: IP_C_C_IN2
:input: OP_C_B_OUT
.. outport:: out
:id: OP_C_C_OUT
:output: IP_C_D_IN
.. comp:: Component D
:id: C_D
:part_of: LIB_MY_LIB
.. inport:: in
:id: IP_C_D_IN
:input: OP_C_C_OUT
Following needarch is been added with needs template Deployment Diagram
|
Following needarch is been added with needs template Deployment Diagram
|
Following needarch is been added with needs template Deployment Diagram
|
Following needarch is been added with needs template Deployment Diagram
|
To show the different repesentations of A -> B
(output) vs B <- A
(input).
Example 3: Visualize the dependencies - Input
.. needflow::
:filter: is_need and docname == "architecture-examples" and section_name == "Visial representation of UML Ports in Sphinx-Needs"
:link_types: input, part_of
:show_link_names:
:debug:
.. needflow::
:filter: is_need and docname == "architecture-examples" and section_name == "Visial representation of UML Ports in Sphinx-Needs" and type != "lib"
:link_types: input
:show_link_names:
:debug:
@startuml ' Nodes definition rectangle "<size:12>Library </size>\n**My lib**\n<size:10>LIB_MY_LIB</size>" as LIB_MY_LIB [[../architecture-examples.html#LIB_MY_LIB]] #abcdef component "<size:12>Component</size>\n**Component A**\n<size:10>C_A</size>" as C_A [[../architecture-examples.html#C_A]] #abcdef{ 'parts: 'child needs: portout "**out**" as OP_C_A_OUT [[../architecture-examples.html#OP_C_A_OUT]] #abcdef } component "<size:12>Component</size>\n**Component B**\n<size:10>C_B</size>" as C_B [[../architecture-examples.html#C_B]] #abcdef{ 'parts: 'child needs: portout "**out**" as OP_C_B_OUT [[../architecture-examples.html#OP_C_B_OUT]] #abcdef } component "<size:12>Component</size>\n**Component C**\n<size:10>C_C</size>" as C_C [[../architecture-examples.html#C_C]] #abcdef{ 'parts: 'child needs: portin "**in**" as IP_C_C_IN [[../architecture-examples.html#IP_C_C_IN]] #abcdef portin "**in**" as IP_C_C_IN2 [[../architecture-examples.html#IP_C_C_IN2]] #abcdef portout "**out**" as OP_C_C_OUT [[../architecture-examples.html#OP_C_C_OUT]] #abcdef } component "<size:12>Component</size>\n**Component D**\n<size:10>C_D</size>" as C_D [[../architecture-examples.html#C_D]] #abcdef{ 'parts: 'child needs: portin "**in**" as IP_C_D_IN [[../architecture-examples.html#IP_C_D_IN]] #abcdef } ' Connection definition C_A -down[#000000]-> LIB_MY_LIB: Part of\n C_B -down[#000000]-> LIB_MY_LIB: Part of\n C_C -down[#000000]-> LIB_MY_LIB: Part of\n IP_C_C_IN <-[#000000]- OP_C_A_OUT: input\n IP_C_C_IN2 <-[#000000]- OP_C_B_OUT: input\n C_D -down[#000000]-> LIB_MY_LIB: Part of\n IP_C_D_IN <-[#000000]- OP_C_C_OUT: input\n @enduml
@startuml ' Nodes definition component "<size:12>Component</size>\n**Component A**\n<size:10>C_A</size>" as C_A [[../architecture-examples.html#C_A]] #abcdef{ 'parts: 'child needs: portout "**out**" as OP_C_A_OUT [[../architecture-examples.html#OP_C_A_OUT]] #abcdef } component "<size:12>Component</size>\n**Component B**\n<size:10>C_B</size>" as C_B [[../architecture-examples.html#C_B]] #abcdef{ 'parts: 'child needs: portout "**out**" as OP_C_B_OUT [[../architecture-examples.html#OP_C_B_OUT]] #abcdef } component "<size:12>Component</size>\n**Component C**\n<size:10>C_C</size>" as C_C [[../architecture-examples.html#C_C]] #abcdef{ 'parts: 'child needs: portin "**in**" as IP_C_C_IN [[../architecture-examples.html#IP_C_C_IN]] #abcdef portin "**in**" as IP_C_C_IN2 [[../architecture-examples.html#IP_C_C_IN2]] #abcdef portout "**out**" as OP_C_C_OUT [[../architecture-examples.html#OP_C_C_OUT]] #abcdef } component "<size:12>Component</size>\n**Component D**\n<size:10>C_D</size>" as C_D [[../architecture-examples.html#C_D]] #abcdef{ 'parts: 'child needs: portin "**in**" as IP_C_D_IN [[../architecture-examples.html#IP_C_D_IN]] #abcdef } ' Connection definition IP_C_C_IN <-[#000000]- OP_C_A_OUT: input\n IP_C_C_IN2 <-[#000000]- OP_C_B_OUT: input\n IP_C_D_IN <-[#000000]- OP_C_C_OUT: input\n @enduml
Example 4: Visualize the dependencies - Output
.. needflow::
:filter: is_need and docname == "architecture-examples" and section_name == "Visial representation of UML Ports in Sphinx-Needs"
:link_types: output, part_of
:show_link_names:
:debug:
.. needflow::
:filter: is_need and docname == "architecture-examples" and section_name == "Visial representation of UML Ports in Sphinx-Needs" and type != "lib"
:link_types: output
:show_link_names:
:debug:
@startuml ' Nodes definition rectangle "<size:12>Library </size>\n**My lib**\n<size:10>LIB_MY_LIB</size>" as LIB_MY_LIB [[../architecture-examples.html#LIB_MY_LIB]] #abcdef component "<size:12>Component</size>\n**Component A**\n<size:10>C_A</size>" as C_A [[../architecture-examples.html#C_A]] #abcdef{ 'parts: 'child needs: portout "**out**" as OP_C_A_OUT [[../architecture-examples.html#OP_C_A_OUT]] #abcdef } component "<size:12>Component</size>\n**Component B**\n<size:10>C_B</size>" as C_B [[../architecture-examples.html#C_B]] #abcdef{ 'parts: 'child needs: portout "**out**" as OP_C_B_OUT [[../architecture-examples.html#OP_C_B_OUT]] #abcdef } component "<size:12>Component</size>\n**Component C**\n<size:10>C_C</size>" as C_C [[../architecture-examples.html#C_C]] #abcdef{ 'parts: 'child needs: portin "**in**" as IP_C_C_IN [[../architecture-examples.html#IP_C_C_IN]] #abcdef portin "**in**" as IP_C_C_IN2 [[../architecture-examples.html#IP_C_C_IN2]] #abcdef portout "**out**" as OP_C_C_OUT [[../architecture-examples.html#OP_C_C_OUT]] #abcdef } component "<size:12>Component</size>\n**Component D**\n<size:10>C_D</size>" as C_D [[../architecture-examples.html#C_D]] #abcdef{ 'parts: 'child needs: portin "**in**" as IP_C_D_IN [[../architecture-examples.html#IP_C_D_IN]] #abcdef } ' Connection definition C_A -down[#000000]-> LIB_MY_LIB: Part of\n OP_C_A_OUT -[#000000]-> IP_C_C_IN: output\n C_B -down[#000000]-> LIB_MY_LIB: Part of\n OP_C_B_OUT -[#000000]-> IP_C_C_IN2: output\n C_C -down[#000000]-> LIB_MY_LIB: Part of\n OP_C_C_OUT -[#000000]-> IP_C_D_IN: output\n C_D -down[#000000]-> LIB_MY_LIB: Part of\n @enduml
@startuml ' Nodes definition component "<size:12>Component</size>\n**Component A**\n<size:10>C_A</size>" as C_A [[../architecture-examples.html#C_A]] #abcdef{ 'parts: 'child needs: portout "**out**" as OP_C_A_OUT [[../architecture-examples.html#OP_C_A_OUT]] #abcdef } component "<size:12>Component</size>\n**Component B**\n<size:10>C_B</size>" as C_B [[../architecture-examples.html#C_B]] #abcdef{ 'parts: 'child needs: portout "**out**" as OP_C_B_OUT [[../architecture-examples.html#OP_C_B_OUT]] #abcdef } component "<size:12>Component</size>\n**Component C**\n<size:10>C_C</size>" as C_C [[../architecture-examples.html#C_C]] #abcdef{ 'parts: 'child needs: portin "**in**" as IP_C_C_IN [[../architecture-examples.html#IP_C_C_IN]] #abcdef portin "**in**" as IP_C_C_IN2 [[../architecture-examples.html#IP_C_C_IN2]] #abcdef portout "**out**" as OP_C_C_OUT [[../architecture-examples.html#OP_C_C_OUT]] #abcdef } component "<size:12>Component</size>\n**Component D**\n<size:10>C_D</size>" as C_D [[../architecture-examples.html#C_D]] #abcdef{ 'parts: 'child needs: portin "**in**" as IP_C_D_IN [[../architecture-examples.html#IP_C_D_IN]] #abcdef } ' Connection definition OP_C_A_OUT -[#000000]-> IP_C_C_IN: output\n OP_C_B_OUT -[#000000]-> IP_C_C_IN2: output\n OP_C_C_OUT -[#000000]-> IP_C_D_IN: output\n @enduml
Visiual repesentation of many Elements
Following the link to the elements defined.
Example 5: Visualize many elements with needflow
.. needflow::
:filter: is_need and docname == "architecture-many-components"
:show_link_names:
:debug:
@startuml ' Nodes definition component "<size:12>Component</size>\n**Component A**\n<size:10>C_MANY_A</size>" as C_MANY_A [[../architecture-many-components.html#C_MANY_A]] #abcdef component "<size:12>Component</size>\n**Component B**\n<size:10>C_MANY_B</size>" as C_MANY_B [[../architecture-many-components.html#C_MANY_B]] #abcdef component "<size:12>Component</size>\n**Component C**\n<size:10>C_MANY_C</size>" as C_MANY_C [[../architecture-many-components.html#C_MANY_C]] #abcdef component "<size:12>Component</size>\n**Component D**\n<size:10>C_MANY_D</size>" as C_MANY_D [[../architecture-many-components.html#C_MANY_D]] #abcdef component "<size:12>Component</size>\n**Component E**\n<size:10>C_MANY_E</size>" as C_MANY_E [[../architecture-many-components.html#C_MANY_E]] #abcdef component "<size:12>Component</size>\n**Component F**\n<size:10>C_MANY_F</size>" as C_MANY_F [[../architecture-many-components.html#C_MANY_F]] #abcdef component "<size:12>Component</size>\n**Component G**\n<size:10>C_MANY_G</size>" as C_MANY_G [[../architecture-many-components.html#C_MANY_G]] #abcdef component "<size:12>Component</size>\n**Component H**\n<size:10>C_MANY_H</size>" as C_MANY_H [[../architecture-many-components.html#C_MANY_H]] #abcdef component "<size:12>Component</size>\n**Component I**\n<size:10>C_MANY_I</size>" as C_MANY_I [[../architecture-many-components.html#C_MANY_I]] #abcdef component "<size:12>Component</size>\n**Component J**\n<size:10>C_MANY_J</size>" as C_MANY_J [[../architecture-many-components.html#C_MANY_J]] #abcdef component "<size:12>Component</size>\n**Component K**\n<size:10>C_MANY_K</size>" as C_MANY_K [[../architecture-many-components.html#C_MANY_K]] #abcdef component "<size:12>Component</size>\n**Component L**\n<size:10>C_MANY_L</size>" as C_MANY_L [[../architecture-many-components.html#C_MANY_L]] #abcdef component "<size:12>Component</size>\n**Component M**\n<size:10>C_MANY_M</size>" as C_MANY_M [[../architecture-many-components.html#C_MANY_M]] #abcdef component "<size:12>Component</size>\n**Component N**\n<size:10>C_MANY_N</size>" as C_MANY_N [[../architecture-many-components.html#C_MANY_N]] #abcdef component "<size:12>Component</size>\n**Component O**\n<size:10>C_MANY_O</size>" as C_MANY_O [[../architecture-many-components.html#C_MANY_O]] #abcdef component "<size:12>Component</size>\n**Component P**\n<size:10>C_MANY_P</size>" as C_MANY_P [[../architecture-many-components.html#C_MANY_P]] #abcdef ' Connection definition @enduml
Example 6: Visualize many elements with needuml I
.. needuml::
:debug:
{%- set components = filter("docname == 'architecture-many-components'") -%}
'{{components}}
{% for need in filter("docname == 'architecture-many-components'") %}
{{flow(need.id)}}
{% endfor %}
@startuml '[{'docname': 'architecture-many-components', 'lineno': 8, 'lineno_content': 11, 'doctype': '.rst', 'content': '', 'type': 'comp', 'type_name': 'Component', 'type_prefix': 'C_', 'type_color': '#abcdef', 'type_style': 'component', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'C_MANY_A', 'title': 'Component A', 'collapse': False, 'arch': {}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'C_MANY_A', 'id_complete': 'C_MANY_A', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Definition of many Components'], 'section_name': 'Definition of many Components', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-many-components.rst#L8', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': [], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []}, {'docname': 'architecture-many-components', 'lineno': 11, 'lineno_content': 14, 'doctype': '.rst', 'content': '', 'type': 'comp', 'type_name': 'Component', 'type_prefix': 'C_', 'type_color': '#abcdef', 'type_style': 'component', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'C_MANY_B', 'title': 'Component B', 'collapse': False, 'arch': {}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'C_MANY_B', 'id_complete': 'C_MANY_B', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Definition of many Components'], 'section_name': 'Definition of many Components', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-many-components.rst#L11', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': [], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []}, {'docname': 'architecture-many-components', 'lineno': 14, 'lineno_content': 17, 'doctype': '.rst', 'content': '', 'type': 'comp', 'type_name': 'Component', 'type_prefix': 'C_', 'type_color': '#abcdef', 'type_style': 'component', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'C_MANY_C', 'title': 'Component C', 'collapse': False, 'arch': {}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'C_MANY_C', 'id_complete': 'C_MANY_C', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Definition of many Components'], 'section_name': 'Definition of many Components', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-many-components.rst#L14', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': [], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []}, {'docname': 'architecture-many-components', 'lineno': 17, 'lineno_content': 20, 'doctype': '.rst', 'content': '', 'type': 'comp', 'type_name': 'Component', 'type_prefix': 'C_', 'type_color': '#abcdef', 'type_style': 'component', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'C_MANY_D', 'title': 'Component D', 'collapse': False, 'arch': {}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'C_MANY_D', 'id_complete': 'C_MANY_D', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Definition of many Components'], 'section_name': 'Definition of many Components', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-many-components.rst#L17', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': [], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []}, {'docname': 'architecture-many-components', 'lineno': 20, 'lineno_content': 23, 'doctype': '.rst', 'content': '', 'type': 'comp', 'type_name': 'Component', 'type_prefix': 'C_', 'type_color': '#abcdef', 'type_style': 'component', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'C_MANY_E', 'title': 'Component E', 'collapse': False, 'arch': {}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'C_MANY_E', 'id_complete': 'C_MANY_E', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Definition of many Components'], 'section_name': 'Definition of many Components', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-many-components.rst#L20', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': [], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []}, {'docname': 'architecture-many-components', 'lineno': 23, 'lineno_content': 26, 'doctype': '.rst', 'content': '', 'type': 'comp', 'type_name': 'Component', 'type_prefix': 'C_', 'type_color': '#abcdef', 'type_style': 'component', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'C_MANY_F', 'title': 'Component F', 'collapse': False, 'arch': {}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'C_MANY_F', 'id_complete': 'C_MANY_F', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Definition of many Components'], 'section_name': 'Definition of many Components', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-many-components.rst#L23', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': [], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []}, {'docname': 'architecture-many-components', 'lineno': 26, 'lineno_content': 29, 'doctype': '.rst', 'content': '', 'type': 'comp', 'type_name': 'Component', 'type_prefix': 'C_', 'type_color': '#abcdef', 'type_style': 'component', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'C_MANY_G', 'title': 'Component G', 'collapse': False, 'arch': {}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'C_MANY_G', 'id_complete': 'C_MANY_G', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Definition of many Components'], 'section_name': 'Definition of many Components', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-many-components.rst#L26', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': [], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []}, {'docname': 'architecture-many-components', 'lineno': 29, 'lineno_content': 32, 'doctype': '.rst', 'content': '', 'type': 'comp', 'type_name': 'Component', 'type_prefix': 'C_', 'type_color': '#abcdef', 'type_style': 'component', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'C_MANY_H', 'title': 'Component H', 'collapse': False, 'arch': {}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'C_MANY_H', 'id_complete': 'C_MANY_H', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Definition of many Components'], 'section_name': 'Definition of many Components', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-many-components.rst#L29', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': [], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []}, {'docname': 'architecture-many-components', 'lineno': 32, 'lineno_content': 35, 'doctype': '.rst', 'content': '', 'type': 'comp', 'type_name': 'Component', 'type_prefix': 'C_', 'type_color': '#abcdef', 'type_style': 'component', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'C_MANY_I', 'title': 'Component I', 'collapse': False, 'arch': {}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'C_MANY_I', 'id_complete': 'C_MANY_I', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Definition of many Components'], 'section_name': 'Definition of many Components', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-many-components.rst#L32', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': [], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []}, {'docname': 'architecture-many-components', 'lineno': 35, 'lineno_content': 38, 'doctype': '.rst', 'content': '', 'type': 'comp', 'type_name': 'Component', 'type_prefix': 'C_', 'type_color': '#abcdef', 'type_style': 'component', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'C_MANY_J', 'title': 'Component J', 'collapse': False, 'arch': {}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'C_MANY_J', 'id_complete': 'C_MANY_J', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Definition of many Components'], 'section_name': 'Definition of many Components', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-many-components.rst#L35', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': [], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []}, {'docname': 'architecture-many-components', 'lineno': 38, 'lineno_content': 41, 'doctype': '.rst', 'content': '', 'type': 'comp', 'type_name': 'Component', 'type_prefix': 'C_', 'type_color': '#abcdef', 'type_style': 'component', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'C_MANY_K', 'title': 'Component K', 'collapse': False, 'arch': {}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'C_MANY_K', 'id_complete': 'C_MANY_K', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Definition of many Components'], 'section_name': 'Definition of many Components', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-many-components.rst#L38', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': [], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []}, {'docname': 'architecture-many-components', 'lineno': 41, 'lineno_content': 44, 'doctype': '.rst', 'content': '', 'type': 'comp', 'type_name': 'Component', 'type_prefix': 'C_', 'type_color': '#abcdef', 'type_style': 'component', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'C_MANY_L', 'title': 'Component L', 'collapse': False, 'arch': {}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'C_MANY_L', 'id_complete': 'C_MANY_L', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Definition of many Components'], 'section_name': 'Definition of many Components', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-many-components.rst#L41', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': [], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []}, {'docname': 'architecture-many-components', 'lineno': 44, 'lineno_content': 47, 'doctype': '.rst', 'content': '', 'type': 'comp', 'type_name': 'Component', 'type_prefix': 'C_', 'type_color': '#abcdef', 'type_style': 'component', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'C_MANY_M', 'title': 'Component M', 'collapse': False, 'arch': {}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'C_MANY_M', 'id_complete': 'C_MANY_M', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Definition of many Components'], 'section_name': 'Definition of many Components', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-many-components.rst#L44', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': [], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []}, {'docname': 'architecture-many-components', 'lineno': 47, 'lineno_content': 50, 'doctype': '.rst', 'content': '', 'type': 'comp', 'type_name': 'Component', 'type_prefix': 'C_', 'type_color': '#abcdef', 'type_style': 'component', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'C_MANY_N', 'title': 'Component N', 'collapse': False, 'arch': {}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'C_MANY_N', 'id_complete': 'C_MANY_N', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Definition of many Components'], 'section_name': 'Definition of many Components', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-many-components.rst#L47', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': [], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []}, {'docname': 'architecture-many-components', 'lineno': 50, 'lineno_content': 53, 'doctype': '.rst', 'content': '', 'type': 'comp', 'type_name': 'Component', 'type_prefix': 'C_', 'type_color': '#abcdef', 'type_style': 'component', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'C_MANY_O', 'title': 'Component O', 'collapse': False, 'arch': {}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'C_MANY_O', 'id_complete': 'C_MANY_O', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Definition of many Components'], 'section_name': 'Definition of many Components', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-many-components.rst#L50', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': [], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []}, {'docname': 'architecture-many-components', 'lineno': 53, 'lineno_content': 56, 'doctype': '.rst', 'content': '', 'type': 'comp', 'type_name': 'Component', 'type_prefix': 'C_', 'type_color': '#abcdef', 'type_style': 'component', 'status': None, 'tags': [], 'constraints': [], 'constraints_passed': True, 'constraints_results': {}, 'id': 'C_MANY_P', 'title': 'Component P', 'collapse': False, 'arch': {}, 'style': None, 'layout': '', 'template': None, 'pre_template': None, 'post_template': None, 'hide': False, 'jinja_content': False, 'parts': {}, 'is_part': False, 'is_need': True, 'id_parent': 'C_MANY_P', 'id_complete': 'C_MANY_P', 'is_external': False, 'external_url': None, 'external_css': 'external_link', 'is_modified': False, 'modifications': 0, 'has_dead_links': False, 'has_forbidden_dead_links': False, 'sections': ['Definition of many Components'], 'section_name': 'Definition of many Components', 'signature': '', 'parent_need': '', 'author': '', 'safety_level': '', 'security_level': '', 'reject_reason': '', 'coverage': '', 'pathfile': '', 'interface_definition': '', 'test_status': '', 'github_edit_url': 'https://github.com/PhilipPartsch/Howto-Sphinx/edit/main/docs/architecture-many-components.rst#L53', 'duration': '', 'completion': '', 'file': '', 'suite': '', 'case': '', 'case_name': '', 'case_parameter': '', 'classname': '', 'time': '', 'suites': '', 'cases': '', 'passed': '', 'skipped': '', 'failed': '', 'errors': '', 'result': '', 'query': '', 'specific': '', 'max_amount': '', 'max_content_lines': '', 'id_prefix': '', 'user': '', 'created_at': '', 'updated_at': '', 'closed_at': '', 'service': '', 'url': '', 'avatar': '', 'params': '', 'prefix': '', 'url_postfix': '', 'parent_needs': [], 'parent_needs_back': [], 'links': [], 'links_back': [], 'derived': [], 'derived_back': [], 'successor': [], 'successor_back': [], 'activities': [], 'activities_back': [], 'when': [], 'when_back': [], 'instruction': [], 'instruction_back': [], 'input': [], 'input_back': [], 'output': [], 'output_back': [], 'responsible': [], 'responsible_back': [], 'part_of': [], 'part_of_back': [], 'stored_in': [], 'stored_in_back': [], 'blue_print': [], 'blue_print_back': [], 'why': [], 'why_back': [], 'satisfies': [], 'satisfies_back': [], 'tests': [], 'tests_back': [], 'verified_by': [], 'verified_by_back': [], 'implemented_by': [], 'implemented_by_back': [], 'evaluated': [], 'evaluated_back': [], 'uses': [], 'uses_back': [], 'implements': [], 'implements_back': []}] component "<size:12>Component</size>\n**Component A**\n<size:10>C_MANY_A</size>" as C_MANY_A [[../architecture-many-components.html#C_MANY_A]] #abcdef component "<size:12>Component</size>\n**Component B**\n<size:10>C_MANY_B</size>" as C_MANY_B [[../architecture-many-components.html#C_MANY_B]] #abcdef component "<size:12>Component</size>\n**Component C**\n<size:10>C_MANY_C</size>" as C_MANY_C [[../architecture-many-components.html#C_MANY_C]] #abcdef component "<size:12>Component</size>\n**Component D**\n<size:10>C_MANY_D</size>" as C_MANY_D [[../architecture-many-components.html#C_MANY_D]] #abcdef component "<size:12>Component</size>\n**Component E**\n<size:10>C_MANY_E</size>" as C_MANY_E [[../architecture-many-components.html#C_MANY_E]] #abcdef component "<size:12>Component</size>\n**Component F**\n<size:10>C_MANY_F</size>" as C_MANY_F [[../architecture-many-components.html#C_MANY_F]] #abcdef component "<size:12>Component</size>\n**Component G**\n<size:10>C_MANY_G</size>" as C_MANY_G [[../architecture-many-components.html#C_MANY_G]] #abcdef component "<size:12>Component</size>\n**Component H**\n<size:10>C_MANY_H</size>" as C_MANY_H [[../architecture-many-components.html#C_MANY_H]] #abcdef component "<size:12>Component</size>\n**Component I**\n<size:10>C_MANY_I</size>" as C_MANY_I [[../architecture-many-components.html#C_MANY_I]] #abcdef component "<size:12>Component</size>\n**Component J**\n<size:10>C_MANY_J</size>" as C_MANY_J [[../architecture-many-components.html#C_MANY_J]] #abcdef component "<size:12>Component</size>\n**Component K**\n<size:10>C_MANY_K</size>" as C_MANY_K [[../architecture-many-components.html#C_MANY_K]] #abcdef component "<size:12>Component</size>\n**Component L**\n<size:10>C_MANY_L</size>" as C_MANY_L [[../architecture-many-components.html#C_MANY_L]] #abcdef component "<size:12>Component</size>\n**Component M**\n<size:10>C_MANY_M</size>" as C_MANY_M [[../architecture-many-components.html#C_MANY_M]] #abcdef component "<size:12>Component</size>\n**Component N**\n<size:10>C_MANY_N</size>" as C_MANY_N [[../architecture-many-components.html#C_MANY_N]] #abcdef component "<size:12>Component</size>\n**Component O**\n<size:10>C_MANY_O</size>" as C_MANY_O [[../architecture-many-components.html#C_MANY_O]] #abcdef component "<size:12>Component</size>\n**Component P**\n<size:10>C_MANY_P</size>" as C_MANY_P [[../architecture-many-components.html#C_MANY_P]] #abcdef @enduml
Example 7: Visualize many elements with needuml II
.. needuml::
:debug:
'the packages are project specific and defined in needs_render_context in conf.py
{% for p in packages %}
package {{p["name"]}} {
' import elements
{% for e in p["elements"] %}
{{flow(e)}}
{% endfor %}
' connect elements
{% for e in p["elements"] %}
{%- if loop.previtem is defined -%}
{{loop.previtem}} #-# {{e}}
{# here it is important to use #-#, as - has a left / right alignment and -- has up / down alignment #}
{% endif %}
{% endfor %}
}
{% if loop.previtem is defined %}
' connect packages with hidden link to nice align elements
{{loop.previtem["name"]}} --[hidden] {{p["name"]}}
{% endif %}
{% endfor %}
@startuml 'the packages are project specific and defined in needs_render_context in conf.py package P1 { ' import elements component "<size:12>Component</size>\n**Component A**\n<size:10>C_MANY_A</size>" as C_MANY_A [[../architecture-many-components.html#C_MANY_A]] #abcdef component "<size:12>Component</size>\n**Component B**\n<size:10>C_MANY_B</size>" as C_MANY_B [[../architecture-many-components.html#C_MANY_B]] #abcdef component "<size:12>Component</size>\n**Component C**\n<size:10>C_MANY_C</size>" as C_MANY_C [[../architecture-many-components.html#C_MANY_C]] #abcdef component "<size:12>Component</size>\n**Component D**\n<size:10>C_MANY_D</size>" as C_MANY_D [[../architecture-many-components.html#C_MANY_D]] #abcdef ' connect elements C_MANY_A #-# C_MANY_B C_MANY_B #-# C_MANY_C C_MANY_C #-# C_MANY_D } package P2 { ' import elements component "<size:12>Component</size>\n**Component E**\n<size:10>C_MANY_E</size>" as C_MANY_E [[../architecture-many-components.html#C_MANY_E]] #abcdef component "<size:12>Component</size>\n**Component F**\n<size:10>C_MANY_F</size>" as C_MANY_F [[../architecture-many-components.html#C_MANY_F]] #abcdef component "<size:12>Component</size>\n**Component G**\n<size:10>C_MANY_G</size>" as C_MANY_G [[../architecture-many-components.html#C_MANY_G]] #abcdef ' connect elements C_MANY_E #-# C_MANY_F C_MANY_F #-# C_MANY_G } ' connect packages with hidden link to nice align elements P1 --[hidden] P2 package P3 { ' import elements component "<size:12>Component</size>\n**Component H**\n<size:10>C_MANY_H</size>" as C_MANY_H [[../architecture-many-components.html#C_MANY_H]] #abcdef component "<size:12>Component</size>\n**Component I**\n<size:10>C_MANY_I</size>" as C_MANY_I [[../architecture-many-components.html#C_MANY_I]] #abcdef component "<size:12>Component</size>\n**Component J**\n<size:10>C_MANY_J</size>" as C_MANY_J [[../architecture-many-components.html#C_MANY_J]] #abcdef component "<size:12>Component</size>\n**Component K**\n<size:10>C_MANY_K</size>" as C_MANY_K [[../architecture-many-components.html#C_MANY_K]] #abcdef component "<size:12>Component</size>\n**Component L**\n<size:10>C_MANY_L</size>" as C_MANY_L [[../architecture-many-components.html#C_MANY_L]] #abcdef ' connect elements C_MANY_H #-# C_MANY_I C_MANY_I #-# C_MANY_J C_MANY_J #-# C_MANY_K C_MANY_K #-# C_MANY_L } ' connect packages with hidden link to nice align elements P2 --[hidden] P3 package P4 { ' import elements component "<size:12>Component</size>\n**Component M**\n<size:10>C_MANY_M</size>" as C_MANY_M [[../architecture-many-components.html#C_MANY_M]] #abcdef component "<size:12>Component</size>\n**Component N**\n<size:10>C_MANY_N</size>" as C_MANY_N [[../architecture-many-components.html#C_MANY_N]] #abcdef component "<size:12>Component</size>\n**Component O**\n<size:10>C_MANY_O</size>" as C_MANY_O [[../architecture-many-components.html#C_MANY_O]] #abcdef component "<size:12>Component</size>\n**Component P**\n<size:10>C_MANY_P</size>" as C_MANY_P [[../architecture-many-components.html#C_MANY_P]] #abcdef ' connect elements C_MANY_M #-# C_MANY_N C_MANY_N #-# C_MANY_O C_MANY_O #-# C_MANY_P } ' connect packages with hidden link to nice align elements P3 --[hidden] P4 @enduml
Behaviour Model: Sequence-Diagram
Configuration
Here we use monkey patching to get in functions in class JinjaFunctions from sphinx-needs. Currently used functions:
sequence
sequence2
sequence3
The patching is been done in metamodel.py.
Example with sequence
Example 8: Visualize a sequence diagram I
.. needuml::
:debug:
'add your needed sphinx-needs elements to the list "components"
{%- set components = ['C_A', 'C_B', 'C_C', 'C_D',] -%}
{% for c in components %}
'c = {{c}}
{{sequence(needs, c)}} {{ref(c)}}
{% endfor %}
'here you can add your plantuml sequence diagramm code.
'documentation can be found here: https://plantuml.com/en/sequence-diagram
activate C_C
'If you want to higlight a group of interactions are part of "port's",
'you can use "group" as with the following example:
group "{{ref('OP_C_A_OUT', option='title')}} {{ref('IP_C_C_IN', option='title')}}"
C_A <- C_C : subscribe for service
activate C_A
C_A -> C_C : agree on subscribtion
C_A -> C_C : send data
deactivate C_A
end
group "{{ref('OP_C_B_OUT', option='title')}} {{ref('IP_C_C_IN2', option='title')}}"
C_B <- C_C : subscribe for service
activate C_B
C_B -> C_C : agree on subscribtion
C_B -> C_C : send data
deactivate C_B
end
group "{{ref('OP_C_C_OUT', option='title')}} {{ref('IP_C_D_IN', option='title')}}"
C_C -> C_D : send data
end
deactivate C_C
@startuml 'add your needed sphinx-needs elements to the list "components" 'c = C_A participant "Component A" as C_A [[../architecture-examples.html#C_A]] 'c = C_B participant "Component B" as C_B [[../architecture-examples.html#C_B]] 'c = C_C participant "Component C" as C_C [[../architecture-examples.html#C_C]] 'c = C_D participant "Component D" as C_D [[../architecture-examples.html#C_D]] 'here you can add your plantuml sequence diagramm code. 'documentation can be found here: https://plantuml.com/en/sequence-diagram activate C_C 'If you want to higlight a group of interactions are part of "port's", 'you can use "group" as with the following example: group "[[../architecture-examples.html#OP_C_A_OUT out]] [[../architecture-examples.html#IP_C_C_IN in]]" C_A <- C_C : subscribe for service activate C_A C_A -> C_C : agree on subscribtion C_A -> C_C : send data deactivate C_A end group "[[../architecture-examples.html#OP_C_B_OUT out]] [[../architecture-examples.html#IP_C_C_IN2 in]]" C_B <- C_C : subscribe for service activate C_B C_B -> C_C : agree on subscribtion C_B -> C_C : send data deactivate C_B end group "[[../architecture-examples.html#OP_C_C_OUT out]] [[../architecture-examples.html#IP_C_D_IN in]]" C_C -> C_D : send data end deactivate C_C @enduml
Example with sequence2
Example 9: Visualize a sequence diagram II
.. needuml::
:debug:
'add your needed sphinx-needs elements to the list "components"
{%- set components = ['C_A', 'C_B', 'C_C', 'C_D',] -%}
{% for c in components %}
'c = {{c}}
{{sequence2(context, c)}} {{ref(c)}}
{% endfor %}
'If you want to higlight a group of interactions are part of "port's",
'you can use "group" as with the following example:
group "{{ref('OP_C_A_OUT', option='title')}} {{ref('IP_C_C_IN', option='title')}}"
C_A <- C_C : subscribe for service
activate C_A
C_A -> C_C : agree on subscribtion
C_A -> C_C : send data
deactivate C_A
end
@startuml 'add your needed sphinx-needs elements to the list "components" 'c = C_A participant "Component A" as C_A [[../architecture-examples.html#C_A]] 'c = C_B participant "Component B" as C_B [[../architecture-examples.html#C_B]] 'c = C_C participant "Component C" as C_C [[../architecture-examples.html#C_C]] 'c = C_D participant "Component D" as C_D [[../architecture-examples.html#C_D]] 'If you want to higlight a group of interactions are part of "port's", 'you can use "group" as with the following example: group "[[../architecture-examples.html#OP_C_A_OUT out]] [[../architecture-examples.html#IP_C_C_IN in]]" C_A <- C_C : subscribe for service activate C_A C_A -> C_C : agree on subscribtion C_A -> C_C : send data deactivate C_A end @enduml
Example with sequence3
Example 10: Visualize a sequence diagram III
.. needuml::
:debug:
'add your needed sphinx-needs elements to the list "components"
{%- set components = ['C_A', 'C_B', 'C_C', 'C_D',] -%}
{% for c in components %}
'c = {{c}}
{{sequence3(c)}} {{ref(c)}}
{% endfor %}
'If you want to higlight a group of interactions are part of "port's",
'you can use "group" as with the following example:
group "{{ref('OP_C_A_OUT', option='title')}} {{ref('IP_C_C_IN', option='title')}}"
C_A <- C_C : subscribe for service
activate C_A
C_A -> C_C : agree on subscribtion
C_A -> C_C : send data
deactivate C_A
end
@startuml 'add your needed sphinx-needs elements to the list "components" 'c = C_A participant "Component A" as C_A [[../architecture-examples.html#C_A]] 'c = C_B participant "Component B" as C_B [[../architecture-examples.html#C_B]] 'c = C_C participant "Component C" as C_C [[../architecture-examples.html#C_C]] 'c = C_D participant "Component D" as C_D [[../architecture-examples.html#C_D]] 'If you want to higlight a group of interactions are part of "port's", 'you can use "group" as with the following example: group "[[../architecture-examples.html#OP_C_A_OUT out]] [[../architecture-examples.html#IP_C_C_IN in]]" C_A <- C_C : subscribe for service activate C_A C_A -> C_C : agree on subscribtion C_A -> C_C : send data deactivate C_A end @enduml
How-to referring to Diagrams within a Need
It is not directly possible to refernce to a needarch (diagram). So we introduce here a needpart in the need, so we can reference to these.
Example 11: How-to referring to Diagrams within a Need
.. comp:: Component with Diagrams
:id: C_DIAGRAMS
.. needarch::
:debug:
{{flow(need().id)}}
:np:`(Sequence)` Diagram
.. needarch::
:key: Sequence
:debug:
participant {{need().id}} {{ref(need().id)}} [
{{need().title}}
----
Here is a bug in safari, it is been rendered correct in firefox.
With explicite link text:
{{ref(need().id + '.Deployment', text="Deployment Diagram")}}
{{ref(need().id + '.Sequence', text="Sequence Diagram")}}
With link text from needpart id:
{{ref(need().id + '.Deployment', option="id")}} Diagram
{{ref(need().id + '.Sequence', option="id")}} Diagram
]
.. comp:: Component linking to Diagrams within another Need
:id: C_LINK2DIAGRAMS
:links: C_DIAGRAMS.Deployment, C_DIAGRAMS.Sequence
Link to the Deployment Diagram of Component :need:`C_DIAGRAMS`: :need:`C_DIAGRAMS.Deployment`
Link to the Sequence Diagram of Component :need:`C_DIAGRAMS`: :need:`C_DIAGRAMS.Sequence`
.. needarch::
:debug:
{{flow(need().id)}}
:np:`(Internal)` Diagram
.. needarch::
:key: Internal
:debug:
{{flow(need().id)}}
{{uml('C_DIAGRAMS', 'Deployment')}}
{{need().id}} -> C_DIAGRAMS : uses Deployment Diagram
:np:`(Sequence)` Diagram
.. needarch::
:key: Sequence
:debug:
{{sequence3(need().id)}} {{ref(need().id)}}
{{uml('C_DIAGRAMS', 'Sequence')}}
{{need().id}} -> C_DIAGRAMS : uses Sequence Diagram
**How it is been in the native datamodel**
Finally a `needflow` to show the datamodel represenatation:
.. needflow::
:filter: docname == "architecture-examples" and section_name == "How-to referring to Diagrams within a Need"
:show_link_names:
:debug:
@startuml component "<size:12>Component</size>\n**Component with**\n**Diagrams**\n<size:10>C_DIAGRAMS</size>" as C_DIAGRAMS [[../architecture-examples.html#C_DIAGRAMS]] #abcdef @enduml Sequence Diagram
@startuml participant C_DIAGRAMS [[../architecture-examples.html#C_DIAGRAMS]] [ Component with Diagrams ---- Here is a bug in safari, it is been rendered correct in firefox. With explicite link text: [[../architecture-examples.html#C_DIAGRAMS.Deployment Deployment Diagram]] [[../architecture-examples.html#C_DIAGRAMS.Sequence Sequence Diagram]] With link text from needpart id: [[../architecture-examples.html#C_DIAGRAMS.Deployment Deployment]] Diagram [[../architecture-examples.html#C_DIAGRAMS.Sequence Sequence]] Diagram ] @enduml Following needarch is been added with needs template Deployment Diagram
|
Link to the Deployment Diagram of Component Component with Diagrams (C_DIAGRAMS): (C_DIAGRAMS.Deployment) Link to the Sequence Diagram of Component Component with Diagrams (C_DIAGRAMS): (C_DIAGRAMS.Sequence)
@startuml component "<size:12>Component</size>\n**Component**\n**linking to**\n**Diagrams within**\n**another Need**\n<size:10>C_LINK2DIAGRAMS</size>" as C_LINK2DIAGRAMS [[../architecture-examples.html#C_LINK2DIAGRAMS]] #abcdef @enduml Internal Diagram
@startuml component "<size:12>Component</size>\n**Component**\n**linking to**\n**Diagrams within**\n**another Need**\n<size:10>C_LINK2DIAGRAMS</size>" as C_LINK2DIAGRAMS [[../architecture-examples.html#C_LINK2DIAGRAMS]] #abcdef component "<size:12>Component</size>\n**Component with**\n**Diagrams**\n<size:10>C_DIAGRAMS</size>" as C_DIAGRAMS [[../architecture-examples.html#C_DIAGRAMS]] #abcdef { card "Deployment Diagram" as C_DIAGRAMS.Deployment [[../architecture-examples.html#C_DIAGRAMS.Deployment]] card "Sequence Diagram" as C_DIAGRAMS.Sequence [[../architecture-examples.html#C_DIAGRAMS.Sequence]] } C_LINK2DIAGRAMS -> C_DIAGRAMS : uses Deployment Diagram @enduml Sequence Diagram
@startuml participant "Component linking to Diagrams within another Need" as C_LINK2DIAGRAMS [[../architecture-examples.html#C_LINK2DIAGRAMS]] participant C_DIAGRAMS [[../architecture-examples.html#C_DIAGRAMS]] [ Component with Diagrams ---- Here is a bug in safari, it is been rendered correct in firefox. With explicite link text: [[../architecture-examples.html#C_DIAGRAMS.Deployment Deployment Diagram]] [[../architecture-examples.html#C_DIAGRAMS.Sequence Sequence Diagram]] With link text from needpart id: [[../architecture-examples.html#C_DIAGRAMS.Deployment Deployment]] Diagram [[../architecture-examples.html#C_DIAGRAMS.Sequence Sequence]] Diagram ] C_LINK2DIAGRAMS -> C_DIAGRAMS : uses Sequence Diagram @enduml Following needarch is been added with needs template Deployment Diagram
|
How it is been in the native datamodel
Finally a needflow to show the datamodel represenatation:
@startuml ' Nodes definition component "<size:12>Component</size>\n**Component with**\n**Diagrams**\n<size:10>C_DIAGRAMS</size>" as C_DIAGRAMS [[../architecture-examples.html#C_DIAGRAMS]] #abcdef{ 'parts: rectangle "<size:12>Component (part)</size>\n****\n<size:10>C_DIAGRAMS.**Sequence**</size>" as C_DIAGRAMS.Sequence [[../architecture-examples.html#C_DIAGRAMS.Sequence]] #abcdef rectangle "<size:12>Component (part)</size>\n****\n<size:10>C_DIAGRAMS.**Deployment**</size>" as C_DIAGRAMS.Deployment [[../architecture-examples.html#C_DIAGRAMS.Deployment]] #abcdef } component "<size:12>Component</size>\n**Component**\n**linking to**\n**Diagrams within**\n**another Need**\n<size:10>C_LINK2DIAGRAMS</size>" as C_LINK2DIAGRAMS [[../architecture-examples.html#C_LINK2DIAGRAMS]] #abcdef{ 'parts: rectangle "<size:12>Component (part)</size>\n****\n<size:10>C_LINK2DIAGRAMS.**Internal**</size>" as C_LINK2DIAGRAMS.Internal [[../architecture-examples.html#C_LINK2DIAGRAMS.Internal]] #abcdef rectangle "<size:12>Component (part)</size>\n****\n<size:10>C_LINK2DIAGRAMS.**Sequence**</size>" as C_LINK2DIAGRAMS.Sequence [[../architecture-examples.html#C_LINK2DIAGRAMS.Sequence]] #abcdef rectangle "<size:12>Component (part)</size>\n****\n<size:10>C_LINK2DIAGRAMS.**Deployment**</size>" as C_LINK2DIAGRAMS.Deployment [[../architecture-examples.html#C_LINK2DIAGRAMS.Deployment]] #abcdef } ' Connection definition C_LINK2DIAGRAMS -[dotted]- C_DIAGRAMS.Deployment: links outgoing\n C_LINK2DIAGRAMS -[dotted]- C_DIAGRAMS.Sequence: links outgoing\n @enduml
Template needarch to needs
It is possible to use needarch [2] and needuml [3] in Sphinx-Needs template [6]. You can set the template explicite in the need element itself or over needs_global_options [7].
Within this file we currently set generic views on needs elements of type comp. This is been done with a needs_global_options [7] configuration within metamodel.py.
As template [6] are jinja templates, even like needarch [2] and needuml [3],
we have to escape the jinja templates
in the needs_template with `{% raw %} ... {% endraw %}`
.
You can find an example in the needs_templates/arch_template.need:
1{# Place the original content here #}
2{{content}}
3
4**Following needarch is been added with needs template**
5
6:np:`(Deployment)` Diagram
7
8{% raw %}
9.. needarch::
10 :key: Deployment
11
12 {{flow(need().id)}} {
13 {% for e in need().parent_needs_back %}
14 {% if needs[e].parent_need == need().id and (needs[e].type == "outport" or needs[e].type == "inport") %}{{uml(e)}}{% endif %}
15 {% endfor %}
16 {% if 'Deployment' in need().parts %}card "Deployment Diagram" as {{need().id + '.Deployment'}} {{ref(need().id + '.Deployment')}}{% endif %}
17 {% if 'Sequence' in need().parts %}card "Sequence Diagram" as {{need().id + '.Sequence'}} {{ref(need().id + '.Sequence')}}{% endif %}
18 }
19{% endraw %}