Passed
Push — master ( 26b7f9...8a68fd )
by Jan
02:33 queued 12s
created

ssg.build_cpe.extract_referred_nodes()   B

Complexity

Conditions 7

Size

Total Lines 34
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 15
CRAP Score 7.0796

Importance

Changes 0
Metric Value
cc 7
eloc 17
nop 3
dl 0
loc 34
rs 8
c 0
b 0
f 0
ccs 15
cts 17
cp 0.8824
crap 7.0796
1
"""
2
Common functions for building CPEs
3
"""
4
5 2
from __future__ import absolute_import
6 2
from __future__ import print_function
7
8
9 2
def extract_subelement(objects, sub_elem_type):
10
    """
11
    From a collection of element objects, return the value of
12
    the first attribute of name sub_elem_type found.
13
14
    This is useful when the object is a single element and
15
    we wish to query some external reference identifier
16
    in the subtree of that element.
17
    """
18
19 2
    for obj in objects:
20
        # decide on usage of .iter or .getiterator method of elementtree class.
21
        # getiterator is deprecated in Python 3.9, but iter is not available in
22
        # older versions
23 2
        if getattr(obj, "iter", None) == None:
24
            obj_iterator = obj.getiterator()
25
        else:
26 2
            obj_iterator = obj.iter()
27 2
        for subelement in obj_iterator:
28 2
            if subelement.get(sub_elem_type):
29 2
                sub_element = subelement.get(sub_elem_type)
30 2
                return sub_element
31
32
33 2
def extract_env_obj(objects, local_var):
34
    """
35
    From a collection of objects, return the object with id matching
36
    the object_ref of the local variable.
37
    """
38
39 2
    for obj in objects:
40 2
        env_id = extract_subelement(local_var, 'object_ref')
41 2
        if env_id == obj.get('id'):
42 2
            return obj
43
44
45 2
def extract_referred_nodes(tree_with_refs, tree_with_ids, attrname):
46
    """
47
    Return the elements in tree_with_ids which are referenced
48
    from tree_with_refs via the element attribute 'attrname'.
49
    """
50
51 2
    reflist = []
52 2
    elementlist = []
53
54
55
    # decide on usage of .iter or .getiterator method of elementtree class.
56
    # getiterator is deprecated in Python 3.9, but iter is not available in
57
    # older versions
58 2
    if getattr(tree_with_refs, "iter", None) == None:
59
        tree_with_refs_iterator = tree_with_refs.getiterator()
60
    else:
61 2
        tree_with_refs_iterator = tree_with_refs.iter()
62 2
    for element in tree_with_refs_iterator:
63 2
        value = element.get(attrname)
64 2
        if value is not None:
65 2
            reflist.append(value)
66
67
    # decide on usage of .iter or .getiterator method of elementtree class.
68
    # getiterator is deprecated in Python 3.9, but iter is not available in
69
    # older versions
70 2
    if getattr(tree_with_ids, "iter", None) == None:
71
        tree_with_ids_iterator = tree_with_ids.getiterator()
72
    else:
73 2
        tree_with_ids_iterator = tree_with_ids.iter()
74 2
    for element in tree_with_ids_iterator:
75 2
        if element.get("id") in reflist:
76 2
            elementlist.append(element)
77
78
    return elementlist
79