""" 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