"""Adapter: radon cc -j JSON output → Finding[].""" from __future__ import annotations import json from scripts.manifest import Finding def _severity_for_complexity(cc: int) -> str | None: if cc >= 20: return "high" if cc >= 10: return "medium" return None def parse_radon_output(stdout: str) -> list[Finding]: try: payload = json.loads(stdout) except json.JSONDecodeError: return [] if not isinstance(payload, dict): return [] out: list[Finding] = [] for file_path, items in payload.items(): if not isinstance(items, list): continue for item in items: cc = item.get("complexity", 0) severity = _severity_for_complexity(cc) if severity is None: continue line = item.get("lineno", 0) end_line = item.get("endline", line) name = item.get("name", "?") kind = item.get("type", "function") out.append(Finding( tool="radon", rule_id=f"radon:cc={cc}", severity=severity, file=file_path, line=line, end_line=end_line, message=f"high cyclomatic complexity (CCN={cc}) in {kind} {name}", )) return out