Spaces:
Sleeping
Sleeping
| """ | |
| 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.""" | |
| 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 | |
| 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 | |
| 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 | |