Path:
strictdoc/core/query_engine/query_reader.py
Lines:
100
Non-empty lines:
84
Non-empty lines covered with requirements:
84 / 84 (100.0%)
Functions:
8
Functions covered by requirements:
8 / 8 (100.0%)
1
"""2
@relation(SDOC-SRS-155, scope=file)3
"""4
5
from typing import Callable, Dict, Optional, Tuple
6
7
from textx import metamodel_from_str
8
9
from strictdoc.core.query_engine.grammar import QUERY_GRAMMAR
10
from strictdoc.core.query_engine.query_object import (
11
AndExpression,
12
EqualExpression,
13
InExpression,
14
NodeContainsAnyFreeTextExpression,
15
NodeContainsExpression,
16
NodeFieldExpression,
17
NodeHasChildRequirementsExpression,
18
NodeHasParentRequirementsExpression,
19
NodeIsRequirementExpression,
20
NodeIsRootExpression,
21
NodeIsSectionExpression,
22
NodeIsSourceFileExpression,
23
NodeIsSourceFileWithCompleteCoverageExpression,
24
NodeIsSourceFileWithNoCoverageExpression,
25
NodeIsSourceFileWithPartialCoverageExpression,
26
NoneExpression,
27
NotEqualExpression,
28
NotExpression,
29
NotInExpression,
30
OrExpression,
31
Query,
32
StringExpression,
33
)34
35
QUERY_MODELS = [
36
AndExpression,
37
EqualExpression,
38
InExpression,
39
NodeContainsExpression,
40
NodeContainsAnyFreeTextExpression,
41
NodeFieldExpression,
42
NodeHasChildRequirementsExpression,
43
NodeHasParentRequirementsExpression,
44
NodeIsRequirementExpression,
45
NodeIsRootExpression,
46
NodeIsSectionExpression,
47
NodeIsSourceFileExpression,
48
NodeIsSourceFileWithCompleteCoverageExpression,
49
NodeIsSourceFileWithPartialCoverageExpression,
50
NodeIsSourceFileWithNoCoverageExpression,
51
NoneExpression,
52
NotEqualExpression,
53
NotExpression,
54
NotInExpression,
55
OrExpression,
56
Query,
57
StringExpression,
58
]59
60
61
class QueryParseContext:
62
pass63
64
65
class QueryParsingProcessor:
66
def __init__(self, parse_context: QueryParseContext) -> None:
67
self.parse_context: QueryParseContext = parse_context
68
69
def get_default_processors(self) -> Dict[str, Callable[..., None]]:
70
return {}
71
72
73
class QueryReader:
74
def __init__(self, path_to_output_root: str = "NOT_RELEVANT") -> None:
75
self.path_to_output_root = path_to_output_root
76
77
@staticmethod78
def _read(
79
input_string: str, file_path: Optional[str] = None
80
) -> Tuple[Query, QueryParseContext]:
81
meta_model = metamodel_from_str(
82
QUERY_GRAMMAR,
83
classes=QUERY_MODELS,
84
use_regexp_group=True,
85
)86
87
parse_context = QueryParseContext()
88
processor = QueryParsingProcessor(parse_context=parse_context)
89
meta_model.register_obj_processors(processor.get_default_processors())
90
91
query: Query = meta_model.model_from_str(
92
input_string, file_name=file_path
93
)94
95
return query, parse_context
96
97
@staticmethod98
def read(input_string: str, file_path: Optional[str] = None) -> Query:
99
document, _ = QueryReader._read(input_string, file_path)
100
return document