Skip to content
This repository was archived by the owner on Jan 21, 2023. It is now read-only.

Commit aa24ffb

Browse files
yt-msMidnighter
authored andcommitted
refactor: better handling of tags in FilteredView
1 parent e859849 commit aa24ffb

File tree

3 files changed

+31
-4
lines changed

3 files changed

+31
-4
lines changed

src/structurizr/view/filtered_view.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@
1414
"""Provide a filtered view."""
1515

1616
from enum import Enum
17-
from typing import Iterable, List, Optional
17+
from typing import Iterable, List, Optional, Union
1818

19-
from pydantic import Field
19+
from ordered_set import OrderedSet
20+
from pydantic import Field, validator
2021

2122
from .abstract_view import AbstractView, AbstractViewIO
2223
from .static_view import StaticView
@@ -42,12 +43,22 @@ class FilteredViewIO(AbstractViewIO):
4243
upon the set of tag
4344
tags: The set of tags to include/exclude elements/relationships when rendering
4445
this filtered view.
46+
47+
Note that unlike Model Items, when filtered view tags are serialised to JSON then
48+
they are serialised as an array rather than comma-separated.
4549
"""
4650

4751
base_view_key: str = Field(alias="baseViewKey")
4852
mode: FilterMode
4953
tags: List[str]
5054

55+
@validator("tags", pre=True)
56+
def split_tags(cls, tags: Union[str, Iterable[str]]) -> List[str]:
57+
"""Convert comma-separated tag list into list if needed."""
58+
if isinstance(tags, str):
59+
return tags.split(",")
60+
return list(tags)
61+
5162

5263
class FilteredView(AbstractView):
5364
"""
@@ -78,7 +89,7 @@ def __init__(
7889
self._base_view_key = base_view_key
7990
self.view = view
8091
self.mode = mode
81-
self.tags = set(tags)
92+
self.tags = OrderedSet(tags)
8293

8394
@property
8495
def base_view_key(self) -> str:

src/structurizr/view/view_set.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,9 @@ def hydrate(cls, views: ViewSetIO, model: "Model") -> "ViewSet":
152152
cls._hydrate_view(view, model=model)
153153
dynamic_views.append(view)
154154

155-
filtered_views = [FilteredView.hydrate(view_io) for view_io in views.filtered_views]
155+
filtered_views = [
156+
FilteredView.hydrate(view_io) for view_io in views.filtered_views
157+
]
156158

157159
result = cls(
158160
model=model,

tests/unit/view/test_filtered_view.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,17 @@ def test_serialisation():
4747
assert view2.description == "test"
4848
assert view2.mode == FilterMode.Exclude
4949
assert view2.tags == {"v1"}
50+
51+
52+
def test_tags_are_serialised_as_an_array():
53+
"""Ensure that tags are serialised as an array, not comma-separated."""
54+
container_view = ContainerView(key="static_key", description="container")
55+
filtered_view = FilteredView(
56+
key="filter1",
57+
view=container_view,
58+
description="test",
59+
mode=FilterMode.Exclude,
60+
tags=["v1", "test"],
61+
)
62+
io = FilteredViewIO.from_orm(filtered_view).json()
63+
assert '"tags": ["v1", "test"]' in io

0 commit comments

Comments
 (0)