StrictDoc Documentation
strictdoc/core/transforms/update_grammar.py
Source file coverage
Path:
strictdoc/core/transforms/update_grammar.py
Lines:
63
Non-empty lines:
53
Non-empty lines covered with requirements:
53 / 53 (100.0%)
Functions:
3
Functions covered by requirements:
3 / 3 (100.0%)
1
"""
2
@relation(SDOC-SRS-56, scope=file)
3
"""
4
 
5
from typing import Dict, List
6
 
7
from strictdoc.backend.sdoc.models.document import SDocDocument
8
from strictdoc.backend.sdoc.models.document_grammar import (
9
    DocumentGrammar,
10
)
11
from strictdoc.backend.sdoc.models.grammar_element import GrammarElement
12
from strictdoc.core.traceability_index import (
13
    TraceabilityIndex,
14
)
15
from strictdoc.export.html.form_objects.grammar_form_object import (
16
    GrammarFormObject,
17
)
18
 
19
 
20
class UpdateGrammarCommand:
21
    def __init__(
22
        self,
23
        *,
24
        form_object: GrammarFormObject,
25
        document: SDocDocument,
26
        traceability_index: TraceabilityIndex,
27
    ):
28
        self.form_object: GrammarFormObject = form_object
29
        self.document: SDocDocument = document
30
        self.traceability_index: TraceabilityIndex = traceability_index
31
 
32
    def perform(self) -> bool:
33
        form_object: GrammarFormObject = self.form_object
34
        document: SDocDocument = self.document
35
 
36
        form_element_names = map(
37
            lambda field_: field_.field_name, form_object.fields
38
        )
39
 
40
        map_existing_elements_by_name: Dict[str, GrammarElement] = {}
41
        assert document.grammar is not None
42
        for grammar_element_ in document.grammar.elements:
43
            map_existing_elements_by_name[grammar_element_.tag] = (
44
                grammar_element_
45
            )
46
 
47
        updated_grammar_elements: List[GrammarElement] = []
48
        for form_element_name_ in form_element_names:
49
            if form_element_name_ in map_existing_elements_by_name:
50
                updated_grammar_elements.append(
51
                    map_existing_elements_by_name[form_element_name_]
52
                )
53
            else:
54
                updated_grammar_elements.append(
55
                    GrammarElement.create_default(form_element_name_)
56
                )
57
 
58
        new_grammar = DocumentGrammar(
59
            parent=document, elements=updated_grammar_elements
60
        )
61
        document.grammar = new_grammar
62
 
63
        return True