Skip to content

Commit 3b6d0a5

Browse files
authored
Merge pull request #2254 from strictdoc-project/stanislaw/nodes_migration
Code climate: query_engine: query_object: fix all mypy issues
2 parents 5e54f90 + 6255bdd commit 3b6d0a5

File tree

2 files changed

+101
-68
lines changed

2 files changed

+101
-68
lines changed

.link_health.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,4 @@ exceptions:
2727
- url: https://github.com/fcurella/python-datauri/blob/master/LICENSE
2828
- url: https://github.com/tree-sitter/tree-sitter/blob/master/LICENSE
2929
- url: https://github.com/doorstop-dev/doorstop/blob/804153c67c7c5466ee94e9553118cc3df03a56f9/reqs/REQ001.yml
30+
- url: https://github.com/tiangolo/fastapi/blob/master/LICENSE

strictdoc/core/query_engine/query_object.py

Lines changed: 100 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
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
32

43
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
69
from strictdoc.backend.sdoc.models.node import SDocNode, SDocNodeField
710
from strictdoc.backend.sdoc.models.section import SDocSection
811
from strictdoc.core.traceability_index import TraceabilityIndex
@@ -14,123 +17,125 @@ class Expression:
1417

1518

1619
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
1922
self.string: str = string
2023

2124

2225
class NoneExpression:
23-
def __init__(self, parent, _: str):
24-
self.parent = parent
26+
def __init__(self, parent: Any, _: str):
27+
self.parent: Any = parent
2528

2629

2730
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
3033
self.field_name = field_name
3134

3235

3336
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
3639
self.string: str = string
3740

3841

3942
class NodeHasParentRequirementsExpression:
40-
def __init__(self, parent, _):
41-
self.parent = parent
43+
def __init__(self, parent: Any, _: Any) -> None:
44+
self.parent: Any = parent
4245

4346

4447
class NodeContainsAnyFreeTextExpression:
45-
def __init__(self, parent, _):
46-
self.parent = parent
48+
def __init__(self, parent: Any, _: Any):
49+
self.parent: Any = parent
4750

4851

4952
class NodeHasChildRequirementsExpression:
50-
def __init__(self, parent, _):
51-
self.parent = parent
53+
def __init__(self, parent: Any, _: Any):
54+
self.parent: Any = parent
5255

5356

5457
class NodeIsRequirementExpression:
55-
def __init__(self, parent, _):
56-
self.parent = parent
58+
def __init__(self, parent: Any, _: Any):
59+
self.parent: Any = parent
5760

5861

5962
class NodeIsSectionExpression:
60-
def __init__(self, parent, _):
61-
self.parent = parent
63+
def __init__(self, parent: Any, _: Any):
64+
self.parent: Any = parent
6265

6366

6467
class NodeIsRootExpression:
65-
def __init__(self, parent, _):
66-
self.parent = parent
68+
def __init__(self, parent: Any, _: Any):
69+
self.parent: Any = parent
6770

6871

6972
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
7275
self.lhs_expr: Expression = lhs_expr
7376
self.rhs_expr: Expression = rhs_expr
7477

7578

7679
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
7982
self.expressions: List[Expression] = expressions
8083

8184

8285
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
8588
self.expressions: List[Expression] = expressions
8689

8790

8891
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
9194
self.expression: Expression = expression
9295

9396

9497
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
97100
self.lhs_expr: Expression = lhs_expr
98101
self.rhs_expr: Expression = rhs_expr
99102

100103

101104
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
104107
self.lhs_expr: Expression = lhs_expr
105108
self.rhs_expr: Expression = rhs_expr
106109

107110

108111
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
111114
self.lhs_expr: Expression = lhs_expr
112115
self.rhs_expr: Expression = rhs_expr
113116

114117

115118
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
118121

119122

120123
class QueryNullObject:
121-
def evaluate(self, _) -> bool:
124+
def evaluate(self, _: Any) -> bool:
122125
return True
123126

124127

125128
class QueryObject:
126-
def __init__(self, query: Query, traceability_index: TraceabilityIndex):
129+
def __init__(
130+
self, query: Query, traceability_index: TraceabilityIndex
131+
) -> None:
127132
self.query: Query = query
128133
self.traceability_index: TraceabilityIndex = traceability_index
129134

130-
def evaluate(self, node) -> bool:
135+
def evaluate(self, node: SDocElementIF) -> bool:
131136
return self._evaluate(node, self.query.root_expression)
132137

