Files
MoviePilot/app/doctor/formatters.py
DDSRem 2de976f6b3 Merge pull request #7050 from DDSRem-Dev/codex-comment-migration
docs: 统一全项目中文注释和结构化契约说明
2026-10-17 19:26:29 +08:00

73 lines
2.2 KiB
Python

"""
将诊断报告转换为 JSON 或面向终端阅读的文本。
"""
from __future__ import annotations
import json
from app.doctor.models import DoctorFinding, DoctorReport
STATUS_LABELS = {
"healthy": "healthy",
"degraded": "degraded",
"failed": "failed",
}
def format_json_report(report: DoctorReport) -> str:
"""
将诊断报告格式化为保留中文的缩进 JSON 文本。
:param report: 已收集诊断发现的报告
:return: 使用两个空格缩进的 JSON 字符串
"""
return json.dumps(report.to_dict(), ensure_ascii=False, indent=2)
def format_text_report(report: DoctorReport) -> str:
"""
将诊断报告格式化为面向用户阅读的文本。
:param report: 要展示环境、发现项与统计信息的报告
:return: 以换行符分隔的报告文本,不附加终端颜色控制符
"""
lines = [
"MoviePilot Doctor",
"",
f"状态: {STATUS_LABELS.get(report.status.value, report.status.value)}",
f"版本: {report.version}",
f"生成时间: {report.generated_at.isoformat(timespec='seconds')}",
f"运行环境: {report.environment.get('runtime', 'unknown')}",
f"配置目录: {report.environment.get('config_path', '')}",
"",
]
for finding in report.findings:
lines.extend(_format_finding(finding))
summary = report.summary
lines.extend([
"",
f"汇总: total={summary['total']} error={summary['error']} "
f"warn={summary['warn']} advisory={summary['advisory']} "
f"fixed={summary['fixed']}",
])
return "\n".join(lines)
def _format_finding(finding: DoctorFinding) -> list[str]:
"""
生成单条发现的展示行,优先标记已修复,其次标记仅供参考。
"""
marker = finding.severity.value.upper()
if finding.fixed:
marker = "FIXED"
elif not finding.affects_report_status:
marker = f"{marker}/ADVISORY"
lines = [f"[{marker}] {finding.title}", f"ID: {finding.id}"]
if finding.detail:
lines.append(f"原因: {finding.detail}")
if finding.recommendation:
lines.append(f"建议: {finding.recommendation}")
lines.append("")
return lines