#!/usr/bin/env python3 import re def analyze_coverage_by_uncovered(): files = {} current_file = None with open('coverage/lcov.info', 'r', encoding='utf-8') as f: lines = f.readlines() i = 0 while i < len(lines): line = lines[i].strip() if line.startswith('SF:'): current_file = line[3:] files[current_file] = {'total': 0, 'covered': 0} i += 1 elif line.startswith('LF:') and current_file: files[current_file]['total'] = int(line[3:]) i += 1 elif line.startswith('LH:') and current_file: files[current_file]['covered'] = int(line[3:]) i += 1 else: i += 1 # Filter out generated files and UI screens/widgets (hard to test) filtered = [] exclude_patterns = ['.g.dart', 'generated', 'l10n.dart', '/pages/', '/widgets/', '_screen.dart', '_widget.dart'] for f, d in files.items(): if d['total'] > 0: # Skip UI files should_exclude = any(pattern in f for pattern in exclude_patterns) if not should_exclude: uncovered = d['total'] - d['covered'] pct = d['covered']/d['total']*100 filtered.append((f, d, uncovered, pct)) # Sort by uncovered lines (most uncovered first) sorted_files = sorted(filtered, key=lambda x: x[2], reverse=True) print('Files sorted by uncovered lines (excluding UI screens/widgets):') print('=' * 100) print(f'{"Uncovered":>10} {"Covered":>8} {"Total":>8} {"%":>7} {"File":<60}') print('=' * 100) for f, d, uncovered, pct in sorted_files[:30]: print(f'{uncovered:>10} {d["covered"]:>8} {d["total"]:>8} {pct:>6.1f}% {f}') if __name__ == '__main__': analyze_coverage_by_uncovered()