StrictDoc Documentation
strictdoc/backend/sdoc/models/document_from_file.py
Source file coverage
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_described
20
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 is
37
        # 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` are
47
        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
                    continue
60
                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
    @property
69
    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_document
100
        )
101
 
102
        including_document.included_documents.append(resolved_document)