134 lines
3.4 KiB
Python
134 lines
3.4 KiB
Python
"""Example: Export UCC-style extended metrics to CSV.
|
|
|
|
This demonstrates how to use the extended counting features
|
|
to produce UCC-compatible reports.
|
|
"""
|
|
|
|
from pathlib import Path
|
|
import csv
|
|
from typing import List, Dict, Any
|
|
|
|
from pyucc.core.ucc_extended_counting import (
|
|
analyze_file_ucc_style,
|
|
format_ucc_table_header,
|
|
format_ucc_table_line,
|
|
)
|
|
|
|
|
|
def export_ucc_extended_csv(files: List[Path], output_path: Path):
|
|
"""
|
|
Export extended UCC-style metrics to CSV.
|
|
|
|
Args:
|
|
files: List of source files to analyze
|
|
output_path: Output CSV file path
|
|
"""
|
|
|
|
results = []
|
|
|
|
print(f"Analyzing {len(files)} files...")
|
|
for i, file_path in enumerate(files, 1):
|
|
if i % 10 == 0:
|
|
print(f" Progress: {i}/{len(files)}")
|
|
|
|
try:
|
|
result = analyze_file_ucc_style(file_path)
|
|
result["name"] = file_path.name
|
|
result["path"] = str(file_path)
|
|
results.append(result)
|
|
except Exception as e:
|
|
print(f" Error analyzing {file_path}: {e}")
|
|
|
|
# Write to CSV
|
|
fieldnames = [
|
|
"name",
|
|
"path",
|
|
"total_lines",
|
|
"blank_lines",
|
|
"comment_whole",
|
|
"comment_embedded",
|
|
"compiler_directives",
|
|
"data_declarations",
|
|
"exec_instructions",
|
|
"logical_sloc",
|
|
"physical_sloc",
|
|
"language",
|
|
]
|
|
|
|
with open(output_path, "w", newline="", encoding="utf-8") as f:
|
|
writer = csv.DictWriter(f, fieldnames=fieldnames)
|
|
writer.writeheader()
|
|
writer.writerows(results)
|
|
|
|
print(f"\n✅ Exported to: {output_path}")
|
|
|
|
# Print summary in UCC format
|
|
print("\n" + "=" * 100)
|
|
print("UCC-Style Summary:")
|
|
print(format_ucc_table_header())
|
|
|
|
for result in results[:10]: # Show first 10
|
|
print(format_ucc_table_line(result))
|
|
|
|
if len(results) > 10:
|
|
print(f"... ({len(results) - 10} more files)")
|
|
|
|
# Print totals
|
|
totals = calculate_totals(results)
|
|
print("-" * 100)
|
|
print(format_ucc_table_line(totals, "TOTAL"))
|
|
|
|
|
|
def calculate_totals(results: List[Dict[str, Any]]) -> Dict[str, Any]:
|
|
"""Calculate aggregate totals across all files."""
|
|
|
|
totals = {
|
|
"total_lines": 0,
|
|
"blank_lines": 0,
|
|
"comment_whole": 0,
|
|
"comment_embedded": 0,
|
|
"compiler_directives": 0,
|
|
"data_declarations": 0,
|
|
"exec_instructions": 0,
|
|
"logical_sloc": 0,
|
|
"physical_sloc": 0,
|
|
"file": "TOTAL",
|
|
}
|
|
|
|
for result in results:
|
|
for key in totals:
|
|
if key != "file":
|
|
totals[key] += result.get(key, 0)
|
|
|
|
return totals
|
|
|
|
|
|
def demo_extended_counting():
|
|
"""Demo the extended counting on test files."""
|
|
|
|
# Find some C/C++ files to analyze
|
|
test_dir = Path(r"C:\__temp\Metrics\attuale\REP\Projects\DSP")
|
|
|
|
if not test_dir.exists():
|
|
print("⚠️ Test directory not found. Using current directory...")
|
|
test_dir = Path.cwd() / "pyucc"
|
|
|
|
# Collect files
|
|
files = []
|
|
for pattern in ["**/*.c", "**/*.cpp", "**/*.h"]:
|
|
files.extend(list(test_dir.glob(pattern))[:20]) # Limit to 20 files
|
|
|
|
if not files:
|
|
print("No C/C++ files found to analyze.")
|
|
return
|
|
|
|
print(f"Found {len(files)} files to analyze")
|
|
|
|
# Export
|
|
output_path = Path("ucc_extended_output.csv")
|
|
export_ucc_extended_csv(files, output_path)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
demo_extended_counting()
|