Skip to content

Commit 7364169

Browse files
authored
Merge pull request #2257 from strictdoc-project/stanislaw/remove_composite
Migration: [[NODE]]: Remove [COMPOSITE_REQUIREMENT] from codebase
2 parents 9ea8660 + cf91f26 commit 7364169

File tree

43 files changed

+1120
-520
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1120
-520
lines changed

strictdoc/backend/sdoc/grammar/grammar.py

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -163,32 +163,28 @@
163163
;
164164
165165
SectionOrRequirement[noskipws]:
166-
'\n' (SDocSection | SDocCompositeNodeNew | SDocNode | SDocCompositeNode | DocumentFromFile)
166+
'\n' (SDocSection | SDocCompositeNode | SDocNode | DocumentFromFile)
167167
;
168168
169169
DocumentFromFile[noskipws]:
170170
'[DOCUMENT_FROM_FILE]' '\n'
171171
'FILE: ' file = /.+$/ '\n'
172172
;
173173
174-
SpaceThenRequirement[noskipws]:
175-
'\n' (SDocNode | SDocCompositeNode)
176-
;
177-
178174
ReservedKeyword[noskipws]:
179175
'DOCUMENT' | 'GRAMMAR' | 'SECTION' | 'DOCUMENT_FROM_FILE'
180176
;
181177
182178
SDocNode[noskipws]:
183-
'[' !'SECTION' !SDocCompositeNodeTagName node_type = RequirementType ']' '\n'
179+
'[' !'SECTION' node_type = RequirementType ']' '\n'
184180
fields += SDocNodeField
185181
(
186182
'RELATIONS:' '\n'
187183
(relations += Reference)
188184
)?
189185
;
190186
191-
SDocCompositeNodeNew[noskipws]:
187+
SDocCompositeNode[noskipws]:
192188
'[[' node_type = RequirementType ']]' '\n'
193189
194190
fields += SDocNodeField
@@ -203,10 +199,6 @@
203199
'[[/' node_type_close = RequirementType ']]' '\n'
204200
;
205201
206-
SDocCompositeNodeTagName[noskipws]:
207-
'COMPOSITE_'
208-
;
209-
210202
SDocNodeField[noskipws]:
211203
(
212204
field_name = 'MID' ': ' parts+=SingleLineString '\n'
@@ -230,21 +222,6 @@
230222
)
231223
;
232224
233-
SDocCompositeNode[noskipws]:
234-
'[COMPOSITE_' node_type = RequirementType ']' '\n'
235-
236-
fields *= SDocNodeField
237-
(
238-
'RELATIONS:' '\n'
239-
(relations += Reference)
240-
)?
241-
242-
requirements *= SpaceThenRequirement
243-
244-
'\n'
245-
'[/COMPOSITE_REQUIREMENT]' '\n'
246-
;
247-
248225
RequirementStatus[noskipws]:
249226
'Draft' | 'Active' | 'Deleted';
250227

strictdoc/backend/sdoc/models/constants.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
from strictdoc.backend.sdoc.models.inline_link import InlineLink
1818
from strictdoc.backend.sdoc.models.node import (
1919
SDocCompositeNode,
20-
SDocCompositeNodeNew,
2120
SDocNode,
2221
SDocNodeField,
2322
)
@@ -48,7 +47,6 @@
4847
SDocNode,
4948
SDocNodeField,
5049
SDocCompositeNode,
51-
SDocCompositeNodeNew,
5250
Reference,
5351
ParentReqReference,
5452
ChildReqReference,

strictdoc/backend/sdoc/models/model.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,6 @@ def get_prefix(self) -> Optional[str]:
4343
raise NotImplementedError # pragma: no cover
4444

4545

46-
class SDocCompositeNodeIF(SDocNodeIF, ABC):
47-
pass
48-
49-
5046
class SDocSectionIF(ABC):
5147
parent: Union["SDocDocumentIF", "SDocSectionIF"]
5248
ng_resolved_custom_level: Optional[str]
@@ -114,15 +110,13 @@ def section_contents(self) -> List[SDocDocumentIF]:
114110

