Skip to content

Commit 634312c

Browse files
authored
Merge pull request #2194 from strictdoc-project/stanislaw/merge_nodes
backend/sdoc, UI: enable composite requirements adding
2 parents 98c18d8 + adffafb commit 634312c

File tree

23 files changed

+438
-388
lines changed

23 files changed

+438
-388
lines changed

strictdoc/backend/excel/import_/excel_to_sdoc_converter.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,11 @@ def create_document(
149149
)
150150

151151
requirements_element = GrammarElement(
152-
parent=None, tag="REQUIREMENT", fields=fields, relations=[]
152+
parent=None,
153+
tag="REQUIREMENT",
154+
property_is_composite="",
155+
fields=fields,
156+
relations=[],
153157
)
154158
elements = [requirements_element]
155159
grammar = DocumentGrammar(parent=document, elements=elements)

strictdoc/backend/reqif/p01_sdoc/reqif_to_sdoc_converter.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,9 @@ def create_grammar_element_from_spec_object_type(
313313
requirement_element = GrammarElement(
314314
parent=None,
315315
tag=create_safe_requirement_tag_string(spec_object_type.long_name),
316+
# FIXME: MERGE NODES
317+
# When the migration is done, make the nodes to be always recursive.
318+
property_is_composite="",
316319
fields=fields,
317320
relations=[],
318321
)

strictdoc/backend/sdoc/grammar/grammar.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@
185185
(relations += Reference)
186186
)?
187187
188-
requirements *= SpaceThenRequirement
188+
section_contents *= SpaceThenRequirement
189189
190190
'\n'
191191
'[[/' node_type_close = RequirementType ']]' '\n'

