Path:
strictdoc/backend/sdoc/models/document_from_file.py
Lines:
102
Non-empty lines:
81
Non-empty lines covered with requirements:
81 / 81 (100.0%)
Functions:
6
Functions covered by requirements:
6 / 6 (100.0%)
1
"""2
@relation(SDOC-SRS-109, scope=file)3
"""4
5
from typing import Generator, List, Optional, Union
6
7
from strictdoc.backend.sdoc.document_reference import DocumentReference
8
from strictdoc.backend.sdoc.models.document import SDocDocument
9
from strictdoc.backend.sdoc.models.model import (
10
SDocDocumentFromFileIF,
11
SDocDocumentIF,
12
SDocElementIF,
13
SDocNodeIF,
14
)15
from strictdoc.backend.sdoc.models.node import SDocCompositeNode
16
from strictdoc.helpers.auto_described import auto_described
17
18
19
@auto_described20
class DocumentFromFile(SDocDocumentFromFileIF):
21
def __init__(
22
self,
23
parent: Union[SDocDocumentIF, SDocNodeIF],
24
file: str,
25
) -> None:
26
self.parent: Union[SDocDocumentIF, SDocNodeIF] = parent
27
self.file: str = file
28
29
self.ng_has_requirements: bool = False
30
self.ng_document_reference: Optional[DocumentReference] = None
31
self.ng_included_document_reference: Optional[DocumentReference] = None
32
self.ng_resolved_custom_level: Optional[str] = None
33
self.resolved_full_path_to_document_file: Optional[str] = None
34
self.resolved_document: Optional[SDocDocumentIF] = None
35
36
# Document from file is currently never auto-generated, so this is37
# always hard-coded to False.38
self.autogen: bool = False
39
40
def iterate_nodes(
41
self, element_type: Optional[str] = None
42
) -> Generator[SDocNodeIF, None, None]:
43
"""
44
Iterate over all non-[TEXT] nodes in the document.45
46
If element_type is given, then only nodes of type `element_type` are47
returned. Otherwise, all element types are returned.48
"""49
50
task_list: List[SDocElementIF] = list(self.section_contents)
51
while task_list:
52
node = task_list.pop(0)
53
54
if isinstance(node, SDocDocumentFromFileIF):
55
yield from node.iterate_nodes(element_type)
56
57
if isinstance(node, SDocNodeIF):
58
if node.node_type == "TEXT":
59
continue60
if element_type is None or node.node_type == element_type:
61
yield node
62
63
task_list.extend(node.section_contents)
64
65
def has_any_requirements(self) -> bool:
66
return any(True for _ in self.iterate_nodes())
67
68
@property69
def section_contents(self) -> List[SDocDocumentIF]:
70
assert self.resolved_document is not None
71
return [self.resolved_document]
72
73
def configure_with_resolved_document(
74
self, resolved_document: SDocDocument
75
) -> None:
76
assert self.ng_included_document_reference is None
77
assert self.ng_document_reference is not None
78
79
assert resolved_document is not None
80
self.resolved_document = resolved_document
81
82
including_document_or_section = self.parent
83
84
if isinstance(including_document_or_section, SDocDocumentIF):
85
including_document = including_document_or_section
86
elif isinstance(including_document_or_section, SDocCompositeNode):
87
including_document_: Optional[SDocDocumentIF] = (
88
including_document_or_section.get_document()
89
)90
assert isinstance(including_document_, SDocDocumentIF)
91
including_document = including_document_
92
else:
93
raise AssertionError(including_document_or_section)
94
95
resolved_document.ng_including_document_from_file = self
96
97
assert resolved_document.ng_including_document_reference is not None
98
resolved_document.ng_including_document_reference.set_document(
99
including_document100
)101
102
including_document.included_documents.append(resolved_document)