From f39b45393d44e576db5879eb797a9c69039658e6 Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Fri, 30 Jan 2026 18:03:46 +0000 Subject: [PATCH] Add generate, report, and utils modules --- config_auditor/report.py | 95 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 config_auditor/report.py diff --git a/config_auditor/report.py b/config_auditor/report.py new file mode 100644 index 0000000..3306d82 --- /dev/null +++ b/config_auditor/report.py @@ -0,0 +1,95 @@ +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": {}, + }