"""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()