Skip to content

Commit fa58671

Browse files
yt-msMidnighter
authored andcommitted
feat(DeploymentView): add support for removing elements
1 parent 738d708 commit fa58671

File tree

3 files changed

+112
-4
lines changed

3 files changed

+112
-4
lines changed

src/structurizr/view/deployment_view.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,16 @@ def remove(
111111
],
112112
):
113113
"""Remove the given item from this view."""
114-
pass # TODO
114+
if isinstance(item, DeploymentNode):
115+
child_items = (
116+
item.container_instances
117+
+ item.software_system_instances
118+
+ item.infrastructure_nodes
119+
+ item.children
120+
)
121+
for child in child_items:
122+
self.remove(child)
123+
self._remove_element(item)
115124

116125
def _add_node_children(
117126
self, deployment_node: DeploymentNode, add_relationships: bool

src/structurizr/view/view.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,11 +158,11 @@ def _remove_element(self, element: Element) -> None:
158158
f"this view."
159159
)
160160
self.element_views.add(ElementView(id=element.id))
161-
for element_view in self.element_views:
161+
for element_view in list(self.element_views): # Copy as modifying as we go
162162
if element_view.id == element.id:
163163
self.element_views.remove(element_view)
164164

165-
for relationship_view in self.relationship_views:
165+
for relationship_view in list(self.relationship_views):
166166
if (
167167
relationship_view.relationship.source.id == element.id
168168
or relationship_view.relationship.destination.id == element.id

tests/unit/view/test_deployment_view.py

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,4 +327,103 @@ def test_animation_raises_if_no_container_instances_found(empty_workspace: Works
327327
deployment_view.add_animation(web_application_instance, database_instance)
328328

329329

330-
# TODO: Removing
330+
def test_deployment_view_removing_infrastructure_node(empty_workspace: Workspace):
331+
"""Test removing an infrastructure node from the view."""
332+
model = empty_workspace.model
333+
views = empty_workspace.views
334+
335+
software_system = model.add_software_system("Software System")
336+
container = software_system.add_container("Container")
337+
parent_deployment_node = model.add_deployment_node("Deployment Node")
338+
child_deployment_node = parent_deployment_node.add_deployment_node("Child Node")
339+
infrastructure_node = child_deployment_node.add_infrastructure_node("Infra Node")
340+
container_instance = child_deployment_node.add_container(container)
341+
342+
deployment_view = views.create_deployment_view(
343+
software_system=software_system, key="deployment", description="Description"
344+
)
345+
deployment_view.add_all_deployment_nodes()
346+
assert len(deployment_view.element_views) == 4
347+
348+
deployment_view.remove(infrastructure_node)
349+
assert len(deployment_view.element_views) == 3
350+
assert not deployment_view.is_element_in_view(infrastructure_node)
351+
assert deployment_view.is_element_in_view(parent_deployment_node)
352+
assert deployment_view.is_element_in_view(child_deployment_node)
353+
assert deployment_view.is_element_in_view(container_instance)
354+
355+
356+
def test_deployment_view_removing_container_instance(empty_workspace: Workspace):
357+
"""Test removing a container instance from the view."""
358+
model = empty_workspace.model
359+
views = empty_workspace.views
360+
361+
software_system = model.add_software_system("Software System")
362+
container = software_system.add_container("Container")
363+
parent_deployment_node = model.add_deployment_node("Deployment Node")
364+
child_deployment_node = parent_deployment_node.add_deployment_node("Child Node")
365+
infrastructure_node = child_deployment_node.add_infrastructure_node("Infra Node")
366+
container_instance = child_deployment_node.add_container(container)
367+
368+
deployment_view = views.create_deployment_view(
369+
software_system=software_system, key="deployment", description="Description"
370+
)
371+
deployment_view.add_all_deployment_nodes()
372+
assert len(deployment_view.element_views) == 4
373+
374+
deployment_view.remove(container_instance)
375+
assert len(deployment_view.element_views) == 3
376+
assert deployment_view.is_element_in_view(infrastructure_node)
377+
assert deployment_view.is_element_in_view(parent_deployment_node)
378+
assert deployment_view.is_element_in_view(child_deployment_node)
379+
assert not deployment_view.is_element_in_view(container_instance)
380+
381+
382+
def test_deployment_view_removing_deployment_node_and_children(
383+
empty_workspace: Workspace,
384+
):
385+
"""Test removing a deployment node from the view removes its child instances."""
386+
model = empty_workspace.model
387+
views = empty_workspace.views
388+
389+
software_system = model.add_software_system("Software System")
390+
container = software_system.add_container("Container")
391+
parent_deployment_node = model.add_deployment_node("Deployment Node")
392+
child_deployment_node = parent_deployment_node.add_deployment_node("Child Node")
393+
infrastructure_node = child_deployment_node.add_infrastructure_node("Infra Node")
394+
container_instance = child_deployment_node.add_container(container)
395+
396+
deployment_view = views.create_deployment_view(
397+
software_system=software_system, key="deployment", description="Description"
398+
)
399+
deployment_view.add_all_deployment_nodes()
400+
assert len(deployment_view.element_views) == 4
401+
402+
deployment_view.remove(child_deployment_node)
403+
assert len(deployment_view.element_views) == 1
404+
assert not deployment_view.is_element_in_view(infrastructure_node)
405+
assert deployment_view.is_element_in_view(parent_deployment_node)
406+
assert not deployment_view.is_element_in_view(child_deployment_node)
407+
assert not deployment_view.is_element_in_view(container_instance)
408+
409+
410+
def test_deployment_view_removing_parent_deployment_node(empty_workspace: Workspace):
411+
"""Test removing a parent deployment node from the view removes its children."""
412+
model = empty_workspace.model
413+
views = empty_workspace.views
414+
415+
software_system = model.add_software_system("Software System")
416+
container = software_system.add_container("Container")
417+
parent_deployment_node = model.add_deployment_node("Deployment Node")
418+
child_deployment_node = parent_deployment_node.add_deployment_node("Child Node")
419+
child_deployment_node.add_infrastructure_node("Infra Node")
420+
child_deployment_node.add_container(container)
421+
422+
deployment_view = views.create_deployment_view(
423+
software_system=software_system, key="deployment", description="Description"
424+
)
425+
deployment_view.add_all_deployment_nodes()
426+
assert len(deployment_view.element_views) == 4
427+
428+
deployment_view.remove(parent_deployment_node)
429+
assert len(deployment_view.element_views) == 0

0 commit comments

Comments
 (0)