Add output formatters
This commit is contained in:
62
depaudit/output/__init__.py
Normal file
62
depaudit/output/__init__.py
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from abc import ABC, abstractmethod
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class AuditResult:
|
||||||
|
vulnerabilities: list[dict[str, Any]] = field(default_factory=list)
|
||||||
|
outdated: list[dict[str, Any]] = field(default_factory=list)
|
||||||
|
license_issues: list[dict[str, Any]] = field(default_factory=list)
|
||||||
|
unused: list[dict[str, Any]] = field(default_factory=list)
|
||||||
|
scanned_files: list[str] = field(default_factory=list)
|
||||||
|
scanned_count: int = 0
|
||||||
|
error_count: int = 0
|
||||||
|
scan_duration: float = 0.0
|
||||||
|
|
||||||
|
def to_dict(self) -> dict[str, Any]:
|
||||||
|
return {
|
||||||
|
"vulnerabilities": self.vulnerabilities,
|
||||||
|
"outdated": self.outdated,
|
||||||
|
"license_issues": self.license_issues,
|
||||||
|
"unused": self.unused,
|
||||||
|
"scanned_files": self.scanned_files,
|
||||||
|
"scanned_count": self.scanned_count,
|
||||||
|
"error_count": self.error_count,
|
||||||
|
"scan_duration": self.scan_duration,
|
||||||
|
"summary": self.get_summary(),
|
||||||
|
}
|
||||||
|
|
||||||
|
def get_summary(self) -> dict[str, Any]:
|
||||||
|
severity_counts: dict[str, int] = {"critical": 0, "high": 0, "medium": 0, "low": 0}
|
||||||
|
for vuln in self.vulnerabilities:
|
||||||
|
severity = vuln.get("severity", "unknown")
|
||||||
|
if severity in severity_counts:
|
||||||
|
severity_counts[severity] += 1
|
||||||
|
|
||||||
|
return {
|
||||||
|
"total_vulnerabilities": len(self.vulnerabilities),
|
||||||
|
"severity_breakdown": severity_counts,
|
||||||
|
"total_outdated": len(self.outdated),
|
||||||
|
"total_license_issues": len(self.license_issues),
|
||||||
|
"total_unused": len(self.unused),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class Formatter(ABC):
|
||||||
|
def __init__(self, use_color: bool = True, verbosity: str = "info"):
|
||||||
|
self.use_color = use_color
|
||||||
|
self.verbosity = verbosity
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def format(self, result: AuditResult) -> str:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def verbose(self, message: str) -> None:
|
||||||
|
if self.verbosity == "debug":
|
||||||
|
self._log(message)
|
||||||
|
|
||||||
|
def _log(self, message: str) -> None:
|
||||||
|
print(message)
|
||||||
Reference in New Issue
Block a user