StrictDoc Documentation
strictdoc/backend/sdoc_source_code/models/range_marker.py
Source file coverage
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%)
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_described
12
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: ERA001
40
        #   ng_range_line_end == ng_source_line_begin of the End marker  # noqa: ERA001, E501
41
        # For End ranges:
42
        #   ng_range_line_begin == ng_range_line_begin of the Begin marker  # noqa: ERA001, E501
43
        #   ng_range_line_end == ng_source_line_begin  # noqa: ERA001
44
        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_described
69
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 with
89
        # 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_described
117
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