Source code for gh_issue_validator.report

"""Report on issues found during validation."""

from dataclasses import dataclass, field
from datetime import UTC, datetime


[docs] @dataclass(frozen=True) class ValidationIssue: """An issue found during validation.""" code: str message: str heading: str | None = None @property def rich_message(self) -> str: """Return a message with a bit of style.""" return f"❌ {self.message}"
[docs] @dataclass class ValidationReport: """A report of all issues found during validation.""" issues: list[ValidationIssue] = field(default_factory=list)
[docs] def add_issue(self, issue: ValidationIssue) -> None: """Add an issue to the report.""" self.issues.append(issue)
@property def is_failure(self) -> bool: """Return True if validation found any issues.""" return len(self.issues) > 0 @property def _summary_message(self) -> str: """Return message summarizing failures.""" if self.is_failure: return f"😭 Validation failed with {len(self.issues)} issues." return "😁 Validation successful!" @property def _errors_message(self) -> str: """Return message listing errors.""" if not self.is_failure: return "" return "\n".join([f"- {issue.rich_message}" for issue in self.issues]) @property def github_issue_message(self) -> str: """Return a message for posting on a GitHub issue.""" timestamp = datetime.now(UTC).strftime("%Y-%m-%d %H:%M:%S UTC") lines: list[str] = [] lines.append(f"**{self._summary_message}** ({timestamp})") if self.is_failure: lines.append("<details>") lines.append("<summary>Errors</summary>") lines.append("") lines.append(self._errors_message) lines.append("") lines.append("</details>") return "\n".join(lines) def __str__(self) -> str: lines: list[str] = [] lines.append(self._summary_message) if self.is_failure: lines.append("") lines.append(self._errors_message) return "\n".join(lines)