"""Coverage measurement using Python coverage API (avoids CLI issues)""" import sys, os, glob # Start coverage import coverage cov = coverage.Coverage(omit=["test-data/*", "__pycache__/*", "tests/*", "coverage_report/*"]) cov.start() # Import ALL production modules first modules = [] for root, dirs, files in os.walk("."): if "__pycache__" in root or "test-data" in root or ".git" in root or "coverage_report" in root: continue for f in files: if f.endswith(".py") and not f.startswith("test_"): path = os.path.join(root, f).replace("\\", "/")[2:].replace("/", ".").replace(".py", "") try: __import__(path) modules.append(path) except Exception as e: pass print(f"Pre-loaded {len(modules)} modules") # Import and run test routines def run_test(path): try: with open(path, encoding="utf-8-sig") as f: exec(compile(open(path, encoding="utf-8-sig").read(), path, 'exec'), {}) return True except SystemExit: return True except Exception as e: print(f" FAIL {path}: {e}") return False # Run test files tests = [ "test-data/round2_remaining_tests.py", "test-data/round3_deep_coverage.py", "test-data/r4_deep_coverage.py", "test-data/r4_design_coverage.py", "test-data/r4_cond_coverage.py", "test-data/r4_coverage_coverage.py", "test-data/r5_integration_coverage.py", "test-data/r6_deep_coverage.py", "test-data/r7_final_deep.py", "test-data/r8_env_coverage.py", "test-data/r9_deep_coverage.py", "test-data/r10_pipeline_agent.py", "test-data/r11_real_verification.py", "test-data/r12_real_cobol_pipeline.py", "test-data/r12b_orchestrator_e2e.py", "test-data/r13_final_sweep.py", ] print("Running tests...") for t in tests: sys.stdout.flush() run_test(t) sys.stdout.flush() # Stop coverage cov.stop() cov.save() # Generate report print("\n" + "=" * 70) print("COVERAGE REPORT (line coverage)") print("=" * 70) total = cov.report(show_missing=True, file=sys.stdout) # Find files with < 50% coverage print("\n" + "=" * 70) print("FILES WITH < 50% COVERAGE") print("=" * 70) data = cov.get_data() low_coverage = [] for f in data.measured_files(): if "test-data" in f or "__pycache__" in f or ".git" in f or "coverage_report" in f: continue try: analysis = cov._analyze(cov._get_file_reporter(f)) total = analysis.numbers.n_statements executed = analysis.numbers.n_executed if total > 0 and executed / total < 0.5: low_coverage.append((f, executed, total, executed/total*100)) except: pass low_coverage.sort(key=lambda x: x[3]) for f, e, t, p in low_coverage[:30]: print(f" {f:55s} {e:4d}/{t:4d} ({p:.0f}%)") # Generate HTML cov.html_report(directory="coverage_report") print(f"\nHTML report: coverage_report/index.html")