Skip to content

Commit c039f78

Browse files
ilaifMidnighter
andcommitted
feat: build out view features
Co-authored-by: Midnighter <[email protected]>
1 parent 8a43c7a commit c039f78

File tree

2 files changed

+40
-26
lines changed

2 files changed

+40
-26
lines changed

src/structurizr/view/static_view.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,12 @@ def add(
8585

8686
def add_all_people(self) -> None:
8787
"""Add all people in the model to this view."""
88-
for person in self.software_system.get_model().people:
88+
for person in self.model.people:
8989
self.add(person)
9090

9191
def add_all_software_systems(self) -> None:
9292
"""Add all people in the model to this view."""
93-
for system in self.software_system.get_model().software_systems:
93+
for system in self.model.software_systems:
9494
self.add(system)
9595

9696
def add_nearest_neighbours(self, element: Element,) -> None:
@@ -101,7 +101,7 @@ def add_nearest_neighbours(self, element: Element,) -> None:
101101
# TODO(ilaif): @midnighter - Should we move to @property instead
102102
# of get_X()? More pythonic.
103103
# (midnighter): Probably yes.
104-
for relationship in self.software_system.get_model().get_relationships():
104+
for relationship in self.model.get_relationships():
105105
if relationship.source == element and isinstance(
106106
relationship.destination, element_type
107107
):

src/structurizr/view/view.py

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
from ..abstract_base import AbstractBase
2525
from ..base_model import BaseModel
2626
from ..mixin import ViewSetRefMixin
27-
from ..model import Element, SoftwareSystem, SoftwareSystemIO
27+
from ..model import Element, SoftwareSystem
2828
from .automatic_layout import AutomaticLayout, AutomaticLayoutIO
2929
from .element_view import ElementView, ElementViewIO
3030
from .paper_size import PaperSize
@@ -46,17 +46,22 @@ class ViewIO(BaseModel, ABC):
4646

4747
key: str
4848
description: str
49-
software_system: Optional[SoftwareSystemIO] = Field(None, alias="softwareSystem")
50-
software_system_id: str = Field("", alias="softwareSystemId")
51-
paper_size: Optional[PaperSize] = Field(None, alias="paperSize")
52-
automatic_layout: Optional[AutomaticLayoutIO] = Field(None, alias="automaticLayout")
49+
software_system_id: str = Field(default="", alias="softwareSystemId")
50+
paper_size: Optional[PaperSize] = Field(default=None, alias="paperSize")
51+
automatic_layout: Optional[AutomaticLayoutIO] = Field(
52+
default=None, alias="automaticLayout"
53+
)
5354
title: str = ""
5455

55-
element_views: List[ElementViewIO] = Field([], alias="elementViews")
56-
relationship_views: List[RelationshipViewIO] = Field([], alias="relationshipViews")
56+
element_views: List[ElementViewIO] = Field(default=(), alias="elementViews")
57+
relationship_views: List[RelationshipViewIO] = Field(
58+
default=(), alias="relationshipViews"
59+
)
5760

5861
# TODO
59-
layout_merge_strategy: Optional[Any] = Field(None, alias="layoutMergeStrategy")
62+
layout_merge_strategy: Optional[Any] = Field(
63+
default=None, alias="layoutMergeStrategy"
64+
)
6065

6166

6267
class View(ViewSetRefMixin, AbstractBase, ABC):
@@ -72,32 +77,36 @@ class View(ViewSetRefMixin, AbstractBase, ABC):
7277
def __init__(
7378
self,
7479
*,
75-
software_system: SoftwareSystem,
76-
key: str,
80+
software_system: Optional[SoftwareSystem] = None,
81+
key: str = None,
7782
description: str,
7883
paper_size: Optional[PaperSize] = None,
7984
automatic_layout: Optional[AutomaticLayout] = None,
8085
title: str = "",
81-
element_views: Optional[Iterable[ElementView]] = None,
82-
relationship_views: Optional[Iterable[RelationshipView]] = None,
86+
element_views: Optional[Iterable[ElementView]] = (),
87+
relationship_views: Optional[Iterable[RelationshipView]] = (),
8388
layout_merge_strategy: Optional[Any] = None,
8489
**kwargs,
8590
):
8691
"""Initialize a view with a 'private' view set."""
8792
super().__init__(**kwargs)
8893
self.software_system = software_system
94+
self.software_system_id = software_system.id if software_system else None
8995
self.key = key
9096
self.description = description
9197
self.paper_size = paper_size
9298
self.automatic_layout = automatic_layout
9399
self.title = title
94-
self.element_views = set() if element_views is None else set(element_views)
95-
self.relationship_views = (
96-
set() if relationship_views is None else set(relationship_views)
97-
)
100+
self.element_views = set(element_views)
101+
self.relationship_views = set(relationship_views)
102+
98103
# TODO
99104
self.layout_merge_strategy = layout_merge_strategy
100105

106+
@property
107+
def model(self):
108+
return self.software_system.get_model()
109+
101110
def _add_element(self, element: Element, add_relationships: bool) -> None:
102111
"""
103112
Add the given element to this view.
@@ -108,12 +117,13 @@ def _add_element(self, element: Element, add_relationships: bool) -> None:
108117
relationships with other elements.
109118
110119
"""
111-
if element not in self.software_system.get_model():
120+
if element not in self.model:
112121
raise RuntimeError(
113122
f"The element {element} does not exist in the model associated with "
114123
f"this view."
115124
)
116-
self.element_views.add(ElementView(element=element))
125+
# TODO: finish x,y coordinates , x=0, y=0
126+
self.element_views.add(ElementView(id=element.id))
117127
if add_relationships:
118128
self._add_relationships(element)
119129

@@ -125,10 +135,14 @@ def _add_relationships(self, element: Element) -> None:
125135
element (Element): The model element.
126136
127137
"""
128-
elements: Set[Element] = {v.element for v in self.element_views}
138+
elements: Set[str] = {v.id for v in self.element_views}
139+
129140
for relationship in element.get_efferent_relationships():
130-
if relationship.destination in elements:
131-
self.relationship_views.add(RelationshipView(relationship=relationship))
141+
if relationship.destination.id in elements:
142+
# TODO: finish relationshipview construction
143+
self.relationship_views.add(RelationshipView(id=relationship.id))
144+
132145
for relationship in element.get_afferent_relationships():
133-
if relationship.source in elements:
134-
self.relationship_views.add(RelationshipView(relationship=relationship))
146+
if relationship.source.id in elements:
147+
# TODO: finish relationshipview construction
148+
self.relationship_views.add(RelationshipView(id=relationship.id))

0 commit comments

Comments
 (0)