StrictDoc Documentation
strictdoc/core/query_engine/query_reader.py
Source file coverage
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
    pass
63
 
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
    @staticmethod
78
    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
    @staticmethod
98
    def read(input_string: str, file_path: Optional[str] = None) -> Query:
99
        document, _ = QueryReader._read(input_string, file_path)
100
        return document