forked from eatvio/eatvio_app
53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
#!/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()
|
|
|