"""Table reporters."""
from __future__ import annotations
from typing import TYPE_CHECKING, cast
from tabulate import tabulate
from project_config.reporters.base import (
BaseColorReporter,
BaseNoopFormattedReporter,
)
if TYPE_CHECKING:
from project_config.reporters.base import (
FilesErrors,
FormatterDefinitionType,
)
[docs]def _common_generate_rows(
errors: FilesErrors,
format_file: FormatterDefinitionType,
format_error_message: FormatterDefinitionType,
format_definition: FormatterDefinitionType,
format_hint: FormatterDefinitionType,
) -> list[list[str]]:
rows = []
for file, file_errors in errors.items():
for i, error in enumerate(file_errors):
rows.append(
[
format_file(file) if i == 0 else "",
format_error_message(error["message"]),
format_definition(error["definition"]),
format_hint(error.get("hint", "")),
],
)
return rows
[docs]def _common_generate_errors_report( # noqa: PLR0913
errors: FilesErrors,
fmt: str,
format_key: FormatterDefinitionType,
format_file: FormatterDefinitionType,
format_error_message: FormatterDefinitionType,
format_definition: FormatterDefinitionType,
format_hint: FormatterDefinitionType,
) -> str:
return tabulate(
_common_generate_rows(
errors,
format_file,
format_error_message,
format_definition,
format_hint,
),
headers=[
format_key("files"),
format_key("message"),
format_key("definition"),
format_key("hint"),
],
tablefmt=fmt,
)
[docs]class TableReporter(BaseNoopFormattedReporter):
"""Black/white reporter in table formats."""
[docs] def generate_errors_report(self) -> str:
"""Generate an errors report in black/white table format."""
return _common_generate_errors_report(
self.errors,
cast(str, self.format),
self.format_key,
self.format_file,
self.format_error_message,
self.format_definition,
self.format_hint,
).rstrip("\n")
[docs]class TableColorReporter(BaseColorReporter):
"""Color reporter in table formats."""
[docs] def generate_errors_report(self) -> str:
"""Generate an errors report in table format with colors."""
return _common_generate_errors_report(
self.errors,
cast(str, self.format),
self.format_key,
self.format_file,
self.format_error_message,
self.format_definition,
self.format_hint,
).rstrip("\n")