115111

116112
SDocSectionContentIF = Union[
117-
SDocCompositeNodeIF,
118113
SDocNodeIF,
119114
SDocSectionIF,
120115
SDocDocumentFromFileIF,
121116
]
122117

123118

124119
SDocDocumentContentIF = Union[
125-
SDocCompositeNodeIF,
126120
SDocDocumentFromFileIF,
127121
SDocNodeIF,
128122
SDocSectionIF,
@@ -131,7 +125,6 @@ def section_contents(self) -> List[SDocDocumentIF]:
131125

132126
SDocElementIF = Union[
133127
SDocNodeIF,
134-
SDocCompositeNodeIF,
135128
SDocSectionIF,
136129
SDocDocumentIF,
137130
SDocDocumentFromFileIF,

strictdoc/backend/sdoc/models/node.py

Lines changed: 19 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
)
1414
from strictdoc.backend.sdoc.models.inline_link import InlineLink
1515
from strictdoc.backend.sdoc.models.model import (
16-
SDocCompositeNodeIF,
1716
SDocDocumentIF,
1817
SDocNodeIF,
1918
SDocSectionContentIF,
@@ -104,22 +103,19 @@ def get_text_value(self) -> str:
104103
class SDocNode(SDocNodeIF):
105104
def __init__(
106105
self,
107-
parent: Union[SDocDocumentIF, SDocSectionIF, SDocCompositeNodeIF],
106+
parent: Union[SDocDocumentIF, SDocSectionIF, SDocNodeIF],
108107
node_type: str,
109108
fields: List[SDocNodeField],
110109
relations: List[Reference],
111110
is_composite: bool = False,
112-
requirements: Optional[List["SDocNode"]] = None,
113111
section_contents: Optional[List[SDocSectionContentIF]] = None,
114112
node_type_close: Optional[str] = None,
115113
) -> None:
116114
assert parent
117115
assert isinstance(node_type, str)
118116
assert isinstance(relations, list), relations
119117

120-
self.parent: Union[
121-
SDocDocumentIF, SDocSectionIF, SDocCompositeNodeIF
122-
] = parent
118+
self.parent: Union[SDocDocumentIF, SDocSectionIF, SDocNodeIF] = parent
123119

124120
self.node_type: str = node_type
125121

@@ -146,7 +142,6 @@ def __init__(
146142
has_meta = True
147143
ordered_fields_lookup.setdefault(field.field_name, []).append(field)
148144

149-
self.requirements: Optional[List[SDocNode]] = requirements
150145
self.section_contents: List[SDocSectionContentIF] = (
151146
section_contents if section_contents is not None else []
152147
)
@@ -205,6 +200,11 @@ def get_type_string() -> str:
205200
def get_node_type_string(self) -> Optional[str]:
206201
return self.node_type
207202

203+
def get_display_node_type_string(self) -> Optional[str]:
204+
if self.is_composite:
205+
return f"[[{self.node_type}]]"
206+
return f"[{self.node_type}]"
207+
208208
def get_display_title(
209209
self,
210210
include_toc_number: bool = True, # noqa: ARG002
@@ -553,13 +553,16 @@ def get_prefix(self) -> Optional[str]:
553553
return None
554554
return element_prefix
555555

556-
parent: Union[
557-
SDocDocumentIF, SDocSectionIF, SDocNodeIF, SDocCompositeNodeIF
558-
] = assert_cast(
559-
self.parent,
560-
(SDocDocumentIF, SDocSectionIF, SDocNodeIF, SDocCompositeNodeIF),
561-
)
562-
return parent.get_prefix()
556+
# FIXME: Is this a reasonable behavior?
557+
if (
558+
isinstance(self.parent, SDocNode)
559+
and self.parent.node_type == "SECTION"
560+
):
561+
if (parent_prefix := self.parent.get_prefix()) is not None:
562+
return parent_prefix
563+
return document.get_prefix()
564+
565+
return self.parent.get_prefix()
563566

564567
def get_prefix_for_new_node(self, node_type: str) -> Optional[str]:
565568
assert isinstance(node_type, str) and len(node_type), node_type
@@ -710,30 +713,10 @@ def _update_has_meta(self) -> None:
710713

711714

712715
@auto_described
713-
class SDocCompositeNode(SDocNode, SDocCompositeNodeIF):
714-
def __init__(
715-
self,
716-
parent: Union[SDocDocumentIF, SDocSectionIF, SDocCompositeNodeIF],
717-
**fields: Any,
718-
) -> None:
719-
super().__init__(parent, **fields)
720-
721-
def is_composite_requirement(self) -> bool:
722-
return True
723-
724-
@property
725-
def document(self) -> SDocDocumentIF:
726-
assert self.ng_document_reference is not None
727-
document = self.ng_document_reference.get_document()
728-
assert document is not None
729-
return document
730-
731-
732-
@auto_described
733-
class SDocCompositeNodeNew(SDocNode):
716+
class SDocCompositeNode(SDocNode):
734717
def __init__(
735718
self,
736-
parent: Union[SDocDocumentIF, SDocSectionIF, SDocCompositeNodeIF],
719+
parent: Union[SDocDocumentIF, SDocSectionIF, SDocNodeIF],
737720
**fields: Any,
738721
) -> None:
739722
super().__init__(parent, **fields, is_composite=True)

strictdoc/backend/sdoc/processor.py

Lines changed: 5 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
from strictdoc.backend.sdoc.models.document_view import DocumentView
1616
from strictdoc.backend.sdoc.models.model import SDocDocumentFromFileIF
1717
from strictdoc.backend.sdoc.models.node import (
18-
SDocCompositeNode,
1918
SDocNode,
2019
SDocNodeField,
2120
)
@@ -63,8 +62,7 @@ def get_default_processors(self):
6362
"DocumentView": self.process_document_view,
6463
"SDocSection": self.process_section,
6564
"DocumentFromFile": self.process_document_from_file,
66-
"SDocCompositeNode": self.process_composite_requirement,
67-
"SDocCompositeNodeNew": self.process_requirement,
65+
"SDocCompositeNode": self.process_requirement,
6866
"SDocNode": self.process_requirement,
6967
"SDocNodeField": self.process_node_field,
7068
}
@@ -158,69 +156,24 @@ def process_document_from_file(self, document_from_file: DocumentFromFile):
158156
self.parse_context.current_include_parent = document_from_file.parent
159157
self.parse_context.fragments_from_files.append(document_from_file)
160158

161-
def process_composite_requirement(
162-
self, composite_requirement: SDocCompositeNode
163-
):
164-
self.parse_context.document_has_requirements = True
165-
166-
if self.parse_context.document_config.auto_levels:
167-
if composite_requirement.ng_resolved_custom_level:
168-
raise StrictDocException(
169-
"[COMPOSITE_REQUIREMENT].LEVEL field is provided. "
170-
"This contradicts to the option "
171-
"[DOCUMENT].OPTIONS.AUTO_LEVELS set to On. "
172-
f"Composite requirement: {composite_requirement}."
173-
)
174-
else:
175-
if not composite_requirement.ng_resolved_custom_level:
176-
raise StrictDocException(
177-
"[COMPOSITE_REQUIREMENT].LEVEL field is not "
178-
"provided. This contradicts to the option "
179-
"[DOCUMENT].OPTIONS.AUTO_LEVELS set to Off. "
180-
f"Composite requirement: {composite_requirement}."
181-
)
182-
183-
composite_requirement.ng_document_reference = (
184-
self.parse_context.document_reference
185-
)
186-
composite_requirement.ng_including_document_reference = (
187-
self.parse_context.context_document_reference
188-
)
189-
190-
cursor = composite_requirement.parent
191-
while (
192-
not isinstance(cursor, SDocDocument)
193-
and not cursor.ng_has_requirements
194-
):
195-
cursor.ng_has_requirements = True
196-
cursor = cursor.parent
197-
198-
if (
199-
composite_requirement.reserved_title is None
200-
or not self.parse_context.document_config.is_requirement_in_toc()
201-
) and self.parse_context.document_config.auto_levels:
202-
composite_requirement.ng_resolved_custom_level = "None"
203-
204-
preserve_source_location_data(composite_requirement)
205-
206159
def process_requirement(self, requirement: SDocNode) -> None:
207160
self.parse_context.document_has_requirements = True
208161

209162
if self.parse_context.document_config.auto_levels:
210163
if requirement.ng_resolved_custom_level:
211164
raise StrictDocException(
212-
"[REQUIREMENT].LEVEL field is provided. "
165+
f"{requirement.get_display_node_type_string()}.LEVEL field is provided. "
213166
"This contradicts to the option "
214167
"[DOCUMENT].OPTIONS.AUTO_LEVELS set to On. "
215-
f"Requirement: {requirement}."
168+
f"Node: {requirement}."
216169
)
217170
else:
218171
if not requirement.ng_resolved_custom_level:
219172
raise StrictDocException(
220-
"[REQUIREMENT].LEVEL field is not provided. "
173+
f"{requirement.get_display_node_type_string()}.LEVEL field is not provided. "
221174
"This contradicts to the option "
222175
"[DOCUMENT].OPTIONS.AUTO_LEVELS set to Off. "
223-
f"Requirement: {requirement}."
176+
f"Node: {requirement}."
224177
)
225178

226179
requirement.ng_document_reference = (

strictdoc/backend/sdoc/writer.py

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
)
1414
from strictdoc.backend.sdoc.models.node import (
1515
SDocCompositeNode,
16-
SDocCompositeNodeNew,
1716
SDocNode,
1817
)
1918
from strictdoc.backend.sdoc.models.reference import (
@@ -326,16 +325,12 @@ def _print_node(
326325
output = ""
327326

328327
if (
329-
isinstance(root_node, SDocCompositeNodeNew)
328+
isinstance(root_node, SDocCompositeNode)
330329
or root_node.is_composite
331330
):
332331
output += "[["
333332
output += root_node.node_type
334333
output += "]]\n"
335-
elif isinstance(root_node, SDocCompositeNode):
336-
output += "[COMPOSITE_"
337-
output += root_node.node_type
338-
output += "]\n"
339334
else:
340335
output += "["
341336
output += root_node.node_type
@@ -347,18 +342,9 @@ def _print_node(
347342
output += "\n"
348343

349344
if (
350-
isinstance(root_node, (SDocCompositeNode, SDocCompositeNodeNew))
345+
isinstance(root_node, SDocCompositeNode)
351346
or root_node.is_composite
352347
):
353-
# FIXME: Remove the legacy .requirements.
354-
if root_node.requirements is not None:
355-
for node_ in root_node.requirements:
356-
if not node_.ng_whitelisted:
357-
continue
358-
output += self._print_node(
359-
node_, document, document_iterator=document_iterator
360-
)
361-
362348
if root_node.section_contents is not None:
363349
for node_ in root_node.section_contents:
364350
if not node_.ng_whitelisted:
@@ -368,18 +354,13 @@ def _print_node(
368354
)
369355

370356
if (
371-
isinstance(root_node, SDocCompositeNodeNew)
357+
isinstance(root_node, SDocCompositeNode)
372358
or root_node.is_composite
373359
):
374360
output += "[[/"
375361
output += root_node.node_type
376362
output += "]]\n"
377363
output += "\n"
378-
else:
379-
output += "[/COMPOSITE_"
380-
output += root_node.node_type
381-
output += "]\n"
382-
output += "\n"
383364

384365
return output
385366

0 commit comments

Comments
 (0)