Skip to content

Commit f9e8d6d

Browse files
committed
bcf - fix issues with unexpected reloads from zip
It wasn't considering that self._topics could be an empty dict because there are no topics and it would also reload it. Now we have None value to distinguish when it actually wasn't loaded before. Same for viewpoints, reference files and document references. I've also imade mplementations identical/more similar between v2 and v3.
1 parent 65cc5bf commit f9e8d6d

File tree

4 files changed

+46
-32
lines changed

4 files changed

+46
-32
lines changed

src/bcf/bcf/v2/bcfxml.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def __init__(
2424
self._xml_handler = xml_handler or XmlParserSerializer()
2525
self._version: Optional[mdl.Version] = None
2626
self._project_info: Optional[mdl.ProjectExtension] = None
27-
self._topics: dict[str, TopicHandler] = {}
27+
self._topics: Optional[dict[str, TopicHandler]] = None
2828
self._extension_schema: Optional[bytes] = None
2929
self._zip_file = self._load_zip_file()
3030

@@ -88,21 +88,21 @@ def extension_schema(self, value: bytes) -> None:
8888
@property
8989
def topics(self) -> dict[str, TopicHandler]:
9090
"""BCF topics."""
91-
if not self._topics and self._zip_file:
92-
self._topics = self._load_topics(self._zip_file, self._xml_handler)
91+
if self._topics is None:
92+
self._topics = self._load_topics()
9393
return self._topics
9494

95-
def _load_topics(
96-
self, zip_file: zipfile.ZipFile, xml_handler: AbstractXmlParserSerializer
97-
) -> dict[str, TopicHandler]:
95+
def _load_topics(self) -> dict[str, TopicHandler]:
9896
topics = {}
99-
for topic_dir in zipfile.Path(zip_file).iterdir():
97+
if self._zip_file is None:
98+
return topics
99+
for topic_dir in zipfile.Path(self._zip_file).iterdir():
100100
if not topic_dir.is_dir():
101101
continue
102102
markup_path = topic_dir.joinpath("markup.bcf")
103103
if not markup_path.exists():
104104
continue
105-
topics[topic_dir.name] = TopicHandler(topic_dir, xml_handler)
105+
topics[topic_dir.name] = TopicHandler(topic_dir, self._xml_handler)
106106
return topics
107107

108108
@classmethod

src/bcf/bcf/v2/topic.py

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ def __init__(
2727
xml_handler: Optional[AbstractXmlParserSerializer] = None,
2828
) -> None:
2929
self._markup: Optional[mdl.Markup] = None
30-
self._viewpoints: dict[str, VisualizationInfoHandler] = {}
31-
self._reference_files: dict[str, bytes] = {}
32-
self._document_references: dict[str, bytes] = {}
30+
self._viewpoints: Optional[dict[str, VisualizationInfoHandler]] = None
31+
self._reference_files: Optional[dict[str, bytes]] = None
32+
self._document_references: Optional[dict[str, bytes]] = None
3333
self._bim_snippet: Optional[bytes] = None
3434
self._xml_handler = xml_handler or XmlParserSerializer()
3535
self._topic_dir = topic_dir
@@ -80,14 +80,24 @@ def bim_snippet(self, value: bytes) -> None:
8080

8181
@property
8282
def viewpoints(self) -> dict[str, VisualizationInfoHandler]:
83-
if not self._viewpoints and self._topic_dir:
83+
if self._viewpoints is None:
8484
self._viewpoints = self._load_viewpoints()
8585
return self._viewpoints
8686

87+
def _load_viewpoints(self) -> dict[str, VisualizationInfoHandler]:
88+
if self._topic_dir and self.markup and (viewpoints := self.markup.viewpoints):
89+
return VisualizationInfoHandler.from_topic_viewpoints(self._topic_dir, viewpoints)
90+
return {}
91+
8792
@property
8893
def reference_files(self) -> dict[str, bytes]:
89-
if self._reference_files or not self.header:
94+
if self._reference_files is not None:
9095
return self._reference_files
96+
97+
self._reference_files = {}
98+
if not self.header:
99+
return self._reference_files
100+
91101
for ref in self.header.file:
92102
if ref.is_external:
93103
continue
@@ -99,8 +109,13 @@ def reference_files(self) -> dict[str, bytes]:
99109

100110
@property
101111
def document_references(self) -> dict[str, bytes]:
102-
if self._document_references or not self.topic:
112+
if self._document_references is not None:
103113
return self._document_references
114+
115+
self._document_references = {}
116+
if not self.topic:
117+
return self._document_references
118+
104119
for doc in self.topic.document_reference:
105120
if doc.is_external or not doc.referenced_document:
106121
continue
@@ -118,11 +133,6 @@ def _load_bim_snippet(self) -> Optional[bytes]:
118133
return bim_snippet_path.read_bytes()
119134
return None
120135

121-
def _load_viewpoints(self) -> dict[str, VisualizationInfoHandler]:
122-
if self.markup and (viewpoints := self.markup.viewpoints):
123-
return VisualizationInfoHandler.from_topic_viewpoints(self._topic_dir, viewpoints)
124-
return {}
125-
126136
@classmethod
127137
def create_new(
128138
cls,

src/bcf/bcf/v3/bcfxml.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def __init__(
2626
self._version: Optional[mdl.Version] = None
2727
self._project_info: Optional[mdl.ProjectInfo] = None
2828
self._extensions: Optional[mdl.Extensions] = None
29-
self._topics: dict[str, TopicHandler] = {}
29+
self._topics: Optional[dict[str, TopicHandler]] = None
3030
self._documents: Optional[DocumentsHandler] = None
3131
self._zip_file = self._load_zip_file()
3232

@@ -91,18 +91,22 @@ def extensions(self, value: Optional[mdl.Extensions]) -> None:
9191
@property
9292
def topics(self) -> dict[str, TopicHandler]:
9393
"""BCF topics."""
94-
if not self._topics and self._zip_file:
95-
self._load_topics()
94+
if self._topics is None:
95+
self._topics = self._load_topics()
9696
return self._topics
9797

98-
def _load_topics(self) -> None:
98+
def _load_topics(self) -> dict[str, TopicHandler]:
99+
topics = {}
100+
if self._zip_file is None:
101+
return topics
99102
for topic_dir in zipfile.Path(self._zip_file).iterdir():
100103
if not topic_dir.is_dir():
101104
continue
102105
markup_path = topic_dir.joinpath("markup.bcf")
103106
if not markup_path.exists():
104107
continue
105-
self._topics[topic_dir.name] = TopicHandler(topic_dir, self._xml_handler)
108+
topics[topic_dir.name] = TopicHandler(topic_dir, self._xml_handler)
109+
return topics
106110

107111
@property
108112
def documents(self) -> Optional[DocumentsHandler]:

src/bcf/bcf/v3/topic.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def __init__(
2626
xml_handler: Optional[AbstractXmlParserSerializer] = None,
2727
) -> None:
2828
self._markup: Optional[mdl.Markup] = None
29-
self._viewpoints: dict[str, VisualizationInfoHandler] = {}
29+
self._viewpoints: Optional[dict[str, VisualizationInfoHandler]] = None
3030
self._bim_snippet: Optional[bytes] = None
3131
self._xml_handler = xml_handler or XmlParserSerializer()
3232
self._topic_dir = topic_dir
@@ -77,15 +77,15 @@ def bim_snippet(self, value: bytes) -> None:
7777

7878
@property
7979
def viewpoints(self) -> dict[str, "VisualizationInfoHandler"]:
80-
if (
81-
not self._viewpoints
82-
and self._topic_dir
83-
and self.topic.viewpoints
84-
and (viewpoints := self.topic.viewpoints.view_point)
85-
):
86-
self._viewpoints = VisualizationInfoHandler.from_topic_viewpoints(self._topic_dir, viewpoints)
80+
if self._viewpoints is None:
81+
self._viewpoints = self._load_viewpoints()
8782
return self._viewpoints
8883

84+
def _load_viewpoints(self) -> dict[str, "VisualizationInfoHandler"]:
85+
if self._topic_dir and self.topic.viewpoints and (viewpoints := self.topic.viewpoints.view_point):
86+
return VisualizationInfoHandler.from_topic_viewpoints(self._topic_dir, viewpoints)
87+
return {}
88+
8989
def _load_bim_snippet(self) -> Optional[bytes]:
9090
bim_snippet_obj = self.topic.bim_snippet
9191
if bim_snippet_obj and not bim_snippet_obj.is_external and self._topic_dir:

0 commit comments

Comments
 (0)