Source code for dartwork_mpl.lint.report
"""Text rendering of lint issues.
Surface (re-exported by :mod:`dartwork_mpl.lint`): ``format_report``.
"""
from __future__ import annotations
from .catalog import Issue
[docs]
def format_report(issues: list[Issue]) -> str:
"""Render issues as a multi-line ``[SEV] rule-id: message`` report.
The full message is preserved (including any subsequent lines from
a YAML ``|`` block scalar) and indented under the header line so
reports stay readable in plain-text MCP/CLI output.
If a rule provides a ``fix_suggestion``, it is emitted on its own
line directly after the message as ``→ fix: <suggestion>`` so AI
agents can lift the replacement directly without a second
round-trip.
"""
if not issues:
return "✅ No issues found."
lines: list[str] = []
for issue in issues:
line_part = f" (line {issue.line})" if issue.line else ""
msg_lines = [ln.rstrip() for ln in issue.message.splitlines()]
# Drop trailing blank lines but keep internal structure.
while msg_lines and not msg_lines[-1]:
msg_lines.pop()
if not msg_lines:
msg_lines = [""]
lines.append(
f"[{issue.severity.upper()}] {issue.rule_id}"
f"{line_part}: {msg_lines[0]}"
)
lines.extend(f" {tail}" if tail else "" for tail in msg_lines[1:])
if issue.fix_suggestion:
lines.append(f" → fix: {issue.fix_suggestion}")
return "\n".join(lines)