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