Skip to content

chore(coverage): declare the gate in [tool.coverage.report] and measure only in test-ci - #485

Merged
lesnik512 merged 1 commit into
mainfrom
coverage-gate
Sep 12, 2026
Merged

chore(coverage): declare the gate in [tool.coverage.report] and measure only in test-ci#485
lesnik512 merged 1 commit into
mainfrom
coverage-gate

Conversation

@lesnik512

Copy link
Copy Markdown
Member

Summary

Converges the coverage gate on the modern-python standard, section 5: the 100 % gate is declared once as [tool.coverage.report] fail_under = 100, and coverage is measured only by just test-ci (and test-branch), never on every run through pytest addopts.

pytest-cov reads fail_under from the coverage config when no --cov-fail-under flag is given and applies it whenever coverage is measured, so the gate fires in test-ci exactly as before and a targeted just test run stays gate-free. coverage special-cases 100: the total must really be 100, no rounding.

Changes

  • pyproject.toml: fail_under = 100 under [tool.coverage.report]; any --cov* flags removed from addopts.
  • justfile: test-ci measures coverage and writes the XML report without the flag; test-branch likewise. Where test-ci did not exist it is added, and CI now calls it.
  • .github/workflows/_checks.yml (where present): the pytest step runs just test-ci.

Checklist

  • Lint and format pass (ruff) — config and recipes only
  • Type check passes (ty) — no Python changed
  • Tests pass and new behavior is covered — CI runs just test-ci, which is the gate
  • Build succeeds — no packaging change
  • Repo metadata stays consistent across the three surfaces — untouched

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Details
Benchmark suite Current: 6d16514 Previous: fc39046 Ratio
benchmarks/test_guard_by_type.py::test_g16_resolve_by_type 4393389.3549111495 iter/sec (stddev: 7.208148275236166e-9) 4158761.035219325 iter/sec (stddev: 8.13670554091459e-9) 0.95
benchmarks/test_guard_by_type.py::test_g17_resolve_by_type_large_registry 4376741.5054409 iter/sec (stddev: 6.725767775502434e-9) 3990230.9569556788 iter/sec (stddev: 1.8798908569888113e-8) 0.91
benchmarks/test_guard_cold.py::test_g8_cold_first_resolve 17610.558221663625 iter/sec (stddev: 0.00005830058347627865) 16134.580325706667 iter/sec (stddev: 0.00005046863507128928) 0.92
benchmarks/test_guard_cold.py::test_g8b_cold_first_resolve_cached 15173.48557662349 iter/sec (stddev: 0.0001371587716083082) 13596.70743422707 iter/sec (stddev: 0.00010726566353146992) 0.90
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[1] 542.1437994469555 iter/sec (stddev: 0.00005345765010909475) 553.6127861863322 iter/sec (stddev: 0.0001579069634057032) 1.02
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[2] 504.5277088722932 iter/sec (stddev: 0.0000969406286914811) 488.3466119845556 iter/sec (stddev: 0.00022730325681841844) 0.97
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[4] 456.5763806732935 iter/sec (stddev: 0.00012315294701496608) 459.4334564016916 iter/sec (stddev: 0.000042940089461520866) 1.01
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[1] 1845.9943238434275 iter/sec (stddev: 0.00017457660449678652) 1668.6501354607235 iter/sec (stddev: 0.00018814109746920226) 0.90
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[2] 1478.4284355013854 iter/sec (stddev: 0.00019650832093564283) 1335.316842644818 iter/sec (stddev: 0.00020593009553087613) 0.90
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[4] 1049.7168375711706 iter/sec (stddev: 0.00019719311971386788) 873.4240364302943 iter/sec (stddev: 0.001255961381736033) 0.83
benchmarks/test_guard_lifecycle.py::test_g6_build_child_container 735514.8532260801 iter/sec (stddev: 5.009687619463809e-8) 714209.701967521 iter/sec (stddev: 4.7554942163995425e-8) 0.97
benchmarks/test_guard_lifecycle.py::test_g6b_build_child_container_auto_scope 669271.5720155721 iter/sec (stddev: 3.022329804797654e-8) 675600.7205147323 iter/sec (stddev: 8.590805162615815e-8) 1.01
benchmarks/test_guard_lifecycle.py::test_g7_request_lifecycle_batch 2402.2985751984 iter/sec (stddev: 0.000010474076167779656) 2436.353244730597 iter/sec (stddev: 0.000012183633779711561) 1.01
benchmarks/test_guard_lifecycle.py::test_g7c_event_loop_floor_control 60860.29831257309 iter/sec (stddev: 0.0000014105855205846606) 61846.76391935982 iter/sec (stddev: 0.000001956842012191336) 1.02
benchmarks/test_guard_lifecycle.py::test_g13_teardown_at_scale 48317.92163762849 iter/sec (stddev: 0.0000014926168337825658) 49238.06084820303 iter/sec (stddev: 0.0000020274507454879575) 1.02
benchmarks/test_guard_resolve.py::test_g1_transient_resolve 2466121.5017310646 iter/sec (stddev: 2.4264223464552454e-8) 2494957.37926869 iter/sec (stddev: 2.0738593852462502e-8) 1.01
benchmarks/test_guard_resolve.py::test_g2_cached_resolve 4203052.315448951 iter/sec (stddev: 6.323446569615443e-9) 4192646.2242921055 iter/sec (stddev: 9.242397551818976e-9) 1.00
benchmarks/test_guard_resolve.py::test_g3_deep_chain 850536.1354532214 iter/sec (stddev: 7.219176847087456e-8) 855739.9204431148 iter/sec (stddev: 4.426302771736765e-8) 1.01
benchmarks/test_guard_resolve.py::test_g4_wide_resolve 497678.4668136146 iter/sec (stddev: 3.2662562994842574e-7) 499545.67569668434 iter/sec (stddev: 3.134731071349648e-7) 1.00
benchmarks/test_guard_resolve.py::test_g5_cross_scope 1971031.5521708794 iter/sec (stddev: 2.453177552541404e-8) 1872950.2023283816 iter/sec (stddev: 2.681412062947349e-8) 0.95
benchmarks/test_guard_resolve.py::test_g9_context_resolve 1150528.6046161628 iter/sec (stddev: 1.5682005208967376e-7) 1114981.832487813 iter/sec (stddev: 1.2174079470885297e-7) 0.97
benchmarks/test_guard_resolve.py::test_g12_override_active_resolve 850807.2118489445 iter/sec (stddev: 1.227639266438015e-7) 848681.8867003281 iter/sec (stddev: 1.014716189211694e-7) 1.00
benchmarks/test_guard_resolve.py::test_g18_alias_hop 2975464.321210177 iter/sec (stddev: 7.43441438892879e-9) 2819884.449033468 iter/sec (stddev: 1.3953969227339099e-8) 0.95
benchmarks/test_guard_validate.py::test_g10_validate_deep_chain 24304.657324014453 iter/sec (stddev: 0.0002552970084586549) 24589.945648246317 iter/sec (stddev: 0.000023738884466710817) 1.01
benchmarks/test_guard_validate.py::test_g11_validate_wide 16396.02056119977 iter/sec (stddev: 0.000026101556284796933) 15316.434942105047 iter/sec (stddev: 0.000024992133312082236) 0.93

This comment was automatically generated by workflow using github-action-benchmark.

@lesnik512
lesnik512 merged commit aa1ad9b into main Sep 12, 2026
10 checks passed
@lesnik512
lesnik512 deleted the coverage-gate branch September 12, 2026 11:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant