128 lines
3.4 KiB
Python
128 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()
|