StrictDoc Documentation
strictdoc/backend/sdoc_source_code/models/language_item_marker.py
Source file coverage
Path:
strictdoc/backend/sdoc_source_code/models/language_item_marker.py
Lines:
101
Non-empty lines:
77
Non-empty lines covered with requirements:
77 / 77 (100.0%)
Functions:
14
Functions covered by requirements:
14 / 14 (100.0%)
1
"""
2
@relation(SDOC-SRS-137, SDOC-SRS-139, scope=file)
3
"""
4
 
5
from copy import copy
6
from enum import Enum
7
from typing import Any, List, Optional
8
 
9
from strictdoc.backend.sdoc_source_code.models.requirement_marker import Req
10
from strictdoc.helpers.auto_described import auto_described
11
 
12
 
13
class RangeMarkerType(Enum):
14
    FUNCTION = "function"
15
    CLASS = "class"
16
    FILE = "file"
17
 
18
 
19
@auto_described
20
class LanguageItemMarker:
21
    def __init__(
22
        self, parent: Any, reqs_objs: List[Req], scope: str, role: Optional[str]
23
    ):
24
        assert isinstance(reqs_objs, list)
25
        assert isinstance(scope, str), scope
26
        self.parent = parent
27
        self.reqs_objs: List[Req] = reqs_objs
28
        self.reqs: List[str] = list(map(lambda req: req.uid, reqs_objs))
29
        self.role: Optional[str] = (
30
            role if role is not None and len(role) > 0 else None
31
        )
32
 
33
        self.scope: RangeMarkerType = RangeMarkerType(scope)
34
 
35
        # Line number of the marker in the source code.
36
        self.ng_source_line_begin: Optional[int] = None
37
        self.ng_source_column_begin: Optional[int] = None
38
 
39
        # Line number of the marker range in the source code:
40
        # TODO: Improve description.
41
        # For Begin ranges:
42
        #   ng_range_line_begin == ng_source_line_begin  # noqa: ERA001
43
        #   ng_range_line_end == ng_source_line_begin of the End marker  # noqa: ERA001, E501
44
        # For End ranges:
45
        #   ng_range_line_begin == ng_range_line_begin of the Begin marker  # noqa: ERA001, E501
46
        #   ng_range_line_end == ng_source_line_begin  # noqa: ERA001
47
        self.ng_range_line_begin: Optional[int] = None
48
        self.ng_range_line_end: Optional[int] = None
49
 
50
        self.ng_marker_line: Optional[int] = None
51
        self.ng_marker_column: Optional[int] = None
52
 
53
        self.ng_is_nodoc = "skip" in self.reqs
54
 
55
        self.begin_or_end: bool = True
56
 
57
        self._description: Optional[str] = None
58
 
59
    def is_forward(self) -> bool:
60
        return False
61
 
62
    def is_range_marker(self) -> bool:
63
        return True
64
 
65
    def is_line_marker(self) -> bool:
66
        return False
67
 
68
    def is_begin(self) -> bool:
69
        return self.begin_or_end
70
 
71
    def is_end(self) -> bool:
72
        return not self.begin_or_end
73
 
74
    def get_description(self) -> Optional[str]:
75
        return self._description
76
 
77
    def set_description(self, description: str) -> None:
78
        assert isinstance(description, str)
79
        self._description = description
80
 
81
    def create_end_marker(self) -> "LanguageItemMarker":
82
        marker_copy = copy(self)
83
        marker_copy.begin_or_end = False
84
        marker_copy.ng_range_line_begin = self.ng_range_line_begin
85
        marker_copy.ng_source_line_begin = self.ng_range_line_end
86
        return marker_copy
87
 
88
 
89
@auto_described
90
class ForwardLanguageItemMarker(LanguageItemMarker):
91
    def __init__(
92
        self,
93
        parent: Any,
94
        reqs_objs: List[Req],
95
        scope: str,
96
        role: Optional[str] = None,
97
    ):
98
        super().__init__(parent, reqs_objs, scope, role)
99
 
100
    def is_forward(self) -> bool:
101
        return True