from pydantic import BaseModel, model_validator, field_validator from typing import List, Optional, Any class Bug(BaseModel): description: str file: str = "unknown" line: Optional[int] = None severity: str = "critical" @field_validator("file", mode="before") @classmethod def coerce_file(cls, v: Any) -> str: if isinstance(v, list): return ", ".join(str(f) for f in v) if v else "unknown" return v or "unknown" class Warning(BaseModel): description: str file: str = "unknown" line: Optional[int] = None @field_validator("file", mode="before") @classmethod def coerce_file(cls, v: Any) -> str: if isinstance(v, list): return ", ".join(str(f) for f in v) if v else "unknown" return v or "unknown" class Suggestion(BaseModel): description: str file: str = "unknown" @field_validator("file", mode="before") @classmethod def coerce_file(cls, v: Any) -> str: if isinstance(v, list): return ", ".join(str(f) for f in v) if v else "unknown" return v or "unknown" class IssueReport(BaseModel): critical: List[Bug] = [] warnings: List[Warning] = [] suggestions: List[Suggestion] = [] total_critical: int = 0 total_warnings: int = 0 total_suggestions: int = 0 @model_validator(mode="after") def compute_totals(self) -> "IssueReport": self.total_critical = len(self.critical) self.total_warnings = len(self.warnings) self.total_suggestions = len(self.suggestions) return self