Path:
strictdoc/backend/sdoc_source_code/models/range_marker.py
Lines:
127
Non-empty lines:
95
Non-empty lines covered with requirements:
95 / 95 (100.0%)
Functions:
20
Functions covered by requirements:
20 / 20 (100.0%)
- "7.6.5. Range marker" (REQUIREMENT)
- "7.6.1. Relation markers syntax" (REQUIREMENT)
1
"""2
@relation(SDOC-SRS-138, scope=file)3
"""4
5
from typing import Any, List, Optional
6
7
from strictdoc.backend.sdoc_source_code.models.requirement_marker import Req
8
from strictdoc.helpers.auto_described import auto_described
9
10
11
@auto_described12
class RangeMarker:
13
def __init__(
14
self,
15
parent: Any,
16
reqs_objs: List[Req],
17
scope: str = "",
18
role: Optional[str] = None,
19
) -> None:
20
assert isinstance(reqs_objs, list)
21
self.parent: Any = parent
22
23
assert scope in ("range_start", "range_end")
24
self.begin_or_end: bool = scope == "range_start"
25
26
self.reqs_objs: List[Req] = reqs_objs
27
self.reqs: List[str] = list(map(lambda req: req.uid, reqs_objs))
28
self.role: Optional[str] = (
29
role if role is not None and len(role) > 0 else None
30
)31
32
# Line number of the marker in the source code.33
self.ng_source_line_begin: Optional[int] = None
34
self.ng_source_column_begin: Optional[int] = None
35
36
# Line number of the marker range in the source code:37
# TODO: Improve description.38
# For Begin ranges:39
# ng_range_line_begin == ng_source_line_begin # noqa: ERA00140
# ng_range_line_end == ng_source_line_begin of the End marker # noqa: ERA001, E50141
# For End ranges:42
# ng_range_line_begin == ng_range_line_begin of the Begin marker # noqa: ERA001, E50143
# ng_range_line_end == ng_source_line_begin # noqa: ERA00144
self.ng_range_line_begin: Optional[int] = None
45
self.ng_range_line_end: Optional[int] = None
46
47
self.ng_is_nodoc: bool = "skip" in self.reqs
48
49
def is_begin(self) -> bool:
50
return self.begin_or_end
51
52
def is_end(self) -> bool:
53
return not self.begin_or_end
54
55
def is_range_marker(self) -> bool:
56
return True
57
58
def is_line_marker(self) -> bool:
59
return False
60
61
def is_forward(self) -> bool:
62
return False
63
64
def get_description(self) -> Optional[str]:
65
return "range"
66
67
68
@auto_described69
class ForwardRangeMarker:
70
def __init__(
71
self,
72
start_or_end: bool,
73
reqs_objs: List[Req],
74
role: Optional[str] = None,
75
) -> None:
76
assert len(reqs_objs) > 0
77
self.start_or_end: bool = start_or_end
78
79
self.reqs_objs: List[Req] = reqs_objs
80
self.reqs: List[str] = list(map(lambda req: req.uid, reqs_objs))
81
82
self.role: Optional[str] = (
83
role if role is not None and len(role) > 0 else None
84
)85
86
# Line number of the marker in the source code.87
self.ng_source_line_begin: Optional[int] = None
88
# The column number is never used but keeping for compatibility with89
# the other markers when used for error reporting.90
self.ng_source_column_begin: Optional[int] = None
91
92
self.ng_range_line_begin: Optional[int] = None
93
self.ng_range_line_end: Optional[int] = None
94
95
self.ng_is_nodoc: bool = False
96
97
def is_begin(self) -> bool:
98
return self.start_or_end
99
100
def is_end(self) -> bool:
101
return not self.start_or_end
102
103
def is_range_marker(self) -> bool:
104
return True
105
106
def is_line_marker(self) -> bool:
107
return False
108
109
def get_description(self) -> Optional[str]:
110
return "range"
111
112
def is_forward(self) -> bool:
113
return True
114
115
116
@auto_described117
class ForwardFileMarker(ForwardRangeMarker):
118
def __init__(
119
self, reqs_objs: List[Req], role: Optional[str] = None
120
) -> None:
121
super().__init__(True, reqs_objs, role)
122
123
def get_description(self) -> Optional[str]:
124
return "entire file"
125
126
def is_forward(self) -> bool:
127
return True