blob: 5473dc529f66b8992bb4ee2b843eceafa927ddf9 [file] [log] [blame] [view]
:::{default-domain} bzl
:::
# rules_python Changelog
This is a human-friendly changelog in a keepachangelog.com style format.
Because this changelog is for end-user consumption of meaningful changes,only
a summary of a release's changes is described. This means every commit is not
necessarily mentioned, and internal refactors or code cleanups are omitted
unless they're particularly notable.
A brief description of the categories of changes:
* `Changed`: Some behavior changed. If the change is expected to break a
public API or supported behavior, it will be marked as **BREAKING**. Note that
beta APIs will not have breaking API changes called out.
* `Fixed`: A bug, or otherwise incorrect behavior, was fixed.
* `Added`: A new feature, API, or behavior was added in a backwards compatible
manner.
* Particular sub-systems are identified using parentheses, e.g. `(bzlmod)` or
`(docs)`.
## Unreleased
[x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/x.x.x
### Changed
* (toolchains) `py_runtime.implementation_name` now defaults to `cpython`
(previously it defaulted to None).
### Fixed
* (bzlmod) The `python.override(minor_mapping)` now merges the default and the
overridden versions ensuring that the resultant `minor_mapping` will always
have all of the python versions.
* (bzlmod) The default value for the {obj}`--python_version` flag will now be
always set to the default python toolchain version value.
* (bzlmod) correctly wire the {attr}`pip.parse.extra_pip_args` all the
way to {obj}`whl_library`. What is more we will pass the `extra_pip_args` to
{obj}`whl_library` for `sdist` distributions when using
{attr}`pip.parse.experimental_index_url`. See
[#2239](https://github.com/bazelbuild/rules_python/issues/2239).
* (whl_filegroup): Provide per default also the `RECORD` file
* (py_wheel): `RECORD` file entry elements are now quoted if necessary when a
wheel is created
* (whl_library) truncate progress messages from the repo rule to better handle
case where a requirement has many `--hash=sha256:...` flags
* (rules) `compile_pip_requirements` passes `env` to the `X.update` target (and
not only to the `X_test` target, a bug introduced in
[#1067](https://github.com/bazelbuild/rules_python/pull/1067)).
* (bzlmod) In hybrid bzlmod with WORKSPACE builds,
`python_register_toolchains(register_toolchains=True)` is respected
([#1675](https://github.com/bazelbuild/rules_python/issues/1675)).
### Added
* (py_wheel) Now supports `compress = (True|False)` to allow disabling
compression to speed up development.
* (toolchains): A public `//python/config_settings:python_version_major_minor` has
been exposed for users to be able to match on the `X.Y` version of a Python
interpreter.
* (api) Added {obj}`merge_py_infos()` so user rules can merge and propagate
`PyInfo` without losing information.
* (toolchains) New Python versions available: 3.13.0 using the [20241008] release.
* (toolchains): Bump default toolchain versions to:
* `3.8 -> 3.8.20`
* `3.9 -> 3.9.20`
* `3.10 -> 3.10.15`
* `3.11 -> 3.11.10`
* `3.12 -> 3.12.7`
[20241008]: https://github.com/indygreg/python-build-standalone/releases/tag/20241008
* (coverage) Add support for python 3.13 and bump `coverage.py` to 7.6.1.
* (bzlmod) Add support for `download_only` flag to disable usage of `sdists`
when {bzl:attr}`pip.parse.experimental_index_url` is set.
### Removed
* Nothing yet
## [0.36.0] - 2024-09-24
[0.36.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.36.0
### Changed
* (gazelle): Update error messages when unable to resolve a dependency to be more human-friendly.
* (flags) The {obj}`--python_version` flag now also returns
{obj}`config_common.FeatureFlagInfo`.
* (toolchain): The toolchain patches now expose the `patch_strip` attribute
that one should use when patching toolchains. Please set it if you are
patching python interpreter. In the next release the default will be set to
`0` which better reflects the defaults used in public `bazel` APIs.
* (toolchains) When {obj}`py_runtime.interpreter_version_info` isn't specified,
the {obj}`--python_version` flag will determine the value. This allows
specifying the build-time Python version for the
{obj}`runtime_env_toolchains`.
* (toolchains) {obj}`py_cc_toolchain.libs` and {obj}`PyCcToolchainInfo.libs` is
optional. This is to support situations where only the Python headers are
available.
* (bazel) Minimum bazel 7 version that we test against has been bumped to `7.1`.
### Fixed
* (whl_library): Remove `--no-index` and add `--no-build-isolation` to the
`pip install` command when installing a wheel from a local file, which happens
when `experimental_index_url` flag is used.
* (bzlmod) get the path to the host python interpreter in a way that results in
platform non-dependent hashes in the lock file when the requirement markers need
to be evaluated.
* (bzlmod) correctly watch sources used for evaluating requirement markers for
any changes so that the repository rule or module extensions can be
re-evaluated when the said files change.
* (gazelle): Fix incorrect use of `t.Fatal`/`t.Fatalf` in tests.
* (toolchain) Omit third-party python packages from coverage reports from
stage2 bootstrap template.
* (bzlmod) Properly handle relative path URLs in parse_simpleapi_html.bzl
* (gazelle) Correctly resolve deps that have top-level module overlap with a gazelle_python.yaml dep module
* (rules) Make `RUNFILES_MANIFEST_FILE`-based invocations work when used with
{obj}`--bootstrap_impl=script`. This fixes invocations using non-sandboxed
test execution with `--enable_runfiles=false --build_runfile_manifests=true`.
([#2186](https://github.com/bazelbuild/rules_python/issues/2186)).
* (py_wheel) Fix incorrectly generated `Required-Dist` when specifying requirements with markers
in extra_requires in py_wheel rule.
* (rules) Prevent pytest from trying run the generated stage2
bootstrap .py file when using {obj}`--bootstrap_impl=script`
* (toolchain) The {bzl:obj}`gen_python_config_settings` has been fixed to include
the flag_values from the platform definitions.
### Added
* (bzlmod): Toolchain overrides can now be done using the new
{bzl:obj}`python.override`, {bzl:obj}`python.single_version_override` and
{bzl:obj}`python.single_version_platform_override` tag classes.
See [#2081](https://github.com/bazelbuild/rules_python/issues/2081).
* (rules) Executables provide {obj}`PyExecutableInfo`, which contains
executable-specific information useful for packaging an executable or
or deriving a new one from the original.
* (py_wheel) Removed use of bash to avoid failures on Windows machines which do not
have it installed.
* (docs) Automatically generated documentation for {bzl:obj}`python_register_toolchains`
and related symbols.
* (toolchains) Added {attr}`python_repository.patch_strip` attribute for
allowing values that are other than `1`, which has been hard-coded up until
now. If you are relying on the undocumented `patches` support in
`TOOL_VERSIONS` for registering patched toolchains please consider setting
the `patch_strip` explicitly to `1` if you depend on this value - in the
future the value may change to default to `0`.
* (toolchains) Added `//python:none`, a special target for use with
{obj}`py_exec_tools_toolchain.exec_interpreter` to treat the value as `None`.
### Removed
* (toolchains): Removed accidentally exposed `http_archive` symbol from
`python/repositories.bzl`.
* (toolchains): An internal _is_python_config_setting_ macro has been removed.
## [0.35.0] - 2024-08-15
[0.35.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.35.0
### Changed
* (whl_library) A better log message when the wheel is built from an sdist or
when the wheel is downloaded using `download_only` feature to aid debugging.
* (gazelle): Simplify and make gazelle_python.yaml have only top level package name.
It would work well in cases to reduce merge conflicts.
* (toolchains): Change some old toochain versions to use [20240726] release to
include dependency updates `3.8.19`, `3.9.19`, `3.10.14`, `3.11.9`
* (toolchains): Bump default toolchain versions to:
* `3.12 -> 3.12.4`
* (rules) `PYTHONSAFEPATH` is inherited from the calling environment to allow
disabling it (Requires {obj}`--bootstrap_impl=script`)
([#2060](https://github.com/bazelbuild/rules_python/issues/2060)).
### Fixed
* (rules) `compile_pip_requirements` now sets the `USERPROFILE` env variable on
Windows to work around an issue where `setuptools` fails to locate the user's
home directory.
* (rules) correctly handle absolute URLs in parse_simpleapi_html.bzl.
* (rules) Fixes build targets linking against `@rules_python//python/cc:current_py_cc_libs`
in host platform builds on macOS, by editing the `LC_ID_DYLIB` field of the hermetic interpreter's
`libpython3.x.dylib` using `install_name_tool`, setting it to its absolute path under Bazel's
execroot.
* (rules) Signals are properly received when using {obj}`--bootstrap_impl=script`
(for non-zip builds).
([#2043](https://github.com/bazelbuild/rules_python/issues/2043))
* (rules) Fixes Python builds when the `--build_python_zip` is set to `false` on
Windows. See [#1840](https://github.com/bazelbuild/rules_python/issues/1840).
* (rules) Fixes Mac + `--build_python_zip` + {obj}`--bootstrap_impl=script`
([#2030](https://github.com/bazelbuild/rules_python/issues/2030)).
* (rules) User dependencies come before runtime site-packages when using
{obj}`--bootstrap_impl=script`.
([#2064](https://github.com/bazelbuild/rules_python/issues/2064)).
* (rules) Version-aware rules now return both `@_builtins` and `@rules_python`
providers instead of only one.
([#2114](https://github.com/bazelbuild/rules_python/issues/2114)).
* (pip) Fixed pypi parse_simpleapi_html function for feeds with package metadata
containing ">" sign
* (toolchains) Added missing executable permission to
`//python/runtime_env_toolchains` interpreter script so that it is runnable.
([#2085](https://github.com/bazelbuild/rules_python/issues/2085)).
* (pip) Correctly use the `sdist` downloaded by the bazel downloader when using
`experimental_index_url` feature. Fixes
[#2091](https://github.com/bazelbuild/rules_python/issues/2090).
* (gazelle) Make `gazelle_python_manifest.update` manual to avoid unnecessary
network behavior.
* (bzlmod): The conflicting toolchains during `python` extension will no longer
cause warnings by default. In order to see the warnings for diagnostic purposes
set the env var `RULES_PYTHON_REPO_DEBUG_VERBOSITY` to one of `INFO`, `DEBUG` or `TRACE`.
Fixes [#1818](https://github.com/bazelbuild/rules_python/issues/1818).
* (runfiles) Make runfiles lookups work for the situation of Bazel 7,
Python 3.9 (or earlier, where safepath isn't present), and the Rlocation call
in the same directory as the main file.
Fixes [#1631](https://github.com/bazelbuild/rules_python/issues/1631).
### Added
* (rules) `compile_pip_requirements` supports multiple requirements input files as `srcs`.
* (rules) `PYTHONSAFEPATH` is inherited from the calling environment to allow
disabling it (Requires {obj}`--bootstrap_impl=script`)
([#2060](https://github.com/bazelbuild/rules_python/issues/2060)).
* (gazelle) Added `python_generation_mode_per_package_require_test_entry_point`
in order to better accommodate users who use a custom macro,
[`pytest-bazel`][pytest_bazel], [rules_python_pytest] or `rules_py`
[py_test_main] in order to integrate with `pytest`. Currently the default
flag value is set to `true` for backwards compatible behaviour, but in the
future the flag will be flipped be `false` by default.
* (toolchains) New Python versions available: `3.12.4` using the [20240726] release.
* (pypi) Support env markers in requirements files. Note, that this means that
if your requirements files contain env markers, the Python interpreter will
need to be run during bzlmod phase to evaluate them. This may incur
downloading an interpreter (for hermetic-based builds) or cause non-hermetic
behavior (if using a system Python).
[rules_python_pytest]: https://github.com/caseyduquettesc/rules_python_pytest
[py_test_main]: https://docs.aspect.build/rulesets/aspect_rules_py/docs/rules/#py_pytest_main
[pytest_bazel]: https://pypi.org/project/pytest-bazel
[20240726]: https://github.com/indygreg/python-build-standalone/releases/tag/20240726
## [0.34.0] - 2024-07-04
[0.34.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.34.0
### Changed
* `protobuf`/`com_google_protobuf` dependency bumped to `v24.4`
* (bzlmod): optimize the creation of config settings used in pip to
reduce the total number of targets in the hub repo.
* (toolchains) The exec tools toolchain now finds its interpreter by reusing
the regular interpreter toolchain. This avoids having to duplicate specifying
where the runtime for the exec tools toolchain is.
* (toolchains) ({obj}`//python:autodetecting_toolchain`) is deprecated. It is
replaced by {obj}`//python/runtime_env_toolchains:all`. The old target will be
removed in a future release.
### Fixed
* (bzlmod): When using `experimental_index_url` the `all_requirements`,
`all_whl_requirements` and `all_data_requirements` will now only include
common packages that are available on all target platforms. This is to ensure
that packages that are only present for some platforms are pulled only via
the `deps` of the materialized `py_library`. If you would like to include
platform specific packages, using a `select` statement with references to the
specific package will still work (e.g.
```
my_attr = all_requirements + select(
{
"@platforms//os:linux": ["@pypi//foo_available_only_on_linux"],
"//conditions:default": [],
}
)
```
* (bzlmod): Targets in `all_requirements` now use the same form as targets returned by the `requirement` macro.
* (rules) Auto exec groups are enabled. This allows actions run by the rules,
such as precompiling, to pick an execution platform separately from what
other toolchains support.
* (providers) {obj}`PyRuntimeInfo` doesn't require passing the
`interpreter_version_info` arg.
* (bzlmod) Correctly pass `isolated`, `quiet` and `timeout` values to `whl_library`
and drop the defaults from the lock file.
* (whl_library) Correctly handle arch-specific dependencies when we encounter a
platform specific wheel and use `experimental_target_platforms`.
Fixes [#1996](https://github.com/bazelbuild/rules_python/issues/1996).
* (rules) The first element of the default outputs is now the executable again.
* (pip) Fixed crash when pypi packages lacked a sha (e.g. yanked packages)
### Added
* (toolchains) {obj}`//python/runtime_env_toolchains:all`, which is a drop-in
replacement for the "autodetecting" toolchain.
* (gazelle) Added new `python_label_convention` and `python_label_normalization` directives. These directive
allows altering default Gazelle label format to third-party dependencies useful for re-using Gazelle plugin
with other rules, including `rules_pycross`. See [#1939](https://github.com/bazelbuild/rules_python/issues/1939).
### Removed
* (pip): Removes the `entrypoint` macro that was replaced by `py_console_script_binary` in 0.26.0.
## [0.33.2] - 2024-06-13
[0.33.2]: https://github.com/bazelbuild/rules_python/releases/tag/0.33.2
### Fixed
* (toolchains) The {obj}`exec_tools_toolchain_type` is disabled by default.
To enable it, set {obj}`--//python/config_settings:exec_tools_toolchain=enabled`.
This toolchain must be enabled for precompilation to work. This toolchain will
be enabled by default in a future release.
Fixes [#1967](https://github.com/bazelbuild/rules_python/issues/1967).
## [0.33.1] - 2024-06-13
[0.33.1]: https://github.com/bazelbuild/rules_python/releases/tag/0.33.1
### Fixed
* (py_binary) Fix building of zip file when using `--build_python_zip`
argument. Fixes [#1954](https://github.com/bazelbuild/rules_python/issues/1954).
## [0.33.0] - 2024-06-12
[0.33.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.33.0
### Changed
* (deps) Upgrade the `pip_install` dependencies to pick up a new version of pip.
* (toolchains) Optional toolchain dependency: `py_binary`, `py_test`, and
`py_library` now depend on the `//python:exec_tools_toolchain_type` for build
tools.
* (deps): Bumped `bazel_skylib` to 1.6.1.
* (bzlmod): The `python` and internal `rules_python` extensions have been
marked as `reproducible` and will not include any lock file entries from now
on.
* (gazelle): Remove gazelle plugin's python deps and make it hermetic.
Introduced a new Go-based helper leveraging tree-sitter for syntax analysis.
Implemented the use of `pypi/stdlib-list` for standard library module verification.
* (pip.parse): Do not ignore yanked packages when using `experimental_index_url`.
This is to mimic what `uv` is doing. We will print a warning instead.
* (pip.parse): Add references to all supported wheels when using `experimental_index_url`
to allowing to correctly fetch the wheels for the right platform. See the
updated docs on how to use the feature. This is work towards addressing
[#735](https://github.com/bazelbuild/rules_python/issues/735) and
[#260](https://github.com/bazelbuild/rules_python/issues/260). The spoke
repository names when using this flag will have a structure of
`{pip_hub_prefix}_{wheel_name}_{py_tag}_{abi_tag}_{platform_tag}_{sha256}`,
which is an implementation detail which should not be relied on and is there
purely for better debugging experience.
* (bzlmod) The `pythons_hub//:interpreters.bzl` no longer has platform-specific
labels which where left there for compatibility reasons. Move to
`python_{version}_host` keys if you would like to have access to a Python
interpreter that can be used in a repository rule context.
### Fixed
* (gazelle) Remove `visibility` from `NonEmptyAttr`.
Now empty(have no `deps/main/srcs/imports` attr) `py_library/test/binary` rules will
be automatically deleted correctly. For example, if `python_generation_mode`
is set to package, when `__init__.py` is deleted, the `py_library` generated
for this package before will be deleted automatically.
* (whl_library): Use _is_python_config_setting_ to correctly handle multi-python
version dependency select statements when the `experimental_target_platforms`
includes the Python ABI. The default python version case within the select is
also now handled correctly, stabilizing the implementation.
* (gazelle) Fix Gazelle failing on Windows with
"panic: runtime error: invalid memory address or nil pointer dereference"
* (bzlmod) remove `pip.parse(annotations)` attribute as it is unused and has been
replaced by whl_modifications.
* (pip) Correctly select wheels when the python tag includes minor versions.
See ([#1930](https://github.com/bazelbuild/rules_python/issues/1930))
* (pip.parse): The lock file is now reproducible on any host platform if the
`experimental_index_url` is not used by any of the modules in the dependency
chain. To make the lock file identical on each `os` and `arch`, please use
the `experimental_index_url` feature which will fetch metadata from PyPI or a
different private index and write the contents to the lock file. Fixes
[#1643](https://github.com/bazelbuild/rules_python/issues/1643).
* (pip.parse): Install `yanked` packages and print a warning instead of
ignoring them. This better matches the behaviour of `uv pip install`.
* (toolchains): Now matching of the default hermetic toolchain is more robust
and explicit and should fix rare edge-cases where the host toolchain
autodetection would match a different toolchain than expected. This may yield
to toolchain selection failures when the python toolchain is not registered,
but is requested via `//python/config_settings:python_version` flag setting.
* (doc) Fix the `WORKSPACE` requirement vendoring example. Fixes
[#1918](https://github.com/bazelbuild/rules_python/issues/1918).
### Added
* (rules) Precompiling Python source at build time is available. but is
disabled by default, for now. Set
`@rules_python//python/config_settings:precompile=enabled` to enable it
by default. A subsequent release will enable it by default. See the
[Precompiling docs][precompile-docs] and API reference docs for more
information on precompiling. Note this requires Bazel 7+ and the Pystar rule
implementation enabled.
([#1761](https://github.com/bazelbuild/rules_python/issues/1761))
* (rules) Attributes and flags to control precompile behavior: `precompile`,
`precompile_optimize_level`, `precompile_source_retention`,
`precompile_invalidation_mode`, and `pyc_collection`
* (toolchains) The target runtime toolchain (`//python:toolchain_type`) has
two new optional attributes: `pyc_tag` (tells the pyc filename infix to use) and
`implementation_name` (tells the Python implementation name).
* (toolchains) A toolchain type for build tools has been added:
`//python:exec_tools_toolchain_type`.
* (providers) `PyInfo` has two new attributes: `direct_pyc_files` and
`transitive_pyc_files`, which tell the pyc files a target makes available
directly and transitively, respectively.
* `//python:features.bzl` added to allow easy feature-detection in the future.
* (pip) Allow specifying the requirements by (os, arch) and add extra
validations when parsing the inputs. This is a non-breaking change for most
users unless they have been passing multiple `requirements_*` files together
with `extra_pip_args = ["--platform=manylinux_2_4_x86_64"]`, that was an
invalid usage previously but we were not failing the build. From now on this
is explicitly disallowed.
* (toolchains) Added riscv64 platform definition for python toolchains.
* (gazelle) The `python_visibility` directive now supports the `$python_root$`
placeholder, just like the `python_default_visibility` directive does.
* (rules) A new bootstrap implementation that doesn't require a system Python
is available. It can be enabled by setting
{obj}`--@rules_python//python/config_settings:bootstrap_impl=script`. It
will become the default in a subsequent release.
([#691](https://github.com/bazelbuild/rules_python/issues/691))
* (providers) `PyRuntimeInfo` has two new attributes:
{obj}`PyRuntimeInfo.stage2_bootstrap_template` and
{obj}`PyRuntimeInfo.zip_main_template`.
* (toolchains) A replacement for the Bazel-builtn autodetecting toolchain is
available. The `//python:autodetecting_toolchain` alias now uses it.
* (pip): Support fetching and using the wheels for other platforms. This
supports customizing whether the linux wheels are pulled for `musl` or
`glibc`, whether `universal2` or arch-specific MacOS wheels are preferred and
it also allows to select a particular `libc` version. All of this is done via
the `string_flags` in `@rules_python//python/config_settings`. If there are
no wheels that are supported for the target platform, `rules_python` will
fallback onto building the `sdist` from source. This behaviour can be
disabled if desired using one of the available string flags as well.
* (whl_filegroup) Added a new `whl_filegroup` rule to extract files from a wheel file.
This is useful to extract headers for use in a `cc_library`.
[precompile-docs]: /precompiling
## [0.32.2] - 2024-05-14
[0.32.2]: https://github.com/bazelbuild/rules_python/releases/tag/0.32.2
### Fixed
* Workaround existence of infinite symlink loops on case insensitive filesystems when targeting linux platforms with recent Python toolchains. Works around an upstream [issue][indygreg-231]. Fixes [#1800][rules_python_1800].
[indygreg-231]: https://github.com/indygreg/python-build-standalone/issues/231
[rules_python_1800]: https://github.com/bazelbuild/rules_python/issues/1800
## [0.32.0] - 2024-05-12
[0.32.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.32.0
### Changed
* (bzlmod): The `MODULE.bazel.lock` `whl_library` rule attributes are now
sorted in the attributes section. We are also removing values that are not
default in order to reduce the size of the lock file.
* (coverage) Bump `coverage.py` to [7.4.3](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst#version-743--2024-02-23).
* (deps): Bumped `bazel_features` to 1.9.1 to detect optional support
non-blocking downloads.
* (deps): Updated `pip_tools` to >= 7.4.0
* (toolchains): Change some old toolchain versions to use [20240224] release to
include security fixes `3.8.18`, `3.9.18` and `3.10.13`
* (toolchains): Bump default toolchain versions to:
* `3.8 -> 3.8.19`
* `3.9 -> 3.9.19`
* `3.10 -> 3.10.14`
* `3.11 -> 3.11.9`
* `3.12 -> 3.12.3`
### Fixed
* (whl_library): Fix the experimental_target_platforms overriding for platform
specific wheels when the wheels are for any python interpreter version. Fixes
[#1810](https://github.com/bazelbuild/rules_python/issues/1810).
* (whl_library): Stop generating duplicate dependencies when encountering
duplicates in the METADATA. Fixes
[#1873](https://github.com/bazelbuild/rules_python/issues/1873).
* (gazelle) In `project` or `package` generation modes, do not generate `py_test`
rules when there are no test files and do not set `main = "__test__.py"` when
that file doesn't exist.
* (whl_library) The group redirection is only added when the package is part of
the group potentially fixing aspects that want to traverse a `py_library` graph.
Fixes [#1760](https://github.com/bazelbuild/rules_python/issues/1760).
* (bzlmod) Setting a particular micro version for the interpreter and the
`pip.parse` extension is now possible, see the
`examples/pip_parse/MODULE.bazel` for how to do it.
See [#1371](https://github.com/bazelbuild/rules_python/issues/1371).
* (refactor) The pre-commit developer workflow should now pass `isort` and `black`
checks (see [#1674](https://github.com/bazelbuild/rules_python/issues/1674)).
### Added
* (toolchains) Added armv7 platform definition for python toolchains.
* (toolchains) New Python versions available: `3.11.8`, `3.12.2` using the [20240224] release.
* (toolchains) New Python versions available: `3.8.19`, `3.9.19`, `3.10.14`, `3.11.9`, `3.12.3` using
the [20240415] release.
* (gazelle) Added a new `python_visibility` directive to control visibility
of generated targets by appending additional visibility labels.
* (gazelle) Added a new `python_default_visibility` directive to control the
_default_ visibility of generated targets. See the [docs][python_default_visibility]
for details.
* (gazelle) Added a new `python_test_file_pattern` directive. This directive tells
gazelle which python files should be mapped to the `py_test` rule. See the
[original issue][test_file_pattern_issue] and the [docs][test_file_pattern_docs]
for details.
* (wheel) Add support for `data_files` attributes in py_wheel rule
([#1777](https://github.com/bazelbuild/rules_python/issues/1777))
* (py_wheel) `bzlmod` installations now provide a `twine` setup for the default
Python toolchain in `rules_python` for version 3.11.
* (bzlmod) New `experimental_index_url`, `experimental_extra_index_urls` and
`experimental_index_url_overrides` to `pip.parse` for using the bazel
downloader. If you see any issues, report in
[#1357](https://github.com/bazelbuild/rules_python/issues/1357). The URLs for
the whl and sdist files will be written to the lock file. Controlling whether
the downloading of metadata is done in parallel can be done using
`parallel_download` attribute.
* (gazelle) Add a new annotation `include_dep`. Also add documentation for
annotations to `gazelle/README.md`.
* (deps): `rules_python` depends now on `rules_cc` 0.0.9
* (pip_parse): A new flag `use_hub_alias_dependencies` has been added that is going
to become default in the next release. This makes use of `dep_template` flag
in the `whl_library` rule. This also affects the
`experimental_requirement_cycles` feature where the dependencies that are in
a group would be only accessible via the hub repo aliases. If you still
depend on legacy labels instead of the hub repo aliases and you use the
`experimental_requirement_cycles`, now is a good time to migrate.
[python_default_visibility]: gazelle/README.md#directive-python_default_visibility
[test_file_pattern_issue]: https://github.com/bazelbuild/rules_python/issues/1816
[test_file_pattern_docs]: gazelle/README.md#directive-python_test_file_pattern
[20240224]: https://github.com/indygreg/python-build-standalone/releases/tag/20240224.
[20240415]: https://github.com/indygreg/python-build-standalone/releases/tag/20240415.
## [0.31.0] - 2024-02-12
[0.31.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.31.0
### Changed
* For Bazel 7, the core rules and providers are now implemented in rules_python
directly and the rules bundled with Bazel are not used. Bazel 6 and earlier
continue to use the Bazel builtin symbols. Of particular note, this means,
under Bazel 7, the builtin global symbol `PyInfo` is **not** the same as what
is loaded from rules_python. The same is true of `PyRuntimeInfo`.
## [0.30.0] - 2024-02-12
[0.30.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.30.0
### Changed
* (toolchains) Windows hosts always ignore pyc files in the downloaded runtimes.
This fixes issues due to pyc files being created at runtime and affecting the
definition of what files were considered part of the runtime.
* (pip_parse) Added the `envsubst` parameter, which enables environment variable
substitutions in the `extra_pip_args` attribute.
* (pip_repository) Added the `envsubst` parameter, which enables environment
variable substitutions in the `extra_pip_args` attribute.
### Fixed
* (bzlmod) pip.parse now does not fail with an empty `requirements.txt`.
* (py_wheel) Wheels generated by `py_wheel` now preserve executable bits when
being extracted by `installer` and/or `pip`.
* (coverage) During the running of lcov, the stdout/stderr was causing test
failures. By default, suppress output when generating lcov. This can be
overridden by setting 'VERBOSE_COVERAGE'. This change only affect bazel
7.x.x and above.
* (toolchain) Changed the `host_toolchain` to symlink all files to support
Windows host environments without symlink support.
* (PyRuntimeInfo) Switch back to builtin PyRuntimeInfo for Bazel 6.4 and when
pystar is disabled. This fixes an error about `target ... does not have ...
PyRuntimeInfo`.
([#1732](https://github.com/bazelbuild/rules_python/issues/1732))
### Added
* (py_wheel) Added `requires_file` and `extra_requires_files` attributes.
* (whl_library) *experimental_target_platforms* now supports specifying the
Python version explicitly and the output `BUILD.bazel` file will be correct
irrespective of the python interpreter that is generating the file and
extracting the `whl` distribution. Multiple python target version can be
specified and the code generation will generate version specific dependency
closures but that is not yet ready to be used and may break the build if
the default python version is not selected using
`common --@rules_python//python/config_settings:python_version=X.Y.Z`.
* New Python versions available: `3.11.7`, `3.12.1` using
https://github.com/indygreg/python-build-standalone/releases/tag/20240107.
* (toolchain) Allow setting `x.y` as the `python_version` parameter in
the version-aware `py_binary` and `py_test` rules. This allows users to
use the same rule import for testing with specific Python versions and
rely on toolchain configuration and how the latest version takes precedence
if e.g. `3.8` is selected. That also simplifies `.bazelrc` for any users
that set the default `python_version` string flag in that way.
* (toolchain) The runtime's shared libraries (libpython.so et al) can be
accessed using `@rules_python//python/cc:current_py_cc_libs`. This uses
toolchain resolution, so the files are from the same runtime used to run a
target. If you were previously using e.g. `@python_3_11//:libpython`, then
switch to `:current_py_cc_libs` for looser coupling to the underlying runtime
repo implementation.
* (repo rules) The environment variable `RULES_PYTHON_REPO_DEBUG=1` can be
set to make repository rules log detailed information about what they're
up to.
* (coverage) Add support for python 3.12 and bump `coverage.py` to
7.4.1.
## [0.29.0] - 2024-01-22
[0.29.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.29.0
### Changed
* **BREAKING** The deprecated `incompatible_generate_aliases` feature flags
from `pip_parse` and `gazelle` got removed. They had been flipped to `True`
in 0.27.0 release.
* **BREAKING** (wheel) The `incompatible_normalize_name` and
`incompatible_normalize_version` flags have been removed. They had been
flipped to `True` in 0.27.0 release.
* (bzlmod) The pip hub repository now uses the newly introduced config settings
using the `X.Y` python version notation. This improves cross module
interoperability and allows to share wheels built by interpreters using
different patch versions.
### Fixed
* (bzlmod pip.parse) Use a platform-independent reference to the interpreter
pip uses. This reduces (but doesn't eliminate) the amount of
platform-specific content in `MODULE.bazel.lock` files; Follow
[#1643](https://github.com/bazelbuild/rules_python/issues/1643) for removing
platform-specific content in `MODULE.bazel.lock` files.
* (wheel) The stamp variables inside the distribution name are no longer
lower-cased when normalizing under PEP440 conventions.
### Added
* (toolchains) `python_register_toolchains` now also generates a repository
that is suffixed with `_host`, that has a single label `:python` that is a
symlink to the python interpreter for the host platform. The intended use is
mainly in `repository_rule`, which are always run using `host` platform
Python. This means that `WORKSPACE` users can now copy the `requirements.bzl`
file for vendoring as seen in the updated `pip_parse_vendored` example.
* (runfiles) `rules_python.python.runfiles.Runfiles` now has a static `Create`
method to make imports more ergonomic. Users should only need to import the
`Runfiles` object to locate runfiles.
* (toolchains) `PyRuntimeInfo` now includes a `interpreter_version_info` field
that contains the static version information for the given interpreter.
This can be set via `py_runtime` when registering an interpreter toolchain,
and will done automatically for the builtin interpreter versions registered via
`python_register_toolchains`.
Note that this only available on the Starlark implementation of the provider.
* (config_settings) Added `//python/config_settings:is_python_X.Y` config
settings to match on minor Python version. These settings match any `X.Y`
version instead of just an exact `X.Y.Z` version.
## [0.28.0] - 2024-01-07
[0.28.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.28.0
### Changed
* **BREAKING** (pip_install) the deprecated `pip_install` macro and related
items have been removed.
* **BREAKING** Support for Bazel 5 has been officially dropped. This release
was only partially tested with Bazel 5 and may or may not work with Bazel 5.
Subequent versions will no longer be tested under Bazel 5.
* (runfiles) `rules_python.python.runfiles` now directly implements type hints
and drops support for python2 as a result.
* (toolchains) `py_runtime`, `py_runtime_pair`, and `PyRuntimeInfo` now use the
rules_python Starlark implementation, not the one built into Bazel. NOTE: This
only applies to Bazel 6+; Bazel 5 still uses the builtin implementation.
* (pip_parse) The parameter `experimental_requirement_cycles` may be provided a
map of names to lists of requirements which form a dependency
cycle. `pip_parse` will break the cycle for you transparently. This behavior
is also available under bzlmod as
`pip.parse(experimental_requirement_cycles={})`.
* (toolchains) `py_runtime` can now take an executable target. Note: runfiles
from the target are not supported yet.
([#1612](https://github.com/bazelbuild/rules_python/issues/1612))
* (gazelle) When `python_generation_mode` is set to `file`, create one `py_binary`
target for each file with `if __name__ == "__main__"` instead of just one
`py_binary` for the whole module.
* (gazelle) the Gazelle manifest integrity field is now optional. If the
`requirements` argument to `gazelle_python_manifest` is unset, no integrity
field will be generated.
### Fixed
* (gazelle) The gazelle plugin helper was not working with Python toolchains 3.11
and above due to a bug in the helper components not being on PYTHONPATH.
* (pip_parse) The repositories created by `whl_library` can now parse the `whl`
METADATA and generate dependency closures irrespective of the host platform
the generation is executed on. This can be turned on by supplying
`experimental_target_platforms = ["all"]` to the `pip_parse` or the `bzlmod`
equivalent. This may help in cases where fetching wheels for a different
platform using `download_only = True` feature.
* (bzlmod pip.parse) The `pip.parse(python_interpreter)` arg now works for
specifying a local system interpreter.
* (bzlmod pip.parse) Requirements files with duplicate entries for the same
package (e.g. one for the package, one for an extra) now work.
* (bzlmod python.toolchain) Submodules can now (re)register the Python version
that rules_python has set as the default.
([#1638](https://github.com/bazelbuild/rules_python/issues/1638))
* (whl_library) Actually use the provided patches to patch the whl_library.
On Windows the patching may result in files with CRLF line endings, as a result
the RECORD file consistency requirement is lifted and now a warning is emitted
instead with a location to the patch that could be used to silence the warning.
Copy the patch to your workspace and add it to the list if patches for the wheel
file if you decide to do so.
* (coverage): coverage reports are now created when the version-aware
rules are used.
([#1600](https://github.com/bazelbuild/rules_python/issues/1600))
* (toolchains) Workspace builds register the py cc toolchain (bzlmod already
was). This makes e.g. `//python/cc:current_py_cc_headers` Just Work.
([#1669](https://github.com/bazelbuild/rules_python/issues/1669))
* (bzlmod python.toolchain) The value of `ignore_root_user_error` is now decided
by the root module only.
([#1658](https://github.com/bazelbuild/rules_python/issues/1658))
### Added
* (docs) bzlmod extensions are now documented on rules-python.readthedocs.io
* (docs) Support and backwards compatibility policies have been documented.
See https://rules-python.readthedocs.io/en/latest/support.html
* (gazelle) `file` generation mode can now also add `__init__.py` to the srcs
attribute for every target in the package. This is enabled through a separate
directive `python_generation_mode_per_file_include_init`.
## [0.27.0] - 2023-11-16
[0.27.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.27.0
### Changed
* Make `//python/pip_install:pip_repository_bzl` `bzl_library` target internal
as all of the publicly available symbols (etc. `package_annotation`) are
re-exported via `//python:pip_bzl` `bzl_library`.
* (gazelle) Gazelle Python extension no longer has runtime dependencies. Using
`GAZELLE_PYTHON_RUNTIME_DEPS` from `@rules_python_gazelle_plugin//:def.bzl` is
no longer necessary.
* (pip_parse) The installation of `pip_parse` repository rule toolchain
dependencies is now done as part of `py_repositories` call.
* (pip_parse) The generated `requirements.bzl` file now has an additional symbol
`all_whl_requirements_by_package` which provides a map from the normalized
PyPI package name to the target that provides the built wheel file. Use
`pip_utils.normalize_name` function from `@rules_python//python:pip.bzl` to
convert a PyPI package name to a key in the `all_whl_requirements_by_package`
map.
* (pip_parse) The flag `incompatible_generate_aliases` has been flipped to
`True` by default on `non-bzlmod` setups allowing users to use the same label
strings during the transition period. For example, instead of
`@pypi_foo//:pkg`, you can now use `@pypi//foo` or `@pypi//foo:pkg`. Other
labels that are present in the `foo` package are `dist_info`, `whl` and
`data`. Note, that the `@pypi_foo//:pkg` labels are still present for
backwards compatibility.
* (gazelle) The flag `use_pip_repository_aliases` is now set to `True` by
default, which will cause `gazelle` to change third-party dependency labels
from `@pip_foo//:pkg` to `@pip//foo` by default.
* The `compile_pip_requirements` now defaults to `pyproject.toml` if the `src`
or `requirements_in` attributes are unspecified, matching the upstream
`pip-compile` behaviour more closely.
* (gazelle) Use relative paths if possible for dependencies added through
the use of the `resolve` directive.
* (gazelle) When using `python_generation_mode file`, one `py_test` target is
made per test file even if a target named `__test__` or a file named
`__test__.py` exists in the same package. Previously in these cases there
would only be one test target made.
Breaking changes:
* (pip) `pip_install` repository rule in this release has been disabled and
will fail by default. The API symbol is going to be removed in the next
version, please migrate to `pip_parse` as a replacement. The `pip_parse`
rule no longer supports `requirements` attribute, please use
`requirements_lock` instead.
* (py_wheel) switch `incompatible_normalize_name` and
`incompatible_normalize_version` to `True` by default to enforce `PEP440`
for wheel names built by `rules_python`.
* (tools/wheelmaker.py) drop support for Python 2 as only Python 3 is tested.
### Fixed
* Skip aliases for unloaded toolchains. Some Python versions that don't have full
platform support, and referencing their undefined repositories can break operations
like `bazel query rdeps(...)`.
* Python code generated from `proto_library` with `strip_import_prefix` can be imported now.
* (py_wheel) Produce deterministic wheel files and make `RECORD` file entries
follow the order of files written to the `.whl` archive.
* (gazelle) Generate a single `py_test` target when `gazelle:python_generation_mode project`
is used.
* (gazelle) Move waiting for the Python interpreter process to exit to the shutdown hook
to make the usage of the `exec.Command` more idiomatic.
* (toolchains) Keep tcl subdirectory in Windows build of hermetic interpreter.
* (bzlmod) sub-modules now don't have the `//conditions:default` clause in the
hub repos created by `pip.parse`. This should fix confusing error messages
in case there is a misconfiguration of toolchains or a bug in `rules_python`.
### Added
* (bzlmod) Added `.whl` patching support via `patches` and `patch_strip`
arguments to the new `pip.override` tag class.
* (pip) Support for using [PEP621](https://peps.python.org/pep-0621/) compliant
`pyproject.toml` for creating a resolved `requirements.txt` file.
* (utils) Added a `pip_utils` struct with a `normalize_name` function to allow users
to find out how `rules_python` would normalize a PyPI distribution name.
## [0.26.0] - 2023-10-06
### Changed
* Python version patch level bumps:
* 3.8.15 -> 3.8.18
* 3.9.17 -> 3.9.18
* 3.10.12 -> 3.10.13
* 3.11.4 -> 3.11.6
* (deps) Upgrade rules_go 0.39.1 -> 0.41.0; this is so gazelle integration works with upcoming Bazel versions
* (multi-version) The `distribs` attribute is no longer propagated. This
attribute has been long deprecated by Bazel and shouldn't be used.
* Calling `//python:repositories.bzl#py_repositories()` is required. It has
always been documented as necessary, but it was possible to omit it in certain
cases. An error about `@rules_python_internal` means the `py_repositories()`
call is missing in `WORKSPACE`.
* (bzlmod) The `pip.parse` extension will generate os/arch specific lock
file entries on `bazel>=6.4`.
### Added
* (bzlmod, entry_point) Added {obj}`py_console_script_binary`, which
allows adding custom dependencies to a package's entry points and customizing
the `py_binary` rule used to build it.
* New Python versions available: `3.8.17`, `3.11.5` using
https://github.com/indygreg/python-build-standalone/releases/tag/20230826.
* (gazelle) New `# gazelle:python_generation_mode file` directive to support
generating one `py_library` per file.
* (python_repository) Support `netrc` and `auth_patterns` attributes to enable
authentication against private HTTP hosts serving Python toolchain binaries.
* `//python:packaging_bzl` added, a `bzl_library` for the Starlark
files `//python:packaging.bzl` requires.
* (py_wheel) Added the `incompatible_normalize_name` feature flag to
normalize the package distribution name according to latest Python
packaging standards. Defaults to `False` for the time being.
* (py_wheel) Added the `incompatible_normalize_version` feature flag
to normalize the package version according to PEP440 standard. This
also adds support for local version specifiers (versions with a `+`
in them), in accordance with PEP440. Defaults to `False` for the
time being.
* New Python versions available: `3.8.18`, `3.9.18`, `3.10.13`, `3.11.6`, `3.12.0` using
https://github.com/indygreg/python-build-standalone/releases/tag/20231002.
`3.12.0` support is considered beta and may have issues.
### Removed
* (bzlmod) The `entry_point` macro is no longer supported and has been removed
in favour of the `py_console_script_binary` macro for `bzlmod` users.
* (bzlmod) The `pip.parse` no longer generates `{hub_name}_{py_version}` hub repos
as the `entry_point` macro has been superseded by `py_console_script_binary`.
* (bzlmod) The `pip.parse` no longer generates `{hub_name}_{distribution}` hub repos.
### Fixed
* (whl_library) No longer restarts repository rule when fetching external
dependencies improving initial build times involving external dependency
fetching.
* (gazelle) Improve runfiles lookup hermeticity.
[0.26.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.26.0
## [0.25.0] - 2023-08-22
### Changed
* Python version patch level bumps:
* 3.9.16 -> 3.9.17
* 3.10.9 -> 3.10.12
* 3.11.1 -> 3.11.4
* (bzlmod) `pip.parse` can no longer automatically use the default
Python version; this was an unreliable and unsafe behavior. The
`python_version` arg must always be explicitly specified.
### Fixed
* (docs) Update docs to use correct bzlmod APIs and clarify how and when to use
various APIs.
* (multi-version) The `main` arg is now correctly computed and usually optional.
* (bzlmod) `pip.parse` no longer requires a call for whatever the configured
default Python version is.
### Added
* Created a changelog.
* (gazelle) Stop generating unnecessary imports.
* (toolchains) s390x supported for Python 3.9.17, 3.10.12, and 3.11.4.
[0.25.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.25.0
## [0.24.0] - 2023-07-11
### Changed
* **BREAKING** (gazelle) Gazelle 0.30.0 or higher is required
* (bzlmod) `@python_aliases` renamed to `@python_versions
* (bzlmod) `pip.parse` arg `name` renamed to `hub_name`
* (bzlmod) `pip.parse` arg `incompatible_generate_aliases` removed and always
true.
### Fixed
* (bzlmod) Fixing Windows Python Interpreter symlink issues
* (py_wheel) Allow twine tags and args
* (toolchain, bzlmod) Restrict coverage tool visibility under bzlmod
* (pip) Ignore temporary pyc.NNN files in wheels
* (pip) Add format() calls to glob_exclude templates
* plugin_output in py_proto_library rule
### Added
* Using Gazelle's lifecycle manager to manage external processes
* (bzlmod) `pip.parse` can be called multiple times with different Python
versions
* (bzlmod) Allow bzlmod `pip.parse` to reference the default python toolchain and interpreter
* (bzlmod) Implementing wheel annotations via `whl_mods`
* (gazelle) support multiple requirements files in manifest generation
* (py_wheel) Support for specifying `Description-Content-Type` and `Summary` in METADATA
* (py_wheel) Support for specifying `Project-URL`
* (compile_pip_requirements) Added `generate_hashes` arg (default True) to
control generating hashes
* (pip) Create all_data_requirements alias
* Expose Python C headers through the toolchain.
[0.24.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.24.0