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%)
- "7.6.3. Language element marker" (REQUIREMENT)
- "7.6.4. File marker" (REQUIREMENT)
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_described20
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: ERA00143
# ng_range_line_end == ng_source_line_begin of the End marker # noqa: ERA001, E50144
# For End ranges:45
# ng_range_line_begin == ng_range_line_begin of the Begin marker # noqa: ERA001, E50146
# ng_range_line_end == ng_source_line_begin # noqa: ERA00147
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_described90
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