needarch

needarch behaves exactly like needuml, but only works inside a need. It provides also additional exclusive jinja functions need() and import(need_links_option_name).

Example

.. req:: Requirement arch
   :id: req_arch_001

   .. needarch::
      :scale: 50
      :align: center

      Alice -> Bob: Hi Bob
      Bob --> Alice: hi Alice

Result

Requirement: Requirement arch req_arch_001 ../_images/arrow-right-circle.svg
links incoming: req_arch_004
is blocked by: req_arch_004

@startuml

Alice -> Bob: Hi Bob
Bob --> Alice: hi Alice
@enduml

Jinja context

The following Jinja functions are only available for needarch.

need()

New in version 1.0.3.

The need() function provides you the need information the needarch is embedded in.

Example

.. req:: Req Arch four
   :id: req_arch_004
   :status: draft
   :blocks: req_arch_001

   content.

   .. needarch::
      :scale: 50
      :align: center

      class "{{need().title}}" {
      {{need().status}}
      {% for e in need().blocks %}{{e}}
      {% endfor %}
      }

Result

Requirement: Req Arch four req_arch_004 ../_images/arrow-right-circle.svg
status: draft
links outgoing: req_arch_001
blocks: req_arch_001

content.

@startuml

class "Req Arch four" {
draft
req_arch_001

}
@enduml

This function takes undefined amounts of current need links option names as arguments.

Then it executes uml(id) automatically for all links/need_ids defined from the given arguments.

Example

.. req:: Req Arch second
   :id: req_arch_002

   content.

.. req:: Req Arch third
   :id: req_arch_003

   some.

.. test:: Test Arch
   :id: test_arch_001
   :checks: req_arch_001
   :tests: req_arch_002, req_arch_003

   Test need arch jinja import function.

   .. needarch::
      :scale: 50
      :align: center

      {{import("checks", "tests")}}

Result

Requirement: Req Arch second req_arch_002 ../_images/arrow-right-circle.svg
is checked by: test_arch_001

arch req content.

Requirement: Req Arch third req_arch_003 ../_images/arrow-right-circle.svg
triggered by: test_arch_001

some req stuff.

Specification: Spec Arch first spec_arch_001 ../_images/arrow-right-circle.svg
triggered by: test_arch_001

some spec content.

Test Case: Test Arch test_arch_001 ../_images/arrow-right-circle.svg

Test need arch jinja import function.

@startuml

node "<size:12>Requirement</size>\n**Req Arch second**\n<size:10>req_arch_002</size>" as req_arch_002 [[../directives/needarch.html#req_arch_002]] #BFD8D2
node "<size:12>Requirement</size>\n**Req Arch third**\n<size:10>req_arch_003</size>" as req_arch_003 [[../directives/needarch.html#req_arch_003]] #BFD8D2
node "<size:12>Specification</size>\n**Spec Arch first**\n<size:10>spec_arch_001</size>" as spec_arch_001 [[../directives/needarch.html#spec_arch_001]] #FEDCD2

@enduml

NeedArch Loop Example

New in version 1.0.3.

NeedArch can detect include loops (uml(‘1’) -> uml(‘2’) -> uml(‘3’) -> uml(‘1’) and can avoid to include an element twice. Maybe this is not always the use case you have, if so please create an issue and mention this chapter. The algorithm does detect different parameter sets and does import uml() calls with different parameter to the same need.

Example

.. comp:: COMP_T_001
   :id: COMP_T_001

   .. needarch::

      {{flow(need().id)}}
      {% if variant == "A" %}
      {{uml('COMP_T_003', variant="A")}}
      usecase {{need().id}}_usecase
      {% else %}
      {{uml('COMP_T_003')}}
      {{uml('COMP_T_003', variant="A")}}
      {% endif %}

.. comp:: COMP_T_002
   :id: COMP_T_002

   .. needarch::

      {{flow(need().id)}}
      {% if variant == "A" %}
      {{uml('COMP_T_001', variant="A")}}
      usecase {{need().id}}_usecase
      {% else %}
      {{uml('COMP_T_001')}}
      {% endif %}

.. comp:: COMP_T_003
   :id: COMP_T_003

   .. needarch::

      {{flow(need().id)}}
      {% if variant == "A" %}
      {{uml('COMP_T_002', variant="A")}}
      usecase {{need().id}}_usecase
      {% else %}
      {{uml('COMP_T_002')}}
      {% endif %}

Result

Component: COMP_T_001 COMP_T_001 ../_images/arrow-right-circle.svg

@startuml

card "<size:12>Component</size>\n**COMP_T_001**\n<size:10>COMP_T_001</size>" as COMP_T_001 [[../directives/needarch.html#COMP_T_001]] #BFD8D2

card "<size:12>Component</size>\n**COMP_T_003**\n<size:10>COMP_T_003</size>" as COMP_T_003 [[../directives/needarch.html#COMP_T_003]] #BFD8D2

card "<size:12>Component</size>\n**COMP_T_002**\n<size:10>COMP_T_002</size>" as COMP_T_002 [[../directives/needarch.html#COMP_T_002]] #BFD8D2











usecase COMP_T_001_usecase

usecase COMP_T_002_usecase

usecase COMP_T_003_usecase






@enduml

Component: COMP_T_002 COMP_T_002 ../_images/arrow-right-circle.svg

@startuml

card "<size:12>Component</size>\n**COMP_T_002**\n<size:10>COMP_T_002</size>" as COMP_T_002 [[../directives/needarch.html#COMP_T_002]] #BFD8D2

card "<size:12>Component</size>\n**COMP_T_001**\n<size:10>COMP_T_001</size>" as COMP_T_001 [[../directives/needarch.html#COMP_T_001]] #BFD8D2

card "<size:12>Component</size>\n**COMP_T_003**\n<size:10>COMP_T_003</size>" as COMP_T_003 [[../directives/needarch.html#COMP_T_003]] #BFD8D2













usecase COMP_T_001_usecase

usecase COMP_T_002_usecase

usecase COMP_T_003_usecase



@enduml

Component: COMP_T_003 COMP_T_003 ../_images/arrow-right-circle.svg

@startuml

card "<size:12>Component</size>\n**COMP_T_003**\n<size:10>COMP_T_003</size>" as COMP_T_003 [[../directives/needarch.html#COMP_T_003]] #BFD8D2

card "<size:12>Component</size>\n**COMP_T_002**\n<size:10>COMP_T_002</size>" as COMP_T_002 [[../directives/needarch.html#COMP_T_002]] #BFD8D2

card "<size:12>Component</size>\n**COMP_T_001**\n<size:10>COMP_T_001</size>" as COMP_T_001 [[../directives/needarch.html#COMP_T_001]] #BFD8D2












usecase COMP_T_001_usecase

usecase COMP_T_002_usecase

usecase COMP_T_003_usecase




@enduml