From e4aa1a53dcaa5c85bc76f61cc4f321ce04f49c0b Mon Sep 17 00:00:00 2001 From: mcolonna Date: Fri, 1 Mar 2024 16:29:36 +0100 Subject: [PATCH] Change error displaying (colors!) - For each file, the "OK!" and "Error!" are changed to [OK] and [KO] and moved to the left of the file names. - The [OK] are green and the [KO] are red. - If there is a "Notice:" for a file, the [OK] becomes yellow. --- norminette/errors.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/norminette/errors.py b/norminette/errors.py index e8818f7..77588e7 100644 --- a/norminette/errors.py +++ b/norminette/errors.py @@ -148,6 +148,10 @@ def add(self, *args, **kwargs) -> None: def status(self) -> Literal["OK", "Error"]: return "OK" if all(it.level == "Notice" for it in self._inner) else "Error" + @property + def has_notice(self) -> bool: + return any(it.level == "Notice" for it in self._inner) + def append(self, value: Union[NormError, NormWarning]) -> None: # TODO Remove NormError and NormWarning since it does not provide `length` data assert isinstance(value, (NormError, NormWarning)) @@ -172,9 +176,20 @@ def __init_subclass__(cls) -> None: class HumanizedErrorsFormatter(_formatter): def __str__(self) -> str: + + def colorize(status: Literal["OK", "Error", "Notice"], txt: str) -> str: + return "\033[9" + ( + "1" if status == "Error" else ( + "2" if status == "OK" else "3" + )) + "m" + txt + "\033[0m" + output = '' for file in self.files: - output += f"{file.basename}: {file.errors.status}!" + status = file.errors.status + if status == "OK" and file.errors.has_notice: + status = "Notice" + output += colorize(status, f"[{'KO' if status == 'Error' else 'OK'}]") + output += f" {file.basename}" for error in file.errors: highlight = error.highlights[0] output += f"\n{error.level}: {error.name:<20} "