Skip to main content

Module coverage

Module coverage 

Source
Expand description

Coverage rule (Python — issue #26; TypeScript — issue #31; exemptions — issue #32).

Enforces the README’s Coverage rule: a library’s unit suite must meet the configured floor, with test files excluded from the denominator. This module is the deterministic core — given a parsed coverage report and the thresholds from config, an evaluate function decides pass/fail. Producing the report (shelling out to the language’s coverage tool) is a thin layer on top, kept separate so the guarantee is testable without that toolchain installed.

Python (#26) uses coverage.py: a single total, branch coverage on. Given a CoverageReport and Thresholds, evaluate decides pass/fail, and measure shells out to coverage. TypeScript (#31) is the twin: vitest reports four independent metrics (lines / branches / functions / statements), so it carries its own TypeScriptThresholds, VitestReport, and evaluate_typescript / measure_typescript pair — sharing only the Outcome type. Its subprocess layer shells out to vitest.

Files exempted from coverage in config (issue #32) are omitted from the denominator alongside the test files; the caller resolves them (crate::config::resolve_exempt) and passes their paths to measure / measure_typescript.

Structs§

Baseline
The committed coverage baseline — the last recorded coverage per language. Keyed by language so one file serves a multi-language repo; a language with no entry has no ratchet (the floor still applies). The TypeScript and Rust keys land with their slices.
CoverageReport
A coverage.py JSON report (coverage json), pared to what the checks need: the totals (the floor and ratchet) and the per-file files block (patch coverage, #132). Unmodeled fields (metadata, per-function/class data) are ignored.
FileCoverage
Per-file coverage detail from a coverage.py report (one files entry) — what patch coverage (#132) reads to decide whether a changed line is covered. Unmodeled fields (the summary, per-function/class data) are ignored.
PythonBaseline
The recorded Python baseline: the last total percent the unit suite cleared.
Thresholds
The coverage floor to enforce, from a [<language>].coverage table.
Totals
The totals block of a coverage.py report.
TypeScriptThresholds
The four vitest coverage floors, from a [typescript].coverage table. Each is an independent percent the unit suite must meet — vitest measures all four.
VitestMetric
One metric’s totals from a vitest json-summary block, pared to what the check needs: the covered percent and the denominator size.
VitestReport
A vitest coverage-summary.json report, pared to the total block the check needs. Per-file entries and unmodeled fields are ignored.
VitestTotals
The total block of a vitest json-summary report — the four metrics this rule enforces. vitest also emits branchesTrue, which the check ignores.

Enums§

Outcome
The result of checking a report against the thresholds.

Constants§

BASELINE_PATH
Where the committed coverage baseline lives, relative to the scanned root — beside the measured tree, the way --config resolves alongside it.

Functions§

evaluate
Decide whether report meets thresholds.
evaluate_ratchet
Decide whether percent regresses below baseline, the recorded total the suite must not drop under. None (nothing recorded) is no ratchet → Outcome::Pass. Carries the same hair of float tolerance as evaluate so a percent that rounds to the baseline isn’t failed by noise.
evaluate_typescript
Decide whether report meets every threshold in thresholds.
measure
Run the unit suite under coverage.py in root and check it against thresholds.
measure_patch_report
Run the Python unit suite under coverage.py in root with every source under root measured (coverage run --source=.) and return the parsed report — so an untested source shows in the files block as wholly uncovered rather than vanishing. The per-file detail is what patch coverage (#132) reads; omit is as in measure (an exempt file stays out of the run, so its changed lines are lifted).
measure_patch_typescript
Run the TypeScript unit suite under vitest in root and return the uncovered lines per file — keyed by the absolute path vitest reports, the caller re-keying to root-relative to match the diff. A line is uncovered when it carries a statement the suite never executed, or the source of a branch a path of which the suite never took (the v8 analogue of the Python arm’s missing line / missing branch). exclude is the coverage-rule exemptions, dropped from the run so an exempt file’s changed lines are lifted. npx resolves the project-local vitest, so it and @vitest/coverage-v8 must be installed under root.
measure_report
Run the Python unit suite under coverage.py in root and return the parsed report — the totals the floor (evaluate) and the ratchet (evaluate_ratchet) both read. omit is as in measure.
measure_typescript
Run the unit suite under vitest coverage in root and check it against thresholds.
parse_report
Parse a coverage.py JSON report (the output of coverage json).
parse_vitest_report
Parse a vitest json-summary report (coverage-summary.json).
read_baseline
Read the committed baseline at root/BASELINE_PATH, or None when the file is absent — an absent baseline means no ratchet, the same way a missing config means nothing is exempt.