import json from typing import Any, Callable, Dict, List from config_auditor.rules import Issue class ReportGenerator: def to_json(self, issues: List[Issue]) -> str: result = { "summary": { "total": len(issues), "critical": sum(1 for i in issues if i.severity == "critical"), "warning": sum(1 for i in issues if i.severity == "warning"), "info": sum(1 for i in issues if i.severity == "info"), }, "issues": [ { "severity": i.severity, "category": i.category, "message": i.message, "file": str(i.file), "line": i.line, "suggestion": i.suggestion, } for i in issues ], } return json.dumps(result, indent=2) def to_yaml(self, issues: List[Issue]) -> str: import yaml result = { "summary": { "total": len(issues), "critical": sum(1 for i in issues if i.severity == "critical"), "warning": sum(1 for i in issues if i.severity == "warning"), "info": sum(1 for i in issues if i.severity == "info"), }, "issues": [ { "severity": i.severity, "category": i.category, "message": i.message, "file": str(i.file), "line": i.line, "suggestion": i.suggestion, } for i in issues ], } return yaml.dump(result, default_flow_style=False) def to_text(self, issues: List[Issue], output_func: Callable[[str], None]): critical = [i for i in issues if i.severity == "critical"] warnings = [i for i in issues if i.severity == "warning"] infos = [i for i in issues if i.severity == "info"] output_func("\n=== Audit Report ===") output_func(f"Total issues: {len(issues)}") output_func(f" Critical: {len(critical)}") output_func(f" Warnings: {len(warnings)}") output_func(f" Info: {len(infos)}") if critical: output_func("\n=== Critical Issues ===") for i in critical: output_func(f"[CRITICAL] {i.file}: {i.message}") if i.suggestion: output_func(f" -> {i.suggestion}") if warnings: output_func("\n=== Warnings ===") for i in warnings: output_func(f"[WARNING] {i.file}: {i.message}") if i.suggestion: output_func(f" -> {i.suggestion}") if infos: output_func("\n=== Informational ===") for i in infos: output_func(f"[INFO] {i.file}: {i.message}") if not issues: output_func("\nNo issues found. Configuration looks good!") def generate_summary(self, issues: List[Issue]) -> Dict[str, Any]: return { "total": len(issues), "by_severity": { "critical": sum(1 for i in issues if i.severity == "critical"), "warning": sum(1 for i in issues if i.severity == "warning"), "info": sum(1 for i in issues if i.severity == "info"), }, "by_category": {}, }