Spaces:
Sleeping
Sleeping
File size: 6,225 Bytes
6f38c76 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
"""
Report Generator
Generates JSON and Markdown reports from visual difference analysis
"""
from typing import Dict, Any
import json
import os
from datetime import datetime
class ReportGenerator:
"""Generates comprehensive reports from analysis results."""
@staticmethod
def generate_json_report(state: 'WorkflowState', output_path: str) -> bool:
"""Generate JSON report."""
try:
# Prepare report data
report = {
"metadata": {
"execution_id": state.execution_id,
"timestamp": datetime.now().isoformat(),
"figma_file": state.figma_file_key,
"website_url": state.website_url,
"status": state.status
},
"summary": {
"total_differences": len(state.visual_differences),
"high_severity": len([d for d in state.visual_differences if d.severity == "High"]),
"medium_severity": len([d for d in state.visual_differences if d.severity == "Medium"]),
"low_severity": len([d for d in state.visual_differences if d.severity == "Low"]),
"similarity_score": state.similarity_score
},
"differences": []
}
# Add differences
for diff in state.visual_differences:
diff_dict = {
"name": diff.name,
"category": diff.category,
"severity": diff.severity,
"description": diff.description,
"viewport": diff.viewport,
"detected_by": diff.detected_by if hasattr(diff, 'detected_by') else "Unknown",
"location": diff.location if hasattr(diff, 'location') else {}
}
report["differences"].append(diff_dict)
# Write report
os.makedirs(os.path.dirname(output_path), exist_ok=True)
with open(output_path, 'w') as f:
json.dump(report, f, indent=2)
return True
except Exception as e:
print(f"Error generating JSON report: {str(e)}")
return False
@staticmethod
def generate_markdown_report(state: 'WorkflowState', output_path: str) -> bool:
"""Generate Markdown report."""
try:
lines = []
lines.append("# π¨ UI Regression Testing Report\n")
lines.append(f"**Generated**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
lines.append(f"**Execution ID**: {state.execution_id}\n")
lines.append(f"**Website**: {state.website_url}\n")
lines.append(f"**Figma File**: {state.figma_file_key}\n\n")
# Summary
lines.append("## π Summary\n")
lines.append(f"- **Similarity Score**: {state.similarity_score:.1f}/100")
lines.append(f"- **Total Differences**: {len(state.visual_differences)}")
lines.append(f"- π΄ **High Severity**: {len([d for d in state.visual_differences if d.severity == 'High'])}")
lines.append(f"- π **Medium Severity**: {len([d for d in state.visual_differences if d.severity == 'Medium'])}")
lines.append(f"- π’ **Low Severity**: {len([d for d in state.visual_differences if d.severity == 'Low'])}\n\n")
# Differences by severity
high_diffs = [d for d in state.visual_differences if d.severity == "High"]
medium_diffs = [d for d in state.visual_differences if d.severity == "Medium"]
low_diffs = [d for d in state.visual_differences if d.severity == "Low"]
if high_diffs:
lines.append("## π΄ High Severity Issues\n")
for i, diff in enumerate(high_diffs, 1):
lines.append(f"### {i}. {diff.name}")
lines.append(f"- **Category**: {diff.category}")
lines.append(f"- **Description**: {diff.description}")
lines.append(f"- **Viewport**: {diff.viewport}\n")
if medium_diffs:
lines.append("## π Medium Severity Issues\n")
for i, diff in enumerate(medium_diffs, 1):
lines.append(f"### {i}. {diff.name}")
lines.append(f"- **Category**: {diff.category}")
lines.append(f"- **Description**: {diff.description}")
lines.append(f"- **Viewport**: {diff.viewport}\n")
if low_diffs:
lines.append("## π’ Low Severity Issues\n")
for i, diff in enumerate(low_diffs, 1):
lines.append(f"### {i}. {diff.name}")
lines.append(f"- **Category**: {diff.category}")
lines.append(f"- **Description**: {diff.description}")
lines.append(f"- **Viewport**: {diff.viewport}\n")
# Write report
os.makedirs(os.path.dirname(output_path), exist_ok=True)
with open(output_path, 'w') as f:
f.write("\n".join(lines))
return True
except Exception as e:
print(f"Error generating Markdown report: {str(e)}")
return False
@staticmethod
def generate_all_reports(state: 'WorkflowState', output_dir: str) -> bool:
"""Generate all report types."""
try:
os.makedirs(output_dir, exist_ok=True)
# Generate JSON report
json_path = os.path.join(output_dir, "report.json")
ReportGenerator.generate_json_report(state, json_path)
# Generate Markdown report
md_path = os.path.join(output_dir, "report_summary.md")
ReportGenerator.generate_markdown_report(state, md_path)
return True
except Exception as e:
print(f"Error generating reports: {str(e)}")
return False
|