Test Failed
Pull Request — master (#203)
by Jan
06:26 queued 02:49
created

_Comments.insert_comments()   A

Complexity

Conditions 3

Size

Total Lines 6
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
cc 3
eloc 6
nop 2
dl 0
loc 6
ccs 0
cts 5
cp 0
crap 12
rs 10
c 0
b 0
f 0
1
ns = {
2
    'oval-definitions': 'http://oval.mitre.org/XMLSchema/oval-definitions-5',
3
}
4
5
6
class _Comments:
7
    def __init__(self, oval_definitions):
8
        self.oval_definitions = oval_definitions
9
10
    def _create_dict_form_criteria(self, criteria, description=None):
11
        comments = dict(
12
            operator=self._get_operator(criteria),
13
            comment=self._get_comment(criteria, description),
14
            node=[],
15
        )
16
        for criterion in criteria:
17
            if criterion.get('operator'):
18
                comments['node'].append(
19
                    self._create_dict_form_criteria(criterion))
20
            else:
21
                comments['node'].append(self._get_dict_with_comment(criterion))
22
        return comments
23
24
    def _get_dict_with_comment(self, criterion):
25
        out = dict(comment=self._get_comment(criterion))
26
        if criterion.get('definition_ref'):
27
            out['extend_definition'] = criterion.get('definition_ref')
28
        else:
29
            out['value_id'] = criterion.get('test_ref')
30
        return out
31
32
    @staticmethod
33
    def _get_operator(criterion):
34
        operator = criterion.get('operator')
35
        return 'AND' if operator is None else operator
36
37
    @staticmethod
38
    def _get_comment(criterion, description=None):
39
        comment = criterion.get('comment')
40
        return description if comment is None else comment
41
42
    def _prepare_definition_comments(self):
43
        definitions = {}
44
        for definition in self.oval_definitions:
45
            comment_definition = dict(comment=None, node=[])
46
            title = definition.find(
47
                './/oval-definitions:metadata/oval-definitions:title', ns)
48
            description = definition.find(
49
                './/oval-definitions:metadata/oval-definitions:description', ns)
50
            comment_definition['comment'] = title.text
51
            criteria = definition.find('.//oval-definitions:criteria', ns)
52
            comment_definition['node'].append(
53
                self._create_dict_form_criteria(criteria, description.text))
54
            definitions[definition.get('id')] = comment_definition
55
        return definitions
56
57
    def _recursive_help_fill_comments(self, tree_of_comments, tree):
58
        for node, node_of_comment in zip(tree, tree_of_comments):
59
            node['comment'] = node_of_comment['comment']
60
            if 'operator' in node and node_of_comment.get('node'):
61
                self._recursive_help_fill_comments(
62
                    node_of_comment['node'], node['node'])
63
64
    def _fill_comment(self, comment_definition, tree_definition):
65
        tree_of_comments = comment_definition['node']
66
        tree = [tree_definition['node']]
67
        tree_definition['comment'] = comment_definition['comment']
68
        self._recursive_help_fill_comments(tree_of_comments, tree)
69
70
    def insert_comments(self, dict_of_definitions):
71
        comment_definitions = self._prepare_definition_comments()
72
        for id_definition, definition in dict_of_definitions.items():
73
            if id_definition in comment_definitions:
74
                self._fill_comment(
75
                    comment_definitions[id_definition], definition)
76