blob: 821053be9327d3e9be82aacb6d09b5c83a2ef682 [file] [log] [blame] [view]
# 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
[0.XX.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.XX.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.
### Fixed
* (bzlmod) pip.parse now does not fail with an empty `requirements.txt`.
### Added
* (py_wheel) Added `requires_file` and `extra_requires_files` attributes.
## 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.
### 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
[`py_console_script_binary`](./docs/py_console_script_binary.md), 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