133-
def _evaluate(self, node, expression) -> bool:
138+
def _evaluate(self, node: SDocElementIF, expression: Any) -> bool:
134139
if isinstance(expression, EqualExpression):
135140
return self._evaluate_equal(node, expression)
136141
if isinstance(expression, NotEqualExpression):
@@ -150,7 +155,11 @@ def _evaluate(self, node, expression) -> bool:
150155
if isinstance(expression, NodeIsSectionExpression):
151156
return isinstance(node, SDocSection)
152157
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+
)
154163
if isinstance(expression, NotExpression):
155164
return not self._evaluate(node, expression.expression)
156165
if isinstance(expression, AndExpression):
@@ -164,30 +173,40 @@ def _evaluate(self, node, expression) -> bool:
164173
return True
165174
return False
166175
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
171183
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
178191
assert 0, expression
179192

180-
def _evaluate_equal(self, node, expression: EqualExpression) -> bool:
193+
def _evaluate_equal(
194+
self, node: SDocElementIF, expression: EqualExpression
195+
) -> bool:
181196
return self._evaluate_value(
182197
node, expression.lhs_expr
183198
) == self._evaluate_value(node, expression.rhs_expr)
184199

185-
def _evaluate_not_equal(self, node, expression: NotEqualExpression) -> bool:
200+
def _evaluate_not_equal(
201+
self, node: SDocElementIF, expression: NotEqualExpression
202+
) -> bool:
186203
return self._evaluate_value(
187204
node, expression.lhs_expr
188205
) != self._evaluate_value(node, expression.rhs_expr)
189206

190-
def _evaluate_value(self, node, expression) -> Optional[str]:
207+
def _evaluate_value(
208+
self, node: SDocElementIF, expression: Any
209+
) -> Optional[str]:
191210
if isinstance(expression, NodeFieldExpression):
192211
return self._evaluate_node_field_expression(node, expression)
193212
if isinstance(expression, StringExpression):
@@ -197,27 +216,34 @@ def _evaluate_value(self, node, expression) -> Optional[str]:
197216
assert 0, expression
198217

199218
def _evaluate_node_field_expression(
200-
self, node, expression: NodeFieldExpression
219+
self,
220+
node: SDocElementIF,
221+
expression: NodeFieldExpression,
201222
) -> Optional[str]:
202223
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+
):
204229
requirement: SDocNode = assert_cast(node, SDocNode)
205230
requirement_document: SDocDocument = assert_cast(
206231
requirement.get_document(), SDocDocument
207232
)
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
212235
)
236+
element: GrammarElement = document_grammar.elements_by_type[
237+
requirement.node_type
238+
]
213239
grammar_field_titles = list(map(lambda f: f.title, element.fields))
214240
if field_name not in grammar_field_titles:
215241
return None
216242
field_value = requirement._get_cached_field(field_name, False)
217243
if field_value is not None:
218244
return field_value
219245
return None
220-
elif node.is_section():
246+
elif isinstance(node, SDocSection) and node.is_section():
221247
section: SDocSection = assert_cast(node, SDocSection)
222248
if field_name == "UID":
223249
return section.reserved_uid
@@ -227,7 +253,9 @@ def _evaluate_node_field_expression(
227253
else:
228254
raise NotImplementedError # pragma: no cover
229255

230-
def _evaluate_node_has_parent_requirements(self, node) -> bool:
256+
def _evaluate_node_has_parent_requirements(
257+
self, node: SDocElementIF
258+
) -> bool:
231259
if not isinstance(node, SDocNode):
232260
raise TypeError(
233261
f"node.has_parent_requirements can be only called on "
@@ -236,7 +264,9 @@ def _evaluate_node_has_parent_requirements(self, node) -> bool:
236264
)
237265
return self.traceability_index.has_parent_requirements(node)
238266

239-
def _evaluate_node_has_child_requirements(self, node) -> bool:
267+
def _evaluate_node_has_child_requirements(
268+
self, node: SDocElementIF
269+
) -> bool:
240270
if not isinstance(node, SDocNode):
241271
raise TypeError(
242272
f"node.has_child_requirements can be only called on "
@@ -246,7 +276,9 @@ def _evaluate_node_has_child_requirements(self, node) -> bool:
246276
return self.traceability_index.has_children_requirements(node)
247277

248278
def _evaluate_node_contains(
249-
self, node, expression: NodeContainsExpression
279+
self,
280+
node: SDocElementIF,
281+
expression: NodeContainsExpression,
250282
) -> bool:
251283
if isinstance(node, SDocNode):
252284
requirement = assert_cast(node, SDocNode)
@@ -262,7 +294,7 @@ def _evaluate_node_contains(
262294
return False
263295
raise NotImplementedError # pragma: no cover
264296

265-
def _evaluate_node_contains_any_text(self, node) -> bool:
297+
def _evaluate_node_contains_any_text(self, node: SDocElementIF) -> bool:
266298
if not isinstance(node, SDocSection):
267299
raise TypeError(
268300
f"node.contains_any_text can be only called on "

0 commit comments

Comments
 (0)