Passed
Pull Request — master (#96)
by Jan
06:16
created

openscap_report.report_generators.html   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 66
Duplicated Lines 0 %

Test Coverage

Coverage 92.31%

Importance

Changes 0
Metric Value
eloc 54
dl 0
loc 66
rs 10
c 0
b 0
f 0
ccs 48
cts 52
cp 0.9231
wmc 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A HTMLReportGenerator.set_css_for_list() 0 5 1
A HTMLReportGenerator.generate_report() 0 7 2
A HTMLReportGenerator.include_file_in_base64() 0 8 2
A HTMLReportGenerator.__init__() 0 9 1
A HTMLReportGenerator.get_selected_rules() 0 9 4
1
# Copyright 2022, Red Hat, Inc.
2
# SPDX-License-Identifier: LGPL-2.1-or-later
3
4 1
import base64
5 1
import re
6 1
from io import BytesIO
7 1
from pathlib import Path
8
9 1
from jinja2 import Environment, FileSystemLoader
10
11 1
try:
12 1
    from jinja2 import pass_context
13
except ImportError:
14
    from jinja2 import contextfunction as pass_context
15
16 1
from markupsafe import Markup
17
18 1
from ..scap_results_parser.data_structures import Rule
19 1
from .exceptions import FilterNotSupportDataStructureException
20 1
from .report_generator import ReportGenerator
21
22
23 1
class HTMLReportGenerator(ReportGenerator):
24 1
    def __init__(self, parser):  # pylint: disable=W0231
25 1
        self.report = parser.parse_report()
26 1
        self.file_loader = FileSystemLoader(str(Path(__file__).parent / "templates"))
27 1
        self.env = Environment(loader=self.file_loader)
28 1
        self.env.globals['include_file_in_base64'] = self.include_file_in_base64
29 1
        self.env.filters['set_css_for_list'] = self.set_css_for_list
30 1
        self.env.filters['get_selected_rules'] = self.get_selected_rules
31 1
        self.env.trim_blocks = True
32 1
        self.env.lstrip_blocks = True
33
34 1
    def generate_report(self, debug_setting):
35 1
        template = self.env.get_template("template_report.html")
36 1
        html_report = template.render(report=self.report, debug_setting=debug_setting)
37 1
        if debug_setting.no_minify:
38
            return BytesIO(html_report.encode())
39 1
        minified_html_report = re.sub(r'>\s+<', '><', html_report)
40 1
        return BytesIO(minified_html_report.encode())
41
42 1
    @staticmethod
43 1
    @pass_context
44 1
    def include_file_in_base64(context, relative_path):
45 1
        real_path = Path(context.environment.loader.searchpath[0]) / relative_path
46 1
        base64_data = None
47 1
        with open(real_path, "rb") as file_data:
48 1
            base64_data = (base64.b64encode(file_data.read())).decode('utf-8')
49 1
        return Markup(base64_data)
50
51 1
    @staticmethod
52 1
    def set_css_for_list(data):
53 1
        out = data.replace("<ul>", "<ul class=\"pf-c-list\">")
54 1
        out = out.replace("<ol>", "<ol class=\"pf-c-list\">")
55 1
        return out
56
57 1
    @staticmethod
58 1
    def get_selected_rules(data):
59 1
        out = []
60 1
        for rule_id, rule in data.items():
61 1
            if not isinstance(rule, Rule):
62
                raise FilterNotSupportDataStructureException
63 1
            if rule.result != "notselected":
64 1
                out.append((rule_id, rule))
65
        return out
66