openscap_report.scap_results_parser.parsers.oval_items_parser   A
last analyzed

Complexity

Total Complexity 18

Size/Duplication

Total Lines 72
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 59
dl 0
loc 72
ccs 56
cts 56
cp 1
rs 10
c 0
b 0
f 0
wmc 18

6 Methods

Rating   Name   Duplication   Size   Complexity  
A OVALItemsParser._get_entries() 0 9 3
A OVALItemsParser.get_oval_items() 0 20 4
A OVALItemsParser._get_header() 0 8 4
A OVALItemsParser.__init__() 0 3 1
A OVALItemsParser._get_items() 0 7 2
A OVALItemsParser._get_item() 0 8 4
1
# Copyright 2024, Red Hat, Inc.
2
# SPDX-License-Identifier: LGPL-2.1-or-later
3
4 1
from ..data_structures import OVALItems
5 1
from ..namespaces import NAMESPACES
6 1
from .shared_static_methods_of_parser import SharedStaticMethodsOfParser
7
8 1
PROCURED_ITEMS_LIMIT = 100
9
10
11 1
class OVALItemsParser:
12 1
    def __init__(self, collected_objects, system_data):
13 1
        self.collected_objects = collected_objects
14 1
        self.system_data = system_data
15
16 1
    def _get_item(self, item_ref):
17 1
        item_el = self.system_data.get(item_ref)
18 1
        item_data = {}
19 1
        for child_el in item_el:
20 1
            if child_el.text and child_el.text.strip():
21 1
                key = SharedStaticMethodsOfParser.get_key_of_xml_element(child_el)
22 1
                item_data[key] = child_el.text
23 1
        return item_data
24
25 1
    def _get_items(self, references):
26 1
        items = []
27 1
        for reference_el in references:
28 1
            item_ref = reference_el.get("item_ref")
29 1
            item = self._get_item(item_ref)
30 1
            items.append(item)
31 1
        return items
32
33 1
    @staticmethod
34 1
    def _get_header(items):
35 1
        header = []
36 1
        for item in items:
37 1
            for key in item.keys():
38 1
                if key not in header:
39 1
                    header.append(key)
40 1
        return tuple(header)
41
42 1
    @staticmethod
43 1
    def _get_entries(header, items):
44 1
        entries = []
45 1
        for item in items:
46 1
            entry = []
47 1
            for key in header:
48 1
                entry.append(item.get(key, ""))
49 1
            entries.append(tuple(entry))
50 1
        return entries
51
52 1
    def get_oval_items(self, object_id):
53 1
        collected_object_el = self.collected_objects.get(object_id)
54 1
        if collected_object_el is None:
55 1
            return None
56 1
        references = collected_object_el.findall(
57
            "oval-characteristics:reference", NAMESPACES
58
        )
59 1
        if len(references) == 0:
60 1
            return None
61 1
        items = self._get_items(references)
62 1
        header = self._get_header(items)
63 1
        entries = self._get_entries(header, items)
64 1
        message = None
65 1
        len_entries = len(entries)
66 1
        if len_entries > PROCURED_ITEMS_LIMIT:
67 1
            entries = entries[:PROCURED_ITEMS_LIMIT]
68 1
            message = (
69
                f"Collected {len_entries} items, showing only first "
70
                f"{PROCURED_ITEMS_LIMIT} items")
71
        return OVALItems(header=header, entries=entries, message=message)
72