StrictDoc Documentation
strictdoc/core/query_engine/query_reader.py
Source file coverage
Path:
strictdoc/core/query_engine/query_reader.py
Lines:
108
Non-empty lines:
92
Non-empty lines covered with requirements:
92 / 92 (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
    AllInExpression,
12
    AndExpression,
13
    AnyInExpression,
14
    EqualExpression,
15
    InExpression,
16
    NodeContainsAnyFreeTextExpression,
17
    NodeContainsExpression,
18
    NodeFieldExpression,
19
    NodeHasChildRequirementsExpression,
20
    NodeHasParentRequirementsExpression,
21
    NodeIsRequirementExpression,
22
    NodeIsRootExpression,
23
    NodeIsSectionExpression,
24
    NodeIsSourceFileExpression,
25
    NodeIsSourceFileWithCompleteCoverageExpression,
26
    NodeIsSourceFileWithNoCoverageExpression,
27
    NodeIsSourceFileWithPartialCoverageExpression,
28
    NoneExpression,
29
    NoneInExpression,
30
    NotEqualExpression,
31
    NotExpression,
32
    NotInExpression,
33
    OrExpression,
34
    Query,
35
    StringExpression,
36
    StringListExpression,
37
)
38
 
39
QUERY_MODELS = [
40
    AllInExpression,
41
    AndExpression,
42
    AnyInExpression,
43
    EqualExpression,
44
    InExpression,
45
    NodeContainsExpression,
46
    NodeContainsAnyFreeTextExpression,
47
    NodeFieldExpression,
48
    NodeHasChildRequirementsExpression,
49
    NodeHasParentRequirementsExpression,
50
    NodeIsRequirementExpression,
51
    NodeIsRootExpression,
52
    NodeIsSectionExpression,
53
    NodeIsSourceFileExpression,
54
    NodeIsSourceFileWithCompleteCoverageExpression,
55
    NodeIsSourceFileWithPartialCoverageExpression,
56
    NodeIsSourceFileWithNoCoverageExpression,
57
    NoneExpression,
58
    NoneInExpression,
59
    NotEqualExpression,
60
    NotExpression,
61
    NotInExpression,
62
    OrExpression,
63
    Query,
64
    StringExpression,
65
    StringListExpression,
66
]
67
 
68
 
69
class QueryParseContext:
70
    pass
71
 
72
 
73
class QueryParsingProcessor:
74
    def __init__(self, parse_context: QueryParseContext) -> None:
75
        self.parse_context: QueryParseContext = parse_context
76
 
77
    def get_default_processors(self) -> Dict[str, Callable[..., None]]:
78
        return {}
79
 
80
 
81
class QueryReader:
82
    def __init__(self, path_to_output_root: str = "NOT_RELEVANT") -> None:
83
        self.path_to_output_root = path_to_output_root
84
 
85
    @staticmethod
86
    def _read(
87
        input_string: str, file_path: Optional[str] = None
88
    ) -> Tuple[Query, QueryParseContext]:
89
        meta_model = metamodel_from_str(
90
            QUERY_GRAMMAR,
91
            classes=QUERY_MODELS,
92
            use_regexp_group=True,
93
        )
94
 
95
        parse_context = QueryParseContext()
96
        processor = QueryParsingProcessor(parse_context=parse_context)
97
        meta_model.register_obj_processors(processor.get_default_processors())
98
 
99
        query: Query = meta_model.model_from_str(
100
            input_string, file_name=file_path
101
        )
102
 
103
        return query, parse_context
104
 
105
    @staticmethod
106
    def read(input_string: str, file_path: Optional[str] = None) -> Query:
107
        document, _ = QueryReader._read(input_string, file_path)
108
        return document