strictdoc/backend/sdoc/grammar/grammar_grammar.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
1616
GrammarElement[noskipws]:
1717
'- TAG: ' tag = RequirementType '\n'
18+
(
19+
' PROPERTIES:' '\n'
20+
' IS_COMPOSITE: ' property_is_composite=/(True|False)/ '\n'
21+
)?
1822
' FIELDS:' '\n'
1923
fields += GrammarElementField
2024
(

strictdoc/backend/sdoc/models/document_grammar.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ def __init__(
4646
self,
4747
parent,
4848
tag: str,
49+
property_is_composite: str,
4950
fields: List[
5051
Union[
5152
GrammarElementFieldString,
@@ -57,6 +58,13 @@ def __init__(
5758
):
5859
self.parent = parent
5960
self.tag: str = tag
61+
62+
assert property_is_composite in ("", "True", "False")
63+
self.property_is_composite: Optional[bool] = (
64+
None
65+
if property_is_composite == ""
66+
else (property_is_composite == "True")
67+
)
6068
self.fields: List[
6169
Union[
6270
GrammarElementFieldString,
@@ -102,6 +110,7 @@ def create_default(tag: str):
102110
return GrammarElement(
103111
parent=None,
104112
tag=tag,
113+
property_is_composite="",
105114
fields=[
106115
GrammarElementFieldString(
107116
parent=None,
@@ -271,7 +280,11 @@ def create_default(parent) -> "DocumentGrammar":
271280
),
272281
]
273282
requirement_element = GrammarElement(
274-
parent=None, tag="REQUIREMENT", fields=fields, relations=[]
283+
parent=None,
284+
tag="REQUIREMENT",
285+
property_is_composite="",
286+
fields=fields,
287+
relations=[],
275288
)
276289
# @relation(SDOC-SRS-132, scope=range_end)
277290

@@ -346,7 +359,11 @@ def create_for_test_report(parent) -> "DocumentGrammar":
346359
),
347360
]
348361
requirement_element = GrammarElement(
349-
parent=None, tag="TEST_RESULT", fields=fields, relations=[]
362+
parent=None,
363+
tag="TEST_RESULT",
364+
property_is_composite="",
365+
fields=fields,
366+
relations=[],
350367
)
351368

352369
requirement_element.relations = create_default_relations(
@@ -440,7 +457,11 @@ def create_default_text_element(parent=None) -> GrammarElement:
440457
),
441458
]
442459
text_element = GrammarElement(
443-
parent=parent, tag="TEXT", fields=fields, relations=[]
460+
parent=parent,
461+
tag="TEXT",
462+
property_is_composite="",
463+
fields=fields,
464+
relations=[],
444465
)
445466
return text_element
446467

strictdoc/backend/sdoc/models/model.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class SDocNodeFieldIF(ABC):
1313
class SDocNodeIF(ABC):
1414
node_type: str
1515
ng_resolved_custom_level: Optional[str]
16+
section_contents: List["SDocSectionContentIF"]
1617

1718
@abstractmethod
1819
def is_normative_node(self) -> bool:
@@ -38,15 +39,15 @@ def get_including_document(self) -> Optional["SDocDocumentIF"]:
3839
def get_parent_or_including_document(self) -> "SDocDocumentIF":
3940
raise NotImplementedError # pragma: no cover
4041

41-
42-
class SDocCompositeNodeIF(SDocNodeIF):
43-
section_contents: List["SDocSectionContentIF"]
44-
4542
@abstractmethod
4643
def get_requirement_prefix(self) -> str:
4744
raise NotImplementedError # pragma: no cover
4845

4946

47+
class SDocCompositeNodeIF(SDocNodeIF, ABC):
48+
pass
49+
50+
5051
class SDocSectionIF(ABC):
5152
parent: Union["SDocDocumentIF", "SDocSectionIF"]
5253
ng_resolved_custom_level: Optional[str]

strictdoc/backend/sdoc/models/node.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
SDocCompositeNodeIF,
1717
SDocDocumentIF,
1818
SDocNodeIF,
19+
SDocSectionContentIF,
1920
SDocSectionIF,
2021
)
2122
from strictdoc.backend.sdoc.models.reference import (
@@ -108,6 +109,7 @@ def __init__(
108109
relations: List[Reference],
109110
is_composite: bool = False,
110111
requirements: Optional[List["SDocNode"]] = None,
112+
section_contents: Optional[List[SDocSectionContentIF]] = None,
111113
node_type_close: Optional[str] = None,
112114
) -> None:
113115
assert parent
@@ -137,6 +139,9 @@ def __init__(
137139
ordered_fields_lookup.setdefault(field.field_name, []).append(field)
138140

139141
self.requirements: Optional[List[SDocNode]] = requirements
142+
self.section_contents: List[SDocSectionContentIF] = (
143+
section_contents if section_contents is not None else []
144+
)
140145

141146
self.relations: List[Reference] = relations
142147

@@ -511,11 +516,11 @@ def get_field_human_title_for_statement(self) -> str:
511516
return field_human_title.get_field_human_name()
512517

513518
def get_requirement_prefix(self) -> str:
514-
parent: Union[SDocDocumentIF, SDocSectionIF, SDocCompositeNodeIF] = (
515-
assert_cast(
516-
self.parent,
517-
(SDocDocumentIF, SDocSectionIF, SDocCompositeNodeIF),
518-
)
519+
parent: Union[
520+
SDocDocumentIF, SDocSectionIF, SDocNodeIF, SDocCompositeNodeIF
521+
] = assert_cast(
522+
self.parent,
523+
(SDocDocumentIF, SDocSectionIF, SDocNodeIF, SDocCompositeNodeIF),
519524
)
520525
return parent.get_requirement_prefix()
521526

strictdoc/backend/sdoc/processor.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ def process_document_config(self, document_config: DocumentConfig):
7979

8080
def process_document_grammar(self, document_grammar: DocumentGrammar):
8181
preserve_source_location_data(document_grammar)
82+
# FIXME: It would be great to move forward and remove this.
8283
if not document_grammar.has_text_element():
8384
document_grammar.add_element_first(
8485
DocumentGrammar.create_default_text_element(document_grammar)

strictdoc/backend/sdoc/writer.py

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,17 @@ def write_with_fragments(
214214
for element in document_grammar.elements:
215215
output += "- TAG: "
216216
output += element.tag
217-
output += "\n FIELDS:\n"
217+
output += "\n"
218+
219+
if element.property_is_composite is not None:
220+
output += " PROPERTIES:\n"
221+
output += " IS_COMPOSITE: "
222+
output += (
223+
"True" if element.property_is_composite else "False"
224+
)
225+
output += "\n"
226+
227+
output += " FIELDS:\n"
218228
for grammar_field in element.fields:
219229
output += SDWriter._print_grammar_field_type(
220230
grammar_field
@@ -282,7 +292,10 @@ def _print_node(
282292
elif isinstance(root_node, SDocNode):
283293
output = ""
284294

285-
if isinstance(root_node, SDocCompositeNodeNew):
295+
if (
296+
isinstance(root_node, SDocCompositeNodeNew)
297+
or root_node.is_composite
298+
):
286299
output += "[["
287300
output += root_node.node_type
288301
output += "]]\n"
@@ -300,15 +313,31 @@ def _print_node(
300313
)
301314
output += "\n"
302315

303-
if isinstance(root_node, (SDocCompositeNode, SDocCompositeNodeNew)):
304-
for node_ in root_node.requirements:
305-
if not node_.ng_whitelisted:
306-
continue
307-
output += self._print_node(
308-
node_, document, document_iterator=document_iterator
309-
)
316+
if (
317+
isinstance(root_node, (SDocCompositeNode, SDocCompositeNodeNew))
318+
or root_node.is_composite
319+
):
320+
# FIXME: Remove the legacy .requirements.
321+
if root_node.requirements is not None:
322+
for node_ in root_node.requirements:
323+
if not node_.ng_whitelisted:
324+
continue
325+
output += self._print_node(
326+
node_, document, document_iterator=document_iterator
327+
)
328+
329+
if root_node.section_contents is not None:
330+
for node_ in root_node.section_contents:
331+
if not node_.ng_whitelisted:
332+
continue
333+
output += self._print_node(
334+
node_, document, document_iterator=document_iterator
335+
)
310336

311-
if isinstance(root_node, SDocCompositeNodeNew):
337+
if (
338+
isinstance(root_node, SDocCompositeNodeNew)
339+
or root_node.is_composite
340+
):
312341
output += "[[/"
313342
output += root_node.node_type
314343
output += "]]\n"

strictdoc/core/document_iterator.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,24 @@ def get_level_string_(
170170

171171
yield node
172172

173+
current_number = 0
174+
if node.section_contents is not None:
175+
for subnode_ in node.section_contents:
176+
if subnode_.ng_resolved_custom_level is None and not (
177+
isinstance(subnode_, SDocNode)
178+
and subnode_.node_type == "TEXT"
179+
):
180+
current_number += 1
181+
182+
yield from self._all_content(
183+
subnode_,
184+
print_fragments=print_fragments,
185+
print_fragments_from_files=print_fragments_from_files,
186+
level_stack=level_stack + (current_number,),
187+
custom_level=custom_level
188+
or subnode_.ng_resolved_custom_level is not None,
189+
)
190+
173191
elif isinstance(node, SDocDocument):
174192
if (
175193
print_fragments

0 commit comments

Comments
 (0)