"""Adapter: mypy text output normalized to Finding[].""" from __future__ import annotations import re from scripts.manifest import Finding _LINE_RE = re.compile( r"^(?P[^:]+):(?P\d+):\s*" r"(?Perror|warning|note):\s*" r"(?P.+?)" r"(?:\s+\[(?P[a-z\-]+)\])?\s*$" ) _SEVERITY = {"error": "medium", "warning": "low", "note": None} def parse_mypy_output(stdout: str) -> list[Finding]: out: list[Finding] = [] for raw in stdout.splitlines(): m = _LINE_RE.match(raw) if not m: continue sev = _SEVERITY.get(m.group("severity")) if sev is None: continue out.append(Finding( tool="mypy", rule_id=m.group("code") or "", severity=sev, file=m.group("file"), line=int(m.group("line")), end_line=int(m.group("line")), message=m.group("message"), )) return out