Skip to content

feat(toolchain): allow using the extracted coverage wheel as the coverage_tool - #4433

Draft
aignas wants to merge 16 commits into
bazel-contrib:mainfrom
aignas:aignas.feat.coverage-tool-py-library
Draft

aignas wants to merge 16 commits into
bazel-contrib:mainfrom
aignas:aignas.feat.coverage-tool-py-library

Conversation

@aignas

@aignas aignas commented Nov 8, 2026 •

Copy link
Copy Markdown
Collaborator

Allow py_runtime.coverage_tool to be a target with many files, as long as one
of them is coverage/__main__.py, such as the extracted coverage wheel from a
pip.parse hub: @pypi//coverage:extracted_whl_files.

Before this change the coverage_tool had to produce a single file or be
executable, so using the coverage version locked in the requirements needed a
custom wrapper rule. Now the coverage/__main__.py file is used as the entry
point and all of the files are added to the test runfiles. The bootstrap already
imports coverage from the parent directory of the entry point, so the
site-packages layout of the PyPI hub repositories works as is.

@pypi//coverage itself cannot be used: the py_library depends on the Python
toolchain, so using it as the coverage tool of the toolchain creates a
dependency cycle. The docs call this out.

To test this end to end, coverage is added to the dev dependencies and a
3.13 toolchain uses @dev_pip//coverage:extracted_whl_files as its coverage
tool. //tests/coverage:coverage_from_pypi_test runs the same coverage
collection checks as for the bundled coverage tool.

Stacked on #4417, which adds the coverage collection tests.

Work towards #3902

…ge tool

Before this change the coverage collection was only exercised by running
`bazel coverage` on a few targets in CI and the collected data was not
checked.

This adds a test that runs as part of `bazel test`. A `py_reconfig_test` is
built with `--collect_code_coverage` for a Python 3.12 toolchain that has the
bundled coverage tool configured, and `coverage_collection_test` runs it with
the same environment variables that `bazel coverage` sets and checks the line
coverage in the produced lcov file.

* Adds the `collect_code_coverage` attribute to `py_reconfig_*` rules.
* Configures the bundled coverage tool for the Python 3.12 dev toolchain.

Stacked on bazel-contrib#4415.

Work towards bazel-contrib#3902
Registering the toolchain with the `3.12` minor version made it take
precedence over the `3.12.16` toolchain that //tests/toolchains expects.
…ests

Run the instrumented program once and check the line and branch coverage
of particular lines in separate tests.
Allow py_runtime.coverage_tool to be a py_library of coverage.py, such as
@pypi//coverage, by using its coverage/__main__.py file as the entry
point. This allows users to use the coverage version that is locked in
their requirements.
@aignas

aignas commented Nov 8, 2026

Copy link
Copy Markdown
Collaborator Author

This PR was drafted by an AI coding agent (Claude Code) working for @aignas as part of the plan in #3902. It stays a draft until @aignas has reviewed it. Review comments will be handled by @aignas, possibly with the help of the agent; any agent-written replies will be marked as such.

Agent-generated comment, posted automatically on behalf of the user.

A py_library depends on the Python toolchain, so using @pypi//coverage
as the coverage_tool of the toolchain creates a dependency cycle. Instead
find the coverage/__main__.py entry point in the files of the target, so
that @pypi//coverage:extracted_whl_files can be used.
@aignas aignas changed the title feat(toolchain): allow using a py_library as the coverage_tool feat(toolchain): allow using the extracted coverage wheel as the coverage_tool Nov 8, 2026
aignas added 11 commits November 8, 2026 12:54
It is used to test the coverage collection with the coverage tool from a
PyPI hub.
…p hub

Configure a 3.13 toolchain with the extracted coverage wheel from the
dev_pip hub as the coverage tool and run the same coverage collection
checks as for the bundled coverage tool.
Use TEST_TMPDIR directly and rely on the test working directory being the
workspace runfiles directory.
Also drop the lib.py data dependency, which is already in the runfiles via
the instrumented target.
Also test the error for a coverage_tool without coverage/__main__.py and
name the news entry after the PR.

This branch has not been deployed

No deployments
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