44 lines
2.4 KiB
Python
44 lines
2.4 KiB
Python
import json
|
|
from pathlib import Path
|
|
from data.diff_result import VerificationRun
|
|
|
|
|
|
class ReportGenerator:
|
|
def generate_json(self, run: VerificationRun, output_path: Path) -> Path:
|
|
data = {
|
|
"program": run.program, "timestamp": run.timestamp,
|
|
"status": run.status, "exit_code": run.exit_code,
|
|
"duration_s": run.duration_s, "fields_matched": run.fields_matched,
|
|
"fields_mismatched": run.fields_mismatched, "runner": run.runner,
|
|
"branch_rate": run.branch_rate, "llm_cost": run.llm_cost,
|
|
"field_results": [
|
|
{"field_name": fr.field_name, "status": fr.status,
|
|
"cobol_value": fr.cobol_value, "java_value": fr.java_value,
|
|
"tolerance_applied": fr.tolerance_applied,
|
|
"rounding_detected": fr.rounding_detected,
|
|
"suggestion": fr.suggestion}
|
|
for fr in run.field_results
|
|
],
|
|
}
|
|
output_path.write_text(json.dumps(data, indent=2))
|
|
return output_path
|
|
|
|
def generate_html(self, run: VerificationRun, output_path: Path) -> Path:
|
|
rows = ""
|
|
for fr in run.field_results:
|
|
cls = "pass" if fr.status == "PASS" else ("tolerated" if fr.status == "TOLERATED" else "fail")
|
|
rows += f'<tr class="{cls}"><td>{fr.field_name}</td><td>{fr.status}</td><td>{fr.cobol_value}</td><td>{fr.java_value}</td><td>{fr.suggestion}</td></tr>'
|
|
html = f"""<!DOCTYPE html><html><head><meta charset="utf-8"><title>Verify: {run.program}</title>
|
|
<style>body{{font-family:monospace;max-width:900px;margin:2rem auto}}.pass{{background:#e6ffe6}}.tolerated{{background:#fff7e6}}.fail{{background:#ffe6e6}}pre{{background:#f0f0f0;padding:1rem}}</style></head><body>
|
|
<h1>{run.program}</h1><pre>Status: {run.status} | Runner: {run.runner} | {run.fields_matched}/{run.total_fields} fields | {run.duration_s}s</pre>
|
|
<table border=1 cellpadding=4><tr><th>Field</th><th>Status</th><th>COBOL</th><th>Java</th><th>Suggestion</th></tr>{rows}</table></body></html>"""
|
|
output_path.write_text(html)
|
|
return output_path
|
|
|
|
def generate_machine_json(self, run: VerificationRun, output_path: Path) -> Path:
|
|
data = {"program": run.program, "timestamp": run.timestamp,
|
|
"status": run.status, "exit_code": run.exit_code,
|
|
"duration_s": run.duration_s, "runner": run.runner}
|
|
output_path.write_text(json.dumps(data))
|
|
return output_path
|