Passed
Pull Request — master (#187)
by Jan
04:54
created

oval_graph.arf_xml_parser._oval_scan_definitions   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 122
Duplicated Lines 0 %

Test Coverage

Coverage 98.33%

Importance

Changes 0
Metric Value
eloc 101
dl 0
loc 122
ccs 59
cts 60
cp 0.9833
rs 10
c 0
b 0
f 0
wmc 20

8 Methods

Rating   Name   Duplication   Size   Complexity  
A _OvalScanDefinitions._fill_extend_definition_help() 0 20 4
A _OvalScanDefinitions._find_definition_by_id() 0 9 2
A _OvalScanDefinitions._fill_extend_definition() 0 9 2
A _OvalScanDefinitions.__init__() 0 4 1
A _OvalScanDefinitions._build_node() 0 38 4
A _OvalScanDefinitions._get_negate_status() 0 6 2
A _OvalScanDefinitions.get_scan() 0 9 2
A _OvalScanDefinitions._get_result() 0 11 3
1 1
from ._comments import _Comments
2 1
from ._test_info import _TestInfo
3
4 1
STR_TO_BOOL = {'true': True, 'false': False}
5 1
REVERSE_NEGATE_VALUE = {'true': 'false', 'false': 'true'}
6
7
8 1
class _OvalScanDefinitions:
9 1
    def __init__(self, definitions, oval_definitions, report_data):
10 1
        self.definitions = definitions
11 1
        self.comments_parser = _Comments(oval_definitions)
12 1
        self.test_info_parser = _TestInfo(report_data)
13
14 1
    def get_scan(self):
15 1
        dict_of_definitions = {}
16 1
        for definition in self.definitions:
17 1
            id_definition = definition.get('definition_id')
18 1
            dict_of_definitions[id_definition] = dict(
19
                commnet=None, node=self._build_node(
20
                    definition[0], "Definition", id_definition))
21 1
        self.comments_parser.insert_comments(dict_of_definitions)
22 1
        return self._fill_extend_definition(dict_of_definitions)
23
24 1
    @staticmethod
25
    def _get_negate_status(node):
26 1
        negate_status = False
27 1
        if node.get('negate') is not None:
28 1
            negate_status = STR_TO_BOOL[node.get('negate')]
29 1
        return negate_status
30
31 1
    @staticmethod
32
    def _get_result(negate_status, tree):
33
        """
34
            This  method  removes  the  negation of
35
            the result. Because negation is already
36
            included in the result in ARF file.
37
        """
38 1
        result = tree.get('result')
39 1
        if negate_status and result in ('true', 'false'):
40 1
            result = REVERSE_NEGATE_VALUE[result]
41 1
        return result
42
43 1
    def _build_node(self, tree, tag, id_definition=None):
44 1
        negate_status = self._get_negate_status(tree)
45 1
        node = dict(
46
            id=id_definition,
47
            operator=tree.get('operator'),
48
            negate=negate_status,
49
            result=self._get_result(negate_status, tree),
50
            comment=None,
51
            tag=tag,
52
            node=[],
53
        )
54 1
        for child in tree:
55 1
            if child.get('operator') is not None:
56 1
                node['node'].append(self._build_node(child, "Criteria"))
57
            else:
58 1
                negate_status = self._get_negate_status(child)
59 1
                result_of_node = self._get_result(negate_status, child)
60 1
                if child.get('definition_ref') is not None:
61 1
                    node['node'].append(
62
                        dict(
63
                            extend_definition=child.get('definition_ref'),
64
                            result=result_of_node,
65
                            negate=negate_status,
66
                            comment=None,
67
                            tag="Extend definition",
68
                        ))
69
                else:
70 1
                    node['node'].append(
71
                        dict(
72
                            value_id=child.get('test_ref'),
73
                            value=result_of_node,
74
                            negate=negate_status,
75
                            comment=None,
76
                            tag="Test",
77
                            test_result_details=self.test_info_parser.get_info_about_test(
78
                                child.get('test_ref')),
79
                        ))
80 1
        return node
81
82 1
    def _fill_extend_definition(self, dict_of_definitions):
83 1
        out = {}
84 1
        for id_definition, definition in dict_of_definitions.items():
85 1
            out[id_definition] = dict(
86
                comment=definition['comment'],
87
                node=self._fill_extend_definition_help(
88
                    definition['node'],
89
                    dict_of_definitions))
90 1
        return out
91
92 1
    def _fill_extend_definition_help(self, value, dict_of_definitions):
93 1
        out = dict(
94
            operator=value['operator'],
95
            negate=value['negate'],
96
            result=value['result'],
97
            comment=value['comment'],
98
            tag=value['tag'],
99
            node=[],
100
        )
101 1
        for child in value['node']:
102 1
            if 'operator' in child:
103 1
                out['node'].append(
104
                    self._fill_extend_definition_help(
105
                        child, dict_of_definitions))
106 1
            elif 'extend_definition' in child:
107 1
                out['node'].append(
108
                    self._find_definition_by_id(dict_of_definitions, child))
109
            else:
110 1
                out['node'].append(child)
111 1
        return out
112
113 1
    def _find_definition_by_id(self, dict_of_definitions, child):
114 1
        id_ = child['extend_definition']
115 1
        if id_ in dict_of_definitions:
116 1
            dict_of_definitions[id_]['node']['negate'] = child['negate']
117 1
            dict_of_definitions[id_]['node']['comment'] = child['comment']
118 1
            dict_of_definitions[id_]['node']['tag'] = child['tag']
119 1
            return self._fill_extend_definition_help(
120
                dict_of_definitions[id_]['node'], dict_of_definitions)
121
        return None
122