From: Alexander Popov Date: Wed, 13 Sep 2023 22:06:19 +0000 (+0300) Subject: Add colors to output (#86) X-Git-Tag: v0.6.6~80 X-Git-Url: https://jxself.org/git/?a=commitdiff_plain;h=085e1fe490f63c77cdfd220cb09468e253416aec;hp=108eb7374967b0f66e70b68cca60a0548f12844c;p=kconfig-hardened-check.git Add colors to output (#86) Shows OK in green and FAIL in red Thanks to @frakman1. Refers to #81. Needs fixing `test_stdout()` in the unit-test. --- diff --git a/kconfig_hardened_check/engine.py b/kconfig_hardened_check/engine.py index 2e86ef3..4fdc222 100644 --- a/kconfig_hardened_check/engine.py +++ b/kconfig_hardened_check/engine.py @@ -11,6 +11,21 @@ This module is the engine of checks. # pylint: disable=missing-class-docstring,missing-function-docstring # pylint: disable=line-too-long,invalid-name,too-many-branches +GREEN_COLOR = '\x1b[32m' +RED_COLOR = '\x1b[31m' +COLOR_END = '\x1b[0m' + +def colorize_result(input_text): + if input_text is None: + return input_text + if input_text.startswith('OK'): + color = GREEN_COLOR + elif input_text.startswith('FAIL:'): + color = RED_COLOR + else: + assert(False), f'unexpected result "{input_text}"' + return f'{color}{input_text}{COLOR_END}' + class OptCheck: def __init__(self, reason, decision, name, expected): @@ -78,7 +93,7 @@ class OptCheck: def table_print(self, _mode, with_results): print(f'{self.name:<40}|{self.type:^7}|{self.expected:^12}|{self.decision:^10}|{self.reason:^18}', end='') if with_results: - print(f'| {self.result}', end='') + print(f'| {colorize_result(self.result)}', end='') def json_dump(self, with_results): dump = [self.name, self.type, self.expected, self.decision, self.reason] @@ -137,7 +152,7 @@ class VersionCheck: ver_req = f'kernel version >= {self.ver_expected[0]}.{self.ver_expected[1]}' print(f'{ver_req:<91}', end='') if with_results: - print(f'| {self.result}', end='') + print(f'| {colorize_result(self.result)}', end='') class ComplexOptCheck: @@ -167,7 +182,7 @@ class ComplexOptCheck: if mode == 'verbose': print(f' {"<<< " + self.__class__.__name__ + " >>>":87}', end='') if with_results: - print(f'| {self.result}', end='') + print(f'| {colorize_result(self.result)}', end='') for o in self.opts: print() o.table_print(mode, with_results) @@ -175,7 +190,7 @@ class ComplexOptCheck: o = self.opts[0] o.table_print(mode, False) if with_results: - print(f'| {self.result}', end='') + print(f'| {colorize_result(self.result)}', end='') def json_dump(self, with_results): dump = self.opts[0].json_dump(False) diff --git a/kconfig_hardened_check/test_engine.py b/kconfig_hardened_check/test_engine.py index dce1039..c917705 100644 --- a/kconfig_hardened_check/test_engine.py +++ b/kconfig_hardened_check/test_engine.py @@ -16,6 +16,7 @@ import sys from collections import OrderedDict import json from .engine import KconfigCheck, CmdlineCheck, SysctlCheck, VersionCheck, OR, AND, populate_with_data, perform_checks, override_expected_value +import re class TestEngine(unittest.TestCase): @@ -387,8 +388,9 @@ class TestEngine(unittest.TestCase): stdout_result = [] self.get_engine_result(config_checklist, stdout_result, 'stdout') + stdout_result_clean = [re.sub(r'\x1b(\[.*?[@-~]|\].*?(\x07|\x1b\\))', '', s) for s in stdout_result] self.assertEqual( - stdout_result, + stdout_result_clean, [ "\ CONFIG_NAME_1 |kconfig| expected_1 |decision_1| reason_1 | FAIL: is not found\ @@ -398,8 +400,9 @@ name_4 |cmdline| expected_4 |decision_4| re stdout_result = [] self.get_engine_result(config_checklist, stdout_result, 'stdout_verbose') + stdout_result_clean = [re.sub(r'\x1b(\[.*?[@-~]|\].*?(\x07|\x1b\\))', '', s) for s in stdout_result] self.assertEqual( - stdout_result, + stdout_result_clean, [ "\ <<< OR >>> | FAIL: is not found\n\