1
- # mypy: disable-error-code="no-any-return,no-untyped-call,no-untyped-def,union-attr,operator"
2
- from typing import List , Optional
1
+ from typing import Any , List , Optional
3
2
4
3
from strictdoc .backend .sdoc .models .document import SDocDocument
5
- from strictdoc .backend .sdoc .models .document_grammar import GrammarElement
4
+ from strictdoc .backend .sdoc .models .document_grammar import (
5
+ DocumentGrammar ,
6
+ GrammarElement ,
7
+ )
8
+ from strictdoc .backend .sdoc .models .model import SDocElementIF
6
9
from strictdoc .backend .sdoc .models .node import SDocNode , SDocNodeField
7
10
from strictdoc .backend .sdoc .models .section import SDocSection
8
11
from strictdoc .core .traceability_index import TraceabilityIndex
@@ -14,123 +17,125 @@ class Expression:
14
17
15
18
16
19
class StringExpression :
17
- def __init__ (self , parent , string : str ):
18
- self .parent = parent
20
+ def __init__ (self , parent : Any , string : str ):
21
+ self .parent : Any = parent
19
22
self .string : str = string
20
23
21
24
22
25
class NoneExpression :
23
- def __init__ (self , parent , _ : str ):
24
- self .parent = parent
26
+ def __init__ (self , parent : Any , _ : str ):
27
+ self .parent : Any = parent
25
28
26
29
27
30
class NodeFieldExpression :
28
- def __init__ (self , parent , field_name : str ):
29
- self .parent = parent
31
+ def __init__ (self , parent : Any , field_name : str ):
32
+ self .parent : Any = parent
30
33
self .field_name = field_name
31
34
32
35
33
36
class NodeContainsExpression :
34
- def __init__ (self , parent , string : str ):
35
- self .parent = parent
37
+ def __init__ (self , parent : Any , string : str ):
38
+ self .parent : Any = parent
36
39
self .string : str = string
37
40
38
41
39
42
class NodeHasParentRequirementsExpression :
40
- def __init__ (self , parent , _ ) :
41
- self .parent = parent
43
+ def __init__ (self , parent : Any , _ : Any ) -> None :
44
+ self .parent : Any = parent
42
45
43
46
44
47
class NodeContainsAnyFreeTextExpression :
45
- def __init__ (self , parent , _ ):
46
- self .parent = parent
48
+ def __init__ (self , parent : Any , _ : Any ):
49
+ self .parent : Any = parent
47
50
48
51
49
52
class NodeHasChildRequirementsExpression :
50
- def __init__ (self , parent , _ ):
51
- self .parent = parent
53
+ def __init__ (self , parent : Any , _ : Any ):
54
+ self .parent : Any = parent
52
55
53
56
54
57
class NodeIsRequirementExpression :
55
- def __init__ (self , parent , _ ):
56
- self .parent = parent
58
+ def __init__ (self , parent : Any , _ : Any ):
59
+ self .parent : Any = parent
57
60
58
61
59
62
class NodeIsSectionExpression :
60
- def __init__ (self , parent , _ ):
61
- self .parent = parent
63
+ def __init__ (self , parent : Any , _ : Any ):
64
+ self .parent : Any = parent
62
65
63
66
64
67
class NodeIsRootExpression :
65
- def __init__ (self , parent , _ ):
66
- self .parent = parent
68
+ def __init__ (self , parent : Any , _ : Any ):
69
+ self .parent : Any = parent
67
70
68
71
69
72
class EqualExpression :
70
- def __init__ (self , parent , lhs_expr : Expression , rhs_expr : Expression ):
71
- self .parent = parent
73
+ def __init__ (self , parent : Any , lhs_expr : Expression , rhs_expr : Expression ):
74
+ self .parent : Any = parent
72
75
self .lhs_expr : Expression = lhs_expr
73
76
self .rhs_expr : Expression = rhs_expr
74
77
75
78
76
79
class AndExpression :
77
- def __init__ (self , parent , expressions : List [Expression ]):
78
- self .parent = parent
80
+ def __init__ (self , parent : Any , expressions : List [Expression ]):
81
+ self .parent : Any = parent
79
82
self .expressions : List [Expression ] = expressions
80
83
81
84
82
85
class OrExpression :
83
- def __init__ (self , parent , expressions : List [Expression ]):
84
- self .parent = parent
86
+ def __init__ (self , parent : Any , expressions : List [Expression ]):
87
+ self .parent : Any = parent
85
88
self .expressions : List [Expression ] = expressions
86
89
87
90
88
91
class NotExpression :
89
- def __init__ (self , parent , expression : Expression ):
90
- self .parent = parent
92
+ def __init__ (self , parent : Any , expression : Expression ):
93
+ self .parent : Any = parent
91
94
self .expression : Expression = expression
92
95
93
96
94
97
class NotEqualExpression :
95
- def __init__ (self , parent , lhs_expr : Expression , rhs_expr : Expression ):
96
- self .parent = parent
98
+ def __init__ (self , parent : Any , lhs_expr : Expression , rhs_expr : Expression ):
99
+ self .parent : Any = parent
97
100
self .lhs_expr : Expression = lhs_expr
98
101
self .rhs_expr : Expression = rhs_expr
99
102
100
103
101
104
class InExpression :
102
- def __init__ (self , parent , lhs_expr : Expression , rhs_expr : Expression ):
103
- self .parent = parent
105
+ def __init__ (self , parent : Any , lhs_expr : Expression , rhs_expr : Expression ):
106
+ self .parent : Any = parent
104
107
self .lhs_expr : Expression = lhs_expr
105
108
self .rhs_expr : Expression = rhs_expr
106
109
107
110
108
111
class NotInExpression :
109
- def __init__ (self , parent , lhs_expr : Expression , rhs_expr : Expression ):
110
- self .parent = parent
112
+ def __init__ (self , parent : Any , lhs_expr : Expression , rhs_expr : Expression ):
113
+ self .parent : Any = parent
111
114
self .lhs_expr : Expression = lhs_expr
112
115
self .rhs_expr : Expression = rhs_expr
113
116
114
117
115
118
class Query :
116
- def __init__ (self , root_expression ):
117
- self .root_expression = root_expression
119
+ def __init__ (self , root_expression : Any ):
120
+ self .root_expression : Any = root_expression
118
121
119
122
120
123
class QueryNullObject :
121
- def evaluate (self , _ ) -> bool :
124
+ def evaluate (self , _ : Any ) -> bool :
122
125
return True
123
126
124
127
125
128
class QueryObject :
126
- def __init__ (self , query : Query , traceability_index : TraceabilityIndex ):
129
+ def __init__ (
130
+ self , query : Query , traceability_index : TraceabilityIndex
131
+ ) -> None :
127
132
self .query : Query = query
128
133
self .traceability_index : TraceabilityIndex = traceability_index
129
134
130
- def evaluate (self , node ) -> bool :
135
+ def evaluate (self , node : SDocElementIF ) -> bool :
131
136
return self ._evaluate (node , self .query .root_expression )
132
137
133
- def _evaluate (self , node , expression ) -> bool :
138
+ def _evaluate (self , node : SDocElementIF , expression : Any ) -> bool :
134
139
if isinstance (expression , EqualExpression ):
135
140
return self ._evaluate_equal (node , expression )
136
141
if isinstance (expression , NotEqualExpression ):
@@ -150,7 +155,11 @@ def _evaluate(self, node, expression) -> bool:
150
155
if isinstance (expression , NodeIsSectionExpression ):
151
156
return isinstance (node , SDocSection )
152
157
if isinstance (expression , NodeIsRootExpression ):
153
- return node .is_root
158
+ if isinstance (node , SDocNode ):
159
+ return node .is_root
160
+ raise RuntimeError (
161
+ "The node.is_root expression can be only called on nodes."
162
+ )
154
163
if isinstance (expression , NotExpression ):
155
164
return not self ._evaluate (node , expression .expression )
156
165
if isinstance (expression , AndExpression ):
@@ -164,30 +173,40 @@ def _evaluate(self, node, expression) -> bool:
164
173
return True
165
174
return False
166
175
if isinstance (expression , InExpression ):
167
- rhs_value = self ._evaluate_value (node , expression .rhs_expr )
168
- if rhs_value is None :
169
- return False
170
- return self ._evaluate_value (node , expression .lhs_expr ) in rhs_value
176
+ if (
177
+ rhs_value := self ._evaluate_value (node , expression .rhs_expr )
178
+ ) is not None and (
179
+ lhs_value := self ._evaluate_value (node , expression .lhs_expr )
180
+ ) is not None :
181
+ return lhs_value in rhs_value
182
+ return False
171
183
if isinstance (expression , NotInExpression ):
172
- rhs_value = self ._evaluate_value (node , expression .rhs_expr )
173
- if rhs_value is None :
174
- return False
175
- return (
176
- self ._evaluate_value (node , expression .lhs_expr ) not in rhs_value
177
- )
184
+ if (
185
+ rhs_value := self ._evaluate_value (node , expression .rhs_expr )
186
+ ) is not None and (
187
+ lhs_value := self ._evaluate_value (node , expression .lhs_expr )
188
+ ) is not None :
189
+ return lhs_value not in rhs_value
190
+ return False
178
191
assert 0 , expression
179
192
180
- def _evaluate_equal (self , node , expression : EqualExpression ) -> bool :
193
+ def _evaluate_equal (
194
+ self , node : SDocElementIF , expression : EqualExpression
195
+ ) -> bool :
181
196
return self ._evaluate_value (
182
197
node , expression .lhs_expr
183
198
) == self ._evaluate_value (node , expression .rhs_expr )
184
199
185
- def _evaluate_not_equal (self , node , expression : NotEqualExpression ) -> bool :
200
+ def _evaluate_not_equal (
201
+ self , node : SDocElementIF , expression : NotEqualExpression
202
+ ) -> bool :
186
203
return self ._evaluate_value (
187
204
node , expression .lhs_expr
188
205
) != self ._evaluate_value (node , expression .rhs_expr )
189
206
190
- def _evaluate_value (self , node , expression ) -> Optional [str ]:
207
+ def _evaluate_value (
208
+ self , node : SDocElementIF , expression : Any
209
+ ) -> Optional [str ]:
191
210
if isinstance (expression , NodeFieldExpression ):
192
211
return self ._evaluate_node_field_expression (node , expression )
193
212
if isinstance (expression , StringExpression ):
@@ -197,27 +216,34 @@ def _evaluate_value(self, node, expression) -> Optional[str]:
197
216
assert 0 , expression
198
217
199
218
def _evaluate_node_field_expression (
200
- self , node , expression : NodeFieldExpression
219
+ self ,
220
+ node : SDocElementIF ,
221
+ expression : NodeFieldExpression ,
201
222
) -> Optional [str ]:
202
223
field_name = expression .field_name
203
- if node .is_requirement () and node .node_type == "REQUIREMENT" :
224
+ if (
225
+ isinstance (node , SDocNode )
226
+ and node .is_requirement ()
227
+ and node .node_type == "REQUIREMENT"
228
+ ):
204
229
requirement : SDocNode = assert_cast (node , SDocNode )
205
230
requirement_document : SDocDocument = assert_cast (
206
231
requirement .get_document (), SDocDocument
207
232
)
208
- element : GrammarElement = (
209
- requirement_document .grammar .elements_by_type [
210
- requirement .node_type
211
- ]
233
+ document_grammar : DocumentGrammar = assert_cast (
234
+ requirement_document .grammar , DocumentGrammar
212
235
)
236
+ element : GrammarElement = document_grammar .elements_by_type [
237
+ requirement .node_type
238
+ ]
213
239
grammar_field_titles = list (map (lambda f : f .title , element .fields ))
214
240
if field_name not in grammar_field_titles :
215
241
return None
216
242
field_value = requirement ._get_cached_field (field_name , False )
217
243
if field_value is not None :
218
244
return field_value
219
245
return None
220
- elif node .is_section ():
246
+ elif isinstance ( node , SDocSection ) and node .is_section ():
221
247
section : SDocSection = assert_cast (node , SDocSection )
222
248
if field_name == "UID" :
223
249
return section .reserved_uid
@@ -227,7 +253,9 @@ def _evaluate_node_field_expression(
227
253
else :
228
254
raise NotImplementedError # pragma: no cover
229
255
230
- def _evaluate_node_has_parent_requirements (self , node ) -> bool :
256
+ def _evaluate_node_has_parent_requirements (
257
+ self , node : SDocElementIF
258
+ ) -> bool :
231
259
if not isinstance (node , SDocNode ):
232
260
raise TypeError (
233
261
f"node.has_parent_requirements can be only called on "
@@ -236,7 +264,9 @@ def _evaluate_node_has_parent_requirements(self, node) -> bool:
236
264
)
237
265
return self .traceability_index .has_parent_requirements (node )
238
266
239
- def _evaluate_node_has_child_requirements (self , node ) -> bool :
267
+ def _evaluate_node_has_child_requirements (
268
+ self , node : SDocElementIF
269
+ ) -> bool :
240
270
if not isinstance (node , SDocNode ):
241
271
raise TypeError (
242
272
f"node.has_child_requirements can be only called on "
@@ -246,7 +276,9 @@ def _evaluate_node_has_child_requirements(self, node) -> bool:
246
276
return self .traceability_index .has_children_requirements (node )
247
277
248
278
def _evaluate_node_contains (
249
- self , node , expression : NodeContainsExpression
279
+ self ,
280
+ node : SDocElementIF ,
281
+ expression : NodeContainsExpression ,
250
282
) -> bool :
251
283
if isinstance (node , SDocNode ):
252
284
requirement = assert_cast (node , SDocNode )
@@ -262,7 +294,7 @@ def _evaluate_node_contains(
262
294
return False
263
295
raise NotImplementedError # pragma: no cover
264
296
265
- def _evaluate_node_contains_any_text (self , node ) -> bool :
297
+ def _evaluate_node_contains_any_text (self , node : SDocElementIF ) -> bool :
266
298
if not isinstance (node , SDocSection ):
267
299
raise TypeError (
268
300
f"node.contains_any_text can be only called on "
0 commit comments