fix: resolve CI linting issues across codebase
Some checks failed
CI / test (push) Has been cancelled
Some checks failed
CI / test (push) Has been cancelled
This commit is contained in:
118
codesnap/codesnap/output/json_exporter.py
Normal file
118
codesnap/codesnap/output/json_exporter.py
Normal file
@@ -0,0 +1,118 @@
|
||||
"""JSON export module for CodeSnap."""
|
||||
|
||||
import json
|
||||
from dataclasses import asdict, dataclass
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
from typing import Any, Optional
|
||||
|
||||
from ..core.extractor import ExtractedCode
|
||||
|
||||
|
||||
@dataclass
|
||||
class FileSummary:
|
||||
"""Summary information for a file."""
|
||||
|
||||
path: str
|
||||
language: str
|
||||
function_count: int
|
||||
class_count: int
|
||||
complexity: str
|
||||
line_count: int
|
||||
|
||||
|
||||
@dataclass
|
||||
class CodeSummary:
|
||||
"""Complete code summary for export."""
|
||||
|
||||
timestamp: str
|
||||
version: str
|
||||
directory: str
|
||||
file_count: int
|
||||
language_breakdown: dict[str, int]
|
||||
files: list[dict[str, Any]]
|
||||
dependencies: dict[str, list[str]]
|
||||
metrics: dict[str, Any]
|
||||
|
||||
|
||||
class JSONExporter:
|
||||
"""Exports code summaries in JSON format."""
|
||||
|
||||
def __init__(self, version: str = "0.1.0") -> None:
|
||||
self.version = version
|
||||
|
||||
def export(
|
||||
self,
|
||||
extracted_files: list[ExtractedCode],
|
||||
file_paths: list[Path],
|
||||
dependency_data: dict[str, Any],
|
||||
complexity_data: dict[str, str],
|
||||
output_path: Optional[Path] = None,
|
||||
) -> str:
|
||||
"""Export code summary to JSON."""
|
||||
language_counts: dict[str, int] = {}
|
||||
file_summaries: list[dict[str, Any]] = []
|
||||
|
||||
for extracted in extracted_files:
|
||||
lang = extracted.language
|
||||
language_counts[lang] = language_counts.get(lang, 0) + 1
|
||||
|
||||
file_summary = {
|
||||
"path": str(extracted.file_path),
|
||||
"language": lang,
|
||||
"functions": [
|
||||
{
|
||||
"name": f.name,
|
||||
"start_line": f.start_line,
|
||||
"end_line": f.end_line,
|
||||
"parameters": f.parameters,
|
||||
"return_type": f.return_type,
|
||||
"is_method": f.is_method,
|
||||
"class_name": f.class_name,
|
||||
}
|
||||
for f in extracted.functions
|
||||
],
|
||||
"classes": [
|
||||
{
|
||||
"name": c.name,
|
||||
"start_line": c.start_line,
|
||||
"end_line": c.end_line,
|
||||
"methods": [m.name for m in c.methods],
|
||||
"base_classes": c.base_classes,
|
||||
}
|
||||
for c in extracted.classes
|
||||
],
|
||||
"complexity": complexity_data.get(str(extracted.file_path), "unknown"),
|
||||
}
|
||||
file_summaries.append(file_summary)
|
||||
|
||||
dependencies: dict[str, list[str]] = {}
|
||||
for dep in dependency_data.get("dependencies", []):
|
||||
source = str(dep.source)
|
||||
target = str(dep.target)
|
||||
if source not in dependencies:
|
||||
dependencies[source] = []
|
||||
dependencies[source].append(target)
|
||||
|
||||
summary = CodeSummary(
|
||||
timestamp=datetime.utcnow().isoformat() + "Z",
|
||||
version=self.version,
|
||||
directory=str(file_paths[0].parent) if file_paths else "",
|
||||
file_count=len(file_summaries),
|
||||
language_breakdown=language_counts,
|
||||
files=file_summaries,
|
||||
dependencies=dependencies,
|
||||
metrics={
|
||||
"total_functions": sum(len(f.functions) for f in extracted_files),
|
||||
"total_classes": sum(len(f.classes) for f in extracted_files),
|
||||
"cycles_found": len(dependency_data.get("cycles", [])),
|
||||
"orphaned_files": len(dependency_data.get("orphaned", [])),
|
||||
},
|
||||
)
|
||||
|
||||
result = asdict(summary)
|
||||
|
||||
if output_path:
|
||||
output_path.write_text(json.dumps(result, indent=2), encoding="utf-8")
|
||||
|
||||
return json.dumps(result, indent=2)
|
||||
Reference in New Issue
Block a user