Upgrade bazelbuild-rules_python to 1.0.0 am: 58e9490c15
Original change: https://android-review.googlesource.com/c/platform/external/bazelbuild-rules_python/+/3448288
Change-Id: Ic3632628af713167be7d19e37e54c882dd20e79d
Signed-off-by: Automerger Merge Worker <[email protected]>
diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml
index 631ad86..c45fc78 100644
--- a/.bazelci/presubmit.yml
+++ b/.bazelci/presubmit.yml
@@ -18,6 +18,7 @@
# Use a specific version to avoid skew issues when new versions are released.
version: 6.1.0
warnings: "all"
+# NOTE: Minimum supported version is 6.x for workspace; 7.x for bzlmod
.minimum_supported_version: &minimum_supported_version
# For testing minimum supported version.
# NOTE: Keep in sync with //:version.bzl
@@ -33,16 +34,19 @@
build_flags:
- "--keep_going"
- "--build_tag_filters=-integration-test"
+ - "--config=bazel7.x"
test_targets:
- "--"
- "..."
test_flags:
- "--test_tag_filters=-integration-test"
.common_workspace_flags_min_bazel: &common_workspace_flags_min_bazel
- test_flags:
- - "--noenable_bzlmod"
build_flags:
- "--noenable_bzlmod"
+ - "--build_tag_filters=-integration-test"
+ test_flags:
+ - "--noenable_bzlmod"
+ - "--test_tag_filters=-integration-test"
.common_workspace_flags: &common_workspace_flags
test_flags:
- "--noenable_bzlmod"
@@ -65,15 +69,6 @@
.reusable_build_test_all: &reusable_build_test_all
build_targets: ["..."]
test_targets: ["..."]
-.lockfile_mode_error: &lockfile_mode_error
- # For testing lockfile support
- skip_in_bazel_downstream_pipeline: "Lockfile depends on the bazel version"
- build_flags:
- - "--lockfile_mode=error"
- test_flags:
- - "--lockfile_mode=error"
- coverage_flags:
- - "--lockfile_mode=error"
.coverage_targets_example_bzlmod: &coverage_targets_example_bzlmod
coverage_targets: ["..."]
.coverage_targets_example_bzlmod_build_file_generation: &coverage_targets_example_bzlmod_build_file_generation
@@ -90,14 +85,6 @@
- //tests:version_3_8_test
- //tests:version_3_9_test
- //tests:version_default_test
-.pystar_base: &pystar_base
- bazel: "7.x"
- environment:
- RULES_PYTHON_ENABLE_PYSTAR: "1"
- test_flags:
- # The doc check tests fail because the Starlark implementation makes the
- # PyInfo and PyRuntimeInfo symbols become documented.
- - "--test_tag_filters=-integration-test,-doc_check_test"
tasks:
gazelle_extension_min:
<<: *common_workspace_flags_min_bazel
@@ -127,37 +114,58 @@
<<: *common_workspace_flags_min_bazel
name: "Default: Ubuntu, workspace, minimum Bazel"
platform: ubuntu2004
+
ubuntu_min_bzlmod:
<<: *minimum_supported_version
<<: *reusable_config
name: "Default: Ubuntu, bzlmod, minimum Bazel"
platform: ubuntu2004
+ bazel: 7.x
ubuntu:
<<: *reusable_config
name: "Default: Ubuntu"
platform: ubuntu2004
-
- pystar_ubuntu_workspace:
+ ubuntu_upcoming:
<<: *reusable_config
- <<: *pystar_base
- name: "Default test: Ubuntu, Pystar, workspace"
+ name: "Default: Ubuntu, upcoming Bazel"
platform: ubuntu2004
- pystar_ubuntu_bzlmod:
- <<: *reusable_config
- <<: *pystar_base
- name: "Default test: Ubuntu, Pystar, bzlmod"
- platform: ubuntu2004
- pystar_mac_workspace:
+ bazel: last_rc
+ ubuntu_workspace:
<<: *reusable_config
<<: *common_workspace_flags
- <<: *pystar_base
- name: "Default test: Mac, Pystar, workspace"
- platform: macos
- pystar_windows_workspace:
+ name: "Default: Ubuntu, workspace"
+ platform: ubuntu2004
+ mac_workspace:
<<: *reusable_config
- <<: *pystar_base
- name: "Default test: Windows, Pystar, workspace"
+ <<: *common_workspace_flags
+ name: "Default: Mac, workspace"
+ platform: macos
+ windows_workspace:
+ <<: *reusable_config
+ <<: *common_workspace_flags
+ name: "Default: Windows, workspace"
platform: windows
+ # Most of tests/integration are failing on Windows w/workspace. Skip them
+ # for now until we can look into it.
+ build_targets:
+ - "--"
+ - "..."
+ # As a regression test for #225, check that wheel targets still build when
+ # their package path is qualified with the repo name.
+ - "@rules_python//examples/wheel/..."
+ build_flags:
+ - "--noenable_bzlmod"
+ - "--enable_workspace"
+ - "--keep_going"
+ - "--build_tag_filters=-integration-test"
+ - "--config=bazel7.x"
+ test_targets:
+ - "--"
+ - "..."
+ test_flags:
+ - "--noenable_bzlmod"
+ - "--enable_workspace"
+ - "--test_tag_filters=-integration-test"
debian:
<<: *reusable_config
@@ -177,7 +185,8 @@
<<: *minimum_supported_version
<<: *reusable_config
name: "RBE: Ubuntu, minimum Bazel"
- platform: rbe_ubuntu1604
+ platform: rbe_ubuntu2004
+ bazel: 7.x
build_flags:
# BazelCI sets --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1,
# which prevents cc toolchain autodetection from working correctly
@@ -195,7 +204,7 @@
rbe:
<<: *reusable_config
name: "RBE: Ubuntu"
- platform: rbe_ubuntu1604
+ platform: rbe_ubuntu2004
test_flags:
- "--test_tag_filters=-integration-test,-acceptance-test"
- "--extra_toolchains=@buildkite_config//config:cc-toolchain"
@@ -239,44 +248,56 @@
name: "examples/bzlmod: Ubuntu, minimum Bazel"
working_directory: examples/bzlmod
platform: ubuntu2004
+ bazel: 7.x
integration_test_bzlmod_ubuntu:
<<: *reusable_build_test_all
<<: *coverage_targets_example_bzlmod
name: "examples/bzlmod: Ubuntu"
working_directory: examples/bzlmod
platform: ubuntu2004
+ bazel: 7.x
+ integration_test_bzlmod_ubuntu_upcoming:
+ <<: *reusable_build_test_all
+ <<: *coverage_targets_example_bzlmod
+ name: "examples/bzlmod: Ubuntu, upcoming Bazel"
+ working_directory: examples/bzlmod
+ platform: ubuntu2004
+ bazel: last_rc
integration_test_bzlmod_debian:
<<: *reusable_build_test_all
<<: *coverage_targets_example_bzlmod
name: "examples/bzlmod: Debian"
working_directory: examples/bzlmod
platform: debian11
+ bazel: 7.x
integration_test_bzlmod_macos:
<<: *reusable_build_test_all
<<: *coverage_targets_example_bzlmod
name: "examples/bzlmod: macOS"
working_directory: examples/bzlmod
platform: macos
+ bazel: 7.x
+ integration_test_bzlmod_macos_upcoming:
+ <<: *reusable_build_test_all
+ <<: *coverage_targets_example_bzlmod
+ name: "examples/bzlmod: macOS, upcoming Bazel"
+ working_directory: examples/bzlmod
+ platform: macos
+ bazel: last_rc
integration_test_bzlmod_windows:
<<: *reusable_build_test_all
# coverage is not supported on Windows
name: "examples/bzlmod: Windows"
working_directory: examples/bzlmod
platform: windows
- integration_test_bzlmod_ubuntu_lockfile:
+ bazel: 7.x
+ integration_test_bzlmod_windows_upcoming:
<<: *reusable_build_test_all
- <<: *coverage_targets_example_bzlmod
- <<: *lockfile_mode_error
- name: "examples/bzlmod: Ubuntu with lockfile"
+ # coverage is not supported on Windows
+ name: "examples/bzlmod: Windows, upcoming Bazel"
working_directory: examples/bzlmod
- platform: ubuntu2004
- integration_test_bzlmod_macos_lockfile:
- <<: *reusable_build_test_all
- <<: *coverage_targets_example_bzlmod
- <<: *lockfile_mode_error
- name: "examples/bzlmod: macOS with lockfile"
- working_directory: examples/bzlmod
- platform: macos
+ platform: windows
+ bazel: last_rc
integration_test_bzlmod_generate_build_file_generation_ubuntu_min:
<<: *minimum_supported_version
@@ -285,6 +306,7 @@
name: "examples/bzlmod_build_file_generation: Ubuntu, minimum Bazel"
working_directory: examples/bzlmod_build_file_generation
platform: ubuntu2004
+ bazel: 7.x
integration_test_bzlmod_generation_build_files_ubuntu:
<<: *reusable_build_test_all
<<: *coverage_targets_example_bzlmod_build_file_generation
@@ -302,7 +324,7 @@
integration_test_bzlmod_build_file_generation_debian:
<<: *reusable_build_test_all
<<: *coverage_targets_example_bzlmod_build_file_generation
- name: "examples/bzlmod_build_file_integration: Debian"
+ name: "examples/bzlmod_build_file_generation: Debian"
working_directory: examples/bzlmod_build_file_generation
platform: debian11
integration_test_bzlmod_build_file_generation_macos:
@@ -351,15 +373,16 @@
<<: *minimum_supported_version
<<: *common_workspace_flags_min_bazel
<<: *reusable_build_test_all
- name: "examples/pip_parse: Ubuntu, workspace, minimum supporte Bazel version"
+ name: "examples/pip_parse: Ubuntu, workspace, minimum supported Bazel version"
working_directory: examples/pip_parse
platform: ubuntu2004
integration_test_pip_parse_ubuntu_min_bzlmod:
<<: *minimum_supported_version
<<: *reusable_build_test_all
- name: "examples/pip_parse: Ubuntu, bzlmod, minimum supporte Bazel version"
+ name: "examples/pip_parse: Ubuntu, bzlmod, minimum supported Bazel version"
working_directory: examples/pip_parse
platform: ubuntu2004
+ bazel: 7.x
integration_test_pip_parse_ubuntu:
<<: *reusable_build_test_all
name: "examples/pip_parse: Ubuntu"
@@ -394,6 +417,7 @@
name: "examples/pip_parse_vendored: Ubuntu, bzlmod, minimum Bazel"
working_directory: examples/pip_parse_vendored
platform: ubuntu2004
+ bazel: 7.x
integration_test_pip_parse_vendored_ubuntu:
<<: *reusable_build_test_all
name: "examples/pip_parse_vendored: Ubuntu"
@@ -574,6 +598,7 @@
name: "compile_pip_requirements_test_from_external_repo: Ubuntu, bzlmod, minimum Bazel"
working_directory: tests/integration/compile_pip_requirements_test_from_external_repo
platform: ubuntu2004
+ bazel: 7.x
shell_commands:
# Assert that @compile_pip_requirements//:requirements_test does the right thing.
- "bazel test @compile_pip_requirements//..."
diff --git a/.bazelignore b/.bazelignore
index 9539173..d5fe879 100644
--- a/.bazelignore
+++ b/.bazelignore
@@ -26,3 +26,4 @@
tests/integration/compile_pip_requirements/bazel-compile_pip_requirements
tests/integration/ignore_root_user_error/bazel-ignore_root_user_error
tests/integration/local_toolchains/bazel-local_toolchains
+tests/integration/py_cc_toolchain_registered/bazel-py_cc_toolchain_registered
diff --git a/.bazelrc b/.bazelrc
index 1ca469c..c44124d 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -33,4 +33,6 @@
# Some bzl files contain repos only available under bzlmod
build:rtd --enable_bzlmod
+common:bazel7.x --incompatible_python_disallow_native_rules
+
build --lockfile_mode=update
diff --git a/.bazelversion b/.bazelversion
index a3fcc71..35907cd 100644
--- a/.bazelversion
+++ b/.bazelversion
@@ -1 +1 @@
-7.1.0
+7.x
diff --git a/.bcr/gazelle/metadata.template.json b/.bcr/gazelle/metadata.template.json
index 9cd4291..687f78e 100644
--- a/.bcr/gazelle/metadata.template.json
+++ b/.bcr/gazelle/metadata.template.json
@@ -7,9 +7,9 @@
"github": "rickeylev"
},
{
- "name": "Thulio Ferraz Assis",
- "email": "[email protected]",
- "github": "f0rmiga"
+ "name": "Ignas Anikevicius",
+ "email": "[email protected]",
+ "github": "aignas"
}
],
"repository": [
diff --git a/.bcr/gazelle/presubmit.yml b/.bcr/gazelle/presubmit.yml
index 659beab..bceed4f 100644
--- a/.bcr/gazelle/presubmit.yml
+++ b/.bcr/gazelle/presubmit.yml
@@ -16,7 +16,8 @@
module_path: "../examples/bzlmod_build_file_generation"
matrix:
platform: ["debian11", "macos", "ubuntu2004", "windows"]
- bazel: [6.x, 7.x]
+ # last_rc is to get latest 8.x release. Replace with 8.x when available.
+ bazel: [7.x, last_rc]
tasks:
run_tests:
name: "Run test module"
diff --git a/.bcr/metadata.template.json b/.bcr/metadata.template.json
index 7b16b53..b164e70 100644
--- a/.bcr/metadata.template.json
+++ b/.bcr/metadata.template.json
@@ -7,9 +7,9 @@
"github": "rickeylev"
},
{
- "name": "Thulio Ferraz Assis",
- "email": "[email protected]",
- "github": "f0rmiga"
+ "name": "Ignas Anikevicius",
+ "email": "[email protected]",
+ "github": "aignas"
}
],
"repository": [
diff --git a/.bcr/presubmit.yml b/.bcr/presubmit.yml
index 875ea93..e1ddb7a 100644
--- a/.bcr/presubmit.yml
+++ b/.bcr/presubmit.yml
@@ -16,7 +16,8 @@
module_path: "examples/bzlmod"
matrix:
platform: ["debian11", "macos", "ubuntu2004", "windows"]
- bazel: [6.x, 7.x]
+ # last_rc is to get latest 8.x release. Replace with 8.x when available.
+ bazel: [7.x, last_rc]
tasks:
run_tests:
name: "Run test module"
diff --git a/.gitattributes b/.gitattributes
index e4e5d4b..eae260e 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1 +1,2 @@
+python/features.bzl export-subst
tools/publish/*.txt linguist-generated=true
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 6a8a48f..4df29ba 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -3,9 +3,9 @@
* @rickeylev @aignas
# Directory containing the Gazelle extension and Go code.
-/gazelle/ @f0rmiga
-/examples/build_file_generation/ @f0rmiga
+/gazelle/ @dougthor42 @aignas
+/examples/build_file_generation/ @dougthor42 @aignas
# PyPI integration related code
-/python/private/pypi/ @aignas @groodt
-/tests/pypi/ @aignas @groodt
+/python/private/pypi/ @rickeylev @aignas @groodt
+/tests/pypi/ @rickeylev @aignas @groodt
diff --git a/.github/workflows/create_archive_and_notes.sh b/.github/workflows/create_archive_and_notes.sh
index ffeecd5..0bc14f9 100755
--- a/.github/workflows/create_archive_and_notes.sh
+++ b/.github/workflows/create_archive_and_notes.sh
@@ -25,9 +25,10 @@
SHA=$(shasum -a 256 $ARCHIVE | awk '{print $1}')
cat > release_notes.txt << EOF
-## Using Bzlmod with Bazel 6
-**NOTE: bzlmod support is still beta. APIs subject to change.**
+For more detailed setup instructions, see https://rules-python.readthedocs.io/en/latest/getting-started.html
+
+## Using Bzlmod
Add to your \`MODULE.bazel\` file:
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 96624b3..29b70cc 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -42,5 +42,6 @@
# Use GH feature to populate the changelog automatically
generate_release_notes: true
body_path: release_notes.txt
+ prerelease: ${{ contains(github.ref, '-rc') }}
fail_on_unmatched_files: true
files: rules_python-*.tar.gz
diff --git a/.gitignore b/.gitignore
index 92b5801..863b0e9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -52,4 +52,3 @@
# MODULE.bazel.lock is ignored for now as per recommendation from upstream.
# See https://github.com/bazelbuild/bazel/issues/20369
MODULE.bazel.lock
-!/examples/bzlmod/MODULE.bazel.lock
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 38b9161..707a8d7 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -16,6 +16,10 @@
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v5.0.0 # Use the ref you want to point at
+ hooks:
+ - id: check-merge-conflict
- repo: https://github.com/keith/pre-commit-buildifier
rev: 6.1.0
hooks:
@@ -45,9 +49,3 @@
entry: bazel run @rules_bazel_integration_test//tools:update_deleted_packages
files: ^((examples|tests)/.*/(MODULE.bazel|WORKSPACE|WORKSPACE.bzlmod|BUILD.bazel)|.bazelrc)$
pass_filenames: false
- - id: update-bzlmod-lockfiles
- name: Update bzlmod lockfiles
- language: script
- entry: ./tools/private/update_bzlmod_lockfiles.sh
- files: ^python/
- pass_filenames: false
diff --git a/BUILD.bazel b/BUILD.bazel
index 5a58422..5e85c27 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -40,8 +40,8 @@
"MODULE.bazel",
"WORKSPACE",
"WORKSPACE.bzlmod",
- "internal_deps.bzl",
- "internal_setup.bzl",
+ "internal_dev_deps.bzl",
+ "internal_dev_setup.bzl",
"version.bzl",
"//python:distribution",
"//tools:distribution",
diff --git a/BZLMOD_SUPPORT.md b/BZLMOD_SUPPORT.md
index d3d0607..85e28ac 100644
--- a/BZLMOD_SUPPORT.md
+++ b/BZLMOD_SUPPORT.md
@@ -2,10 +2,12 @@
## `rules_python` `bzlmod` support
-- Status: Beta
+- Status: GA
- Full Feature Parity: No
+ - `rules_python`: Yes
+ - `rules_python_gazelle_plugin`: No (see below).
-Some features are missing or broken, and the public APIs are not yet stable.
+In general `bzlmod` has more features than `WORKSPACE` and users are encouraged to migrate.
## Configuration
@@ -27,15 +29,6 @@
A second example, in [examples/bzlmod_build_file_generation](examples/bzlmod_build_file_generation) demonstrates the use of `bzlmod` to configure `gazelle` support for `rules_python`.
-## Feature parity
-
-This rule set does not have full feature partity with the older `WORKSPACE` type configuration:
-
-1. Gazelle does not support finding deps in sub-modules. For instance we can have a dep like ` "@our_other_module//other_module/pkg:lib",` in a `py_test` definition.
-2. We have some features that are still not fully flushed out, and the user interface may change.
-
-Check ["issues"](/bazelbuild/rules_python/issues) for an up to date list.
-
## Differences in behavior from WORKSPACE
### Default toolchain is not the local system Python
@@ -52,10 +45,35 @@
If you want to use the same toolchain as what WORKSPACE used, then manually
register the builtin Bazel Python toolchain by doing
`register_toolchains("@bazel_tools//tools/python:autodetecting_toolchain")`.
-**IMPORTANT: this should only be done in a root module, and may intefere with
+
+Note that using this builtin Bazel toolchain is deprecated and unsupported.
+See the {obj}`runtime_env_toolchains` docs for a replacement that is marginally
+better supported.
+**IMPORTANT: this should only be done in a root module, and may interfere with
the toolchains rules_python registers**.
NOTE: Regardless of your toolchain, due to
[#691](https://github.com/bazelbuild/rules_python/issues/691), `rules_python`
still relies on a local Python being available to bootstrap the program before
handing over execution to the toolchain Python.
+
+To override this behaviour see {obj}`--bootstrap_impl=script`, which switches
+to `bash`-based bootstrap on UNIX systems.
+
+### Better PyPI package downloading on bzlmod
+
+On `bzlmod` users have the option to use the `bazel_downloader` to download packages
+and work correctly when `host` platform is not the same as the `target` platform. This
+provides faster package download times and integration with the credentials helper.
+
+### Extra targets in `whl_library` repos
+
+Due to how `bzlmod` is designed and the visibility rules that it enforces, it is best to use
+the targets in the `whl` repos as they do not rely on using the `annotations` API to
+add extra targets to so-called `spoke` repos. For alternatives that should cover most of the
+existing usecases please see:
+* {bzl:obj}`py_console_script_binary` to create `entry_point` targets.
+* {bzl:obj}`whl_filegroup` to extract filegroups from the `whl` targets (e.g. `@pip//numpy:whl`)
+* {bzl:obj}`pip.override` to patch the downloaded `whl` files. Using that you
+ can change the `METADATA` of the `whl` file that will influence how
+ `rules_python` code generation behaves.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e428fa3..7bdc5e4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,24 +20,297 @@
* Particular sub-systems are identified using parentheses, e.g. `(bzlmod)` or
`(docs)`.
+<!--
+Unreleased changes template.
+
+{#v0-0-0}
## Unreleased
+[0.0.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.0.0
+
+{#v0-0-0-changed}
### Changed
-- Nothing yet
+* Nothing changed.
+{#v0-0-0-fixed}
### Fixed
-- Nothing yet
+* Nothing fixed.
+{#v0-0-0-added}
### Added
-- Nothing yet
+* Nothing added.
+{#v0-0-0-removed}
### Removed
-- Nothing yet
+* Nothing removed.
+-->
+{#v0-0-0}
+## Unreleased
+
+[0.0.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.0.0
+
+{#v0-0-0-changed}
+### Changed
+* Nothing changed.
+
+{#v0-0-0-fixed}
+### Fixed
+* Nothing fixed.
+
+{#v0-0-0-added}
+### Added
+* Nothing added.
+
+{#v0-0-0-removed}
+### Removed
+* Nothing removed.
+
+{#v1-0-0}
+## [1.0.0] - 2024-12-05
+
+[1.0.0]: https://github.com/bazelbuild/rules_python/releases/tag/1.0.0
+
+{#v1-0-0-changed}
+### Changed
+
+**Breaking**:
+* (toolchains) stop exposing config settings in python toolchain alias repos.
+ Please consider depending on the flags defined in
+ `//python/config_setting/...` and the `@platforms` package instead.
+* (toolchains) consumers who were depending on the `MACOS_NAME` and the `arch`
+ attribute in the `PLATFORMS` list, please update your code to respect the new
+ values. The values now correspond to the values available in the
+ `@platforms//` package constraint values.
+* (toolchains) `host_platform` and `interpreter` constants are no longer created
+ in the `toolchain` generated alias `.bzl` files. If you need to access the
+ host interpreter during the `repository_rule` evaluation, please use the
+ `@python_{version}_host//:python` targets created by
+ {bzl:obj}`python_register_toolchains` and
+ {bzl:obj}`python_register_multi_toolchains` macros or the {bzl:obj}`python`
+ bzlmod extension.
+* (bzlmod) `pip.parse.parse_all_requirements_files` attribute has been removed.
+ See notes in the previous versions about what to do.
+* (deps) rules_cc 0.1.0 (workspace) and 0.0.16 (bzlmod).
+* (deps) protobuf 29.0-rc2 (workspace; bzlmod already specifying that version).
+
+Other changes:
+* (python_repository) Start honoring the `strip_prefix` field for `zstd` archives.
+* (pypi) {bzl:obj}`pip_parse.extra_hub_aliases` now works in WORKSPACE files.
+* (binaries/tests) For {obj}`--bootstrap_impl=script`, a binary-specific (but
+ otherwise empty) virtual env is used to customize `sys.path` initialization.
+* (deps) bazel_skylib 1.7.0 (workspace; bzlmod already specifying that version)
+* (deps) bazel_features 1.21.0; necessary for compatiblity with Bazel 8 rc3
+* (deps) stardoc 0.7.2 to support Bazel 8.
+
+{#v1-0-0-fixed}
+### Fixed
+* (toolchains) stop depending on `uname` to get the value of the host platform.
+* (pypi): Correctly handle multiple versions of the same package in the requirements
+ files which is useful when including different PyTorch builds (e.g. <pytorch+cpu> vs <pytorch+cu118> ) for different target platforms.
+ Fixes ([2337](https://github.com/bazelbuild/rules_python/issues/2337)).
+* (uv): Correct the sha256sum for the `uv` binary for aarch64-apple-darwin.
+ Fixes ([2411](https://github.com/bazelbuild/rules_python/issues/2411)).
+* (binaries/tests) ({obj}`--bootstrap_impl=scipt`) Using `sys.executable` will
+ use the same `sys.path` setup as the calling binary.
+ ([2169](https://github.com/bazelbuild/rules_python/issues/2169)).
+* (workspace) Corrected protobuf's name to com_google_protobuf, the name is
+ hardcoded in Bazel, WORKSPACE mode.
+* (pypi): {bzl:obj}`compile_pip_requirements` no longer fails on Windows when `--enable_runfiles` is not enabled.
+* (pypi): {bzl:obj}`compile_pip_requirements` now correctly updates files in the source tree on Windows when `--windows_enable_symlinks` is not enabled.
+* (repositories): Add libs/python3.lib and pythonXY.dll to the `libpython` target
+ defined by a repository template. This enables stable ABI builds of Python extensions
+ on Windows (by defining Py_LIMITED_API).
+* (rules) `py_test` and `py_binary` targets no longer incorrectly remove the
+ first `sys.path` entry when using {obj}`--bootstrap_impl=script`
+
+{#v1-0-0-added}
+### Added
+* (gazelle): Parser failures will now be logged to the terminal. Additional
+ details can be logged by setting `RULES_PYTHON_GAZELLE_VERBOSE=1`.
+* (toolchains) allow users to select which variant of the support host toolchain
+ they would like to use through
+ `RULES_PYTHON_REPO_TOOLCHAIN_{VERSION}_{OS}_{ARCH}` env variable setting. For
+ example, this allows one to use `freethreaded` python interpreter in the
+ `repository_rule` to build a wheel from `sdist`.
+* (toolchain) The python interpreters targeting `muslc` libc have been added
+ for the latest toolchain versions for each minor Python version. You can control
+ the toolchain selection by using the
+ {bzl:obj}`//python/config_settings:py_linux_libc` build flag.
+* (providers) Added {obj}`py_runtime_info.site_init_template` and
+ {obj}`PyRuntimeInfo.site_init_template` for specifying the template to use to
+ initialize the interpreter via venv startup hooks.
+* (runfiles) (Bazel 7.4+) Added support for spaces and newlines in runfiles paths
+
+{#v1-0-0-removed}
+### Removed
+* (pypi): Remove `pypi_install_dependencies` macro that has been included in
+ {bzl:obj}`py_repositories` for a long time.
+* (bzlmod): Remove `DEFAULT_PYTHON_VERSION` from `interpreters.bzl` file. If
+ you need the version, please use it from the `versions.bzl` file instead.
+
+{#v0-40-0}
+## [0.40.0] - 2024-11-17
+
+[0.40.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.40.0
+
+{#v0-40-changed}
+### Changed
+* Nothing changed.
+
+{#v0-40-fixed}
+### Fixed
+* (rules) Don't drop custom import paths if Bazel-builtin PyInfo is removed.
+ ([2414](https://github.com/bazelbuild/rules_python/issues/2414)).
+
+{#v0-40-added}
+### Added
+* Nothing added.
+
+{#v0-40-removed}
+### Removed
+* (publish) Remove deprecated `requirements.txt` for the `twine` dependencies.
+ Please use `requirements_linux.txt` instead.
+* (python_repository) Use bazel's built in `zstd` support and remove attributes
+ for customizing the `zstd` binary to be used for `zstd` archives in the
+ {bzl:obj}`python_repository` repository_rule. This affects the
+ {bzl:obj}`python_register_toolchains` and
+ {bzl:obj}`python_register_multi_toolchains` callers in the `WORKSPACE`.
+
+{#v0-39-0}
+## [0.39.0] - 2024-11-13
+
+[0.39.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.39.0
+
+{#v0-39-0-changed}
+### Changed
+* (deps) bazel_skylib 1.6.1 -> 1.7.1
+* (deps) rules_cc 0.0.9 -> 0.0.14
+* (deps) protobuf 24.4 -> 29.0-rc2
+* (deps) rules_proto 6.0.0-rc1 -> 6.0.2
+* (deps) stardoc 0.6.2 -> 0.7.1
+* For bzlmod, Bazel 7.4 is now the minimum Bazel version.
+* (toolchains) Use the latest indygreg toolchain release [20241016] for Python versions:
+ * 3.9.20
+ * 3.10.15
+ * 3.11.10
+ * 3.12.7
+ * 3.13.0
+* (pypi) The naming scheme for the `bzlmod` spoke repositories have changed as
+ all of the given `requirements.txt` files are now parsed by `default`, to
+ temporarily restore the behavior, you can use
+ {bzl:obj}`pip.parse.extra_hub_aliases`, which will be removed or made noop in
+ the future.
+
+[20241016]: https://github.com/indygreg/python-build-standalone/releases/tag/20241016
+
+{#v0-39-0-fixed}
+### Fixed
+* (precompiling) Skip precompiling (instead of erroring) if the legacy
+ `@bazel_tools//tools/python:autodetecting_toolchain` is being used
+ ([#2364](https://github.com/bazelbuild/rules_python/issues/2364)).
+
+{#v0-39-0-added}
+### Added
+* Bazel 8 is now supported.
+* (toolchain) Support for freethreaded Python toolchains is now available. Use
+ the config flag `//python/config_settings:py_freethreaded` to toggle the
+ selection of the free-threaded toolchains.
+* (toolchain) {obj}`py_runtime.abi_flags` attribute and
+ {obj}`PyRuntimeInfo.abi_flags` field added.
+
+{#v0-39-0-removed}
+### Removed
+* Support for Bazel 6 using bzlmod has been dropped.
+
+{#v0-38-0}
+## [0.38.0] - 2024-11-08
+
+[0.38.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.38.0
+
+{#v0-38-0-changed}
+### Changed
+* (deps) (WORKSPACE only) rules_cc 0.0.13 and protobuf 27.0 is now the default
+ version used; this for Bazel 8+ support (previously version was rules_cc 0.0.9
+ and no protobuf version specified)
+ ([2310](https://github.com/bazelbuild/rules_python/issues/2310)).
+* (publish) The dependencies have been updated to the latest available versions
+ for the `twine` publishing rule.
+* (whl_library) Remove `--no-build-isolation` to allow non-hermetic sdist builds
+ by default. Users wishing to keep this argument and to enforce more hermetic
+ builds can do so by passing the argument in
+ [`pip.parse#extra_pip_args`](https://rules-python.readthedocs.io/en/latest/api/rules_python/python/extensions/pip.html#pip.parse.extra_pip_args)
+* (pip.parse) {attr}`pip.parse.whl_modifications` now normalizes the given whl names
+ and now `pyyaml` and `PyYAML` will both work.
+* (bzlmod) `pip.parse` spoke repository naming will be changed in an upcoming
+ release in places where the users specify different package versions per
+ platform in the same hub repository. The naming of the spoke repos is
+ considered an implementation detail and we advise the users to use the `hub`
+ repository directly and make use of {bzl:obj}`pip.parse.extra_hub_aliases`
+ feature added in this release.
+
+{#v0-38-0-fixed}
+### Fixed
+* (pypi) (Bazel 7.4+) Allow spaces in filenames included in `whl_library`s
+ ([617](https://github.com/bazelbuild/rules_python/issues/617)).
+* (pypi) When {attr}`pip.parse.experimental_index_url` is set, we need to still
+ pass the `extra_pip_args` value when building an `sdist`.
+* (pypi) The patched wheel filenames from now on are using local version specifiers
+ which fixes usage of the said wheels using standard package managers.
+* (bzlmod) The extension evaluation has been adjusted to always generate the
+ same lock file irrespective if `experimental_index_url` is set by any module
+ or not. To opt into this behavior, set
+ `pip.parse.parse_all_requirements_files`, which will become the
+ default in future releases leading up to `1.0.0`. Fixes
+ [#2268](https://github.com/bazelbuild/rules_python/issues/2268). A known
+ issue is that it may break `bazel query` and in these use cases it is
+ advisable to use `cquery` or switch to `download_only = True`
+
+{#v0-38-0-added}
+### Added
+* (publish) The requirements file for the `twine` publishing rules have been
+ updated to have a new convention: `requirements_darwin.txt`,
+ `requirements_linux.txt`, `requirements_windows.txt` for each respective OS
+ and one extra file `requirements_universal.txt` if you prefer a single file.
+ The `requirements.txt` file may be removed in the future.
+* The rules_python version is now reported in `//python/features.bzl#features.version`
+* (pip.parse) {attr}`pip.parse.extra_hub_aliases` can now be used to expose extra
+ targets created by annotations in whl repositories.
+ Fixes [#2187](https://github.com/bazelbuild/rules_python/issues/2187).
+* (bzlmod) `pip.parse` now supports `whl-only` setup using
+ `download_only = True` where users can specify multiple requirements files
+ and use the `pip` backend to do the downloading. This was only available for
+ users setting {bzl:obj}`pip.parse.experimental_index_url`, but now users have
+ more options whilst we continue to work on stabilizing the experimental feature.
+
+{#v0-37-2}
+## [0.37.2] - 2024-10-27
+
+[0.37.2]: https://github.com/bazelbuild/rules_python/releases/tag/0.37.2
+
+{#v0-37-2-fixed}
+### Fixed
+* (bzlmod) Generate `config_setting` values for all available toolchains instead
+ of only the registered toolchains, which restores the previous behaviour that
+ `bzlmod` users would have observed.
+
+{#v0-37-1}
+## [0.37.1] - 2024-10-22
+
+[0.37.1]: https://github.com/bazelbuild/rules_python/releases/tag/0.37.1
+
+{#v0-37-1-fixed}
+### Fixed
+* (rules) Setting `--incompatible_python_disallow_native_rules` no longer
+ causes rules_python rules to fail
+ ([#2326](https://github.com/bazelbuild/rules_python/issues/2326)).
+
+{#v0-37-0}
## [0.37.0] - 2024-10-18
-[x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/0.37.0
+[0.37.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.37.0
+{#v0-37-0-changed}
### Changed
* **BREAKING** `py_library` no longer puts its source files or generated pyc
files in runfiles; it's the responsibility of consumers (e.g. binaries) to
@@ -54,6 +327,7 @@
{obj}`--@rules_python//python/config_settings:exec_tools_toolchain=disabled`.
* (deps) stardoc 0.6.2 added as dependency.
+{#v0-37-0-fixed}
### Fixed
* (bzlmod) The `python.override(minor_mapping)` now merges the default and the
overridden versions ensuring that the resultant `minor_mapping` will always
@@ -84,6 +358,7 @@
outside of the `//:BUILD.bazel` file.
Fixes [#2299](https://github.com/bazelbuild/rules_python/issues/2299).
+{#v0-37-0-added}
### Added
* (py_wheel) Now supports `compress = (True|False)` to allow disabling
compression to speed up development.
@@ -107,6 +382,7 @@
[20241008]: https://github.com/indygreg/python-build-standalone/releases/tag/20241008
+{#v0-37-0-removed}
### Removed
* (precompiling) {obj}`--precompile_add_to_runfiles` has been removed.
* (precompiling) {obj}`--pyc_collection` has been removed. The `pyc_collection`
@@ -114,10 +390,12 @@
* (precompiling) The {obj}`precompile=if_generated_source` value has been removed.
* (precompiling) The {obj}`precompile_source_retention=omit_if_generated_source` value has been removed.
+{#v0-36-0}
## [0.36.0] - 2024-09-24
[0.36.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.36.0
+{#v0-36-0-changed}
### 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
@@ -135,6 +413,7 @@
available.
* (bazel) Minimum bazel 7 version that we test against has been bumped to `7.1`.
+{#v0-36-0-fixed}
### 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
@@ -161,6 +440,7 @@
* (toolchain) The {bzl:obj}`gen_python_config_settings` has been fixed to include
the flag_values from the platform definitions.
+{#v0-36-0-added}
### Added
* (bzlmod): Toolchain overrides can now be done using the new
{bzl:obj}`python.override`, {bzl:obj}`python.single_version_override` and
@@ -182,15 +462,18 @@
* (toolchains) Added `//python:none`, a special target for use with
{obj}`py_exec_tools_toolchain.exec_interpreter` to treat the value as `None`.
+{#v0-36-0-removed}
### Removed
* (toolchains): Removed accidentally exposed `http_archive` symbol from
`python/repositories.bzl`.
* (toolchains): An internal _is_python_config_setting_ macro has been removed.
+{#v0-35-0}
## [0.35.0] - 2024-08-15
[0.35.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.35.0
+{#v0-35-0-changed}
### 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.
@@ -204,6 +487,7 @@
disabling it (Requires {obj}`--bootstrap_impl=script`)
([#2060](https://github.com/bazelbuild/rules_python/issues/2060)).
+{#v0-35-0-fixed}
### 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
@@ -245,6 +529,7 @@
in the same directory as the main file.
Fixes [#1631](https://github.com/bazelbuild/rules_python/issues/1631).
+{#v0-35-0-added}
### Added
* (rules) `compile_pip_requirements` supports multiple requirements input files as `srcs`.
* (rules) `PYTHONSAFEPATH` is inherited from the calling environment to allow
@@ -268,10 +553,12 @@
[pytest_bazel]: https://pypi.org/project/pytest-bazel
[20240726]: https://github.com/indygreg/python-build-standalone/releases/tag/20240726
+{#v0-34-0}
## [0.34.0] - 2024-07-04
[0.34.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.34.0
+{#v0-34-0-changed}
### Changed
* `protobuf`/`com_google_protobuf` dependency bumped to `v24.4`
* (bzlmod): optimize the creation of config settings used in pip to
@@ -283,6 +570,7 @@
replaced by {obj}`//python/runtime_env_toolchains:all`. The old target will be
removed in a future release.
+{#v0-34-0-fixed}
### Fixed
* (bzlmod): When using `experimental_index_url` the `all_requirements`,
`all_whl_requirements` and `all_data_requirements` will now only include
@@ -313,6 +601,7 @@
* (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)
+{#v0-34-0-added}
### Added
* (toolchains) {obj}`//python/runtime_env_toolchains:all`, which is a drop-in
replacement for the "autodetecting" toolchain.
@@ -320,13 +609,16 @@
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).
+{#v0-34-0-removed}
### Removed
* (pip): Removes the `entrypoint` macro that was replaced by `py_console_script_binary` in 0.26.0.
+{#v0-33-2}
## [0.33.2] - 2024-06-13
[0.33.2]: https://github.com/bazelbuild/rules_python/releases/tag/0.33.2
+{#v0-33-2-fixed}
### Fixed
* (toolchains) The {obj}`exec_tools_toolchain_type` is disabled by default.
To enable it, set {obj}`--//python/config_settings:exec_tools_toolchain=enabled`.
@@ -334,18 +626,22 @@
be enabled by default in a future release.
Fixes [#1967](https://github.com/bazelbuild/rules_python/issues/1967).
+{#v0-33-1}
## [0.33.1] - 2024-06-13
[0.33.1]: https://github.com/bazelbuild/rules_python/releases/tag/0.33.1
+{#v0-33-1-fixed}
### Fixed
* (py_binary) Fix building of zip file when using `--build_python_zip`
argument. Fixes [#1954](https://github.com/bazelbuild/rules_python/issues/1954).
+{#v0-33-0}
## [0.33.0] - 2024-06-12
[0.33.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.33.0
+{#v0-33-0-changed}
### Changed
* (deps) Upgrade the `pip_install` dependencies to pick up a new version of pip.
* (toolchains) Optional toolchain dependency: `py_binary`, `py_test`, and
@@ -374,6 +670,7 @@
`python_{version}_host` keys if you would like to have access to a Python
interpreter that can be used in a repository rule context.
+{#v0-33-0-fixed}
### Fixed
* (gazelle) Remove `visibility` from `NonEmptyAttr`.
Now empty(have no `deps/main/srcs/imports` attr) `py_library/test/binary` rules will
@@ -406,6 +703,7 @@
* (doc) Fix the `WORKSPACE` requirement vendoring example. Fixes
[#1918](https://github.com/bazelbuild/rules_python/issues/1918).
+{#v0-33-0-added}
### Added
* (rules) Precompiling Python source at build time is available. but is
disabled by default, for now. Set
@@ -459,10 +757,12 @@
[precompile-docs]: /precompiling
+{#v0-32-2}
## [0.32.2] - 2024-05-14
[0.32.2]: https://github.com/bazelbuild/rules_python/releases/tag/0.32.2
+{#v0-32-2-fixed}
### 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].
@@ -470,10 +770,12 @@
[indygreg-231]: https://github.com/indygreg/python-build-standalone/issues/231
[rules_python_1800]: https://github.com/bazelbuild/rules_python/issues/1800
+{#v0-32-0}
## [0.32.0] - 2024-05-12
[0.32.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.32.0
+{#v0-32-0-changed}
### Changed
* (bzlmod): The `MODULE.bazel.lock` `whl_library` rule attributes are now
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 33b296f..d5f24a9 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,6 +65,15 @@
them are slow. If you're working on a particular area of code, you can run just
the tests in those directories instead, which can speed up your edit-run cycle.
+## Updating tool dependencies
+
+It's suggested to routinely update the tool versions within our repo - some of the
+tools are using requirement files compiled by `uv` and others use other means. In order
+to have everything self-documented, we have a special target -
+`//private:requirements.update`, which uses `rules_multirun` to run in sequence all
+of the requirement updating scripts in one go. This can be done once per release as
+we prepare for releases.
+
## Formatting
Starlark files should be formatted by
@@ -194,8 +203,13 @@
of. The API for the control mechanism can be removed in this release.
Note that the `+1` and `+2` releases are just examples; the steps are not
-required to happen in immedially subsequent releases.
+required to happen in immediately subsequent releases.
+Once The first major version is released, the process will be:
+1. In `N.M.0` we introduce the new behaviour, but it is disabled by a feature flag.
+2. In `N.M+1.0` we may choose the behaviour to become the default if it is not too
+ disruptive.
+3. In `N+1.0.0` we get rid of the old behaviour.
### How to control breaking changes
diff --git a/DEVELOPING.md b/DEVELOPING.md
index 0601be5..d816fba 100644
--- a/DEVELOPING.md
+++ b/DEVELOPING.md
@@ -4,7 +4,11 @@
1. Modify the `./python/private/pypi/requirements.txt` file and run:
```
- bazel run //tools/private/update_deps:update_pip_deps
+ bazel run //private:whl_library_requirements.update
+ ```
+1. Run the following target to update `twine` dependencies:
+ ```
+ bazel run //private:requirements.update
```
1. Bump the coverage dependencies using the script using:
```
@@ -20,6 +24,8 @@
Before running through the release it's good to run the build and the tests locally, and make sure CI is passing. You can
also test-drive the commit in an existing Bazel workspace to sanity check functionality.
+### Releasing from HEAD
+
#### Steps
1. [Determine the next semantic version number](#determining-semantic-version)
1. Create a tag and push, e.g. `git tag 0.5.0 upstream/main && git push upstream --tags`
@@ -38,9 +44,30 @@
the commit history. This can be done using github by going to the url:
`https://github.com/bazelbuild/rules_python/compare/<VERSION>...main`.
+### Patch release with cherry picks
+
+If a patch release from head would contain changes that aren't appropriate for
+a patch release, then the patch release needs to be based on the original
+release tag and the patch changes cherry-picked into it.
+
+In this example, release `0.37.0` is being patched to create release `0.37.1`.
+The fix being included is commit `deadbeef`.
+
+1. `git checkout -b release/0.37 0.37.0`
+1. `git push upstream release/0.37`
+1. `git cherry-pick -x deadbeef`
+1. Fix merge conflicts, if any.
+1. `git cherry-pick --continue` (if applicable)
+1. `git push upstream`
+
+If multiple commits need to be applied, repeat the `git cherry-pick` step for
+each.
+
+Once the release branch is in the desired state, use `git tag` to tag it, as
+done with a release from head. Release automation will do the rest.
+
#### After release creation in Github
-1. Ping @philwo to get the new release added to mirror.bazel.build. See [this comment on issue #400](https://github.com/bazelbuild/rules_python/issues/400#issuecomment-779159530) for more context.
1. Announce the release in the #python channel in the Bazel slack (bazelbuild.slack.com).
## Secrets
diff --git a/METADATA b/METADATA
index 7f9ccc1..323c924 100644
--- a/METADATA
+++ b/METADATA
@@ -7,13 +7,13 @@
third_party {
license_type: NOTICE
last_upgrade_date {
- year: 2024
- month: 12
+ year: 2025
+ month: 1
day: 10
}
identifier {
type: "Git"
value: "https://github.com/bazelbuild/rules_python"
- version: "0.37.0"
+ version: "1.0.0"
}
}
diff --git a/MODULE.bazel b/MODULE.bazel
index 0cbae38..2ae3173 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -4,14 +4,14 @@
compatibility_level = 1,
)
-bazel_dep(name = "bazel_features", version = "1.9.1")
-bazel_dep(name = "bazel_skylib", version = "1.6.1")
-bazel_dep(name = "rules_cc", version = "0.0.9")
+bazel_dep(name = "bazel_features", version = "1.21.0")
+bazel_dep(name = "bazel_skylib", version = "1.7.1")
+bazel_dep(name = "rules_cc", version = "0.0.16")
bazel_dep(name = "platforms", version = "0.0.4")
# Those are loaded only when using py_proto_library
-bazel_dep(name = "rules_proto", version = "6.0.0-rc1")
-bazel_dep(name = "protobuf", version = "24.4", repo_name = "com_google_protobuf")
+bazel_dep(name = "rules_proto", version = "7.0.2")
+bazel_dep(name = "protobuf", version = "29.0-rc2", repo_name = "com_google_protobuf")
internal_deps = use_extension("//python/private:internal_deps.bzl", "internal_deps")
use_repo(
@@ -54,30 +54,51 @@
#####################
# Install twine for our own runfiles wheel publishing and allow bzlmod users to use it.
-pip = use_extension("//python/private/pypi:pip.bzl", "pip_internal")
+pip = use_extension("//python/extensions:pip.bzl", "pip")
pip.parse(
+ # NOTE @aignas 2024-10-26: We have an integration test that depends on us
+ # being able to build sdists for this hub, so explicitly set this to False.
+ download_only = False,
+ experimental_index_url = "https://pypi.org/simple",
hub_name = "rules_python_publish_deps",
python_version = "3.11",
requirements_by_platform = {
- "//tools/publish:requirements.txt": "linux_*",
"//tools/publish:requirements_darwin.txt": "osx_*",
+ "//tools/publish:requirements_linux.txt": "linux_*",
"//tools/publish:requirements_windows.txt": "windows_*",
},
)
use_repo(pip, "rules_python_publish_deps")
# Not a dev dependency to allow usage of //sphinxdocs code, which refers to stardoc repos.
-bazel_dep(name = "stardoc", version = "0.6.2", repo_name = "io_bazel_stardoc")
+bazel_dep(name = "stardoc", version = "0.7.2", repo_name = "io_bazel_stardoc")
# ===== DEV ONLY DEPS AND SETUP BELOW HERE =====
-bazel_dep(name = "rules_bazel_integration_test", version = "0.20.0", dev_dependency = True)
+bazel_dep(name = "rules_bazel_integration_test", version = "0.27.0", dev_dependency = True)
bazel_dep(name = "rules_testing", version = "0.6.0", dev_dependency = True)
-bazel_dep(name = "rules_shell", version = "0.2.0", dev_dependency = True)
+bazel_dep(name = "rules_shell", version = "0.3.0", dev_dependency = True)
+bazel_dep(name = "rules_multirun", version = "0.9.0", dev_dependency = True)
+bazel_dep(name = "bazel_ci_rules", version = "1.0.0", dev_dependency = True)
# Extra gazelle plugin deps so that WORKSPACE.bzlmod can continue including it for e2e tests.
# We use `WORKSPACE.bzlmod` because it is impossible to have dev-only local overrides.
bazel_dep(name = "rules_go", version = "0.41.0", dev_dependency = True, repo_name = "io_bazel_rules_go")
-bazel_dep(name = "gazelle", version = "0.33.0", dev_dependency = True, repo_name = "bazel_gazelle")
+bazel_dep(name = "rules_python_gazelle_plugin", version = "0", dev_dependency = True)
+bazel_dep(name = "gazelle", version = "0.40.0", dev_dependency = True, repo_name = "bazel_gazelle")
+
+internal_dev_deps = use_extension(
+ "//python/private:internal_dev_deps.bzl",
+ "internal_dev_deps",
+ dev_dependency = True,
+)
+use_repo(internal_dev_deps, "buildkite_config", "wheel_for_testing")
+
+# Add gazelle plugin so that we can run the gazelle example as an e2e integration
+# test and include the distribution files.
+local_path_override(
+ module_name = "rules_python_gazelle_plugin",
+ path = "gazelle",
+)
dev_python = use_extension(
"//python/extensions:python.bzl",
@@ -89,17 +110,20 @@
)
dev_pip = use_extension(
- "//python/private/pypi:pip.bzl",
- "pip_internal",
+ "//python/extensions:pip.bzl",
+ "pip",
dev_dependency = True,
)
dev_pip.parse(
- download_only = True, # this will not add the `sdist` values to the transitive closures at all.
+ download_only = True,
+ experimental_index_url = "https://pypi.org/simple",
hub_name = "dev_pip",
python_version = "3.11",
requirements_lock = "//docs:requirements.txt",
)
dev_pip.parse(
+ download_only = True,
+ experimental_index_url = "https://pypi.org/simple",
hub_name = "pypiserver",
python_version = "3.11",
requirements_lock = "//examples/wheel:requirements_server.txt",
@@ -120,8 +144,11 @@
path = "tests/integration/bazel_from_env",
)
bazel_binaries.download(version = "6.4.0")
-bazel_binaries.download(version = "7.3.1")
-bazel_binaries.download(version = "rolling")
+bazel_binaries.download(version = "7.4.0")
+
+# For now, don't test with rolling, because that's Bazel 9, which is a ways
+# away.
+# bazel_binaries.download(version = "rolling")
use_repo(
bazel_binaries,
"bazel_binaries",
@@ -129,8 +156,8 @@
# that should be use_repo()'d, so we add them as requested
"bazel_binaries_bazelisk",
"build_bazel_bazel_6_4_0",
- "build_bazel_bazel_7_3_1",
- "build_bazel_bazel_rolling",
+ "build_bazel_bazel_7_4_0",
+ # "build_bazel_bazel_rolling",
"build_bazel_bazel_self",
)
@@ -140,7 +167,7 @@
"uv",
dev_dependency = True,
)
-uv.toolchain(uv_version = "0.2.23")
+uv.toolchain(uv_version = "0.4.25")
use_repo(uv, "uv_toolchains")
register_toolchains(
diff --git a/WORKSPACE b/WORKSPACE
index 33ab37f..f03cc26 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -17,7 +17,7 @@
# Everything below this line is used only for developing rules_python. Users
# should not copy it to their WORKSPACE.
-load("//:internal_deps.bzl", "rules_python_internal_deps")
+load("//:internal_dev_deps.bzl", "rules_python_internal_deps")
rules_python_internal_deps()
@@ -37,7 +37,7 @@
stardoc_pinned_maven_install()
-load("//:internal_setup.bzl", "rules_python_internal_setup")
+load("//:internal_dev_setup.bzl", "rules_python_internal_setup")
rules_python_internal_setup()
@@ -86,7 +86,7 @@
_py_gazelle_deps()
# This interpreter is used for various rules_python dev-time tools
-load("@python//3.11.9:defs.bzl", "interpreter")
+interpreter = "@python_3_11_9_host//:python"
#####################
# Install twine for our own runfiles wheel publishing.
@@ -98,7 +98,7 @@
name = "rules_python_publish_deps",
python_interpreter_target = interpreter,
requirements_darwin = "//tools/publish:requirements_darwin.txt",
- requirements_lock = "//tools/publish:requirements.txt",
+ requirements_lock = "//tools/publish:requirements_linux.txt",
requirements_windows = "//tools/publish:requirements_windows.txt",
)
diff --git a/WORKSPACE.bzlmod b/WORKSPACE.bzlmod
index ca89afe..e69de29 100644
--- a/WORKSPACE.bzlmod
+++ b/WORKSPACE.bzlmod
@@ -1,62 +0,0 @@
-# Copyright 2024 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# This file contains everything that is needed when using bzlmod
-workspace(name = "rules_python")
-
-load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file")
-
-# Used for Bazel CI
-http_archive(
- name = "bazelci_rules",
- sha256 = "eca21884e6f66a88c358e580fd67a6b148d30ab57b1680f62a96c00f9bc6a07e",
- strip_prefix = "bazelci_rules-1.0.0",
- url = "https://github.com/bazelbuild/continuous-integration/releases/download/rules-1.0.0/bazelci_rules-1.0.0.tar.gz",
-)
-
-load("@bazelci_rules//:rbe_repo.bzl", "rbe_preconfig")
-
-# Creates a default toolchain config for RBE.
-# Use this as is if you are using the rbe_ubuntu16_04 container,
-# otherwise refer to RBE docs.
-rbe_preconfig(
- name = "buildkite_config",
- toolchain = "ubuntu1804-bazel-java11",
-)
-
-# Add gazelle plugin so that we can run the gazelle example as an e2e integration
-# test and include the distribution files.
-local_repository(
- name = "rules_python_gazelle_plugin",
- path = "gazelle",
-)
-
-#####################
-
-# This wheel is purely here to validate the wheel extraction code. It's not
-# intended for anything else.
-http_file(
- name = "wheel_for_testing",
- downloaded_file_path = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
- sha256 = "0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2",
- urls = [
- "https://files.pythonhosted.org/packages/50/67/3e966d99a07d60a21a21d7ec016e9e4c2642a86fea251ec68677daf71d4d/numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
- ],
-)
-
-# rules_proto expects //external:python_headers to point at the python headers.
-bind(
- name = "python_headers",
- actual = "//python/cc:current_py_cc_headers",
-)
diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel
index 33d93fd..a9a1db0 100644
--- a/docs/BUILD.bazel
+++ b/docs/BUILD.bazel
@@ -36,7 +36,7 @@
"@platforms//os:linux": [],
"@platforms//os:macos": [],
"//conditions:default": ["@platforms//:incompatible"],
-}) if IS_BAZEL_7_OR_HIGHER else ["@platforms//:incompatible"]
+}) if BZLMOD_ENABLED else ["@platforms//:incompatible"]
# See README.md for instructions. Short version:
# * `bazel run //docs:docs.serve` in a separate terminal
@@ -97,11 +97,11 @@
"//python/cc:py_cc_toolchain_bzl",
"//python/cc:py_cc_toolchain_info_bzl",
"//python/entry_points:py_console_script_binary_bzl",
- "//python/private:py_binary_rule_bazel_bzl",
+ "//python/private:py_binary_rule_bzl",
"//python/private:py_cc_toolchain_rule_bzl",
- "//python/private:py_library_rule_bazel_bzl",
+ "//python/private:py_library_rule_bzl",
"//python/private:py_runtime_rule_bzl",
- "//python/private:py_test_rule_bazel_bzl",
+ "//python/private:py_test_rule_bzl",
"//python/private/api:py_common_api_bzl",
] + ([
# Bazel 6 + Stardoc isn't able to parse something about the python bzlmod extension
@@ -158,6 +158,7 @@
srcs = ["pyproject.toml"],
out = "requirements.txt",
upgrade = True,
+ visibility = ["//private:__pkg__"],
)
# Temporary compatibility aliases for some other projects depending on the old
diff --git a/docs/api/rules_python/python/config_settings/index.md b/docs/api/rules_python/python/config_settings/index.md
index 511a218..ef829ba 100644
--- a/docs/api/rules_python/python/config_settings/index.md
+++ b/docs/api/rules_python/python/config_settings/index.md
@@ -33,6 +33,44 @@
Parses the value of the `python_version` and transforms it into a `X.Y` value.
:::
+:::{bzl:target} is_python_*
+config_settings to match Python versions
+
+The name pattern is `is_python_X.Y` (to match major.minor) and `is_python_X.Y.Z`
+(to match major.minor.patch).
+
+Note that the set of available targets depends on the configured
+`TOOL_VERSIONS`. Versions may not always be available if the root module has
+customized them, or as older Python versions are removed from rules_python's set
+of builtin, known versions.
+
+If you need to match a version that isn't present, then you have two options:
+1. Manually define a `config_setting` and have it match {obj}`--python_version`
+ or {ob}`python_version_major_minor`. This works best when you don't control the
+ root module, or don't want to rely on the MODULE.bazel configuration. Such
+ a config settings would look like:
+ ```
+ # Match any 3.5 version
+ config_setting(
+ name = "is_python_3.5",
+ flag_values = {
+ "@rules_python//python/config_settings:python_version_major_minor": "3.5",
+ }
+ )
+ # Match exactly 3.5.1
+ config_setting(
+ name = "is_python_3.5.1",
+ flag_values = {
+ "@rules_python//python/config_settings:python_version": "3.5.1",
+ }
+ )
+ ```
+
+2. Use {obj}`python.single_override` to re-introduce the desired version so
+ that the corresponding `//python/config_setting:is_python_XXX` target is
+ generated.
+:::
+
::::{bzl:flag} exec_tools_toolchain
Determines if the {obj}`exec_tools_toolchain_type` toolchain is enabled.
@@ -111,6 +149,16 @@
:::
::::
+::::{bzl:flag} py_freethreaded
+Set whether to use an interpreter with the experimental freethreaded option set to true.
+
+Values:
+* `no`: Use regular Python toolchains, default.
+* `yes`: Use the experimental Python toolchain with freethreaded compile option enabled.
+:::{versionadded} 0.38.0
+:::
+::::
+
::::{bzl:flag} pip_whl
Set what distributions are used in the `pip` integration.
diff --git a/docs/conf.py b/docs/conf.py
index 9d33782..4c8e4a2 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -69,9 +69,9 @@
"api/python/defs": "/api/rules_python/python/defs.html",
"api/python/index": "/api/rules_python/python/index.html",
"api/python/py_runtime_info": "/api/rules_python/python/py_runtime_info.html",
- "api/python/private/common/py_library_rule_bazel": "/api/rules_python/python/private/py_library_rule_bazel.html",
+ "api/python/private/common/py_library_rule_bazel": "/api/rules_python/python/private/py_library_rule.html",
"api/python/private/common/py_test_rule_bazel": "/api/rules_python/python/private/py_test_rule_bazel.html",
- "api/python/private/common/py_binary_rule_bazel": "/api/rules_python/python/private/py_binary_rule_bazel.html",
+ "api/python/private/common/py_binary_rule_bazel": "/api/rules_python/python/private/py_binary_rule.html",
"api/python/private/common/py_runtime_rule": "/api/rules_python/python/private/py_runtime_rule.html",
"api/python/extensions/pip": "/api/rules_python/python/extensions/pip.html",
"api/python/extensions/python": "/api/rules_python/python/extensions/python.html",
diff --git a/docs/environment-variables.md b/docs/environment-variables.md
index 2a00529..12c1bcf 100644
--- a/docs/environment-variables.md
+++ b/docs/environment-variables.md
@@ -15,6 +15,16 @@
* `TRACE`
:::
+:::{envvar} RULES_PYTHON_REPO_TOOLCHAIN_VERSION_OS_ARCH
+
+Determines the python interpreter platform to be used for a particular
+interpreter `(version, os, arch)` triple to be used in repository rules.
+Replace the `VERSION_OS_ARCH` part with actual values when using, e.g.
+`3_13_0_linux_x86_64`. The version values must have `_` instead of `.` and the
+os, arch values are the same as the ones mentioned in the
+`//python:versions.bzl` file.
+:::
+
:::{envvar} RULES_PYTHON_PIP_ISOLATED
Determines if `--isolated` is used with pip.
@@ -46,3 +56,9 @@
When `1`, debug information about coverage behavior is printed to stderr.
:::
+
+
+:::{envvar} RULES_PYTHON_GAZELLE_VERBOSE
+
+When `1`, debug information from gazelle is printed to stderr.
+:::
diff --git a/docs/getting-started.md b/docs/getting-started.md
index 45d1962..9f52243 100644
--- a/docs/getting-started.md
+++ b/docs/getting-started.md
@@ -1,7 +1,7 @@
# Getting started
-This doc is a simplified guide to help get started started quickly. It provides
-a simplified introduction to having a working Python program for both bzlmod
+This doc is a simplified guide to help get started quickly. It provides
+a simplified introduction to having a working Python program for both `bzlmod`
and the older way of using `WORKSPACE`.
It assumes you have a `requirements.txt` file with your PyPI dependencies.
@@ -23,11 +23,11 @@
pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip")
pip.parse(
- hub_name = "my_deps",
+ hub_name = "pypi",
python_version = "3.11",
requirements_lock = "//:requirements.txt",
)
-use_repo(pip, "my_deps")
+use_repo(pip, "pypi")
```
## Using a WORKSPACE file
@@ -38,19 +38,14 @@
```starlark
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
-
-# Update the SHA and VERSION to the lastest version available here:
-# https://github.com/bazelbuild/rules_python/releases.
-
-SHA="84aec9e21cc56fbc7f1335035a71c850d1b9b5cc6ff497306f84cced9a769841"
-
-VERSION="0.23.1"
+# Update the snippet based on the latest release below
+# https://github.com/bazelbuild/rules_python/releases
http_archive(
name = "rules_python",
- sha256 = SHA,
- strip_prefix = "rules_python-{}".format(VERSION),
- url = "https://github.com/bazelbuild/rules_python/releases/download/{}/rules_python-{}.tar.gz".format(VERSION,VERSION),
+ sha256 = "ca77768989a7f311186a29747e3e95c936a41dffac779aff6b443db22290d913",
+ strip_prefix = "rules_python-0.36.0",
+ url = "https://github.com/bazelbuild/rules_python/releases/download/0.36.0/rules_python-0.36.0.tar.gz",
)
load("@rules_python//python:repositories.bzl", "py_repositories")
@@ -66,14 +61,12 @@
python_version = "3.11",
)
-load("@python_3_11//:defs.bzl", "interpreter")
-
load("@rules_python//python:pip.bzl", "pip_parse")
pip_parse(
- ...
- python_interpreter_target = interpreter,
- ...
+ name = "pypi",
+ python_interpreter_target = "@python_3_11_host//:python",
+ requirements_lock = "//:requirements.txt",
)
```
@@ -89,8 +82,8 @@
name = "main",
srcs = ["main.py"],
deps = [
- "@my_deps//foo",
- "@my_deps//bar",
+ "@pypi//foo",
+ "@pypi//bar",
]
)
```
diff --git a/docs/index.md b/docs/index.md
index c06c31e..378aac2 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,39 +1,73 @@
# Python Rules for Bazel
-rules_python is the home of the core Python rules -- `py_library`,
-`py_binary`, `py_test`, `py_proto_library`, and related symbols that provide the basis for Python
-support in Bazel. It also contains package installation rules for integrating with PyPI and other indices.
+`rules_python` is the home for 4 major components with varying maturity levels.
-Documentation for rules_python lives here and in the
-[Bazel Build Encyclopedia](https://docs.bazel.build/versions/master/be/python.html).
+:::{topic} Core rules
-Examples are in the {gh-path}`examples` directory.
+The core Python rules -- `py_library`, `py_binary`, `py_test`,
+`py_proto_library`, and related symbols that provide the basis for Python
+support in Bazel.
-Currently, the core rules build into the Bazel binary, and the symbols in this
-repository are simple aliases. However, we are migrating the rules to Starlark and removing them from the Bazel binary. Therefore, the future-proof way to depend on Python rules is via this repository. See
-{ref}`Migrating from the Bundled Rules` below.
+When using Bazel 6 (or earlier), the core rules are bundled into the Bazel binary, and the symbols
+in this repository are simple aliases. On Bazel 7 and above `rules_python` uses
+a separate Starlark implementation,
+see {ref}`Migrating from the Bundled Rules` below.
-The core rules are stable. Their implementation in Bazel is subject to Bazel's
-[backward compatibility policy](https://docs.bazel.build/versions/master/backward-compatibility.html).
-Once migrated to rules_python, they may evolve at a different
-rate, but this repository will still follow [semantic versioning](https://semver.org).
+Once rules_python 1.0 is released, they will follow
+[semantic versioning](https://semver.org) and the breaking change policy
+outlined in the [support](support) page.
-The Bazel community maintains this repository. Neither Google nor the Bazel team provides support for the code. However, this repository is part of the test suite used to vet new Bazel releases. See
-{gh-path}`How to contribute <CONTRIBUTING.md>` for information on our development workflow.
+:::
-## Bzlmod support
+:::{topic} PyPI integration
-- Status: Beta
-- Full Feature Parity: No
+Package installation rules for integrating with PyPI and other SimpleAPI
+compatible indexes.
-See {gh-path}`Bzlmod support <BZLMOD_SUPPORT.md>` for more details
+These rules work and can be used in production, but the cross-platform building
+that supports pulling PyPI dependencies for a target platform that is different
+from the host platform is still in beta and the APIs that are subject to potential
+change are marked as `experimental`.
+
+:::
+
+:::{topic} Sphinxdocs
+
+`sphinxdocs` rules allow users to generate documentation using Sphinx powered by Bazel, with additional functionality for documenting
+Starlark and Bazel code.
+
+The functionality is exposed because other projects find it useful, but
+it is available as is and **the semantic versioning and
+compatibility policy used by `rules_python` does not apply**.
+
+:::
+
+:::{topic} Gazelle plugin
+
+`gazelle` plugin for generating `BUILD.bazel` files based on Python source
+code.
+
+This is available as is and the semantic versioning used by `rules_python` does
+not apply.
+
+:::
+
+The Bazel community maintains this repository. Neither Google nor the Bazel
+team provides support for the code. However, this repository is part of the
+test suite used to vet new Bazel releases. See {gh-path}`How to contribute
+<CONTRIBUTING.md>` for information on our development workflow.
+
+## Examples
+
+This documentation is an example of `sphinxdocs` rules and the rest of the
+components have examples in the {gh-path}`examples` directory.
## Migrating from the bundled rules
The core rules are currently available in Bazel as built-in symbols, but this
form is deprecated. Instead, you should depend on rules_python in your
-`WORKSPACE` file and load the Python rules from
-`@rules_python//python:defs.bzl`.
+`WORKSPACE` or `MODULE.bazel` file and load the Python rules from
+`@rules_python//python:defs.bzl` or load paths described in the API documentation.
A [buildifier](https://github.com/bazelbuild/buildtools/blob/master/buildifier/README.md)
fix is available to automatically migrate `BUILD` and `.bzl` files to add the
@@ -44,13 +78,18 @@
buildifier --lint=fix --warnings=native-py <files>
```
-Currently, the `WORKSPACE` file needs to be updated manually as per [Getting
-started](getting-started).
+Currently, the `WORKSPACE` file needs to be updated manually as per
+[Getting started](getting-started).
Note that Starlark-defined bundled symbols underneath
`@bazel_tools//tools/python` are also deprecated. These are not yet rewritten
by buildifier.
+## Migrating to bzlmod
+
+See {gh-path}`Bzlmod support <BZLMOD_SUPPORT.md>` for any behaviour differences between
+`bzlmod` and `WORKSPACE`.
+
```{toctree}
:hidden:
diff --git a/docs/precompiling.md b/docs/precompiling.md
index 6eadc40..a46608f 100644
--- a/docs/precompiling.md
+++ b/docs/precompiling.md
@@ -39,6 +39,30 @@
* targets must opt-out: `--@rules_python//python/config_settings:precompile=enabled`
* targets must opt-in: `--@rules_python//python/config_settings:precompile=disabled`
+## Pyc-only builds
+
+A pyc-only build (aka "source less" builds) is when only `.pyc` files are
+included; the source `.py` files are not included.
+
+To enable this, set
+{bzl:obj}`--@rules_python//python/config_settings:precompile_source_retention=omit_source`
+flag on the command line or the {bzl:attr}`precompile_source_retention=omit_source`
+attribute on specific targets.
+
+The advantage of pyc-only builds are:
+* Fewer total files in a binary.
+* Imports _may_ be _slightly_ faster.
+
+The disadvantages are:
+* Error messages will be less precise because the precise line and offset
+ information isn't in an pyc file.
+* pyc files are Python major-version specific.
+
+:::{note}
+pyc files are not a form of hiding source code. They are trivial to uncompile,
+and uncompiling them can recover almost the original source.
+:::
+
## Advanced precompiler customization
The default implementation of the precompiler is a persistent, multiplexed,
@@ -83,7 +107,7 @@
* Mixing rules_python PyInfo with Bazel builtin PyInfo will result in pyc files
being dropped.
* Precompiled files may not be used in certain cases prior to Python 3.11. This
- occurs due Python adding the directory of the binary's main `.py` file, which
+ occurs due to Python adding the directory of the binary's main `.py` file, which
causes the module to be found in the workspace source directory instead of
within the binary's runfiles directory (where the pyc files are). This can
usually be worked around by removing `sys.path[0]` (or otherwise ensuring the
diff --git a/docs/pypi-dependencies.md b/docs/pypi-dependencies.md
index 636fefb..28e630c 100644
--- a/docs/pypi-dependencies.md
+++ b/docs/pypi-dependencies.md
@@ -308,6 +308,59 @@
(bazel-downloader)=
+### Multi-platform support
+
+Multi-platform support of cross-building the wheels can be done in two ways - either
+using {bzl:attr}`experimental_index_url` for the {bzl:obj}`pip.parse` bzlmod tag class
+or by using the {bzl:attr}`pip.parse.download_only` setting. In this section we
+are going to outline quickly how one can use the latter option.
+
+Let's say you have 2 requirements files:
+```
+# requirements.linux_x86_64.txt
+--platform=manylinux_2_17_x86_64
+--python-version=39
+--implementation=cp
+--abi=cp39
+
+foo==0.0.1 --hash=sha256:deadbeef
+bar==0.0.1 --hash=sha256:deadb00f
+```
+
+```
+# requirements.osx_aarch64.txt contents
+--platform=macosx_10_9_arm64
+--python-version=39
+--implementation=cp
+--abi=cp39
+
+foo==0.0.3 --hash=sha256:deadbaaf
+```
+
+With these 2 files your {bzl:obj}`pip.parse` could look like:
+```
+pip.parse(
+ hub_name = "pip",
+ python_version = "3.9",
+ # Tell `pip` to ignore sdists
+ download_only = True,
+ requirements_by_platform = {
+ "requirements.linux_x86_64.txt": "linux_x86_64",
+ "requirements.osx_aarch64.txt": "osx_aarch64",
+ },
+)
+```
+
+With this, the `pip.parse` will create a hub repository that is going to
+support only two platforms - `cp39_osx_aarch64` and `cp39_linux_x86_64` and it
+will only use `wheels` and ignore any sdists that it may find on the PyPI
+compatible indexes.
+
+```{note}
+This is only supported on `bzlmd`.
+```
+
+(bazel-downloader)=
### Bazel downloader and multi-platform wheel hub repository.
The `bzlmod` `pip.parse` call supports pulling information from `PyPI` (or a
diff --git a/docs/requirements.txt b/docs/requirements.txt
index dcaa74e..2e306cd 100644
--- a/docs/requirements.txt
+++ b/docs/requirements.txt
@@ -10,9 +10,9 @@
--hash=sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e \
--hash=sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b
# via sphinx
-astroid==3.3.2 \
- --hash=sha256:99e9b5b602cbb005434084309213d6af32bf7a9b743c836749168b8e2b330cbd \
- --hash=sha256:9f8136ce9770e0f912401b25a0f15d5c2ec20b50e99b1b413ac0778fe53ff6f1
+astroid==3.3.5 \
+ --hash=sha256:5cfc40ae9f68311075d27ef68a4841bdc5cc7f6cf86671b49f00607d30188e2d \
+ --hash=sha256:a9d1c946ada25098d790e079ba2a1b112157278f3fb7e718ae6a9252f5835dc8
# via sphinx-autodoc2
babel==2.16.0 \
--hash=sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b \
@@ -22,97 +22,112 @@
--hash=sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 \
--hash=sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9
# via requests
-charset-normalizer==3.3.2 \
- --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \
- --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \
- --hash=sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786 \
- --hash=sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8 \
- --hash=sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09 \
- --hash=sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185 \
- --hash=sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574 \
- --hash=sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e \
- --hash=sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519 \
- --hash=sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898 \
- --hash=sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269 \
- --hash=sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3 \
- --hash=sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f \
- --hash=sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6 \
- --hash=sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8 \
- --hash=sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a \
- --hash=sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73 \
- --hash=sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc \
- --hash=sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714 \
- --hash=sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2 \
- --hash=sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc \
- --hash=sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce \
- --hash=sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d \
- --hash=sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e \
- --hash=sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6 \
- --hash=sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269 \
- --hash=sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 \
- --hash=sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d \
- --hash=sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a \
- --hash=sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4 \
- --hash=sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 \
- --hash=sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d \
- --hash=sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0 \
- --hash=sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed \
- --hash=sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068 \
- --hash=sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac \
- --hash=sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25 \
- --hash=sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 \
- --hash=sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab \
- --hash=sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26 \
- --hash=sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2 \
- --hash=sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db \
- --hash=sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f \
- --hash=sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5 \
- --hash=sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99 \
- --hash=sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c \
- --hash=sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d \
- --hash=sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811 \
- --hash=sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa \
- --hash=sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a \
- --hash=sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03 \
- --hash=sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b \
- --hash=sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04 \
- --hash=sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c \
- --hash=sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001 \
- --hash=sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458 \
- --hash=sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389 \
- --hash=sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99 \
- --hash=sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985 \
- --hash=sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537 \
- --hash=sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238 \
- --hash=sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f \
- --hash=sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d \
- --hash=sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 \
- --hash=sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a \
- --hash=sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143 \
- --hash=sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8 \
- --hash=sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c \
- --hash=sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5 \
- --hash=sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5 \
- --hash=sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711 \
- --hash=sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4 \
- --hash=sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6 \
- --hash=sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c \
- --hash=sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7 \
- --hash=sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4 \
- --hash=sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b \
- --hash=sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae \
- --hash=sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12 \
- --hash=sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c \
- --hash=sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae \
- --hash=sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8 \
- --hash=sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887 \
- --hash=sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b \
- --hash=sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4 \
- --hash=sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f \
- --hash=sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5 \
- --hash=sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33 \
- --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \
- --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561
+charset-normalizer==3.4.0 \
+ --hash=sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621 \
+ --hash=sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6 \
+ --hash=sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8 \
+ --hash=sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912 \
+ --hash=sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c \
+ --hash=sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b \
+ --hash=sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d \
+ --hash=sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d \
+ --hash=sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95 \
+ --hash=sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e \
+ --hash=sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565 \
+ --hash=sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64 \
+ --hash=sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab \
+ --hash=sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be \
+ --hash=sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e \
+ --hash=sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907 \
+ --hash=sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0 \
+ --hash=sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2 \
+ --hash=sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62 \
+ --hash=sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62 \
+ --hash=sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23 \
+ --hash=sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc \
+ --hash=sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284 \
+ --hash=sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca \
+ --hash=sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455 \
+ --hash=sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858 \
+ --hash=sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b \
+ --hash=sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594 \
+ --hash=sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc \
+ --hash=sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db \
+ --hash=sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b \
+ --hash=sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea \
+ --hash=sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6 \
+ --hash=sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920 \
+ --hash=sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749 \
+ --hash=sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7 \
+ --hash=sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd \
+ --hash=sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99 \
+ --hash=sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242 \
+ --hash=sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee \
+ --hash=sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129 \
+ --hash=sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2 \
+ --hash=sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51 \
+ --hash=sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee \
+ --hash=sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8 \
+ --hash=sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b \
+ --hash=sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613 \
+ --hash=sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742 \
+ --hash=sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe \
+ --hash=sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3 \
+ --hash=sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5 \
+ --hash=sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631 \
+ --hash=sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7 \
+ --hash=sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15 \
+ --hash=sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c \
+ --hash=sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea \
+ --hash=sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417 \
+ --hash=sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250 \
+ --hash=sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88 \
+ --hash=sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca \
+ --hash=sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa \
+ --hash=sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99 \
+ --hash=sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149 \
+ --hash=sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41 \
+ --hash=sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574 \
+ --hash=sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0 \
+ --hash=sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f \
+ --hash=sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d \
+ --hash=sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654 \
+ --hash=sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3 \
+ --hash=sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19 \
+ --hash=sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90 \
+ --hash=sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578 \
+ --hash=sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9 \
+ --hash=sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1 \
+ --hash=sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51 \
+ --hash=sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719 \
+ --hash=sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236 \
+ --hash=sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a \
+ --hash=sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c \
+ --hash=sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade \
+ --hash=sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944 \
+ --hash=sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc \
+ --hash=sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6 \
+ --hash=sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6 \
+ --hash=sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27 \
+ --hash=sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6 \
+ --hash=sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2 \
+ --hash=sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12 \
+ --hash=sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf \
+ --hash=sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114 \
+ --hash=sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7 \
+ --hash=sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf \
+ --hash=sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d \
+ --hash=sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b \
+ --hash=sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed \
+ --hash=sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03 \
+ --hash=sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4 \
+ --hash=sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67 \
+ --hash=sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365 \
+ --hash=sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a \
+ --hash=sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748 \
+ --hash=sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b \
+ --hash=sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079 \
+ --hash=sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482
# via requests
colorama==0.4.6 ; sys_platform == 'win32' \
--hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \
@@ -146,68 +161,68 @@
# via
# mdit-py-plugins
# myst-parser
-markupsafe==3.0.1 \
- --hash=sha256:0778de17cff1acaeccc3ff30cd99a3fd5c50fc58ad3d6c0e0c4c58092b859396 \
- --hash=sha256:0f84af7e813784feb4d5e4ff7db633aba6c8ca64a833f61d8e4eade234ef0c38 \
- --hash=sha256:17b2aea42a7280db02ac644db1d634ad47dcc96faf38ab304fe26ba2680d359a \
- --hash=sha256:242d6860f1fd9191aef5fae22b51c5c19767f93fb9ead4d21924e0bcb17619d8 \
- --hash=sha256:244dbe463d5fb6d7ce161301a03a6fe744dac9072328ba9fc82289238582697b \
- --hash=sha256:26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad \
- --hash=sha256:2a4b34a8d14649315c4bc26bbfa352663eb51d146e35eef231dd739d54a5430a \
- --hash=sha256:2ae99f31f47d849758a687102afdd05bd3d3ff7dbab0a8f1587981b58a76152a \
- --hash=sha256:312387403cd40699ab91d50735ea7a507b788091c416dd007eac54434aee51da \
- --hash=sha256:3341c043c37d78cc5ae6e3e305e988532b072329639007fd408a476642a89fd6 \
- --hash=sha256:33d1c36b90e570ba7785dacd1faaf091203d9942bc036118fab8110a401eb1a8 \
- --hash=sha256:3e683ee4f5d0fa2dde4db77ed8dd8a876686e3fc417655c2ece9a90576905344 \
- --hash=sha256:3ffb4a8e7d46ed96ae48805746755fadd0909fea2306f93d5d8233ba23dda12a \
- --hash=sha256:40621d60d0e58aa573b68ac5e2d6b20d44392878e0bfc159012a5787c4e35bc8 \
- --hash=sha256:40f1e10d51c92859765522cbd79c5c8989f40f0419614bcdc5015e7b6bf97fc5 \
- --hash=sha256:45d42d132cff577c92bfba536aefcfea7e26efb975bd455db4e6602f5c9f45e7 \
- --hash=sha256:48488d999ed50ba8d38c581d67e496f955821dc183883550a6fbc7f1aefdc170 \
- --hash=sha256:4935dd7883f1d50e2ffecca0aa33dc1946a94c8f3fdafb8df5c330e48f71b132 \
- --hash=sha256:4c2d64fdba74ad16138300815cfdc6ab2f4647e23ced81f59e940d7d4a1469d9 \
- --hash=sha256:4c8817557d0de9349109acb38b9dd570b03cc5014e8aabf1cbddc6e81005becd \
- --hash=sha256:4ffaaac913c3f7345579db4f33b0020db693f302ca5137f106060316761beea9 \
- --hash=sha256:5a4cb365cb49b750bdb60b846b0c0bc49ed62e59a76635095a179d440540c346 \
- --hash=sha256:62fada2c942702ef8952754abfc1a9f7658a4d5460fabe95ac7ec2cbe0d02abc \
- --hash=sha256:67c519635a4f64e495c50e3107d9b4075aec33634272b5db1cde839e07367589 \
- --hash=sha256:6a54c43d3ec4cf2a39f4387ad044221c66a376e58c0d0e971d47c475ba79c6b5 \
- --hash=sha256:7044312a928a66a4c2a22644147bc61a199c1709712069a344a3fb5cfcf16915 \
- --hash=sha256:730d86af59e0e43ce277bb83970530dd223bf7f2a838e086b50affa6ec5f9295 \
- --hash=sha256:800100d45176652ded796134277ecb13640c1a537cad3b8b53da45aa96330453 \
- --hash=sha256:80fcbf3add8790caddfab6764bde258b5d09aefbe9169c183f88a7410f0f6dea \
- --hash=sha256:82b5dba6eb1bcc29cc305a18a3c5365d2af06ee71b123216416f7e20d2a84e5b \
- --hash=sha256:852dc840f6d7c985603e60b5deaae1d89c56cb038b577f6b5b8c808c97580f1d \
- --hash=sha256:8ad4ad1429cd4f315f32ef263c1342166695fad76c100c5d979c45d5570ed58b \
- --hash=sha256:8ae369e84466aa70f3154ee23c1451fda10a8ee1b63923ce76667e3077f2b0c4 \
- --hash=sha256:93e8248d650e7e9d49e8251f883eed60ecbc0e8ffd6349e18550925e31bd029b \
- --hash=sha256:973a371a55ce9ed333a3a0f8e0bcfae9e0d637711534bcb11e130af2ab9334e7 \
- --hash=sha256:9ba25a71ebf05b9bb0e2ae99f8bc08a07ee8e98c612175087112656ca0f5c8bf \
- --hash=sha256:a10860e00ded1dd0a65b83e717af28845bb7bd16d8ace40fe5531491de76b79f \
- --hash=sha256:a4792d3b3a6dfafefdf8e937f14906a51bd27025a36f4b188728a73382231d91 \
- --hash=sha256:a7420ceda262dbb4b8d839a4ec63d61c261e4e77677ed7c66c99f4e7cb5030dd \
- --hash=sha256:ad91738f14eb8da0ff82f2acd0098b6257621410dcbd4df20aaa5b4233d75a50 \
- --hash=sha256:b6a387d61fe41cdf7ea95b38e9af11cfb1a63499af2759444b99185c4ab33f5b \
- --hash=sha256:b954093679d5750495725ea6f88409946d69cfb25ea7b4c846eef5044194f583 \
- --hash=sha256:bbde71a705f8e9e4c3e9e33db69341d040c827c7afa6789b14c6e16776074f5a \
- --hash=sha256:beeebf760a9c1f4c07ef6a53465e8cfa776ea6a2021eda0d0417ec41043fe984 \
- --hash=sha256:c91b394f7601438ff79a4b93d16be92f216adb57d813a78be4446fe0f6bc2d8c \
- --hash=sha256:c97ff7fedf56d86bae92fa0a646ce1a0ec7509a7578e1ed238731ba13aabcd1c \
- --hash=sha256:cb53e2a99df28eee3b5f4fea166020d3ef9116fdc5764bc5117486e6d1211b25 \
- --hash=sha256:cbf445eb5628981a80f54087f9acdbf84f9b7d862756110d172993b9a5ae81aa \
- --hash=sha256:d06b24c686a34c86c8c1fba923181eae6b10565e4d80bdd7bc1c8e2f11247aa4 \
- --hash=sha256:d98e66a24497637dd31ccab090b34392dddb1f2f811c4b4cd80c230205c074a3 \
- --hash=sha256:db15ce28e1e127a0013dfb8ac243a8e392db8c61eae113337536edb28bdc1f97 \
- --hash=sha256:db842712984e91707437461930e6011e60b39136c7331e971952bb30465bc1a1 \
- --hash=sha256:e24bfe89c6ac4c31792793ad9f861b8f6dc4546ac6dc8f1c9083c7c4f2b335cd \
- --hash=sha256:e81c52638315ff4ac1b533d427f50bc0afc746deb949210bc85f05d4f15fd772 \
- --hash=sha256:e9393357f19954248b00bed7c56f29a25c930593a77630c719653d51e7669c2a \
- --hash=sha256:ee3941769bd2522fe39222206f6dd97ae83c442a94c90f2b7a25d847d40f4729 \
- --hash=sha256:f31ae06f1328595d762c9a2bf29dafd8621c7d3adc130cbb46278079758779ca \
- --hash=sha256:f94190df587738280d544971500b9cafc9b950d32efcb1fba9ac10d84e6aa4e6 \
- --hash=sha256:fa7d686ed9883f3d664d39d5a8e74d3c5f63e603c2e3ff0abcba23eac6542635 \
- --hash=sha256:fb532dd9900381d2e8f48172ddc5a59db4c445a11b9fab40b3b786da40d3b56b \
- --hash=sha256:fe32482b37b4b00c7a52a07211b479653b7fe4f22b2e481b9a9b099d8a430f2f
+markupsafe==3.0.2 \
+ --hash=sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4 \
+ --hash=sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30 \
+ --hash=sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0 \
+ --hash=sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9 \
+ --hash=sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396 \
+ --hash=sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13 \
+ --hash=sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028 \
+ --hash=sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca \
+ --hash=sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557 \
+ --hash=sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832 \
+ --hash=sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0 \
+ --hash=sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b \
+ --hash=sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579 \
+ --hash=sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a \
+ --hash=sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c \
+ --hash=sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff \
+ --hash=sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c \
+ --hash=sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22 \
+ --hash=sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094 \
+ --hash=sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb \
+ --hash=sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e \
+ --hash=sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5 \
+ --hash=sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a \
+ --hash=sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d \
+ --hash=sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a \
+ --hash=sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b \
+ --hash=sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8 \
+ --hash=sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225 \
+ --hash=sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c \
+ --hash=sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144 \
+ --hash=sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f \
+ --hash=sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87 \
+ --hash=sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d \
+ --hash=sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93 \
+ --hash=sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf \
+ --hash=sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158 \
+ --hash=sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84 \
+ --hash=sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb \
+ --hash=sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48 \
+ --hash=sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171 \
+ --hash=sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c \
+ --hash=sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6 \
+ --hash=sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd \
+ --hash=sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d \
+ --hash=sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1 \
+ --hash=sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d \
+ --hash=sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca \
+ --hash=sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a \
+ --hash=sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29 \
+ --hash=sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe \
+ --hash=sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798 \
+ --hash=sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c \
+ --hash=sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8 \
+ --hash=sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f \
+ --hash=sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f \
+ --hash=sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a \
+ --hash=sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178 \
+ --hash=sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0 \
+ --hash=sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79 \
+ --hash=sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430 \
+ --hash=sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50
# via jinja2
mdit-py-plugins==0.4.2 \
--hash=sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636 \
@@ -300,9 +315,9 @@
--hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 \
--hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a
# via sphinx
-sphinx==8.0.2 \
- --hash=sha256:0cce1ddcc4fd3532cf1dd283bc7d886758362c5c1de6598696579ce96d8ffa5b \
- --hash=sha256:56173572ae6c1b9a38911786e206a110c9749116745873feae4f9ce88e59391d
+sphinx==8.1.3 \
+ --hash=sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2 \
+ --hash=sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927
# via
# rules-python-docs (docs/pyproject.toml)
# myst-parser
diff --git a/docs/toolchains.md b/docs/toolchains.md
index 6df6f22..db4c6ba 100644
--- a/docs/toolchains.md
+++ b/docs/toolchains.md
@@ -444,10 +444,26 @@
],
exec_comaptible_with = ["@platforms/os:linux"]
)
+
+# File: MODULE.bazel or WORKSPACE.bazel
+# These toolchains will considered before others
+register_toolchains("//toolchains:all")
```
+When registering custom toolchains, be aware of the the [toolchain registration
+order](https://bazel.build/extending/toolchains#toolchain-resolution). In brief,
+toolchain order is the BFS-order of the modules; see the bazel docs for a more
+detailed description.
+
:::{note}
The toolchain() calls should be in a separate BUILD file from everything else.
This avoids Bazel having to perform unnecessary work when it discovers the list
of available toolchains.
:::
+
+## Toolchain selection flags
+
+Currently the following flags are used to influence toolchain selection:
+* {obj}`--@rules_python//python/config_settings:py_linux_libc` for selecting the Linux libc variant.
+* {obj}`--@rules_python//python/config_settings:py_freethreaded` for selecting
+ the freethreaded experimental Python builds available from `3.13.0` onwards.
diff --git a/examples/build_file_generation/.bazelrc b/examples/build_file_generation/.bazelrc
index e0b1984..fd0f731 100644
--- a/examples/build_file_generation/.bazelrc
+++ b/examples/build_file_generation/.bazelrc
@@ -6,3 +6,5 @@
# The bzlmod version of this example is in examples/bzlmod_build_file_generation
# Once WORKSPACE support is dropped, this example can be entirely deleted.
build --experimental_enable_bzlmod=false
+
+common:bazel7.x --incompatible_python_disallow_native_rules
diff --git a/examples/bzlmod/.bazelrc b/examples/bzlmod/.bazelrc
index fd16095..ca83047 100644
--- a/examples/bzlmod/.bazelrc
+++ b/examples/bzlmod/.bazelrc
@@ -7,3 +7,4 @@
# Windows requires these for multi-python support:
build --enable_runfiles
+common:bazel7.x --incompatible_python_disallow_native_rules
diff --git a/examples/bzlmod/.bazelversion b/examples/bzlmod/.bazelversion
index 643916c..35907cd 100644
--- a/examples/bzlmod/.bazelversion
+++ b/examples/bzlmod/.bazelversion
@@ -1 +1 @@
-7.3.1
+7.x
diff --git a/examples/bzlmod/BUILD.bazel b/examples/bzlmod/BUILD.bazel
index d684b9c..054b957 100644
--- a/examples/bzlmod/BUILD.bazel
+++ b/examples/bzlmod/BUILD.bazel
@@ -69,16 +69,24 @@
# to run some of the tests.
# See: https://github.com/bazelbuild/bazel-skylib/blob/main/docs/build_test_doc.md
build_test(
- name = "all_wheels",
+ name = "all_wheels_build_test",
targets = all_whl_requirements,
)
build_test(
- name = "all_data_requirements",
+ name = "all_data_requirements_build_test",
targets = all_data_requirements,
)
build_test(
- name = "all_requirements",
+ name = "all_requirements_build_test",
targets = all_requirements,
)
+
+# Check the annotations API
+build_test(
+ name = "extra_annotation_targets_build_test",
+ targets = [
+ "@pip//wheel:generated_file",
+ ],
+)
diff --git a/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel
index e9d69c5..0a31c3b 100644
--- a/examples/bzlmod/MODULE.bazel
+++ b/examples/bzlmod/MODULE.bazel
@@ -4,7 +4,7 @@
compatibility_level = 1,
)
-bazel_dep(name = "bazel_skylib", version = "1.4.1")
+bazel_dep(name = "bazel_skylib", version = "1.7.1")
bazel_dep(name = "rules_python", version = "0.0.0")
local_path_override(
module_name = "rules_python",
@@ -12,10 +12,20 @@
)
# (py_proto_library specific) We are using rules_proto to define rules_proto targets to be consumed by py_proto_library.
-bazel_dep(name = "rules_proto", version = "5.3.0-21.7")
+bazel_dep(name = "rules_proto", version = "6.0.0-rc1")
# (py_proto_library specific) Add the protobuf library for well-known types (e.g. `Any`, `Timestamp`, etc)
-bazel_dep(name = "protobuf", version = "24.4", repo_name = "com_google_protobuf")
+bazel_dep(name = "protobuf", version = "27.0", repo_name = "com_google_protobuf")
+
+# Only needed to make rules_python's CI happy. rules_java 8.3.0+ is needed so
+# that --java_runtime_version=remotejdk_11 works with Bazel 8.
+bazel_dep(name = "rules_java", version = "8.3.1")
+
+# Only needed to make rules_python's CI happy. A test verifies that
+# MODULE.bazel.lock is cross-platform friendly, and there are transitive
+# dependencies on rules_rust, so we need rules_rust 0.54.1+ where such issues
+# were fixed.
+bazel_dep(name = "rules_rust", version = "0.54.1")
# We next initialize the python toolchain using the extension.
# You can set different Python versions in this block.
@@ -40,14 +50,16 @@
# One can override the actual toolchain versions that are available, which can be useful
# when optimizing what gets downloaded and when.
python.override(
- available_python_versions = [
- "3.10.9",
- "3.9.18",
- "3.9.19",
- # The following is used by the `other_module` and we need to include it here
- # as well.
- "3.11.8",
- ],
+ # NOTE: These are disabled in the example because transitive dependencies
+ # require versions not listed here.
+ # available_python_versions = [
+ # "3.10.9",
+ # "3.9.18",
+ # "3.9.19",
+ # # The following is used by the `other_module` and we need to include it here
+ # # as well.
+ # "3.11.8",
+ # ],
# Also override the `minor_mapping` so that the root module,
# instead of rules_python's defaulting to the latest available version,
# controls what full version is used when `3.x` is requested.
@@ -93,7 +105,7 @@
# EXPERIMENTAL: This is experimental and may be removed without notice
uv = use_extension("@rules_python//python/uv:extensions.bzl", "uv")
-uv.toolchain(uv_version = "0.2.23")
+uv.toolchain(uv_version = "0.4.25")
use_repo(uv, "uv_toolchains")
register_toolchains("@uv_toolchains//:all")
@@ -181,6 +193,9 @@
"cp39_linux_*",
"cp39_*",
],
+ extra_hub_aliases = {
+ "wheel": ["generated_file"],
+ },
hub_name = "pip",
python_version = "3.9",
requirements_lock = "requirements_lock_3_9.txt",
@@ -258,4 +273,4 @@
)
# example test dependencies
-bazel_dep(name = "rules_shell", version = "0.2.0", dev_dependency = True)
+bazel_dep(name = "rules_shell", version = "0.3.0", dev_dependency = True)
diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock
deleted file mode 100644
index 8c66a13..0000000
--- a/examples/bzlmod/MODULE.bazel.lock
+++ /dev/null
@@ -1,8743 +0,0 @@
-{
- "lockFileVersion": 11,
- "registryFileHashes": {
- "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497",
- "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2",
- "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589",
- "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0",
- "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb",
- "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/source.json": "14892cc698e02ffedf4967546e6bedb7245015906888d3465fcf27c90a26da10",
- "https://bcr.bazel.build/modules/apple_support/1.5.0/MODULE.bazel": "50341a62efbc483e8a2a6aec30994a58749bd7b885e18dd96aa8c33031e558ef",
- "https://bcr.bazel.build/modules/apple_support/1.5.0/source.json": "eb98a7627c0bc486b57f598ad8da50f6625d974c8f723e9ea71bd39f709c9862",
- "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8",
- "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a",
- "https://bcr.bazel.build/modules/bazel_features/1.18.0/source.json": "cde886d88c8164b50b9b97dba7c0a64ca24d257b72ca3a2fcb06bee1fdb47ee4",
- "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a",
- "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8",
- "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686",
- "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a",
- "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5",
- "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d",
- "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651",
- "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138",
- "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917",
- "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/source.json": "082ed5f9837901fada8c68c2f3ddc958bb22b6d654f71dd73f3df30d45d4b749",
- "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84",
- "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8",
- "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4",
- "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f",
- "https://bcr.bazel.build/modules/googletest/1.14.0/source.json": "2478949479000fdd7de9a3d0107ba2c85bb5f961c3ecb1aa448f52549ce310b5",
- "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5",
- "https://bcr.bazel.build/modules/platforms/0.0.10/source.json": "f22828ff4cf021a6b577f1bf6341cb9dcd7965092a439f64fc1bb3b7a5ae4bd5",
- "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee",
- "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37",
- "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615",
- "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814",
- "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d",
- "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc",
- "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7",
- "https://bcr.bazel.build/modules/protobuf/23.1/MODULE.bazel": "88b393b3eb4101d18129e5db51847cd40a5517a53e81216144a8c32dfeeca52a",
- "https://bcr.bazel.build/modules/protobuf/24.4/MODULE.bazel": "7bc7ce5f2abf36b3b7b7c8218d3acdebb9426aeb35c2257c96445756f970eb12",
- "https://bcr.bazel.build/modules/protobuf/24.4/source.json": "ace4b8c65d4cfe64efe544f09fc5e5df77faf3a67fbb29c5341e0d755d9b15d6",
- "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0",
- "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858",
- "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647",
- "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c",
- "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f",
- "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e",
- "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5",
- "https://bcr.bazel.build/modules/rules_cc/0.0.9/source.json": "1f1ba6fea244b616de4a554a0f4983c91a9301640c8fe0dd1d410254115c8430",
- "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74",
- "https://bcr.bazel.build/modules/rules_java/6.3.0/MODULE.bazel": "a97c7678c19f236a956ad260d59c86e10a463badb7eb2eda787490f4c969b963",
- "https://bcr.bazel.build/modules/rules_java/7.1.0/MODULE.bazel": "30d9135a2b6561c761bd67bd4990da591e6bdc128790ce3e7afd6a3558b2fb64",
- "https://bcr.bazel.build/modules/rules_java/7.6.5/MODULE.bazel": "481164be5e02e4cab6e77a36927683263be56b7e36fef918b458d7a8a1ebadb1",
- "https://bcr.bazel.build/modules/rules_java/7.6.5/source.json": "a805b889531d1690e3c72a7a7e47a870d00323186a9904b36af83aa3d053ee8d",
- "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7",
- "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909",
- "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036",
- "https://bcr.bazel.build/modules/rules_jvm_external/5.2/source.json": "10572111995bc349ce31c78f74b3c147f6b3233975c7fa5eff9211f6db0d34d9",
- "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0",
- "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d",
- "https://bcr.bazel.build/modules/rules_license/0.0.7/source.json": "355cc5737a0f294e560d52b1b7a6492d4fff2caf0bef1a315df5a298fca2d34a",
- "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc",
- "https://bcr.bazel.build/modules/rules_pkg/0.7.0/source.json": "c2557066e0c0342223ba592510ad3d812d4963b9024831f7f66fd0584dd8c66c",
- "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06",
- "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7",
- "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483",
- "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/source.json": "8d8448e71706df7450ced227ca6b3812407ff5e2ccad74a43a9fbe79c84e34e0",
- "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c",
- "https://bcr.bazel.build/modules/rules_shell/0.2.0/source.json": "7f27af3c28037d9701487c4744b5448d26537cc66cdef0d8df7ae85411f8de95",
- "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8",
- "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c",
- "https://bcr.bazel.build/modules/stardoc/0.6.2/MODULE.bazel": "7060193196395f5dd668eda046ccbeacebfd98efc77fed418dbe2b82ffaa39fd",
- "https://bcr.bazel.build/modules/stardoc/0.6.2/source.json": "d2ff8063b63b4a85e65fe595c4290f99717434fa9f95b4748a79a7d04dfed349",
- "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43",
- "https://bcr.bazel.build/modules/upb/0.0.0-20230516-61a97ef/MODULE.bazel": "c0df5e35ad55e264160417fd0875932ee3c9dda63d9fccace35ac62f45e1b6f9",
- "https://bcr.bazel.build/modules/upb/0.0.0-20230516-61a97ef/source.json": "b2150404947339e8b947c6b16baa39fa75657f4ddec5e37272c7b11c7ab533bc",
- "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0",
- "https://bcr.bazel.build/modules/zlib/1.2.12/MODULE.bazel": "3b1a8834ada2a883674be8cbd36ede1b6ec481477ada359cd2d3ddc562340b27",
- "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/MODULE.bazel": "af322bc08976524477c79d1e45e241b6efbeb918c497e8840b8ab116802dda79",
- "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/source.json": "2be409ac3c7601245958cd4fcdff4288be79ed23bd690b4b951f500d54ee6e7d"
- },
- "selectedYankedVersions": {},
- "moduleExtensions": {
- "@@apple_support~//crosstool:setup.bzl%apple_cc_configure_extension": {
- "general": {
- "bzlTransitiveDigest": "PjIds3feoYE8SGbbIq2SFTZy3zmxeO2tQevJZNDo7iY=",
- "usagesDigest": "aLmqbvowmHkkBPve05yyDNGN7oh7QE9kBADr3QIZTZs=",
- "recordedFileInputs": {},
- "recordedDirentsInputs": {},
- "envVariables": {},
- "generatedRepoSpecs": {
- "local_config_apple_cc": {
- "bzlFile": "@@apple_support~//crosstool:setup.bzl",
- "ruleClassName": "_apple_cc_autoconf",
- "attributes": {}
- },
- "local_config_apple_cc_toolchains": {
- "bzlFile": "@@apple_support~//crosstool:setup.bzl",
- "ruleClassName": "_apple_cc_autoconf_toolchains",
- "attributes": {}
- }
- },
- "recordedRepoMappingEntries": [
- [
- "apple_support~",
- "bazel_tools",
- "bazel_tools"
- ]
- ]
- }
- },
- "@@platforms//host:extension.bzl%host_platform": {
- "general": {
- "bzlTransitiveDigest": "xelQcPZH8+tmuOHVjL9vDxMnnQNMlwj0SlvgoqBkm4U=",
- "usagesDigest": "V1R2Y2oMxKNfx2WCWpSCaUV1WefW1o8HZGm3v1vHgY4=",
- "recordedFileInputs": {},
- "recordedDirentsInputs": {},
- "envVariables": {},
- "generatedRepoSpecs": {
- "host_platform": {
- "bzlFile": "@@platforms//host:extension.bzl",
- "ruleClassName": "host_platform_repo",
- "attributes": {}
- }
- },
- "recordedRepoMappingEntries": []
- }
- },
- "@@protobuf~//:non_module_deps.bzl%non_module_deps": {
- "general": {
- "bzlTransitiveDigest": "jsbfONl9OksDWiAs7KDFK5chH/tYI3DngdM30NKdk5Y=",
- "usagesDigest": "eVrT3hFCIZNRuTKpfWDzSIwTi2p6U6PWbt+tNWl/Tqk=",
- "recordedFileInputs": {},
- "recordedDirentsInputs": {},
- "envVariables": {},
- "generatedRepoSpecs": {
- "utf8_range": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "urls": [
- "https://github.com/protocolbuffers/utf8_range/archive/de0b4a8ff9b5d4c98108bdfe723291a33c52c54f.zip"
- ],
- "strip_prefix": "utf8_range-de0b4a8ff9b5d4c98108bdfe723291a33c52c54f",
- "sha256": "5da960e5e5d92394c809629a03af3c7709d2d3d0ca731dacb3a9fb4bf28f7702"
- }
- }
- },
- "recordedRepoMappingEntries": [
- [
- "protobuf~",
- "bazel_tools",
- "bazel_tools"
- ]
- ]
- }
- },
- "@@rules_jvm_external~//:extensions.bzl%maven": {
- "general": {
- "bzlTransitiveDigest": "U98JuBYMWVrcyiXT1L6KAYSAA0chnjRZZloIUmNmZ7M=",
- "usagesDigest": "1L6xElvJScwRWKMMza2Jyew+Iuz6EPOkfBMQmHYuNIk=",
- "recordedFileInputs": {
- "@@stardoc~//maven_install.json": "de0bfa778b4ed6aebb77509362dd87ab8d20fc7c7c18d2a7429cdfee03949a21",
- "@@rules_jvm_external~//rules_jvm_external_deps_install.json": "3ab1f67b0de4815df110bc72ccd6c77882b3b21d3d1e0a84445847b6ce3235a3"
- },
- "recordedDirentsInputs": {},
- "envVariables": {},
- "generatedRepoSpecs": {
- "org_slf4j_slf4j_api_1_7_30": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "cdba07964d1bb40a0761485c6b1e8c2f8fd9eb1d19c53928ac0d7f9510105c57",
- "urls": [
- "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar",
- "https://maven.google.com/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar"
- ],
- "downloaded_file_path": "org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar"
- }
- },
- "com_google_api_grpc_proto_google_common_protos_2_0_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "5ce71656118618731e34a5d4c61aa3a031be23446dc7de8b5a5e77b66ebcd6ef",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/2.0.1/proto-google-common-protos-2.0.1.jar",
- "https://maven.google.com/com/google/api/grpc/proto-google-common-protos/2.0.1/proto-google-common-protos-2.0.1.jar"
- ],
- "downloaded_file_path": "com/google/api/grpc/proto-google-common-protos/2.0.1/proto-google-common-protos-2.0.1.jar"
- }
- },
- "com_google_api_gax_1_60_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "02f37d4ff1a7b8d71dff8064cf9568aa4f4b61bcc4485085d16130f32afa5a79",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/api/gax/1.60.0/gax-1.60.0.jar",
- "https://maven.google.com/com/google/api/gax/1.60.0/gax-1.60.0.jar"
- ],
- "downloaded_file_path": "com/google/api/gax/1.60.0/gax-1.60.0.jar"
- }
- },
- "com_google_guava_failureaccess_1_0_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar"
- ],
- "downloaded_file_path": "com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar"
- }
- },
- "commons_logging_commons_logging_1_2": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636",
- "urls": [
- "https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar",
- "https://maven.google.com/commons-logging/commons-logging/1.2/commons-logging-1.2.jar"
- ],
- "downloaded_file_path": "commons-logging/commons-logging/1.2/commons-logging-1.2.jar"
- }
- },
- "com_google_http_client_google_http_client_appengine_1_38_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "f97b495fd97ac3a3d59099eb2b55025f4948230da15a076f189b9cff37c6b4d2",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-appengine/1.38.0/google-http-client-appengine-1.38.0.jar",
- "https://maven.google.com/com/google/http-client/google-http-client-appengine/1.38.0/google-http-client-appengine-1.38.0.jar"
- ],
- "downloaded_file_path": "com/google/http-client/google-http-client-appengine/1.38.0/google-http-client-appengine-1.38.0.jar"
- }
- },
- "com_google_cloud_google_cloud_storage_1_113_4": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "796833e9bdab80c40bbc820e65087eb8f28c6bfbca194d2e3e00d98cb5bc55d6",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-storage/1.113.4/google-cloud-storage-1.113.4.jar",
- "https://maven.google.com/com/google/cloud/google-cloud-storage/1.113.4/google-cloud-storage-1.113.4.jar"
- ],
- "downloaded_file_path": "com/google/cloud/google-cloud-storage/1.113.4/google-cloud-storage-1.113.4.jar"
- }
- },
- "unpinned_stardoc_maven": {
- "bzlFile": "@@rules_jvm_external~//:coursier.bzl",
- "ruleClassName": "coursier_fetch",
- "attributes": {
- "repositories": [
- "{ \"repo_url\": \"https://repo1.maven.org/maven2\" }"
- ],
- "artifacts": [
- "{ \"group\": \"com.beust\", \"artifact\": \"jcommander\", \"version\": \"1.82\" }",
- "{ \"group\": \"com.google.escapevelocity\", \"artifact\": \"escapevelocity\", \"version\": \"1.1\" }",
- "{ \"group\": \"com.google.guava\", \"artifact\": \"guava\", \"version\": \"31.1-jre\" }",
- "{ \"group\": \"com.google.truth\", \"artifact\": \"truth\", \"version\": \"1.1.3\" }",
- "{ \"group\": \"junit\", \"artifact\": \"junit\", \"version\": \"4.13.2\" }"
- ],
- "fail_on_missing_checksum": true,
- "fetch_sources": true,
- "fetch_javadoc": false,
- "excluded_artifacts": [],
- "generate_compat_repositories": false,
- "version_conflict_policy": "default",
- "override_targets": {},
- "strict_visibility": true,
- "strict_visibility_value": [
- "@@//visibility:private"
- ],
- "maven_install_json": "@@stardoc~//:maven_install.json",
- "resolve_timeout": 600,
- "jetify": false,
- "jetify_include_list": [
- "*"
- ],
- "use_starlark_android_rules": false,
- "aar_import_bzl_label": "@build_bazel_rules_android//android:rules.bzl",
- "duplicate_version_warning": "warn"
- }
- },
- "io_grpc_grpc_context_1_33_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "99b8aea2b614fe0e61c3676e681259dc43c2de7f64620998e1a8435eb2976496",
- "urls": [
- "https://repo1.maven.org/maven2/io/grpc/grpc-context/1.33.1/grpc-context-1.33.1.jar",
- "https://maven.google.com/io/grpc/grpc-context/1.33.1/grpc-context-1.33.1.jar"
- ],
- "downloaded_file_path": "io/grpc/grpc-context/1.33.1/grpc-context-1.33.1.jar"
- }
- },
- "com_google_api_grpc_proto_google_iam_v1_1_0_3": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "64cee7383a97e846da8d8e160e6c8fe30561e507260552c59e6ccfc81301fdc8",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-iam-v1/1.0.3/proto-google-iam-v1-1.0.3.jar",
- "https://maven.google.com/com/google/api/grpc/proto-google-iam-v1/1.0.3/proto-google-iam-v1-1.0.3.jar"
- ],
- "downloaded_file_path": "com/google/api/grpc/proto-google-iam-v1/1.0.3/proto-google-iam-v1-1.0.3.jar"
- }
- },
- "com_google_api_api_common_1_10_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "2a033f24bb620383eda440ad307cb8077cfec1c7eadc684d65216123a1b9613a",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/api/api-common/1.10.1/api-common-1.10.1.jar",
- "https://maven.google.com/com/google/api/api-common/1.10.1/api-common-1.10.1.jar"
- ],
- "downloaded_file_path": "com/google/api/api-common/1.10.1/api-common-1.10.1.jar"
- }
- },
- "com_google_auth_google_auth_library_oauth2_http_0_22_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "1722d895c42dc42ea1d1f392ddbec1fbb28f7a979022c3a6c29acc39cc777ad1",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-oauth2-http/0.22.0/google-auth-library-oauth2-http-0.22.0.jar",
- "https://maven.google.com/com/google/auth/google-auth-library-oauth2-http/0.22.0/google-auth-library-oauth2-http-0.22.0.jar"
- ],
- "downloaded_file_path": "com/google/auth/google-auth-library-oauth2-http/0.22.0/google-auth-library-oauth2-http-0.22.0.jar"
- }
- },
- "com_typesafe_netty_netty_reactive_streams_2_0_5": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "f949849fc8ee75fde468ba3a35df2e04577fa31a2940b83b2a7dc9d14dac13d6",
- "urls": [
- "https://repo1.maven.org/maven2/com/typesafe/netty/netty-reactive-streams/2.0.5/netty-reactive-streams-2.0.5.jar",
- "https://maven.google.com/com/typesafe/netty/netty-reactive-streams/2.0.5/netty-reactive-streams-2.0.5.jar"
- ],
- "downloaded_file_path": "com/typesafe/netty/netty-reactive-streams/2.0.5/netty-reactive-streams-2.0.5.jar"
- }
- },
- "com_typesafe_netty_netty_reactive_streams_http_2_0_5": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "b39224751ad936758176e9d994230380ade5e9079e7c8ad778e3995779bcf303",
- "urls": [
- "https://repo1.maven.org/maven2/com/typesafe/netty/netty-reactive-streams-http/2.0.5/netty-reactive-streams-http-2.0.5.jar",
- "https://maven.google.com/com/typesafe/netty/netty-reactive-streams-http/2.0.5/netty-reactive-streams-http-2.0.5.jar"
- ],
- "downloaded_file_path": "com/typesafe/netty/netty-reactive-streams-http/2.0.5/netty-reactive-streams-http-2.0.5.jar"
- }
- },
- "javax_annotation_javax_annotation_api_1_3_2": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b",
- "urls": [
- "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar",
- "https://maven.google.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar"
- ],
- "downloaded_file_path": "javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar"
- }
- },
- "com_google_j2objc_j2objc_annotations_1_3": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar"
- ],
- "downloaded_file_path": "com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar"
- }
- },
- "software_amazon_awssdk_metrics_spi_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "08a11dc8c4ba464beafbcc7ac05b8c724c1ccb93da99482e82a68540ac704e4a",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/metrics-spi/2.17.183/metrics-spi-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/metrics-spi/2.17.183/metrics-spi-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/metrics-spi/2.17.183/metrics-spi-2.17.183.jar"
- }
- },
- "com_google_escapevelocity_escapevelocity_1_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "37e76e4466836dedb864fb82355cd01c3bd21325ab642d89a0f759291b171231",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/escapevelocity/escapevelocity/1.1/escapevelocity-1.1.jar"
- ],
- "downloaded_file_path": "com/google/escapevelocity/escapevelocity/1.1/escapevelocity-1.1.jar"
- }
- },
- "org_reactivestreams_reactive_streams_1_0_3": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "1dee0481072d19c929b623e155e14d2f6085dc011529a0a0dbefc84cf571d865",
- "urls": [
- "https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar",
- "https://maven.google.com/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar"
- ],
- "downloaded_file_path": "org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar"
- }
- },
- "com_google_http_client_google_http_client_jackson2_1_38_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "e6504a82425fcc2168a4ca4175138ddcc085168daed8cdedb86d8f6fdc296e1e",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/http-client/google-http-client-jackson2/1.38.0/google-http-client-jackson2-1.38.0.jar",
- "https://maven.google.com/com/google/http-client/google-http-client-jackson2/1.38.0/google-http-client-jackson2-1.38.0.jar"
- ],
- "downloaded_file_path": "com/google/http-client/google-http-client-jackson2/1.38.0/google-http-client-jackson2-1.38.0.jar"
- }
- },
- "io_netty_netty_transport_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "c5fb68e9a65b6e8a516adfcb9fa323479ee7b4d9449d8a529d2ecab3d3711d5a",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.jar"
- }
- },
- "com_beust_jcommander_1_82": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "deeac157c8de6822878d85d0c7bc8467a19cc8484d37788f7804f039dde280b1",
- "urls": [
- "https://repo1.maven.org/maven2/com/beust/jcommander/1.82/jcommander-1.82.jar"
- ],
- "downloaded_file_path": "com/beust/jcommander/1.82/jcommander-1.82.jar"
- }
- },
- "io_netty_netty_codec_http2_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "c89a70500f59e8563e720aaa808263a514bd9e2bd91ba84eab8c2ccb45f234b2",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.72.Final/netty-codec-http2-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-codec-http2/4.1.72.Final/netty-codec-http2-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "io/netty/netty-codec-http2/4.1.72.Final/netty-codec-http2-4.1.72.Final.jar"
- }
- },
- "io_opencensus_opencensus_api_0_24_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "f561b1cc2673844288e596ddf5bb6596868a8472fd2cb8993953fc5c034b2352",
- "urls": [
- "https://repo1.maven.org/maven2/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar",
- "https://maven.google.com/io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar"
- ],
- "downloaded_file_path": "io/opencensus/opencensus-api/0.24.0/opencensus-api-0.24.0.jar"
- }
- },
- "rules_jvm_external_deps": {
- "bzlFile": "@@rules_jvm_external~//:coursier.bzl",
- "ruleClassName": "pinned_coursier_fetch",
- "attributes": {
- "repositories": [
- "{ \"repo_url\": \"https://repo1.maven.org/maven2\" }"
- ],
- "artifacts": [
- "{ \"group\": \"com.google.auth\", \"artifact\": \"google-auth-library-credentials\", \"version\": \"0.22.0\" }",
- "{ \"group\": \"com.google.auth\", \"artifact\": \"google-auth-library-oauth2-http\", \"version\": \"0.22.0\" }",
- "{ \"group\": \"com.google.cloud\", \"artifact\": \"google-cloud-core\", \"version\": \"1.93.10\" }",
- "{ \"group\": \"com.google.cloud\", \"artifact\": \"google-cloud-storage\", \"version\": \"1.113.4\" }",
- "{ \"group\": \"com.google.code.gson\", \"artifact\": \"gson\", \"version\": \"2.9.0\" }",
- "{ \"group\": \"com.google.googlejavaformat\", \"artifact\": \"google-java-format\", \"version\": \"1.15.0\" }",
- "{ \"group\": \"com.google.guava\", \"artifact\": \"guava\", \"version\": \"31.1-jre\" }",
- "{ \"group\": \"org.apache.maven\", \"artifact\": \"maven-artifact\", \"version\": \"3.8.6\" }",
- "{ \"group\": \"software.amazon.awssdk\", \"artifact\": \"s3\", \"version\": \"2.17.183\" }"
- ],
- "fetch_sources": true,
- "fetch_javadoc": false,
- "generate_compat_repositories": false,
- "maven_install_json": "@@rules_jvm_external~//:rules_jvm_external_deps_install.json",
- "override_targets": {},
- "strict_visibility": false,
- "strict_visibility_value": [
- "@@//visibility:private"
- ],
- "jetify": false,
- "jetify_include_list": [
- "*"
- ],
- "additional_netrc_lines": [],
- "fail_if_repin_required": false,
- "use_starlark_android_rules": false,
- "aar_import_bzl_label": "@build_bazel_rules_android//android:rules.bzl",
- "duplicate_version_warning": "warn"
- }
- },
- "org_threeten_threetenbp_1_5_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "dcf9c0f940739f2a825cd8626ff27113459a2f6eb18797c7152f93fff69c264f",
- "urls": [
- "https://repo1.maven.org/maven2/org/threeten/threetenbp/1.5.0/threetenbp-1.5.0.jar",
- "https://maven.google.com/org/threeten/threetenbp/1.5.0/threetenbp-1.5.0.jar"
- ],
- "downloaded_file_path": "org/threeten/threetenbp/1.5.0/threetenbp-1.5.0.jar"
- }
- },
- "software_amazon_awssdk_http_client_spi_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "fe7120f175df9e47ebcc5d946d7f40110faf2ba0a30364f3b935d5b8a5a6c3c6",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/http-client-spi/2.17.183/http-client-spi-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/http-client-spi/2.17.183/http-client-spi-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/http-client-spi/2.17.183/http-client-spi-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_third_party_jackson_core_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "1bc27c9960993c20e1ab058012dd1ae04c875eec9f0f08f2b2ca41e578dee9a4",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/third-party-jackson-core/2.17.183/third-party-jackson-core-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/third-party-jackson-core/2.17.183/third-party-jackson-core-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/third-party-jackson-core/2.17.183/third-party-jackson-core-2.17.183.jar"
- }
- },
- "software_amazon_eventstream_eventstream_1_0_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "0c37d8e696117f02c302191b8110b0d0eb20fa412fce34c3a269ec73c16ce822",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/eventstream/eventstream/1.0.1/eventstream-1.0.1.jar",
- "https://maven.google.com/software/amazon/eventstream/eventstream/1.0.1/eventstream-1.0.1.jar"
- ],
- "downloaded_file_path": "software/amazon/eventstream/eventstream/1.0.1/eventstream-1.0.1.jar"
- }
- },
- "com_google_oauth_client_google_oauth_client_1_31_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "4ed4e2948251dbda66ce251bd7f3b32cd8570055e5cdb165a3c7aea8f43da0ff",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/oauth-client/google-oauth-client/1.31.1/google-oauth-client-1.31.1.jar",
- "https://maven.google.com/com/google/oauth-client/google-oauth-client/1.31.1/google-oauth-client-1.31.1.jar"
- ],
- "downloaded_file_path": "com/google/oauth-client/google-oauth-client/1.31.1/google-oauth-client-1.31.1.jar"
- }
- },
- "maven": {
- "bzlFile": "@@rules_jvm_external~//:coursier.bzl",
- "ruleClassName": "coursier_fetch",
- "attributes": {
- "repositories": [
- "{ \"repo_url\": \"https://repo1.maven.org/maven2\" }"
- ],
- "artifacts": [
- "{ \"group\": \"com.google.code.findbugs\", \"artifact\": \"jsr305\", \"version\": \"3.0.2\" }",
- "{ \"group\": \"com.google.code.gson\", \"artifact\": \"gson\", \"version\": \"2.8.9\" }",
- "{ \"group\": \"com.google.errorprone\", \"artifact\": \"error_prone_annotations\", \"version\": \"2.3.2\" }",
- "{ \"group\": \"com.google.j2objc\", \"artifact\": \"j2objc-annotations\", \"version\": \"1.3\" }",
- "{ \"group\": \"com.google.guava\", \"artifact\": \"guava\", \"version\": \"31.1-jre\" }",
- "{ \"group\": \"com.google.guava\", \"artifact\": \"guava-testlib\", \"version\": \"31.1-jre\" }",
- "{ \"group\": \"com.google.truth\", \"artifact\": \"truth\", \"version\": \"1.1.2\" }",
- "{ \"group\": \"junit\", \"artifact\": \"junit\", \"version\": \"4.13.2\" }",
- "{ \"group\": \"org.mockito\", \"artifact\": \"mockito-core\", \"version\": \"4.3.1\" }"
- ],
- "fail_on_missing_checksum": true,
- "fetch_sources": true,
- "fetch_javadoc": false,
- "excluded_artifacts": [],
- "generate_compat_repositories": false,
- "version_conflict_policy": "default",
- "override_targets": {},
- "strict_visibility": false,
- "strict_visibility_value": [
- "@@//visibility:private"
- ],
- "resolve_timeout": 600,
- "jetify": false,
- "jetify_include_list": [
- "*"
- ],
- "use_starlark_android_rules": false,
- "aar_import_bzl_label": "@build_bazel_rules_android//android:rules.bzl",
- "duplicate_version_warning": "warn"
- }
- },
- "software_amazon_awssdk_aws_xml_protocol_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "566bba05d49256fa6994efd68fa625ae05a62ea45ee74bb9130d20ea20988363",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/aws-xml-protocol/2.17.183/aws-xml-protocol-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/aws-xml-protocol/2.17.183/aws-xml-protocol-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/aws-xml-protocol/2.17.183/aws-xml-protocol-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_annotations_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "8e4d72361ca805a0bd8bbd9017cd7ff77c8d170f2dd469c7d52d5653330bb3fd",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/annotations/2.17.183/annotations-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/annotations/2.17.183/annotations-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/annotations/2.17.183/annotations-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_netty_nio_client_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "a6d356f364c56d7b90006b0b7e503b8630010993a5587ce42e74b10b8dca2238",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/netty-nio-client/2.17.183/netty-nio-client-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/netty-nio-client/2.17.183/netty-nio-client-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/netty-nio-client/2.17.183/netty-nio-client-2.17.183.jar"
- }
- },
- "com_google_guava_guava_31_1_jre": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "a42edc9cab792e39fe39bb94f3fca655ed157ff87a8af78e1d6ba5b07c4a00ab",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/guava/guava/31.1-jre/guava-31.1-jre.jar"
- ],
- "downloaded_file_path": "com/google/guava/guava/31.1-jre/guava-31.1-jre.jar"
- }
- },
- "com_google_auto_value_auto_value_annotations_1_7_4": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "fedd59b0b4986c342f6ab2d182f2a4ee9fceb2c7e2d5bdc4dc764c92394a23d3",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar",
- "https://maven.google.com/com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar"
- ],
- "downloaded_file_path": "com/google/auto/value/auto-value-annotations/1.7.4/auto-value-annotations-1.7.4.jar"
- }
- },
- "io_netty_netty_transport_native_unix_common_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "6f8f1cc29b5a234eeee9439a63eb3f03a5994aa540ff555cb0b2c88cefaf6877",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-transport-native-unix-common/4.1.72.Final/netty-transport-native-unix-common-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-transport-native-unix-common/4.1.72.Final/netty-transport-native-unix-common-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "io/netty/netty-transport-native-unix-common/4.1.72.Final/netty-transport-native-unix-common-4.1.72.Final.jar"
- }
- },
- "junit_junit_4_13_2": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3",
- "urls": [
- "https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"
- ],
- "downloaded_file_path": "junit/junit/4.13.2/junit-4.13.2.jar"
- }
- },
- "io_opencensus_opencensus_contrib_http_util_0_24_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "7155273bbb1ed3d477ea33cf19d7bbc0b285ff395f43b29ae576722cf247000f",
- "urls": [
- "https://repo1.maven.org/maven2/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar",
- "https://maven.google.com/io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar"
- ],
- "downloaded_file_path": "io/opencensus/opencensus-contrib-http-util/0.24.0/opencensus-contrib-http-util-0.24.0.jar"
- }
- },
- "com_fasterxml_jackson_core_jackson_core_2_11_3": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "78cd0a6b936232e06dd3e38da8a0345348a09cd1ff9c4d844c6ee72c75cfc402",
- "urls": [
- "https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.11.3/jackson-core-2.11.3.jar",
- "https://maven.google.com/com/fasterxml/jackson/core/jackson-core/2.11.3/jackson-core-2.11.3.jar"
- ],
- "downloaded_file_path": "com/fasterxml/jackson/core/jackson-core/2.11.3/jackson-core-2.11.3.jar"
- }
- },
- "com_google_cloud_google_cloud_core_1_93_10": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "832d74eca66f4601e162a8460d6f59f50d1d23f93c18b02654423b6b0d67c6ea",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core/1.93.10/google-cloud-core-1.93.10.jar",
- "https://maven.google.com/com/google/cloud/google-cloud-core/1.93.10/google-cloud-core-1.93.10.jar"
- ],
- "downloaded_file_path": "com/google/cloud/google-cloud-core/1.93.10/google-cloud-core-1.93.10.jar"
- }
- },
- "com_google_auth_google_auth_library_credentials_0_22_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "42c76031276de5b520909e9faf88c5b3c9a722d69ee9cfdafedb1c52c355dfc5",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/auth/google-auth-library-credentials/0.22.0/google-auth-library-credentials-0.22.0.jar",
- "https://maven.google.com/com/google/auth/google-auth-library-credentials/0.22.0/google-auth-library-credentials-0.22.0.jar"
- ],
- "downloaded_file_path": "com/google/auth/google-auth-library-credentials/0.22.0/google-auth-library-credentials-0.22.0.jar"
- }
- },
- "software_amazon_awssdk_profiles_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "78833b32fde3f1c5320373b9ea955c1bbc28f2c904010791c4784e610193ee56",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/profiles/2.17.183/profiles-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/profiles/2.17.183/profiles-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/profiles/2.17.183/profiles-2.17.183.jar"
- }
- },
- "org_apache_httpcomponents_httpcore_4_4_13": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "e06e89d40943245fcfa39ec537cdbfce3762aecde8f9c597780d2b00c2b43424",
- "urls": [
- "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar",
- "https://maven.google.com/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar"
- ],
- "downloaded_file_path": "org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar"
- }
- },
- "io_netty_netty_common_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "8adb4c291260ceb2859a68c49f0adeed36bf49587608e2b81ecff6aaf06025e9",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-common/4.1.72.Final/netty-common-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-common/4.1.72.Final/netty-common-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "io/netty/netty-common/4.1.72.Final/netty-common-4.1.72.Final.jar"
- }
- },
- "io_netty_netty_transport_classes_epoll_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "e1528a9751c1285aa7beaf3a1eb0597151716426ce38598ac9bc0891209b9e68",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-transport-classes-epoll/4.1.72.Final/netty-transport-classes-epoll-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-transport-classes-epoll/4.1.72.Final/netty-transport-classes-epoll-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "io/netty/netty-transport-classes-epoll/4.1.72.Final/netty-transport-classes-epoll-4.1.72.Final.jar"
- }
- },
- "org_checkerframework_checker_qual_3_12_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "ff10785ac2a357ec5de9c293cb982a2cbb605c0309ea4cc1cb9b9bc6dbe7f3cb",
- "urls": [
- "https://repo1.maven.org/maven2/org/checkerframework/checker-qual/3.12.0/checker-qual-3.12.0.jar",
- "https://maven.google.com/org/checkerframework/checker-qual/3.12.0/checker-qual-3.12.0.jar"
- ],
- "downloaded_file_path": "org/checkerframework/checker-qual/3.12.0/checker-qual-3.12.0.jar"
- }
- },
- "org_hamcrest_hamcrest_core_1_3": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9",
- "urls": [
- "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"
- ],
- "downloaded_file_path": "org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"
- }
- },
- "com_google_cloud_google_cloud_core_http_1_93_10": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "81ac67c14c7c4244d2b7db2607ad352416aca8d3bb2adf338964e8fea25b1b3c",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/cloud/google-cloud-core-http/1.93.10/google-cloud-core-http-1.93.10.jar",
- "https://maven.google.com/com/google/cloud/google-cloud-core-http/1.93.10/google-cloud-core-http-1.93.10.jar"
- ],
- "downloaded_file_path": "com/google/cloud/google-cloud-core-http/1.93.10/google-cloud-core-http-1.93.10.jar"
- }
- },
- "software_amazon_awssdk_utils_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "7bd849bb5aa71bfdf6b849643736ecab3a7b3f204795804eefe5754104231ec6",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/utils/2.17.183/utils-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/utils/2.17.183/utils-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/utils/2.17.183/utils-2.17.183.jar"
- }
- },
- "org_apache_commons_commons_lang3_3_8_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "dac807f65b07698ff39b1b07bfef3d87ae3fd46d91bbf8a2bc02b2a831616f68",
- "urls": [
- "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.8.1/commons-lang3-3.8.1.jar",
- "https://maven.google.com/org/apache/commons/commons-lang3/3.8.1/commons-lang3-3.8.1.jar"
- ],
- "downloaded_file_path": "org/apache/commons/commons-lang3/3.8.1/commons-lang3-3.8.1.jar"
- }
- },
- "software_amazon_awssdk_aws_core_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "bccbdbea689a665a702ff19828662d87fb7fe81529df13f02ef1e4c474ea9f93",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/aws-core/2.17.183/aws-core-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/aws-core/2.17.183/aws-core-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/aws-core/2.17.183/aws-core-2.17.183.jar"
- }
- },
- "com_google_api_gax_httpjson_0_77_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "fd4dae47fa016d3b26e8d90b67ddc6c23c4c06e8bcdf085c70310ab7ef324bd6",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/api/gax-httpjson/0.77.0/gax-httpjson-0.77.0.jar",
- "https://maven.google.com/com/google/api/gax-httpjson/0.77.0/gax-httpjson-0.77.0.jar"
- ],
- "downloaded_file_path": "com/google/api/gax-httpjson/0.77.0/gax-httpjson-0.77.0.jar"
- }
- },
- "unpinned_rules_jvm_external_deps": {
- "bzlFile": "@@rules_jvm_external~//:coursier.bzl",
- "ruleClassName": "coursier_fetch",
- "attributes": {
- "repositories": [
- "{ \"repo_url\": \"https://repo1.maven.org/maven2\" }"
- ],
- "artifacts": [
- "{ \"group\": \"com.google.auth\", \"artifact\": \"google-auth-library-credentials\", \"version\": \"0.22.0\" }",
- "{ \"group\": \"com.google.auth\", \"artifact\": \"google-auth-library-oauth2-http\", \"version\": \"0.22.0\" }",
- "{ \"group\": \"com.google.cloud\", \"artifact\": \"google-cloud-core\", \"version\": \"1.93.10\" }",
- "{ \"group\": \"com.google.cloud\", \"artifact\": \"google-cloud-storage\", \"version\": \"1.113.4\" }",
- "{ \"group\": \"com.google.code.gson\", \"artifact\": \"gson\", \"version\": \"2.9.0\" }",
- "{ \"group\": \"com.google.googlejavaformat\", \"artifact\": \"google-java-format\", \"version\": \"1.15.0\" }",
- "{ \"group\": \"com.google.guava\", \"artifact\": \"guava\", \"version\": \"31.1-jre\" }",
- "{ \"group\": \"org.apache.maven\", \"artifact\": \"maven-artifact\", \"version\": \"3.8.6\" }",
- "{ \"group\": \"software.amazon.awssdk\", \"artifact\": \"s3\", \"version\": \"2.17.183\" }"
- ],
- "fail_on_missing_checksum": true,
- "fetch_sources": true,
- "fetch_javadoc": false,
- "excluded_artifacts": [],
- "generate_compat_repositories": false,
- "version_conflict_policy": "default",
- "override_targets": {},
- "strict_visibility": false,
- "strict_visibility_value": [
- "@@//visibility:private"
- ],
- "maven_install_json": "@@rules_jvm_external~//:rules_jvm_external_deps_install.json",
- "resolve_timeout": 600,
- "jetify": false,
- "jetify_include_list": [
- "*"
- ],
- "use_starlark_android_rules": false,
- "aar_import_bzl_label": "@build_bazel_rules_android//android:rules.bzl",
- "duplicate_version_warning": "warn"
- }
- },
- "com_google_errorprone_error_prone_annotations_2_11_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "721cb91842b46fa056847d104d5225c8b8e1e8b62263b993051e1e5a0137b7ec",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.11.0/error_prone_annotations-2.11.0.jar"
- ],
- "downloaded_file_path": "com/google/errorprone/error_prone_annotations/2.11.0/error_prone_annotations-2.11.0.jar"
- }
- },
- "software_amazon_awssdk_regions_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "d3079395f3ffc07d04ffcce16fca29fb5968197f6e9ea3dbff6be297102b40a5",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/regions/2.17.183/regions-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/regions/2.17.183/regions-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/regions/2.17.183/regions-2.17.183.jar"
- }
- },
- "io_netty_netty_handler_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "9cb6012af7e06361d738ac4e3bdc49a158f8cf87d9dee0f2744056b7d99c28d5",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-handler/4.1.72.Final/netty-handler-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-handler/4.1.72.Final/netty-handler-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "io/netty/netty-handler/4.1.72.Final/netty-handler-4.1.72.Final.jar"
- }
- },
- "software_amazon_awssdk_aws_query_protocol_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "4dace03c76f80f3dec920cb3dedb2a95984c4366ef4fda728660cb90bed74848",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/aws-query-protocol/2.17.183/aws-query-protocol-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/aws-query-protocol/2.17.183/aws-query-protocol-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/aws-query-protocol/2.17.183/aws-query-protocol-2.17.183.jar"
- }
- },
- "io_netty_netty_codec_http_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "fa6fec88010bfaf6a7415b5364671b6b18ffb6b35a986ab97b423fd8c3a0174b",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.72.Final/netty-codec-http-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-codec-http/4.1.72.Final/netty-codec-http-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "io/netty/netty-codec-http/4.1.72.Final/netty-codec-http-4.1.72.Final.jar"
- }
- },
- "io_netty_netty_resolver_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "6474598aab7cc9d8d6cfa06c05bd1b19adbf7f8451dbdd73070b33a6c60b1b90",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.jar"
- }
- },
- "software_amazon_awssdk_protocol_core_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "10e7c4faa1f05e2d73055d0390dbd0bb6450e2e6cb85beda051b1e4693c826ce",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/protocol-core/2.17.183/protocol-core-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/protocol-core/2.17.183/protocol-core-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/protocol-core/2.17.183/protocol-core-2.17.183.jar"
- }
- },
- "stardoc_maven": {
- "bzlFile": "@@rules_jvm_external~//:coursier.bzl",
- "ruleClassName": "pinned_coursier_fetch",
- "attributes": {
- "repositories": [
- "{ \"repo_url\": \"https://repo1.maven.org/maven2\" }"
- ],
- "artifacts": [
- "{ \"group\": \"com.beust\", \"artifact\": \"jcommander\", \"version\": \"1.82\" }",
- "{ \"group\": \"com.google.escapevelocity\", \"artifact\": \"escapevelocity\", \"version\": \"1.1\" }",
- "{ \"group\": \"com.google.guava\", \"artifact\": \"guava\", \"version\": \"31.1-jre\" }",
- "{ \"group\": \"com.google.truth\", \"artifact\": \"truth\", \"version\": \"1.1.3\" }",
- "{ \"group\": \"junit\", \"artifact\": \"junit\", \"version\": \"4.13.2\" }"
- ],
- "fetch_sources": true,
- "fetch_javadoc": false,
- "generate_compat_repositories": false,
- "maven_install_json": "@@stardoc~//:maven_install.json",
- "override_targets": {},
- "strict_visibility": true,
- "strict_visibility_value": [
- "@@//visibility:private"
- ],
- "jetify": false,
- "jetify_include_list": [
- "*"
- ],
- "additional_netrc_lines": [],
- "fail_if_repin_required": true,
- "use_starlark_android_rules": false,
- "aar_import_bzl_label": "@build_bazel_rules_android//android:rules.bzl",
- "duplicate_version_warning": "warn"
- }
- },
- "com_google_truth_truth_1_1_3": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "fc0b67782289a2aabfddfdf99eff1dcd5edc890d49143fcd489214b107b8f4f3",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/truth/truth/1.1.3/truth-1.1.3.jar"
- ],
- "downloaded_file_path": "com/google/truth/truth/1.1.3/truth-1.1.3.jar"
- }
- },
- "org_checkerframework_checker_compat_qual_2_5_5": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "11d134b245e9cacc474514d2d66b5b8618f8039a1465cdc55bbc0b34e0008b7a",
- "urls": [
- "https://repo1.maven.org/maven2/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar",
- "https://maven.google.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar"
- ],
- "downloaded_file_path": "org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar"
- }
- },
- "com_google_apis_google_api_services_storage_v1_rev20200927_1_30_10": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "52d26a9d105f8d8a0850807285f307a76cea8f3e0cdb2be4d3b15b1adfa77351",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/apis/google-api-services-storage/v1-rev20200927-1.30.10/google-api-services-storage-v1-rev20200927-1.30.10.jar",
- "https://maven.google.com/com/google/apis/google-api-services-storage/v1-rev20200927-1.30.10/google-api-services-storage-v1-rev20200927-1.30.10.jar"
- ],
- "downloaded_file_path": "com/google/apis/google-api-services-storage/v1-rev20200927-1.30.10/google-api-services-storage-v1-rev20200927-1.30.10.jar"
- }
- },
- "org_ow2_asm_asm_9_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "cda4de455fab48ff0bcb7c48b4639447d4de859a7afc30a094a986f0936beba2",
- "urls": [
- "https://repo1.maven.org/maven2/org/ow2/asm/asm/9.1/asm-9.1.jar"
- ],
- "downloaded_file_path": "org/ow2/asm/asm/9.1/asm-9.1.jar"
- }
- },
- "com_google_api_client_google_api_client_1_30_11": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "ee6f97865cc7de6c7c80955c3f37372cf3887bd75e4fc06f1058a6b4cd9bf4da",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/api-client/google-api-client/1.30.11/google-api-client-1.30.11.jar",
- "https://maven.google.com/com/google/api-client/google-api-client/1.30.11/google-api-client-1.30.11.jar"
- ],
- "downloaded_file_path": "com/google/api-client/google-api-client/1.30.11/google-api-client-1.30.11.jar"
- }
- },
- "software_amazon_awssdk_s3_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "ab073b91107a9e4ed9f030314077d137fe627e055ad895fabb036980a050e360",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/s3/2.17.183/s3-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/s3/2.17.183/s3-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/s3/2.17.183/s3-2.17.183.jar"
- }
- },
- "org_apache_maven_maven_artifact_3_8_6": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "de22a4c6f54fe31276a823b1bbd3adfd6823529e732f431b5eff0852c2b9252b",
- "urls": [
- "https://repo1.maven.org/maven2/org/apache/maven/maven-artifact/3.8.6/maven-artifact-3.8.6.jar",
- "https://maven.google.com/org/apache/maven/maven-artifact/3.8.6/maven-artifact-3.8.6.jar"
- ],
- "downloaded_file_path": "org/apache/maven/maven-artifact/3.8.6/maven-artifact-3.8.6.jar"
- }
- },
- "com_google_googlejavaformat_google_java_format_1_15_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "4f546cfe159547ac3b9547daa9649e728f6abc254979c975f1cb9971793692c3",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/googlejavaformat/google-java-format/1.15.0/google-java-format-1.15.0.jar",
- "https://maven.google.com/com/google/googlejavaformat/google-java-format/1.15.0/google-java-format-1.15.0.jar"
- ],
- "downloaded_file_path": "com/google/googlejavaformat/google-java-format/1.15.0/google-java-format-1.15.0.jar"
- }
- },
- "org_apache_httpcomponents_httpclient_4_5_13": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "6fe9026a566c6a5001608cf3fc32196641f6c1e5e1986d1037ccdbd5f31ef743",
- "urls": [
- "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar",
- "https://maven.google.com/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar"
- ],
- "downloaded_file_path": "org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar"
- }
- },
- "com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar"
- ],
- "downloaded_file_path": "com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar"
- }
- },
- "com_google_http_client_google_http_client_1_38_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "411f4a42519b6b78bdc0fcfdf74c9edcef0ee97afa4a667abe04045a508d6302",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/http-client/google-http-client/1.38.0/google-http-client-1.38.0.jar",
- "https://maven.google.com/com/google/http-client/google-http-client/1.38.0/google-http-client-1.38.0.jar"
- ],
- "downloaded_file_path": "com/google/http-client/google-http-client/1.38.0/google-http-client-1.38.0.jar"
- }
- },
- "software_amazon_awssdk_apache_client_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "78ceae502fce6a97bbe5ff8f6a010a52ab7ea3ae66cb1a4122e18185fce45022",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/apache-client/2.17.183/apache-client-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/apache-client/2.17.183/apache-client-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/apache-client/2.17.183/apache-client-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_arns_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "659a185e191d66c71de81209490e66abeaccae208ea7b2831a738670823447aa",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/arns/2.17.183/arns-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/arns/2.17.183/arns-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/arns/2.17.183/arns-2.17.183.jar"
- }
- },
- "com_google_auto_value_auto_value_annotations_1_8_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "37ec09b47d7ed35a99d13927db5c86fc9071f620f943ead5d757144698310852",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.jar"
- ],
- "downloaded_file_path": "com/google/auto/value/auto-value-annotations/1.8.1/auto-value-annotations-1.8.1.jar"
- }
- },
- "com_google_code_gson_gson_2_9_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "c96d60551331a196dac54b745aa642cd078ef89b6f267146b705f2c2cbef052d",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar",
- "https://maven.google.com/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar"
- ],
- "downloaded_file_path": "com/google/code/gson/gson/2.9.0/gson-2.9.0.jar"
- }
- },
- "io_netty_netty_buffer_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "568ff7cd9d8e2284ec980730c88924f686642929f8f219a74518b4e64755f3a1",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-buffer/4.1.72.Final/netty-buffer-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-buffer/4.1.72.Final/netty-buffer-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "io/netty/netty-buffer/4.1.72.Final/netty-buffer-4.1.72.Final.jar"
- }
- },
- "com_google_code_findbugs_jsr305_3_0_2": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar"
- ],
- "downloaded_file_path": "com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar"
- }
- },
- "commons_codec_commons_codec_1_11": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "e599d5318e97aa48f42136a2927e6dfa4e8881dff0e6c8e3109ddbbff51d7b7d",
- "urls": [
- "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11.jar",
- "https://maven.google.com/commons-codec/commons-codec/1.11/commons-codec-1.11.jar"
- ],
- "downloaded_file_path": "commons-codec/commons-codec/1.11/commons-codec-1.11.jar"
- }
- },
- "software_amazon_awssdk_auth_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "8820c6636e5c14efc29399fb5565ce50212b0c1f4ed720a025a2c402d54e0978",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/auth/2.17.183/auth-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/auth/2.17.183/auth-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/auth/2.17.183/auth-2.17.183.jar"
- }
- },
- "software_amazon_awssdk_json_utils_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "51ab7f550adc06afcb49f5270cdf690f1bfaaee243abaa5d978095e2a1e4e1a5",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/json-utils/2.17.183/json-utils-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/json-utils/2.17.183/json-utils-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/json-utils/2.17.183/json-utils-2.17.183.jar"
- }
- },
- "org_codehaus_plexus_plexus_utils_3_3_1": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "4b570fcdbe5a894f249d2eb9b929358a9c88c3e548d227a80010461930222f2a",
- "urls": [
- "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils/3.3.1/plexus-utils-3.3.1.jar",
- "https://maven.google.com/org/codehaus/plexus/plexus-utils/3.3.1/plexus-utils-3.3.1.jar"
- ],
- "downloaded_file_path": "org/codehaus/plexus/plexus-utils/3.3.1/plexus-utils-3.3.1.jar"
- }
- },
- "org_checkerframework_checker_qual_3_13_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "3ea0dcd73b4d6cb2fb34bd7ed4dad6db327a01ebad7db05eb7894076b3d64491",
- "urls": [
- "https://repo1.maven.org/maven2/org/checkerframework/checker-qual/3.13.0/checker-qual-3.13.0.jar"
- ],
- "downloaded_file_path": "org/checkerframework/checker-qual/3.13.0/checker-qual-3.13.0.jar"
- }
- },
- "com_google_protobuf_protobuf_java_util_3_13_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "d9de66b8c9445905dfa7064f6d5213d47ce88a20d34e21d83c4a94a229e14e62",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.13.0/protobuf-java-util-3.13.0.jar",
- "https://maven.google.com/com/google/protobuf/protobuf-java-util/3.13.0/protobuf-java-util-3.13.0.jar"
- ],
- "downloaded_file_path": "com/google/protobuf/protobuf-java-util/3.13.0/protobuf-java-util-3.13.0.jar"
- }
- },
- "io_netty_netty_codec_4_1_72_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "5d8591ca271a1e9c224e8de3873aa9936acb581ee0db514e7dc18523df36d16c",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-codec/4.1.72.Final/netty-codec-4.1.72.Final.jar",
- "https://maven.google.com/io/netty/netty-codec/4.1.72.Final/netty-codec-4.1.72.Final.jar"
- ],
- "downloaded_file_path": "io/netty/netty-codec/4.1.72.Final/netty-codec-4.1.72.Final.jar"
- }
- },
- "com_google_protobuf_protobuf_java_3_13_0": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "97d5b2758408690c0dc276238707492a0b6a4d71206311b6c442cdc26c5973ff",
- "urls": [
- "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.13.0/protobuf-java-3.13.0.jar",
- "https://maven.google.com/com/google/protobuf/protobuf-java/3.13.0/protobuf-java-3.13.0.jar"
- ],
- "downloaded_file_path": "com/google/protobuf/protobuf-java/3.13.0/protobuf-java-3.13.0.jar"
- }
- },
- "io_netty_netty_tcnative_classes_2_0_46_Final": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "d3ec888dcc4ac7915bf88b417c5e04fd354f4311032a748a6882df09347eed9a",
- "urls": [
- "https://repo1.maven.org/maven2/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.jar",
- "https://maven.google.com/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.jar"
- ],
- "downloaded_file_path": "io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.jar"
- }
- },
- "software_amazon_awssdk_sdk_core_2_17_183": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_file",
- "attributes": {
- "sha256": "677e9cc90fdd82c1f40f97b99cb115b13ad6c3f58beeeab1c061af6954d64c77",
- "urls": [
- "https://repo1.maven.org/maven2/software/amazon/awssdk/sdk-core/2.17.183/sdk-core-2.17.183.jar",
- "https://maven.google.com/software/amazon/awssdk/sdk-core/2.17.183/sdk-core-2.17.183.jar"
- ],
- "downloaded_file_path": "software/amazon/awssdk/sdk-core/2.17.183/sdk-core-2.17.183.jar"
- }
- }
- },
- "recordedRepoMappingEntries": [
- [
- "rules_jvm_external~",
- "bazel_tools",
- "bazel_tools"
- ],
- [
- "rules_jvm_external~",
- "rules_jvm_external",
- "rules_jvm_external~"
- ]
- ]
- }
- },
- "@@rules_jvm_external~//:non-module-deps.bzl%non_module_deps": {
- "general": {
- "bzlTransitiveDigest": "l6SlNloqPvd60dcuPdWiJNi3g3jfK76fcZc0i/Yr0dQ=",
- "usagesDigest": "hiuzyio8ny4T3UoEFpHaxXzNFc6OGUFvx5DDVLBBUmU=",
- "recordedFileInputs": {},
- "recordedDirentsInputs": {},
- "envVariables": {},
- "generatedRepoSpecs": {
- "io_bazel_rules_kotlin": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "sha256": "946747acdbeae799b085d12b240ec346f775ac65236dfcf18aa0cd7300f6de78",
- "urls": [
- "https://github.com/bazelbuild/rules_kotlin/releases/download/v1.7.0-RC-2/rules_kotlin_release.tgz"
- ]
- }
- }
- },
- "recordedRepoMappingEntries": [
- [
- "rules_jvm_external~",
- "bazel_tools",
- "bazel_tools"
- ]
- ]
- }
- },
- "@@rules_python~//python/extensions:pip.bzl%pip": {
- "general": {
- "bzlTransitiveDigest": "iikkSIkMsBiM/vadkEf9xEoVbaxZqrkUg08hiHr/LKk=",
- "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=",
- "recordedFileInputs": {
- "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314",
- "@@rules_python~//python/private/pypi/whl_installer/platform.py": "b944b908b25a2f97d6d9f491504ad5d2507402d7e37c802ee878783f87f2aa11",
- "@@//requirements_lock_3_10.txt": "5e7083982a7e60f34998579a0ae83b520d46ab8f2552cc51337217f024e6def5",
- "@@rules_python~~internal_deps~pypi__packaging//BUILD.bazel": "8d36246aeefaab4b26fb9c1175cfaf13df5b6f1587e6753f1e78b132bad74795",
- "@@//whl_mods/appended_build_content.BUILD": "87745b00382c66e5efbd7cb44a08fc3edbf7fd5099cf593f87599188f1557a9e",
- "@@//requirements_lock_3_9.txt": "6a4990586366467d1e7d56d9f2ec9bafdd7e17fb29dc959aa5a6b0395c22eac7",
- "@@rules_python~~internal_deps~pypi__packaging//packaging-24.0.dist-info/RECORD": "be1aea790359b4c2c9ea83d153c1a57c407742a35b95ee36d00723509f5ed5dd",
- "@@//requirements_windows_3_10.txt": "c79f04bfaca147b8330275911a3328b81fc80828b9050a6bebdb15477627dabc",
- "@@rules_python~//BUILD.bazel": "140002ce7e68de2fbf064bcdc37f854d4fa5b5d611a5fece6eb6cf19b8822bc4",
- "@@rules_python~~python~python_3_9_host//BUILD.bazel": "cf97d5763b728ce5ba8fdc3243350b967658ba4e3879734504aee002cec0d2b3",
- "@@rules_python~//python/private/pypi/requirements_parser/resolve_target_platforms.py": "42bf51980528302373529bcdfddb8014e485182d6bc9d2f7d3bbe1f11d8d923d"
- },
- "recordedDirentsInputs": {},
- "envVariables": {
- "PIP_INDEX_URL": null,
- "RULES_PYTHON_REPO_DEBUG": null,
- "RULES_PYTHON_REPO_DEBUG_VERBOSITY": null
- },
- "generatedRepoSpecs": {
- "pip_39_zipp_sdist_0145e43d": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "zipp-3.20.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "zipp==3.20.0 ;python_version < '3.10'",
- "sha256": "0145e43d89664cfe1a2e533adc75adafed82fe2da404b4bbb6b026c0157bdb31",
- "urls": [
- "https://files.pythonhosted.org/packages/0e/af/9f2de5bd32549a1b705af7a7c054af3878816a1267cb389c03cc4f342a51/zipp-3.20.0.tar.gz"
- ]
- }
- },
- "pip_39_wrapt_cp39_cp39_musllinux_1_1_aarch64_b9b7a708": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "wrapt==1.14.1",
- "sha256": "b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3",
- "urls": [
- "https://files.pythonhosted.org/packages/e0/20/9716fb522d17a726364c4d032c8806ffe312268773dd46a394436b2787cc/wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl"
- ]
- }
- },
- "pip_39_snowballstemmer_py2_none_any_c8e1716e": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "snowballstemmer-2.2.0-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "snowballstemmer==2.2.0",
- "sha256": "c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a",
- "urls": [
- "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl"
- ]
- }
- },
- "pip_39_astroid_py3_none_any_10e0ad5f": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "astroid-2.12.13-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "astroid==2.12.13",
- "sha256": "10e0ad5f7b79c435179d0d0f0df69998c4eef4597534aae44910db060baeb907",
- "urls": [
- "https://files.pythonhosted.org/packages/b1/61/42e075b7d29ed4d452d91cbaaca142710d50d04e68eb7161ce5807a00a30/astroid-2.12.13-py3-none-any.whl"
- ]
- }
- },
- "pip_310_sphinx": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "sphinx==7.2.6 --hash=sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560 --hash=sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5"
- }
- },
- "pip_310_docutils": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "docutils==0.20.1 --hash=sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 --hash=sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"
- }
- },
- "pip_39_tomlkit_py3_none_any_07de26b0": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "tomlkit-0.11.6-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "tomlkit==0.11.6",
- "sha256": "07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b",
- "urls": [
- "https://files.pythonhosted.org/packages/2b/df/971fa5db3250bb022105d17f340339370f73d502e65e687a94ca1a4c4b1f/tomlkit-0.11.6-py3-none-any.whl"
- ]
- }
- },
- "pip_39_sphinx_sdist_9a5160e1": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "sphinx-7.2.6.tar.gz",
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "sphinx==7.2.6",
- "sha256": "9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5",
- "urls": [
- "https://files.pythonhosted.org/packages/73/8e/6e51da4b26665b4b92b1944ea18b2d9c825e753e19180cc5bdc818d0ed3b/sphinx-7.2.6.tar.gz"
- ]
- }
- },
- "pip_39_s3cmd_sdist_966b0a49": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "s3cmd-2.1.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "s3cmd==2.1.0",
- "sha256": "966b0a494a916fc3b4324de38f089c86c70ee90e8e1cae6d59102103a4c0cc03",
- "urls": [
- "https://files.pythonhosted.org/packages/c7/eb/5143fe1884af2303cb7b23f453e5c9f337af46c2281581fc40ab5322dee4/s3cmd-2.1.0.tar.gz"
- ]
- }
- },
- "pip_310_sphinxcontrib_serializinghtml": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "sphinxcontrib-serializinghtml==1.1.9 --hash=sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54 --hash=sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1"
- }
- },
- "pip_39_wrapt_cp39_cp39_manylinux_2_5_x86_64_40e7bc81": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "wrapt==1.14.1",
- "sha256": "40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b",
- "urls": [
- "https://files.pythonhosted.org/packages/e0/6a/3c660fa34c8106aa9719f2a6636c1c3ea7afd5931ae665eb197fdf4def84/wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
- ]
- }
- },
- "pip_39_pygments_py3_none_any_13fc09fa": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "Pygments-2.16.1-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "pygments==2.16.1",
- "sha256": "13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692",
- "urls": [
- "https://files.pythonhosted.org/packages/43/88/29adf0b44ba6ac85045e63734ae0997d3c58d8b1a91c914d240828d0d73d/Pygments-2.16.1-py3-none-any.whl"
- ]
- }
- },
- "pip_310_idna": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "idna==2.10 --hash=sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6 --hash=sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"
- }
- },
- "pip_39_lazy_object_proxy_sdist_78247b6d": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "lazy-object-proxy-1.10.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "lazy-object-proxy==1.10.0",
- "sha256": "78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69",
- "urls": [
- "https://files.pythonhosted.org/packages/2c/f0/f02e2d150d581a294efded4020094a371bbab42423fe78625ac18854d89b/lazy-object-proxy-1.10.0.tar.gz"
- ]
- }
- },
- "pip_310_astroid": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "astroid==2.13.5 --hash=sha256:6891f444625b6edb2ac798829b689e95297e100ddf89dbed5a8c610e34901501 --hash=sha256:df164d5ac811b9f44105a72b8f9d5edfb7b5b2d7e979b04ea377a77b3229114a"
- }
- },
- "pip_39_websockets_sdist_88fc51d9": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "websockets-11.0.3.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "websockets==11.0.3",
- "sha256": "88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016",
- "urls": [
- "https://files.pythonhosted.org/packages/d8/3b/2ed38e52eed4cf277f9df5f0463a99199a04d9e29c9e227cfafa57bd3993/websockets-11.0.3.tar.gz"
- ]
- }
- },
- "pip_39_pyyaml_cp39_cp39_macosx_10_9_x86_64_9eb6caa9": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "pyyaml==6.0.1",
- "sha256": "9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8",
- "urls": [
- "https://files.pythonhosted.org/packages/57/c5/5d09b66b41d549914802f482a2118d925d876dc2a35b2d127694c1345c34/PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl"
- ]
- }
- },
- "pip_39_markupsafe_cp39_cp39_manylinux_2_17_x86_64_05fb2117": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "markupsafe==2.1.3",
- "sha256": "05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e",
- "urls": [
- "https://files.pythonhosted.org/packages/de/63/cb7e71984e9159ec5f45b5e81e896c8bdd0e45fe3fc6ce02ab497f0d790e/MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
- ]
- }
- },
- "pip_39_websockets_py3_none_any_6681ba9e": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "websockets-11.0.3-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "websockets==11.0.3",
- "sha256": "6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6",
- "urls": [
- "https://files.pythonhosted.org/packages/47/96/9d5749106ff57629b54360664ae7eb9afd8302fad1680ead385383e33746/websockets-11.0.3-py3-none-any.whl"
- ]
- }
- },
- "pip_39_markupsafe_cp39_cp39_macosx_10_9_universal2_8023faf4": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "markupsafe==2.1.3",
- "sha256": "8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198",
- "urls": [
- "https://files.pythonhosted.org/packages/6a/86/654dc431513cd4417dfcead8102f22bece2d6abf2f584f0e1cc1524f7b94/MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl"
- ]
- }
- },
- "pip_39_urllib3_sdist_f8ecc1bb": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "urllib3-1.26.18.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "urllib3==1.26.18",
- "sha256": "f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0",
- "urls": [
- "https://files.pythonhosted.org/packages/0c/39/64487bf07df2ed854cc06078c27c0d0abc59bd27b32232876e403c333a08/urllib3-1.26.18.tar.gz"
- ]
- }
- },
- "pip_39_platformdirs_py3_none_any_1a89a123": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "platformdirs-2.6.0-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "platformdirs==2.6.0",
- "sha256": "1a89a12377800c81983db6be069ec068eee989748799b946cce2a6e80dcc54ca",
- "urls": [
- "https://files.pythonhosted.org/packages/87/69/cd019a9473bcdfb38983e2d550ccb239264fc4c2fc32c42ac1b1cc2506b6/platformdirs-2.6.0-py3-none-any.whl"
- ]
- }
- },
- "pip_39_sphinxcontrib_applehelp_sdist_39fdc8d7": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "sphinxcontrib_applehelp-1.0.7.tar.gz",
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "sphinxcontrib-applehelp==1.0.7",
- "sha256": "39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa",
- "urls": [
- "https://files.pythonhosted.org/packages/1c/5a/fce19be5d4db26edc853a0c34832b39db7b769b7689da027529767b0aa98/sphinxcontrib_applehelp-1.0.7.tar.gz"
- ]
- }
- },
- "pip_39_pyyaml_cp39_cp39_win_amd64_510c9dee": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "PyYAML-6.0.1-cp39-cp39-win_amd64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "pyyaml==6.0.1",
- "sha256": "510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486",
- "urls": [
- "https://files.pythonhosted.org/packages/84/4d/82704d1ab9290b03da94e6425f5e87396b999fd7eb8e08f3a92c158402bf/PyYAML-6.0.1-cp39-cp39-win_amd64.whl"
- ]
- }
- },
- "pip_310_requests": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "annotation": "@@rules_python~~pip~whl_mods_hub//:requests.json",
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "requests==2.25.1 --hash=sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804 --hash=sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e",
- "whl_patches": {
- "@@//patches:empty.patch": "{\"patch_strip\":1,\"whls\":[\"requests-2.25.1-py2.py3-none-any.whl\"]}",
- "@@//patches:requests_metadata.patch": "{\"patch_strip\":1,\"whls\":[\"requests-2.25.1-py2.py3-none-any.whl\"]}",
- "@@//patches:requests_record.patch": "{\"patch_strip\":1,\"whls\":[\"requests-2.25.1-py2.py3-none-any.whl\"]}"
- }
- }
- },
- "pip_39_pyyaml_cp39_cp39_manylinux_2_17_aarch64_5773183b": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "pyyaml==6.0.1",
- "sha256": "5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6",
- "urls": [
- "https://files.pythonhosted.org/packages/ac/6c/967d91a8edf98d2b2b01d149bd9e51b8f9fb527c98d80ebb60c6b21d60c4/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
- ]
- }
- },
- "pip_39_typing_extensions_py3_none_any_04e5ca03": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "typing_extensions-4.12.2-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "typing-extensions==4.12.2 ;python_version < '3.10'",
- "sha256": "04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d",
- "urls": [
- "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl"
- ]
- }
- },
- "pip_310_snowballstemmer": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "snowballstemmer==2.2.0 --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"
- }
- },
- "pip_310_sphinxcontrib_devhelp": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "sphinxcontrib-devhelp==1.0.5 --hash=sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212 --hash=sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f"
- }
- },
- "pip_39_yamllint_py2_none_any_89bb5b5a": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "yamllint-1.28.0-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "yamllint==1.28.0",
- "sha256": "89bb5b5ac33b1ade059743cf227de73daa34d5e5a474b06a5e17fc16583b0cf2",
- "urls": [
- "https://files.pythonhosted.org/packages/40/f9/882281af7c40a99bfa5b14585071c5aa13f48961582ebe067ae38221d0d9/yamllint-1.28.0-py2.py3-none-any.whl"
- ]
- }
- },
- "pip_39_jinja2_sdist_4a3aee7a": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "jinja2-3.1.4.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "jinja2==3.1.4",
- "sha256": "4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369",
- "urls": [
- "https://files.pythonhosted.org/packages/ed/55/39036716d19cab0747a5020fc7e907f362fbf48c984b14e62127f7e68e5d/jinja2-3.1.4.tar.gz"
- ]
- }
- },
- "pip_39_websockets_cp39_cp39_musllinux_1_1_aarch64_1fdf26fa": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "websockets==11.0.3",
- "sha256": "1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7",
- "urls": [
- "https://files.pythonhosted.org/packages/c4/f5/15998b164c183af0513bba744b51ecb08d396ff86c0db3b55d62624d1f15/websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl"
- ]
- }
- },
- "pip_39_sphinxcontrib_qthelp_sdist_62b9d1a1": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "sphinxcontrib_qthelp-1.0.6.tar.gz",
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "sphinxcontrib-qthelp==1.0.6",
- "sha256": "62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d",
- "urls": [
- "https://files.pythonhosted.org/packages/4f/a2/53129fc967ac8402d5e4e83e23c959c3f7a07362ec154bdb2e197d8cc270/sphinxcontrib_qthelp-1.0.6.tar.gz"
- ]
- }
- },
- "pip_39_setuptools_sdist_a7620757": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "setuptools-65.6.3.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "setuptools==65.6.3",
- "sha256": "a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75",
- "urls": [
- "https://files.pythonhosted.org/packages/b6/21/cb9a8d0b2c8597c83fce8e9c02884bce3d4951e41e807fc35791c6b23d9a/setuptools-65.6.3.tar.gz"
- ]
- }
- },
- "pip_310_alabaster": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "alabaster==0.7.13 --hash=sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3 --hash=sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"
- }
- },
- "pip_310_python_magic": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "python-magic==0.4.27 --hash=sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b --hash=sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3"
- }
- },
- "pip_39_mccabe_sdist_348e0240": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "mccabe-0.7.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "mccabe==0.7.0",
- "sha256": "348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325",
- "urls": [
- "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz"
- ]
- }
- },
- "pip_39_chardet_sdist_0d6f53a1": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "chardet-4.0.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "chardet==4.0.0",
- "sha256": "0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa",
- "urls": [
- "https://files.pythonhosted.org/packages/ee/2d/9cdc2b527e127b4c9db64b86647d567985940ac3698eeabc7ffaccb4ea61/chardet-4.0.0.tar.gz"
- ]
- }
- },
- "pip_39_sphinxcontrib_serializinghtml_sdist_0c64ff89": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "sphinxcontrib_serializinghtml-1.1.9.tar.gz",
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "sphinxcontrib-serializinghtml==1.1.9",
- "sha256": "0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54",
- "urls": [
- "https://files.pythonhosted.org/packages/5c/41/df4cd017e8234ded544228f60f74fac1fe1c75bdb1e87b33a83c91a10530/sphinxcontrib_serializinghtml-1.1.9.tar.gz"
- ]
- }
- },
- "pip_39_docutils_sdist_f08a4e27": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "docutils-0.20.1.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "docutils==0.20.1",
- "sha256": "f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b",
- "urls": [
- "https://files.pythonhosted.org/packages/1f/53/a5da4f2c5739cf66290fac1431ee52aff6851c7c8ffd8264f13affd7bcdd/docutils-0.20.1.tar.gz"
- ]
- }
- },
- "pip_310_tabulate": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "tabulate==0.9.0 --hash=sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"
- }
- },
- "pip_39_packaging_py3_none_any_8c491190": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "packaging-23.2-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "packaging==23.2",
- "sha256": "8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7",
- "urls": [
- "https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl"
- ]
- }
- },
- "pip_310_lazy_object_proxy": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "lazy-object-proxy==1.9.0 --hash=sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382 --hash=sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82 --hash=sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9 --hash=sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494 --hash=sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46 --hash=sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30 --hash=sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63 --hash=sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4 --hash=sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae --hash=sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be --hash=sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701 --hash=sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd --hash=sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006 --hash=sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a --hash=sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586 --hash=sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8 --hash=sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821 --hash=sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07 --hash=sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b --hash=sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171 --hash=sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b --hash=sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2 --hash=sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7 --hash=sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4 --hash=sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8 --hash=sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e --hash=sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f --hash=sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda --hash=sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4 --hash=sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e --hash=sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671 --hash=sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11 --hash=sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455 --hash=sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734 --hash=sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb --hash=sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"
- }
- },
- "pip_39_tomli_sdist_de526c12": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "tomli-2.0.1.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "tomli==2.0.1 ;python_version < '3.11'",
- "sha256": "de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f",
- "urls": [
- "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz"
- ]
- }
- },
- "pip_310_sphinxcontrib_htmlhelp": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "sphinxcontrib-htmlhelp==2.0.4 --hash=sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a --hash=sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9"
- }
- },
- "pip_310_pylint": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "pylint==2.15.10 --hash=sha256:9df0d07e8948a1c3ffa3b6e2d7e6e63d9fb457c5da5b961ed63106594780cc7e --hash=sha256:b3dc5ef7d33858f297ac0d06cc73862f01e4f2e74025ec3eff347ce0bc60baf5"
- }
- },
- "pip_39_wheel_sdist_cd1196f3": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "annotation": "@@rules_python~~pip~whl_mods_hub//:wheel.json",
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "wheel-0.40.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "wheel==0.40.0",
- "sha256": "cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873",
- "urls": [
- "https://files.pythonhosted.org/packages/fc/ef/0335f7217dd1e8096a9e8383e1d472aa14717878ffe07c4772e68b6e8735/wheel-0.40.0.tar.gz"
- ]
- }
- },
- "pip_39_pygments_sdist_1daff049": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "Pygments-2.16.1.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "pygments==2.16.1",
- "sha256": "1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29",
- "urls": [
- "https://files.pythonhosted.org/packages/d6/f7/4d461ddf9c2bcd6a4d7b2b139267ca32a69439387cc1f02a924ff8883825/Pygments-2.16.1.tar.gz"
- ]
- }
- },
- "pip_39_idna_py2_none_any_b97d804b": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "idna-2.10-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "idna==2.10",
- "sha256": "b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0",
- "urls": [
- "https://files.pythonhosted.org/packages/a2/38/928ddce2273eaa564f6f50de919327bf3a00f091b5baba8dfa9460f3a8a8/idna-2.10-py2.py3-none-any.whl"
- ]
- }
- },
- "pip_39_pylint_py3_none_any_349c8cd3": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "pylint-2.15.9-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "pylint==2.15.9",
- "sha256": "349c8cd36aede4d50a0754a8c0218b43323d13d5d88f4b2952ddfe3e169681eb",
- "urls": [
- "https://files.pythonhosted.org/packages/7d/df/0e50d5640ed4c6a492cdc6df0c281afee3f85d98209e7ec7b31243838b40/pylint-2.15.9-py3-none-any.whl"
- ]
- }
- },
- "pip_310_babel": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "babel==2.13.1 --hash=sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900 --hash=sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed"
- }
- },
- "pip_39_jinja2_py3_none_any_bc5dd2ab": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "jinja2-3.1.4-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "jinja2==3.1.4",
- "sha256": "bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d",
- "urls": [
- "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl"
- ]
- }
- },
- "pip_39_colorama_sdist_08695f5c": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "colorama-0.4.6.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "colorama==0.4.6",
- "sha256": "08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44",
- "urls": [
- "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz"
- ]
- }
- },
- "other_module_pip_311_absl_py": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@other_module_pip//{name}:{target}",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "other_module_pip_311",
- "requirement": "absl-py==1.4.0 --hash=sha256:0d3fe606adfa4f7db64792dd4c7aee4ee0c38ab75dfd353b7a83ed3e957fcb47 --hash=sha256:d2c244d01048ba476e7c080bd2c6df5e141d211de80223460d5b3b8a2a58433d"
- }
- },
- "pip_39_pathspec_py3_none_any_3c95343a": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "pathspec-0.10.3-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "pathspec==0.10.3",
- "sha256": "3c95343af8b756205e2aba76e843ba9520a24dd84f68c22b9f93251507509dd6",
- "urls": [
- "https://files.pythonhosted.org/packages/3c/29/c07c3a976dbe37c56e381e058c11e8738cb3a0416fc842a310461f8bb695/pathspec-0.10.3-py3-none-any.whl"
- ]
- }
- },
- "pip_310_yamllint": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "yamllint==1.32.0 --hash=sha256:d01dde008c65de5b235188ab3110bebc59d18e5c65fc8a58267cd211cd9df34a --hash=sha256:d97a66e48da820829d96077d76b8dfbe6c6140f106e558dae87e81ac4e6b30b7"
- }
- },
- "pip_39_markupsafe_sdist_af598ed3": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "MarkupSafe-2.1.3.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "markupsafe==2.1.3",
- "sha256": "af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad",
- "urls": [
- "https://files.pythonhosted.org/packages/6d/7c/59a3248f411813f8ccba92a55feaac4bf360d29e2ff05ee7d8e1ef2d7dbf/MarkupSafe-2.1.3.tar.gz"
- ]
- }
- },
- "pip_39_python_magic_py2_none_any_c212960a": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "python_magic-0.4.27-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "python-magic==0.4.27",
- "sha256": "c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3",
- "urls": [
- "https://files.pythonhosted.org/packages/6c/73/9f872cb81fc5c3bb48f7227872c28975f998f3e7c2b1c16e95e6432bbb90/python_magic-0.4.27-py2.py3-none-any.whl"
- ]
- }
- },
- "pip_39_sphinxcontrib_htmlhelp_sdist_6c26a118": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "sphinxcontrib_htmlhelp-2.0.4.tar.gz",
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "sphinxcontrib-htmlhelp==2.0.4",
- "sha256": "6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a",
- "urls": [
- "https://files.pythonhosted.org/packages/fd/2d/abf5cd4cc1d5cd9842748b15a28295e4c4a927facfa8a0e173bd3f151bc5/sphinxcontrib_htmlhelp-2.0.4.tar.gz"
- ]
- }
- },
- "pip_39_lazy_object_proxy_cp39_cp39_musllinux_1_1_x86_64_9a3a87cf": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "lazy-object-proxy==1.10.0",
- "sha256": "9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658",
- "urls": [
- "https://files.pythonhosted.org/packages/8e/ae/3e15cffacbdb64ac49930cdbc23cb0c67e1bb9e8a8ca7765fd8a8d2510c3/lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl"
- ]
- }
- },
- "pip_39_typing_extensions_sdist_1a7ead55": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "typing_extensions-4.12.2.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "typing-extensions==4.12.2 ;python_version < '3.10'",
- "sha256": "1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8",
- "urls": [
- "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz"
- ]
- }
- },
- "pip_39_tabulate_py3_none_any_024ca478": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "tabulate-0.9.0-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "tabulate==0.9.0",
- "sha256": "024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f",
- "urls": [
- "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl"
- ]
- }
- },
- "other_module_pip": {
- "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl",
- "ruleClassName": "hub_repository",
- "attributes": {
- "repo_name": "other_module_pip",
- "whl_map": {
- "absl_py": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":null,\"repo\":\"other_module_pip_311_absl_py\",\"target_platforms\":null,\"version\":\"3.11\"}]"
- },
- "packages": [],
- "groups": {}
- }
- },
- "pip_39_markupsafe_cp39_cp39_manylinux_2_17_aarch64_9dcdfd0e": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "markupsafe==2.1.3",
- "sha256": "9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58",
- "urls": [
- "https://files.pythonhosted.org/packages/68/8d/c33c43c499c19f4b51181e196c9a497010908fc22c5de33551e298aa6a21/MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
- ]
- }
- },
- "pip_39_wrapt_cp39_cp39_win_amd64_dee60e1d": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "wrapt-1.14.1-cp39-cp39-win_amd64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "wrapt==1.14.1",
- "sha256": "dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb",
- "urls": [
- "https://files.pythonhosted.org/packages/5b/02/5ac7ea3b6722c84a2882d349ac581a9711b4047fe7a58475903832caa295/wrapt-1.14.1-cp39-cp39-win_amd64.whl"
- ]
- }
- },
- "pip_39_lazy_object_proxy_cp39_cp39_musllinux_1_1_aarch64_21713819": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "lazy-object-proxy==1.10.0",
- "sha256": "217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424",
- "urls": [
- "https://files.pythonhosted.org/packages/d4/f8/d2d0d5caadf41c2d1fc9044dfc0e10d2831fb4ab6a077e68d25ea5bbff3b/lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl"
- ]
- }
- },
- "pip_310_pylint_print": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "pylint-print==1.0.1 --hash=sha256:30aa207e9718ebf4ceb47fb87012092e6d8743aab932aa07aa14a73e750ad3d0 --hash=sha256:a2b2599e7887b93e551db2624c523c1e6e9e58c3be8416cd98d41e4427e2669b"
- }
- },
- "pip_39_tomlkit_sdist_71b952e5": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "tomlkit-0.11.6.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "tomlkit==0.11.6",
- "sha256": "71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73",
- "urls": [
- "https://files.pythonhosted.org/packages/ff/04/58b4c11430ed4b7b8f1723a5e4f20929d59361e9b17f0872d69681fd8ffd/tomlkit-0.11.6.tar.gz"
- ]
- }
- },
- "pip_39_sphinx_py3_none_any_1e09160a": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "sphinx-7.2.6-py3-none-any.whl",
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "sphinx==7.2.6",
- "sha256": "1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560",
- "urls": [
- "https://files.pythonhosted.org/packages/b2/b6/8ed35256aa530a9d3da15d20bdc0ba888d5364441bb50a5a83ee7827affe/sphinx-7.2.6-py3-none-any.whl"
- ]
- }
- },
- "pip_39_pylint_sdist_18783cca": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "pylint-2.15.9.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "pylint==2.15.9",
- "sha256": "18783cca3cfee5b83c6c5d10b3cdb66c6594520ffae61890858fe8d932e1c6b4",
- "urls": [
- "https://files.pythonhosted.org/packages/68/3a/1e61444eb8276ad962a7f300b6920b7ad391f4fbe551d34443f093a18899/pylint-2.15.9.tar.gz"
- ]
- }
- },
- "pip_39_pathspec_sdist_56200de4": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "pathspec-0.10.3.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "pathspec==0.10.3",
- "sha256": "56200de4077d9d0791465aa9095a01d421861e405b5096955051deefd697d6f6",
- "urls": [
- "https://files.pythonhosted.org/packages/32/1a/6baf904503c3e943cae9605c9c88a43b964dea5b59785cf956091b341b08/pathspec-0.10.3.tar.gz"
- ]
- }
- },
- "pip_39_alabaster_py3_none_any_1ee19aca": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "alabaster-0.7.13-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "alabaster==0.7.13",
- "sha256": "1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3",
- "urls": [
- "https://files.pythonhosted.org/packages/64/88/c7083fc61120ab661c5d0b82cb77079fc1429d3f913a456c1c82cf4658f7/alabaster-0.7.13-py3-none-any.whl"
- ]
- }
- },
- "pip_39_wrapt_cp39_cp39_musllinux_1_1_x86_64_34aa51c4": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "wrapt==1.14.1",
- "sha256": "34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe",
- "urls": [
- "https://files.pythonhosted.org/packages/f9/3c/110e52b9da396a4ef3a0521552a1af9c7875a762361f48678c1ac272fd7e/wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl"
- ]
- }
- },
- "pip_39_markupsafe_cp39_cp39_musllinux_1_1_aarch64_ab4a0df4": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "markupsafe==2.1.3",
- "sha256": "ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636",
- "urls": [
- "https://files.pythonhosted.org/packages/03/65/3473d2cb84bb2cda08be95b97fc4f53e6bcd701a2d50ba7b7c905e1e9273/MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl"
- ]
- }
- },
- "pip_39_websockets_cp39_cp39_manylinux_2_17_aarch64_6f1a3f10": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "websockets==11.0.3",
- "sha256": "6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61",
- "urls": [
- "https://files.pythonhosted.org/packages/d9/36/5741e62ccf629c8e38cc20f930491f8a33ce7dba972cae93dba3d6f02552/websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
- ]
- }
- },
- "pip_39_s3cmd_py2_none_any_49cd23d5": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "s3cmd-2.1.0-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "s3cmd==2.1.0",
- "sha256": "49cd23d516b17974b22b611a95ce4d93fe326feaa07320bd1d234fed68cbccfa",
- "urls": [
- "https://files.pythonhosted.org/packages/26/44/19e08f69b2169003f7307565f19449d997895251c6a6566ce21d5d636435/s3cmd-2.1.0-py2.py3-none-any.whl"
- ]
- }
- },
- "pip_39_packaging_sdist_048fb0e9": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "packaging-23.2.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "packaging==23.2",
- "sha256": "048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5",
- "urls": [
- "https://files.pythonhosted.org/packages/fb/2b/9b9c33ffed44ee921d0967086d653047286054117d584f1b1a7c22ceaf7b/packaging-23.2.tar.gz"
- ]
- }
- },
- "pip_39_idna_sdist_b307872f": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "idna-2.10.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "idna==2.10",
- "sha256": "b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6",
- "urls": [
- "https://files.pythonhosted.org/packages/ea/b7/e0e3c1c467636186c39925827be42f16fee389dc404ac29e930e9136be70/idna-2.10.tar.gz"
- ]
- }
- },
- "pip_39_snowballstemmer_sdist_09b16deb": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "snowballstemmer-2.2.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "snowballstemmer==2.2.0",
- "sha256": "09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1",
- "urls": [
- "https://files.pythonhosted.org/packages/44/7b/af302bebf22c749c56c9c3e8ae13190b5b5db37a33d9068652e8f73b7089/snowballstemmer-2.2.0.tar.gz"
- ]
- }
- },
- "pip_310_s3cmd": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "s3cmd==2.1.0 --hash=sha256:49cd23d516b17974b22b611a95ce4d93fe326feaa07320bd1d234fed68cbccfa --hash=sha256:966b0a494a916fc3b4324de38f089c86c70ee90e8e1cae6d59102103a4c0cc03"
- }
- },
- "pip_39_imagesize_py2_none_any_0d8d18d0": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "imagesize-1.4.1-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "imagesize==1.4.1",
- "sha256": "0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b",
- "urls": [
- "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl"
- ]
- }
- },
- "pip_39_setuptools_py3_none_any_57f6f22b": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "setuptools-65.6.3-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "setuptools==65.6.3",
- "sha256": "57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54",
- "urls": [
- "https://files.pythonhosted.org/packages/ef/e3/29d6e1a07e8d90ace4a522d9689d03e833b67b50d1588e693eec15f26251/setuptools-65.6.3-py3-none-any.whl"
- ]
- }
- },
- "pip_39_lazy_object_proxy_cp39_cp39_win_amd64_a899b10e": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "lazy-object-proxy==1.10.0",
- "sha256": "a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd",
- "urls": [
- "https://files.pythonhosted.org/packages/fe/30/40879041ed6a3364bfa862c4237aa7fe94dcd4affa2175718acbbf4d29b9/lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl"
- ]
- }
- },
- "pip_39_sphinxcontrib_devhelp_py3_none_any_fe8009ae": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "sphinxcontrib_devhelp-1.0.5-py3-none-any.whl",
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "sphinxcontrib-devhelp==1.0.5",
- "sha256": "fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f",
- "urls": [
- "https://files.pythonhosted.org/packages/c0/03/010ac733ec7b7f71c1dc88e7115743ee466560d6d85373b56fb9916e4586/sphinxcontrib_devhelp-1.0.5-py3-none-any.whl"
- ]
- }
- },
- "pip_39_dill_sdist_e5db55f3": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "dill-0.3.6.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "dill==0.3.6",
- "sha256": "e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373",
- "urls": [
- "https://files.pythonhosted.org/packages/7c/e7/364a09134e1062d4d5ff69b853a56cf61c223e0afcc6906b6832bcd51ea8/dill-0.3.6.tar.gz"
- ]
- }
- },
- "pip_39_colorama_py2_none_any_4f1d9991": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "colorama-0.4.6-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "colorama==0.4.6",
- "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6",
- "urls": [
- "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl"
- ]
- }
- },
- "pip_39_chardet_py2_none_any_f864054d": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "chardet-4.0.0-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "chardet==4.0.0",
- "sha256": "f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5",
- "urls": [
- "https://files.pythonhosted.org/packages/19/c7/fa589626997dd07bd87d9269342ccb74b1720384a4d739a1872bd84fbe68/chardet-4.0.0-py2.py3-none-any.whl"
- ]
- }
- },
- "pip_310_packaging": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "packaging==23.2 --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 --hash=sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"
- }
- },
- "pip_310_colorama": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "colorama==0.4.6 --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"
- }
- },
- "pip_39_lazy_object_proxy_cp39_cp39_manylinux_2_5_x86_64_18dd842b": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "lazy-object-proxy==1.10.0",
- "sha256": "18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757",
- "urls": [
- "https://files.pythonhosted.org/packages/ab/be/d0a76dd4404ee68c7dd611c9b48e58b5c70ac5458e4c951b2c8923c24dd9/lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
- ]
- }
- },
- "pip_310_pathspec": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "pathspec==0.11.1 --hash=sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687 --hash=sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"
- }
- },
- "pip_39_markupsafe_cp39_cp39_macosx_10_9_x86_64_6b2b5695": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "markupsafe==2.1.3",
- "sha256": "6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b",
- "urls": [
- "https://files.pythonhosted.org/packages/62/9b/4908a57acf39d8811836bc6776b309c2e07d63791485589acf0b6d7bc0c6/MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl"
- ]
- }
- },
- "pip_39_platformdirs_sdist_b46ffafa": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "platformdirs-2.6.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "platformdirs==2.6.0",
- "sha256": "b46ffafa316e6b83b47489d240ce17173f123a9b9c83282141c3daf26ad9ac2e",
- "urls": [
- "https://files.pythonhosted.org/packages/ec/4c/9af851448e55c57b30a13a72580306e628c3b431d97fdae9e0b8d4fa3685/platformdirs-2.6.0.tar.gz"
- ]
- }
- },
- "pip_39_lazy_object_proxy_cp39_cp39_macosx_10_9_x86_64_366c32fe": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "lazy-object-proxy==1.10.0",
- "sha256": "366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94",
- "urls": [
- "https://files.pythonhosted.org/packages/bc/2f/b9230d00c2eaa629e67cc69f285bf6b5692cb1d0179a1f8764edd451da86/lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl"
- ]
- }
- },
- "pip_39_markupsafe_cp39_cp39_win_amd64_3fd4abcb": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "markupsafe==2.1.3",
- "sha256": "3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba",
- "urls": [
- "https://files.pythonhosted.org/packages/a2/b2/624042cb58cc6b3529a6c3a7b7d230766e3ecb768cba118ba7befd18ed6f/MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl"
- ]
- }
- },
- "pip_39_wheel_py3_none_any_d236b20e": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "annotation": "@@rules_python~~pip~whl_mods_hub//:wheel.json",
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "wheel-0.40.0-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "wheel==0.40.0",
- "sha256": "d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247",
- "urls": [
- "https://files.pythonhosted.org/packages/61/86/cc8d1ff2ca31a312a25a708c891cf9facbad4eae493b3872638db6785eb5/wheel-0.40.0-py3-none-any.whl"
- ]
- }
- },
- "pip_39_certifi_py3_none_any_92d60375": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "certifi-2023.7.22-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "certifi==2023.7.22",
- "sha256": "92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9",
- "urls": [
- "https://files.pythonhosted.org/packages/4c/dd/2234eab22353ffc7d94e8d13177aaa050113286e93e7b40eae01fbf7c3d9/certifi-2023.7.22-py3-none-any.whl"
- ]
- }
- },
- "pip_39_wrapt_cp39_cp39_macosx_11_0_arm64_988635d1": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "wrapt==1.14.1",
- "sha256": "988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7",
- "urls": [
- "https://files.pythonhosted.org/packages/bb/70/73c54e24ea69a8b06ae9649e61d5e64f2b4bdfc6f202fc7794abeac1ed20/wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl"
- ]
- }
- },
- "pip_310_typing_extensions": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "typing-extensions==4.6.3 --hash=sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26 --hash=sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"
- }
- },
- "pip_39_websockets_cp39_cp39_musllinux_1_1_x86_64_97b52894": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "websockets==11.0.3",
- "sha256": "97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311",
- "urls": [
- "https://files.pythonhosted.org/packages/72/89/0d150939f2e592ed78c071d69237ac1c872462cc62a750c5f592f3d4ab18/websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl"
- ]
- }
- },
- "pip_310_isort": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "isort==5.12.0 --hash=sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504 --hash=sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"
- }
- },
- "pip_39_wrapt_cp39_cp39_macosx_10_9_x86_64_3232822c": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "wrapt==1.14.1",
- "sha256": "3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383",
- "urls": [
- "https://files.pythonhosted.org/packages/d9/ab/3ba5816dd466ffd7242913708771d258569825ab76fd29d7fd85b9361311/wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl"
- ]
- }
- },
- "pip_39_pyyaml_cp39_cp39_musllinux_1_1_x86_64_04ac92ad": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "pyyaml==6.0.1",
- "sha256": "04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5",
- "urls": [
- "https://files.pythonhosted.org/packages/40/da/a175a35cf5583580e90ac3e2a3dbca90e43011593ae62ce63f79d7b28d92/PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl"
- ]
- }
- },
- "pip_39_sphinxcontrib_jsmath_py2_none_any_2ec2eaeb": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "sphinxcontrib-jsmath==1.0.1",
- "sha256": "2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178",
- "urls": [
- "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl"
- ]
- }
- },
- "pip_310_sphinxcontrib_qthelp": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "sphinxcontrib-qthelp==1.0.6 --hash=sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d --hash=sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4"
- }
- },
- "pip_310_wrapt": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "wrapt==1.15.0 --hash=sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0 --hash=sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420 --hash=sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a --hash=sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c --hash=sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079 --hash=sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923 --hash=sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f --hash=sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1 --hash=sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8 --hash=sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86 --hash=sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0 --hash=sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364 --hash=sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e --hash=sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c --hash=sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e --hash=sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c --hash=sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727 --hash=sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff --hash=sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e --hash=sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29 --hash=sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7 --hash=sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72 --hash=sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475 --hash=sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a --hash=sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317 --hash=sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2 --hash=sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd --hash=sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640 --hash=sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98 --hash=sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248 --hash=sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e --hash=sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d --hash=sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec --hash=sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1 --hash=sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e --hash=sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9 --hash=sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92 --hash=sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb --hash=sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094 --hash=sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46 --hash=sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29 --hash=sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd --hash=sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705 --hash=sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8 --hash=sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975 --hash=sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb --hash=sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e --hash=sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b --hash=sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418 --hash=sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019 --hash=sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1 --hash=sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba --hash=sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6 --hash=sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2 --hash=sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3 --hash=sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7 --hash=sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752 --hash=sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416 --hash=sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f --hash=sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1 --hash=sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc --hash=sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145 --hash=sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee --hash=sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a --hash=sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7 --hash=sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b --hash=sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653 --hash=sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0 --hash=sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90 --hash=sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29 --hash=sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6 --hash=sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034 --hash=sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09 --hash=sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559 --hash=sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"
- }
- },
- "pip_39_yamllint_sdist_9e3d8ddd": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "yamllint-1.28.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "yamllint==1.28.0",
- "sha256": "9e3d8ddd16d0583214c5fdffe806c9344086721f107435f68bad990e5a88826b",
- "urls": [
- "https://files.pythonhosted.org/packages/c8/82/4cd3ec8f98d821e7cc7ef504add450623d5c86b656faf65e9b0cc46f4be6/yamllint-1.28.0.tar.gz"
- ]
- }
- },
- "pip_39_importlib_metadata_py3_none_any_66f342cc": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "importlib_metadata-8.4.0-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "importlib-metadata==8.4.0 ;python_version < '3.10'",
- "sha256": "66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1",
- "urls": [
- "https://files.pythonhosted.org/packages/c0/14/362d31bf1076b21e1bcdcb0dc61944822ff263937b804a79231df2774d28/importlib_metadata-8.4.0-py3-none-any.whl"
- ]
- }
- },
- "pip_39_python_dateutil_sdist_0123cacc": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "python-dateutil-2.8.2.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "python-dateutil==2.8.2",
- "sha256": "0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86",
- "urls": [
- "https://files.pythonhosted.org/packages/4c/c4/13b4776ea2d76c115c1d1b84579f3764ee6d57204f6be27119f13a61d0a9/python-dateutil-2.8.2.tar.gz"
- ]
- }
- },
- "pip": {
- "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl",
- "ruleClassName": "hub_repository",
- "attributes": {
- "repo_name": "pip",
- "whl_map": {
- "six": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"six-1.16.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_six_py2_none_any_8abb2f1d\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"six-1.16.0.tar.gz\",\"repo\":\"pip_39_six_sdist_1e61c374\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_six\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "dill": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"dill-0.3.6-py3-none-any.whl\",\"repo\":\"pip_39_dill_py3_none_any_a07ffd23\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"dill-0.3.6.tar.gz\",\"repo\":\"pip_39_dill_sdist_e5db55f3\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_dill\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "idna": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"idna-2.10-py2.py3-none-any.whl\",\"repo\":\"pip_39_idna_py2_none_any_b97d804b\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"idna-2.10.tar.gz\",\"repo\":\"pip_39_idna_sdist_b307872f\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_idna\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "zipp": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"zipp-3.20.0-py3-none-any.whl\",\"repo\":\"pip_39_zipp_py3_none_any_58da6168\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"zipp-3.20.0.tar.gz\",\"repo\":\"pip_39_zipp_sdist_0145e43d\",\"target_platforms\":null,\"version\":\"3.9\"}]",
- "babel": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"Babel-2.13.1-py3-none-any.whl\",\"repo\":\"pip_39_babel_py3_none_any_7077a498\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"Babel-2.13.1.tar.gz\",\"repo\":\"pip_39_babel_sdist_33e0952d\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_babel\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "isort": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"isort-5.11.4-py3-none-any.whl\",\"repo\":\"pip_39_isort_py3_none_any_c033fd0e\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"isort-5.11.4.tar.gz\",\"repo\":\"pip_39_isort_sdist_6db30c5d\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_isort\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "s3cmd": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"s3cmd-2.1.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_s3cmd_py2_none_any_49cd23d5\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"s3cmd-2.1.0.tar.gz\",\"repo\":\"pip_39_s3cmd_sdist_966b0a49\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_s3cmd\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "tomli": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"tomli-2.0.1-py3-none-any.whl\",\"repo\":\"pip_39_tomli_py3_none_any_939de3e7\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"tomli-2.0.1.tar.gz\",\"repo\":\"pip_39_tomli_sdist_de526c12\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_tomli\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "wheel": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"wheel-0.40.0-py3-none-any.whl\",\"repo\":\"pip_39_wheel_py3_none_any_d236b20e\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"wheel-0.40.0.tar.gz\",\"repo\":\"pip_39_wheel_sdist_cd1196f3\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_wheel\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "wrapt": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl\",\"repo\":\"pip_39_wrapt_cp39_cp39_macosx_10_9_x86_64_3232822c\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl\",\"repo\":\"pip_39_wrapt_cp39_cp39_musllinux_1_1_x86_64_34aa51c4\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"pip_39_wrapt_cp39_cp39_manylinux_2_5_x86_64_40e7bc81\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl\",\"repo\":\"pip_39_wrapt_cp39_cp39_macosx_11_0_arm64_988635d1\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"pip_39_wrapt_cp39_cp39_manylinux_2_17_aarch64_9cca3c2c\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl\",\"repo\":\"pip_39_wrapt_cp39_cp39_musllinux_1_1_aarch64_b9b7a708\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"wrapt-1.14.1-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_wrapt_cp39_cp39_win_amd64_dee60e1d\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"wrapt-1.14.1.tar.gz\",\"repo\":\"pip_39_wrapt_sdist_380a85cf\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_wrapt\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "jinja2": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"jinja2-3.1.4-py3-none-any.whl\",\"repo\":\"pip_39_jinja2_py3_none_any_bc5dd2ab\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"jinja2-3.1.4.tar.gz\",\"repo\":\"pip_39_jinja2_sdist_4a3aee7a\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_jinja2\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "mccabe": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"mccabe-0.7.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_mccabe_py2_none_any_6c2d30ab\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"mccabe-0.7.0.tar.gz\",\"repo\":\"pip_39_mccabe_sdist_348e0240\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_mccabe\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "pylint": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"pylint-2.15.9-py3-none-any.whl\",\"repo\":\"pip_39_pylint_py3_none_any_349c8cd3\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"pylint-2.15.9.tar.gz\",\"repo\":\"pip_39_pylint_sdist_18783cca\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pylint\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "pyyaml": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl\",\"repo\":\"pip_39_pyyaml_cp39_cp39_musllinux_1_1_x86_64_04ac92ad\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"PyYAML-6.0.1-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_pyyaml_cp39_cp39_win_amd64_510c9dee\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"pip_39_pyyaml_cp39_cp39_manylinux_2_17_aarch64_5773183b\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl\",\"repo\":\"pip_39_pyyaml_cp39_cp39_macosx_10_9_x86_64_9eb6caa9\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"pip_39_pyyaml_cp39_cp39_manylinux_2_17_s390x_b786eecb\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"pip_39_pyyaml_cp39_cp39_manylinux_2_17_x86_64_bc1bf292\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl\",\"repo\":\"pip_39_pyyaml_cp39_cp39_macosx_11_0_arm64_c8098ddc\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"PyYAML-6.0.1.tar.gz\",\"repo\":\"pip_39_pyyaml_sdist_bfdf460b\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pyyaml\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "sphinx": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"sphinx-7.2.6-py3-none-any.whl\",\"repo\":\"pip_39_sphinx_py3_none_any_1e09160a\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"sphinx-7.2.6.tar.gz\",\"repo\":\"pip_39_sphinx_sdist_9a5160e1\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinx\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "astroid": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"astroid-2.12.13-py3-none-any.whl\",\"repo\":\"pip_39_astroid_py3_none_any_10e0ad5f\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"astroid-2.12.13.tar.gz\",\"repo\":\"pip_39_astroid_sdist_1493fe8b\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_astroid\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "certifi": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"certifi-2023.7.22-py3-none-any.whl\",\"repo\":\"pip_39_certifi_py3_none_any_92d60375\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"certifi-2023.7.22.tar.gz\",\"repo\":\"pip_39_certifi_sdist_539cc1d1\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_certifi\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "chardet": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"chardet-4.0.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_chardet_py2_none_any_f864054d\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"chardet-4.0.0.tar.gz\",\"repo\":\"pip_39_chardet_sdist_0d6f53a1\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_chardet\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "tomlkit": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"tomlkit-0.11.6-py3-none-any.whl\",\"repo\":\"pip_39_tomlkit_py3_none_any_07de26b0\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"tomlkit-0.11.6.tar.gz\",\"repo\":\"pip_39_tomlkit_sdist_71b952e5\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_tomlkit\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "urllib3": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"urllib3-1.26.18-py2.py3-none-any.whl\",\"repo\":\"pip_39_urllib3_py2_none_any_34b97092\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"urllib3-1.26.18.tar.gz\",\"repo\":\"pip_39_urllib3_sdist_f8ecc1bb\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_urllib3\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "colorama": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"colorama-0.4.6-py2.py3-none-any.whl\",\"repo\":\"pip_39_colorama_py2_none_any_4f1d9991\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"colorama-0.4.6.tar.gz\",\"repo\":\"pip_39_colorama_sdist_08695f5c\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_colorama\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "docutils": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"docutils-0.20.1-py3-none-any.whl\",\"repo\":\"pip_39_docutils_py3_none_any_96f387a2\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"docutils-0.20.1.tar.gz\",\"repo\":\"pip_39_docutils_sdist_f08a4e27\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_docutils\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "pathspec": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"pathspec-0.10.3-py3-none-any.whl\",\"repo\":\"pip_39_pathspec_py3_none_any_3c95343a\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"pathspec-0.10.3.tar.gz\",\"repo\":\"pip_39_pathspec_sdist_56200de4\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pathspec\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "pygments": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"Pygments-2.16.1-py3-none-any.whl\",\"repo\":\"pip_39_pygments_py3_none_any_13fc09fa\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"Pygments-2.16.1.tar.gz\",\"repo\":\"pip_39_pygments_sdist_1daff049\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pygments\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "requests": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"requests-2.25.1-py2.py3-none-any.whl\",\"repo\":\"pip_39_requests_py2_none_any_c210084e\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"requests-2.25.1.tar.gz\",\"repo\":\"pip_39_requests_sdist_27973dd4\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_requests\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "tabulate": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"tabulate-0.9.0-py3-none-any.whl\",\"repo\":\"pip_39_tabulate_py3_none_any_024ca478\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"tabulate-0.9.0.tar.gz\",\"repo\":\"pip_39_tabulate_sdist_0095b12b\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_tabulate\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "yamllint": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"yamllint-1.28.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_yamllint_py2_none_any_89bb5b5a\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"yamllint-1.28.0.tar.gz\",\"repo\":\"pip_39_yamllint_sdist_9e3d8ddd\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_yamllint\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "alabaster": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"alabaster-0.7.13-py3-none-any.whl\",\"repo\":\"pip_39_alabaster_py3_none_any_1ee19aca\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"alabaster-0.7.13.tar.gz\",\"repo\":\"pip_39_alabaster_sdist_a27a4a08\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_alabaster\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "imagesize": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"imagesize-1.4.1-py2.py3-none-any.whl\",\"repo\":\"pip_39_imagesize_py2_none_any_0d8d18d0\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"imagesize-1.4.1.tar.gz\",\"repo\":\"pip_39_imagesize_sdist_69150444\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_imagesize\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "packaging": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"packaging-23.2-py3-none-any.whl\",\"repo\":\"pip_39_packaging_py3_none_any_8c491190\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"packaging-23.2.tar.gz\",\"repo\":\"pip_39_packaging_sdist_048fb0e9\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_packaging\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "markupsafe": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"pip_39_markupsafe_cp39_cp39_manylinux_2_17_x86_64_05fb2117\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl\",\"repo\":\"pip_39_markupsafe_cp39_cp39_musllinux_1_1_x86_64_0a4e4a1a\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_markupsafe_cp39_cp39_win_amd64_3fd4abcb\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl\",\"repo\":\"pip_39_markupsafe_cp39_cp39_macosx_10_9_x86_64_6b2b5695\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl\",\"repo\":\"pip_39_markupsafe_cp39_cp39_macosx_10_9_universal2_8023faf4\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"pip_39_markupsafe_cp39_cp39_manylinux_2_17_aarch64_9dcdfd0e\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl\",\"repo\":\"pip_39_markupsafe_cp39_cp39_musllinux_1_1_aarch64_ab4a0df4\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"MarkupSafe-2.1.3.tar.gz\",\"repo\":\"pip_39_markupsafe_sdist_af598ed3\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_markupsafe\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "setuptools": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"setuptools-65.6.3-py3-none-any.whl\",\"repo\":\"pip_39_setuptools_py3_none_any_57f6f22b\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"setuptools-65.6.3.tar.gz\",\"repo\":\"pip_39_setuptools_sdist_a7620757\",\"target_platforms\":null,\"version\":\"3.9\"}]",
- "websockets": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl\",\"repo\":\"pip_39_websockets_cp39_cp39_musllinux_1_1_aarch64_1fdf26fa\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"pip_39_websockets_cp39_cp39_manylinux_2_5_x86_64_279e5de4\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl\",\"repo\":\"pip_39_websockets_cp39_cp39_macosx_11_0_arm64_3580dd9c\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"websockets-11.0.3-py3-none-any.whl\",\"repo\":\"pip_39_websockets_py3_none_any_6681ba9e\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"pip_39_websockets_cp39_cp39_manylinux_2_17_aarch64_6f1a3f10\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl\",\"repo\":\"pip_39_websockets_cp39_cp39_macosx_10_9_universal2_777354ee\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl\",\"repo\":\"pip_39_websockets_cp39_cp39_macosx_10_9_x86_64_8c82f119\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl\",\"repo\":\"pip_39_websockets_cp39_cp39_musllinux_1_1_x86_64_97b52894\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"websockets-11.0.3-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_websockets_cp39_cp39_win_amd64_c792ea4e\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"websockets-11.0.3.tar.gz\",\"repo\":\"pip_39_websockets_sdist_88fc51d9\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_websockets\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "platformdirs": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"platformdirs-2.6.0-py3-none-any.whl\",\"repo\":\"pip_39_platformdirs_py3_none_any_1a89a123\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"platformdirs-2.6.0.tar.gz\",\"repo\":\"pip_39_platformdirs_sdist_b46ffafa\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_platformdirs\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "pylint_print": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"pylint_print-1.0.1-py3-none-any.whl\",\"repo\":\"pip_39_pylint_print_py3_none_any_a2b2599e\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"pylint-print-1.0.1.tar.gz\",\"repo\":\"pip_39_pylint_print_sdist_30aa207e\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pylint_print\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "python_magic": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"python_magic-0.4.27-py2.py3-none-any.whl\",\"repo\":\"pip_39_python_magic_py2_none_any_c212960a\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"python-magic-0.4.27.tar.gz\",\"repo\":\"pip_39_python_magic_sdist_c1ba14b0\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_python_magic\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "python_dateutil": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"python_dateutil-2.8.2-py2.py3-none-any.whl\",\"repo\":\"pip_39_python_dateutil_py2_none_any_961d03dc\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"python-dateutil-2.8.2.tar.gz\",\"repo\":\"pip_39_python_dateutil_sdist_0123cacc\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_python_dateutil\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "snowballstemmer": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"snowballstemmer-2.2.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_snowballstemmer_py2_none_any_c8e1716e\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"snowballstemmer-2.2.0.tar.gz\",\"repo\":\"pip_39_snowballstemmer_sdist_09b16deb\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_snowballstemmer\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "lazy_object_proxy": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"pip_39_lazy_object_proxy_cp39_cp39_manylinux_2_5_x86_64_18dd842b\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl\",\"repo\":\"pip_39_lazy_object_proxy_cp39_cp39_musllinux_1_1_aarch64_21713819\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"pip_39_lazy_object_proxy_cp39_cp39_manylinux_2_17_aarch64_2297f08f\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl\",\"repo\":\"pip_39_lazy_object_proxy_cp39_cp39_macosx_10_9_x86_64_366c32fe\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl\",\"repo\":\"pip_39_lazy_object_proxy_cp39_cp39_musllinux_1_1_x86_64_9a3a87cf\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_lazy_object_proxy_cp39_cp39_win_amd64_a899b10e\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"lazy-object-proxy-1.10.0.tar.gz\",\"repo\":\"pip_39_lazy_object_proxy_sdist_78247b6d\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_lazy_object_proxy\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "typing_extensions": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"typing_extensions-4.12.2-py3-none-any.whl\",\"repo\":\"pip_39_typing_extensions_py3_none_any_04e5ca03\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"typing_extensions-4.12.2.tar.gz\",\"repo\":\"pip_39_typing_extensions_sdist_1a7ead55\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_typing_extensions\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "importlib_metadata": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"importlib_metadata-8.4.0-py3-none-any.whl\",\"repo\":\"pip_39_importlib_metadata_py3_none_any_66f342cc\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"importlib_metadata-8.4.0.tar.gz\",\"repo\":\"pip_39_importlib_metadata_sdist_9a547d3b\",\"target_platforms\":null,\"version\":\"3.9\"}]",
- "sphinxcontrib_jsmath": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_jsmath_py2_none_any_2ec2eaeb\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"sphinxcontrib-jsmath-1.0.1.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_jsmath_sdist_a9925e4a\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_jsmath\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "sphinxcontrib_qthelp": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"sphinxcontrib_qthelp-1.0.6-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_qthelp_py3_none_any_bf76886e\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"sphinxcontrib_qthelp-1.0.6.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_qthelp_sdist_62b9d1a1\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_qthelp\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "sphinxcontrib_devhelp": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"sphinxcontrib_devhelp-1.0.5-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_devhelp_py3_none_any_fe8009ae\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"sphinxcontrib_devhelp-1.0.5.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_devhelp_sdist_63b41e0d\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_devhelp\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "sphinxcontrib_htmlhelp": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_htmlhelp_py3_none_any_8001661c\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"sphinxcontrib_htmlhelp-2.0.4.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_htmlhelp_sdist_6c26a118\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_htmlhelp\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "sphinxcontrib_applehelp": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"sphinxcontrib_applehelp-1.0.7-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_applehelp_py3_none_any_094c4d56\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"sphinxcontrib_applehelp-1.0.7.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_applehelp_sdist_39fdc8d7\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_applehelp\",\"target_platforms\":null,\"version\":\"3.10\"}]",
- "sphinxcontrib_serializinghtml": "[{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_serializinghtml_py3_none_any_9b36e503\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":\"sphinxcontrib_serializinghtml-1.1.9.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_serializinghtml_sdist_0c64ff89\",\"target_platforms\":null,\"version\":\"3.9\"},{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_serializinghtml\",\"target_platforms\":null,\"version\":\"3.10\"}]"
- },
- "packages": [
- "alabaster",
- "astroid",
- "babel",
- "certifi",
- "chardet",
- "colorama",
- "dill",
- "docutils",
- "idna",
- "imagesize",
- "importlib_metadata",
- "isort",
- "jinja2",
- "lazy_object_proxy",
- "markupsafe",
- "mccabe",
- "packaging",
- "pathspec",
- "platformdirs",
- "pygments",
- "pylint",
- "pylint_print",
- "python_dateutil",
- "python_magic",
- "pyyaml",
- "requests",
- "s3cmd",
- "setuptools",
- "six",
- "snowballstemmer",
- "sphinx",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_jsmath",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_serializinghtml",
- "tabulate",
- "tomli",
- "tomlkit",
- "typing_extensions",
- "urllib3",
- "websockets",
- "wheel",
- "wrapt",
- "yamllint",
- "zipp"
- ],
- "groups": {
- "sphinx": [
- "sphinx",
- "sphinxcontrib-qthelp",
- "sphinxcontrib-htmlhelp",
- "sphinxcontrib-devhelp",
- "sphinxcontrib-applehelp",
- "sphinxcontrib-serializinghtml"
- ]
- }
- }
- },
- "pip_39_pyyaml_cp39_cp39_manylinux_2_17_x86_64_bc1bf292": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "pyyaml==6.0.1",
- "sha256": "bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c",
- "urls": [
- "https://files.pythonhosted.org/packages/7d/39/472f2554a0f1e825bd7c5afc11c817cd7a2f3657460f7159f691fbb37c51/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
- ]
- }
- },
- "pip_39_importlib_metadata_sdist_9a547d3b": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "importlib_metadata-8.4.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "importlib-metadata==8.4.0 ;python_version < '3.10'",
- "sha256": "9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5",
- "urls": [
- "https://files.pythonhosted.org/packages/c0/bd/fa8ce65b0a7d4b6d143ec23b0f5fd3f7ab80121078c465bc02baeaab22dc/importlib_metadata-8.4.0.tar.gz"
- ]
- }
- },
- "pip_39_tomli_py3_none_any_939de3e7": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "tomli-2.0.1-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "tomli==2.0.1 ;python_version < '3.11'",
- "sha256": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc",
- "urls": [
- "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl"
- ]
- }
- },
- "pip_39_websockets_cp39_cp39_win_amd64_c792ea4e": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "websockets-11.0.3-cp39-cp39-win_amd64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "websockets==11.0.3",
- "sha256": "c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e",
- "urls": [
- "https://files.pythonhosted.org/packages/f4/3f/65dfa50084a06ab0a05f3ca74195c2c17a1c075b8361327d831ccce0a483/websockets-11.0.3-cp39-cp39-win_amd64.whl"
- ]
- }
- },
- "pip_39_sphinxcontrib_qthelp_py3_none_any_bf76886e": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "sphinxcontrib_qthelp-1.0.6-py3-none-any.whl",
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "sphinxcontrib-qthelp==1.0.6",
- "sha256": "bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4",
- "urls": [
- "https://files.pythonhosted.org/packages/1f/e5/1850f3f118e95581c1e30b57028ac979badee1eb29e70ee72b0241f5a185/sphinxcontrib_qthelp-1.0.6-py3-none-any.whl"
- ]
- }
- },
- "pip_310_python_dateutil": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "python-dateutil==2.8.2 --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"
- }
- },
- "pip_310_tomli": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "tomli==2.0.1 --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"
- }
- },
- "pip_310_imagesize": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "imagesize==1.4.1 --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"
- }
- },
- "pip_39_sphinxcontrib_jsmath_sdist_a9925e4a": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "sphinxcontrib-jsmath-1.0.1.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "sphinxcontrib-jsmath==1.0.1",
- "sha256": "a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8",
- "urls": [
- "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz"
- ]
- }
- },
- "pip_39_alabaster_sdist_a27a4a08": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "alabaster-0.7.13.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "alabaster==0.7.13",
- "sha256": "a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2",
- "urls": [
- "https://files.pythonhosted.org/packages/94/71/a8ee96d1fd95ca04a0d2e2d9c4081dac4c2d2b12f7ddb899c8cb9bfd1532/alabaster-0.7.13.tar.gz"
- ]
- }
- },
- "pip_39_pylint_print_py3_none_any_a2b2599e": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "pylint_print-1.0.1-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "pylint-print==1.0.1",
- "sha256": "a2b2599e7887b93e551db2624c523c1e6e9e58c3be8416cd98d41e4427e2669b",
- "urls": [
- "https://files.pythonhosted.org/packages/8f/a9/6f0687b575d502b4fa770cd52231e23462c548829e5f2e6f43a3d2b9c939/pylint_print-1.0.1-py3-none-any.whl"
- ]
- }
- },
- "pip_39_six_sdist_1e61c374": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "six-1.16.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "six==1.16.0",
- "sha256": "1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
- "urls": [
- "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz"
- ]
- }
- },
- "pip_39_requests_sdist_27973dd4": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "annotation": "@@rules_python~~pip~whl_mods_hub//:requests.json",
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "requests-2.25.1.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "requests==2.25.1",
- "sha256": "27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804",
- "urls": [
- "https://files.pythonhosted.org/packages/6b/47/c14abc08432ab22dc18b9892252efaf005ab44066de871e72a38d6af464b/requests-2.25.1.tar.gz"
- ],
- "whl_patches": {
- "@@//patches:empty.patch": "{\"patch_strip\":1,\"whls\":[\"requests-2.25.1-py2.py3-none-any.whl\"]}",
- "@@//patches:requests_metadata.patch": "{\"patch_strip\":1,\"whls\":[\"requests-2.25.1-py2.py3-none-any.whl\"]}",
- "@@//patches:requests_record.patch": "{\"patch_strip\":1,\"whls\":[\"requests-2.25.1-py2.py3-none-any.whl\"]}"
- }
- }
- },
- "pip_310_platformdirs": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "platformdirs==3.5.1 --hash=sha256:412dae91f52a6f84830f39a8078cecd0e866cb72294a5c66808e74d5e88d251f --hash=sha256:e2378146f1964972c03c085bb5662ae80b2b8c06226c54b2ff4aa9483e8a13a5"
- }
- },
- "pip_39_six_py2_none_any_8abb2f1d": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "six-1.16.0-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "six==1.16.0",
- "sha256": "8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254",
- "urls": [
- "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl"
- ]
- }
- },
- "pip_39_urllib3_py2_none_any_34b97092": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "urllib3-1.26.18-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "urllib3==1.26.18",
- "sha256": "34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07",
- "urls": [
- "https://files.pythonhosted.org/packages/b0/53/aa91e163dcfd1e5b82d8a890ecf13314e3e149c05270cc644581f77f17fd/urllib3-1.26.18-py2.py3-none-any.whl"
- ]
- }
- },
- "pip_39_websockets_cp39_cp39_macosx_11_0_arm64_3580dd9c": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "websockets==11.0.3",
- "sha256": "3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016",
- "urls": [
- "https://files.pythonhosted.org/packages/a0/1a/3da73e69ebc00649d11ed836541c92c1a2df0b8a8aa641a2c8746e7c2b9c/websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl"
- ]
- }
- },
- "pip_310_dill": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "dill==0.3.6 --hash=sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0 --hash=sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"
- }
- },
- "pip_39_babel_sdist_33e0952d": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "Babel-2.13.1.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "babel==2.13.1",
- "sha256": "33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900",
- "urls": [
- "https://files.pythonhosted.org/packages/aa/6c/737d2345d86741eeb594381394016b9c74c1253b4cbe274bb1e7b5e2138e/Babel-2.13.1.tar.gz"
- ]
- }
- },
- "pip_310_sphinxcontrib_jsmath": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "sphinxcontrib-jsmath==1.0.1 --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 --hash=sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"
- }
- },
- "pip_39_mccabe_py2_none_any_6c2d30ab": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "mccabe-0.7.0-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "mccabe==0.7.0",
- "sha256": "6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e",
- "urls": [
- "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl"
- ]
- }
- },
- "pip_310_tomlkit": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "tomlkit==0.11.8 --hash=sha256:8c726c4c202bdb148667835f68d68780b9a003a9ec34167b6c673b38eff2a171 --hash=sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"
- }
- },
- "pip_310_markupsafe": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "markupsafe==2.1.3 --hash=sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e --hash=sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e --hash=sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431 --hash=sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686 --hash=sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c --hash=sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559 --hash=sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc --hash=sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb --hash=sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939 --hash=sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c --hash=sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0 --hash=sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4 --hash=sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9 --hash=sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575 --hash=sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba --hash=sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d --hash=sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd --hash=sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3 --hash=sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00 --hash=sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155 --hash=sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac --hash=sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52 --hash=sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f --hash=sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8 --hash=sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b --hash=sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007 --hash=sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24 --hash=sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea --hash=sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198 --hash=sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0 --hash=sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee --hash=sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be --hash=sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2 --hash=sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1 --hash=sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707 --hash=sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6 --hash=sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c --hash=sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58 --hash=sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823 --hash=sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779 --hash=sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636 --hash=sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c --hash=sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad --hash=sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee --hash=sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc --hash=sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2 --hash=sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48 --hash=sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7 --hash=sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e --hash=sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b --hash=sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa --hash=sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5 --hash=sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e --hash=sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb --hash=sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9 --hash=sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57 --hash=sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc --hash=sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc --hash=sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2 --hash=sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"
- }
- },
- "pip_39_isort_sdist_6db30c5d": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "isort-5.11.4.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "isort==5.11.4",
- "sha256": "6db30c5ded9815d813932c04c2f85a360bcdd35fed496f4d8f35495ef0a261b6",
- "urls": [
- "https://files.pythonhosted.org/packages/76/46/004e2dd6c312e8bb7cb40a6c01b770956e0ef137857e82d47bd9c829356b/isort-5.11.4.tar.gz"
- ]
- }
- },
- "pip_39_python_magic_sdist_c1ba14b0": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "python-magic-0.4.27.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "python-magic==0.4.27",
- "sha256": "c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b",
- "urls": [
- "https://files.pythonhosted.org/packages/da/db/0b3e28ac047452d079d375ec6798bf76a036a08182dbb39ed38116a49130/python-magic-0.4.27.tar.gz"
- ]
- }
- },
- "pip_39_wrapt_cp39_cp39_manylinux_2_17_aarch64_9cca3c2c": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "wrapt==1.14.1",
- "sha256": "9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86",
- "urls": [
- "https://files.pythonhosted.org/packages/38/38/5b338163b3b4f1ab718306984678c3d180b85a25d72654ea4c61aa6b0968/wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
- ]
- }
- },
- "pip_39_lazy_object_proxy_cp39_cp39_manylinux_2_17_aarch64_2297f08f": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "lazy-object-proxy==1.10.0",
- "sha256": "2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b",
- "urls": [
- "https://files.pythonhosted.org/packages/20/44/7d3b51ada1ddf873b136e2fa1d68bf3ee7b406b0bd9eeb97445932e2bfe1/lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
- ]
- }
- },
- "pip_310_mccabe": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "mccabe==0.7.0 --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"
- }
- },
- "pip_39_certifi_sdist_539cc1d1": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "certifi-2023.7.22.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "certifi==2023.7.22",
- "sha256": "539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082",
- "urls": [
- "https://files.pythonhosted.org/packages/98/98/c2ff18671db109c9f10ed27f5ef610ae05b73bd876664139cf95bd1429aa/certifi-2023.7.22.tar.gz"
- ]
- }
- },
- "pip_39_python_dateutil_py2_none_any_961d03dc": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "python_dateutil-2.8.2-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "python-dateutil==2.8.2",
- "sha256": "961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9",
- "urls": [
- "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl"
- ]
- }
- },
- "pip_310_sphinxcontrib_applehelp": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "sphinxcontrib-applehelp==1.0.7 --hash=sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d --hash=sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa"
- }
- },
- "pip_39_pyyaml_sdist_bfdf460b": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "PyYAML-6.0.1.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "pyyaml==6.0.1",
- "sha256": "bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43",
- "urls": [
- "https://files.pythonhosted.org/packages/cd/e5/af35f7ea75cf72f2cd079c95ee16797de7cd71f29ea7c68ae5ce7be1eda0/PyYAML-6.0.1.tar.gz"
- ]
- }
- },
- "pip_39_sphinxcontrib_devhelp_sdist_63b41e0d": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "sphinxcontrib_devhelp-1.0.5.tar.gz",
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "sphinxcontrib-devhelp==1.0.5",
- "sha256": "63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212",
- "urls": [
- "https://files.pythonhosted.org/packages/2e/f2/6425b6db37e7c2254ad661c90a871061a078beaddaf9f15a00ba9c3a1529/sphinxcontrib_devhelp-1.0.5.tar.gz"
- ]
- }
- },
- "pip_310_pygments": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "pygments==2.16.1 --hash=sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692 --hash=sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"
- }
- },
- "pip_39_tabulate_sdist_0095b12b": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "tabulate-0.9.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "tabulate==0.9.0",
- "sha256": "0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c",
- "urls": [
- "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz"
- ]
- }
- },
- "pip_39_sphinxcontrib_serializinghtml_py3_none_any_9b36e503": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl",
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "sphinxcontrib-serializinghtml==1.1.9",
- "sha256": "9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1",
- "urls": [
- "https://files.pythonhosted.org/packages/95/d6/2e0bda62b2a808070ac922d21a950aa2cb5e4fcfb87e5ff5f86bc43a2201/sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl"
- ]
- }
- },
- "whl_mods_hub": {
- "bzlFile": "@@rules_python~//python/private/pypi:extension.bzl",
- "ruleClassName": "_whl_mods_repo",
- "attributes": {
- "whl_mods": {
- "requests": "{\"additive_build_content\":\"load(\\\"@bazel_skylib//rules:write_file.bzl\\\", \\\"write_file\\\")\\n\\nwrite_file(\\n name = \\\"generated_file\\\",\\n out = \\\"generated_file.txt\\\",\\n content = [\\\"Hello world from requests\\\"],\\n)\\n\\nfilegroup(\\n name = \\\"whl_orig\\\",\\n srcs = glob(\\n [\\\"*.whl\\\"],\\n allow_empty = False,\\n exclude = [\\\"*-patched-*.whl\\\"],\\n ),\\n)\\n\",\"copy_executables\":{},\"copy_files\":{},\"data\":[\":generated_file\"],\"data_exclude_glob\":[],\"srcs_exclude_glob\":[]}",
- "wheel": "{\"additive_build_content\":\"load(\\\"@bazel_skylib//rules:write_file.bzl\\\", \\\"write_file\\\")\\nwrite_file(\\n name = \\\"generated_file\\\",\\n out = \\\"generated_file.txt\\\",\\n content = [\\\"Hello world from build content file\\\"],\\n)\\n\",\"copy_executables\":{\"@@//whl_mods:data/copy_executable.py\":\"copied_content/executable.py\"},\"copy_files\":{\"@@//whl_mods:data/copy_file.txt\":\"copied_content/file.txt\"},\"data\":[\":generated_file\"],\"data_exclude_glob\":[\"site-packages/*.dist-info/WHEEL\"],\"srcs_exclude_glob\":[]}"
- }
- }
- },
- "pip_39_markupsafe_cp39_cp39_musllinux_1_1_x86_64_0a4e4a1a": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "markupsafe==2.1.3",
- "sha256": "0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e",
- "urls": [
- "https://files.pythonhosted.org/packages/ab/20/f59423543a8422cb8c69a579ebd0ef2c9dafa70cc8142b7372b5b4073caa/MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl"
- ]
- }
- },
- "pip_39_imagesize_sdist_69150444": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "imagesize-1.4.1.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "imagesize==1.4.1",
- "sha256": "69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a",
- "urls": [
- "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz"
- ]
- }
- },
- "pip_39_websockets_cp39_cp39_manylinux_2_5_x86_64_279e5de4": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "websockets==11.0.3",
- "sha256": "279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd",
- "urls": [
- "https://files.pythonhosted.org/packages/a6/9c/2356ecb952fd3992b73f7a897d65e57d784a69b94bb8d8fd5f97531e5c02/websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
- ]
- }
- },
- "pip_39_sphinxcontrib_applehelp_py3_none_any_094c4d56": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "sphinxcontrib_applehelp-1.0.7-py3-none-any.whl",
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "sphinxcontrib-applehelp==1.0.7",
- "sha256": "094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d",
- "urls": [
- "https://files.pythonhosted.org/packages/c0/0c/261c0949083c0ac635853528bb0070c89e927841d4e533ba0b5563365c06/sphinxcontrib_applehelp-1.0.7-py3-none-any.whl"
- ]
- }
- },
- "pip_39_zipp_py3_none_any_58da6168": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "zipp-3.20.0-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "zipp==3.20.0 ;python_version < '3.10'",
- "sha256": "58da6168be89f0be59beb194da1250516fdaa062ccebd30127ac65d30045e10d",
- "urls": [
- "https://files.pythonhosted.org/packages/da/cc/b9958af9f9c86b51f846d8487440af495ecf19b16e426fce1ed0b0796175/zipp-3.20.0-py3-none-any.whl"
- ]
- }
- },
- "pip_310_certifi": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "certifi==2023.7.22 --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"
- }
- },
- "pip_310_pyyaml": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "pyyaml==6.0 --hash=sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf --hash=sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293 --hash=sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b --hash=sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57 --hash=sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b --hash=sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4 --hash=sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07 --hash=sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba --hash=sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9 --hash=sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287 --hash=sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513 --hash=sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0 --hash=sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782 --hash=sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0 --hash=sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92 --hash=sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f --hash=sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2 --hash=sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc --hash=sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1 --hash=sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c --hash=sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86 --hash=sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4 --hash=sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c --hash=sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34 --hash=sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b --hash=sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d --hash=sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c --hash=sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb --hash=sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7 --hash=sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737 --hash=sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3 --hash=sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d --hash=sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358 --hash=sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53 --hash=sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78 --hash=sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803 --hash=sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a --hash=sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f --hash=sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174 --hash=sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"
- }
- },
- "pip_39_requests_py2_none_any_c210084e": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "annotation": "@@rules_python~~pip~whl_mods_hub//:requests.json",
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "requests-2.25.1-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "requests==2.25.1",
- "sha256": "c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e",
- "urls": [
- "https://files.pythonhosted.org/packages/29/c1/24814557f1d22c56d50280771a17307e6bf87b70727d975fd6b2ce6b014a/requests-2.25.1-py2.py3-none-any.whl"
- ],
- "whl_patches": {
- "@@//patches:empty.patch": "{\"patch_strip\":1,\"whls\":[\"requests-2.25.1-py2.py3-none-any.whl\"]}",
- "@@//patches:requests_metadata.patch": "{\"patch_strip\":1,\"whls\":[\"requests-2.25.1-py2.py3-none-any.whl\"]}",
- "@@//patches:requests_record.patch": "{\"patch_strip\":1,\"whls\":[\"requests-2.25.1-py2.py3-none-any.whl\"]}"
- }
- }
- },
- "pip_39_docutils_py3_none_any_96f387a2": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "docutils-0.20.1-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "docutils==0.20.1",
- "sha256": "96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6",
- "urls": [
- "https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl"
- ]
- }
- },
- "pip_39_isort_py3_none_any_c033fd0e": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "isort-5.11.4-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "isort==5.11.4",
- "sha256": "c033fd0edb91000a7f09527fe5c75321878f98322a77ddcc81adbd83724afb7b",
- "urls": [
- "https://files.pythonhosted.org/packages/91/3b/a63bafb8141b67c397841b36ad46e7469716af2b2d00cb0be2dfb9667130/isort-5.11.4-py3-none-any.whl"
- ]
- }
- },
- "pip_39_astroid_sdist_1493fe8b": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "astroid-2.12.13.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "astroid==2.12.13",
- "sha256": "1493fe8bd3dfd73dc35bd53c9d5b6e49ead98497c47b2307662556a5692d29d7",
- "urls": [
- "https://files.pythonhosted.org/packages/61/d0/e7cfca72ec7d6c5e0da725c003db99bb056e9b6c2f4ee6fae1145adf28a6/astroid-2.12.13.tar.gz"
- ]
- }
- },
- "pip_39_sphinxcontrib_htmlhelp_py3_none_any_8001661c": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl",
- "group_deps": [
- "sphinx",
- "sphinxcontrib_qthelp",
- "sphinxcontrib_htmlhelp",
- "sphinxcontrib_devhelp",
- "sphinxcontrib_applehelp",
- "sphinxcontrib_serializinghtml"
- ],
- "group_name": "sphinx",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "sphinxcontrib-htmlhelp==2.0.4",
- "sha256": "8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9",
- "urls": [
- "https://files.pythonhosted.org/packages/28/7a/958f8e3e6abe8219d0d1f1224886de847ab227b218f4a07b61bc337f64be/sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl"
- ]
- }
- },
- "pip_39_websockets_cp39_cp39_macosx_10_9_universal2_777354ee": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "websockets==11.0.3",
- "sha256": "777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8",
- "urls": [
- "https://files.pythonhosted.org/packages/c0/21/cb9dfbbea8dc0ad89ced52630e7e61edb425fb9fdc6002f8d0c5dd26b94b/websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl"
- ]
- }
- },
- "pip_310_chardet": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "chardet==4.0.0 --hash=sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa --hash=sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"
- }
- },
- "pip_39_pyyaml_cp39_cp39_manylinux_2_17_s390x_b786eecb": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "pyyaml==6.0.1",
- "sha256": "b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0",
- "urls": [
- "https://files.pythonhosted.org/packages/4a/4b/c71ef18ef83c82f99e6da8332910692af78ea32bd1d1d76c9787dfa36aea/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl"
- ]
- }
- },
- "pip_39_pylint_print_sdist_30aa207e": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "pylint-print-1.0.1.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "pylint-print==1.0.1",
- "sha256": "30aa207e9718ebf4ceb47fb87012092e6d8743aab932aa07aa14a73e750ad3d0",
- "urls": [
- "https://files.pythonhosted.org/packages/60/76/8fd24bfcbd5130b487990c6ec5eab2a053f1ec8f7d33ef6c38fee7e22b70/pylint-print-1.0.1.tar.gz"
- ]
- }
- },
- "pip_39_websockets_cp39_cp39_macosx_10_9_x86_64_8c82f119": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "websockets==11.0.3",
- "sha256": "8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd",
- "urls": [
- "https://files.pythonhosted.org/packages/8f/f2/8a3eb016be19743c7eb9e67c855df0fdfa5912534ffaf83a05b62667d761/websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl"
- ]
- }
- },
- "pip_310_urllib3": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "urllib3==1.26.18 --hash=sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07 --hash=sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"
- }
- },
- "pip_310_six": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "six==1.16.0 --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
- }
- },
- "pip_39_wrapt_sdist_380a85cf": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "wrapt-1.14.1.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "wrapt==1.14.1",
- "sha256": "380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d",
- "urls": [
- "https://files.pythonhosted.org/packages/11/eb/e06e77394d6cf09977d92bff310cb0392930c08a338f99af6066a5a98f92/wrapt-1.14.1.tar.gz"
- ]
- }
- },
- "pip_39_pyyaml_cp39_cp39_macosx_11_0_arm64_c8098ddc": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "pyyaml==6.0.1",
- "sha256": "c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859",
- "urls": [
- "https://files.pythonhosted.org/packages/0e/88/21b2f16cb2123c1e9375f2c93486e35fdc86e63f02e274f0e99c589ef153/PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl"
- ]
- }
- },
- "pip_310_wheel": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "annotation": "@@rules_python~~pip~whl_mods_hub//:wheel.json",
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "wheel==0.40.0 --hash=sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873 --hash=sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"
- }
- },
- "pip_39_dill_py3_none_any_a07ffd23": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "dill-0.3.6-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "dill==0.3.6",
- "sha256": "a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0",
- "urls": [
- "https://files.pythonhosted.org/packages/be/e3/a84bf2e561beed15813080d693b4b27573262433fced9c1d1fea59e60553/dill-0.3.6-py3-none-any.whl"
- ]
- }
- },
- "pip_39_babel_py3_none_any_7077a498": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "envsubst": [
- "PIP_INDEX_URL"
- ],
- "experimental_target_platforms": [
- "cp39_linux_aarch64",
- "cp39_linux_arm",
- "cp39_linux_ppc",
- "cp39_linux_s390x",
- "cp39_linux_x86_64",
- "cp39_osx_aarch64",
- "cp39_osx_x86_64",
- "cp39_windows_x86_64"
- ],
- "filename": "Babel-2.13.1-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python",
- "repo": "pip_39",
- "requirement": "babel==2.13.1",
- "sha256": "7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed",
- "urls": [
- "https://files.pythonhosted.org/packages/86/14/5dc2eb02b7cc87b2f95930310a2cc5229198414919a116b564832c747bc1/Babel-2.13.1-py3-none-any.whl"
- ]
- }
- },
- "pip_310_jinja2": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "jinja2==3.1.4 --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"
- }
- },
- "pip_310_websockets": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@pip//{name}:{target}",
- "experimental_target_platforms": [
- "linux_*",
- "osx_*",
- "windows_*",
- "linux_x86_64",
- "host"
- ],
- "extra_pip_args": [
- "--extra-index-url",
- "https://pypi.org/simple/"
- ],
- "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python",
- "repo": "pip_310",
- "requirement": "websockets==11.0.3 --hash=sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd --hash=sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f --hash=sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998 --hash=sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82 --hash=sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788 --hash=sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa --hash=sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f --hash=sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4 --hash=sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7 --hash=sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f --hash=sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd --hash=sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69 --hash=sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb --hash=sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b --hash=sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016 --hash=sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac --hash=sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4 --hash=sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb --hash=sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99 --hash=sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e --hash=sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54 --hash=sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf --hash=sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007 --hash=sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3 --hash=sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6 --hash=sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86 --hash=sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1 --hash=sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61 --hash=sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11 --hash=sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8 --hash=sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f --hash=sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931 --hash=sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526 --hash=sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016 --hash=sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae --hash=sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd --hash=sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b --hash=sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311 --hash=sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af --hash=sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152 --hash=sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288 --hash=sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de --hash=sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97 --hash=sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d --hash=sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d --hash=sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca --hash=sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0 --hash=sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9 --hash=sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b --hash=sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e --hash=sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128 --hash=sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d --hash=sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c --hash=sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5 --hash=sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6 --hash=sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b --hash=sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b --hash=sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280 --hash=sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c --hash=sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c --hash=sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f --hash=sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20 --hash=sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8 --hash=sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb --hash=sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602 --hash=sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf --hash=sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0 --hash=sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74 --hash=sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0 --hash=sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"
- }
- }
- },
- "moduleExtensionMetadata": {
- "useAllRepos": "NO",
- "reproducible": false
- },
- "recordedRepoMappingEntries": [
- [
- "bazel_features~",
- "bazel_features_globals",
- "bazel_features~~version_extension~bazel_features_globals"
- ],
- [
- "bazel_features~",
- "bazel_features_version",
- "bazel_features~~version_extension~bazel_features_version"
- ],
- [
- "rules_python~",
- "bazel_features",
- "bazel_features~"
- ],
- [
- "rules_python~",
- "bazel_skylib",
- "bazel_skylib~"
- ],
- [
- "rules_python~",
- "bazel_tools",
- "bazel_tools"
- ],
- [
- "rules_python~",
- "pypi__build",
- "rules_python~~internal_deps~pypi__build"
- ],
- [
- "rules_python~",
- "pypi__click",
- "rules_python~~internal_deps~pypi__click"
- ],
- [
- "rules_python~",
- "pypi__colorama",
- "rules_python~~internal_deps~pypi__colorama"
- ],
- [
- "rules_python~",
- "pypi__importlib_metadata",
- "rules_python~~internal_deps~pypi__importlib_metadata"
- ],
- [
- "rules_python~",
- "pypi__installer",
- "rules_python~~internal_deps~pypi__installer"
- ],
- [
- "rules_python~",
- "pypi__more_itertools",
- "rules_python~~internal_deps~pypi__more_itertools"
- ],
- [
- "rules_python~",
- "pypi__packaging",
- "rules_python~~internal_deps~pypi__packaging"
- ],
- [
- "rules_python~",
- "pypi__pep517",
- "rules_python~~internal_deps~pypi__pep517"
- ],
- [
- "rules_python~",
- "pypi__pip",
- "rules_python~~internal_deps~pypi__pip"
- ],
- [
- "rules_python~",
- "pypi__pip_tools",
- "rules_python~~internal_deps~pypi__pip_tools"
- ],
- [
- "rules_python~",
- "pypi__pyproject_hooks",
- "rules_python~~internal_deps~pypi__pyproject_hooks"
- ],
- [
- "rules_python~",
- "pypi__setuptools",
- "rules_python~~internal_deps~pypi__setuptools"
- ],
- [
- "rules_python~",
- "pypi__tomli",
- "rules_python~~internal_deps~pypi__tomli"
- ],
- [
- "rules_python~",
- "pypi__wheel",
- "rules_python~~internal_deps~pypi__wheel"
- ],
- [
- "rules_python~",
- "pypi__zipp",
- "rules_python~~internal_deps~pypi__zipp"
- ],
- [
- "rules_python~",
- "pythons_hub",
- "rules_python~~python~pythons_hub"
- ],
- [
- "rules_python~~python~pythons_hub",
- "python_3_10_host",
- "rules_python~~python~python_3_10_host"
- ],
- [
- "rules_python~~python~pythons_hub",
- "python_3_11_host",
- "rules_python~~python~python_3_11_host"
- ],
- [
- "rules_python~~python~pythons_hub",
- "python_3_9_host",
- "rules_python~~python~python_3_9_host"
- ]
- ]
- }
- },
- "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": {
- "general": {
- "bzlTransitiveDigest": "WPfU9gogl29lCI8A/N2aYn7RAhsCpZikVU1Hw7nMtAc=",
- "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=",
- "recordedFileInputs": {
- "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a",
- "@@rules_python~//tools/publish/requirements_windows.txt": "27831a1477549ad865043f17a9c1dd9a19566d460ba1f68cd8dfded642accbca",
- "@@rules_python~//tools/publish/requirements_darwin.txt": "91df49ab0079887f6b7ee4035f9e2a686036c749e7ce82837a4a74b471e4a9aa"
- },
- "recordedDirentsInputs": {},
- "envVariables": {
- "RULES_PYTHON_REPO_DEBUG": null,
- "RULES_PYTHON_REPO_DEBUG_VERBOSITY": null
- },
- "generatedRepoSpecs": {
- "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_aarch64_3548db28": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "cffi==1.15.1",
- "sha256": "3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c",
- "urls": [
- "https://files.pythonhosted.org/packages/91/bc/b7723c2fe7a22eee71d7edf2102cd43423d5f95ff3932ebaa2f82c7ec8d0/cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_zipp_sdist_a7a22e05": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "zipp-3.11.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "zipp==3.11.0",
- "sha256": "a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766",
- "urls": [
- "https://files.pythonhosted.org/packages/8e/b3/8b16a007184714f71157b1a71bbe632c5d66dd43bc8152b3c799b13881e1/zipp-3.11.0.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_urllib3_sdist_076907bf": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "urllib3-1.26.14.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "urllib3==1.26.14",
- "sha256": "076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72",
- "urls": [
- "https://files.pythonhosted.org/packages/c5/52/fe421fb7364aa738b3506a2d99e4f3a56e079c0a798e9f4fa5e14c60922f/urllib3-1.26.14.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_91fc98ad": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "cffi==1.15.1",
- "sha256": "91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325",
- "urls": [
- "https://files.pythonhosted.org/packages/5d/4e/4e0bb5579b01fdbfd4388bd1eb9394a989e1336203a4b7f700d887b233c1/cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_requests_py3_none_any_64299f49": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "requests-2.28.2-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "requests==2.28.2",
- "sha256": "64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa",
- "urls": [
- "https://files.pythonhosted.org/packages/d2/f4/274d1dbe96b41cf4e0efb70cbced278ffd61b5c7bb70338b62af94ccb25b/requests-2.28.2-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_certifi_sdist_35824b4c": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "certifi-2022.12.7.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "certifi==2022.12.7",
- "sha256": "35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3",
- "urls": [
- "https://files.pythonhosted.org/packages/37/f7/2b1b0ec44fdc30a3d31dfebe52226be9ddc40cd6c0f34ffc8923ba423b69/certifi-2022.12.7.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_readme_renderer_py3_none_any_f67a16ca": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "readme_renderer-37.3-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "readme-renderer==37.3",
- "sha256": "f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343",
- "urls": [
- "https://files.pythonhosted.org/packages/97/52/fd8a77d6f0a9ddeb26ed8fb334e01ac546106bf0c5b8e40dc826c5bd160f/readme_renderer-37.3-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_cffi_sdist_d400bfb9": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "cffi-1.15.1.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "cffi==1.15.1",
- "sha256": "d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9",
- "urls": [
- "https://files.pythonhosted.org/packages/2b/a8/050ab4f0c3d4c1b8aaa805f70e26e84d0e27004907c5b8ecc1d31815f92a/cffi-1.15.1.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_requests_toolbelt_py2_none_any_18565aa5": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "requests_toolbelt-0.10.1-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "requests-toolbelt==0.10.1",
- "sha256": "18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7",
- "urls": [
- "https://files.pythonhosted.org/packages/05/d3/bf87a36bff1cb88fd30a509fd366c70ec30676517ee791b2f77e0e29817a/requests_toolbelt-0.10.1-py2.py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_802fe99c": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "charset-normalizer==3.3.2",
- "sha256": "802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db",
- "urls": [
- "https://files.pythonhosted.org/packages/68/77/02839016f6fbbf808e8b38601df6e0e66c17bbab76dff4613f7511413597/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_x86_64_94411f22": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "cffi==1.15.1",
- "sha256": "94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c",
- "urls": [
- "https://files.pythonhosted.org/packages/37/5a/c37631a86be838bdd84cc0259130942bf7e6e32f70f4cab95f479847fb91/cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_1_x86_64_6d0fbe73": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "cryptography-42.0.4-cp39-abi3-musllinux_1_1_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "cryptography==42.0.4",
- "sha256": "6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257",
- "urls": [
- "https://files.pythonhosted.org/packages/41/5d/33f17e40dbb7441ad51e8a6920e726f68443cdbfb388cb8eff53e4b6ffd4/cryptography-42.0.4-cp39-abi3-musllinux_1_1_x86_64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_pygments_py3_none_any_fa7bd7bd": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "Pygments-2.14.0-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "pygments==2.14.0",
- "sha256": "fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717",
- "urls": [
- "https://files.pythonhosted.org/packages/0b/42/d9d95cc461f098f204cd20c85642ae40fbff81f74c300341b8d0e0df14e0/Pygments-2.14.0-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_1_aarch64_3c6048f2": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "cryptography-42.0.4-cp39-abi3-musllinux_1_1_aarch64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "cryptography==42.0.4",
- "sha256": "3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff",
- "urls": [
- "https://files.pythonhosted.org/packages/ea/a1/04733ecbe1e77a228c738f4ab321ca050e45284997f3e3a1539461cd4bca/cryptography-42.0.4-cp39-abi3-musllinux_1_1_aarch64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_bleach_py3_none_any_33c16e33": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "bleach-6.0.0-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "bleach==6.0.0",
- "sha256": "33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4",
- "urls": [
- "https://files.pythonhosted.org/packages/ac/e2/dfcab68c9b2e7800c8f06b85c76e5f978d05b195a958daa9b1dda54a1db6/bleach-6.0.0-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_a1327f28": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "cryptography-42.0.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "cryptography==42.0.4",
- "sha256": "a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52",
- "urls": [
- "https://files.pythonhosted.org/packages/44/61/644e21048102cd72a13325fd6443db741746fbf0157e7c5d5c7628afc336/cryptography-42.0.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_keyring_py3_none_any_771ed2a9": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "keyring-23.13.1-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "keyring==23.13.1",
- "sha256": "771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd",
- "urls": [
- "https://files.pythonhosted.org/packages/62/db/0e9a09b2b95986dcd73ac78be6ed2bd73ebe8bac65cba7add5b83eb9d899/keyring-23.13.1-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_jaraco_classes_sdist_89559fa5": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "jaraco.classes-3.2.3.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "jaraco-classes==3.2.3",
- "sha256": "89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a",
- "urls": [
- "https://files.pythonhosted.org/packages/bf/02/a956c9bfd2dfe60b30c065ed8e28df7fcf72b292b861dca97e951c145ef6/jaraco.classes-3.2.3.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_rich_py3_none_any_7c963f0d": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "rich-13.2.0-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "rich==13.2.0",
- "sha256": "7c963f0d03819221e9ac561e1bc866e3f95a02248c1234daa48954e6d381c003",
- "urls": [
- "https://files.pythonhosted.org/packages/0e/cf/a6369a2aee266c2d7604230f083d4bd14b8f69bc69eb25b3da63b9f2f853/rich-13.2.0-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_x86_64_6ffb03d4": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "cryptography-42.0.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "cryptography==42.0.4",
- "sha256": "6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a",
- "urls": [
- "https://files.pythonhosted.org/packages/32/c2/4ff3cf950504aa6ccd3db3712f515151536eea0cf6125442015b0532a46d/cryptography-42.0.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8c7fe7af": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "charset-normalizer==3.0.1",
- "sha256": "8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317",
- "urls": [
- "https://files.pythonhosted.org/packages/df/c5/dd3a17a615775d0ffc3e12b0e47833d8b7e0a4871431dad87a3f92382a19/charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_secretstorage_sdist_2403533e": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "SecretStorage-3.3.3.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "secretstorage==3.3.3",
- "sha256": "2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77",
- "urls": [
- "https://files.pythonhosted.org/packages/53/a4/f48c9d79cb507ed1373477dbceaba7401fd8a23af63b837fa61f1dcd3691/SecretStorage-3.3.3.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_1_ppc64le_5995f016": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "charset-normalizer==3.0.1",
- "sha256": "5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc",
- "urls": [
- "https://files.pythonhosted.org/packages/86/eb/31c9025b4ed7eddd930c5f2ac269efb953de33140608c7539675d74a2081/charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_idna_sdist_12f65c9b": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "idna-3.10.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "idna==3.10",
- "sha256": "12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
- "urls": [
- "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_887623fe": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "cryptography-42.0.4-cp39-abi3-musllinux_1_2_aarch64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "cryptography==42.0.4",
- "sha256": "887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929",
- "urls": [
- "https://files.pythonhosted.org/packages/da/56/1b2c8aa8e62bfb568022b68d77ebd2bd9afddea37898350fbfe008dcefa7/cryptography-42.0.4-cp39-abi3-musllinux_1_2_aarch64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_more_itertools_sdist_5a6257e4": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "more-itertools-9.0.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "more-itertools==9.0.0",
- "sha256": "5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab",
- "urls": [
- "https://files.pythonhosted.org/packages/13/b3/397aa9668da8b1f0c307bc474608653d46122ae0563d1d32f60e24fa0cbd/more-itertools-9.0.0.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_importlib_metadata_py3_none_any_7efb448e": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "importlib_metadata-6.0.0-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "importlib-metadata==6.0.0",
- "sha256": "7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad",
- "urls": [
- "https://files.pythonhosted.org/packages/26/a7/9da7d5b23fc98ab3d424ac2c65613d63c1f401efb84ad50f2fa27b2caab4/importlib_metadata-6.0.0-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_importlib_metadata_sdist_e354bede": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "importlib_metadata-6.0.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "importlib-metadata==6.0.0",
- "sha256": "e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d",
- "urls": [
- "https://files.pythonhosted.org/packages/90/07/6397ad02d31bddf1841c9ad3ec30a693a3ff208e09c2ef45c9a8a5f85156/importlib_metadata-6.0.0.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_1_x86_64_761e8904": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "charset-normalizer==3.0.1",
- "sha256": "761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6",
- "urls": [
- "https://files.pythonhosted.org/packages/82/49/ab81421d5aa25bc8535896a017c93204cb4051f2a4e72b1ad8f3b594e072/charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_certifi_py3_none_any_4ad3232f": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "certifi-2022.12.7-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "certifi==2022.12.7",
- "sha256": "4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18",
- "urls": [
- "https://files.pythonhosted.org/packages/71/4c/3db2b8021bd6f2f0ceb0e088d6b2d49147671f25832fb17970e9b583d742/certifi-2022.12.7-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_jeepney_py3_none_any_c0a454ad": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "jeepney-0.8.0-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "jeepney==0.8.0",
- "sha256": "c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755",
- "urls": [
- "https://files.pythonhosted.org/packages/ae/72/2a1e2290f1ab1e06f71f3d0f1646c9e4634e70e1d37491535e19266e8dc9/jeepney-0.8.0-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_secretstorage_py3_none_any_f356e662": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "SecretStorage-3.3.3-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "secretstorage==3.3.3",
- "sha256": "f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99",
- "urls": [
- "https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_idna_py3_none_any_90b77e79": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "idna-3.4-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "idna==3.4",
- "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2",
- "urls": [
- "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_44a64043": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "cryptography-42.0.4-cp39-abi3-manylinux_2_28_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "cryptography==42.0.4",
- "sha256": "44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764",
- "urls": [
- "https://files.pythonhosted.org/packages/7e/45/81f378eb85aab14b229c1032ba3694eff85a3d75b35092c3e71abd2d34f6/cryptography-42.0.4-cp39-abi3-manylinux_2_28_x86_64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_urllib3_py2_none_any_75edcdc2": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "urllib3-1.26.14-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "urllib3==1.26.14",
- "sha256": "75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1",
- "urls": [
- "https://files.pythonhosted.org/packages/fe/ca/466766e20b767ddb9b951202542310cba37ea5f2d792dae7589f1741af58/urllib3-1.26.14-py2.py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_urllib3_sdist_3e3d753a": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "urllib3-1.26.19.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "urllib3==1.26.19",
- "sha256": "3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429",
- "urls": [
- "https://files.pythonhosted.org/packages/c8/93/65e479b023bbc46dab3e092bda6b0005424ea3217d711964ccdede3f9b1b/urllib3-1.26.19.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_charset_normalizer_py3_none_any_7e189e2e": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "charset_normalizer-3.0.1-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "charset-normalizer==3.0.1",
- "sha256": "7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24",
- "urls": [
- "https://files.pythonhosted.org/packages/68/2b/02e9d6a98ddb73fa238d559a9edcc30b247b8dc4ee848b6184c936e99dc0/charset_normalizer-3.0.1-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_twine_sdist_9e102ef5": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "twine-4.0.2.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "twine==4.0.2",
- "sha256": "9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8",
- "urls": [
- "https://files.pythonhosted.org/packages/b7/1a/a7884359429d801cd63c2c5512ad0a337a509994b0e42d9696d4778d71f6/twine-4.0.2.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_pywin32_ctypes_py2_none_any_9dc2d991": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_windows_x86_64"
- ],
- "filename": "pywin32_ctypes-0.2.0-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "pywin32-ctypes==0.2.0",
- "sha256": "9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98",
- "urls": [
- "https://files.pythonhosted.org/packages/9e/4b/3ab2720f1fa4b4bc924ef1932b842edf10007e4547ea8157b0b9fc78599a/pywin32_ctypes-0.2.0-py2.py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_pkginfo_py3_none_any_4b7a555a": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "pkginfo-1.9.6-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "pkginfo==1.9.6",
- "sha256": "4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546",
- "urls": [
- "https://files.pythonhosted.org/packages/b3/f2/6e95c86a23a30fa205ea6303a524b20cbae27fbee69216377e3d95266406/pkginfo-1.9.6-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_cc4d65ae": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "cffi==1.15.1",
- "sha256": "cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8",
- "urls": [
- "https://files.pythonhosted.org/packages/d3/56/3e94aa719ae96eeda8b68b3ec6e347e0a23168c6841dc276ccdcdadc9f32/cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_docutils_sdist_3a6b1873": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "docutils-0.21.2.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "docutils==0.21.2",
- "sha256": "3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f",
- "urls": [
- "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_cryptography_sdist_831a4b37": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "cryptography-42.0.4.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "cryptography==42.0.4",
- "sha256": "831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb",
- "urls": [
- "https://files.pythonhosted.org/packages/81/d8/214d25515bf6034dce99aba22eeb47443b14c82160114e3d3f33067c6d3b/cryptography-42.0.4.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_charset_normalizer_sdist_f30c3cb3": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "charset-normalizer-3.3.2.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "charset-normalizer==3.3.2",
- "sha256": "f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5",
- "urls": [
- "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_certifi_py3_none_any_922820b5": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "certifi-2024.8.30-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "certifi==2024.8.30",
- "sha256": "922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8",
- "urls": [
- "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_zipp_sdist_bf1dcf64": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "zipp-3.19.2.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "zipp==3.19.2",
- "sha256": "bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19",
- "urls": [
- "https://files.pythonhosted.org/packages/d3/20/b48f58857d98dcb78f9e30ed2cfe533025e2e9827bbd36ea0a64cc00cbc1/zipp-3.19.2.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_mdurl_py3_none_any_84008a41": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "mdurl-0.1.2-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "mdurl==0.1.2",
- "sha256": "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8",
- "urls": [
- "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_certifi_sdist_bec941d2": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "certifi-2024.8.30.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "certifi==2024.8.30",
- "sha256": "bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9",
- "urls": [
- "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_ce8613be": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "cryptography-42.0.4-cp39-abi3-musllinux_1_2_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "cryptography==42.0.4",
- "sha256": "ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0",
- "urls": [
- "https://files.pythonhosted.org/packages/a2/8e/dac70232d4231c53448e29aa4b768cf82d891fcfd6e0caa7ace242da8c9b/cryptography-42.0.4-cp39-abi3-musllinux_1_2_x86_64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_more_itertools_py3_none_any_250e83d7": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "more_itertools-9.0.0-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "more-itertools==9.0.0",
- "sha256": "250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41",
- "urls": [
- "https://files.pythonhosted.org/packages/5d/87/1ec3fcc09d2c04b977eabf8a1083222f82eaa2f46d5a4f85f403bf8e7b30/more_itertools-9.0.0-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_mdurl_sdist_bb413d29": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "mdurl-0.1.2.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "mdurl==0.1.2",
- "sha256": "bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba",
- "urls": [
- "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_keyring_sdist_ba2e15a9": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "keyring-23.13.1.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "keyring==23.13.1",
- "sha256": "ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678",
- "urls": [
- "https://files.pythonhosted.org/packages/55/fe/282f4c205add8e8bb3a1635cbbac59d6def2e0891b145aa553a0e40dd2d0/keyring-23.13.1.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_rfc3986_sdist_97aacf9d": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "rfc3986-2.0.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "rfc3986==2.0.0",
- "sha256": "97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c",
- "urls": [
- "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_549a3a73": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "charset-normalizer==3.3.2",
- "sha256": "549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e",
- "urls": [
- "https://files.pythonhosted.org/packages/dd/51/68b61b90b24ca35495956b718f35a9756ef7d3dd4b3c1508056fa98d1a1b/charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_six_py2_none_any_8abb2f1d": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "six-1.16.0-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "six==1.16.0",
- "sha256": "8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254",
- "urls": [
- "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_charset_normalizer_py3_none_any_3e4d1f65": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "charset_normalizer-3.3.2-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "charset-normalizer==3.3.2",
- "sha256": "3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc",
- "urls": [
- "https://files.pythonhosted.org/packages/28/76/e6222113b83e3622caa4bb41032d0b1bf785250607392e1b778aca0b8a7d/charset_normalizer-3.3.2-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_1df6fcbf": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "cryptography-42.0.4-cp39-abi3-manylinux_2_28_aarch64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "cryptography==42.0.4",
- "sha256": "1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9",
- "urls": [
- "https://files.pythonhosted.org/packages/4c/e1/18056b2c0e4ba031ea6b9d660bc2bdf491f7ef64ab7ef1a803a03a8b8d26/cryptography-42.0.4-cp39-abi3-manylinux_2_28_aarch64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_14e76c0f": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "charset-normalizer==3.0.1",
- "sha256": "14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b",
- "urls": [
- "https://files.pythonhosted.org/packages/c0/4d/6b82099e3f25a9ed87431e2f51156c14f3a9ce8fad73880a3856cd95f1d5/charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_readme_renderer_sdist_cd653186": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "readme_renderer-37.3.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "readme-renderer==37.3",
- "sha256": "cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273",
- "urls": [
- "https://files.pythonhosted.org/packages/81/c3/d20152fcd1986117b898f66928938f329d0c91ddc47f081c58e64e0f51dc/readme_renderer-37.3.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_markdown_it_py_py3_none_any_93de681e": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "markdown_it_py-2.1.0-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "markdown-it-py==2.1.0",
- "sha256": "93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27",
- "urls": [
- "https://files.pythonhosted.org/packages/f9/3f/ecd1b708973b9a3e4574b43cffc1ce8eb98696da34f1a1c44a68c3c0d737/markdown_it_py-2.1.0-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_six_sdist_1e61c374": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "six-1.16.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "six==1.16.0",
- "sha256": "1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
- "urls": [
- "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_idna_py3_none_any_946d195a": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "idna-3.10-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "idna==3.10",
- "sha256": "946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3",
- "urls": [
- "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_twine_py3_none_any_929bc3c2": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "twine-4.0.2-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "twine==4.0.2",
- "sha256": "929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8",
- "urls": [
- "https://files.pythonhosted.org/packages/3a/38/a3f27a9e8ce45523d7d1e28c09e9085b61a98dab15d35ec086f36a44b37c/twine-4.0.2-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_webencodings_sdist_b36a1c24": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "webencodings-0.5.1.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "webencodings==0.5.1",
- "sha256": "b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923",
- "urls": [
- "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_1_s390x_4a8fcf28": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "charset-normalizer==3.0.1",
- "sha256": "4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b",
- "urls": [
- "https://files.pythonhosted.org/packages/80/54/183163f9910936e57a60ee618f4f5cc91c2f8333ee2d4ebc6c50f6c8684d/charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_markdown_it_py_sdist_cf7e59fe": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "markdown-it-py-2.1.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "markdown-it-py==2.1.0",
- "sha256": "cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da",
- "urls": [
- "https://files.pythonhosted.org/packages/33/e9/ac8a93e9eda3891ecdfecf5e01c060bbd2c44d4e3e77efc83b9c7ce9db32/markdown-it-py-2.1.0.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_urllib3_py2_none_any_37a03444": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "urllib3-1.26.19-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "urllib3==1.26.19",
- "sha256": "37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3",
- "urls": [
- "https://files.pythonhosted.org/packages/ae/6a/99eaaeae8becaa17a29aeb334a18e5d582d873b6f084c11f02581b8d7f7f/urllib3-1.26.19-py2.py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_79909e27": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "charset-normalizer==3.0.1",
- "sha256": "79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603",
- "urls": [
- "https://files.pythonhosted.org/packages/d9/7a/60d45c9453212b30eebbf8b5cddbdef330eebddfcf335bce7920c43fb72e/charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_idna_sdist_814f528e": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "idna-3.4.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "idna==3.4",
- "sha256": "814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4",
- "urls": [
- "https://files.pythonhosted.org/packages/8b/e1/43beb3d38dba6cb420cefa297822eac205a277ab43e5ba5d5c46faf96438/idna-3.4.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_jaraco_classes_py3_none_any_2353de32": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "jaraco.classes-3.2.3-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "jaraco-classes==3.2.3",
- "sha256": "2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158",
- "urls": [
- "https://files.pythonhosted.org/packages/60/28/220d3ae0829171c11e50dded4355d17824d60895285631d7eb9dee0ab5e5/jaraco.classes-3.2.3-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_pycparser_py2_none_any_8ee45429": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "pycparser-2.21-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "pycparser==2.21",
- "sha256": "8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9",
- "urls": [
- "https://files.pythonhosted.org/packages/62/d5/5f610ebe421e85889f2e55e33b7f9a6795bd982198517d912eb1c76e1a53/pycparser-2.21-py2.py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_rich_sdist_f1a00cdd": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "rich-13.2.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "rich==13.2.0",
- "sha256": "f1a00cdd3eebf999a15d85ec498bfe0b1a77efe9b34f645768a54132ef444ac5",
- "urls": [
- "https://files.pythonhosted.org/packages/9e/5e/c3dc3ea32e2c14bfe46e48de954dd175bff76bcc549dd300acb9689521ae/rich-13.2.0.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_pywin32_ctypes_sdist_24ffc3b3": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_windows_x86_64"
- ],
- "filename": "pywin32-ctypes-0.2.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "pywin32-ctypes==0.2.0",
- "sha256": "24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942",
- "urls": [
- "https://files.pythonhosted.org/packages/7a/7d/0dbc4c99379452a819b0fb075a0ffbb98611df6b6d59f54db67367af5bc0/pywin32-ctypes-0.2.0.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_pkginfo_sdist_8fd5896e": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "pkginfo-1.9.6.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "pkginfo==1.9.6",
- "sha256": "8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046",
- "urls": [
- "https://files.pythonhosted.org/packages/b4/1c/89b38e431c20d6b2389ed8b3926c2ab72f58944733ba029354c6d9f69129/pkginfo-1.9.6.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_pygments_sdist_b3ed06a9": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "Pygments-2.14.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "pygments==2.14.0",
- "sha256": "b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297",
- "urls": [
- "https://files.pythonhosted.org/packages/da/6a/c427c06913204e24de28de5300d3f0e809933f376e0b7df95194b2bb3f71/Pygments-2.14.0.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_zipp_py3_none_any_83a28fcb": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "zipp-3.11.0-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "zipp==3.11.0",
- "sha256": "83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa",
- "urls": [
- "https://files.pythonhosted.org/packages/d8/20/256eb3f3f437c575fb1a2efdce5e801a5ce3162ea8117da96c43e6ee97d8/zipp-3.11.0-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_docutils_py3_none_any_5e1de4d8": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "docutils-0.19-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "docutils==0.19",
- "sha256": "5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc",
- "urls": [
- "https://files.pythonhosted.org/packages/93/69/e391bd51bc08ed9141ecd899a0ddb61ab6465309f1eb470905c0c8868081/docutils-0.19-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_docutils_sdist_33995a67": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "docutils-0.19.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "docutils==0.19",
- "sha256": "33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6",
- "urls": [
- "https://files.pythonhosted.org/packages/6b/5c/330ea8d383eb2ce973df34d1239b3b21e91cd8c865d21ff82902d952f91f/docutils-0.19.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_docutils_py3_none_any_dafca5b9": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "docutils-0.21.2-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "docutils==0.21.2",
- "sha256": "dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2",
- "urls": [
- "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_66394663": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "charset-normalizer==3.3.2",
- "sha256": "663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77",
- "urls": [
- "https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_jeepney_sdist_5efe48d2": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "jeepney-0.8.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "jeepney==0.8.0",
- "sha256": "5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806",
- "urls": [
- "https://files.pythonhosted.org/packages/d6/f4/154cf374c2daf2020e05c3c6a03c91348d59b23c5366e968feb198306fdf/jeepney-0.8.0.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_zipp_py3_none_any_f091755f": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "zipp-3.19.2-py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "zipp==3.19.2",
- "sha256": "f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c",
- "urls": [
- "https://files.pythonhosted.org/packages/20/38/f5c473fe9b90c8debdd29ea68d5add0289f1936d6f923b6b9cc0b931194c/zipp-3.19.2-py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_requests_toolbelt_sdist_62e09f7f": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "requests-toolbelt-0.10.1.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "requests-toolbelt==0.10.1",
- "sha256": "62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d",
- "urls": [
- "https://files.pythonhosted.org/packages/0c/4c/07f01c6ac44f7784fa399137fbc8d0cdc1b5d35304e8c0f278ad82105b58/requests-toolbelt-0.10.1.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_0c0a5902": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "charset-normalizer==3.0.1",
- "sha256": "0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1",
- "urls": [
- "https://files.pythonhosted.org/packages/12/e5/aa09a1c39c3e444dd223d63e2c816c18ed78d035cff954143b2a539bdc9e/charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_rfc3986_py2_none_any_50b1502b": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "rfc3986-2.0.0-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "rfc3986==2.0.0",
- "sha256": "50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd",
- "urls": [
- "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_requests_sdist_98b1b278": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "requests-2.28.2.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "requests==2.28.2",
- "sha256": "98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf",
- "urls": [
- "https://files.pythonhosted.org/packages/9d/ee/391076f5937f0a8cdf5e53b701ffc91753e87b07d66bae4a09aa671897bf/requests-2.28.2.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps": {
- "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl",
- "ruleClassName": "hub_repository",
- "attributes": {
- "repo_name": "rules_python_publish_deps",
- "whl_map": {
- "six": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"six-1.16.0-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_six_py2_none_any_8abb2f1d\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"six-1.16.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_six_sdist_1e61c374\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "cffi": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_aarch64_3548db28\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_91fc98ad\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_x86_64_94411f22\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_cc4d65ae\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.15.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cffi_sdist_d400bfb9\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "idna": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"idna-3.10-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_idna_py3_none_any_946d195a\",\"target_platforms\":[\"cp311_osx_aarch64\",\"cp311_osx_x86_64\",\"cp311_windows_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"idna-3.10.tar.gz\",\"repo\":\"rules_python_publish_deps_311_idna_sdist_12f65c9b\",\"target_platforms\":[\"cp311_osx_aarch64\",\"cp311_osx_x86_64\",\"cp311_windows_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"idna-3.4-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_idna_py3_none_any_90b77e79\",\"target_platforms\":[\"cp311_linux_aarch64\",\"cp311_linux_arm\",\"cp311_linux_ppc\",\"cp311_linux_s390x\",\"cp311_linux_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"idna-3.4.tar.gz\",\"repo\":\"rules_python_publish_deps_311_idna_sdist_814f528e\",\"target_platforms\":[\"cp311_linux_aarch64\",\"cp311_linux_arm\",\"cp311_linux_ppc\",\"cp311_linux_s390x\",\"cp311_linux_x86_64\"],\"version\":\"3.11\"}]",
- "rich": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"rich-13.2.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_rich_py3_none_any_7c963f0d\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"rich-13.2.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_rich_sdist_f1a00cdd\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "zipp": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"zipp-3.11.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_zipp_py3_none_any_83a28fcb\",\"target_platforms\":[\"cp311_linux_aarch64\",\"cp311_linux_arm\",\"cp311_linux_ppc\",\"cp311_linux_s390x\",\"cp311_linux_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"zipp-3.11.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_zipp_sdist_a7a22e05\",\"target_platforms\":[\"cp311_linux_aarch64\",\"cp311_linux_arm\",\"cp311_linux_ppc\",\"cp311_linux_s390x\",\"cp311_linux_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"zipp-3.19.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_zipp_py3_none_any_f091755f\",\"target_platforms\":[\"cp311_osx_aarch64\",\"cp311_osx_x86_64\",\"cp311_windows_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"zipp-3.19.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_zipp_sdist_bf1dcf64\",\"target_platforms\":[\"cp311_osx_aarch64\",\"cp311_osx_x86_64\",\"cp311_windows_x86_64\"],\"version\":\"3.11\"}]",
- "mdurl": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"mdurl-0.1.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_mdurl_py3_none_any_84008a41\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"mdurl-0.1.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_mdurl_sdist_bb413d29\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "twine": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"twine-4.0.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_twine_py3_none_any_929bc3c2\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"twine-4.0.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_twine_sdist_9e102ef5\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "bleach": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"bleach-6.0.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_bleach_py3_none_any_33c16e33\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"bleach-6.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_bleach_sdist_1a1a85c1\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "certifi": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"certifi-2022.12.7-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_certifi_py3_none_any_4ad3232f\",\"target_platforms\":[\"cp311_linux_aarch64\",\"cp311_linux_arm\",\"cp311_linux_ppc\",\"cp311_linux_s390x\",\"cp311_linux_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"certifi-2022.12.7.tar.gz\",\"repo\":\"rules_python_publish_deps_311_certifi_sdist_35824b4c\",\"target_platforms\":[\"cp311_linux_aarch64\",\"cp311_linux_arm\",\"cp311_linux_ppc\",\"cp311_linux_s390x\",\"cp311_linux_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"certifi-2024.8.30-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_certifi_py3_none_any_922820b5\",\"target_platforms\":[\"cp311_osx_aarch64\",\"cp311_osx_x86_64\",\"cp311_windows_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"certifi-2024.8.30.tar.gz\",\"repo\":\"rules_python_publish_deps_311_certifi_sdist_bec941d2\",\"target_platforms\":[\"cp311_osx_aarch64\",\"cp311_osx_x86_64\",\"cp311_windows_x86_64\"],\"version\":\"3.11\"}]",
- "jeepney": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jeepney-0.8.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jeepney_py3_none_any_c0a454ad\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jeepney-0.8.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jeepney_sdist_5efe48d2\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "keyring": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"keyring-23.13.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_keyring_py3_none_any_771ed2a9\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"keyring-23.13.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_keyring_sdist_ba2e15a9\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "pkginfo": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pkginfo-1.9.6-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pkginfo_py3_none_any_4b7a555a\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pkginfo-1.9.6.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pkginfo_sdist_8fd5896e\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "rfc3986": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"rfc3986-2.0.0-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_rfc3986_py2_none_any_50b1502b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"rfc3986-2.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_rfc3986_sdist_97aacf9d\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "urllib3": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"urllib3-1.26.14-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_urllib3_py2_none_any_75edcdc2\",\"target_platforms\":[\"cp311_linux_aarch64\",\"cp311_linux_arm\",\"cp311_linux_ppc\",\"cp311_linux_s390x\",\"cp311_linux_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"urllib3-1.26.14.tar.gz\",\"repo\":\"rules_python_publish_deps_311_urllib3_sdist_076907bf\",\"target_platforms\":[\"cp311_linux_aarch64\",\"cp311_linux_arm\",\"cp311_linux_ppc\",\"cp311_linux_s390x\",\"cp311_linux_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"urllib3-1.26.19-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_urllib3_py2_none_any_37a03444\",\"target_platforms\":[\"cp311_osx_aarch64\",\"cp311_osx_x86_64\",\"cp311_windows_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"urllib3-1.26.19.tar.gz\",\"repo\":\"rules_python_publish_deps_311_urllib3_sdist_3e3d753a\",\"target_platforms\":[\"cp311_osx_aarch64\",\"cp311_osx_x86_64\",\"cp311_windows_x86_64\"],\"version\":\"3.11\"}]",
- "docutils": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"docutils-0.19-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_docutils_py3_none_any_5e1de4d8\",\"target_platforms\":[\"cp311_linux_aarch64\",\"cp311_linux_arm\",\"cp311_linux_ppc\",\"cp311_linux_s390x\",\"cp311_linux_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"docutils-0.19.tar.gz\",\"repo\":\"rules_python_publish_deps_311_docutils_sdist_33995a67\",\"target_platforms\":[\"cp311_linux_aarch64\",\"cp311_linux_arm\",\"cp311_linux_ppc\",\"cp311_linux_s390x\",\"cp311_linux_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"docutils-0.21.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_docutils_py3_none_any_dafca5b9\",\"target_platforms\":[\"cp311_osx_aarch64\",\"cp311_osx_x86_64\",\"cp311_windows_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"docutils-0.21.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_docutils_sdist_3a6b1873\",\"target_platforms\":[\"cp311_osx_aarch64\",\"cp311_osx_x86_64\",\"cp311_windows_x86_64\"],\"version\":\"3.11\"}]",
- "pygments": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"Pygments-2.14.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pygments_py3_none_any_fa7bd7bd\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"Pygments-2.14.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pygments_sdist_b3ed06a9\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "requests": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests-2.28.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_requests_py3_none_any_64299f49\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests-2.28.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_requests_sdist_98b1b278\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "pycparser": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pycparser-2.21-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pycparser_py2_none_any_8ee45429\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pycparser-2.21.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pycparser_sdist_e644fdec\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "cryptography": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-42.0.4-cp39-abi3-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_ce8613be\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-42.0.4-cp39-abi3-manylinux_2_28_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_1df6fcbf\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-42.0.4-cp39-abi3-musllinux_1_1_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_1_aarch64_3c6048f2\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-42.0.4-cp39-abi3-manylinux_2_28_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_44a64043\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-42.0.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_x86_64_6ffb03d4\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-42.0.4-cp39-abi3-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_887623fe\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-42.0.4-cp39-abi3-musllinux_1_1_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_1_x86_64_6d0fbe73\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-42.0.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_a1327f28\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-42.0.4.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cryptography_sdist_831a4b37\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "webencodings": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"webencodings-0.5.1-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_webencodings_py2_none_any_a0af1213\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"webencodings-0.5.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_webencodings_sdist_b36a1c24\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "secretstorage": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"SecretStorage-3.3.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_secretstorage_py3_none_any_f356e662\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"SecretStorage-3.3.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_secretstorage_sdist_2403533e\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "jaraco_classes": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.classes-3.2.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_classes_py3_none_any_2353de32\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.classes-3.2.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_classes_sdist_89559fa5\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "markdown_it_py": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"markdown_it_py-2.1.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_markdown_it_py_py3_none_any_93de681e\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"markdown-it-py-2.1.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_markdown_it_py_sdist_cf7e59fe\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "more_itertools": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"more_itertools-9.0.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_more_itertools_py3_none_any_250e83d7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"more-itertools-9.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_more_itertools_sdist_5a6257e4\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "readme_renderer": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"readme_renderer-37.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_readme_renderer_py3_none_any_f67a16ca\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"readme_renderer-37.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_readme_renderer_sdist_cd653186\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "requests_toolbelt": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests_toolbelt-0.10.1-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_requests_toolbelt_py2_none_any_18565aa5\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests-toolbelt-0.10.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_requests_toolbelt_sdist_62e09f7f\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "charset_normalizer": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_0c0a5902\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_14e76c0f\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_1_s390x_4a8fcf28\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_1_ppc64le_5995f016\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_1_aarch64_72966d1b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_1_x86_64_761e8904\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_79909e27\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.0.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_py3_none_any_7e189e2e\",\"target_platforms\":[\"cp311_linux_aarch64\",\"cp311_linux_arm\",\"cp311_linux_ppc\",\"cp311_linux_s390x\",\"cp311_linux_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8c7fe7af\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset-normalizer-3.0.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_sdist_ebea339a\",\"target_platforms\":[\"cp311_linux_aarch64\",\"cp311_linux_arm\",\"cp311_linux_ppc\",\"cp311_linux_s390x\",\"cp311_linux_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.3.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_py3_none_any_3e4d1f65\",\"target_platforms\":[\"cp311_osx_aarch64\",\"cp311_osx_x86_64\",\"cp311_windows_x86_64\"],\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_549a3a73\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_573f6eac\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_66394663\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_802fe99c\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset-normalizer-3.3.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_sdist_f30c3cb3\",\"target_platforms\":[\"cp311_osx_aarch64\",\"cp311_osx_x86_64\",\"cp311_windows_x86_64\"],\"version\":\"3.11\"}]",
- "importlib_metadata": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"importlib_metadata-6.0.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_importlib_metadata_py3_none_any_7efb448e\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"importlib_metadata-6.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_importlib_metadata_sdist_e354bede\",\"target_platforms\":null,\"version\":\"3.11\"}]",
- "pywin32_ctypes": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pywin32_ctypes-0.2.0-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pywin32_ctypes_py2_none_any_9dc2d991\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pywin32-ctypes-0.2.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pywin32_ctypes_sdist_24ffc3b3\",\"target_platforms\":null,\"version\":\"3.11\"}]"
- },
- "packages": [
- "bleach",
- "certifi",
- "charset_normalizer",
- "docutils",
- "idna",
- "importlib_metadata",
- "jaraco_classes",
- "keyring",
- "markdown_it_py",
- "mdurl",
- "more_itertools",
- "pkginfo",
- "pygments",
- "readme_renderer",
- "requests",
- "requests_toolbelt",
- "rfc3986",
- "rich",
- "six",
- "twine",
- "urllib3",
- "webencodings",
- "zipp"
- ],
- "groups": {}
- }
- },
- "rules_python_publish_deps_311_webencodings_py2_none_any_a0af1213": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "webencodings-0.5.1-py2.py3-none-any.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "webencodings==0.5.1",
- "sha256": "a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78",
- "urls": [
- "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_charset_normalizer_sdist_ebea339a": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "charset-normalizer-3.0.1.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "charset-normalizer==3.0.1",
- "sha256": "ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f",
- "urls": [
- "https://files.pythonhosted.org/packages/96/d7/1675d9089a1f4677df5eb29c3f8b064aa1e70c1251a0a8a127803158942d/charset-normalizer-3.0.1.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_1_aarch64_72966d1b": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "charset-normalizer==3.0.1",
- "sha256": "72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a",
- "urls": [
- "https://files.pythonhosted.org/packages/01/ff/9ee4a44e8c32fe96dfc12daa42f29294608a55eadc88f327939327fb20fb/charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_573f6eac": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "charset-normalizer==3.3.2",
- "sha256": "573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96",
- "urls": [
- "https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl"
- ]
- }
- },
- "rules_python_publish_deps_311_pycparser_sdist_e644fdec": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64"
- ],
- "filename": "pycparser-2.21.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "pycparser==2.21",
- "sha256": "e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206",
- "urls": [
- "https://files.pythonhosted.org/packages/5e/0b/95d387f5f4433cb0f53ff7ad859bd2c6051051cebbb564f139a999ab46de/pycparser-2.21.tar.gz"
- ]
- }
- },
- "rules_python_publish_deps_311_bleach_sdist_1a1a85c1": {
- "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl",
- "ruleClassName": "whl_library",
- "attributes": {
- "dep_template": "@rules_python_publish_deps//{name}:{target}",
- "experimental_target_platforms": [
- "cp311_linux_aarch64",
- "cp311_linux_arm",
- "cp311_linux_ppc",
- "cp311_linux_s390x",
- "cp311_linux_x86_64",
- "cp311_osx_aarch64",
- "cp311_osx_x86_64",
- "cp311_windows_x86_64"
- ],
- "filename": "bleach-6.0.0.tar.gz",
- "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python",
- "repo": "rules_python_publish_deps_311",
- "requirement": "bleach==6.0.0",
- "sha256": "1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414",
- "urls": [
- "https://files.pythonhosted.org/packages/7e/e6/d5f220ca638f6a25557a611860482cb6e54b2d97f0332966b1b005742e1f/bleach-6.0.0.tar.gz"
- ]
- }
- }
- },
- "recordedRepoMappingEntries": [
- [
- "bazel_features~",
- "bazel_features_globals",
- "bazel_features~~version_extension~bazel_features_globals"
- ],
- [
- "bazel_features~",
- "bazel_features_version",
- "bazel_features~~version_extension~bazel_features_version"
- ],
- [
- "rules_python~",
- "bazel_features",
- "bazel_features~"
- ],
- [
- "rules_python~",
- "bazel_skylib",
- "bazel_skylib~"
- ],
- [
- "rules_python~",
- "bazel_tools",
- "bazel_tools"
- ],
- [
- "rules_python~",
- "pypi__build",
- "rules_python~~internal_deps~pypi__build"
- ],
- [
- "rules_python~",
- "pypi__click",
- "rules_python~~internal_deps~pypi__click"
- ],
- [
- "rules_python~",
- "pypi__colorama",
- "rules_python~~internal_deps~pypi__colorama"
- ],
- [
- "rules_python~",
- "pypi__importlib_metadata",
- "rules_python~~internal_deps~pypi__importlib_metadata"
- ],
- [
- "rules_python~",
- "pypi__installer",
- "rules_python~~internal_deps~pypi__installer"
- ],
- [
- "rules_python~",
- "pypi__more_itertools",
- "rules_python~~internal_deps~pypi__more_itertools"
- ],
- [
- "rules_python~",
- "pypi__packaging",
- "rules_python~~internal_deps~pypi__packaging"
- ],
- [
- "rules_python~",
- "pypi__pep517",
- "rules_python~~internal_deps~pypi__pep517"
- ],
- [
- "rules_python~",
- "pypi__pip",
- "rules_python~~internal_deps~pypi__pip"
- ],
- [
- "rules_python~",
- "pypi__pip_tools",
- "rules_python~~internal_deps~pypi__pip_tools"
- ],
- [
- "rules_python~",
- "pypi__pyproject_hooks",
- "rules_python~~internal_deps~pypi__pyproject_hooks"
- ],
- [
- "rules_python~",
- "pypi__setuptools",
- "rules_python~~internal_deps~pypi__setuptools"
- ],
- [
- "rules_python~",
- "pypi__tomli",
- "rules_python~~internal_deps~pypi__tomli"
- ],
- [
- "rules_python~",
- "pypi__wheel",
- "rules_python~~internal_deps~pypi__wheel"
- ],
- [
- "rules_python~",
- "pypi__zipp",
- "rules_python~~internal_deps~pypi__zipp"
- ],
- [
- "rules_python~",
- "pythons_hub",
- "rules_python~~python~pythons_hub"
- ],
- [
- "rules_python~~python~pythons_hub",
- "python_3_10_host",
- "rules_python~~python~python_3_10_host"
- ],
- [
- "rules_python~~python~pythons_hub",
- "python_3_11_host",
- "rules_python~~python~python_3_11_host"
- ],
- [
- "rules_python~~python~pythons_hub",
- "python_3_9_host",
- "rules_python~~python~python_3_9_host"
- ]
- ]
- }
- },
- "@@rules_python~//python/uv:extensions.bzl%uv": {
- "general": {
- "bzlTransitiveDigest": "erdJbm7V7XAkG+eWOTPQdxCJy8aKLXh7jWB5ZQm63fo=",
- "usagesDigest": "uLdEsM0i3cqtN+HXzxfaiFko1ilKeu6F8NWoY1IjdBw=",
- "recordedFileInputs": {},
- "recordedDirentsInputs": {},
- "envVariables": {},
- "generatedRepoSpecs": {
- "uv_linux_aarch64": {
- "bzlFile": "@@rules_python~//python/uv:repositories.bzl",
- "ruleClassName": "uv_repository",
- "attributes": {
- "uv_version": "0.2.23",
- "platform": "aarch64-unknown-linux-gnu"
- }
- },
- "uv_darwin_aarch64": {
- "bzlFile": "@@rules_python~//python/uv:repositories.bzl",
- "ruleClassName": "uv_repository",
- "attributes": {
- "uv_version": "0.2.23",
- "platform": "aarch64-apple-darwin"
- }
- },
- "uv_linux_s390x": {
- "bzlFile": "@@rules_python~//python/uv:repositories.bzl",
- "ruleClassName": "uv_repository",
- "attributes": {
- "uv_version": "0.2.23",
- "platform": "s390x-unknown-linux-gnu"
- }
- },
- "uv_linux_ppc": {
- "bzlFile": "@@rules_python~//python/uv:repositories.bzl",
- "ruleClassName": "uv_repository",
- "attributes": {
- "uv_version": "0.2.23",
- "platform": "powerpc64le-unknown-linux-gnu"
- }
- },
- "uv_linux_x86_64": {
- "bzlFile": "@@rules_python~//python/uv:repositories.bzl",
- "ruleClassName": "uv_repository",
- "attributes": {
- "uv_version": "0.2.23",
- "platform": "x86_64-unknown-linux-gnu"
- }
- },
- "uv_toolchains": {
- "bzlFile": "@@rules_python~//python/uv/private:toolchains_repo.bzl",
- "ruleClassName": "uv_toolchains_repo",
- "attributes": {
- "toolchain_type": "'@@rules_python~//python/uv:uv_toolchain_type'",
- "toolchain_names": [
- "uv_darwin_aarch64_toolchain",
- "uv_linux_aarch64_toolchain",
- "uv_linux_ppc_toolchain",
- "uv_linux_s390x_toolchain",
- "uv_darwin_x86_64_toolchain",
- "uv_windows_x86_64_toolchain",
- "uv_linux_x86_64_toolchain"
- ],
- "toolchain_labels": {
- "uv_darwin_aarch64_toolchain": "@uv_darwin_aarch64//:uv_toolchain",
- "uv_linux_aarch64_toolchain": "@uv_linux_aarch64//:uv_toolchain",
- "uv_linux_ppc_toolchain": "@uv_linux_ppc//:uv_toolchain",
- "uv_linux_s390x_toolchain": "@uv_linux_s390x//:uv_toolchain",
- "uv_darwin_x86_64_toolchain": "@uv_darwin_x86_64//:uv_toolchain",
- "uv_windows_x86_64_toolchain": "@uv_windows_x86_64//:uv_toolchain",
- "uv_linux_x86_64_toolchain": "@uv_linux_x86_64//:uv_toolchain"
- },
- "toolchain_compatible_with": {
- "uv_darwin_aarch64_toolchain": [
- "@platforms//os:macos",
- "@platforms//cpu:aarch64"
- ],
- "uv_linux_aarch64_toolchain": [
- "@platforms//os:linux",
- "@platforms//cpu:aarch64"
- ],
- "uv_linux_ppc_toolchain": [
- "@platforms//os:linux",
- "@platforms//cpu:ppc"
- ],
- "uv_linux_s390x_toolchain": [
- "@platforms//os:linux",
- "@platforms//cpu:s390x"
- ],
- "uv_darwin_x86_64_toolchain": [
- "@platforms//os:macos",
- "@platforms//cpu:x86_64"
- ],
- "uv_windows_x86_64_toolchain": [
- "@platforms//os:windows",
- "@platforms//cpu:x86_64"
- ],
- "uv_linux_x86_64_toolchain": [
- "@platforms//os:linux",
- "@platforms//cpu:x86_64"
- ]
- }
- }
- },
- "uv_darwin_x86_64": {
- "bzlFile": "@@rules_python~//python/uv:repositories.bzl",
- "ruleClassName": "uv_repository",
- "attributes": {
- "uv_version": "0.2.23",
- "platform": "x86_64-apple-darwin"
- }
- },
- "uv_windows_x86_64": {
- "bzlFile": "@@rules_python~//python/uv:repositories.bzl",
- "ruleClassName": "uv_repository",
- "attributes": {
- "uv_version": "0.2.23",
- "platform": "x86_64-pc-windows-msvc"
- }
- }
- },
- "recordedRepoMappingEntries": []
- }
- },
- "@@upb~//:non_module_deps.bzl%non_module_deps": {
- "general": {
- "bzlTransitiveDigest": "jsbfONl9OksDWiAs7KDFK5chH/tYI3DngdM30NKdk5Y=",
- "usagesDigest": "IDJOf8yjMDcQ7vE4CsKItkDBrOU4C+76gC1pczv03FQ=",
- "recordedFileInputs": {},
- "recordedDirentsInputs": {},
- "envVariables": {},
- "generatedRepoSpecs": {
- "utf8_range": {
- "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl",
- "ruleClassName": "http_archive",
- "attributes": {
- "urls": [
- "https://github.com/protocolbuffers/utf8_range/archive/de0b4a8ff9b5d4c98108bdfe723291a33c52c54f.zip"
- ],
- "strip_prefix": "utf8_range-de0b4a8ff9b5d4c98108bdfe723291a33c52c54f",
- "sha256": "5da960e5e5d92394c809629a03af3c7709d2d3d0ca731dacb3a9fb4bf28f7702"
- }
- }
- },
- "recordedRepoMappingEntries": [
- [
- "upb~",
- "bazel_tools",
- "bazel_tools"
- ]
- ]
- }
- }
- }
-}
diff --git a/examples/bzlmod/tests/BUILD.bazel b/examples/bzlmod/tests/BUILD.bazel
index 7cbc8d4..96e4cdd 100644
--- a/examples/bzlmod/tests/BUILD.bazel
+++ b/examples/bzlmod/tests/BUILD.bazel
@@ -163,7 +163,7 @@
data = [":version_default"],
env = {
"VERSION_CHECK": "3.9", # The default defined in the WORKSPACE.
- "VERSION_PY_BINARY": "$(rootpath :version_default)",
+ "VERSION_PY_BINARY": "$(rootpaths :version_default)",
},
)
@@ -173,7 +173,7 @@
data = [":version_3_9"],
env = {
"VERSION_CHECK": "3.9",
- "VERSION_PY_BINARY": "$(rootpath :version_3_9)",
+ "VERSION_PY_BINARY": "$(rootpaths :version_3_9)",
},
)
@@ -183,6 +183,6 @@
data = [":version_3_10"],
env = {
"VERSION_CHECK": "3.10",
- "VERSION_PY_BINARY": "$(rootpath :version_3_10)",
+ "VERSION_PY_BINARY": "$(rootpaths :version_3_10)",
},
)
diff --git a/examples/bzlmod/tests/version_test.sh b/examples/bzlmod/tests/version_test.sh
index 3bedb95..3f5fd96 100755
--- a/examples/bzlmod/tests/version_test.sh
+++ b/examples/bzlmod/tests/version_test.sh
@@ -16,7 +16,11 @@
set -o errexit -o nounset -o pipefail
-version_py_binary=$("${VERSION_PY_BINARY}")
+# VERSION_PY_BINARY is a space separate list of the executable and its main
+# py file. We just want the executable.
+bin=($VERSION_PY_BINARY)
+bin="${bin[@]//*.py}"
+version_py_binary=$($bin)
if [[ "${version_py_binary}" != "${VERSION_CHECK}" ]]; then
echo >&2 "expected version '${VERSION_CHECK}' is different than returned '${version_py_binary}'"
diff --git a/examples/bzlmod_build_file_generation/.bazelrc b/examples/bzlmod_build_file_generation/.bazelrc
index acc7102..0289886 100644
--- a/examples/bzlmod_build_file_generation/.bazelrc
+++ b/examples/bzlmod_build_file_generation/.bazelrc
@@ -6,3 +6,4 @@
common --experimental_enable_bzlmod
coverage --java_runtime_version=remotejdk_11
+common:bazel7.x --incompatible_python_disallow_native_rules
diff --git a/examples/bzlmod_build_file_generation/MODULE.bazel b/examples/bzlmod_build_file_generation/MODULE.bazel
index 6bc5880..30ad567 100644
--- a/examples/bzlmod_build_file_generation/MODULE.bazel
+++ b/examples/bzlmod_build_file_generation/MODULE.bazel
@@ -85,3 +85,6 @@
module_name = "other_module",
path = "other_module",
)
+
+# Only needed to make rules_python's CI happy
+bazel_dep(name = "rules_java", version = "8.3.1")
diff --git a/examples/multi_python_versions/.bazelrc b/examples/multi_python_versions/.bazelrc
index 58080ab..97a973b 100644
--- a/examples/multi_python_versions/.bazelrc
+++ b/examples/multi_python_versions/.bazelrc
@@ -4,3 +4,4 @@
build --enable_runfiles
coverage --java_runtime_version=remotejdk_11
+common:bazel7.x --incompatible_python_disallow_native_rules
diff --git a/examples/multi_python_versions/MODULE.bazel b/examples/multi_python_versions/MODULE.bazel
index 4223916..5783157 100644
--- a/examples/multi_python_versions/MODULE.bazel
+++ b/examples/multi_python_versions/MODULE.bazel
@@ -2,7 +2,7 @@
name = "multi_python_versions",
)
-bazel_dep(name = "bazel_skylib", version = "1.4.0")
+bazel_dep(name = "bazel_skylib", version = "1.7.1")
bazel_dep(name = "rules_python", version = "0.0.0")
local_path_override(
module_name = "rules_python",
@@ -30,6 +30,7 @@
)
use_repo(
python,
+ "pythons_hub",
python = "python_versions",
)
@@ -58,3 +59,7 @@
# example test dependencies
bazel_dep(name = "rules_shell", version = "0.2.0", dev_dependency = True)
+
+# Only needed to make rules_python's CI happy. rules_java 8.3.0+ is needed so
+# that --java_runtime_version=remotejdk_11 works with Bazel 8.
+bazel_dep(name = "rules_java", version = "8.3.1")
diff --git a/examples/multi_python_versions/tests/BUILD.bazel b/examples/multi_python_versions/tests/BUILD.bazel
index cf14bf0..d5c66e0 100644
--- a/examples/multi_python_versions/tests/BUILD.bazel
+++ b/examples/multi_python_versions/tests/BUILD.bazel
@@ -1,9 +1,14 @@
load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
+load("@bazel_skylib//rules:diff_test.bzl", "diff_test")
+load("@bazel_skylib//rules:write_file.bzl", "write_file")
load("@python//3.10:defs.bzl", py_binary_3_10 = "py_binary", py_test_3_10 = "py_test")
load("@python//3.11:defs.bzl", py_binary_3_11 = "py_binary", py_test_3_11 = "py_test")
load("@python//3.8:defs.bzl", py_binary_3_8 = "py_binary", py_test_3_8 = "py_test")
load("@python//3.9:defs.bzl", py_binary_3_9 = "py_binary", py_test_3_9 = "py_test")
+load("@pythons_hub//:versions.bzl", "MINOR_MAPPING", "PYTHON_VERSIONS")
load("@rules_python//python:defs.bzl", "py_binary", "py_test")
+load("@rules_python//python:versions.bzl", DEFAULT_MINOR_MAPPING = "MINOR_MAPPING", DEFAULT_TOOL_VERSIONS = "TOOL_VERSIONS")
+load("@rules_python//python/private:text_util.bzl", "render") # buildifier: disable=bzl-visibility
load("@rules_shell//shell:sh_test.bzl", "sh_test")
copy_file(
@@ -183,3 +188,37 @@
"VERSION_PY_BINARY": "$(rootpath :version_3_10)",
},
)
+
+# The following test ensures that default toolchain versions are the same as in
+# the TOOL_VERSIONS array.
+
+# NOTE @aignas 2024-10-26: This test here is to do a sanity check and not
+# include extra dependencies - if rules_testing is included here, we can
+# potentially uses `rules_testing` for a more lightweight test.
+write_file(
+ name = "default_python_versions",
+ out = "default_python_versions.txt",
+ content = [
+ "MINOR_MAPPING:",
+ render.dict(dict(sorted(DEFAULT_MINOR_MAPPING.items()))),
+ "PYTHON_VERSIONS:",
+ render.list(sorted(DEFAULT_TOOL_VERSIONS)),
+ ],
+)
+
+write_file(
+ name = "pythons_hub_versions",
+ out = "pythons_hub_versions.txt",
+ content = [
+ "MINOR_MAPPING:",
+ render.dict(dict(sorted(MINOR_MAPPING.items()))),
+ "PYTHON_VERSIONS:",
+ render.list(sorted(PYTHON_VERSIONS)),
+ ],
+)
+
+diff_test(
+ name = "test_versions",
+ file1 = "default_python_versions",
+ file2 = "pythons_hub_versions",
+)
diff --git a/examples/pip_parse/.bazelrc b/examples/pip_parse/.bazelrc
index 9e7ef37..a569048 100644
--- a/examples/pip_parse/.bazelrc
+++ b/examples/pip_parse/.bazelrc
@@ -1,2 +1,3 @@
# https://docs.bazel.build/versions/main/best-practices.html#using-the-bazelrc-file
try-import %workspace%/user.bazelrc
+common:bazel7.x --incompatible_python_disallow_native_rules
diff --git a/examples/pip_parse_vendored/.bazelrc b/examples/pip_parse_vendored/.bazelrc
index 3818a03..be3555d 100644
--- a/examples/pip_parse_vendored/.bazelrc
+++ b/examples/pip_parse_vendored/.bazelrc
@@ -6,3 +6,4 @@
# Vendoring requirements.bzl files isn't necessary under bzlmod
# When workspace support is dropped, this example can be removed.
build --noexperimental_enable_bzlmod
+common:bazel7.x --incompatible_python_disallow_native_rules
diff --git a/examples/pip_repository_annotations/.bazelrc b/examples/pip_repository_annotations/.bazelrc
index 9ce0b72..4f62c6e 100644
--- a/examples/pip_repository_annotations/.bazelrc
+++ b/examples/pip_repository_annotations/.bazelrc
@@ -4,3 +4,4 @@
# This example is WORKSPACE specific. The equivalent functionality
# is in examples/bzlmod as the `whl_mods` feature.
build --experimental_enable_bzlmod=false
+common:bazel7.x --incompatible_python_disallow_native_rules
diff --git a/examples/py_proto_library/.bazelrc b/examples/py_proto_library/.bazelrc
index ef0e530..65d8a0a 100644
--- a/examples/py_proto_library/.bazelrc
+++ b/examples/py_proto_library/.bazelrc
@@ -1,2 +1,3 @@
# The equivalent bzlmod behavior is covered by examples/bzlmod/py_proto_library
common --noenable_bzlmod
+common:bazel7.x --incompatible_python_disallow_native_rules
diff --git a/gazelle/.bazelrc b/gazelle/.bazelrc
index e10cd78..9704090 100644
--- a/gazelle/.bazelrc
+++ b/gazelle/.bazelrc
@@ -11,10 +11,4 @@
# Windows makes use of runfiles for some rules
build --enable_runfiles
-# Do NOT implicitly create empty __init__.py files in the runfiles tree.
-# By default, these are created in every directory containing Python source code
-# or shared libraries, and every parent directory of those directories,
-# excluding the repo root directory. With this flag set, we are responsible for
-# creating (possibly empty) __init__.py files and adding them to the srcs of
-# Python targets as required.
-build --incompatible_default_to_explicit_init_py
+common:bazel7.x --incompatible_python_disallow_native_rules
diff --git a/gazelle/MODULE.bazel b/gazelle/MODULE.bazel
index 0418b39..d216ad5 100644
--- a/gazelle/MODULE.bazel
+++ b/gazelle/MODULE.bazel
@@ -8,6 +8,7 @@
bazel_dep(name = "rules_python", version = "0.18.0")
bazel_dep(name = "rules_go", version = "0.41.0", repo_name = "io_bazel_rules_go")
bazel_dep(name = "gazelle", version = "0.33.0", repo_name = "bazel_gazelle")
+bazel_dep(name = "rules_cc", version = "0.0.16")
local_path_override(
module_name = "rules_python",
diff --git a/gazelle/manifest/defs.bzl b/gazelle/manifest/defs.bzl
index eacf1c1..3a65bff 100644
--- a/gazelle/manifest/defs.bzl
+++ b/gazelle/manifest/defs.bzl
@@ -39,7 +39,7 @@
manifest, meaning testing it is just as expensive as generating it,
but modifying it is much less likely to result in a merge conflict.
pip_repository_name: the name of the pip_install or pip_repository target.
- pip_deps_repository_name: deprecated - the old pip_install target name.
+ pip_deps_repository_name: deprecated - the old {bzl:obj}`pip_parse` target name.
manifest: the Gazelle manifest file.
defaults to the same value as manifest.
**kwargs: other bazel attributes passed to the generate and test targets
diff --git a/gazelle/manifest/generate/generate.go b/gazelle/manifest/generate/generate.go
index 19ca08a..27cf2a2 100644
--- a/gazelle/manifest/generate/generate.go
+++ b/gazelle/manifest/generate/generate.go
@@ -55,7 +55,7 @@
&pipRepositoryName,
"pip-repository-name",
"",
- "The name of the pip_install or pip_repository target.")
+ "The name of the pip_parse or pip.parse target.")
flag.StringVar(
&modulesMappingPath,
"modules-mapping",
diff --git a/gazelle/python/file_parser.go b/gazelle/python/file_parser.go
index a2b22c2..a1f47f4 100644
--- a/gazelle/python/file_parser.go
+++ b/gazelle/python/file_parser.go
@@ -17,6 +17,7 @@
import (
"context"
"fmt"
+ "log"
"os"
"path/filepath"
"strings"
@@ -55,7 +56,10 @@
return &FileParser{}
}
-func ParseCode(code []byte) (*sitter.Node, error) {
+// ParseCode instantiates a new tree-sitter Parser and parses the python code, returning
+// the tree-sitter RootNode.
+// It prints a warning if parsing fails.
+func ParseCode(code []byte, path string) (*sitter.Node, error) {
parser := sitter.NewParser()
parser.SetLanguage(python.GetLanguage())
@@ -64,9 +68,38 @@
return nil, err
}
- return tree.RootNode(), nil
+ root := tree.RootNode()
+ if !root.HasError() {
+ return root, nil
+ }
+
+ log.Printf("WARNING: failed to parse %q. The resulting BUILD target may be incorrect.", path)
+
+ // Note: we intentionally do not return an error even when root.HasError because the parse
+ // failure may be in some part of the code that Gazelle doesn't care about.
+ verbose, envExists := os.LookupEnv("RULES_PYTHON_GAZELLE_VERBOSE")
+ if !envExists || verbose != "1" {
+ return root, nil
+ }
+
+ for i := 0; i < int(root.ChildCount()); i++ {
+ child := root.Child(i)
+ if child.IsError() {
+ // Example logs:
+ // gazelle: Parse error at {Row:1 Column:0}:
+ // def search_one_more_level[T]():
+ log.Printf("Parse error at %+v:\n%+v", child.StartPoint(), child.Content(code))
+ // Log the internal tree-sitter representation of what was parsed. Eg:
+ // gazelle: The above was parsed as: (ERROR (identifier) (call function: (list (identifier)) arguments: (argument_list)))
+ log.Printf("The above was parsed as: %v", child.String())
+ }
+ }
+
+ return root, nil
}
+// parseMain returns true if the python file has an `if __name__ == "__main__":` block,
+// which is a common idiom for python scripts/binaries.
func (p *FileParser) parseMain(ctx context.Context, node *sitter.Node) bool {
for i := 0; i < int(node.ChildCount()); i++ {
if err := ctx.Err(); err != nil {
@@ -94,6 +127,8 @@
return false
}
+// parseImportStatement parses a node for an import statement, returning a `module` and a boolean
+// representing if the parse was OK or not.
func parseImportStatement(node *sitter.Node, code []byte) (module, bool) {
switch node.Type() {
case sitterNodeTypeDottedName:
@@ -112,6 +147,9 @@
return module{}, false
}
+// parseImportStatements parses a node for import statements, returning true if the node is
+// an import statement. It updates FileParser.output.Modules with the `module` that the
+// import represents.
func (p *FileParser) parseImportStatements(node *sitter.Node) bool {
if node.Type() == sitterNodeTypeImportStatement {
for j := 1; j < int(node.ChildCount()); j++ {
@@ -146,6 +184,8 @@
return true
}
+// parseComments parses a node for comments, returning true if the node is a comment.
+// It updates FileParser.output.Comments with the parsed comment.
func (p *FileParser) parseComments(node *sitter.Node) bool {
if node.Type() == sitterNodeTypeComment {
p.output.Comments = append(p.output.Comments, comment(node.Content(p.code)))
@@ -180,7 +220,7 @@
}
func (p *FileParser) Parse(ctx context.Context) (*ParserOutput, error) {
- rootNode, err := ParseCode(p.code)
+ rootNode, err := ParseCode(p.code, p.relFilepath)
if err != nil {
return nil, err
}
diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go
index c563b47..b1ac668 100644
--- a/gazelle/python/generate.go
+++ b/gazelle/python/generate.go
@@ -309,7 +309,7 @@
build()
if pyLibrary.IsEmpty(py.Kinds()[pyLibrary.Kind()]) {
- result.Empty = append(result.Gen, pyLibrary)
+ result.Empty = append(result.Empty, pyLibrary)
} else {
result.Gen = append(result.Gen, pyLibrary)
result.Imports = append(result.Imports, pyLibrary.PrivateAttr(config.GazelleImportsKey))
diff --git a/internal_deps.bzl b/internal_dev_deps.bzl
similarity index 86%
rename from internal_deps.bzl
rename to internal_dev_deps.bzl
index 9c2e6b2..8019681 100644
--- a/internal_deps.bzl
+++ b/internal_dev_deps.bzl
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-"""Dependencies that are needed for rules_python tests and tools."""
+"""Dependencies that are needed for development and testing of rules_python itself."""
load("@bazel_tools//tools/build_defs/repo:http.bzl", _http_archive = "http_archive", _http_file = "http_file")
load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
@@ -32,17 +32,20 @@
)
def rules_python_internal_deps():
- """Fetches all required dependencies for rules_python tests and tools."""
+ """Fetches all required dependencies for developing/testing rules_python itself.
- # This version is also used in python/tests/toolchains/workspace_template/WORKSPACE.tmpl
- # and tests/ignore_root_user_error/WORKSPACE.
- # If you update this dependency, please update the tests as well.
+ Setup of these dependencies is done by `internal_dev_setup.bzl`
+
+ For dependencies needed by *users* of rules_python, see
+ python/private/py_repositories.bzl.
+ """
+
http_archive(
name = "bazel_skylib",
- sha256 = "c6966ec828da198c5d9adbaa94c05e3a1c7f21bd012a0b29ba8ddbccb2c93b0d",
+ sha256 = "bc283cdfcd526a52c3201279cda4bc298652efa898b10b4db0837dc51652756f",
urls = [
- "https://github.com/bazelbuild/bazel-skylib/releases/download/1.1.1/bazel-skylib-1.1.1.tar.gz",
- "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.1.1/bazel-skylib-1.1.1.tar.gz",
+ "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.7.1/bazel-skylib-1.7.1.tar.gz",
+ "https://github.com/bazelbuild/bazel-skylib/releases/download/1.7.1/bazel-skylib-1.7.1.tar.gz",
],
)
@@ -181,21 +184,19 @@
http_archive(
name = "com_google_protobuf",
- sha256 = "616bb3536ac1fff3fb1a141450fa28b875e985712170ea7f1bfe5e5fc41e2cd8",
- strip_prefix = "protobuf-24.4",
- urls = [
- "https://github.com/protocolbuffers/protobuf/releases/download/v24.4/protobuf-24.4.tar.gz",
- ],
+ sha256 = "23082dca1ca73a1e9c6cbe40097b41e81f71f3b4d6201e36c134acc30a1b3660",
+ url = "https://github.com/protocolbuffers/protobuf/releases/download/v29.0-rc2/protobuf-29.0-rc2.zip",
+ strip_prefix = "protobuf-29.0-rc2",
)
# Needed for stardoc
http_archive(
name = "rules_java",
urls = [
- "https://mirror.bazel.build/github.com/bazelbuild/rules_java/releases/download/6.3.0/rules_java-6.3.0.tar.gz",
- "https://github.com/bazelbuild/rules_java/releases/download/6.3.0/rules_java-6.3.0.tar.gz",
+ "https://mirror.bazel.build/github.com/bazelbuild/rules_java/releases/download/8.3.1/rules_java-8.3.1.tar.gz",
+ "https://github.com/bazelbuild/rules_java/releases/download/8.3.1/rules_java-8.3.1.tar.gz",
],
- sha256 = "29ba147c583aaf5d211686029842c5278e12aaea86f66bd4a9eb5e525b7f2701",
+ sha256 = "ee786b943e00da4fea7c233e70e5f5b8a01cc69b9341b3f49169f174fe0df1c5",
)
RULES_JVM_EXTERNAL_TAG = "5.2"
@@ -227,7 +228,13 @@
http_archive(
name = "rules_cc",
- sha256 = "2037875b9a4456dce4a79d112a8ae885bbc4aad968e6587dca6e64f3a0900cdf",
- strip_prefix = "rules_cc-0.0.9",
- urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.9/rules_cc-0.0.9.tar.gz"],
+ urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.16/rules_cc-0.0.16.tar.gz"],
+ sha256 = "bbf1ae2f83305b7053b11e4467d317a7ba3517a12cef608543c1b1c5bf48a4df",
+ strip_prefix = "rules_cc-0.0.16",
+ )
+
+ http_archive(
+ name = "rules_multirun",
+ sha256 = "0e124567fa85287874eff33a791c3bbdcc5343329a56faa828ef624380d4607c",
+ url = "https://github.com/keith/rules_multirun/releases/download/0.9.0/rules_multirun.0.9.0.tar.gz",
)
diff --git a/internal_setup.bzl b/internal_dev_setup.bzl
similarity index 89%
rename from internal_setup.bzl
rename to internal_dev_setup.bzl
index b3dc326..554ff92 100644
--- a/internal_setup.bzl
+++ b/internal_dev_setup.bzl
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-"""Setup for rules_python tests and tools."""
+"""WORKSPACE setup for development and testing of rules_python itself."""
load("@bazel_features//:deps.bzl", "bazel_features_deps")
load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")
@@ -20,6 +20,7 @@
load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
load("@rules_bazel_integration_test//bazel_integration_test:deps.bzl", "bazel_integration_test_rules_dependencies")
load("@rules_bazel_integration_test//bazel_integration_test:repo_defs.bzl", "bazel_binaries")
+load("@rules_java//java:repositories.bzl", "rules_java_dependencies", "rules_java_toolchains")
load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains")
load("@rules_shell//shell:repositories.bzl", "rules_shell_dependencies", "rules_shell_toolchains")
load("//:version.bzl", "SUPPORTED_BAZEL_VERSIONS")
@@ -29,7 +30,7 @@
load("//python/private/pypi:deps.bzl", "pypi_deps") # buildifier: disable=bzl-visibility
def rules_python_internal_setup():
- """Setup for rules_python tests and tools."""
+ """Setup for development and testing of rules_python itself."""
internal_config_repo(name = "rules_python_internal")
hub_repo(
@@ -43,7 +44,6 @@
python_versions = sorted(TOOL_VERSIONS.keys()),
)
- # Because we don't use the pip_install rule, we have to call this to fetch its deps
pypi_deps()
bazel_skylib_workspace()
@@ -53,6 +53,9 @@
protobuf_deps()
+ rules_java_dependencies()
+ rules_java_toolchains()
+
bazel_integration_test_rules_dependencies()
bazel_starlib_dependencies()
bazel_binaries(versions = SUPPORTED_BAZEL_VERSIONS)
diff --git a/private/BUILD.bazel b/private/BUILD.bazel
new file mode 100644
index 0000000..68fefe9
--- /dev/null
+++ b/private/BUILD.bazel
@@ -0,0 +1,27 @@
+load("@rules_multirun//:defs.bzl", "multirun")
+
+# This file has various targets that are using dev-only dependencies that our users should not ideally see.
+
+multirun(
+ name = "requirements.update",
+ commands = [
+ "//tools/publish:{}.update".format(r)
+ for r in [
+ "requirements_universal",
+ "requirements_darwin",
+ "requirements_windows",
+ "requirements_linux",
+ ]
+ ] + [
+ "//docs:requirements.update",
+ ],
+)
+
+# NOTE: The requirements for the pip dependencies may sometimes break the build
+# process due to how `pip-compile` works (i.e. it sometimes needs to build
+# wheels to resolve the `requirements.in` file. Hence we do not lump the
+# target with the other targets above.
+alias(
+ name = "whl_library_requirements.update",
+ actual = "//tools/private/update_deps:update_pip_deps",
+)
diff --git a/python/BUILD.bazel b/python/BUILD.bazel
index f2f3374..f3b5b13 100644
--- a/python/BUILD.bazel
+++ b/python/BUILD.bazel
@@ -124,7 +124,7 @@
name = "py_binary_bzl",
srcs = ["py_binary.bzl"],
deps = [
- "//python/private:py_binary_macro_bazel_bzl",
+ "//python/private:py_binary_macro_bzl",
"//python/private:register_extension_info_bzl",
"//python/private:util_bzl",
"@rules_python_internal//:rules_python_config_bzl",
@@ -178,7 +178,7 @@
name = "py_library_bzl",
srcs = ["py_library.bzl"],
deps = [
- "//python/private:py_library_macro_bazel_bzl",
+ "//python/private:py_library_macro_bzl",
"//python/private:register_extension_info_bzl",
"//python/private:util_bzl",
"@rules_python_internal//:rules_python_config_bzl",
@@ -219,7 +219,7 @@
name = "py_test_bzl",
srcs = ["py_test.bzl"],
deps = [
- "//python/private:py_test_macro_bazel_bzl",
+ "//python/private:py_test_macro_bzl",
"//python/private:register_extension_info_bzl",
"//python/private:util_bzl",
"@rules_python_internal//:rules_python_config_bzl",
diff --git a/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel
index c530afe..aa26e6e 100644
--- a/python/config_settings/BUILD.bazel
+++ b/python/config_settings/BUILD.bazel
@@ -5,6 +5,8 @@
"AddSrcsToRunfilesFlag",
"BootstrapImplFlag",
"ExecToolsToolchainFlag",
+ "FreeThreadedFlag",
+ "LibcFlag",
"PrecompileFlag",
"PrecompileSourceRetentionFlag",
)
@@ -12,7 +14,6 @@
"//python/private/pypi:flags.bzl",
"UniversalWhlFlag",
"UseWhlFlag",
- "WhlLibcFlag",
"define_pypi_internal_flags",
)
load(":config_settings.bzl", "construct_config_settings")
@@ -86,12 +87,25 @@
# This is used for pip and hermetic toolchain resolution.
string_flag(
name = "py_linux_libc",
- build_setting_default = WhlLibcFlag.GLIBC,
- values = sorted(WhlLibcFlag.__members__.values()),
+ build_setting_default = LibcFlag.GLIBC,
+ values = LibcFlag.flag_values(),
# NOTE: Only public because it is used in pip hub and toolchain repos.
visibility = ["//visibility:public"],
)
+string_flag(
+ name = "py_freethreaded",
+ build_setting_default = FreeThreadedFlag.NO,
+ values = sorted(FreeThreadedFlag.__members__.values()),
+ visibility = ["//visibility:public"],
+)
+
+config_setting(
+ name = "is_py_freethreaded",
+ flag_values = {":py_freethreaded": FreeThreadedFlag.YES},
+ visibility = ["//visibility:public"],
+)
+
# pip.parse related flags
string_flag(
diff --git a/python/extensions/pip.bzl b/python/extensions/pip.bzl
index e9d4726..62a51c6 100644
--- a/python/extensions/pip.bzl
+++ b/python/extensions/pip.bzl
@@ -12,7 +12,13 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-"pip module extension for use with bzlmod"
+"""
+This is the successor to {bzl:obj}`pip_parse` for including third party PyPI dependencies into your bazel module using `bzlmod`.
+
+:::{seealso}
+For user documentation see the [PyPI dependencies section](pypi-dependencies).
+:::
+"""
load("//python/private/pypi:pip.bzl", _pip = "pip")
diff --git a/python/features.bzl b/python/features.bzl
index 3a10532..90a1121 100644
--- a/python/features.bzl
+++ b/python/features.bzl
@@ -13,6 +13,11 @@
# limitations under the License.
"""Allows detecting of rules_python features that aren't easily detected."""
+# This is a magic string expanded by `git archive`, as set by `.gitattributes`
+# See https://git-scm.com/docs/git-archive/2.29.0#Documentation/git-archive.txt-export-subst
+_VERSION_PRIVATE = "$Format:%(describe:tags=true)$"
+
features = struct(
+ version = _VERSION_PRIVATE if "$Format" not in _VERSION_PRIVATE else "",
precompile = True,
)
diff --git a/python/pip.bzl b/python/pip.bzl
index a1a6720..44ee69d 100644
--- a/python/pip.bzl
+++ b/python/pip.bzl
@@ -17,6 +17,10 @@
dependencies via fully locked `requirements.txt` files. Some of the exported
symbols should not be used and they are either undocumented here or marked as
for internal use only.
+
+If you are using a bazel version 7 or above with `bzlmod`, you should only care
+about the {bzl:obj}`compile_pip_requirements` macro exposed in this file. The
+rest of the symbols are for legacy `WORKSPACE` setups.
"""
load("//python/private:normalize_name.bzl", "normalize_name")
diff --git a/python/pip_install/BUILD.bazel b/python/pip_install/BUILD.bazel
index 683199f..09bc46e 100644
--- a/python/pip_install/BUILD.bazel
+++ b/python/pip_install/BUILD.bazel
@@ -35,14 +35,6 @@
deps = ["//python/private/pypi:pip_compile_bzl"],
)
-bzl_library(
- name = "repositories_bzl",
- srcs = ["repositories.bzl"],
- deps = [
- "//python/private/pypi:deps_bzl",
- ],
-)
-
filegroup(
name = "distribution",
srcs = glob(["**"]),
diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel
index d3b9bf4..76e3a78 100644
--- a/python/private/BUILD.bazel
+++ b/python/private/BUILD.bazel
@@ -30,6 +30,7 @@
filegroup(
name = "distribution",
srcs = glob(["**"]) + [
+ "//python/private/api:distribution",
"//python/private/proto:distribution",
"//python/private/pypi:distribution",
"//python/private/whl_filegroup:distribution",
@@ -52,23 +53,17 @@
)
bzl_library(
- name = "attributes_bazel_bzl",
- srcs = ["attributes_bazel.bzl"],
- deps = ["//python/private:rules_cc_srcs_bzl"],
-)
-
-bzl_library(
name = "attributes_bzl",
srcs = ["attributes.bzl"],
deps = [
":common_bzl",
+ ":enum_bzl",
+ ":flags_bzl",
+ ":py_info_bzl",
":py_internal_bzl",
+ ":reexports_bzl",
+ ":rules_cc_srcs_bzl",
":semantics_bzl",
- "//python/private:enum_bzl",
- "//python/private:flags_bzl",
- "//python/private:py_info_bzl",
- "//python/private:reexports_bzl",
- "//python/private:rules_cc_srcs_bzl",
"@bazel_skylib//rules:common_settings",
],
)
@@ -115,10 +110,10 @@
deps = [
":attributes_bzl",
":common_bzl",
+ ":py_cc_link_params_info_bzl",
":py_internal_bzl",
- "//python/private:py_cc_link_params_info_bzl",
- "//python/private:py_interpreter_program_bzl",
- "//python/private:toolchain_types_bzl",
+ ":py_interpreter_program_bzl",
+ ":toolchain_types_bzl",
"@bazel_skylib//lib:paths",
],
)
@@ -128,11 +123,11 @@
srcs = ["common.bzl"],
deps = [
":cc_helper_bzl",
+ ":py_info_bzl",
":py_internal_bzl",
+ ":reexports_bzl",
+ ":rules_cc_srcs_bzl",
":semantics_bzl",
- "//python/private:py_info_bzl",
- "//python/private:reexports_bzl",
- "//python/private:rules_cc_srcs_bzl",
],
)
@@ -180,6 +175,12 @@
)
bzl_library(
+ name = "glob_excludes_bzl",
+ srcs = ["glob_excludes.bzl"],
+ deps = [":util_bzl"],
+)
+
+bzl_library(
name = "internal_config_repo_bzl",
srcs = ["internal_config_repo.bzl"],
deps = [":bzlmod_enabled_bzl"],
@@ -256,21 +257,22 @@
deps = [
":py_toolchain_suite_bzl",
":text_util_bzl",
+ "//python:versions_bzl",
],
)
bzl_library(
- name = "py_binary_macro_bazel_bzl",
- srcs = ["py_binary_macro_bazel.bzl"],
+ name = "py_binary_macro_bzl",
+ srcs = ["py_binary_macro.bzl"],
deps = [
":common_bzl",
- ":py_binary_rule_bazel_bzl",
+ ":py_binary_rule_bzl",
],
)
bzl_library(
- name = "py_binary_rule_bazel_bzl",
- srcs = ["py_binary_rule_bazel.bzl"],
+ name = "py_binary_rule_bzl",
+ srcs = ["py_binary_rule.bzl"],
deps = [
":attributes_bzl",
":py_executable_bazel_bzl",
@@ -345,13 +347,13 @@
name = "py_executable_bazel_bzl",
srcs = ["py_executable_bazel.bzl"],
deps = [
- ":attributes_bazel_bzl",
+ ":attributes_bzl",
":common_bazel_bzl",
":common_bzl",
":py_executable_bzl",
":py_internal_bzl",
+ ":py_runtime_info_bzl",
":semantics_bzl",
- "//python/private:py_runtime_info_bzl",
],
)
@@ -362,14 +364,14 @@
":attributes_bzl",
":cc_helper_bzl",
":common_bzl",
+ ":flags_bzl",
+ ":py_cc_link_params_info_bzl",
+ ":py_executable_info_bzl",
+ ":py_info_bzl",
":py_internal_bzl",
- "//python/private:flags_bzl",
- "//python/private:py_cc_link_params_info_bzl",
- "//python/private:py_executable_info_bzl",
- "//python/private:py_info_bzl",
- "//python/private:py_runtime_info_bzl",
- "//python/private:rules_cc_srcs_bzl",
- "//python/private:toolchain_types_bzl",
+ ":py_runtime_info_bzl",
+ ":rules_cc_srcs_bzl",
+ ":toolchain_types_bzl",
"@bazel_skylib//lib:dicts",
"@bazel_skylib//lib:structs",
"@bazel_skylib//rules:common_settings",
@@ -410,26 +412,25 @@
deps = [
":attributes_bzl",
":common_bzl",
+ ":flags_bzl",
+ ":py_cc_link_params_info_bzl",
":py_internal_bzl",
- "//python/private:flags_bzl",
- "//python/private:py_cc_link_params_info_bzl",
- "//python/private:toolchain_types_bzl",
+ ":toolchain_types_bzl",
"@bazel_skylib//lib:dicts",
"@bazel_skylib//rules:common_settings",
],
)
bzl_library(
- name = "py_library_macro_bazel_bzl",
- srcs = ["py_library_macro_bazel.bzl"],
- deps = [":py_library_rule_bazel_bzl"],
+ name = "py_library_macro_bzl",
+ srcs = ["py_library_macro.bzl"],
+ deps = [":py_library_rule_bzl"],
)
bzl_library(
- name = "py_library_rule_bazel_bzl",
- srcs = ["py_library_rule_bazel.bzl"],
+ name = "py_library_rule_bzl",
+ srcs = ["py_library_rule.bzl"],
deps = [
- ":attributes_bazel_bzl",
":common_bazel_bzl",
":common_bzl",
":py_library_bzl",
@@ -474,13 +475,15 @@
name = "py_runtime_rule_bzl",
srcs = ["py_runtime_rule.bzl"],
deps = [
+ ":attributes_bzl",
+ ":flags_bzl",
+ ":py_internal_bzl",
":py_runtime_info_bzl",
":reexports_bzl",
":util_bzl",
- "//python/private:attributes_bzl",
- "//python/private:py_internal_bzl",
"@bazel_skylib//lib:dicts",
"@bazel_skylib//lib:paths",
+ "@bazel_skylib//rules:common_settings",
],
)
@@ -502,17 +505,17 @@
)
bzl_library(
- name = "py_test_macro_bazel_bzl",
- srcs = ["py_test_macro_bazel.bzl"],
+ name = "py_test_macro_bzl",
+ srcs = ["py_test_macro.bzl"],
deps = [
":common_bazel_bzl",
- ":py_test_rule_bazel_bzl",
+ ":py_test_rule_bzl",
],
)
bzl_library(
- name = "py_test_rule_bazel_bzl",
- srcs = ["py_test_rule_bazel.bzl"],
+ name = "py_test_rule_bzl",
+ srcs = ["py_test_rule.bzl"],
deps = [
":attributes_bzl",
":common_bzl",
@@ -629,11 +632,22 @@
],
)
-# @rules_cc does not offer a bzl_library target for @rules_cc//cc:defs.bzl
bzl_library(
name = "rules_cc_srcs_bzl",
- srcs = ["@rules_cc//cc:bzl_srcs"],
- deps = [":bazel_tools_bzl"],
+ srcs = [
+ # rules_cc 0.0.13 and earlier load cc_proto_libary (and thus protobuf@),
+ # but their bzl srcs targets don't transitively refer to protobuf.
+ "@com_google_protobuf//:bzl_srcs",
+ # NOTE: As of rules_cc 0.10, cc:bzl_srcs no longer contains
+ # everything and sub-targets must be used instead
+ "@rules_cc//cc:bzl_srcs",
+ "@rules_cc//cc/common",
+ "@rules_cc//cc/toolchains:toolchain_rules",
+ ],
+ deps = [
+ ":bazel_tools_bzl",
+ "@rules_cc//cc/common",
+ ],
)
bzl_library(
@@ -689,6 +703,14 @@
visibility = ["//visibility:public"],
)
+filegroup(
+ name = "site_init_template",
+ srcs = ["site_init_template.py"],
+ # Not actually public. Only public because it's an implicit dependency of
+ # py_runtime.
+ visibility = ["//visibility:public"],
+)
+
# NOTE: Windows builds don't use this bootstrap. Instead, a native Windows
# program locates some Python exe and runs `python.exe foo.zip` which
# runs the __main__.py in the zip file.
diff --git a/python/private/api/BUILD.bazel b/python/private/api/BUILD.bazel
index 9e97dc2..0826b85 100644
--- a/python/private/api/BUILD.bazel
+++ b/python/private/api/BUILD.bazel
@@ -19,6 +19,11 @@
default_visibility = ["//:__subpackages__"],
)
+filegroup(
+ name = "distribution",
+ srcs = glob(["**"]),
+)
+
py_common_api(
name = "py_common_api",
# NOTE: Not actually public. Implicit dependency of public rules.
diff --git a/python/private/attributes.bzl b/python/private/attributes.bzl
index 424a2c5..e62abf9 100644
--- a/python/private/attributes.bzl
+++ b/python/private/attributes.bzl
@@ -14,7 +14,7 @@
"""Attributes for Python rules."""
load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
-load("@rules_cc//cc:defs.bzl", "CcInfo")
+load("@rules_cc//cc/common:cc_info.bzl", "CcInfo")
load(":common.bzl", "union_attrs")
load(":enum.bzl", "enum")
load(":flags.bzl", "PrecompileFlag", "PrecompileSourceRetentionFlag")
@@ -270,6 +270,22 @@
allow_none = True,
)
+IMPORTS_ATTRS = {
+ "imports": attr.string_list(
+ doc = """
+List of import directories to be added to the PYTHONPATH.
+
+Subject to "Make variable" substitution. These import directories will be added
+for this rule and all rules that depend on it (note: not the rules this rule
+depends on. Each directory will be added to `PYTHONPATH` by `py_binary` rules
+that depend on this rule. The strings are repo-runfiles-root relative,
+
+Absolute paths (paths that start with `/`) and paths that references a path
+above the execution root are not allowed and will result in an error.
+""",
+ ),
+}
+
_MaybeBuiltinPyInfo = [[BuiltinPyInfo]] if BuiltinPyInfo != None else []
# Attributes common to rules accepting Python sources and deps.
diff --git a/python/private/attributes_bazel.bzl b/python/private/attributes_bazel.bzl
deleted file mode 100644
index f87245d..0000000
--- a/python/private/attributes_bazel.bzl
+++ /dev/null
@@ -1,30 +0,0 @@
-# Copyright 2022 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Attributes specific to the Bazel implementation of the Python rules."""
-
-IMPORTS_ATTRS = {
- "imports": attr.string_list(
- doc = """
-List of import directories to be added to the PYTHONPATH.
-
-Subject to "Make variable" substitution. These import directories will be added
-for this rule and all rules that depend on it (note: not the rules this rule
-depends on. Each directory will be added to `PYTHONPATH` by `py_binary` rules
-that depend on this rule. The strings are repo-runfiles-root relative,
-
-Absolute paths (paths that start with `/`) and paths that references a path
-above the execution root are not allowed and will result in an error.
-""",
- ),
-}
diff --git a/python/private/common.bzl b/python/private/common.bzl
index 2dcc948..97fabce 100644
--- a/python/private/common.bzl
+++ b/python/private/common.bzl
@@ -17,24 +17,15 @@
load(":py_info.bzl", "PyInfo", "PyInfoBuilder")
load(":py_internal.bzl", "py_internal")
load(":reexports.bzl", "BuiltinPyInfo")
-load(
- ":semantics.bzl",
- "NATIVE_RULES_MIGRATION_FIX_CMD",
- "NATIVE_RULES_MIGRATION_HELP_URL",
-)
_testing = testing
_platform_common = platform_common
_coverage_common = coverage_common
-_py_builtins = py_internal
PackageSpecificationInfo = getattr(py_internal, "PackageSpecificationInfo", None)
# Extensions without the dot
_PYTHON_SOURCE_EXTENSIONS = ["py"]
-# NOTE: Must stay in sync with the value used in rules_python
-_MIGRATION_TAG = "__PYTHON_RULES_MIGRATION_DO_NOT_USE_WILL_BREAK__"
-
def create_binary_semantics_struct(
*,
create_executable,
@@ -272,15 +263,22 @@
return [f for f in srcs if f.extension == "py"]
def collect_imports(ctx, semantics):
- return depset(direct = semantics.get_imports(ctx), transitive = [
- dep[PyInfo].imports
- for dep in ctx.attr.deps
- if PyInfo in dep
- ] + [
- dep[BuiltinPyInfo].imports
- for dep in ctx.attr.deps
- if BuiltinPyInfo in dep
- ] if BuiltinPyInfo != None else [])
+ """Collect the direct and transitive `imports` strings.
+
+ Args:
+ ctx: {type}`ctx` the current target ctx
+ semantics: semantics object for fetching direct imports.
+
+ Returns:
+ {type}`depset[str]` of import paths
+ """
+ transitive = []
+ for dep in ctx.attr.deps:
+ if PyInfo in dep:
+ transitive.append(dep[PyInfo].imports)
+ if BuiltinPyInfo != None and BuiltinPyInfo in dep:
+ transitive.append(dep[BuiltinPyInfo].imports)
+ return depset(direct = semantics.get_imports(ctx), transitive = transitive)
def collect_runfiles(ctx, files = depset()):
"""Collects the necessary files from the rule's context.
@@ -477,65 +475,3 @@
if ctx.target_platform_has_constraint(constraint_value):
return True
return False
-
-def check_native_allowed(ctx):
- """Check if the usage of the native rule is allowed.
-
- Args:
- ctx: rule context to check
- """
- if not ctx.fragments.py.disallow_native_rules:
- return
-
- if _MIGRATION_TAG in ctx.attr.tags:
- return
-
- # NOTE: The main repo name is empty in *labels*, but not in
- # ctx.workspace_name
- is_main_repo = not bool(ctx.label.workspace_name)
- if is_main_repo:
- check_label = ctx.label
- else:
- # package_group doesn't allow @repo syntax, so we work around that
- # by prefixing external repos with a fake package path. This also
- # makes it easy to enable or disable all external repos.
- check_label = Label("@//__EXTERNAL_REPOS__/{workspace}/{package}".format(
- workspace = ctx.label.workspace_name,
- package = ctx.label.package,
- ))
- allowlist = ctx.attr._native_rules_allowlist
- if allowlist:
- allowed = ctx.attr._native_rules_allowlist[PackageSpecificationInfo].contains(check_label)
- allowlist_help = str(allowlist.label).replace("@//", "//")
- else:
- allowed = False
- allowlist_help = ("no allowlist specified; all disallowed; specify one " +
- "with --python_native_rules_allowlist")
- if not allowed:
- if ctx.attr.generator_function:
- generator = "{generator_function}(name={generator_name}) in {generator_location}".format(
- generator_function = ctx.attr.generator_function,
- generator_name = ctx.attr.generator_name,
- generator_location = ctx.attr.generator_location,
- )
- else:
- generator = "No generator (called directly in BUILD file)"
-
- msg = (
- "{target} not allowed to use native.{rule}\n" +
- "Generated by: {generator}\n" +
- "Allowlist: {allowlist}\n" +
- "Migrate to using @rules_python, see {help_url}\n" +
- "FIXCMD: {fix_cmd} --target={target} --rule={rule} " +
- "--generator_name={generator_name} --location={generator_location}"
- )
- fail(msg.format(
- target = str(ctx.label).replace("@//", "//"),
- rule = _py_builtins.get_rule_name(ctx),
- generator = generator,
- allowlist = allowlist_help,
- generator_name = ctx.attr.generator_name,
- generator_location = ctx.attr.generator_location,
- help_url = NATIVE_RULES_MIGRATION_HELP_URL,
- fix_cmd = NATIVE_RULES_MIGRATION_FIX_CMD,
- ))
diff --git a/python/private/common_bazel.bzl b/python/private/common_bazel.bzl
index 642cfd8..efbebd0 100644
--- a/python/private/common_bazel.bzl
+++ b/python/private/common_bazel.bzl
@@ -15,7 +15,8 @@
load("@bazel_skylib//lib:paths.bzl", "paths")
load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
-load("@rules_cc//cc:defs.bzl", "CcInfo", "cc_common")
+load("@rules_cc//cc/common:cc_common.bzl", "cc_common")
+load("@rules_cc//cc/common:cc_info.bzl", "CcInfo")
load(":attributes.bzl", "PrecompileAttr", "PrecompileInvalidationModeAttr", "PrecompileSourceRetentionAttr")
load(":common.bzl", "is_bool")
load(":flags.bzl", "PrecompileFlag")
@@ -165,10 +166,13 @@
stem = src.basename[:-(len(src.extension) + 1)]
if use_pycache:
- if not target_toolchain.pyc_tag:
- # This is most likely because of a "runtime toolchain", i.e. the
- # autodetecting toolchain, or some equivalent toolchain that can't
- # assume to know the runtime Python version at build time.
+ if not hasattr(target_toolchain, "pyc_tag") or not target_toolchain.pyc_tag:
+ # This is likely one of two situations:
+ # 1. The pyc_tag attribute is missing because it's the Bazel-builtin
+ # PyRuntimeInfo object.
+ # 2. It's a "runtime toolchain", i.e. the autodetecting toolchain,
+ # or some equivalent toolchain that can't assume to know the
+ # runtime Python version at build time.
# Instead of failing, just don't generate any pyc.
return None
pyc_path = "__pycache__/{stem}.{tag}.pyc".format(
diff --git a/python/private/coverage_deps.bzl b/python/private/coverage_deps.bzl
index d3a6d96..e80e8ee 100644
--- a/python/private/coverage_deps.bzl
+++ b/python/private/coverage_deps.bzl
@@ -80,11 +80,23 @@
"https://files.pythonhosted.org/packages/b9/67/e1413d5a8591622a46dd04ff80873b04c849268831ed5c304c16433e7e30/coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl",
"a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9",
),
+ "aarch64-apple-darwin-freethreaded": (
+ "https://files.pythonhosted.org/packages/c4/ae/b5d58dff26cade02ada6ca612a76447acd69dccdbb3a478e9e088eb3d4b9/coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl",
+ "502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962",
+ ),
"aarch64-unknown-linux-gnu": (
+ "https://files.pythonhosted.org/packages/14/5b/9dec847b305e44a5634d0fb8498d135ab1d88330482b74065fcec0622224/coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
+ "d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c",
+ ),
+ "aarch64-unknown-linux-gnu-freethreaded": (
"https://files.pythonhosted.org/packages/b8/d7/62095e355ec0613b08dfb19206ce3033a0eedb6f4a67af5ed267a8800642/coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb",
),
"x86_64-unknown-linux-gnu": (
+ "https://files.pythonhosted.org/packages/f7/95/d2fd31f1d638df806cae59d7daea5abf2b15b5234016a5ebb502c2f3f7ee/coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
+ "78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060",
+ ),
+ "x86_64-unknown-linux-gnu-freethreaded": (
"https://files.pythonhosted.org/packages/8b/61/a7a6a55dd266007ed3b1df7a3386a0d760d014542d72f7c2c6938483b7bd/coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b",
),
diff --git a/python/private/current_py_cc_headers.bzl b/python/private/current_py_cc_headers.bzl
index e72199e..217904c 100644
--- a/python/private/current_py_cc_headers.bzl
+++ b/python/private/current_py_cc_headers.bzl
@@ -14,7 +14,7 @@
"""Implementation of current_py_cc_headers rule."""
-load("@rules_cc//cc:defs.bzl", "CcInfo")
+load("@rules_cc//cc/common:cc_info.bzl", "CcInfo")
def _current_py_cc_headers_impl(ctx):
py_cc_toolchain = ctx.toolchains["//python/cc:toolchain_type"].py_cc_toolchain
diff --git a/python/private/current_py_cc_libs.bzl b/python/private/current_py_cc_libs.bzl
index d66c401..ca68346 100644
--- a/python/private/current_py_cc_libs.bzl
+++ b/python/private/current_py_cc_libs.bzl
@@ -14,7 +14,7 @@
"""Implementation of current_py_cc_libs rule."""
-load("@rules_cc//cc:defs.bzl", "CcInfo")
+load("@rules_cc//cc/common:cc_info.bzl", "CcInfo")
def _current_py_cc_libs_impl(ctx):
py_cc_toolchain = ctx.toolchains["//python/cc:toolchain_type"].py_cc_toolchain
diff --git a/python/private/flags.bzl b/python/private/flags.bzl
index c190cf6..9070f11 100644
--- a/python/private/flags.bzl
+++ b/python/private/flags.bzl
@@ -122,3 +122,24 @@
OMIT_SOURCE = "omit_source",
get_effective_value = _precompile_source_retention_flag_get_effective_value,
)
+
+# Used for matching freethreaded toolchains and would have to be used in wheels
+# as well.
+# buildifier: disable=name-conventions
+FreeThreadedFlag = enum(
+ # Use freethreaded python toolchain and wheels.
+ YES = "yes",
+ # Do not use freethreaded python toolchain and wheels.
+ NO = "no",
+)
+
+# Determines which libc flavor is preferred when selecting the toolchain and
+# linux whl distributions.
+#
+# buildifier: disable=name-conventions
+LibcFlag = FlagEnum(
+ # Prefer glibc wheels (e.g. manylinux_2_17_x86_64 or linux_x86_64)
+ GLIBC = "glibc",
+ # Prefer musl wheels (e.g. musllinux_2_17_x86_64)
+ MUSL = "musl",
+)
diff --git a/python/private/glob_excludes.bzl b/python/private/glob_excludes.bzl
new file mode 100644
index 0000000..c98afe0
--- /dev/null
+++ b/python/private/glob_excludes.bzl
@@ -0,0 +1,32 @@
+# Copyright 2024 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"Utilities for glob exclusions."
+
+load(":util.bzl", "IS_BAZEL_7_4_OR_HIGHER")
+
+def _version_dependent_exclusions():
+ """Returns glob exclusions that are sensitive to Bazel version.
+
+ Returns:
+ a list of glob exclusion patterns
+ """
+ if IS_BAZEL_7_4_OR_HIGHER:
+ return []
+ else:
+ return ["**/* *"]
+
+glob_excludes = struct(
+ version_dependent_exclusions = _version_dependent_exclusions,
+)
diff --git a/python/private/hermetic_runtime_repo_setup.bzl b/python/private/hermetic_runtime_repo_setup.bzl
index 4b5a3c6..64d721e 100644
--- a/python/private/hermetic_runtime_repo_setup.bzl
+++ b/python/private/hermetic_runtime_repo_setup.bzl
@@ -13,13 +13,17 @@
# limitations under the License.
"""Setup a python-build-standalone based toolchain."""
-load("@rules_cc//cc:defs.bzl", "cc_import", "cc_library")
+load("@rules_cc//cc:cc_import.bzl", "cc_import")
+load("@rules_cc//cc:cc_library.bzl", "cc_library")
load("//python:py_runtime.bzl", "py_runtime")
load("//python:py_runtime_pair.bzl", "py_runtime_pair")
load("//python/cc:py_cc_toolchain.bzl", "py_cc_toolchain")
+load(":glob_excludes.bzl", "glob_excludes")
load(":py_exec_tools_toolchain.bzl", "py_exec_tools_toolchain")
load(":semver.bzl", "semver")
+_IS_FREETHREADED = Label("//python/config_settings:is_py_freethreaded")
+
def define_hermetic_runtime_toolchain_impl(
*,
name,
@@ -44,7 +48,7 @@
python_version: {type}`str` The Python version, in `major.minor.micro`
format.
python_bin: {type}`str` The path to the Python binary within the
- repositoroy.
+ repository.
coverage_tool: {type}`str` optional target to the coverage tool to
use.
"""
@@ -64,22 +68,33 @@
# Platform-agnostic filegroup can't match on all patterns.
allow_empty = True,
exclude = [
- "**/* *", # Bazel does not support spaces in file names.
# Unused shared libraries. `python` executable and the `:libpython` target
# depend on `libpython{python_version}.so.1.0`.
- "lib/libpython{major}.{minor}.so".format(**version_dict),
+ "lib/libpython{major}.{minor}*.so".format(**version_dict),
# static libraries
"lib/**/*.a",
# tests for the standard libraries.
- "lib/python{major}.{minor}/**/test/**".format(**version_dict),
- "lib/python{major}.{minor}/**/tests/**".format(**version_dict),
- "**/__pycache__/*.pyc.*", # During pyc creation, temp files named *.pyc.NNN are created
- ] + extra_files_glob_exclude,
+ "lib/python{major}.{minor}*/**/test/**".format(**version_dict),
+ "lib/python{major}.{minor}*/**/tests/**".format(**version_dict),
+ # During pyc creation, temp files named *.pyc.NNN are created
+ "**/__pycache__/*.pyc.*",
+ ] + glob_excludes.version_dependent_exclusions() + extra_files_glob_exclude,
),
)
cc_import(
name = "interface",
- interface_library = "libs/python{major}{minor}.lib".format(**version_dict),
+ interface_library = select({
+ _IS_FREETHREADED: "libs/python{major}{minor}t.lib".format(**version_dict),
+ "//conditions:default": "libs/python{major}{minor}.lib".format(**version_dict),
+ }),
+ system_provided = True,
+ )
+ cc_import(
+ name = "abi3_interface",
+ interface_library = select({
+ _IS_FREETHREADED: "libs/python3t.lib",
+ "//conditions:default": "libs/python3.lib",
+ }),
system_provided = True,
)
@@ -90,26 +105,81 @@
cc_library(
name = "python_headers",
deps = select({
- "@bazel_tools//src/conditions:windows": [":interface"],
+ "@bazel_tools//src/conditions:windows": [":interface", ":abi3_interface"],
"//conditions:default": None,
}),
hdrs = [":includes"],
includes = [
"include",
- "include/python{major}.{minor}".format(**version_dict),
- "include/python{major}.{minor}m".format(**version_dict),
- ],
+ ] + select({
+ _IS_FREETHREADED: [
+ "include/python{major}.{minor}t".format(**version_dict),
+ ],
+ "//conditions:default": [
+ "include/python{major}.{minor}".format(**version_dict),
+ "include/python{major}.{minor}m".format(**version_dict),
+ ],
+ }),
)
+ native.config_setting(
+ name = "is_freethreaded_linux",
+ flag_values = {
+ Label("//python/config_settings:py_freethreaded"): "yes",
+ },
+ constraint_values = [
+ "@platforms//os:linux",
+ ],
+ visibility = ["//visibility:private"],
+ )
+ native.config_setting(
+ name = "is_freethreaded_osx",
+ flag_values = {
+ Label("//python/config_settings:py_freethreaded"): "yes",
+ },
+ constraint_values = [
+ "@platforms//os:osx",
+ ],
+ visibility = ["//visibility:private"],
+ )
+ native.config_setting(
+ name = "is_freethreaded_windows",
+ flag_values = {
+ Label("//python/config_settings:py_freethreaded"): "yes",
+ },
+ constraint_values = [
+ "@platforms//os:windows",
+ ],
+ visibility = ["//visibility:private"],
+ )
+
cc_library(
name = "libpython",
hdrs = [":includes"],
srcs = select({
+ ":is_freethreaded_linux": [
+ "lib/libpython{major}.{minor}t.so".format(**version_dict),
+ "lib/libpython{major}.{minor}t.so.1.0".format(**version_dict),
+ ],
+ ":is_freethreaded_osx": [
+ "lib/libpython{major}.{minor}t.dylib".format(**version_dict),
+ ],
+ ":is_freethreaded_windows": [
+ "python3t.dll",
+ "python{major}{minor}t.dll".format(**version_dict),
+ "libs/python{major}{minor}t.lib".format(**version_dict),
+ "libs/python3t.lib",
+ ],
"@platforms//os:linux": [
"lib/libpython{major}.{minor}.so".format(**version_dict),
"lib/libpython{major}.{minor}.so.1.0".format(**version_dict),
],
"@platforms//os:macos": ["lib/libpython{major}.{minor}.dylib".format(**version_dict)],
- "@platforms//os:windows": ["python3.dll", "libs/python{major}{minor}.lib".format(**version_dict)],
+ "@platforms//os:windows": [
+ "python3.dll",
+ "python{major}{minor}.dll".format(**version_dict),
+ "libs/python{major}{minor}.lib".format(**version_dict),
+ "libs/python3.lib",
+ ],
}),
)
@@ -132,12 +202,18 @@
"micro": str(version_info.patch),
"minor": str(version_info.minor),
},
- # Convert empty string to None
- coverage_tool = coverage_tool or None,
+ coverage_tool = select({
+ # Convert empty string to None
+ ":coverage_enabled": coverage_tool or None,
+ "//conditions:default": None,
+ }),
python_version = "PY3",
implementation_name = "cpython",
# See https://peps.python.org/pep-3147/ for pyc tag infix format
- pyc_tag = "cpython-{major}{minor}".format(**version_dict),
+ pyc_tag = select({
+ _IS_FREETHREADED: "cpython-{major}{minor}t".format(**version_dict),
+ "//conditions:default": "cpython-{major}{minor}".format(**version_dict),
+ }),
)
py_runtime_pair(
diff --git a/python/private/internal_config_repo.bzl b/python/private/internal_config_repo.bzl
index e2fa8f6..7b6869e 100644
--- a/python/private/internal_config_repo.bzl
+++ b/python/private/internal_config_repo.bzl
@@ -68,7 +68,7 @@
else:
enable_pystar = False
- if native.bazel_version.startswith("8."):
+ if not native.bazel_version or int(native.bazel_version.split(".")[0]) >= 8:
builtin_py_info_symbol = "None"
builtin_py_runtime_info_symbol = "None"
builtin_py_cc_link_params_provider = "None"
diff --git a/python/private/internal_dev_deps.bzl b/python/private/internal_dev_deps.bzl
new file mode 100644
index 0000000..2a3b84e
--- /dev/null
+++ b/python/private/internal_dev_deps.bzl
@@ -0,0 +1,44 @@
+# Copyright 2024 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Module extension for internal dev_dependency=True setup."""
+
+load("@bazel_ci_rules//:rbe_repo.bzl", "rbe_preconfig")
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file")
+
+def _internal_dev_deps_impl(mctx):
+ _ = mctx # @unused
+
+ # This wheel is purely here to validate the wheel extraction code. It's not
+ # intended for anything else.
+ http_file(
+ name = "wheel_for_testing",
+ downloaded_file_path = "numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
+ sha256 = "0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2",
+ urls = [
+ "https://files.pythonhosted.org/packages/50/67/3e966d99a07d60a21a21d7ec016e9e4c2642a86fea251ec68677daf71d4d/numpy-1.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
+ ],
+ )
+
+ # Creates a default toolchain config for RBE.
+ # Use this as is if you are using the rbe_ubuntu16_04 container,
+ # otherwise refer to RBE docs.
+ rbe_preconfig(
+ name = "buildkite_config",
+ toolchain = "ubuntu1804-bazel-java11",
+ )
+
+internal_dev_deps = module_extension(
+ implementation = _internal_dev_deps_impl,
+ doc = "This extension creates internal rules_python dev dependencies.",
+)
diff --git a/python/private/local_runtime_repo_setup.bzl b/python/private/local_runtime_repo_setup.bzl
index 23fa99d..37eab59 100644
--- a/python/private/local_runtime_repo_setup.bzl
+++ b/python/private/local_runtime_repo_setup.bzl
@@ -15,7 +15,7 @@
"""Setup code called by the code generated by `local_runtime_repo`."""
load("@bazel_skylib//lib:selects.bzl", "selects")
-load("@rules_cc//cc:defs.bzl", "cc_library")
+load("@rules_cc//cc:cc_library.bzl", "cc_library")
load("@rules_python//python:py_runtime.bzl", "py_runtime")
load("@rules_python//python:py_runtime_pair.bzl", "py_runtime_pair")
load("@rules_python//python/cc:py_cc_toolchain.bzl", "py_cc_toolchain")
@@ -61,7 +61,11 @@
cc_library(
name = "_python_headers",
# NOTE: Keep in sync with watch_tree() called in local_runtime_repo
- srcs = native.glob(["include/**/*.h"]),
+ srcs = native.glob(
+ ["include/**/*.h"],
+ # A Python install may not have C headers
+ allow_empty = True,
+ ),
includes = ["include"],
)
@@ -69,10 +73,14 @@
name = "_libpython",
# Don't use a recursive glob because the lib/ directory usually contains
# a subdirectory of the stdlib -- lots of unrelated files
- srcs = native.glob([
- "lib/*{}".format(lib_ext), # Match libpython*.so
- "lib/*{}*".format(lib_ext), # Also match libpython*.so.1.0
- ]),
+ srcs = native.glob(
+ [
+ "lib/*{}".format(lib_ext), # Match libpython*.so
+ "lib/*{}*".format(lib_ext), # Also match libpython*.so.1.0
+ ],
+ # A Python install may not have shared libraries.
+ allow_empty = True,
+ ),
hdrs = [":_python_headers"],
)
diff --git a/python/private/py_binary_macro_bazel.bzl b/python/private/py_binary_macro.bzl
similarity index 92%
rename from python/private/py_binary_macro_bazel.bzl
rename to python/private/py_binary_macro.bzl
index a6c4e97..83b3c18 100644
--- a/python/private/py_binary_macro_bazel.bzl
+++ b/python/private/py_binary_macro.bzl
@@ -14,7 +14,7 @@
"""Implementation of macro-half of py_binary rule."""
load(":common_bazel.bzl", "convert_legacy_create_init_to_int")
-load(":py_binary_rule_bazel.bzl", py_binary_rule = "py_binary")
+load(":py_binary_rule.bzl", py_binary_rule = "py_binary")
def py_binary(**kwargs):
convert_legacy_create_init_to_int(kwargs)
diff --git a/python/private/py_binary_rule_bazel.bzl b/python/private/py_binary_rule.bzl
similarity index 100%
rename from python/private/py_binary_rule_bazel.bzl
rename to python/private/py_binary_rule.bzl
diff --git a/python/private/py_cc_link_params_info.bzl b/python/private/py_cc_link_params_info.bzl
index e5f4534..35919a0 100644
--- a/python/private/py_cc_link_params_info.bzl
+++ b/python/private/py_cc_link_params_info.bzl
@@ -13,293 +13,9 @@
# limitations under the License.
"""Providers for Python rules."""
-load("@rules_cc//cc:defs.bzl", "CcInfo")
+load("@rules_cc//cc/common:cc_info.bzl", "CcInfo")
load(":util.bzl", "define_bazel_6_provider")
-DEFAULT_STUB_SHEBANG = "#!/usr/bin/env python3"
-
-DEFAULT_BOOTSTRAP_TEMPLATE = Label("//python/private:bootstrap_template")
-
-_PYTHON_VERSION_VALUES = ["PY2", "PY3"]
-
-def _optional_int(value):
- return int(value) if value != None else None
-
-def interpreter_version_info_struct_from_dict(info_dict):
- """Create a struct of interpreter version info from a dict from an attribute.
-
- Args:
- info_dict: (dict | None) of version info fields. See interpreter_version_info
- provider field docs.
-
- Returns:
- struct of version info; see interpreter_version_info provider field docs.
- """
- info_dict = dict(info_dict or {}) # Copy in case the original is frozen
- if info_dict:
- if not ("major" in info_dict and "minor" in info_dict):
- fail("interpreter_version_info must have at least two keys, 'major' and 'minor'")
- version_info_struct = struct(
- major = _optional_int(info_dict.pop("major", None)),
- minor = _optional_int(info_dict.pop("minor", None)),
- micro = _optional_int(info_dict.pop("micro", None)),
- releaselevel = str(info_dict.pop("releaselevel")) if "releaselevel" in info_dict else None,
- serial = _optional_int(info_dict.pop("serial", None)),
- )
-
- if len(info_dict.keys()) > 0:
- fail("unexpected keys {} in interpreter_version_info".format(
- str(info_dict.keys()),
- ))
-
- return version_info_struct
-
-def _PyRuntimeInfo_init(
- *,
- implementation_name = None,
- interpreter_path = None,
- interpreter = None,
- files = None,
- coverage_tool = None,
- coverage_files = None,
- pyc_tag = None,
- python_version,
- stub_shebang = None,
- bootstrap_template = None,
- interpreter_version_info = None,
- stage2_bootstrap_template = None,
- zip_main_template = None):
- if (interpreter_path and interpreter) or (not interpreter_path and not interpreter):
- fail("exactly one of interpreter or interpreter_path must be specified")
-
- if interpreter_path and files != None:
- fail("cannot specify 'files' if 'interpreter_path' is given")
-
- if (coverage_tool and not coverage_files) or (not coverage_tool and coverage_files):
- fail(
- "coverage_tool and coverage_files must both be set or neither must be set, " +
- "got coverage_tool={}, coverage_files={}".format(
- coverage_tool,
- coverage_files,
- ),
- )
-
- if python_version not in _PYTHON_VERSION_VALUES:
- fail("invalid python_version: '{}'; must be one of {}".format(
- python_version,
- _PYTHON_VERSION_VALUES,
- ))
-
- if files != None and type(files) != type(depset()):
- fail("invalid files: got value of type {}, want depset".format(type(files)))
-
- if interpreter:
- if files == None:
- files = depset()
- else:
- files = None
-
- if coverage_files == None:
- coverage_files = depset()
-
- if not stub_shebang:
- stub_shebang = DEFAULT_STUB_SHEBANG
-
- return {
- "bootstrap_template": bootstrap_template,
- "coverage_files": coverage_files,
- "coverage_tool": coverage_tool,
- "files": files,
- "implementation_name": implementation_name,
- "interpreter": interpreter,
- "interpreter_path": interpreter_path,
- "interpreter_version_info": interpreter_version_info_struct_from_dict(interpreter_version_info),
- "pyc_tag": pyc_tag,
- "python_version": python_version,
- "stage2_bootstrap_template": stage2_bootstrap_template,
- "stub_shebang": stub_shebang,
- "zip_main_template": zip_main_template,
- }
-
-PyRuntimeInfo, _unused_raw_py_runtime_info_ctor = define_bazel_6_provider(
- doc = """Contains information about a Python runtime, as returned by the `py_runtime`
-rule.
-
-A Python runtime describes either a *platform runtime* or an *in-build runtime*.
-A platform runtime accesses a system-installed interpreter at a known path,
-whereas an in-build runtime points to a `File` that acts as the interpreter. In
-both cases, an "interpreter" is really any executable binary or wrapper script
-that is capable of running a Python script passed on the command line, following
-the same conventions as the standard CPython interpreter.
-""",
- init = _PyRuntimeInfo_init,
- fields = {
- "bootstrap_template": """
-:type: File
-
-A template of code responsible for the initial startup of a program.
-
-This code is responsible for:
-
-* Locating the target interpreter. Typically it is in runfiles, but not always.
-* Setting necessary environment variables, command line flags, or other
- configuration that can't be modified after the interpreter starts.
-* Invoking the appropriate entry point. This is usually a second-stage bootstrap
- that performs additional setup prior to running a program's actual entry point.
-
-The {obj}`--bootstrap_impl` flag affects how this stage 1 bootstrap
-is expected to behave and the substutitions performed.
-
-* `--bootstrap_impl=system_python` substitutions: `%is_zipfile%`, `%python_binary%`,
- `%target%`, `%workspace_name`, `%coverage_tool%`, `%import_all%`, `%imports%`,
- `%main%`, `%shebang%`
-* `--bootstrap_impl=script` substititions: `%is_zipfile%`, `%python_binary%`,
- `%target%`, `%workspace_name`, `%shebang%, `%stage2_bootstrap%`
-
-Substitution definitions:
-
-* `%shebang%`: The shebang to use with the bootstrap; the bootstrap template
- may choose to ignore this.
-* `%stage2_bootstrap%`: A runfiles-relative path to the stage 2 bootstrap.
-* `%python_binary%`: The path to the target Python interpreter. There are three
- types of paths:
- * An absolute path to a system interpreter (e.g. begins with `/`).
- * A runfiles-relative path to an interpreter (e.g. `somerepo/bin/python3`)
- * A program to search for on PATH, i.e. a word without spaces, e.g. `python3`.
-* `%workspace_name%`: The name of the workspace the target belongs to.
-* `%is_zipfile%`: The string `1` if this template is prepended to a zipfile to
- create a self-executable zip file. The string `0` otherwise.
-
-For the other substitution definitions, see the {obj}`stage2_bootstrap_template`
-docs.
-
-:::{versionchanged} 0.33.0
-The set of substitutions depends on {obj}`--bootstrap_impl`
-:::
-""",
- "coverage_files": """
-:type: depset[File] | None
-
-The files required at runtime for using `coverage_tool`. Will be `None` if no
-`coverage_tool` was provided.
-""",
- "coverage_tool": """
-:type: File | None
-
-If set, this field is a `File` representing tool used for collecting code
-coverage information from python tests. Otherwise, this is `None`.
-""",
- "files": """
-:type: depset[File] | None
-
-If this is an in-build runtime, this field is a `depset` of `File`s that need to
-be added to the runfiles of an executable target that uses this runtime (in
-particular, files needed by `interpreter`). The value of `interpreter` need not
-be included in this field. If this is a platform runtime then this field is
-`None`.
-""",
- "implementation_name": """
-:type: str | None
-
-The Python implementation name (`sys.implementation.name`)
-""",
- "interpreter": """
-:type: File | None
-
-If this is an in-build runtime, this field is a `File` representing the
-interpreter. Otherwise, this is `None`. Note that an in-build runtime can use
-either a prebuilt, checked-in interpreter or an interpreter built from source.
-""",
- "interpreter_path": """
-:type: str | None
-
-If this is a platform runtime, this field is the absolute filesystem path to the
-interpreter on the target platform. Otherwise, this is `None`.
-""",
- "interpreter_version_info": """
-:type: struct
-
-Version information about the interpreter this runtime provides.
-It should match the format given by `sys.version_info`, however
-for simplicity, the micro, releaselevel, and serial values are
-optional.
-A struct with the following fields:
-* `major`: {type}`int`, the major version number
-* `minor`: {type}`int`, the minor version number
-* `micro`: {type}`int | None`, the micro version number
-* `releaselevel`: {type}`str | None`, the release level
-* `serial`: {type}`int | None`, the serial number of the release
-""",
- "pyc_tag": """
-:type: str | None
-
-The tag portion of a pyc filename, e.g. the `cpython-39` infix
-of `foo.cpython-39.pyc`. See PEP 3147. If not specified, it will be computed
-from {obj}`implementation_name` and {obj}`interpreter_version_info`. If no
-pyc_tag is available, then only source-less pyc generation will function
-correctly.
-""",
- "python_version": """
-:type: str
-
-Indicates whether this runtime uses Python major version 2 or 3. Valid values
-are (only) `"PY2"` and `"PY3"`.
-""",
- "stage2_bootstrap_template": """
-:type: File
-
-A template of Python code that runs under the desired interpreter and is
-responsible for orchestrating calling the program's actual main code. This
-bootstrap is responsible for affecting the current runtime's state, such as
-import paths or enabling coverage, so that, when it runs the program's actual
-main code, it works properly under Bazel.
-
-The following substitutions are made during template expansion:
-* `%main%`: A runfiles-relative path to the program's actual main file. This
- can be a `.py` or `.pyc` file, depending on precompile settings.
-* `%coverage_tool%`: Runfiles-relative path to the coverage library's entry point.
- If coverage is not enabled or available, an empty string.
-* `%import_all%`: The string `True` if all repositories in the runfiles should
- be added to sys.path. The string `False` otherwise.
-* `%imports%`: A colon-delimited string of runfiles-relative paths to add to
- sys.path.
-* `%target%`: The name of the target this is for.
-* `%workspace_name%`: The name of the workspace the target belongs to.
-
-:::{versionadded} 0.33.0
-:::
-""",
- "stub_shebang": """
-:type: str
-
-"Shebang" expression prepended to the bootstrapping Python stub
-script used when executing {obj}`py_binary` targets. Does not
-apply to Windows.
-""",
- "zip_main_template": """
-:type: File
-
-A template of Python code that becomes a zip file's top-level `__main__.py`
-file. The top-level `__main__.py` file is used when the zip file is explicitly
-passed to a Python interpreter. See PEP 441 for more information about zipapp
-support. Note that py_binary-generated zip files are self-executing and
-skip calling `__main__.py`.
-
-The following substitutions are made during template expansion:
-* `%stage2_bootstrap%`: A runfiles-relative string to the stage 2 bootstrap file.
-* `%python_binary%`: The path to the target Python interpreter. There are three
- types of paths:
- * An absolute path to a system interpreter (e.g. begins with `/`).
- * A runfiles-relative path to an interpreter (e.g. `somerepo/bin/python3`)
- * A program to search for on PATH, i.e. a word without spaces, e.g. `python3`.
-* `%workspace_name%`: The name of the workspace for the built target.
-
-:::{versionadded} 0.33.0
-:::
-""",
- },
-)
-
def _PyCcLinkParamsInfo_init(cc_info):
return {
"cc_info": CcInfo(linking_context = cc_info.linking_context),
diff --git a/python/private/py_cc_toolchain_rule.bzl b/python/private/py_cc_toolchain_rule.bzl
index 279f86c..d5f3b68 100644
--- a/python/private/py_cc_toolchain_rule.bzl
+++ b/python/private/py_cc_toolchain_rule.bzl
@@ -19,7 +19,7 @@
"""
load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
-load("@rules_cc//cc:defs.bzl", "CcInfo")
+load("@rules_cc//cc/common:cc_info.bzl", "CcInfo")
load(":py_cc_toolchain_info.bzl", "PyCcToolchainInfo")
def _py_cc_toolchain_impl(ctx):
diff --git a/python/private/py_executable.bzl b/python/private/py_executable.bzl
index ce1288c..8c0487d 100644
--- a/python/private/py_executable.bzl
+++ b/python/private/py_executable.bzl
@@ -16,7 +16,7 @@
load("@bazel_skylib//lib:dicts.bzl", "dicts")
load("@bazel_skylib//lib:structs.bzl", "structs")
load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
-load("@rules_cc//cc:defs.bzl", "cc_common")
+load("@rules_cc//cc/common:cc_common.bzl", "cc_common")
load(
":attributes.bzl",
"AGNOSTIC_EXECUTABLE_ATTRS",
@@ -33,7 +33,6 @@
load(":cc_helper.bzl", "cc_helper")
load(
":common.bzl",
- "check_native_allowed",
"collect_imports",
"collect_runfiles",
"create_instrumented_files_info",
@@ -269,7 +268,6 @@
def _validate_executable(ctx):
if ctx.attr.python_version != "PY3":
fail("It is not allowed to use Python 2")
- check_native_allowed(ctx)
def _declare_executable_file(ctx):
if target_platform_has_any_constraint(ctx, ctx.attr._windows_constraints):
@@ -456,7 +454,7 @@
common_runfiles.files.add(implicit_pyc_source_files)
for dep in (ctx.attr.deps + extra_deps):
- if not (PyInfo in dep or BuiltinPyInfo in dep):
+ if not (PyInfo in dep or (BuiltinPyInfo != None and BuiltinPyInfo in dep)):
continue
info = dep[PyInfo] if PyInfo in dep else dep[BuiltinPyInfo]
common_runfiles.files.add(info.transitive_sources)
@@ -473,7 +471,7 @@
common_runfiles.runfiles.append(collect_runfiles(ctx))
if extra_deps:
- common_runfiles.add_runfiles(targets = extra_deps)
+ common_runfiles.add_targets(extra_deps)
common_runfiles.add(extra_common_runfiles)
common_runfiles = common_runfiles.build(ctx)
diff --git a/python/private/py_executable_bazel.bzl b/python/private/py_executable_bazel.bzl
index 53206bd..3778c19 100644
--- a/python/private/py_executable_bazel.bzl
+++ b/python/private/py_executable_bazel.bzl
@@ -15,7 +15,7 @@
load("@bazel_skylib//lib:dicts.bzl", "dicts")
load("@bazel_skylib//lib:paths.bzl", "paths")
-load(":attributes_bazel.bzl", "IMPORTS_ATTRS")
+load(":attributes.bzl", "IMPORTS_ATTRS")
load(
":common.bzl",
"create_binary_semantics_struct",
@@ -81,6 +81,9 @@
"_py_toolchain_type": attr.label(
default = TARGET_TOOLCHAIN_TYPE,
),
+ "_python_version_flag": attr.label(
+ default = "//python/config_settings:python_version",
+ ),
"_windows_launcher_maker": attr.label(
default = "@bazel_tools//tools/launcher:launcher_maker",
cfg = "exec",
@@ -177,6 +180,8 @@
else:
base_executable_name = executable.basename
+ venv = None
+
# The check for stage2_bootstrap_template is to support legacy
# BuiltinPyRuntimeInfo providers, which is likely to come from
# @bazel_tools//tools/python:autodetecting_toolchain, the toolchain used
@@ -184,6 +189,13 @@
if (BootstrapImplFlag.get_value(ctx) == BootstrapImplFlag.SCRIPT and
runtime_details.effective_runtime and
hasattr(runtime_details.effective_runtime, "stage2_bootstrap_template")):
+ venv = _create_venv(
+ ctx,
+ output_prefix = base_executable_name,
+ imports = imports,
+ runtime_details = runtime_details,
+ )
+
stage2_bootstrap = _create_stage2_bootstrap(
ctx,
output_prefix = base_executable_name,
@@ -192,11 +204,12 @@
imports = imports,
runtime_details = runtime_details,
)
- extra_runfiles = ctx.runfiles([stage2_bootstrap])
+ extra_runfiles = ctx.runfiles([stage2_bootstrap] + venv.files_without_interpreter)
zip_main = _create_zip_main(
ctx,
stage2_bootstrap = stage2_bootstrap,
runtime_details = runtime_details,
+ venv = venv,
)
else:
stage2_bootstrap = None
@@ -272,6 +285,7 @@
zip_file = zip_file,
stage2_bootstrap = stage2_bootstrap,
runtime_details = runtime_details,
+ venv = venv,
)
elif bootstrap_output:
_create_stage1_bootstrap(
@@ -282,6 +296,7 @@
is_for_zip = False,
imports = imports,
main_py = main_py,
+ venv = venv,
)
else:
# Otherwise, this should be the Windows case of launcher + zip.
@@ -296,13 +311,20 @@
build_zip_enabled = build_zip_enabled,
))
+ # The interpreter is added this late in the process so that it isn't
+ # added to the zipped files.
+ if venv:
+ extra_runfiles = extra_runfiles.merge(ctx.runfiles([venv.interpreter]))
return create_executable_result_struct(
extra_files_to_build = depset(extra_files_to_build),
output_groups = {"python_zip_file": depset([zip_file])},
extra_runfiles = extra_runfiles,
)
-def _create_zip_main(ctx, *, stage2_bootstrap, runtime_details):
+def _create_zip_main(ctx, *, stage2_bootstrap, runtime_details, venv):
+ python_binary = _runfiles_root_path(ctx, venv.interpreter.short_path)
+ python_binary_actual = venv.interpreter_actual_path
+
# The location of this file doesn't really matter. It's added to
# the zip file as the top-level __main__.py file and not included
# elsewhere.
@@ -311,7 +333,8 @@
template = runtime_details.effective_runtime.zip_main_template,
output = output,
substitutions = {
- "%python_binary%": runtime_details.executable_interpreter_path,
+ "%python_binary%": python_binary,
+ "%python_binary_actual%": python_binary_actual,
"%stage2_bootstrap%": "{}/{}".format(
ctx.workspace_name,
stage2_bootstrap.short_path,
@@ -321,6 +344,119 @@
)
return output
+def relative_path(from_, to):
+ """Compute a relative path from one path to another.
+
+ Args:
+ from_: {type}`str` the starting directory. Note that it should be
+ a directory because relative-symlinks are relative to the
+ directory the symlink resides in.
+ to: {type}`str` the path that `from_` wants to point to
+
+ Returns:
+ {type}`str` a relative path
+ """
+ from_parts = from_.split("/")
+ to_parts = to.split("/")
+
+ # Strip common leading parts from both paths
+ n = min(len(from_parts), len(to_parts))
+ for _ in range(n):
+ if from_parts[0] == to_parts[0]:
+ from_parts.pop(0)
+ to_parts.pop(0)
+ else:
+ break
+
+ # Impossible to compute a relative path without knowing what ".." is
+ if from_parts and from_parts[0] == "..":
+ fail("cannot compute relative path from '%s' to '%s'", from_, to)
+
+ parts = ([".."] * len(from_parts)) + to_parts
+ return paths.join(*parts)
+
+# Create a venv the executable can use.
+# For venv details and the venv startup process, see:
+# * https://docs.python.org/3/library/venv.html
+# * https://snarky.ca/how-virtual-environments-work/
+# * https://github.com/python/cpython/blob/main/Modules/getpath.py
+# * https://github.com/python/cpython/blob/main/Lib/site.py
+def _create_venv(ctx, output_prefix, imports, runtime_details):
+ venv = "_{}.venv".format(output_prefix.lstrip("_"))
+
+ # The pyvenv.cfg file must be present to trigger the venv site hooks.
+ # Because it's paths are expected to be absolute paths, we can't reliably
+ # put much in it. See https://github.com/python/cpython/issues/83650
+ pyvenv_cfg = ctx.actions.declare_file("{}/pyvenv.cfg".format(venv))
+ ctx.actions.write(pyvenv_cfg, "")
+
+ runtime = runtime_details.effective_runtime
+ if runtime.interpreter:
+ py_exe_basename = paths.basename(runtime.interpreter.short_path)
+
+ # Even though ctx.actions.symlink() is used, using
+ # declare_symlink() is required to ensure that the resulting file
+ # in runfiles is always a symlink. An RBE implementation, for example,
+ # may choose to write what symlink() points to instead.
+ interpreter = ctx.actions.declare_symlink("{}/bin/{}".format(venv, py_exe_basename))
+
+ interpreter_actual_path = _runfiles_root_path(ctx, runtime.interpreter.short_path)
+ rel_path = relative_path(
+ # dirname is necessary because a relative symlink is relative to
+ # the directory the symlink resides within.
+ from_ = paths.dirname(_runfiles_root_path(ctx, interpreter.short_path)),
+ to = interpreter_actual_path,
+ )
+
+ ctx.actions.symlink(output = interpreter, target_path = rel_path)
+ else:
+ py_exe_basename = paths.basename(runtime.interpreter_path)
+ interpreter = ctx.actions.declare_symlink("{}/bin/{}".format(venv, py_exe_basename))
+ ctx.actions.symlink(output = interpreter, target_path = runtime.interpreter_path)
+ interpreter_actual_path = runtime.interpreter_path
+
+ if runtime.interpreter_version_info:
+ version = "{}.{}".format(
+ runtime.interpreter_version_info.major,
+ runtime.interpreter_version_info.minor,
+ )
+ else:
+ version_flag = ctx.attr._python_version_flag[config_common.FeatureFlagInfo].value
+ version_flag_parts = version_flag.split(".")[0:2]
+ version = "{}.{}".format(*version_flag_parts)
+
+ # See site.py logic: free-threaded builds append "t" to the venv lib dir name
+ if "t" in runtime.abi_flags:
+ version += "t"
+
+ site_packages = "{}/lib/python{}/site-packages".format(venv, version)
+ pth = ctx.actions.declare_file("{}/bazel.pth".format(site_packages))
+ ctx.actions.write(pth, "import _bazel_site_init\n")
+
+ site_init = ctx.actions.declare_file("{}/_bazel_site_init.py".format(site_packages))
+ computed_subs = ctx.actions.template_dict()
+ computed_subs.add_joined("%imports%", imports, join_with = ":", map_each = _map_each_identity)
+ ctx.actions.expand_template(
+ template = runtime.site_init_template,
+ output = site_init,
+ substitutions = {
+ "%import_all%": "True" if ctx.fragments.bazel_py.python_import_all_repositories else "False",
+ "%site_init_runfiles_path%": "{}/{}".format(ctx.workspace_name, site_init.short_path),
+ "%workspace_name%": ctx.workspace_name,
+ },
+ computed_substitutions = computed_subs,
+ )
+
+ return struct(
+ interpreter = interpreter,
+ # Runfiles root relative path or absolute path
+ interpreter_actual_path = interpreter_actual_path,
+ files_without_interpreter = [pyvenv_cfg, pth, site_init],
+ )
+
+def _map_each_identity(v):
+ return v
+
def _create_stage2_bootstrap(
ctx,
*,
@@ -363,6 +499,23 @@
)
return output
+def _runfiles_root_path(ctx, short_path):
+ """Compute a runfiles-root relative path from `File.short_path`
+
+ Args:
+ ctx: current target ctx
+ short_path: str, a main-repo relative path from `File.short_path`
+
+ Returns:
+ {type}`str`, a runflies-root relative path
+ """
+
+ # The ../ comes from short_path is for files in other repos.
+ if short_path.startswith("../"):
+ return short_path[3:]
+ else:
+ return "{}/{}".format(ctx.workspace_name, short_path)
+
def _create_stage1_bootstrap(
ctx,
*,
@@ -371,12 +524,24 @@
stage2_bootstrap = None,
imports = None,
is_for_zip,
- runtime_details):
+ runtime_details,
+ venv = None):
runtime = runtime_details.effective_runtime
+ if venv:
+ python_binary_path = _runfiles_root_path(ctx, venv.interpreter.short_path)
+ else:
+ python_binary_path = runtime_details.executable_interpreter_path
+
+ if is_for_zip and venv:
+ python_binary_actual = venv.interpreter_actual_path
+ else:
+ python_binary_actual = ""
+
subs = {
"%is_zipfile%": "1" if is_for_zip else "0",
- "%python_binary%": runtime_details.executable_interpreter_path,
+ "%python_binary%": python_binary_path,
+ "%python_binary_actual%": python_binary_actual,
"%target%": str(ctx.label),
"%workspace_name%": ctx.workspace_name,
}
@@ -447,6 +612,7 @@
)
def _create_zip_file(ctx, *, output, original_nonzip_executable, zip_main, runfiles):
+ """Create a Python zipapp (zip with __main__.py entry point)."""
workspace_name = ctx.workspace_name
legacy_external_runfiles = _py_builtins.get_legacy_external_runfiles(ctx)
@@ -524,7 +690,14 @@
zip_runfiles_path = paths.normalize("{}/{}".format(workspace_name, path))
return "{}/{}".format(_ZIP_RUNFILES_DIRECTORY_NAME, zip_runfiles_path)
-def _create_executable_zip_file(ctx, *, output, zip_file, stage2_bootstrap, runtime_details):
+def _create_executable_zip_file(
+ ctx,
+ *,
+ output,
+ zip_file,
+ stage2_bootstrap,
+ runtime_details,
+ venv):
prelude = ctx.actions.declare_file(
"{}_zip_prelude.sh".format(output.basename),
sibling = output,
@@ -536,6 +709,7 @@
stage2_bootstrap = stage2_bootstrap,
runtime_details = runtime_details,
is_for_zip = True,
+ venv = venv,
)
else:
ctx.actions.write(prelude, "#!/usr/bin/env python3\n")
diff --git a/python/private/py_info.bzl b/python/private/py_info.bzl
index 7a0bdea..4b2b888 100644
--- a/python/private/py_info.bzl
+++ b/python/private/py_info.bzl
@@ -129,11 +129,14 @@
"transitive_sources": """\
:type: depset[File]
-A (`postorder`-compatible) depset of `.py` files appearing in the target's
-`srcs` and the `srcs` of the target's transitive `deps`.
+A (`postorder`-compatible) depset of `.py` files that are considered required
+and downstream binaries (or equivalent) **must** include in their outputs
+to have a functioning program.
-These are `.py` source files that are considered required and downstream
-binaries (or equivalent) must include in their outputs.
+Normally, these are the `.py` files in the appearing in the target's `srcs` and
+the `srcs` of the target's transitive `deps`, **however**, precompile settings
+may cause `.py` files to be omitted. In particular, pyc-only builds may result
+in this depset being **empty**.
::::{versionchanged} 0.37.0
The files are considered necessary for downstream binaries to function;
diff --git a/python/private/py_library.bzl b/python/private/py_library.bzl
index 4f43116..6a65038 100644
--- a/python/private/py_library.bzl
+++ b/python/private/py_library.bzl
@@ -11,13 +11,14 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
-"""Implementation of py_library rule."""
+"""Common code for implementing py_library rules."""
load("@bazel_skylib//lib:dicts.bzl", "dicts")
load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
load(
":attributes.bzl",
"COMMON_ATTRS",
+ "IMPORTS_ATTRS",
"PY_SRCS_ATTRS",
"PrecompileAttr",
"REQUIRED_EXEC_GROUPS",
@@ -28,7 +29,6 @@
load(":builders.bzl", "builders")
load(
":common.bzl",
- "check_native_allowed",
"collect_imports",
"collect_runfiles",
"create_instrumented_files_info",
@@ -51,6 +51,7 @@
LIBRARY_ATTRS = union_attrs(
COMMON_ATTRS,
PY_SRCS_ATTRS,
+ IMPORTS_ATTRS,
create_srcs_version_attr(values = SRCS_VERSION_ALL_VALUES),
create_srcs_attr(mandatory = False),
{
@@ -70,7 +71,6 @@
Returns:
A list of modern providers to propagate.
"""
- check_native_allowed(ctx)
direct_sources = filter_to_py_srcs(ctx.files.srcs)
precompile_result = semantics.maybe_precompile(ctx, direct_sources)
diff --git a/python/private/py_library_macro_bazel.bzl b/python/private/py_library_macro.bzl
similarity index 77%
rename from python/private/py_library_macro_bazel.bzl
rename to python/private/py_library_macro.bzl
index b4f51ef..981253d 100644
--- a/python/private/py_library_macro_bazel.bzl
+++ b/python/private/py_library_macro.bzl
@@ -13,7 +13,9 @@
# limitations under the License.
"""Implementation of macro-half of py_library rule."""
-load(":py_library_rule_bazel.bzl", py_library_rule = "py_library")
+load(":py_library_rule.bzl", py_library_rule = "py_library")
+# A wrapper macro is used to avoid any user-observable changes between a
+# rule and macro. It also makes generator_function look as expected.
def py_library(**kwargs):
py_library_rule(**kwargs)
diff --git a/python/private/py_library_rule.bzl b/python/private/py_library_rule.bzl
new file mode 100644
index 0000000..ed64716
--- /dev/null
+++ b/python/private/py_library_rule.bzl
@@ -0,0 +1,32 @@
+# Copyright 2022 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""Implementation of py_library rule."""
+
+load(":common.bzl", "create_library_semantics_struct")
+load(":common_bazel.bzl", "collect_cc_info", "get_imports", "maybe_precompile")
+load(":py_library.bzl", "create_py_library_rule", "py_library_impl")
+
+def _py_library_impl_with_semantics(ctx):
+ return py_library_impl(
+ ctx,
+ semantics = create_library_semantics_struct(
+ get_imports = get_imports,
+ maybe_precompile = maybe_precompile,
+ get_cc_info_for_library = collect_cc_info,
+ ),
+ )
+
+py_library = create_py_library_rule(
+ implementation = _py_library_impl_with_semantics,
+)
diff --git a/python/private/py_library_rule_bazel.bzl b/python/private/py_library_rule_bazel.bzl
deleted file mode 100644
index 453abcb..0000000
--- a/python/private/py_library_rule_bazel.bzl
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright 2022 The Bazel Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Implementation of py_library for Bazel."""
-
-load(":attributes_bazel.bzl", "IMPORTS_ATTRS")
-load(":common.bzl", "create_library_semantics_struct", "union_attrs")
-load(":common_bazel.bzl", "collect_cc_info", "get_imports", "maybe_precompile")
-load(
- ":py_library.bzl",
- "LIBRARY_ATTRS",
- "create_py_library_rule",
- bazel_py_library_impl = "py_library_impl",
-)
-
-_BAZEL_LIBRARY_ATTRS = union_attrs(
- LIBRARY_ATTRS,
- IMPORTS_ATTRS,
-)
-
-def create_library_semantics_bazel():
- return create_library_semantics_struct(
- get_imports = get_imports,
- maybe_precompile = maybe_precompile,
- get_cc_info_for_library = collect_cc_info,
- )
-
-def _py_library_impl(ctx):
- return bazel_py_library_impl(
- ctx,
- semantics = create_library_semantics_bazel(),
- )
-
-py_library = create_py_library_rule(
- implementation = _py_library_impl,
- attrs = _BAZEL_LIBRARY_ATTRS,
-)
diff --git a/python/private/py_repositories.bzl b/python/private/py_repositories.bzl
index ff8a638..46ca903 100644
--- a/python/private/py_repositories.bzl
+++ b/python/private/py_repositories.bzl
@@ -47,16 +47,26 @@
)
http_archive(
name = "bazel_skylib",
- sha256 = "74d544d96f4a5bb630d465ca8bbcfe231e3594e5aae57e1edbf17a6eb3ca2506",
+ sha256 = "d00f1389ee20b60018e92644e0948e16e350a7707219e7a390fb0a99b6ec9262",
urls = [
- "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.3.0/bazel-skylib-1.3.0.tar.gz",
- "https://github.com/bazelbuild/bazel-skylib/releases/download/1.3.0/bazel-skylib-1.3.0.tar.gz",
+ "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.7.0/bazel-skylib-1.7.0.tar.gz",
+ "https://github.com/bazelbuild/bazel-skylib/releases/download/1.7.0/bazel-skylib-1.7.0.tar.gz",
],
)
http_archive(
name = "rules_cc",
- urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.9/rules_cc-0.0.9.tar.gz"],
- sha256 = "2037875b9a4456dce4a79d112a8ae885bbc4aad968e6587dca6e64f3a0900cdf",
- strip_prefix = "rules_cc-0.0.9",
+ sha256 = "4b12149a041ddfb8306a8fd0e904e39d673552ce82e4296e96fac9cbf0780e59",
+ strip_prefix = "rules_cc-0.1.0",
+ urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.1.0/rules_cc-0.1.0.tar.gz"],
+ )
+
+ # Needed by rules_cc, triggered by @rules_java_prebuilt in Bazel by using @rules_cc//cc:defs.bzl
+ # NOTE: This name must be com_google_protobuf until Bazel drops WORKSPACE
+ # support; Bazel itself has references to com_google_protobuf.
+ http_archive(
+ name = "com_google_protobuf",
+ sha256 = "23082dca1ca73a1e9c6cbe40097b41e81f71f3b4d6201e36c134acc30a1b3660",
+ url = "https://github.com/protocolbuffers/protobuf/releases/download/v29.0-rc2/protobuf-29.0-rc2.zip",
+ strip_prefix = "protobuf-29.0-rc2",
)
pypi_deps()
diff --git a/python/private/py_runtime_info.bzl b/python/private/py_runtime_info.bzl
index 359a9e7..34be0db 100644
--- a/python/private/py_runtime_info.bzl
+++ b/python/private/py_runtime_info.bzl
@@ -67,7 +67,9 @@
bootstrap_template = None,
interpreter_version_info = None,
stage2_bootstrap_template = None,
- zip_main_template = None):
+ zip_main_template = None,
+ abi_flags = "",
+ site_init_template = None):
if (interpreter_path and interpreter) or (not interpreter_path and not interpreter):
fail("exactly one of interpreter or interpreter_path must be specified")
@@ -105,6 +107,7 @@
stub_shebang = DEFAULT_STUB_SHEBANG
return {
+ "abi_flags": abi_flags,
"bootstrap_template": bootstrap_template,
"coverage_files": coverage_files,
"coverage_tool": coverage_tool,
@@ -115,6 +118,7 @@
"interpreter_version_info": interpreter_version_info_struct_from_dict(interpreter_version_info),
"pyc_tag": pyc_tag,
"python_version": python_version,
+ "site_init_template": site_init_template,
"stage2_bootstrap_template": stage2_bootstrap_template,
"stub_shebang": stub_shebang,
"zip_main_template": zip_main_template,
@@ -124,6 +128,11 @@
doc = """Contains information about a Python runtime, as returned by the `py_runtime`
rule.
+:::{warning}
+This is an **unstable public** API. It may change more frequently and has weaker
+compatibility guarantees.
+:::
+
A Python runtime describes either a *platform runtime* or an *in-build runtime*.
A platform runtime accesses a system-installed interpreter at a known path,
whereas an in-build runtime points to a `File` that acts as the interpreter. In
@@ -133,6 +142,14 @@
""",
init = _PyRuntimeInfo_init,
fields = {
+ "abi_flags": """
+:type: str
+
+The runtime's ABI flags, i.e. `sys.abiflags`.
+
+:::{versionadded} 0.41.0
+:::
+""",
"bootstrap_template": """
:type: File
@@ -153,7 +170,8 @@
`%target%`, `%workspace_name`, `%coverage_tool%`, `%import_all%`, `%imports%`,
`%main%`, `%shebang%`
* `--bootstrap_impl=script` substititions: `%is_zipfile%`, `%python_binary%`,
- `%target%`, `%workspace_name`, `%shebang%, `%stage2_bootstrap%`
+ `%python_binary_actual%`, `%target%`, `%workspace_name`,
+ `%shebang%`, `%stage2_bootstrap%`
Substitution definitions:
@@ -165,6 +183,19 @@
* An absolute path to a system interpreter (e.g. begins with `/`).
* A runfiles-relative path to an interpreter (e.g. `somerepo/bin/python3`)
* A program to search for on PATH, i.e. a word without spaces, e.g. `python3`.
+
+ When `--bootstrap_impl=script` is used, this is always a runfiles-relative
+ path to a venv-based interpreter executable.
+
+* `%python_binary_actual%`: The path to the interpreter that
+ `%python_binary%` invokes. There are three types of paths:
+ * An absolute path to a system interpreter (e.g. begins with `/`).
+ * A runfiles-relative path to an interpreter (e.g. `somerepo/bin/python3`)
+ * A program to search for on PATH, i.e. a word without spaces, e.g. `python3`.
+
+ Only set for zip builds with `--bootstrap_impl=script`; other builds will use
+ an empty string.
+
* `%workspace_name%`: The name of the workspace the target belongs to.
* `%is_zipfile%`: The string `1` if this template is prepended to a zipfile to
create a self-executable zip file. The string `0` otherwise.
@@ -244,6 +275,15 @@
Indicates whether this runtime uses Python major version 2 or 3. Valid values
are (only) `"PY2"` and `"PY3"`.
""",
+ "site_init_template": """
+:type: File
+
+The template to use for the binary-specific site-init hook run by the
+interpreter at startup.
+
+:::{versionadded} 0.41.0
+:::
+""",
"stage2_bootstrap_template": """
:type: File
diff --git a/python/private/py_runtime_rule.bzl b/python/private/py_runtime_rule.bzl
index ba9b36d..5ce8161 100644
--- a/python/private/py_runtime_rule.bzl
+++ b/python/private/py_runtime_rule.bzl
@@ -17,6 +17,7 @@
load("@bazel_skylib//lib:paths.bzl", "paths")
load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
load(":attributes.bzl", "NATIVE_RULES_ALLOWLIST_ATTRS")
+load(":flags.bzl", "FreeThreadedFlag")
load(":py_internal.bzl", "py_internal")
load(":py_runtime_info.bzl", "DEFAULT_BOOTSTRAP_TEMPLATE", "DEFAULT_STUB_SHEBANG", "PyRuntimeInfo")
load(":reexports.bzl", "BuiltinPyRuntimeInfo")
@@ -101,6 +102,13 @@
interpreter_version_info["minor"],
)
+ abi_flags = ctx.attr.abi_flags
+ if abi_flags == "<AUTO>":
+ abi_flags = ""
+ if ctx.attr._py_freethreaded_flag[BuildSettingInfo].value == FreeThreadedFlag.YES:
+ abi_flags += "t"
+
+ # Args common to both BuiltinPyRuntimeInfo and PyRuntimeInfo
py_runtime_info_kwargs = dict(
interpreter_path = interpreter_path or None,
interpreter = interpreter,
@@ -120,6 +128,8 @@
pyc_tag = pyc_tag,
stage2_bootstrap_template = ctx.file.stage2_bootstrap_template,
zip_main_template = ctx.file.zip_main_template,
+ abi_flags = abi_flags,
+ site_init_template = ctx.file.site_init_template,
))
if not IS_BAZEL_7_OR_HIGHER:
@@ -179,6 +189,14 @@
""",
fragments = ["py"],
attrs = dicts.add(NATIVE_RULES_ALLOWLIST_ATTRS, {
+ "abi_flags": attr.string(
+ default = "<AUTO>",
+ doc = """
+The runtime's ABI flags, i.e. `sys.abiflags`.
+
+If not set, then it will be set based on flags.
+""",
+ ),
"bootstrap_template": attr.label(
allow_single_file = True,
default = DEFAULT_BOOTSTRAP_TEMPLATE,
@@ -299,6 +317,17 @@
value.
""",
),
+ "site_init_template": attr.label(
+ allow_single_file = True,
+ default = "//python/private:site_init_template",
+ doc = """
+The template to use for the binary-specific site-init hook run by the
+interpreter at startup.
+
+:::{versionadded} 0.41.0
+:::
+""",
+ ),
"stage2_bootstrap_template": attr.label(
default = "//python/private:stage2_bootstrap_template",
allow_single_file = True,
@@ -335,6 +364,9 @@
:::
""",
),
+ "_py_freethreaded_flag": attr.label(
+ default = "//python/config_settings:py_freethreaded",
+ ),
"_python_version_flag": attr.label(
default = "//python/config_settings:python_version",
),
diff --git a/python/private/py_test_macro_bazel.bzl b/python/private/py_test_macro.bzl
similarity index 92%
rename from python/private/py_test_macro_bazel.bzl
rename to python/private/py_test_macro.bzl
index 24b78fe..1f9330f 100644
--- a/python/private/py_test_macro_bazel.bzl
+++ b/python/private/py_test_macro.bzl
@@ -14,7 +14,7 @@
"""Implementation of macro-half of py_test rule."""
load(":common_bazel.bzl", "convert_legacy_create_init_to_int")
-load(":py_test_rule_bazel.bzl", py_test_rule = "py_test")
+load(":py_test_rule.bzl", py_test_rule = "py_test")
def py_test(**kwargs):
convert_legacy_create_init_to_int(kwargs)
diff --git a/python/private/py_test_rule_bazel.bzl b/python/private/py_test_rule.bzl
similarity index 97%
rename from python/private/py_test_rule_bazel.bzl
rename to python/private/py_test_rule.bzl
index 369360d..64d5f21 100644
--- a/python/private/py_test_rule_bazel.bzl
+++ b/python/private/py_test_rule.bzl
@@ -11,7 +11,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
-"""Rule implementation of py_test for Bazel."""
+"""Implementation of py_test rule."""
load("@bazel_skylib//lib:dicts.bzl", "dicts")
load(":attributes.bzl", "AGNOSTIC_TEST_ATTRS")
diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel
index e76f9d3..2cc073a 100644
--- a/python/private/pypi/BUILD.bazel
+++ b/python/private/pypi/BUILD.bazel
@@ -64,6 +64,7 @@
":parse_whl_name_bzl",
":pip_repository_attrs_bzl",
":simpleapi_download_bzl",
+ ":whl_config_setting_bzl",
":whl_library_bzl",
":whl_repo_name_bzl",
"//python/private:full_version_bzl",
@@ -86,6 +87,7 @@
srcs = ["deps.bzl"],
deps = [
"//python/private:bazel_tools_bzl",
+ "//python/private:glob_excludes_bzl",
],
)
@@ -110,8 +112,7 @@
name = "generate_whl_library_build_bazel_bzl",
srcs = ["generate_whl_library_build_bazel.bzl"],
deps = [
- ":labels_bzl",
- "//python/private:normalize_name_bzl",
+ "//python/private:text_util_bzl",
],
)
@@ -156,7 +157,7 @@
name = "multi_pip_parse_bzl",
srcs = ["multi_pip_parse.bzl"],
deps = [
- "pip_repository_bzl",
+ ":pip_repository_bzl",
"//python/private:text_util_bzl",
],
)
@@ -230,6 +231,7 @@
":parse_requirements_bzl",
":pip_repository_attrs_bzl",
":render_pkg_aliases_bzl",
+ ":whl_config_setting_bzl",
"//python/private:normalize_name_bzl",
"//python/private:repo_utils_bzl",
"//python/private:text_util_bzl",
@@ -256,8 +258,8 @@
srcs = ["render_pkg_aliases.bzl"],
deps = [
":generate_group_library_build_bazel_bzl",
- ":labels_bzl",
":parse_whl_name_bzl",
+ ":whl_config_setting_bzl",
":whl_target_platforms_bzl",
"//python/private:normalize_name_bzl",
"//python/private:text_util_bzl",
@@ -285,6 +287,11 @@
)
bzl_library(
+ name = "whl_config_setting_bzl",
+ srcs = ["whl_config_setting.bzl"],
+)
+
+bzl_library(
name = "whl_library_alias_bzl",
srcs = ["whl_library_alias.bzl"],
deps = [
diff --git a/python/private/pypi/attrs.bzl b/python/private/pypi/attrs.bzl
index c6132cb..c9b7ea6 100644
--- a/python/private/pypi/attrs.bzl
+++ b/python/private/pypi/attrs.bzl
@@ -141,6 +141,16 @@
NOTE: this is not for cross-compiling Python wheels but rather for parsing the `whl` METADATA correctly.
""",
),
+ "extra_hub_aliases": attr.string_list_dict(
+ doc = """\
+Extra aliases to make for specific wheels in the hub repo. This is useful when
+paired with the {attr}`whl_modifications`.
+
+:::{versionadded} 0.38.0
+:::
+""",
+ mandatory = False,
+ ),
"extra_pip_args": attr.string_list(
doc = """Extra arguments to pass on to pip. Must not contain spaces.
diff --git a/python/private/pypi/config_settings.bzl b/python/private/pypi/config_settings.bzl
index 492acf1..6f927f2 100644
--- a/python/private/pypi/config_settings.bzl
+++ b/python/private/pypi/config_settings.bzl
@@ -39,7 +39,8 @@
order to ensure that the matching fails if the user requests for `musl` and we don't have it or vice versa.
"""
-load(":flags.bzl", "INTERNAL_FLAGS", "UniversalWhlFlag", "WhlLibcFlag")
+load("//python/private:flags.bzl", "LibcFlag")
+load(":flags.bzl", "INTERNAL_FLAGS", "UniversalWhlFlag")
FLAGS = struct(
**{
@@ -148,6 +149,13 @@
)
def _dist_config_settings(*, suffix, plat_flag_values, **kwargs):
+ if kwargs.get("constraint_values"):
+ # Add python version + platform config settings
+ _dist_config_setting(
+ name = suffix.strip("_"),
+ **kwargs
+ )
+
flag_values = {_flags.dist: ""}
# First create an sdist, we will be building upon the flag values, which
@@ -244,14 +252,14 @@
elif os == "linux":
for os_prefix, linux_libc in {
- os: WhlLibcFlag.GLIBC,
- "many" + os: WhlLibcFlag.GLIBC,
- "musl" + os: WhlLibcFlag.MUSL,
+ os: LibcFlag.GLIBC,
+ "many" + os: LibcFlag.GLIBC,
+ "musl" + os: LibcFlag.MUSL,
}.items():
- if linux_libc == WhlLibcFlag.GLIBC:
+ if linux_libc == LibcFlag.GLIBC:
libc_versions = glibc_versions
libc_flag = FLAGS.pip_whl_glibc_version
- elif linux_libc == WhlLibcFlag.MUSL:
+ elif linux_libc == LibcFlag.MUSL:
libc_versions = muslc_versions
libc_flag = FLAGS.pip_whl_muslc_version
else:
@@ -277,7 +285,7 @@
return ret
-def _dist_config_setting(*, name, is_pip_whl, is_python, python_version, native = native, **kwargs):
+def _dist_config_setting(*, name, is_python, python_version, is_pip_whl = None, native = native, **kwargs):
"""A macro to create a target that matches is_pip_whl_auto and one more value.
Args:
@@ -310,6 +318,10 @@
# `python_version` setting.
return
+ if not is_pip_whl:
+ native.config_setting(name = _name, **kwargs)
+ return
+
config_setting_name = _name + "_setting"
native.config_setting(name = config_setting_name, **kwargs)
diff --git a/python/private/pypi/dependency_resolver/dependency_resolver.py b/python/private/pypi/dependency_resolver/dependency_resolver.py
index 0ff9b2f..293377d 100644
--- a/python/private/pypi/dependency_resolver/dependency_resolver.py
+++ b/python/private/pypi/dependency_resolver/dependency_resolver.py
@@ -170,19 +170,26 @@
if UPDATE:
print("Updating " + requirements_file_relative)
+
+ # Make sure the output file for pip_compile exists. It won't if we are on Windows and --enable_runfiles is not set.
+ if not os.path.exists(requirements_file_relative):
+ os.makedirs(os.path.dirname(requirements_file_relative), exist_ok=True)
+ shutil.copy(resolved_requirements_file, requirements_file_relative)
+
if "BUILD_WORKSPACE_DIRECTORY" in os.environ:
workspace = os.environ["BUILD_WORKSPACE_DIRECTORY"]
requirements_file_tree = os.path.join(workspace, requirements_file_relative)
+ absolute_output_file = Path(requirements_file_relative).absolute()
# In most cases, requirements_file will be a symlink to the real file in the source tree.
# If symlinks are not enabled (e.g. on Windows), then requirements_file will be a copy,
# and we should copy the updated requirements back to the source tree.
- if not os.path.samefile(resolved_requirements_file, requirements_file_tree):
+ if not absolute_output_file.samefile(requirements_file_tree):
atexit.register(
lambda: shutil.copy(
- resolved_requirements_file, requirements_file_tree
+ absolute_output_file, requirements_file_tree
)
)
- cli(argv)
+ cli(argv, standalone_mode = False)
requirements_file_relative_path = Path(requirements_file_relative)
content = requirements_file_relative_path.read_text()
content = content.replace(absolute_path_prefix, "")
diff --git a/python/private/pypi/deps.bzl b/python/private/pypi/deps.bzl
index e07d9aa..8949ed4 100644
--- a/python/private/pypi/deps.bzl
+++ b/python/private/pypi/deps.bzl
@@ -101,6 +101,7 @@
package(default_visibility = ["//visibility:public"])
load("@rules_python//python:defs.bzl", "py_library")
+load("@rules_python//python/private:glob_excludes.bzl", "glob_excludes")
py_library(
name = "lib",
@@ -111,11 +112,10 @@
"**/*.py",
"**/*.pyc",
"**/*.pyc.*", # During pyc creation, temp files named *.pyc.NNN are created
- "**/* *",
"**/*.dist-info/RECORD",
"BUILD",
"WORKSPACE",
- ]),
+ ] + glob_excludes.version_dependent_exclusions()),
# This makes this directory a top-level in the python import
# search path for anything that depends on this.
imports = ["."],
diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl
index 36fb20e..edfd580 100644
--- a/python/private/pypi/extension.bzl
+++ b/python/private/pypi/extension.bzl
@@ -23,57 +23,33 @@
load("//python/private:version_label.bzl", "version_label")
load(":attrs.bzl", "use_isolated")
load(":evaluate_markers.bzl", "evaluate_markers", EVALUATE_MARKERS_SRCS = "SRCS")
-load(":hub_repository.bzl", "hub_repository")
-load(":parse_requirements.bzl", "host_platform", "parse_requirements", "select_requirement")
+load(":hub_repository.bzl", "hub_repository", "whl_config_settings_to_json")
+load(":parse_requirements.bzl", "parse_requirements")
load(":parse_whl_name.bzl", "parse_whl_name")
load(":pip_repository_attrs.bzl", "ATTRS")
-load(":render_pkg_aliases.bzl", "whl_alias")
load(":requirements_files_by_platform.bzl", "requirements_files_by_platform")
load(":simpleapi_download.bzl", "simpleapi_download")
+load(":whl_config_setting.bzl", "whl_config_setting")
load(":whl_library.bzl", "whl_library")
-load(":whl_repo_name.bzl", "whl_repo_name")
+load(":whl_repo_name.bzl", "pypi_repo_name", "whl_repo_name")
def _major_minor_version(version):
version = semver(version)
return "{}.{}".format(version.major, version.minor)
-def _whl_mods_impl(mctx):
+def _whl_mods_impl(whl_mods_dict):
"""Implementation of the pip.whl_mods tag class.
This creates the JSON files used to modify the creation of different wheels.
"""
- whl_mods_dict = {}
- for mod in mctx.modules:
- for whl_mod_attr in mod.tags.whl_mods:
- if whl_mod_attr.hub_name not in whl_mods_dict.keys():
- whl_mods_dict[whl_mod_attr.hub_name] = {whl_mod_attr.whl_name: whl_mod_attr}
- elif whl_mod_attr.whl_name in whl_mods_dict[whl_mod_attr.hub_name].keys():
- # We cannot have the same wheel name in the same hub, as we
- # will create the same JSON file name.
- fail("""\
-Found same whl_name '{}' in the same hub '{}', please use a different hub_name.""".format(
- whl_mod_attr.whl_name,
- whl_mod_attr.hub_name,
- ))
- else:
- whl_mods_dict[whl_mod_attr.hub_name][whl_mod_attr.whl_name] = whl_mod_attr
-
for hub_name, whl_maps in whl_mods_dict.items():
whl_mods = {}
# create a struct that we can pass to the _whl_mods_repo rule
# to create the different JSON files.
for whl_name, mods in whl_maps.items():
- build_content = mods.additive_build_content
- if mods.additive_build_content_file != None and mods.additive_build_content != "":
- fail("""\
-You cannot use both the additive_build_content and additive_build_content_file arguments at the same time.
-""")
- elif mods.additive_build_content_file != None:
- build_content = mctx.read(mods.additive_build_content_file)
-
whl_mods[whl_name] = json.encode(struct(
- additive_build_content = build_content,
+ additive_build_content = mods.build_content,
copy_files = mods.copy_files,
copy_executables = mods.copy_executables,
data = mods.data,
@@ -86,10 +62,55 @@
whl_mods = whl_mods,
)
-def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, simpleapi_cache, exposed_packages):
+def _create_whl_repos(
+ module_ctx,
+ *,
+ pip_attr,
+ whl_overrides,
+ simpleapi_cache,
+ evaluate_markers = evaluate_markers,
+ available_interpreters = INTERPRETER_LABELS,
+ simpleapi_download = simpleapi_download):
+ """create all of the whl repositories
+
+ Args:
+ module_ctx: {type}`module_ctx`.
+ pip_attr: {type}`struct` - the struct that comes from the tag class iteration.
+ whl_overrides: {type}`dict[str, struct]` - per-wheel overrides.
+ simpleapi_cache: {type}`dict` - an opaque dictionary used for caching the results from calling
+ SimpleAPI evaluating all of the tag class invocations {bzl:obj}`pip.parse`.
+ evaluate_markers: the function to use to evaluate markers.
+ simpleapi_download: Used for testing overrides
+ available_interpreters: {type}`dict[str, Label]` The dictionary of available
+ interpreters that have been registered using the `python` bzlmod extension.
+ The keys are in the form `python_{snake_case_version}_host`. This is to be
+ used during the `repository_rule` and must be always compatible with the host.
+
+ Returns a {type}`struct` with the following attributes:
+ whl_map: {type}`dict[str, list[struct]]` the output is keyed by the
+ normalized package name and the values are the instances of the
+ {bzl:obj}`whl_config_setting` return values.
+ exposed_packages: {type}`dict[str, Any]` this is just a way to
+ represent a set of string values.
+ whl_libraries: {type}`dict[str, dict[str, Any]]` the keys are the
+ aparent repository names for the hub repo and the values are the
+ arguments that will be passed to {bzl:obj}`whl_library` repository
+ rule.
+ is_reproducible: {type}`bool` set to True if does not make calls to the
+ internet to evaluate the requirements files.
+ """
logger = repo_utils.logger(module_ctx, "pypi:create_whl_repos")
python_interpreter_target = pip_attr.python_interpreter_target
- is_hub_reproducible = True
+ is_reproducible = True
+
+ # containers to aggregate outputs from this function
+ whl_map = {}
+ exposed_packages = {}
+ extra_aliases = {
+ whl_name: {alias: True for alias in aliases}
+ for whl_name, aliases in pip_attr.extra_hub_aliases.items()
+ }
+ whl_libraries = {}
# if we do not have the python_interpreter set in the attributes
# we programmatically find it.
@@ -98,7 +119,7 @@
python_name = "python_{}_host".format(
pip_attr.python_version.replace(".", "_"),
)
- if python_name not in INTERPRETER_LABELS:
+ if python_name not in available_interpreters:
fail((
"Unable to find interpreter for pip hub '{hub_name}' for " +
"python_version={version}: Make sure a corresponding " +
@@ -108,9 +129,9 @@
hub_name = hub_name,
version = pip_attr.python_version,
python_name = python_name,
- labels = " \n".join(INTERPRETER_LABELS),
+ labels = " \n".join(available_interpreters),
))
- python_interpreter_target = INTERPRETER_LABELS[python_name]
+ python_interpreter_target = available_interpreters[python_name]
pip_name = "{}_{}".format(
hub_name,
@@ -118,13 +139,10 @@
)
major_minor = _major_minor_version(pip_attr.python_version)
- if hub_name not in whl_map:
- whl_map[hub_name] = {}
-
whl_modifications = {}
if pip_attr.whl_modifications != None:
for mod, whl_name in pip_attr.whl_modifications.items():
- whl_modifications[whl_name] = mod
+ whl_modifications[normalize_name(whl_name)] = mod
if pip_attr.experimental_requirement_cycles:
requirement_cycles = {
@@ -137,12 +155,6 @@
for group_name, group_whls in requirement_cycles.items()
for whl_name in group_whls
}
-
- # TODO @aignas 2024-04-05: how do we support different requirement
- # cycles for different abis/oses? For now we will need the users to
- # assume the same groups across all versions/platforms until we start
- # using an alternative cycle resolution strategy.
- group_map[hub_name] = pip_attr.experimental_requirement_cycles
else:
whl_group_mapping = {}
requirement_cycles = {}
@@ -206,12 +218,7 @@
logger = logger,
)
- repository_platform = host_platform(module_ctx)
for whl_name, requirements in requirements_by_platform.items():
- # We are not using the "sanitized name" because the user
- # would need to guess what name we modified the whl name
- # to.
- annotation = whl_modifications.get(whl_name)
whl_name = normalize_name(whl_name)
group_name = whl_group_mapping.get(whl_name)
@@ -225,7 +232,7 @@
)
maybe_args = dict(
# The following values are safe to omit if they have false like values
- annotation = annotation,
+ annotation = whl_modifications.get(whl_name),
download_only = pip_attr.download_only,
enable_implicit_namespace_pkgs = pip_attr.enable_implicit_namespace_pkgs,
environment = pip_attr.environment,
@@ -254,10 +261,10 @@
if v != default
})
+ is_exposed = False
if get_index_urls:
# TODO @aignas 2024-05-26: move to a separate function
found_something = False
- is_exposed = False
for requirement in requirements:
is_exposed = is_exposed or requirement.is_exposed
dists = requirement.whls
@@ -266,30 +273,30 @@
for distribution in dists:
found_something = True
- is_hub_reproducible = False
+ is_reproducible = False
+ args = dict(whl_library_args)
if pip_attr.netrc:
- whl_library_args["netrc"] = pip_attr.netrc
+ args["netrc"] = pip_attr.netrc
if pip_attr.auth_patterns:
- whl_library_args["auth_patterns"] = pip_attr.auth_patterns
+ args["auth_patterns"] = pip_attr.auth_patterns
- if distribution.filename.endswith(".whl"):
- # pip is not used to download wheels and the python `whl_library` helpers are only extracting things
- whl_library_args.pop("extra_pip_args", None)
- else:
- # For sdists, they will be built by `pip`, so we still
+ if not distribution.filename.endswith(".whl"):
+ # pip is not used to download wheels and the python
+ # `whl_library` helpers are only extracting things, however
+ # for sdists, they will be built by `pip`, so we still
# need to pass the extra args there.
- pass
+ args["extra_pip_args"] = requirement.extra_pip_args
# This is no-op because pip is not used to download the wheel.
- whl_library_args.pop("download_only", None)
+ args.pop("download_only", None)
repo_name = whl_repo_name(pip_name, distribution.filename, distribution.sha256)
- whl_library_args["requirement"] = requirement.srcs.requirement
- whl_library_args["urls"] = [distribution.url]
- whl_library_args["sha256"] = distribution.sha256
- whl_library_args["filename"] = distribution.filename
- whl_library_args["experimental_target_platforms"] = requirement.target_platforms
+ args["requirement"] = requirement.srcs.requirement
+ args["urls"] = [distribution.url]
+ args["sha256"] = distribution.sha256
+ args["filename"] = distribution.filename
+ args["experimental_target_platforms"] = requirement.target_platforms
# Pure python wheels or sdists may need to have a platform here
target_platforms = None
@@ -297,53 +304,236 @@
if len(requirements) > 1:
target_platforms = requirement.target_platforms
- whl_library(name = repo_name, **dict(sorted(whl_library_args.items())))
+ whl_libraries[repo_name] = args
- whl_map[hub_name].setdefault(whl_name, []).append(
- whl_alias(
- repo = repo_name,
- version = major_minor,
- filename = distribution.filename,
- target_platforms = target_platforms,
- ),
- )
+ whl_map.setdefault(whl_name, {})[whl_config_setting(
+ version = major_minor,
+ filename = distribution.filename,
+ target_platforms = target_platforms,
+ )] = repo_name
if found_something:
if is_exposed:
- exposed_packages.setdefault(hub_name, {})[whl_name] = None
+ exposed_packages[whl_name] = None
continue
- requirement = select_requirement(
- requirements,
- platform = None if pip_attr.download_only else repository_platform,
- )
- if not requirement:
- # Sometimes the package is not present for host platform if there
- # are whls specified only in particular requirements files, in that
- # case just continue, however, if the download_only flag is set up,
- # then the user can also specify the target platform of the wheel
- # packages they want to download, in that case there will be always
- # a requirement here, so we will not be in this code branch.
- continue
- elif get_index_urls:
- logger.warn(lambda: "falling back to pip for installing the right file for {}".format(requirement.requirement_line))
+ is_exposed = False
+ for requirement in requirements:
+ is_exposed = is_exposed or requirement.is_exposed
+ if get_index_urls:
+ logger.warn(lambda: "falling back to pip for installing the right file for {}".format(requirement.requirement_line))
- whl_library_args["requirement"] = requirement.requirement_line
- if requirement.extra_pip_args:
- whl_library_args["extra_pip_args"] = requirement.extra_pip_args
+ args = dict(whl_library_args) # make a copy
+ args["requirement"] = requirement.requirement_line
+ if requirement.extra_pip_args:
+ args["extra_pip_args"] = requirement.extra_pip_args
+ if pip_attr.download_only:
+ args.setdefault("experimental_target_platforms", requirement.target_platforms)
+
+ target_platforms = requirement.target_platforms if len(requirements) > 1 else []
+ repo_name = pypi_repo_name(
+ pip_name,
+ whl_name,
+ *target_platforms
+ )
+ whl_libraries[repo_name] = args
+ whl_map.setdefault(whl_name, {})[whl_config_setting(
+ version = major_minor,
+ target_platforms = target_platforms or None,
+ )] = repo_name
+
+ if is_exposed:
+ exposed_packages[whl_name] = None
+
+ return struct(
+ is_reproducible = is_reproducible,
+ whl_map = whl_map,
+ exposed_packages = exposed_packages,
+ extra_aliases = extra_aliases,
+ whl_libraries = whl_libraries,
+ )
+
+def parse_modules(module_ctx, _fail = fail, **kwargs):
+ """Implementation of parsing the tag classes for the extension and return a struct for registering repositories.
+
+ Args:
+ module_ctx: {type}`module_ctx` module context.
+ _fail: {type}`function` the failure function, mainly for testing.
+ **kwargs: Extra arguments passed to the layers below.
+
+ Returns:
+ A struct with the following attributes:
+ """
+ whl_mods = {}
+ for mod in module_ctx.modules:
+ for whl_mod in mod.tags.whl_mods:
+ if whl_mod.whl_name in whl_mods.get(whl_mod.hub_name, {}):
+ # We cannot have the same wheel name in the same hub, as we
+ # will create the same JSON file name.
+ _fail("""\
+Found same whl_name '{}' in the same hub '{}', please use a different hub_name.""".format(
+ whl_mod.whl_name,
+ whl_mod.hub_name,
+ ))
+ return None
+
+ build_content = whl_mod.additive_build_content
+ if whl_mod.additive_build_content_file != None and whl_mod.additive_build_content != "":
+ _fail("""\
+You cannot use both the additive_build_content and additive_build_content_file arguments at the same time.
+""")
+ return None
+ elif whl_mod.additive_build_content_file != None:
+ build_content = module_ctx.read(whl_mod.additive_build_content_file)
+
+ whl_mods.setdefault(whl_mod.hub_name, {})[whl_mod.whl_name] = struct(
+ build_content = build_content,
+ copy_files = whl_mod.copy_files,
+ copy_executables = whl_mod.copy_executables,
+ data = whl_mod.data,
+ data_exclude_glob = whl_mod.data_exclude_glob,
+ srcs_exclude_glob = whl_mod.srcs_exclude_glob,
+ )
+
+ _overriden_whl_set = {}
+ whl_overrides = {}
+ for module in module_ctx.modules:
+ for attr in module.tags.override:
+ if not module.is_root:
+ fail("overrides are only supported in root modules")
+
+ if not attr.file.endswith(".whl"):
+ fail("Only whl overrides are supported at this time")
+
+ whl_name = normalize_name(parse_whl_name(attr.file).distribution)
+
+ if attr.file in _overriden_whl_set:
+ fail("Duplicate module overrides for '{}'".format(attr.file))
+ _overriden_whl_set[attr.file] = None
+
+ for patch in attr.patches:
+ if whl_name not in whl_overrides:
+ whl_overrides[whl_name] = {}
+
+ if patch not in whl_overrides[whl_name]:
+ whl_overrides[whl_name][patch] = struct(
+ patch_strip = attr.patch_strip,
+ whls = [],
+ )
+
+ whl_overrides[whl_name][patch].whls.append(attr.file)
+
+ # Used to track all the different pip hubs and the spoke pip Python
+ # versions.
+ pip_hub_map = {}
+ simpleapi_cache = {}
+
+ # Keeps track of all the hub's whl repos across the different versions.
+ # dict[hub, dict[whl, dict[version, str pip]]]
+ # Where hub, whl, and pip are the repo names
+ hub_whl_map = {}
+ hub_group_map = {}
+ exposed_packages = {}
+ extra_aliases = {}
+ whl_libraries = {}
+
+ is_reproducible = True
+
+ for mod in module_ctx.modules:
+ for pip_attr in mod.tags.parse:
+ hub_name = pip_attr.hub_name
+ if hub_name not in pip_hub_map:
+ pip_hub_map[pip_attr.hub_name] = struct(
+ module_name = mod.name,
+ python_versions = [pip_attr.python_version],
+ )
+ elif pip_hub_map[hub_name].module_name != mod.name:
+ # We cannot have two hubs with the same name in different
+ # modules.
+ fail((
+ "Duplicate cross-module pip hub named '{hub}': pip hub " +
+ "names must be unique across modules. First defined " +
+ "by module '{first_module}', second attempted by " +
+ "module '{second_module}'"
+ ).format(
+ hub = hub_name,
+ first_module = pip_hub_map[hub_name].module_name,
+ second_module = mod.name,
+ ))
+
+ elif pip_attr.python_version in pip_hub_map[hub_name].python_versions:
+ fail((
+ "Duplicate pip python version '{version}' for hub " +
+ "'{hub}' in module '{module}': the Python versions " +
+ "used for a hub must be unique"
+ ).format(
+ hub = hub_name,
+ module = mod.name,
+ version = pip_attr.python_version,
+ ))
+ else:
+ pip_hub_map[pip_attr.hub_name].python_versions.append(pip_attr.python_version)
+
+ out = _create_whl_repos(
+ module_ctx,
+ pip_attr = pip_attr,
+ simpleapi_cache = simpleapi_cache,
+ whl_overrides = whl_overrides,
+ **kwargs
+ )
+ hub_whl_map.setdefault(hub_name, {})
+ for key, settings in out.whl_map.items():
+ for setting, repo in settings.items():
+ hub_whl_map[hub_name].setdefault(key, {}).setdefault(repo, []).append(setting)
+ extra_aliases.setdefault(hub_name, {})
+ for whl_name, aliases in out.extra_aliases.items():
+ extra_aliases[hub_name].setdefault(whl_name, {}).update(aliases)
+ exposed_packages.setdefault(hub_name, {}).update(out.exposed_packages)
+ whl_libraries.update(out.whl_libraries)
+ is_reproducible = is_reproducible and out.is_reproducible
+
+ # TODO @aignas 2024-04-05: how do we support different requirement
+ # cycles for different abis/oses? For now we will need the users to
+ # assume the same groups across all versions/platforms until we start
+ # using an alternative cycle resolution strategy.
+ hub_group_map[hub_name] = pip_attr.experimental_requirement_cycles
+
+ return struct(
# We sort so that the lock-file remains the same no matter the order of how the
# args are manipulated in the code going before.
- repo_name = "{}_{}".format(pip_name, whl_name)
- whl_library(name = repo_name, **dict(sorted(whl_library_args.items())))
- whl_map[hub_name].setdefault(whl_name, []).append(
- whl_alias(
- repo = repo_name,
- version = major_minor,
- ),
- )
-
- return is_hub_reproducible
+ whl_mods = dict(sorted(whl_mods.items())),
+ hub_whl_map = {
+ hub_name: {
+ whl_name: dict(settings)
+ for whl_name, settings in sorted(whl_map.items())
+ }
+ for hub_name, whl_map in sorted(hub_whl_map.items())
+ },
+ hub_group_map = {
+ hub_name: {
+ key: sorted(values)
+ for key, values in sorted(group_map.items())
+ }
+ for hub_name, group_map in sorted(hub_group_map.items())
+ },
+ exposed_packages = {
+ k: sorted(v)
+ for k, v in sorted(exposed_packages.items())
+ },
+ extra_aliases = {
+ hub_name: {
+ whl_name: sorted(aliases)
+ for whl_name, aliases in extra_whl_aliases.items()
+ }
+ for hub_name, extra_whl_aliases in extra_aliases.items()
+ },
+ whl_libraries = {
+ k: dict(sorted(args.items()))
+ for k, args in sorted(whl_libraries.items())
+ },
+ is_reproducible = is_reproducible,
+ )
def _pip_impl(module_ctx):
"""Implementation of a class tag that creates the pip hub and corresponding pip spoke whl repositories.
@@ -411,100 +601,25 @@
module_ctx: module contents
"""
+ mods = parse_modules(module_ctx)
+
# Build all of the wheel modifications if the tag class is called.
- _whl_mods_impl(module_ctx)
+ _whl_mods_impl(mods.whl_mods)
- _overriden_whl_set = {}
- whl_overrides = {}
+ for name, args in mods.whl_libraries.items():
+ whl_library(name = name, **args)
- for module in module_ctx.modules:
- for attr in module.tags.override:
- if not module.is_root:
- fail("overrides are only supported in root modules")
-
- if not attr.file.endswith(".whl"):
- fail("Only whl overrides are supported at this time")
-
- whl_name = normalize_name(parse_whl_name(attr.file).distribution)
-
- if attr.file in _overriden_whl_set:
- fail("Duplicate module overrides for '{}'".format(attr.file))
- _overriden_whl_set[attr.file] = None
-
- for patch in attr.patches:
- if whl_name not in whl_overrides:
- whl_overrides[whl_name] = {}
-
- if patch not in whl_overrides[whl_name]:
- whl_overrides[whl_name][patch] = struct(
- patch_strip = attr.patch_strip,
- whls = [],
- )
-
- whl_overrides[whl_name][patch].whls.append(attr.file)
-
- # Used to track all the different pip hubs and the spoke pip Python
- # versions.
- pip_hub_map = {}
-
- # Keeps track of all the hub's whl repos across the different versions.
- # dict[hub, dict[whl, dict[version, str pip]]]
- # Where hub, whl, and pip are the repo names
- hub_whl_map = {}
- hub_group_map = {}
- exposed_packages = {}
-
- simpleapi_cache = {}
- is_extension_reproducible = True
-
- for mod in module_ctx.modules:
- for pip_attr in mod.tags.parse:
- hub_name = pip_attr.hub_name
- if hub_name not in pip_hub_map:
- pip_hub_map[pip_attr.hub_name] = struct(
- module_name = mod.name,
- python_versions = [pip_attr.python_version],
- )
- elif pip_hub_map[hub_name].module_name != mod.name:
- # We cannot have two hubs with the same name in different
- # modules.
- fail((
- "Duplicate cross-module pip hub named '{hub}': pip hub " +
- "names must be unique across modules. First defined " +
- "by module '{first_module}', second attempted by " +
- "module '{second_module}'"
- ).format(
- hub = hub_name,
- first_module = pip_hub_map[hub_name].module_name,
- second_module = mod.name,
- ))
-
- elif pip_attr.python_version in pip_hub_map[hub_name].python_versions:
- fail((
- "Duplicate pip python version '{version}' for hub " +
- "'{hub}' in module '{module}': the Python versions " +
- "used for a hub must be unique"
- ).format(
- hub = hub_name,
- module = mod.name,
- version = pip_attr.python_version,
- ))
- else:
- pip_hub_map[pip_attr.hub_name].python_versions.append(pip_attr.python_version)
-
- is_hub_reproducible = _create_whl_repos(module_ctx, pip_attr, hub_whl_map, whl_overrides, hub_group_map, simpleapi_cache, exposed_packages)
- is_extension_reproducible = is_extension_reproducible and is_hub_reproducible
-
- for hub_name, whl_map in hub_whl_map.items():
+ for hub_name, whl_map in mods.hub_whl_map.items():
hub_repository(
name = hub_name,
repo_name = hub_name,
+ extra_hub_aliases = mods.extra_aliases.get(hub_name, {}),
whl_map = {
- key: json.encode(value)
- for key, value in whl_map.items()
+ key: whl_config_settings_to_json(values)
+ for key, values in whl_map.items()
},
- packages = sorted(exposed_packages.get(hub_name, {})),
- groups = hub_group_map.get(hub_name),
+ packages = mods.exposed_packages.get(hub_name, []),
+ groups = mods.hub_group_map.get(hub_name),
)
if bazel_features.external_deps.extension_metadata_has_reproducible:
@@ -514,17 +629,10 @@
# In order to be able to dogfood the `experimental_index_url` feature before it gets
# stabilized, we have created the `_pip_non_reproducible` function, that will result
# in extra entries in the lock file.
- return module_ctx.extension_metadata(reproducible = is_extension_reproducible)
+ return module_ctx.extension_metadata(reproducible = mods.is_reproducible)
else:
return None
-def _pip_non_reproducible(module_ctx):
- _pip_impl(module_ctx)
-
- # We default to calling the PyPI index and that will go into the
- # MODULE.bazel.lock file, hence return nothing here.
- return None
-
def _pip_parse_ext_attrs(**kwargs):
"""Get the attributes for the pip extension.
@@ -764,58 +872,7 @@
attrs = _pip_parse_ext_attrs(),
doc = """\
This tag class is used to create a pip hub and all of the spokes that are part of that hub.
-This tag class reuses most of the pip attributes that are found in
-@rules_python//python/pip_install:pip_repository.bzl.
-The exception is it does not use the arg 'repo_prefix'. We set the repository
-prefix for the user and the alias arg is always True in bzlmod.
-""",
- ),
- "whl_mods": tag_class(
- attrs = _whl_mod_attrs(),
- doc = """\
-This tag class is used to create JSON file that are used when calling wheel_builder.py. These
-JSON files contain instructions on how to modify a wheel's project. Each of the attributes
-create different modifications based on the type of attribute. Previously to bzlmod these
-JSON files where referred to as annotations, and were renamed to whl_modifications in this
-extension.
-""",
- ),
- },
-)
-
-pypi_internal = module_extension(
- doc = """\
-This extension is used to make dependencies from pypi available.
-
-For now this is intended to be used internally so that usage of the `pip`
-extension in `rules_python` does not affect the evaluations of the extension
-for the consumers.
-
-pip.parse:
-To use, call `pip.parse()` and specify `hub_name` and your requirements file.
-Dependencies will be downloaded and made available in a repo named after the
-`hub_name` argument.
-
-Each `pip.parse()` call configures a particular Python version. Multiple calls
-can be made to configure different Python versions, and will be grouped by
-the `hub_name` argument. This allows the same logical name, e.g. `@pypi//numpy`
-to automatically resolve to different, Python version-specific, libraries.
-
-pip.whl_mods:
-This tag class is used to help create JSON files to describe modifications to
-the BUILD files for wheels.
-""",
- implementation = _pip_non_reproducible,
- tag_classes = {
- "override": _override_tag,
- "parse": tag_class(
- attrs = _pip_parse_ext_attrs(
- experimental_index_url = "https://pypi.org/simple",
- ),
- doc = """\
-This tag class is used to create a pypi hub and all of the spokes that are part of that hub.
-This tag class reuses most of the pypi attributes that are found in
-@rules_python//python/pip_install:pip_repository.bzl.
+This tag class reuses most of the attributes found in {bzl:obj}`pip_parse`.
The exception is it does not use the arg 'repo_prefix'. We set the repository
prefix for the user and the alias arg is always True in bzlmod.
""",
diff --git a/python/private/pypi/flags.bzl b/python/private/pypi/flags.bzl
index 1e38062..11727b5 100644
--- a/python/private/pypi/flags.bzl
+++ b/python/private/pypi/flags.bzl
@@ -44,16 +44,6 @@
UNIVERSAL = "universal",
)
-# Determines which libc flavor is preferred when selecting the linux whl distributions.
-#
-# buildifier: disable=name-conventions
-WhlLibcFlag = enum(
- # Prefer glibc wheels (e.g. manylinux_2_17_x86_64 or linux_x86_64)
- GLIBC = "glibc",
- # Prefer musl wheels (e.g. musllinux_2_17_x86_64)
- MUSL = "musl",
-)
-
INTERNAL_FLAGS = [
"dist",
"whl_plat",
diff --git a/python/private/pypi/generate_whl_library_build_bazel.bzl b/python/private/pypi/generate_whl_library_build_bazel.bzl
index 934fa00..8050cd2 100644
--- a/python/private/pypi/generate_whl_library_build_bazel.bzl
+++ b/python/private/pypi/generate_whl_library_build_bazel.bzl
@@ -14,406 +14,69 @@
"""Generate the BUILD.bazel contents for a repo defined by a whl_library."""
-load("//python/private:normalize_name.bzl", "normalize_name")
load("//python/private:text_util.bzl", "render")
-load(
- ":labels.bzl",
- "DATA_LABEL",
- "DIST_INFO_LABEL",
- "PY_LIBRARY_IMPL_LABEL",
- "PY_LIBRARY_PUBLIC_LABEL",
- "WHEEL_ENTRY_POINT_PREFIX",
- "WHEEL_FILE_IMPL_LABEL",
- "WHEEL_FILE_PUBLIC_LABEL",
-)
-_COPY_FILE_TEMPLATE = """\
-copy_file(
- name = "{dest}.copy",
- src = "{src}",
- out = "{dest}",
- is_executable = {is_executable},
-)
-"""
+_RENDER = {
+ "copy_executables": render.dict,
+ "copy_files": render.dict,
+ "data": render.list,
+ "data_exclude": render.list,
+ "dependencies": render.list,
+ "dependencies_by_platform": lambda x: render.dict(x, value_repr = render.list),
+ "entry_points": render.dict,
+ "group_deps": render.list,
+ "srcs_exclude": render.list,
+ "tags": render.list,
+}
-_ENTRY_POINT_RULE_TEMPLATE = """\
-py_binary(
- name = "{name}",
- srcs = ["{src}"],
- # This makes this directory a top-level in the python import
- # search path for anything that depends on this.
- imports = ["."],
- deps = ["{pkg}"],
-)
-"""
-
-_BUILD_TEMPLATE = """\
-{loads}
+# NOTE @aignas 2024-10-25: We have to keep this so that files in
+# this repository can be publicly visible without the need for
+# export_files
+_TEMPLATE = """\
+load("@rules_python//python/private/pypi:whl_library_targets.bzl", "whl_library_targets")
package(default_visibility = ["//visibility:public"])
-filegroup(
- name = "{dist_info_label}",
- srcs = glob(["site-packages/*.dist-info/**"], allow_empty = True),
-)
-
-filegroup(
- name = "{data_label}",
- srcs = glob(["data/**"], allow_empty = True),
-)
-
-filegroup(
- name = "{whl_file_label}",
- srcs = ["{whl_name}"],
- data = {whl_file_deps},
- visibility = {impl_vis},
-)
-
-py_library(
- name = "{py_library_label}",
- srcs = glob(
- ["site-packages/**/*.py"],
- exclude={srcs_exclude},
- # Empty sources are allowed to support wheels that don't have any
- # pure-Python code, e.g. pymssql, which is written in Cython.
- allow_empty = True,
- ),
- data = {data} + glob(
- ["site-packages/**/*"],
- exclude={data_exclude},
- ),
- # This makes this directory a top-level in the python import
- # search path for anything that depends on this.
- imports = ["site-packages"],
- deps = {dependencies},
- tags = {tags},
- visibility = {impl_vis},
+whl_library_targets(
+{kwargs}
)
"""
-def _plat_label(plat):
- if plat.endswith("default"):
- return plat
- if plat.startswith("@//"):
- return "@@" + str(Label("//:BUILD.bazel")).partition("//")[0].strip("@") + plat.strip("@")
- elif plat.startswith("@"):
- return str(Label(plat))
- else:
- return ":is_" + plat.replace("cp3", "python_3.")
-
-def _render_list_and_select(deps, deps_by_platform, tmpl):
- deps = render.list([tmpl.format(d) for d in sorted(deps)])
-
- if not deps_by_platform:
- return deps
-
- deps_by_platform = {
- _plat_label(p): [
- tmpl.format(d)
- for d in sorted(deps)
- ]
- for p, deps in sorted(deps_by_platform.items())
- }
-
- # Add the default, which means that we will be just using the dependencies in
- # `deps` for platforms that are not handled in a special way by the packages
- deps_by_platform.setdefault("//conditions:default", [])
- deps_by_platform = render.select(deps_by_platform, value_repr = render.list)
-
- if deps == "[]":
- return deps_by_platform
- else:
- return "{} + {}".format(deps, deps_by_platform)
-
-def _render_config_settings(dependencies_by_platform):
- loads = []
- additional_content = []
- for p in dependencies_by_platform:
- # p can be one of the following formats:
- # * //conditions:default
- # * @platforms//os:{value}
- # * @platforms//cpu:{value}
- # * @//python/config_settings:is_python_3.{minor_version}
- # * {os}_{cpu}
- # * cp3{minor_version}_{os}_{cpu}
- if p.startswith("@") or p.endswith("default"):
- continue
-
- abi, _, tail = p.partition("_")
- if not abi.startswith("cp"):
- tail = p
- abi = ""
-
- os, _, arch = tail.partition("_")
- os = "" if os == "anyos" else os
- arch = "" if arch == "anyarch" else arch
-
- constraint_values = []
- if arch:
- constraint_values.append("@platforms//cpu:{}".format(arch))
- if os:
- constraint_values.append("@platforms//os:{}".format(os))
-
- constraint_values_str = render.indent(render.list(constraint_values)).lstrip()
-
- if abi:
- additional_content.append(
- """\
-config_setting(
- name = "is_{name}",
- flag_values = {{
- "@rules_python//python/config_settings:python_version_major_minor": "3.{minor_version}",
- }},
- constraint_values = {constraint_values},
- visibility = ["//visibility:private"],
-)""".format(
- name = p.replace("cp3", "python_3."),
- minor_version = abi[len("cp3"):],
- constraint_values = constraint_values_str,
- ),
- )
- else:
- additional_content.append(
- """\
-config_setting(
- name = "is_{name}",
- constraint_values = {constraint_values},
- visibility = ["//visibility:private"],
-)""".format(
- name = p.replace("cp3", "python_3."),
- constraint_values = constraint_values_str,
- ),
- )
-
- return loads, "\n\n".join(additional_content)
-
def generate_whl_library_build_bazel(
*,
- dep_template,
- whl_name,
- dependencies,
- dependencies_by_platform,
- data_exclude,
- tags,
- entry_points,
annotation = None,
- group_name = None,
- group_deps = []):
+ **kwargs):
"""Generate a BUILD file for an unzipped Wheel
Args:
- dep_template: the dependency template that should be used for dependency lists.
- whl_name: the whl_name that this is generated for.
- dependencies: a list of PyPI packages that are dependencies to the py_library.
- dependencies_by_platform: a dict[str, list] of PyPI packages that may vary by platform.
- data_exclude: more patterns to exclude from the data attribute of generated py_library rules.
- tags: list of tags to apply to generated py_library rules.
- entry_points: A dict of entry points to add py_binary rules for.
annotation: The annotation for the build file.
- group_name: Optional[str]; name of the dependency group (if any) which contains this library.
- If set, this library will behave as a shim to group implementation rules which will provide
- simultaneously installed dependencies which would otherwise form a cycle.
- group_deps: List[str]; names of fellow members of the group (if any). These will be excluded
- from generated deps lists so as to avoid direct cycles. These dependencies will be provided
- at runtime by the group rules which wrap this library and its fellows together.
+ **kwargs: Extra args serialized to be passed to the
+ {obj}`whl_library_targets`.
Returns:
A complete BUILD file as a string
"""
additional_content = []
- data = []
- srcs_exclude = []
- data_exclude = [] + data_exclude
- dependencies = sorted([normalize_name(d) for d in dependencies])
- dependencies_by_platform = {
- platform: sorted([normalize_name(d) for d in deps])
- for platform, deps in dependencies_by_platform.items()
- }
- tags = sorted(tags)
-
- for entry_point, entry_point_script_name in entry_points.items():
- additional_content.append(
- _generate_entry_point_rule(
- name = "{}_{}".format(WHEEL_ENTRY_POINT_PREFIX, entry_point),
- script = entry_point_script_name,
- pkg = ":" + PY_LIBRARY_PUBLIC_LABEL,
- ),
- )
-
if annotation:
- for src, dest in annotation.copy_files.items():
- data.append(dest)
- additional_content.append(_generate_copy_commands(src, dest))
- for src, dest in annotation.copy_executables.items():
- data.append(dest)
- additional_content.append(
- _generate_copy_commands(src, dest, is_executable = True),
- )
- data.extend(annotation.data)
- data_exclude.extend(annotation.data_exclude_glob)
- srcs_exclude.extend(annotation.srcs_exclude_glob)
+ kwargs["data"] = annotation.data
+ kwargs["copy_files"] = annotation.copy_files
+ kwargs["copy_executables"] = annotation.copy_executables
+ kwargs["data_exclude"] = kwargs.get("data_exclude", []) + annotation.data_exclude_glob
+ kwargs["srcs_exclude"] = annotation.srcs_exclude_glob
if annotation.additive_build_content:
additional_content.append(annotation.additive_build_content)
- _data_exclude = [
- "**/* *",
- "**/*.py",
- "**/*.pyc",
- "**/*.pyc.*", # During pyc creation, temp files named *.pyc.NNNN are created
- # RECORD is known to contain sha256 checksums of files which might include the checksums
- # of generated files produced when wheels are installed. The file is ignored to avoid
- # Bazel caching issues.
- "**/*.dist-info/RECORD",
- ]
- for item in data_exclude:
- if item not in _data_exclude:
- _data_exclude.append(item)
-
- # Ensure this list is normalized
- # Note: mapping used as set
- group_deps = {
- normalize_name(d): True
- for d in group_deps
- }
-
- dependencies = [
- d
- for d in dependencies
- if d not in group_deps
- ]
- dependencies_by_platform = {
- p: deps
- for p, deps in dependencies_by_platform.items()
- for deps in [[d for d in deps if d not in group_deps]]
- if deps
- }
-
- loads = [
- """load("@rules_python//python:defs.bzl", "py_library", "py_binary")""",
- """load("@bazel_skylib//rules:copy_file.bzl", "copy_file")""",
- ]
-
- loads_, config_settings_content = _render_config_settings(dependencies_by_platform)
- if config_settings_content:
- for line in loads_:
- if line not in loads:
- loads.append(line)
- additional_content.append(config_settings_content)
-
- lib_dependencies = _render_list_and_select(
- deps = dependencies,
- deps_by_platform = dependencies_by_platform,
- tmpl = dep_template.format(name = "{}", target = PY_LIBRARY_PUBLIC_LABEL),
- )
-
- whl_file_deps = _render_list_and_select(
- deps = dependencies,
- deps_by_platform = dependencies_by_platform,
- tmpl = dep_template.format(name = "{}", target = WHEEL_FILE_PUBLIC_LABEL),
- )
-
- # If this library is a member of a group, its public label aliases need to
- # point to the group implementation rule not the implementation rules. We
- # also need to mark the implementation rules as visible to the group
- # implementation.
- if group_name and "//:" in dep_template:
- # This is the legacy behaviour where the group library is outside the hub repo
- label_tmpl = dep_template.format(
- name = "_groups",
- target = normalize_name(group_name) + "_{}",
- )
- impl_vis = [dep_template.format(
- name = "_groups",
- target = "__pkg__",
- )]
- additional_content.extend([
- "",
- render.alias(
- name = PY_LIBRARY_PUBLIC_LABEL,
- actual = repr(label_tmpl.format(PY_LIBRARY_PUBLIC_LABEL)),
- ),
- "",
- render.alias(
- name = WHEEL_FILE_PUBLIC_LABEL,
- actual = repr(label_tmpl.format(WHEEL_FILE_PUBLIC_LABEL)),
- ),
- ])
- py_library_label = PY_LIBRARY_IMPL_LABEL
- whl_file_label = WHEEL_FILE_IMPL_LABEL
-
- elif group_name:
- py_library_label = PY_LIBRARY_PUBLIC_LABEL
- whl_file_label = WHEEL_FILE_PUBLIC_LABEL
- impl_vis = [dep_template.format(name = "", target = "__subpackages__")]
-
- else:
- py_library_label = PY_LIBRARY_PUBLIC_LABEL
- whl_file_label = WHEEL_FILE_PUBLIC_LABEL
- impl_vis = ["//visibility:public"]
-
contents = "\n".join(
[
- _BUILD_TEMPLATE.format(
- loads = "\n".join(sorted(loads)),
- py_library_label = py_library_label,
- dependencies = render.indent(lib_dependencies, " " * 4).lstrip(),
- whl_file_deps = render.indent(whl_file_deps, " " * 4).lstrip(),
- data_exclude = repr(_data_exclude),
- whl_name = whl_name,
- whl_file_label = whl_file_label,
- tags = repr(tags),
- data_label = DATA_LABEL,
- dist_info_label = DIST_INFO_LABEL,
- entry_point_prefix = WHEEL_ENTRY_POINT_PREFIX,
- srcs_exclude = repr(srcs_exclude),
- data = repr(data),
- impl_vis = repr(impl_vis),
+ _TEMPLATE.format(
+ kwargs = render.indent("\n".join([
+ "{} = {},".format(k, _RENDER.get(k, repr)(v))
+ for k, v in sorted(kwargs.items())
+ ])),
),
] + additional_content,
)
# NOTE: Ensure that we terminate with a new line
return contents.rstrip() + "\n"
-
-def _generate_copy_commands(src, dest, is_executable = False):
- """Generate a [@bazel_skylib//rules:copy_file.bzl%copy_file][cf] target
-
- [cf]: https://github.com/bazelbuild/bazel-skylib/blob/1.1.1/docs/copy_file_doc.md
-
- Args:
- src (str): The label for the `src` attribute of [copy_file][cf]
- dest (str): The label for the `out` attribute of [copy_file][cf]
- is_executable (bool, optional): Whether or not the file being copied is executable.
- sets `is_executable` for [copy_file][cf]
-
- Returns:
- str: A `copy_file` instantiation.
- """
- return _COPY_FILE_TEMPLATE.format(
- src = src,
- dest = dest,
- is_executable = is_executable,
- )
-
-def _generate_entry_point_rule(*, name, script, pkg):
- """Generate a Bazel `py_binary` rule for an entry point script.
-
- Note that the script is used to determine the name of the target. The name of
- entry point targets should be uniuqe to avoid conflicts with existing sources or
- directories within a wheel.
-
- Args:
- name (str): The name of the generated py_binary.
- script (str): The path to the entry point's python file.
- pkg (str): The package owning the entry point. This is expected to
- match up with the `py_library` defined for each repository.
-
- Returns:
- str: A `py_binary` instantiation.
- """
- return _ENTRY_POINT_RULE_TEMPLATE.format(
- name = name,
- src = script.replace("\\", "/"),
- pkg = pkg,
- )
diff --git a/python/private/pypi/hub_repository.bzl b/python/private/pypi/hub_repository.bzl
index 7afb616..48245b4 100644
--- a/python/private/pypi/hub_repository.bzl
+++ b/python/private/pypi/hub_repository.bzl
@@ -15,11 +15,8 @@
""
load("//python/private:text_util.bzl", "render")
-load(
- ":render_pkg_aliases.bzl",
- "render_multiplatform_pkg_aliases",
- "whl_alias",
-)
+load(":render_pkg_aliases.bzl", "render_multiplatform_pkg_aliases")
+load(":whl_config_setting.bzl", "whl_config_setting")
_BUILD_FILE_CONTENTS = """\
package(default_visibility = ["//visibility:public"])
@@ -32,9 +29,10 @@
bzl_packages = rctx.attr.packages or rctx.attr.whl_map.keys()
aliases = render_multiplatform_pkg_aliases(
aliases = {
- key: [whl_alias(**v) for v in json.decode(values)]
+ key: _whl_config_settings_from_json(values)
for key, values in rctx.attr.whl_map.items()
},
+ extra_hub_aliases = rctx.attr.extra_hub_aliases,
requirement_cycles = rctx.attr.groups,
)
for path, contents in aliases.items():
@@ -65,6 +63,10 @@
hub_repository = repository_rule(
attrs = {
+ "extra_hub_aliases": attr.string_list_dict(
+ doc = "Extra aliases to make for specific wheels in the hub repo.",
+ mandatory = True,
+ ),
"groups": attr.string_list_dict(
mandatory = False,
),
@@ -92,3 +94,45 @@
doc = """A rule for bzlmod mulitple pip repository creation. PRIVATE USE ONLY.""",
implementation = _impl,
)
+
+def _whl_config_settings_from_json(repo_mapping_json):
+ """Deserialize the serialized values with whl_config_settings_to_json.
+
+ Args:
+ repo_mapping_json: {type}`str`
+
+ Returns:
+ What `whl_config_settings_to_json` accepts.
+ """
+ return {
+ whl_config_setting(**v): repo
+ for repo, values in json.decode(repo_mapping_json).items()
+ for v in values
+ }
+
+def whl_config_settings_to_json(repo_mapping):
+ """A function to serialize the aliases so that `hub_repository` can accept them.
+
+ Args:
+ repo_mapping: {type}`dict[str, list[struct]]` repo to
+ {obj}`whl_config_setting` mapping.
+
+ Returns:
+ A deserializable JSON string
+ """
+ return json.encode({
+ repo: [_whl_config_setting_dict(s) for s in settings]
+ for repo, settings in repo_mapping.items()
+ })
+
+def _whl_config_setting_dict(a):
+ ret = {}
+ if a.config_setting:
+ ret["config_setting"] = a.config_setting
+ if a.filename:
+ ret["filename"] = a.filename
+ if a.target_platforms:
+ ret["target_platforms"] = a.target_platforms
+ if a.version:
+ ret["version"] = a.version
+ return ret
diff --git a/python/private/pypi/parse_requirements.bzl b/python/private/pypi/parse_requirements.bzl
index c72f5d4..133ed18 100644
--- a/python/private/pypi/parse_requirements.bzl
+++ b/python/private/pypi/parse_requirements.bzl
@@ -32,13 +32,27 @@
load(":parse_requirements_txt.bzl", "parse_requirements_txt")
load(":whl_target_platforms.bzl", "select_whls")
+def _extract_version(entry):
+ """Extract the version part from the requirement string.
+
+
+ Args:
+ entry: {type}`str` The requirement string.
+ """
+ version_start = entry.find("==")
+ if version_start != -1:
+ # Extract everything after '==' until the next space or end of the string
+ version, _, _ = entry[version_start + 2:].partition(" ")
+ return version
+ return None
+
def parse_requirements(
ctx,
*,
requirements_by_platform = {},
extra_pip_args = [],
get_index_urls = None,
- evaluate_markers = lambda *_: {},
+ evaluate_markers = None,
logger = None):
"""Get the requirements with platforms that the requirements apply to.
@@ -73,6 +87,7 @@
The second element is extra_pip_args should be passed to `whl_library`.
"""
+ evaluate_markers = evaluate_markers or (lambda *_: {})
options = {}
requirements = {}
for file, plats in requirements_by_platform.items():
@@ -91,7 +106,7 @@
# are returned as just the base package name. e.g., `foo[bar]` results
# in an entry like `("foo", "foo[bar] == 1.0 ...")`.
requirements_dict = {
- normalize_name(entry[0]): entry
+ (normalize_name(entry[0]), _extract_version(entry[1])): entry
for entry in sorted(
parse_result.requirements,
# Get the longest match and fallback to original WORKSPACE sorting,
@@ -167,7 +182,7 @@
)
ret = {}
- for whl_name, reqs in requirements_by_platform.items():
+ for whl_name, reqs in sorted(requirements_by_platform.items()):
requirement_target_platforms = {}
for r in reqs.values():
target_platforms = env_marker_target_platforms.get(r.requirement_line, r.target_platforms)
@@ -211,6 +226,8 @@
def select_requirement(requirements, *, platform):
"""A simple function to get a requirement for a particular platform.
+ Only used in WORKSPACE.
+
Args:
requirements (list[struct]): The list of requirements as returned by
the `parse_requirements` function above.
@@ -242,6 +259,8 @@
def host_platform(ctx):
"""Return a string representation of the repository OS.
+ Only used in WORKSPACE.
+
Args:
ctx (struct): The `module_ctx` or `repository_ctx` attribute.
diff --git a/python/private/pypi/patch_whl.bzl b/python/private/pypi/patch_whl.bzl
index 74cd890..a7da224 100644
--- a/python/private/pypi/patch_whl.bzl
+++ b/python/private/pypi/patch_whl.bzl
@@ -32,6 +32,39 @@
_rules_python_root = Label("//:BUILD.bazel")
+def patched_whl_name(original_whl_name):
+ """Return the new filename to output the patched wheel.
+
+ Args:
+ original_whl_name: {type}`str` the whl name of the original file.
+
+ Returns:
+ {type}`str` an output name to write the patched wheel to.
+ """
+ parsed_whl = parse_whl_name(original_whl_name)
+ version = parsed_whl.version
+ suffix = "patched"
+ if "+" in version:
+ # This already has some local version, so we just append one more
+ # identifier here. We comply with the spec and mark the file as patched
+ # by adding a local version identifier at the end.
+ #
+ # By doing this we can still install the package using most of the package
+ # managers
+ #
+ # See https://packaging.python.org/en/latest/specifications/version-specifiers/#local-version-identifiers
+ version = "{}.{}".format(version, suffix)
+ else:
+ version = "{}+{}".format(version, suffix)
+
+ return "{distribution}-{version}-{python_tag}-{abi_tag}-{platform_tag}.whl".format(
+ distribution = parsed_whl.distribution,
+ version = version,
+ python_tag = parsed_whl.python_tag,
+ abi_tag = parsed_whl.abi_tag,
+ platform_tag = parsed_whl.platform_tag,
+ )
+
def patch_whl(rctx, *, python_interpreter, whl_path, patches, **kwargs):
"""Patch a whl file and repack it to ensure that the RECORD metadata stays correct.
@@ -66,18 +99,8 @@
for patch_file, patch_strip in patches.items():
rctx.patch(patch_file, strip = patch_strip)
- # Generate an output filename, which we will be returning
- parsed_whl = parse_whl_name(whl_input.basename)
- whl_patched = "{}.whl".format("-".join([
- parsed_whl.distribution,
- parsed_whl.version,
- (parsed_whl.build_tag or "") + "patched",
- parsed_whl.python_tag,
- parsed_whl.abi_tag,
- parsed_whl.platform_tag,
- ]))
-
record_patch = rctx.path("RECORD.patch")
+ whl_patched = patched_whl_name(whl_input.basename)
repo_utils.execute_checked(
rctx,
diff --git a/python/private/pypi/pip.bzl b/python/private/pypi/pip.bzl
index cb8e111..3ff6b0f 100644
--- a/python/private/pypi/pip.bzl
+++ b/python/private/pypi/pip.bzl
@@ -14,7 +14,6 @@
"pip module extensions for use with bzlmod."
-load("//python/private/pypi:extension.bzl", "pypi", "pypi_internal")
+load("//python/private/pypi:extension.bzl", "pypi")
pip = pypi
-pip_internal = pypi_internal
diff --git a/python/private/pypi/pip_repository.bzl b/python/private/pypi/pip_repository.bzl
index 90cda77..47fa31f 100644
--- a/python/private/pypi/pip_repository.bzl
+++ b/python/private/pypi/pip_repository.bzl
@@ -21,7 +21,7 @@
load(":evaluate_markers.bzl", "evaluate_markers", EVALUATE_MARKERS_SRCS = "SRCS")
load(":parse_requirements.bzl", "host_platform", "parse_requirements", "select_requirement")
load(":pip_repository_attrs.bzl", "ATTRS")
-load(":render_pkg_aliases.bzl", "render_pkg_aliases", "whl_alias")
+load(":render_pkg_aliases.bzl", "render_pkg_aliases")
load(":requirements_files_by_platform.bzl", "requirements_files_by_platform")
def _get_python_interpreter_attr(rctx):
@@ -174,9 +174,10 @@
aliases = render_pkg_aliases(
aliases = {
- pkg: [whl_alias(repo = rctx.attr.name + "_" + pkg)]
+ pkg: rctx.attr.name + "_" + pkg
for pkg in bzl_packages or []
},
+ extra_hub_aliases = rctx.attr.extra_hub_aliases,
)
for path, contents in aliases.items():
rctx.file(path, contents)
diff --git a/python/private/pypi/pkg_aliases.bzl b/python/private/pypi/pkg_aliases.bzl
new file mode 100644
index 0000000..5a3f841
--- /dev/null
+++ b/python/private/pypi/pkg_aliases.bzl
@@ -0,0 +1,404 @@
+# Copyright 2024 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""pkg_aliases is a macro to generate aliases for selecting the right wheel for the right target platform.
+
+This is used in bzlmod and non-bzlmod setups."""
+
+load("@bazel_skylib//lib:selects.bzl", "selects")
+load("//python/private:text_util.bzl", "render")
+load(
+ ":labels.bzl",
+ "DATA_LABEL",
+ "DIST_INFO_LABEL",
+ "PY_LIBRARY_IMPL_LABEL",
+ "PY_LIBRARY_PUBLIC_LABEL",
+ "WHEEL_FILE_IMPL_LABEL",
+ "WHEEL_FILE_PUBLIC_LABEL",
+)
+load(":parse_whl_name.bzl", "parse_whl_name")
+load(":whl_target_platforms.bzl", "whl_target_platforms")
+
+# This value is used as sentinel value in the alias/config setting machinery
+# for libc and osx versions. If we encounter this version in this part of the
+# code, then it means that we have a bug in rules_python and that we should fix
+# it. It is more of an internal consistency check.
+_VERSION_NONE = (0, 0)
+
+_CONFIG_SETTINGS_PKG = str(Label("//python/config_settings:BUILD.bazel")).partition(":")[0]
+
+_NO_MATCH_ERROR_TEMPLATE = """\
+No matching wheel for current configuration's Python version.
+
+The current build configuration's Python version doesn't match any of the Python
+wheels available for this distribution. This distribution supports the following Python
+configuration settings:
+ {config_settings}
+
+To determine the current configuration's Python version, run:
+ `bazel config <config id>` (shown further below)
+
+and look for one of:
+ {settings_pkg}:python_version
+ {settings_pkg}:pip_whl
+ {settings_pkg}:pip_whl_glibc_version
+ {settings_pkg}:pip_whl_muslc_version
+ {settings_pkg}:pip_whl_osx_arch
+ {settings_pkg}:pip_whl_osx_version
+ {settings_pkg}:py_freethreaded
+ {settings_pkg}:py_linux_libc
+
+If the value is missing, then the default value is being used, see documentation:
+{docs_url}/python/config_settings"""
+
+def _no_match_error(actual):
+ if type(actual) != type({}):
+ return None
+
+ if "//conditions:default" in actual:
+ return None
+
+ return _NO_MATCH_ERROR_TEMPLATE.format(
+ config_settings = render.indent(
+ "\n".join(sorted([
+ value
+ for key in actual
+ for value in (key if type(key) == "tuple" else [key])
+ ])),
+ ).lstrip(),
+ settings_pkg = _CONFIG_SETTINGS_PKG,
+ docs_url = "https://rules-python.readthedocs.io/en/latest/api/rules_python",
+ )
+
+def pkg_aliases(
+ *,
+ name,
+ actual,
+ group_name = None,
+ extra_aliases = None,
+ native = native,
+ select = selects.with_or,
+ **kwargs):
+ """Create aliases for an actual package.
+
+ Args:
+ name: {type}`str` The name of the package.
+ actual: {type}`dict[Label | tuple, str] | str` The name of the repo the
+ aliases point to, or a dict of select conditions to repo names for
+ the aliases to point to mapping to repositories. The keys are passed
+ to bazel skylib's `selects.with_or`, so they can be tuples as well.
+ group_name: {type}`str` The group name that the pkg belongs to.
+ extra_aliases: {type}`list[str]` The extra aliases to be created.
+ native: {type}`struct` used in unit tests.
+ select: {type}`select` used in unit tests.
+ **kwargs: extra kwargs to pass to {bzl:obj}`get_filename_config_settings`.
+ """
+ native.alias(
+ name = name,
+ actual = ":" + PY_LIBRARY_PUBLIC_LABEL,
+ )
+
+ target_names = {
+ PY_LIBRARY_PUBLIC_LABEL: PY_LIBRARY_IMPL_LABEL if group_name else PY_LIBRARY_PUBLIC_LABEL,
+ WHEEL_FILE_PUBLIC_LABEL: WHEEL_FILE_IMPL_LABEL if group_name else WHEEL_FILE_PUBLIC_LABEL,
+ DATA_LABEL: DATA_LABEL,
+ DIST_INFO_LABEL: DIST_INFO_LABEL,
+ } | {
+ x: x
+ for x in extra_aliases or []
+ }
+
+ actual = multiplatform_whl_aliases(aliases = actual, **kwargs)
+ no_match_error = _no_match_error(actual)
+
+ for name, target_name in target_names.items():
+ if type(actual) == type(""):
+ _actual = "@{repo}//:{target_name}".format(
+ repo = actual,
+ target_name = name,
+ )
+ elif type(actual) == type({}):
+ _actual = select(
+ {
+ v: "@{repo}//:{target_name}".format(
+ repo = repo,
+ target_name = name,
+ )
+ for v, repo in actual.items()
+ },
+ no_match_error = no_match_error,
+ )
+ else:
+ fail("The `actual` arg must be a dictionary or a string")
+
+ kwargs = {}
+ if target_name.startswith("_"):
+ kwargs["visibility"] = ["//_groups:__subpackages__"]
+
+ native.alias(
+ name = target_name,
+ actual = _actual,
+ **kwargs
+ )
+
+ if group_name:
+ native.alias(
+ name = PY_LIBRARY_PUBLIC_LABEL,
+ actual = "//_groups:{}_pkg".format(group_name),
+ )
+ native.alias(
+ name = WHEEL_FILE_PUBLIC_LABEL,
+ actual = "//_groups:{}_whl".format(group_name),
+ )
+
+def _normalize_versions(name, versions):
+ if not versions:
+ return []
+
+ if _VERSION_NONE in versions:
+ fail("a sentinel version found in '{}', check render_pkg_aliases for bugs".format(name))
+
+ return sorted(versions)
+
+def multiplatform_whl_aliases(
+ *,
+ aliases = [],
+ glibc_versions = [],
+ muslc_versions = [],
+ osx_versions = []):
+ """convert a list of aliases from filename to config_setting ones.
+
+ Args:
+ aliases: {type}`str | dict[whl_config_setting | str, str]`: The aliases
+ to process. Any aliases that have the filename set will be
+ converted to a dict of config settings to repo names.
+ glibc_versions: {type}`list[tuple[int, int]]` list of versions that can be
+ used in this hub repo.
+ muslc_versions: {type}`list[tuple[int, int]]` list of versions that can be
+ used in this hub repo.
+ osx_versions: {type}`list[tuple[int, int]]` list of versions that can be
+ used in this hub repo.
+
+ Returns:
+ A dict with of config setting labels to repo names or the repo name itself.
+ """
+
+ if type(aliases) == type(""):
+ # We don't have any aliases, this is a repo name
+ return aliases
+
+ # TODO @aignas 2024-11-17: we might be able to use FeatureFlagInfo and some
+ # code gen to create a version_lt_x target, which would allow us to check
+ # if the libc version is in a particular range.
+ glibc_versions = _normalize_versions("glibc_versions", glibc_versions)
+ muslc_versions = _normalize_versions("muslc_versions", muslc_versions)
+ osx_versions = _normalize_versions("osx_versions", osx_versions)
+
+ ret = {}
+ versioned_additions = {}
+ for alias, repo in aliases.items():
+ if type(alias) != "struct":
+ ret[alias] = repo
+ continue
+ elif not (alias.filename or alias.target_platforms):
+ # This is an internal consistency check
+ fail("Expected to have either 'filename' or 'target_platforms' set, got: {}".format(alias))
+
+ config_settings, all_versioned_settings = get_filename_config_settings(
+ filename = alias.filename or "",
+ target_platforms = alias.target_platforms,
+ python_version = alias.version,
+ # If we have multiple platforms but no wheel filename, lets use different
+ # config settings.
+ non_whl_prefix = "sdist" if alias.filename else "",
+ glibc_versions = glibc_versions,
+ muslc_versions = muslc_versions,
+ osx_versions = osx_versions,
+ )
+
+ for setting in config_settings:
+ ret["//_config" + setting] = repo
+
+ # Now for the versioned platform config settings, we need to select one
+ # that best fits the bill and if there are multiple wheels, e.g.
+ # manylinux_2_17_x86_64 and manylinux_2_28_x86_64, then we need to select
+ # the former when the glibc is in the range of [2.17, 2.28) and then chose
+ # the later if it is [2.28, ...). If the 2.28 wheel was not present in
+ # the hub, then we would need to use 2.17 for all the glibc version
+ # configurations.
+ #
+ # Here we add the version settings to a dict where we key the range of
+ # versions that the whl spans. If the wheel supports musl and glibc at
+ # the same time, we do this for each supported platform, hence the
+ # double dict.
+ for default_setting, versioned in all_versioned_settings.items():
+ versions = sorted(versioned)
+ min_version = versions[0]
+ max_version = versions[-1]
+
+ versioned_additions.setdefault(default_setting, {})[(min_version, max_version)] = struct(
+ repo = repo,
+ settings = versioned,
+ )
+
+ versioned = {}
+ for default_setting, candidates in versioned_additions.items():
+ # Sort the candidates by the range of versions the span, so that we
+ # start with the lowest version.
+ for _, candidate in sorted(candidates.items()):
+ # Set the default with the first candidate, which gives us the highest
+ # compatibility. If the users want to use a higher-version than the default
+ # they can configure the glibc_version flag.
+ versioned.setdefault("//_config" + default_setting, candidate.repo)
+
+ # We will be overwriting previously added entries, but that is intended.
+ for _, setting in candidate.settings.items():
+ versioned["//_config" + setting] = candidate.repo
+
+ ret.update(versioned)
+ return ret
+
+def get_filename_config_settings(
+ *,
+ filename,
+ target_platforms,
+ python_version,
+ glibc_versions = None,
+ muslc_versions = None,
+ osx_versions = None,
+ non_whl_prefix = "sdist"):
+ """Get the filename config settings.
+
+ Args:
+ filename: the distribution filename (can be a whl or an sdist).
+ target_platforms: list[str], target platforms in "{abi}_{os}_{cpu}" format.
+ glibc_versions: list[tuple[int, int]], list of versions.
+ muslc_versions: list[tuple[int, int]], list of versions.
+ osx_versions: list[tuple[int, int]], list of versions.
+ python_version: the python version to generate the config_settings for.
+ non_whl_prefix: the prefix of the config setting when the whl we don't have
+ a filename ending with ".whl".
+
+ Returns:
+ A tuple:
+ * A list of config settings that are generated by ./pip_config_settings.bzl
+ * The list of default version settings.
+ """
+ prefixes = []
+ suffixes = []
+ setting_supported_versions = {}
+
+ if filename.endswith(".whl"):
+ parsed = parse_whl_name(filename)
+ if parsed.python_tag == "py2.py3":
+ py = "py"
+ elif parsed.python_tag.startswith("cp"):
+ py = "cp3x"
+ else:
+ py = "py3"
+
+ if parsed.abi_tag.startswith("cp"):
+ abi = "cp"
+ else:
+ abi = parsed.abi_tag
+
+ if parsed.platform_tag == "any":
+ prefixes = ["_{}_{}_any".format(py, abi)]
+ else:
+ prefixes = ["_{}_{}".format(py, abi)]
+ suffixes = _whl_config_setting_suffixes(
+ platform_tag = parsed.platform_tag,
+ glibc_versions = glibc_versions,
+ muslc_versions = muslc_versions,
+ osx_versions = osx_versions,
+ setting_supported_versions = setting_supported_versions,
+ )
+ else:
+ prefixes = [""] if not non_whl_prefix else ["_" + non_whl_prefix]
+
+ versioned = {
+ ":is_cp{}{}_{}".format(python_version, p, suffix): {
+ version: ":is_cp{}{}_{}".format(python_version, p, setting)
+ for version, setting in versions.items()
+ }
+ for p in prefixes
+ for suffix, versions in setting_supported_versions.items()
+ }
+
+ if suffixes or target_platforms or versioned:
+ target_platforms = target_platforms or []
+ suffixes = suffixes or [_non_versioned_platform(p) for p in target_platforms]
+ return [
+ ":is_cp{}{}_{}".format(python_version, p, s)
+ for p in prefixes
+ for s in suffixes
+ ], versioned
+ else:
+ return [":is_cp{}{}".format(python_version, p) for p in prefixes], setting_supported_versions
+
+def _whl_config_setting_suffixes(
+ platform_tag,
+ glibc_versions,
+ muslc_versions,
+ osx_versions,
+ setting_supported_versions):
+ suffixes = []
+ for platform_tag in platform_tag.split("."):
+ for p in whl_target_platforms(platform_tag):
+ prefix = p.os
+ suffix = p.cpu
+ if "manylinux" in platform_tag:
+ prefix = "manylinux"
+ versions = glibc_versions
+ elif "musllinux" in platform_tag:
+ prefix = "musllinux"
+ versions = muslc_versions
+ elif p.os in ["linux", "windows"]:
+ versions = [(0, 0)]
+ elif p.os == "osx":
+ versions = osx_versions
+ if "universal2" in platform_tag:
+ suffix += "_universal2"
+ else:
+ fail("Unsupported whl os: {}".format(p.os))
+
+ default_version_setting = "{}_{}".format(prefix, suffix)
+ supported_versions = {}
+ for v in versions:
+ if v == (0, 0):
+ suffixes.append(default_version_setting)
+ elif v >= p.version:
+ supported_versions[v] = "{}_{}_{}_{}".format(
+ prefix,
+ v[0],
+ v[1],
+ suffix,
+ )
+ if supported_versions:
+ setting_supported_versions[default_version_setting] = supported_versions
+
+ return suffixes
+
+def _non_versioned_platform(p, *, strict = False):
+ """A small utility function that converts 'cp311_linux_x86_64' to 'linux_x86_64'.
+
+ This is so that we can tighten the code structure later by using strict = True.
+ """
+ has_abi = p.startswith("cp")
+ if has_abi:
+ return p.partition("_")[-1]
+ elif not strict:
+ return p
+ else:
+ fail("Expected to always have a platform in the form '{{abi}}_{{os}}_{{arch}}', got: {}".format(p))
diff --git a/python/private/pypi/render_pkg_aliases.bzl b/python/private/pypi/render_pkg_aliases.bzl
index 0086bff..62c893d 100644
--- a/python/private/pypi/render_pkg_aliases.bzl
+++ b/python/private/pypi/render_pkg_aliases.bzl
@@ -22,15 +22,6 @@
":generate_group_library_build_bazel.bzl",
"generate_group_library_build_bazel",
) # buildifier: disable=bzl-visibility
-load(
- ":labels.bzl",
- "DATA_LABEL",
- "DIST_INFO_LABEL",
- "PY_LIBRARY_IMPL_LABEL",
- "PY_LIBRARY_PUBLIC_LABEL",
- "WHEEL_FILE_IMPL_LABEL",
- "WHEEL_FILE_PUBLIC_LABEL",
-)
load(":parse_whl_name.bzl", "parse_whl_name")
load(":whl_target_platforms.bzl", "whl_target_platforms")
@@ -53,131 +44,54 @@
which has a "null" version value and will not match version constraints.
"""
-NO_MATCH_ERROR_MESSAGE_TEMPLATE_V2 = """\
-No matching wheel for current configuration's Python version.
+def _repr_dict(*, value_repr = repr, **kwargs):
+ return {k: value_repr(v) for k, v in kwargs.items() if v}
-The current build configuration's Python version doesn't match any of the Python
-wheels available for this wheel. This wheel supports the following Python
-configuration settings:
- {config_settings}
-
-To determine the current configuration's Python version, run:
- `bazel config <config id>` (shown further below)
-and look for
- {rules_python}//python/config_settings:python_version
-
-If the value is missing, then the "default" Python version is being used,
-which has a "null" version value and will not match version constraints.
-"""
-
-def _render_whl_library_alias(
- *,
- name,
- aliases,
- target_name,
- **kwargs):
- """Render an alias for common targets."""
- if len(aliases) == 1 and not aliases[0].version:
- alias = aliases[0]
- return render.alias(
- name = name,
- actual = repr("@{repo}//:{name}".format(
- repo = alias.repo,
- name = target_name,
- )),
- **kwargs
- )
-
- # Create the alias repositories which contains different select
- # statements These select statements point to the different pip
- # whls that are based on a specific version of Python.
- selects = {}
- no_match_error = "_NO_MATCH_ERROR"
- for alias in sorted(aliases, key = lambda x: x.version):
- actual = "@{repo}//:{name}".format(repo = alias.repo, name = target_name)
- selects.setdefault(actual, []).append(alias.config_setting)
-
- return render.alias(
- name = name,
- actual = render.select(
- {
- tuple(sorted(
- conditions,
- # Group `is_python` and other conditions for easier reading
- # when looking at the generated files.
- key = lambda condition: ("is_python" not in condition, condition),
- )): target
- for target, conditions in sorted(selects.items())
- },
- no_match_error = no_match_error,
- # This key_repr is used to render selects.with_or keys
- key_repr = lambda x: repr(x[0]) if len(x) == 1 else render.tuple(x),
- name = "selects.with_or",
- ),
- **kwargs
- )
-
-def _render_common_aliases(*, name, aliases, group_name = None):
- lines = [
- """load("@bazel_skylib//lib:selects.bzl", "selects")""",
- """package(default_visibility = ["//visibility:public"])""",
- ]
-
- config_settings = None
- if aliases:
- config_settings = sorted([v.config_setting for v in aliases if v.config_setting])
-
- if config_settings:
- error_msg = NO_MATCH_ERROR_MESSAGE_TEMPLATE_V2.format(
- config_settings = render.indent(
- "\n".join(config_settings),
- ).lstrip(),
- rules_python = "rules_python",
- )
-
- lines.append("_NO_MATCH_ERROR = \"\"\"\\\n{error_msg}\"\"\"".format(
- error_msg = error_msg,
- ))
-
- lines.append(
- render.alias(
- name = name,
- actual = repr(":pkg"),
- ),
- )
- lines.extend(
- [
- _render_whl_library_alias(
- name = name,
- aliases = aliases,
- target_name = target_name,
- visibility = ["//_groups:__subpackages__"] if name.startswith("_") else None,
+def _repr_config_setting(alias):
+ if alias.filename or alias.target_platforms:
+ return render.call(
+ "whl_config_setting",
+ **_repr_dict(
+ filename = alias.filename,
+ target_platforms = alias.target_platforms,
+ config_setting = alias.config_setting,
+ version = alias.version,
)
- for target_name, name in {
- PY_LIBRARY_PUBLIC_LABEL: PY_LIBRARY_IMPL_LABEL if group_name else PY_LIBRARY_PUBLIC_LABEL,
- WHEEL_FILE_PUBLIC_LABEL: WHEEL_FILE_IMPL_LABEL if group_name else WHEEL_FILE_PUBLIC_LABEL,
- DATA_LABEL: DATA_LABEL,
- DIST_INFO_LABEL: DIST_INFO_LABEL,
- }.items()
- ],
- )
- if group_name:
- lines.extend(
- [
- render.alias(
- name = "pkg",
- actual = repr("//_groups:{}_pkg".format(group_name)),
- ),
- render.alias(
- name = "whl",
- actual = repr("//_groups:{}_whl".format(group_name)),
- ),
- ],
+ )
+ else:
+ return repr(
+ alias.config_setting or ("//_config:is_python_" + alias.version),
)
- return "\n\n".join(lines)
+def _repr_actual(aliases):
+ if type(aliases) == type(""):
+ return repr(aliases)
+ else:
+ return render.dict(aliases, key_repr = _repr_config_setting)
-def render_pkg_aliases(*, aliases, requirement_cycles = None):
+def _render_common_aliases(*, name, aliases, **kwargs):
+ pkg_aliases = render.call(
+ "pkg_aliases",
+ name = repr(name),
+ actual = _repr_actual(aliases),
+ **_repr_dict(**kwargs)
+ )
+ extra_loads = ""
+ if "whl_config_setting" in pkg_aliases:
+ extra_loads = """load("@rules_python//python/private/pypi:whl_config_setting.bzl", "whl_config_setting")"""
+ extra_loads += "\n"
+
+ return """\
+load("@rules_python//python/private/pypi:pkg_aliases.bzl", "pkg_aliases")
+{extra_loads}
+package(default_visibility = ["//visibility:public"])
+
+{aliases}""".format(
+ aliases = pkg_aliases,
+ extra_loads = extra_loads,
+ )
+
+def render_pkg_aliases(*, aliases, requirement_cycles = None, extra_hub_aliases = {}, **kwargs):
"""Create alias declarations for each PyPI package.
The aliases should be appended to the pip_repository BUILD.bazel file. These aliases
@@ -186,8 +100,11 @@
Args:
aliases: dict, the keys are normalized distribution names and values are the
- whl_alias instances.
+ whl_config_setting instances.
requirement_cycles: any package groups to also add.
+ extra_hub_aliases: The list of extra aliases for each whl to be added
+ in addition to the default ones.
+ **kwargs: Extra kwargs to pass to the rules.
Returns:
A dict of file paths and their contents.
@@ -215,7 +132,9 @@
"{}/BUILD.bazel".format(normalize_name(name)): _render_common_aliases(
name = normalize_name(name),
aliases = pkg_aliases,
+ extra_aliases = extra_hub_aliases.get(normalize_name(name), []),
group_name = whl_group_mapping.get(normalize_name(name)),
+ **kwargs
).strip()
for name, pkg_aliases in aliases.items()
}
@@ -224,52 +143,11 @@
files["_groups/BUILD.bazel"] = generate_group_library_build_bazel("", requirement_cycles)
return files
-def whl_alias(*, repo, version = None, config_setting = None, filename = None, target_platforms = None):
- """The bzl_packages value used by by the render_pkg_aliases function.
-
- This contains the minimum amount of information required to generate correct
- aliases in a hub repository.
-
- Args:
- repo: str, the repo of where to find the things to be aliased.
- version: optional(str), the version of the python toolchain that this
- whl alias is for. If not set, then non-version aware aliases will be
- constructed. This is mainly used for better error messages when there
- is no match found during a select.
- config_setting: optional(Label or str), the config setting that we should use. Defaults
- to "//_config:is_python_{version}".
- filename: optional(str), the distribution filename to derive the config_setting.
- target_platforms: optional(list[str]), the list of target_platforms for this
- distribution.
-
- Returns:
- a struct with the validated and parsed values.
- """
- if not repo:
- fail("'repo' must be specified")
-
- if version:
- config_setting = config_setting or ("//_config:is_python_" + version)
- config_setting = str(config_setting)
-
- if target_platforms:
- for p in target_platforms:
- if not p.startswith("cp"):
- fail("target_platform should start with 'cp' denoting the python version, got: " + p)
-
- return struct(
- repo = repo,
- version = version,
- config_setting = config_setting,
- filename = filename,
- target_platforms = target_platforms,
- )
-
def render_multiplatform_pkg_aliases(*, aliases, **kwargs):
"""Render the multi-platform pkg aliases.
Args:
- aliases: dict[str, list(whl_alias)] A list of aliases that will be
+ aliases: dict[str, list(whl_config_setting)] A list of aliases that will be
transformed from ones having `filename` to ones having `config_setting`.
**kwargs: extra arguments passed to render_pkg_aliases.
@@ -278,139 +156,45 @@
"""
flag_versions = get_whl_flag_versions(
- aliases = [
+ settings = [
a
for bunch in aliases.values()
for a in bunch
],
)
- config_setting_aliases = {
- pkg: multiplatform_whl_aliases(
- aliases = pkg_aliases,
- glibc_versions = flag_versions.get("glibc_versions", []),
- muslc_versions = flag_versions.get("muslc_versions", []),
- osx_versions = flag_versions.get("osx_versions", []),
- )
- for pkg, pkg_aliases in aliases.items()
- }
-
contents = render_pkg_aliases(
- aliases = config_setting_aliases,
+ aliases = aliases,
+ glibc_versions = flag_versions.get("glibc_versions", []),
+ muslc_versions = flag_versions.get("muslc_versions", []),
+ osx_versions = flag_versions.get("osx_versions", []),
**kwargs
)
- contents["_config/BUILD.bazel"] = _render_config_settings(**flag_versions)
+ contents["_config/BUILD.bazel"] = _render_config_settings(
+ glibc_versions = flag_versions.get("glibc_versions", []),
+ muslc_versions = flag_versions.get("muslc_versions", []),
+ osx_versions = flag_versions.get("osx_versions", []),
+ python_versions = flag_versions.get("python_versions", []),
+ target_platforms = flag_versions.get("target_platforms", []),
+ visibility = ["//:__subpackages__"],
+ )
return contents
-def multiplatform_whl_aliases(*, aliases, **kwargs):
- """convert a list of aliases from filename to config_setting ones.
-
- Args:
- aliases: list(whl_alias): The aliases to process. Any aliases that have
- the filename set will be converted to a list of aliases, each with
- an appropriate config_setting value.
- **kwargs: Extra parameters passed to get_filename_config_settings.
-
- Returns:
- A dict with aliases to be used in the hub repo.
- """
-
- ret = []
- versioned_additions = {}
- for alias in aliases:
- if not alias.filename:
- ret.append(alias)
- continue
-
- config_settings, all_versioned_settings = get_filename_config_settings(
- # TODO @aignas 2024-05-27: pass the parsed whl to reduce the
- # number of duplicate operations.
- filename = alias.filename,
- target_platforms = alias.target_platforms,
- python_version = alias.version,
- **kwargs
- )
-
- for setting in config_settings:
- ret.append(whl_alias(
- repo = alias.repo,
- version = alias.version,
- config_setting = "//_config" + setting,
- ))
-
- # Now for the versioned platform config settings, we need to select one
- # that best fits the bill and if there are multiple wheels, e.g.
- # manylinux_2_17_x86_64 and manylinux_2_28_x86_64, then we need to select
- # the former when the glibc is in the range of [2.17, 2.28) and then chose
- # the later if it is [2.28, ...). If the 2.28 wheel was not present in
- # the hub, then we would need to use 2.17 for all the glibc version
- # configurations.
- #
- # Here we add the version settings to a dict where we key the range of
- # versions that the whl spans. If the wheel supports musl and glibc at
- # the same time, we do this for each supported platform, hence the
- # double dict.
- for default_setting, versioned in all_versioned_settings.items():
- versions = sorted(versioned)
- min_version = versions[0]
- max_version = versions[-1]
-
- versioned_additions.setdefault(default_setting, {})[(min_version, max_version)] = struct(
- repo = alias.repo,
- python_version = alias.version,
- settings = versioned,
- )
-
- versioned = {}
- for default_setting, candidates in versioned_additions.items():
- # Sort the candidates by the range of versions the span, so that we
- # start with the lowest version.
- for _, candidate in sorted(candidates.items()):
- # Set the default with the first candidate, which gives us the highest
- # compatibility. If the users want to use a higher-version than the default
- # they can configure the glibc_version flag.
- versioned.setdefault(default_setting, whl_alias(
- version = candidate.python_version,
- config_setting = "//_config" + default_setting,
- repo = candidate.repo,
- ))
-
- # We will be overwriting previously added entries, but that is intended.
- for _, setting in sorted(candidate.settings.items()):
- versioned[setting] = whl_alias(
- version = candidate.python_version,
- config_setting = "//_config" + setting,
- repo = candidate.repo,
- )
-
- ret.extend(versioned.values())
- return ret
-
-def _render_config_settings(python_versions = [], target_platforms = [], osx_versions = [], glibc_versions = [], muslc_versions = []):
+def _render_config_settings(**kwargs):
return """\
load("@rules_python//python/private/pypi:config_settings.bzl", "config_settings")
-config_settings(
- name = "config_settings",
- glibc_versions = {glibc_versions},
- muslc_versions = {muslc_versions},
- osx_versions = {osx_versions},
- python_versions = {python_versions},
- target_platforms = {target_platforms},
- visibility = ["//:__subpackages__"],
-)""".format(
- glibc_versions = render.indent(render.list(glibc_versions)).lstrip(),
- muslc_versions = render.indent(render.list(muslc_versions)).lstrip(),
- osx_versions = render.indent(render.list(osx_versions)).lstrip(),
- python_versions = render.indent(render.list(python_versions)).lstrip(),
- target_platforms = render.indent(render.list(target_platforms)).lstrip(),
- )
+{}""".format(render.call(
+ "config_settings",
+ name = repr("config_settings"),
+ **_repr_dict(value_repr = render.list, **kwargs)
+ ))
-def get_whl_flag_versions(aliases):
- """Return all of the flag versions that is used by the aliases
+def get_whl_flag_versions(settings):
+ """Return all of the flag versions that is used by the settings
Args:
- aliases: list[whl_alias]
+ settings: list[whl_config_setting]
Returns:
dict, which may have keys:
@@ -422,20 +206,17 @@
muslc_versions = {}
osx_versions = {}
- for a in aliases:
- if not a.version and not a.filename:
+ for setting in settings:
+ if not setting.version and not setting.filename:
continue
- if a.version:
- python_versions[a.version] = None
+ if setting.version:
+ python_versions[setting.version] = None
- if not a.filename:
- continue
-
- if a.filename.endswith(".whl") and not a.filename.endswith("-any.whl"):
- parsed = parse_whl_name(a.filename)
+ if setting.filename and setting.filename.endswith(".whl") and not setting.filename.endswith("-any.whl"):
+ parsed = parse_whl_name(setting.filename)
else:
- for plat in a.target_platforms or []:
+ for plat in setting.target_platforms or []:
target_platforms[_non_versioned_platform(plat)] = None
continue
@@ -486,127 +267,3 @@
return p
else:
fail("Expected to always have a platform in the form '{{abi}}_{{os}}_{{arch}}', got: {}".format(p))
-
-def get_filename_config_settings(
- *,
- filename,
- target_platforms,
- glibc_versions,
- muslc_versions,
- osx_versions,
- python_version):
- """Get the filename config settings.
-
- Args:
- filename: the distribution filename (can be a whl or an sdist).
- target_platforms: list[str], target platforms in "{abi}_{os}_{cpu}" format.
- glibc_versions: list[tuple[int, int]], list of versions.
- muslc_versions: list[tuple[int, int]], list of versions.
- osx_versions: list[tuple[int, int]], list of versions.
- python_version: the python version to generate the config_settings for.
-
- Returns:
- A tuple:
- * A list of config settings that are generated by ./pip_config_settings.bzl
- * The list of default version settings.
- """
- prefixes = []
- suffixes = []
- if (0, 0) in glibc_versions:
- fail("Invalid version in 'glibc_versions': cannot specify (0, 0) as a value")
- if (0, 0) in muslc_versions:
- fail("Invalid version in 'muslc_versions': cannot specify (0, 0) as a value")
- if (0, 0) in osx_versions:
- fail("Invalid version in 'osx_versions': cannot specify (0, 0) as a value")
-
- glibc_versions = sorted(glibc_versions)
- muslc_versions = sorted(muslc_versions)
- osx_versions = sorted(osx_versions)
- setting_supported_versions = {}
-
- if filename.endswith(".whl"):
- parsed = parse_whl_name(filename)
- if parsed.python_tag == "py2.py3":
- py = "py"
- elif parsed.python_tag.startswith("cp"):
- py = "cp3x"
- else:
- py = "py3"
-
- if parsed.abi_tag.startswith("cp"):
- abi = "cp"
- else:
- abi = parsed.abi_tag
-
- if parsed.platform_tag == "any":
- prefixes = ["{}_{}_any".format(py, abi)]
- suffixes = [_non_versioned_platform(p) for p in target_platforms or []]
- else:
- prefixes = ["{}_{}".format(py, abi)]
- suffixes = _whl_config_setting_suffixes(
- platform_tag = parsed.platform_tag,
- glibc_versions = glibc_versions,
- muslc_versions = muslc_versions,
- osx_versions = osx_versions,
- setting_supported_versions = setting_supported_versions,
- )
- else:
- prefixes = ["sdist"]
- suffixes = [_non_versioned_platform(p) for p in target_platforms or []]
-
- versioned = {
- ":is_cp{}_{}_{}".format(python_version, p, suffix): {
- version: ":is_cp{}_{}_{}".format(python_version, p, setting)
- for version, setting in versions.items()
- }
- for p in prefixes
- for suffix, versions in setting_supported_versions.items()
- }
-
- if suffixes or versioned:
- return [":is_cp{}_{}_{}".format(python_version, p, s) for p in prefixes for s in suffixes], versioned
- else:
- return [":is_cp{}_{}".format(python_version, p) for p in prefixes], setting_supported_versions
-
-def _whl_config_setting_suffixes(
- platform_tag,
- glibc_versions,
- muslc_versions,
- osx_versions,
- setting_supported_versions):
- suffixes = []
- for platform_tag in platform_tag.split("."):
- for p in whl_target_platforms(platform_tag):
- prefix = p.os
- suffix = p.cpu
- if "manylinux" in platform_tag:
- prefix = "manylinux"
- versions = glibc_versions
- elif "musllinux" in platform_tag:
- prefix = "musllinux"
- versions = muslc_versions
- elif p.os in ["linux", "windows"]:
- versions = [(0, 0)]
- elif p.os == "osx":
- versions = osx_versions
- if "universal2" in platform_tag:
- suffix += "_universal2"
- else:
- fail("Unsupported whl os: {}".format(p.os))
-
- default_version_setting = "{}_{}".format(prefix, suffix)
- supported_versions = {}
- for v in versions:
- if v == (0, 0):
- suffixes.append(default_version_setting)
- elif v >= p.version:
- supported_versions[v] = "{}_{}_{}_{}".format(
- prefix,
- v[0],
- v[1],
- suffix,
- )
- if supported_versions:
- setting_supported_versions[default_version_setting] = supported_versions
-
- return suffixes
diff --git a/python/private/pypi/whl_config_setting.bzl b/python/private/pypi/whl_config_setting.bzl
new file mode 100644
index 0000000..d966206
--- /dev/null
+++ b/python/private/pypi/whl_config_setting.bzl
@@ -0,0 +1,48 @@
+# Copyright 2024 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"A small function to create an alias for a whl distribution"
+
+def whl_config_setting(*, version = None, config_setting = None, filename = None, target_platforms = None):
+ """The bzl_packages value used by by the render_pkg_aliases function.
+
+ This contains the minimum amount of information required to generate correct
+ aliases in a hub repository.
+
+ Args:
+ version: optional(str), the version of the python toolchain that this
+ whl alias is for. If not set, then non-version aware aliases will be
+ constructed. This is mainly used for better error messages when there
+ is no match found during a select.
+ config_setting: optional(Label or str), the config setting that we should use. Defaults
+ to "//_config:is_python_{version}".
+ filename: optional(str), the distribution filename to derive the config_setting.
+ target_platforms: optional(list[str]), the list of target_platforms for this
+ distribution.
+
+ Returns:
+ a struct with the validated and parsed values.
+ """
+ if target_platforms:
+ for p in target_platforms:
+ if not p.startswith("cp"):
+ fail("target_platform should start with 'cp' denoting the python version, got: " + p)
+
+ return struct(
+ config_setting = config_setting,
+ filename = filename,
+ # Make the struct hashable
+ target_platforms = tuple(target_platforms) if target_platforms else None,
+ version = version,
+ )
diff --git a/python/private/pypi/whl_library.bzl b/python/private/pypi/whl_library.bzl
index 82fe072..612ca2c 100644
--- a/python/private/pypi/whl_library.bzl
+++ b/python/private/pypi/whl_library.bzl
@@ -230,7 +230,7 @@
# and, allow getting build dependencies from PYTHONPATH, which we
# setup in this repository rule, but still download any necessary
# build deps from PyPI (e.g. `flit_core`) if they are missing.
- extra_pip_args.extend(["--no-build-isolation", "--find-links", "."])
+ extra_pip_args.extend(["--find-links", "."])
args = _parse_optional_attrs(rctx, args, extra_pip_args)
@@ -332,8 +332,8 @@
entry_points[entry_point_without_py] = entry_point_script_name
build_file_contents = generate_whl_library_build_bazel(
+ name = whl_path.basename,
dep_template = rctx.attr.dep_template or "@{}{{name}}//:{{target}}".format(rctx.attr.repo_prefix),
- whl_name = whl_path.basename,
dependencies = metadata["deps"],
dependencies_by_platform = metadata["deps_by_platform"],
group_name = rctx.attr.group_name,
diff --git a/python/private/pypi/whl_library_targets.bzl b/python/private/pypi/whl_library_targets.bzl
new file mode 100644
index 0000000..a303bdc
--- /dev/null
+++ b/python/private/pypi/whl_library_targets.bzl
@@ -0,0 +1,343 @@
+# Copyright 2024 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Macro to generate all of the targets present in a {obj}`whl_library`."""
+
+load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
+load("//python:py_binary.bzl", "py_binary")
+load("//python:py_library.bzl", "py_library")
+load("//python/private:glob_excludes.bzl", "glob_excludes")
+load("//python/private:normalize_name.bzl", "normalize_name")
+load(
+ ":labels.bzl",
+ "DATA_LABEL",
+ "DIST_INFO_LABEL",
+ "PY_LIBRARY_IMPL_LABEL",
+ "PY_LIBRARY_PUBLIC_LABEL",
+ "WHEEL_ENTRY_POINT_PREFIX",
+ "WHEEL_FILE_IMPL_LABEL",
+ "WHEEL_FILE_PUBLIC_LABEL",
+)
+
+def whl_library_targets(
+ *,
+ name,
+ dep_template,
+ data_exclude = [],
+ srcs_exclude = [],
+ tags = [],
+ filegroups = {
+ DIST_INFO_LABEL: ["site-packages/*.dist-info/**"],
+ DATA_LABEL: ["data/**"],
+ },
+ dependencies = [],
+ dependencies_by_platform = {},
+ group_deps = [],
+ group_name = "",
+ data = [],
+ copy_files = {},
+ copy_executables = {},
+ entry_points = {},
+ native = native,
+ rules = struct(
+ copy_file = copy_file,
+ py_binary = py_binary,
+ py_library = py_library,
+ )):
+ """Create all of the whl_library targets.
+
+ Args:
+ name: {type}`str` The file to match for including it into the `whl`
+ filegroup. This may be also parsed to generate extra metadata.
+ dep_template: {type}`str` The dep_template to use for dependency
+ interpolation.
+ tags: {type}`list[str]` The tags set on the `py_library`.
+ dependencies: {type}`list[str]` A list of dependencies.
+ dependencies_by_platform: {type}`dict[str, list[str]]` A list of
+ dependencies by platform key.
+ filegroups: {type}`dict[str, list[str]]` A dictionary of the target
+ names and the glob matches.
+ group_name: {type}`str` name of the dependency group (if any) which
+ contains this library. If set, this library will behave as a shim
+ to group implementation rules which will provide simultaneously
+ installed dependencies which would otherwise form a cycle.
+ group_deps: {type}`list[str]` names of fellow members of the group (if
+ any). These will be excluded from generated deps lists so as to avoid
+ direct cycles. These dependencies will be provided at runtime by the
+ group rules which wrap this library and its fellows together.
+ copy_executables: {type}`dict[str, str]` The mapping between src and
+ dest locations for the targets.
+ copy_files: {type}`dict[str, str]` The mapping between src and
+ dest locations for the targets.
+ data_exclude: {type}`list[str]` The globs for data attribute exclusion
+ in `py_library`.
+ srcs_exclude: {type}`list[str]` The globs for srcs attribute exclusion
+ in `py_library`.
+ data: {type}`list[str]` A list of labels to include as part of the `data` attribute in `py_library`.
+ entry_points: {type}`dict[str, str]` The mapping between the script
+ name and the python file to use. DEPRECATED.
+ native: {type}`native` The native struct for overriding in tests.
+ rules: {type}`struct` A struct with references to rules for creating targets.
+ """
+ _ = name # buildifier: @unused
+
+ dependencies = sorted([normalize_name(d) for d in dependencies])
+ dependencies_by_platform = {
+ platform: sorted([normalize_name(d) for d in deps])
+ for platform, deps in dependencies_by_platform.items()
+ }
+ tags = sorted(tags)
+ data = [] + data
+
+ for filegroup_name, glob in filegroups.items():
+ native.filegroup(
+ name = filegroup_name,
+ srcs = native.glob(glob, allow_empty = True),
+ visibility = ["//visibility:public"],
+ )
+
+ for src, dest in copy_files.items():
+ rules.copy_file(
+ name = dest + ".copy",
+ src = src,
+ out = dest,
+ visibility = ["//visibility:public"],
+ )
+ data.append(dest)
+ for src, dest in copy_executables.items():
+ rules.copy_file(
+ name = dest + ".copy",
+ src = src,
+ out = dest,
+ is_executable = True,
+ visibility = ["//visibility:public"],
+ )
+ data.append(dest)
+
+ _config_settings(
+ dependencies_by_platform.keys(),
+ native = native,
+ visibility = ["//visibility:private"],
+ )
+
+ # TODO @aignas 2024-10-25: remove the entry_point generation once
+ # `py_console_script_binary` is the only way to use entry points.
+ for entry_point, entry_point_script_name in entry_points.items():
+ rules.py_binary(
+ name = "{}_{}".format(WHEEL_ENTRY_POINT_PREFIX, entry_point),
+ # Ensure that this works on Windows as well - script may have Windows path separators.
+ srcs = [entry_point_script_name.replace("\\", "/")],
+ # This makes this directory a top-level in the python import
+ # search path for anything that depends on this.
+ imports = ["."],
+ deps = [":" + PY_LIBRARY_PUBLIC_LABEL],
+ visibility = ["//visibility:public"],
+ )
+
+ # Ensure this list is normalized
+ # Note: mapping used as set
+ group_deps = {
+ normalize_name(d): True
+ for d in group_deps
+ }
+
+ dependencies = [
+ d
+ for d in dependencies
+ if d not in group_deps
+ ]
+ dependencies_by_platform = {
+ p: deps
+ for p, deps in dependencies_by_platform.items()
+ for deps in [[d for d in deps if d not in group_deps]]
+ if deps
+ }
+
+ # If this library is a member of a group, its public label aliases need to
+ # point to the group implementation rule not the implementation rules. We
+ # also need to mark the implementation rules as visible to the group
+ # implementation.
+ if group_name and "//:" in dep_template:
+ # This is the legacy behaviour where the group library is outside the hub repo
+ label_tmpl = dep_template.format(
+ name = "_groups",
+ target = normalize_name(group_name) + "_{}",
+ )
+ impl_vis = [dep_template.format(
+ name = "_groups",
+ target = "__pkg__",
+ )]
+
+ native.alias(
+ name = PY_LIBRARY_PUBLIC_LABEL,
+ actual = label_tmpl.format(PY_LIBRARY_PUBLIC_LABEL),
+ visibility = ["//visibility:public"],
+ )
+ native.alias(
+ name = WHEEL_FILE_PUBLIC_LABEL,
+ actual = label_tmpl.format(WHEEL_FILE_PUBLIC_LABEL),
+ visibility = ["//visibility:public"],
+ )
+ py_library_label = PY_LIBRARY_IMPL_LABEL
+ whl_file_label = WHEEL_FILE_IMPL_LABEL
+
+ elif group_name:
+ py_library_label = PY_LIBRARY_PUBLIC_LABEL
+ whl_file_label = WHEEL_FILE_PUBLIC_LABEL
+ impl_vis = [dep_template.format(name = "", target = "__subpackages__")]
+
+ else:
+ py_library_label = PY_LIBRARY_PUBLIC_LABEL
+ whl_file_label = WHEEL_FILE_PUBLIC_LABEL
+ impl_vis = ["//visibility:public"]
+
+ if hasattr(native, "filegroup"):
+ native.filegroup(
+ name = whl_file_label,
+ srcs = [name],
+ data = _deps(
+ deps = dependencies,
+ deps_by_platform = dependencies_by_platform,
+ tmpl = dep_template.format(name = "{}", target = WHEEL_FILE_PUBLIC_LABEL),
+ # NOTE @aignas 2024-10-28: Actually, `select` is not part of
+ # `native`, but in order to support bazel 6.4 in unit tests, I
+ # have to somehow pass the `select` implementation in the unit
+ # tests and I chose this to be routed through the `native`
+ # struct. So, tests` will be successful in `getattr` and the
+ # real code will use the fallback provided here.
+ select = getattr(native, "select", select),
+ ),
+ visibility = impl_vis,
+ )
+
+ if hasattr(rules, "py_library"):
+ _data_exclude = [
+ "**/*.py",
+ "**/*.pyc",
+ "**/*.pyc.*", # During pyc creation, temp files named *.pyc.NNNN are created
+ # RECORD is known to contain sha256 checksums of files which might include the checksums
+ # of generated files produced when wheels are installed. The file is ignored to avoid
+ # Bazel caching issues.
+ "**/*.dist-info/RECORD",
+ ] + glob_excludes.version_dependent_exclusions()
+ for item in data_exclude:
+ if item not in _data_exclude:
+ _data_exclude.append(item)
+
+ rules.py_library(
+ name = py_library_label,
+ srcs = native.glob(
+ ["site-packages/**/*.py"],
+ exclude = srcs_exclude,
+ # Empty sources are allowed to support wheels that don't have any
+ # pure-Python code, e.g. pymssql, which is written in Cython.
+ allow_empty = True,
+ ),
+ data = data + native.glob(
+ ["site-packages/**/*"],
+ exclude = _data_exclude,
+ ),
+ # This makes this directory a top-level in the python import
+ # search path for anything that depends on this.
+ imports = ["site-packages"],
+ deps = _deps(
+ deps = dependencies,
+ deps_by_platform = dependencies_by_platform,
+ tmpl = dep_template.format(name = "{}", target = PY_LIBRARY_PUBLIC_LABEL),
+ select = getattr(native, "select", select),
+ ),
+ tags = tags,
+ visibility = impl_vis,
+ )
+
+def _config_settings(dependencies_by_platform, native = native, **kwargs):
+ """Generate config settings for the targets.
+
+ Args:
+ dependencies_by_platform: {type}`list[str]` platform keys, can be
+ one of the following formats:
+ * `//conditions:default`
+ * `@platforms//os:{value}`
+ * `@platforms//cpu:{value}`
+ * `@//python/config_settings:is_python_3.{minor_version}`
+ * `{os}_{cpu}`
+ * `cp3{minor_version}_{os}_{cpu}`
+ native: {type}`native` The native struct for overriding in tests.
+ **kwargs: Extra kwargs to pass to the rule.
+ """
+ for p in dependencies_by_platform:
+ if p.startswith("@") or p.endswith("default"):
+ continue
+
+ abi, _, tail = p.partition("_")
+ if not abi.startswith("cp"):
+ tail = p
+ abi = ""
+
+ os, _, arch = tail.partition("_")
+ os = "" if os == "anyos" else os
+ arch = "" if arch == "anyarch" else arch
+
+ _kwargs = dict(kwargs)
+ if arch:
+ _kwargs.setdefault("constraint_values", []).append("@platforms//cpu:{}".format(arch))
+ if os:
+ _kwargs.setdefault("constraint_values", []).append("@platforms//os:{}".format(os))
+
+ if abi:
+ _kwargs["flag_values"] = {
+ "@rules_python//python/config_settings:python_version_major_minor": "3.{minor_version}".format(
+ minor_version = abi[len("cp3"):],
+ ),
+ }
+
+ native.config_setting(
+ name = "is_{name}".format(
+ name = p.replace("cp3", "python_3."),
+ ),
+ **_kwargs
+ )
+
+def _plat_label(plat):
+ if plat.endswith("default"):
+ return plat
+ elif plat.startswith("@//"):
+ return Label(plat.strip("@"))
+ elif plat.startswith("@"):
+ return plat
+ else:
+ return ":is_" + plat.replace("cp3", "python_3.")
+
+def _deps(deps, deps_by_platform, tmpl, select = select):
+ deps = [tmpl.format(d) for d in sorted(deps)]
+
+ if not deps_by_platform:
+ return deps
+
+ deps_by_platform = {
+ _plat_label(p): [
+ tmpl.format(d)
+ for d in sorted(deps)
+ ]
+ for p, deps in sorted(deps_by_platform.items())
+ }
+
+ # Add the default, which means that we will be just using the dependencies in
+ # `deps` for platforms that are not handled in a special way by the packages
+ deps_by_platform.setdefault("//conditions:default", [])
+
+ if not deps:
+ return select(deps_by_platform)
+ else:
+ return deps + select(deps_by_platform)
diff --git a/python/private/pypi/whl_repo_name.bzl b/python/private/pypi/whl_repo_name.bzl
index 295f5a4..38ed600 100644
--- a/python/private/pypi/whl_repo_name.bzl
+++ b/python/private/pypi/whl_repo_name.bzl
@@ -22,12 +22,12 @@
"""Return a valid whl_library repo name given a distribution filename.
Args:
- prefix: str, the prefix of the whl_library.
- filename: str, the filename of the distribution.
- sha256: str, the sha256 of the distribution.
+ prefix: {type}`str` the prefix of the whl_library.
+ filename: {type}`str` the filename of the distribution.
+ sha256: {type}`str` the sha256 of the distribution.
Returns:
- a string that can be used in `whl_library`.
+ a string that can be used in {obj}`whl_library`.
"""
parts = [prefix]
@@ -50,3 +50,22 @@
parts.append(sha256[:8])
return "_".join(parts)
+
+def pypi_repo_name(prefix, whl_name, *target_platforms):
+ """Return a valid whl_library given a requirement line.
+
+ Args:
+ prefix: {type}`str` the prefix of the whl_library.
+ whl_name: {type}`str` the whl_name to use.
+ *target_platforms: {type}`list[str]` the target platforms to use in the name.
+
+ Returns:
+ {type}`str` that can be used in {obj}`whl_library`.
+ """
+ parts = [
+ prefix,
+ normalize_name(whl_name),
+ ]
+ parts.extend([p.partition("_")[-1] for p in target_platforms])
+
+ return "_".join(parts)
diff --git a/python/private/python.bzl b/python/private/python.bzl
index 12ab4bb..ec6f73e 100644
--- a/python/private/python.bzl
+++ b/python/private/python.bzl
@@ -213,6 +213,7 @@
def _python_impl(module_ctx):
py = parse_modules(module_ctx = module_ctx)
+ loaded_platforms = {}
for toolchain_info in py.toolchains:
# Ensure that we pass the full version here.
full_python_version = full_version(
@@ -228,7 +229,7 @@
kwargs.update(py.config.kwargs.get(toolchain_info.python_version, {}))
kwargs.update(py.config.kwargs.get(full_python_version, {}))
kwargs.update(py.config.default)
- python_register_toolchains(
+ loaded_platforms[full_python_version] = python_register_toolchains(
name = toolchain_info.name,
_internal_bzlmod_toolchain_call = True,
**kwargs
@@ -241,6 +242,7 @@
# Last toolchain is default
default_python_version = py.default_python_version,
minor_mapping = py.config.minor_mapping,
+ python_versions = list(py.config.default["tool_versions"].keys()),
toolchain_prefixes = [
render.toolchain_prefix(index, toolchain.name, _TOOLCHAIN_INDEX_PAD_LENGTH)
for index, toolchain in enumerate(py.toolchains)
@@ -256,6 +258,7 @@
for i in range(len(py.toolchains))
],
toolchain_user_repository_names = [t.name for t in py.toolchains],
+ loaded_platforms = loaded_platforms,
)
# This is require in order to support multiple version py_test
@@ -459,11 +462,11 @@
"strip_prefix": {
platform: item["strip_prefix"]
for platform in item["sha256"]
- },
+ } if type(item["strip_prefix"]) == type("") else item["strip_prefix"],
"url": {
platform: [item["url"]]
for platform in item["sha256"]
- },
+ } if type(item["url"]) == type("") else item["url"],
}
for version, item in TOOL_VERSIONS.items()
}
diff --git a/python/private/python_register_toolchains.bzl b/python/private/python_register_toolchains.bzl
index 64b66d5..cd3e9cb 100644
--- a/python/private/python_register_toolchains.bzl
+++ b/python/private/python_register_toolchains.bzl
@@ -73,6 +73,9 @@
minor_mapping: {type}`dict[str, str]` contains a mapping from `X.Y` to `X.Y.Z`
version.
**kwargs: passed to each {obj}`python_repository` call.
+
+ Returns:
+ On bzlmod this returns the loaded platform labels. Otherwise None.
"""
bzlmod_toolchain_call = kwargs.pop("_internal_bzlmod_toolchain_call", False)
if bzlmod_toolchain_call:
@@ -157,7 +160,11 @@
platform = platform,
))
- host_toolchain(name = name + "_host")
+ host_toolchain(
+ name = name + "_host",
+ platforms = loaded_platforms,
+ python_version = python_version,
+ )
toolchain_aliases(
name = name,
@@ -168,11 +175,13 @@
# in bzlmod we write out our own toolchain repos
if bzlmod_toolchain_call:
- return
+ return loaded_platforms
toolchains_repo(
name = toolchain_repo_name,
python_version = python_version,
set_python_version_constraint = set_python_version_constraint,
user_repository_name = name,
+ platforms = loaded_platforms,
)
+ return None
diff --git a/python/private/python_repository.bzl b/python/private/python_repository.bzl
index e44bdd1..c7407c8 100644
--- a/python/private/python_repository.bzl
+++ b/python/private/python_repository.bzl
@@ -15,7 +15,7 @@
"""This file contains repository rules and macros to support toolchain registration.
"""
-load("//python:versions.bzl", "PLATFORMS")
+load("//python:versions.bzl", "FREETHREADED", "INSTALL_ONLY", "PLATFORMS")
load(":auth.bzl", "get_auth")
load(":repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils")
load(":text_util.bzl", "render")
@@ -63,56 +63,22 @@
platform = rctx.attr.platform
python_version = rctx.attr.python_version
python_version_info = python_version.split(".")
- python_short_version = "{0}.{1}".format(*python_version_info)
release_filename = rctx.attr.release_filename
+ version_suffix = "t" if FREETHREADED in release_filename else ""
+ python_short_version = "{0}.{1}{suffix}".format(
+ suffix = version_suffix,
+ *python_version_info
+ )
urls = rctx.attr.urls or [rctx.attr.url]
auth = get_auth(rctx, urls)
- if release_filename.endswith(".zst"):
- rctx.download(
+ if INSTALL_ONLY in release_filename:
+ rctx.download_and_extract(
url = urls,
sha256 = rctx.attr.sha256,
- output = release_filename,
+ stripPrefix = rctx.attr.strip_prefix,
auth = auth,
)
- unzstd = rctx.which("unzstd")
- if not unzstd:
- url = rctx.attr.zstd_url.format(version = rctx.attr.zstd_version)
- rctx.download_and_extract(
- url = url,
- sha256 = rctx.attr.zstd_sha256,
- auth = auth,
- )
- working_directory = "zstd-{version}".format(version = rctx.attr.zstd_version)
-
- repo_utils.execute_checked(
- rctx,
- op = "python_repository.MakeZstd",
- arguments = [
- repo_utils.which_checked(rctx, "make"),
- "--jobs=4",
- ],
- timeout = 600,
- quiet = True,
- working_directory = working_directory,
- logger = logger,
- )
- zstd = "{working_directory}/zstd".format(working_directory = working_directory)
- unzstd = "./unzstd"
- rctx.symlink(zstd, unzstd)
-
- repo_utils.execute_checked(
- rctx,
- op = "python_repository.ExtractRuntime",
- arguments = [
- repo_utils.which_checked(rctx, "tar"),
- "--extract",
- "--strip-components=2",
- "--use-compress-program={unzstd}".format(unzstd = unzstd),
- "--file={}".format(release_filename),
- ],
- logger = logger,
- )
else:
rctx.download_and_extract(
url = urls,
@@ -121,6 +87,12 @@
auth = auth,
)
+ # Strip the things that are not present in the INSTALL_ONLY builds
+ # NOTE: if the dirs are not present, we will not fail here
+ rctx.delete("python/build")
+ rctx.delete("python/licenses")
+ rctx.delete("python/PYTHON.json")
+
patches = rctx.attr.patches
if patches:
for patch in patches:
@@ -374,15 +346,6 @@
"urls": attr.string_list(
doc = "The URL of the interpreter to download. Exactly one of url and urls must be set.",
),
- "zstd_sha256": attr.string(
- default = "7c42d56fac126929a6a85dbc73ff1db2411d04f104fae9bdea51305663a83fd0",
- ),
- "zstd_url": attr.string(
- default = "https://github.com/facebook/zstd/releases/download/v{version}/zstd-{version}.tar.gz",
- ),
- "zstd_version": attr.string(
- default = "1.5.2",
- ),
"_rule_name": attr.string(default = "python_repository"),
},
environ = [REPO_DEBUG_ENV_VAR],
diff --git a/python/private/pythons_hub.bzl b/python/private/pythons_hub.bzl
index fdaad60..ac928ff 100644
--- a/python/private/pythons_hub.bzl
+++ b/python/private/pythons_hub.bzl
@@ -14,6 +14,7 @@
"Repo rule used by bzlmod extension to create a repo that has a map of Python interpreters and their labels"
+load("//python:versions.bzl", "PLATFORMS")
load(":text_util.bzl", "render")
load(":toolchains_repo.bzl", "python_toolchain_build_file_content")
@@ -46,7 +47,8 @@
python_versions,
set_python_version_constraints,
user_repository_names,
- workspace_location):
+ workspace_location,
+ loaded_platforms):
"""This macro iterates over each of the lists and returns the toolchain content.
python_toolchain_build_file_content is called to generate each of the toolchain
@@ -65,6 +67,11 @@
python_version = python_versions[i],
set_python_version_constraint = set_python_version_constraints[i],
user_repository_name = user_repository_names[i],
+ loaded_platforms = {
+ k: v
+ for k, v in PLATFORMS.items()
+ if k in loaded_platforms[python_versions[i]]
+ },
)
for i in range(len(python_versions))
],
@@ -79,7 +86,6 @@
INTERPRETER_LABELS = {{
{interpreter_labels}
}}
-DEFAULT_PYTHON_VERSION = "{default_python_version}"
"""
_line_for_hub_template = """\
@@ -103,6 +109,7 @@
rctx.attr.toolchain_set_python_version_constraints,
rctx.attr.toolchain_user_repository_names,
rctx.attr._rules_python_workspace,
+ rctx.attr.loaded_platforms,
),
executable = False,
)
@@ -117,8 +124,6 @@
rctx.file(
"interpreters.bzl",
_interpreters_bzl_template.format(
- # TODO @aignas 2024-09-28: before 1.0 remove the value from here
- default_python_version = rctx.attr.default_python_version,
interpreter_labels = interpreter_labels,
),
executable = False,
@@ -149,6 +154,9 @@
doc = "Default Python version for the build in `X.Y` or `X.Y.Z` format.",
mandatory = True,
),
+ "loaded_platforms": attr.string_list_dict(
+ doc = "The list of loaded platforms keyed by the toolchain full python version",
+ ),
"minor_mapping": attr.string_dict(
doc = "The minor mapping of the `X.Y` to `X.Y.Z` format that is used in config settings.",
mandatory = True,
diff --git a/python/private/repo_utils.bzl b/python/private/repo_utils.bzl
index e0bf69a..0e3f7b0 100644
--- a/python/private/repo_utils.bzl
+++ b/python/private/repo_utils.bzl
@@ -41,6 +41,10 @@
Returns:
A struct with attributes logging: trace, debug, info, warn, fail.
+ Please use `return logger.fail` when using the `fail` method, because
+ it makes `buildifier` happy and ensures that other implementation of
+ the logger injected into the function work as expected by terminating
+ on the given line.
"""
if _is_repo_debug_enabled(mrctx):
verbosity_level = "DEBUG"
@@ -140,7 +144,7 @@
result = mrctx.execute(arguments, environment = environment, **kwargs)
if fail_on_error and result.return_code != 0:
- logger.fail((
+ return logger.fail((
"repo.execute: {op}: end: failure:\n" +
" command: {cmd}\n" +
" return code: {return_code}\n" +
diff --git a/python/private/runtime_env_toolchain.bzl b/python/private/runtime_env_toolchain.bzl
index 1601926..2116012 100644
--- a/python/private/runtime_env_toolchain.bzl
+++ b/python/private/runtime_env_toolchain.bzl
@@ -13,7 +13,7 @@
# limitations under the License.
"""Definitions related to the Python toolchain."""
-load("@rules_cc//cc:defs.bzl", "cc_library")
+load("@rules_cc//cc:cc_library.bzl", "cc_library")
load("//python:py_runtime.bzl", "py_runtime")
load("//python:py_runtime_pair.bzl", "py_runtime_pair")
load("//python/cc:py_cc_toolchain.bzl", "py_cc_toolchain")
diff --git a/python/private/site_init_template.py b/python/private/site_init_template.py
new file mode 100644
index 0000000..7a32210
--- /dev/null
+++ b/python/private/site_init_template.py
@@ -0,0 +1,196 @@
+# Copyright 2024 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+"""site initialization logic for Bazel-built py_binary targets."""
+import os
+import os.path
+import sys
+
+# Colon-delimited string of runfiles-relative import paths to add
+_IMPORTS_STR = "%imports%"
+# Though the import all value is the correct literal, we quote it
+# so this file is parsable by tools.
+_IMPORT_ALL = "%import_all%" == "True"
+_WORKSPACE_NAME = "%workspace_name%"
+# runfiles-relative path to this file
+_SELF_RUNFILES_RELATIVE_PATH = "%site_init_runfiles_path%"
+# Runfiles-relative path to the coverage tool entry point, if any.
+_COVERAGE_TOOL = "%coverage_tool%"
+
+
+def _is_verbose():
+ return bool(os.environ.get("RULES_PYTHON_BOOTSTRAP_VERBOSE"))
+
+
+def _print_verbose_coverage(*args):
+ if os.environ.get("VERBOSE_COVERAGE") or _is_verbose():
+ _print_verbose(*args)
+
+
+def _print_verbose(*args, mapping=None, values=None):
+ if not _is_verbose():
+ return
+
+ print("bazel_site_init:", *args, file=sys.stderr, flush=True)
+
+
+_print_verbose("imports_str:", _IMPORTS_STR)
+_print_verbose("import_all:", _IMPORT_ALL)
+_print_verbose("workspace_name:", _WORKSPACE_NAME)
+_print_verbose("self_runfiles_path:", _SELF_RUNFILES_RELATIVE_PATH)
+_print_verbose("coverage_tool:", _COVERAGE_TOOL)
+
+
+def _find_runfiles_root():
+ # Give preference to the environment variables
+ runfiles_dir = os.environ.get("RUNFILES_DIR", None)
+ if not runfiles_dir:
+ runfiles_manifest_file = os.environ.get("RUNFILES_MANIFEST_FILE", "")
+ if runfiles_manifest_file.endswith(
+ ".runfiles_manifest"
+ ) or runfiles_manifest_file.endswith(".runfiles/MANIFEST"):
+ runfiles_dir = runfiles_manifest_file[:-9]
+
+ # Be defensive: the runfiles dir should contain ourselves. If it doesn't,
+ # then it must not be our runfiles directory.
+ if runfiles_dir and os.path.exists(
+ os.path.join(runfiles_dir, _SELF_RUNFILES_RELATIVE_PATH)
+ ):
+ return runfiles_dir
+
+ num_dirs_to_runfiles_root = _SELF_RUNFILES_RELATIVE_PATH.count("/") + 1
+ runfiles_root = os.path.dirname(__file__)
+ for _ in range(num_dirs_to_runfiles_root):
+ runfiles_root = os.path.dirname(runfiles_root)
+ return runfiles_root
+
+
+_RUNFILES_ROOT = _find_runfiles_root()
+
+_print_verbose("runfiles_root:", _RUNFILES_ROOT)
+
+
+def _is_windows():
+ return os.name == "nt"
+
+
+def _get_windows_path_with_unc_prefix(path):
+ path = path.strip()
+ # No need to add prefix for non-Windows platforms.
+ if not _is_windows() or sys.version_info[0] < 3:
+ return path
+
+ # Starting in Windows 10, version 1607(OS build 14393), MAX_PATH limitations have been
+ # removed from common Win32 file and directory functions.
+ # Related doc: https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd#enable-long-paths-in-windows-10-version-1607-and-later
+ import platform
+
+ if platform.win32_ver()[1] >= "10.0.14393":
+ return path
+
+ # import sysconfig only now to maintain python 2.6 compatibility
+ import sysconfig
+
+ if sysconfig.get_platform() == "mingw":
+ return path
+
+ # Lets start the unicode fun
+ unicode_prefix = "\\\\?\\"
+ if path.startswith(unicode_prefix):
+ return path
+
+ # os.path.abspath returns a normalized absolute path
+ return unicode_prefix + os.path.abspath(path)
+
+
+def _search_path(name):
+ """Finds a file in a given search path."""
+ search_path = os.getenv("PATH", os.defpath).split(os.pathsep)
+ for directory in search_path:
+ if directory:
+ path = os.path.join(directory, name)
+ if os.path.isfile(path) and os.access(path, os.X_OK):
+ return path
+ return None
+
+
+def _setup_sys_path():
+ seen = set(sys.path)
+ python_path_entries = []
+
+ def _maybe_add_path(path):
+ if path in seen:
+ return
+ path = _get_windows_path_with_unc_prefix(path)
+ if _is_windows():
+ path = path.replace("/", os.sep)
+
+ _print_verbose("append sys.path:", path)
+ sys.path.append(path)
+ seen.add(path)
+
+ for rel_path in _IMPORTS_STR.split(":"):
+ abs_path = os.path.join(_RUNFILES_ROOT, rel_path)
+ _maybe_add_path(abs_path)
+
+ if _IMPORT_ALL:
+ repo_dirs = sorted(
+ os.path.join(_RUNFILES_ROOT, d) for d in os.listdir(_RUNFILES_ROOT)
+ )
+ for d in repo_dirs:
+ if os.path.isdir(d):
+ _maybe_add_path(d)
+ else:
+ _maybe_add_path(os.path.join(_RUNFILES_ROOT, _WORKSPACE_NAME))
+
+ # COVERAGE_DIR is set if coverage is enabled and instrumentation is configured
+ # for something, though it could be another program executing this one or
+ # one executed by this one (e.g. an extension module).
+ # NOTE: Coverage is added last to allow user dependencies to override it.
+ coverage_setup = False
+ if os.environ.get("COVERAGE_DIR"):
+ cov_tool = _COVERAGE_TOOL
+ if cov_tool:
+ _print_verbose_coverage(f"Using toolchain coverage_tool {cov_tool}")
+ elif cov_tool := os.environ.get("PYTHON_COVERAGE"):
+ _print_verbose_coverage(f"PYTHON_COVERAGE: {cov_tool}")
+
+ if cov_tool:
+ if os.path.isabs(cov_tool):
+ pass
+ elif os.sep in os.path.normpath(cov_tool):
+ cov_tool = os.path.join(_RUNFILES_ROOT, cov_tool)
+ else:
+ cov_tool = _search_path(cov_tool)
+ if cov_tool:
+ # The coverage entry point is `<dir>/coverage/coverage_main.py`, so
+ # we need to do twice the dirname so that `import coverage` works
+ coverage_dir = os.path.dirname(os.path.dirname(cov_tool))
+
+ # coverage library expects sys.path[0] to contain the library, and replaces
+ # it with the directory of the program it starts. Our actual sys.path[0] is
+ # the runfiles directory, which must not be replaced.
+ # CoverageScript.do_execute() undoes this sys.path[0] setting.
+ _maybe_add_path(coverage_dir)
+ coverage_setup = True
+ else:
+ _print_verbose_coverage(
+ "Coverage was enabled, but python coverage tool was not configured."
+ + "To enable coverage, consult the docs at "
+ + "https://rules-python.readthedocs.io/en/latest/coverage.html"
+ )
+
+ return coverage_setup
+
+
+COVERAGE_SETUP = _setup_sys_path()
diff --git a/python/private/stage1_bootstrap_template.sh b/python/private/stage1_bootstrap_template.sh
index e7e418c..b05b4a5 100644
--- a/python/private/stage1_bootstrap_template.sh
+++ b/python/private/stage1_bootstrap_template.sh
@@ -9,8 +9,12 @@
# runfiles-relative path
STAGE2_BOOTSTRAP="%stage2_bootstrap%"
-# runfiles-relative path, absolute path, or single word
+# runfiles-relative path
PYTHON_BINARY='%python_binary%'
+# The path that PYTHON_BINARY should symlink to.
+# runfiles-relative path, absolute path, or single word.
+# Only applicable for zip files.
+PYTHON_BINARY_ACTUAL="%python_binary_actual%"
# 0 or 1
IS_ZIPFILE="%is_zipfile%"
@@ -96,6 +100,49 @@
}
python_exe=$(find_python_interpreter $RUNFILES_DIR $PYTHON_BINARY)
+
+# Zip files have to re-create the venv bin/python3 symlink because they
+# don't contain it already.
+if [[ "$IS_ZIPFILE" == "1" ]]; then
+ # It should always be under runfiles, but double check this. We don't
+ # want to accidentally create symlinks elsewhere.
+ if [[ "$python_exe" != $RUNFILES_DIR/* ]]; then
+ echo >&2 "ERROR: Program's venv binary not under runfiles: $python_exe"
+ exit 1
+ fi
+ if [[ "$PYTHON_BINARY_ACTUAL" == /* ]]; then
+ # An absolute path, i.e. platform runtime, e.g. /usr/bin/python3
+ symlink_to=$PYTHON_BINARY_ACTUAL
+ elif [[ "$PYTHON_BINARY_ACTUAL" == */* ]]; then
+ # A runfiles-relative path
+ symlink_to=$RUNFILES_DIR/$PYTHON_BINARY_ACTUAL
+ else
+ # A plain word, e.g. "python3". Symlink to where PATH leads
+ symlink_to=$(which $PYTHON_BINARY_ACTUAL)
+ # Guard against trying to symlink to an empty value
+ if [[ $? -ne 0 ]]; then
+ echo >&2 "ERROR: Python to use found on PATH: $PYTHON_BINARY_ACTUAL"
+ exit 1
+ fi
+ fi
+ # The bin/ directory may not exist if it is empty.
+ mkdir -p "$(dirname $python_exe)"
+ ln -s "$symlink_to" "$python_exe"
+fi
+
+# At this point, we should have a valid reference to the interpreter.
+# Check that so we can give an nicer failure if things went wrong.
+if [[ ! -x "$python_exe" ]]; then
+ if [[ ! -e "$python_exe" ]]; then
+ echo >&2 "ERROR: Python interpreter not found: $python_exe"
+ ls -l $python_exe >&2
+ exit 1
+ elif [[ ! -x "$python_exe" ]]; then
+ echo >&2 "ERROR: Python interpreter not executable: $python_exe"
+ exit 1
+ fi
+fi
+
stage2_bootstrap="$RUNFILES_DIR/$STAGE2_BOOTSTRAP"
declare -a interpreter_env
diff --git a/python/private/stage2_bootstrap_template.py b/python/private/stage2_bootstrap_template.py
index f66c28b..1e19a71 100644
--- a/python/private/stage2_bootstrap_template.py
+++ b/python/private/stage2_bootstrap_template.py
@@ -4,19 +4,22 @@
import sys
-# The Python interpreter unconditionally prepends the directory containing this
+# By default the Python interpreter prepends the directory containing this
# script (following symlinks) to the import path. This is the cause of #9239,
-# and is a special case of #7091. We therefore explicitly delete that entry.
-# TODO(#7091): Remove this hack when no longer necessary.
-# TODO: Use sys.flags.safe_path to determine whether this removal should be
-# performed
-del sys.path[0]
+# and is a special case of #7091.
+#
+# Python 3.11 introduced an PYTHONSAFEPATH (-P) option that disables this
+# behaviour, which we set in the stage 1 bootstrap.
+# So the prepended entry needs to be removed only if the above option is either
+# unset or not supported by the interpreter.
+# NOTE: This can be removed when Python 3.10 and below is no longer supported
+if not getattr(sys.flags, "safe_path", False):
+ del sys.path[0]
import contextlib
import os
import re
import runpy
-import subprocess
import uuid
# ===== Template substitutions start =====
@@ -24,14 +27,6 @@
# Runfiles-relative path to the main Python source file.
MAIN = "%main%"
-# Colon-delimited string of runfiles-relative import paths to add
-IMPORTS_STR = "%imports%"
-WORKSPACE_NAME = "%workspace_name%"
-# Though the import all value is the correct literal, we quote it
-# so this file is parsable by tools.
-IMPORT_ALL = True if "%import_all%" == "True" else False
-# Runfiles-relative path to the coverage tool entry point, if any.
-COVERAGE_TOOL = "%coverage_tool%"
# ===== Template substitutions end =====
@@ -120,45 +115,6 @@
return os.environ.get("VERBOSE_COVERAGE") or is_verbose()
-def find_coverage_entry_point(module_space):
- cov_tool = COVERAGE_TOOL
- if cov_tool:
- print_verbose_coverage("Using toolchain coverage_tool %r" % cov_tool)
- else:
- cov_tool = os.environ.get("PYTHON_COVERAGE")
- if cov_tool:
- print_verbose_coverage("PYTHON_COVERAGE: %r" % cov_tool)
- if cov_tool:
- return find_binary(module_space, cov_tool)
- return None
-
-
-def find_binary(module_space, bin_name):
- """Finds the real binary if it's not a normal absolute path."""
- if not bin_name:
- return None
- if bin_name.startswith("//"):
- # Case 1: Path is a label. Not supported yet.
- raise AssertionError(
- "Bazel does not support execution of Python interpreters via labels yet"
- )
- elif os.path.isabs(bin_name):
- # Case 2: Absolute path.
- return bin_name
- # Use normpath() to convert slashes to os.sep on Windows.
- elif os.sep in os.path.normpath(bin_name):
- # Case 3: Path is relative to the repo root.
- return os.path.join(module_space, bin_name)
- else:
- # Case 4: Path has to be looked up in the search path.
- return search_path(bin_name)
-
-
-def create_python_path_entries(python_imports, module_space):
- parts = python_imports.split(":")
- return [module_space] + ["%s/%s" % (module_space, path) for path in parts]
-
-
def find_runfiles_root(main_rel_path):
"""Finds the runfiles tree."""
# When the calling process used the runfiles manifest to resolve the
@@ -203,15 +159,6 @@
raise AssertionError("Cannot find .runfiles directory for %s" % sys.argv[0])
-# Returns repository roots to add to the import path.
-def get_repositories_imports(module_space, import_all):
- if import_all:
- repo_dirs = [os.path.join(module_space, d) for d in os.listdir(module_space)]
- repo_dirs.sort()
- return [d for d in repo_dirs if os.path.isdir(d)]
- return [os.path.join(module_space, WORKSPACE_NAME)]
-
-
def runfiles_envvar(module_space):
"""Finds the runfiles manifest or the runfiles directory.
@@ -251,15 +198,6 @@
return (None, None)
-def deduplicate(items):
- """Efficiently filter out duplicates, keeping the first element only."""
- seen = set()
- for it in items:
- if it not in seen:
- seen.add(it)
- yield it
-
-
def instrumented_file_paths():
"""Yields tuples of realpath of each instrumented file with the relative path."""
manifest_filename = os.environ.get("COVERAGE_MANIFEST")
@@ -436,25 +374,7 @@
]
else:
prepend_path_entries = []
- python_path_entries = create_python_path_entries(IMPORTS_STR, module_space)
- python_path_entries += get_repositories_imports(module_space, IMPORT_ALL)
- python_path_entries = [
- get_windows_path_with_unc_prefix(d) for d in python_path_entries
- ]
- # Remove duplicates to avoid overly long PYTHONPATH (#10977). Preserve order,
- # keep first occurrence only.
- python_path_entries = deduplicate(python_path_entries)
-
- if is_windows():
- python_path_entries = [p.replace("/", os.sep) for p in python_path_entries]
- else:
- # deduplicate returns a generator, but we need a list after this.
- python_path_entries = list(python_path_entries)
-
- # We're emulating PYTHONPATH being set, so we insert at the start
- # This isn't a great idea (it can shadow the stdlib), but is the historical
- # behavior.
runfiles_envkey, runfiles_envvalue = runfiles_envvar(module_space)
if runfiles_envkey:
os.environ[runfiles_envkey] = runfiles_envvalue
@@ -468,68 +388,17 @@
"Cannot exec() %r: file not readable." % main_filename
)
- # COVERAGE_DIR is set if coverage is enabled and instrumentation is configured
- # for something, though it could be another program executing this one or
- # one executed by this one (e.g. an extension module).
- if os.environ.get("COVERAGE_DIR"):
- cov_tool = find_coverage_entry_point(module_space)
- if cov_tool is None:
- print_verbose_coverage(
- "Coverage was enabled, but python coverage tool was not configured."
- + "To enable coverage, consult the docs at "
- + "https://rules-python.readthedocs.io/en/latest/coverage.html"
- )
- else:
- # Inhibit infinite recursion:
- if "PYTHON_COVERAGE" in os.environ:
- del os.environ["PYTHON_COVERAGE"]
-
- if not os.path.exists(cov_tool):
- raise EnvironmentError(
- "Python coverage tool %r not found. "
- "Try running with VERBOSE_COVERAGE=1 to collect more information."
- % cov_tool
- )
-
- # coverage library expects sys.path[0] to contain the library, and replaces
- # it with the directory of the program it starts. Our actual sys.path[0] is
- # the runfiles directory, which must not be replaced.
- # CoverageScript.do_execute() undoes this sys.path[0] setting.
- #
- # Update sys.path such that python finds the coverage package. The coverage
- # entry point is coverage.coverage_main, so we need to do twice the dirname.
- coverage_dir = os.path.dirname(os.path.dirname(cov_tool))
- print_verbose("coverage: adding to sys.path:", coverage_dir)
- python_path_entries.append(coverage_dir)
- python_path_entries = deduplicate(python_path_entries)
- else:
- cov_tool = None
-
sys.stdout.flush()
- # Add the user imports after the stdlib, but before the runtime's
- # site-packages directory. This gives the stdlib precedence, while allowing
- # users to override non-stdlib packages that may have been bundled with
- # the runtime (usually pip).
- # NOTE: There isn't a good way to identify the stdlib paths, so we just
- # expect site-packages comes after it, per
- # https://docs.python.org/3/library/sys_path_init.html#sys-path-init
- for i, path in enumerate(sys.path):
- # dist-packages is a debian convention, see
- # https://wiki.debian.org/Python#Deviations_from_upstream
- if os.path.basename(path) in ("site-packages", "dist-packages"):
- sys.path[i:i] = python_path_entries
- break
- else:
- # Otherwise, no site-packages directory was found, which is odd but ok.
- sys.path.extend(python_path_entries)
-
- # NOTE: The sys.path must be modified before coverage is imported/activated
- # NOTE: Perform this after the user imports are appended. This avoids a
- # user import accidentally triggering the site-packages logic above.
sys.path[0:0] = prepend_path_entries
- with _maybe_collect_coverage(enable=cov_tool is not None):
+ if os.environ.get("COVERAGE_DIR"):
+ import _bazel_site_init
+ coverage_enabled = _bazel_site_init.COVERAGE_SETUP
+ else:
+ coverage_enabled = False
+
+ with _maybe_collect_coverage(enable=coverage_enabled):
# The first arg is this bootstrap, so drop that for the re-invocation.
_run_py(main_filename, args=sys.argv[1:])
sys.exit(0)
diff --git a/python/private/text_util.bzl b/python/private/text_util.bzl
index 38f2b0e..a64b5d6 100644
--- a/python/private/text_util.bzl
+++ b/python/private/text_util.bzl
@@ -124,6 +124,21 @@
")",
])
+def _render_kwargs(items, *, value_repr = repr):
+ if not items:
+ return ""
+
+ return "\n".join([
+ "{} = {},".format(k, value_repr(v)).lstrip()
+ for k, v in items.items()
+ ])
+
+def _render_call(fn_name, **kwargs):
+ if not kwargs:
+ return fn_name + "()"
+
+ return "{}(\n{}\n)".format(fn_name, _indent(_render_kwargs(kwargs, value_repr = lambda x: x)))
+
def _toolchain_prefix(index, name, pad_length):
"""Prefixes the given name with the index, padded with zeros to ensure lexicographic sorting.
@@ -141,8 +156,10 @@
render = struct(
alias = _render_alias,
dict = _render_dict,
+ call = _render_call,
hanging_indent = _hanging_indent,
indent = _indent,
+ kwargs = _render_kwargs,
left_pad_zero = _left_pad_zero,
list = _render_list,
select = _render_select,
diff --git a/python/private/toolchain_aliases.bzl b/python/private/toolchain_aliases.bzl
new file mode 100644
index 0000000..31ac4a8
--- /dev/null
+++ b/python/private/toolchain_aliases.bzl
@@ -0,0 +1,74 @@
+# Copyright 2024 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Create toolchain alias targets."""
+
+load("@rules_python//python:versions.bzl", "PLATFORMS")
+
+def toolchain_aliases(*, name, platforms, visibility = None, native = native):
+ """Create toolchain aliases for the python toolchains.
+
+ Args:
+ name: {type}`str` The name of the current repository.
+ platforms: {type}`platforms` The list of platforms that are supported
+ for the current toolchain repository.
+ visibility: {type}`list[Target] | None` The visibility of the aliases.
+ native: The native struct used in the macro, useful for testing.
+ """
+ for platform in PLATFORMS.keys():
+ if platform not in platforms:
+ continue
+
+ native.config_setting(
+ name = platform,
+ flag_values = PLATFORMS[platform].flag_values,
+ constraint_values = PLATFORMS[platform].compatible_with,
+ visibility = ["//visibility:private"],
+ )
+
+ prefix = name
+ for name in [
+ "files",
+ "includes",
+ "libpython",
+ "py3_runtime",
+ "python_headers",
+ "python_runtimes",
+ ]:
+ native.alias(
+ name = name,
+ actual = select({
+ ":" + platform: "@{}_{}//:{}".format(prefix, platform, name)
+ for platform in platforms
+ }),
+ visibility = visibility,
+ )
+
+ native.alias(
+ name = "python3",
+ actual = select({
+ ":" + platform: "@{}_{}//:{}".format(prefix, platform, "python.exe" if "windows" in platform else "bin/python3")
+ for platform in platforms
+ }),
+ visibility = visibility,
+ )
+ native.alias(
+ name = "pip",
+ actual = select({
+ ":" + platform: "@{}_{}//:python_runtimes".format(prefix, platform)
+ for platform in platforms
+ if "windows" not in platform
+ }),
+ visibility = visibility,
+ )
diff --git a/python/private/toolchains_repo.bzl b/python/private/toolchains_repo.bzl
index d21e46a..7e9a0c7 100644
--- a/python/private/toolchains_repo.bzl
+++ b/python/private/toolchains_repo.bzl
@@ -25,8 +25,6 @@
load(
"//python:versions.bzl",
- "LINUX_NAME",
- "MACOS_NAME",
"PLATFORMS",
"WINDOWS_NAME",
)
@@ -41,7 +39,8 @@
prefix,
python_version,
set_python_version_constraint,
- user_repository_name):
+ user_repository_name,
+ loaded_platforms):
"""Creates the content for toolchain definitions for a build file.
Args:
@@ -51,6 +50,8 @@
have the Python version constraint added as a requirement for
matching the toolchain, "False" if not.
user_repository_name: names for the user repos
+ loaded_platforms: {type}`struct` the list of platform structs defining the
+ loaded platforms. It is as they are defined in `//python:versions.bzl`.
Returns:
build_content: Text containing toolchain definitions
@@ -77,7 +78,7 @@
prefix = prefix,
python_version = python_version,
)
- for platform, meta in PLATFORMS.items()
+ for platform, meta in loaded_platforms.items()
])
def _toolchains_repo_impl(rctx):
@@ -100,6 +101,11 @@
python_version = rctx.attr.python_version,
set_python_version_constraint = str(rctx.attr.set_python_version_constraint),
user_repository_name = rctx.attr.user_repository_name,
+ loaded_platforms = {
+ k: v
+ for k, v in PLATFORMS.items()
+ if k in rctx.attr.platforms
+ },
)
rctx.file("BUILD.bazel", build_content + toolchains)
@@ -109,6 +115,7 @@
doc = "Creates a repository with toolchain definitions for all known platforms " +
"which can be registered or selected.",
attrs = {
+ "platforms": attr.string_list(doc = "List of platforms for which the toolchain definitions shall be created"),
"python_version": attr.string(doc = "The Python version."),
"set_python_version_constraint": attr.bool(doc = "if target_compatible_with for the toolchain should set the version constraint"),
"user_repository_name": attr.string(doc = "what the user chose for the base name"),
@@ -117,43 +124,26 @@
)
def _toolchain_aliases_impl(rctx):
- logger = repo_utils.logger(rctx)
- (os_name, arch) = _get_host_os_arch(rctx, logger)
-
- host_platform = _get_host_platform(os_name, arch)
-
- is_windows = (os_name == WINDOWS_NAME)
- python3_binary_path = "python.exe" if is_windows else "bin/python3"
-
# Base BUILD file for this repository.
build_contents = """\
# Generated by python/private/toolchains_repo.bzl
+load("@rules_python//python/private:toolchain_aliases.bzl", "toolchain_aliases")
+
package(default_visibility = ["//visibility:public"])
-load("@rules_python//python:versions.bzl", "gen_python_config_settings")
-gen_python_config_settings()
+
exports_files(["defs.bzl"])
PLATFORMS = [
{loaded_platforms}
]
-alias(name = "files", actual = select({{":" + item: "@{py_repository}_" + item + "//:files" for item in PLATFORMS}}))
-alias(name = "includes", actual = select({{":" + item: "@{py_repository}_" + item + "//:includes" for item in PLATFORMS}}))
-alias(name = "libpython", actual = select({{":" + item: "@{py_repository}_" + item + "//:libpython" for item in PLATFORMS}}))
-alias(name = "py3_runtime", actual = select({{":" + item: "@{py_repository}_" + item + "//:py3_runtime" for item in PLATFORMS}}))
-alias(name = "python_headers", actual = select({{":" + item: "@{py_repository}_" + item + "//:python_headers" for item in PLATFORMS}}))
-alias(name = "python_runtimes", actual = select({{":" + item: "@{py_repository}_" + item + "//:python_runtimes" for item in PLATFORMS}}))
-alias(name = "python3", actual = select({{":" + item: "@{py_repository}_" + item + "//:" + ("python.exe" if "windows" in item else "bin/python3") for item in PLATFORMS}}))
+toolchain_aliases(
+ name = "{py_repository}",
+ platforms = PLATFORMS,
+)
""".format(
py_repository = rctx.attr.user_repository_name,
loaded_platforms = "\n".join([" \"{}\",".format(p) for p in rctx.attr.platforms]),
)
- if not is_windows:
- build_contents += """\
-alias(name = "pip", actual = select({{":" + item: "@{py_repository}_" + item + "//:python_runtimes" for item in PLATFORMS if "windows" not in item}}))
-""".format(
- py_repository = rctx.attr.user_repository_name,
- host_platform = host_platform,
- )
rctx.file("BUILD.bazel", build_contents)
# Expose a Starlark file so rules can know what host platform we used and where to find an interpreter
@@ -172,9 +162,6 @@
)
load("{rules_python}//python:pip.bzl", _compile_pip_requirements = "compile_pip_requirements")
-host_platform = "{host_platform}"
-interpreter = "@{py_repository}_{host_platform}//:{python3_binary_path}"
-
def py_binary(name, **kwargs):
return _py_binary(
name = name,
@@ -205,10 +192,7 @@
)
""".format(
- host_platform = host_platform,
- py_repository = rctx.attr.user_repository_name,
python_version = rctx.attr.python_version,
- python3_binary_path = python3_binary_path,
rules_python = get_repository_name(rctx.attr._rules_python_workspace),
))
@@ -234,15 +218,21 @@
)
def _host_toolchain_impl(rctx):
- logger = repo_utils.logger(rctx)
rctx.file("BUILD.bazel", """\
# Generated by python/private/toolchains_repo.bzl
exports_files(["python"], visibility = ["//visibility:public"])
""")
- (os_name, arch) = _get_host_os_arch(rctx, logger)
- host_platform = _get_host_platform(os_name, arch)
+ os_name = repo_utils.get_platforms_os_name(rctx)
+ host_platform = _get_host_platform(
+ rctx = rctx,
+ logger = repo_utils.logger(rctx),
+ python_version = rctx.attr.python_version,
+ os_name = os_name,
+ cpu_name = repo_utils.get_platforms_cpu_name(rctx),
+ platforms = rctx.attr.platforms,
+ )
repo = "@@{py_repository}_{host_platform}".format(
py_repository = rctx.attr.name[:-len("_host")],
host_platform = host_platform,
@@ -311,6 +301,8 @@
this repo causes an eager fetch of the toolchain for the host platform.
""",
attrs = {
+ "platforms": attr.string_list(mandatory = True),
+ "python_version": attr.string(mandatory = True),
"_rule_name": attr.string(default = "host_toolchain"),
"_rules_python_workspace": attr.label(default = Label("//:WORKSPACE")),
},
@@ -327,16 +319,12 @@
load(
"@{repository_name}//:defs.bzl",
_compile_pip_requirements = "compile_pip_requirements",
- _host_platform = "host_platform",
- _interpreter = "interpreter",
_py_binary = "py_binary",
_py_console_script_binary = "py_console_script_binary",
_py_test = "py_test",
)
compile_pip_requirements = _compile_pip_requirements
-host_platform = _host_platform
-interpreter = _interpreter
py_binary = _py_binary
py_console_script_binary = _py_console_script_binary
py_test = _py_test
@@ -379,54 +367,51 @@
def sanitize_platform_name(platform):
return platform.replace("-", "_")
-def _get_host_platform(os_name, arch):
+def _get_host_platform(*, rctx, logger, python_version, os_name, cpu_name, platforms):
"""Gets the host platform.
Args:
- os_name: the host OS name.
- arch: the host arch.
+ rctx: {type}`repository_ctx`.
+ logger: {type}`struct`.
+ python_version: {type}`string`.
+ os_name: {type}`str` the host OS name.
+ cpu_name: {type}`str` the host CPU name.
+ platforms: {type}`list[str]` the list of loaded platforms.
Returns:
The host platform.
"""
- host_platform = None
- for platform, meta in PLATFORMS.items():
- if meta.os_name == os_name and meta.arch == arch:
- host_platform = platform
- if not host_platform:
- fail("No platform declared for host OS {} on arch {}".format(os_name, arch))
- return host_platform
+ candidates = []
+ for platform in platforms:
+ meta = PLATFORMS[platform]
-def _get_host_os_arch(rctx, logger):
- """Infer the host OS name and arch from a repository context.
+ if meta.os_name == os_name and meta.arch == cpu_name:
+ candidates.append(platform)
- Args:
- rctx: Bazel's repository_ctx.
- logger: Logger to use for operations.
+ if len(candidates) == 1:
+ return candidates[0]
- Returns:
- A tuple with the host OS name and arch.
- """
- os_name = rctx.os.name
+ if candidates:
+ env_var = "RULES_PYTHON_REPO_TOOLCHAIN_{}_{}_{}".format(
+ python_version.replace(".", "_"),
+ os_name.upper(),
+ cpu_name.upper(),
+ )
+ preference = repo_utils.getenv(rctx, env_var)
+ if preference == None:
+ logger.info("Consider using '{}' to select from one of the platforms: {}".format(
+ env_var,
+ candidates,
+ ))
+ elif preference not in candidates:
+ return logger.fail("Please choose a preferred interpreter out of the following platforms: {}".format(candidates))
+ else:
+ candidates = [preference]
- # We assume the arch for Windows is always x86_64.
- if "windows" in os_name.lower():
- arch = "x86_64"
+ if candidates:
+ return candidates[0]
- # Normalize the os_name. E.g. os_name could be "OS windows server 2019".
- os_name = WINDOWS_NAME
- else:
- # This is not ideal, but bazel doesn't directly expose arch.
- arch = repo_utils.execute_unchecked(
- rctx,
- op = "GetUname",
- arguments = [repo_utils.which_checked(rctx, "uname"), "-m"],
- logger = logger,
- ).stdout.strip()
-
- # Normalize the os_name.
- if "mac" in os_name.lower():
- os_name = MACOS_NAME
- elif "linux" in os_name.lower():
- os_name = LINUX_NAME
-
- return (os_name, arch)
+ return logger.fail("Could not find a compatible 'host' python for '{os_name}', '{cpu_name}' from the loaded platforms: {platforms}".format(
+ os_name = os_name,
+ cpu_name = cpu_name,
+ platforms = platforms,
+ ))
diff --git a/python/private/util.bzl b/python/private/util.bzl
index 033920d..33261be 100644
--- a/python/private/util.bzl
+++ b/python/private/util.bzl
@@ -99,6 +99,8 @@
return provider("Stub, not used", fields = []), None
return provider(doc = doc, fields = fields, **kwargs)
+IS_BAZEL_7_4_OR_HIGHER = hasattr(native, "legacy_globals")
+
IS_BAZEL_7_OR_HIGHER = hasattr(native, "starlark_doc_extract")
# Bazel 5.4 has a bug where every access of testing.ExecutionInfo is a
diff --git a/python/private/whl_filegroup/whl_filegroup.bzl b/python/private/whl_filegroup/whl_filegroup.bzl
index c5f97e6..d2e6e43 100644
--- a/python/private/whl_filegroup/whl_filegroup.bzl
+++ b/python/private/whl_filegroup/whl_filegroup.bzl
@@ -27,7 +27,7 @@
Example usage:
```starlark
-load("@rules_cc//cc:defs.bzl", "cc_library")
+load("@rules_cc//cc:cc_library.bzl", "cc_library")
load("@rules_python//python:pip.bzl", "whl_filegroup")
whl_filegroup(
diff --git a/python/private/zip_main_template.py b/python/private/zip_main_template.py
index 2d3aea7..b4c9d27 100644
--- a/python/private/zip_main_template.py
+++ b/python/private/zip_main_template.py
@@ -23,8 +23,12 @@
import tempfile
import zipfile
+# runfiles-relative path
_STAGE2_BOOTSTRAP = "%stage2_bootstrap%"
+# runfiles-relative path
_PYTHON_BINARY = "%python_binary%"
+# runfiles-relative path, absolute path, or single word
+_PYTHON_BINARY_ACTUAL = "%python_binary_actual%"
_WORKSPACE_NAME = "%workspace_name%"
@@ -257,10 +261,37 @@
"Cannot exec() %r: file not readable." % main_filename
)
- program = python_program = find_python_binary(module_space)
+ python_program = find_python_binary(module_space)
if python_program is None:
raise AssertionError("Could not find python binary: " + _PYTHON_BINARY)
+ # The python interpreter should always be under runfiles, but double check.
+ # We don't want to accidentally create symlinks elsewhere.
+ if not python_program.startswith(module_space):
+ raise AssertionError(
+ "Program's venv binary not under runfiles: {python_program}"
+ )
+
+ if os.path.isabs(_PYTHON_BINARY_ACTUAL):
+ symlink_to = _PYTHON_BINARY_ACTUAL
+ elif "/" in _PYTHON_BINARY_ACTUAL:
+ symlink_to = os.path.join(module_space, _PYTHON_BINARY_ACTUAL)
+ else:
+ symlink_to = search_path(_PYTHON_BINARY_ACTUAL)
+ if not symlink_to:
+ raise AssertionError(
+ f"Python interpreter to use not found on PATH: {_PYTHON_BINARY_ACTUAL}"
+ )
+
+ # The bin/ directory may not exist if it is empty.
+ os.makedirs(os.path.dirname(python_program), exist_ok=True)
+ try:
+ os.symlink(_PYTHON_BINARY_ACTUAL, python_program)
+ except OSError as e:
+ raise Exception(
+ f"Unable to create venv python interpreter symlink: {python_program} -> {PYTHON_BINARY_ACTUAL}"
+ ) from e
+
# Some older Python versions on macOS (namely Python 3.7) may unintentionally
# leave this environment variable set after starting the interpreter, which
# causes problems with Python subprocesses correctly locating sys.executable,
diff --git a/python/py_binary.bzl b/python/py_binary.bzl
index 3496108..c7d57da 100644
--- a/python/py_binary.bzl
+++ b/python/py_binary.bzl
@@ -15,7 +15,7 @@
"""Public entry point for py_binary."""
load("@rules_python_internal//:rules_python_config.bzl", "config")
-load("//python/private:py_binary_macro_bazel.bzl", _starlark_py_binary = "py_binary")
+load("//python/private:py_binary_macro.bzl", _starlark_py_binary = "py_binary")
load("//python/private:register_extension_info.bzl", "register_extension_info")
load("//python/private:util.bzl", "add_migration_tag")
diff --git a/python/py_library.bzl b/python/py_library.bzl
index 4ec1da4..12354a7 100644
--- a/python/py_library.bzl
+++ b/python/py_library.bzl
@@ -15,7 +15,7 @@
"""Public entry point for py_library."""
load("@rules_python_internal//:rules_python_config.bzl", "config")
-load("//python/private:py_library_macro_bazel.bzl", _starlark_py_library = "py_library")
+load("//python/private:py_library_macro.bzl", _starlark_py_library = "py_library")
load("//python/private:register_extension_info.bzl", "register_extension_info")
load("//python/private:util.bzl", "add_migration_tag")
diff --git a/python/py_test.bzl b/python/py_test.bzl
index 2aa93ff..7f6626e 100644
--- a/python/py_test.bzl
+++ b/python/py_test.bzl
@@ -15,7 +15,7 @@
"""Public entry point for py_test."""
load("@rules_python_internal//:rules_python_config.bzl", "config")
-load("//python/private:py_test_macro_bazel.bzl", _starlark_py_test = "py_test")
+load("//python/private:py_test_macro.bzl", _starlark_py_test = "py_test")
load("//python/private:register_extension_info.bzl", "register_extension_info")
load("//python/private:util.bzl", "add_migration_tag")
diff --git a/python/runfiles/runfiles.py b/python/runfiles/runfiles.py
index 6d47d24..ea816c6 100644
--- a/python/runfiles/runfiles.py
+++ b/python/runfiles/runfiles.py
@@ -58,13 +58,24 @@
result = {}
with open(path, "r") as f:
for line in f:
- line = line.strip()
- if line:
- tokens = line.split(" ", 1)
- if len(tokens) == 1:
- result[line] = line
- else:
- result[tokens[0]] = tokens[1]
+ line = line.rstrip("\n")
+ if line.startswith(" "):
+ # In lines that start with a space, spaces, newlines, and backslashes are escaped as \s, \n, and \b in
+ # link and newlines and backslashes are escaped in target.
+ escaped_link, escaped_target = line[1:].split(" ", maxsplit=1)
+ link = (
+ escaped_link.replace(r"\s", " ")
+ .replace(r"\n", "\n")
+ .replace(r"\b", "\\")
+ )
+ target = escaped_target.replace(r"\n", "\n").replace(r"\b", "\\")
+ else:
+ link, target = line.split(" ", maxsplit=1)
+
+ if target:
+ result[link] = target
+ else:
+ result[link] = link
return result
def _GetRunfilesDir(self) -> str:
diff --git a/python/uv/private/lock.bzl b/python/uv/private/lock.bzl
index f0a66a1..217b6e4 100644
--- a/python/uv/private/lock.bzl
+++ b/python/uv/private/lock.bzl
@@ -22,9 +22,12 @@
visibility(["//..."])
-_REQUIREMENTS_TARGET_COMPATIBLE_WITH = [] if BZLMOD_ENABLED else ["@platforms//:incompatible"]
+_REQUIREMENTS_TARGET_COMPATIBLE_WITH = select({
+ "@platforms//os:windows": ["@platforms//:incompatible"],
+ "//conditions:default": [],
+}) if BZLMOD_ENABLED else ["@platforms//:incompatible"]
-def lock(*, name, srcs, out, upgrade = False, universal = True, python_version = None):
+def lock(*, name, srcs, out, upgrade = False, universal = True, python_version = None, args = [], **kwargs):
"""Pin the requirements based on the src files.
Args:
@@ -36,6 +39,8 @@
universal: Tell `uv` to generate a universal lock file.
python_version: Tell `rules_python` to use a particular version.
Defaults to the default py toolchain.
+ args: Extra args to pass to the rule.
+ **kwargs: Extra kwargs passed to the binary rule.
Differences with the current pip-compile rule:
- This is implemented in shell and uv.
@@ -45,22 +50,25 @@
pkg = native.package_name()
update_target = name + ".update"
- args = [
+ _args = [
"--custom-compile-command='bazel run //{}:{}'".format(pkg, update_target),
"--generate-hashes",
"--emit-index-url",
"--no-strip-extras",
"--python=$(PYTHON3)",
- ] + [
+ ] + args + [
"$(location {})".format(src)
for src in srcs
]
if upgrade:
- args.append("--upgrade")
+ _args.append("--upgrade")
if universal:
- args.append("--universal")
- args.append("--output-file=$@")
- cmd = "$(UV_BIN) pip compile " + " ".join(args)
+ _args.append("--universal")
+ _args.append("--output-file=$@")
+ cmd = "$(UV_BIN) pip compile " + " ".join(_args)
+
+ # Make a copy to ensure that we are not modifying the initial list
+ srcs = list(srcs)
# Check if the output file already exists, if yes, first copy it to the
# output file location in order to make `uv` not change the requirements if
@@ -118,4 +126,5 @@
"REQUIREMENTS_FILE": "$(rootpath {})".format(name),
},
tags = ["manual"],
+ **kwargs
)
diff --git a/python/uv/private/versions.bzl b/python/uv/private/versions.bzl
index 6e7091b..1d68302 100644
--- a/python/uv/private/versions.bzl
+++ b/python/uv/private/versions.bzl
@@ -68,27 +68,27 @@
# From: https://github.com/astral-sh/uv/releases
UV_TOOL_VERSIONS = {
- "0.2.23": {
+ "0.4.25": {
"aarch64-apple-darwin": struct(
- sha256 = "1d41beb151ace9621a0e729d661cfb04d6375bffdaaf0e366d1653576ce3a687",
+ sha256 = "bb2ff4348114ef220ca52e44d5086640c4a1a18f797a5f1ab6f8559fc37b1230",
),
"aarch64-unknown-linux-gnu": struct(
- sha256 = "c35042255239b75d29b9fd4b0845894b91284ed3ff90c2595d0518b4c8902329",
+ sha256 = "4485852eb8013530c4275cd222c0056ce123f92742321f012610f1b241463f39",
),
"powerpc64le-unknown-linux-gnu": struct(
- sha256 = "ca16c9456d297e623164e3089d76259c6d70ac40c037dd2068accc3bb1b09d5e",
+ sha256 = "32421c61e8d497243171b28c7efd74f039251256ae9e57ce4a457fdd7d045e24",
),
"s390x-unknown-linux-gnu": struct(
- sha256 = "55f8c2aa089f382645fce9eed3ee002f2cd48de4696568e7fd63105a02da568c",
+ sha256 = "9afa342d87256f5178a592d3eeb44ece8a93e9359db37e31be1b092226338469",
),
"x86_64-apple-darwin": struct(
- sha256 = "960d2ae6ec31bcf5da3f66083dedc527712115b97ee43eae903d74a43874fa72",
+ sha256 = "f0ec1f79f4791294382bff242691c6502e95853acef080ae3f7c367a8e1beb6f",
),
"x86_64-pc-windows-msvc": struct(
- sha256 = "66f80537301c686a801b91468a43dbeb0881bd6d51857078c24f29e5dca8ecf1",
+ sha256 = "c5c7fa084ae4e8ac9e3b0b6c4c7b61e9355eb0c86801c4c7728c0cb142701f38",
),
"x86_64-unknown-linux-gnu": struct(
- sha256 = "4384db514959beb4de1dcdf7f1f2d5faf664f7180820b0e7a521ef2147e33d1d",
+ sha256 = "6cb6eaf711cd7ce5fb1efaa539c5906374c762af547707a2041c9f6fd207769a",
),
},
}
diff --git a/python/versions.bzl b/python/versions.bzl
index ae017e3..1fd0649 100644
--- a/python/versions.bzl
+++ b/python/versions.bzl
@@ -15,16 +15,18 @@
"""The Python versions we use for the toolchains.
"""
-# Values returned by https://bazel.build/rules/lib/repository_os.
-MACOS_NAME = "mac os"
+# Values present in the @platforms//os package
+MACOS_NAME = "osx"
LINUX_NAME = "linux"
WINDOWS_NAME = "windows"
+FREETHREADED = "freethreaded"
+INSTALL_ONLY = "install_only"
DEFAULT_RELEASE_BASE_URL = "https://github.com/indygreg/python-build-standalone/releases/download"
# When updating the versions and releases, run the following command to get
# the hashes:
-# bazel run //python/private:print_toolchains_checksums
+# bazel run //python/private:print_toolchains_checksums --//python/config_settings:python_version={major}.{minor}.{patch}
#
# Note, to users looking at how to specify their tool versions, coverage_tool version for each
# interpreter can be specified by:
@@ -51,7 +53,7 @@
"x86_64-apple-darwin": "8d06bec08db8cdd0f64f4f05ee892cf2fcbc58cfb1dd69da2caab78fac420238",
"x86_64-unknown-linux-gnu": "aec8c4c53373b90be7e2131093caa26063be6d9d826f599c935c0e1042af3355",
},
- "strip_prefix": "python",
+ "strip_prefix": "python/install",
},
"3.8.12": {
"url": "20220227/cpython-{python_version}+20220227-{platform}-{build}.tar.gz",
@@ -237,15 +239,16 @@
"strip_prefix": "python",
},
"3.9.20": {
- "url": "20241008/cpython-{python_version}+20241008-{platform}-{build}.tar.gz",
+ "url": "20241016/cpython-{python_version}+20241016-{platform}-{build}.tar.gz",
"sha256": {
- "aarch64-apple-darwin": "dde4c3662e8b4ea336af12b94e7963d4c9b4b847e6f4a5a2921d801fbc75d55c",
- "aarch64-unknown-linux-gnu": "adb22acc4f5417ecb6113e4beb98f1a1492bcf631b3d3094135f60d1c6794e07",
- "ppc64le-unknown-linux-gnu": "abc12738616d3d87e878cd022c4d6a3d7cb6c130a6f3859996ce758a90c8abae",
- "s390x-unknown-linux-gnu": "bb037b3b266524df5a27f384755b2eab397837b3c955041145434261248a731d",
- "x86_64-apple-darwin": "980fd160c8a3e7839d808055b9497e653bd7be94dcc9cae6db0ddcb343bc5ad6",
- "x86_64-pc-windows-msvc": "dc12754f52b7cfcdded91c10953a96ed7d9b08eff54623ee5b819cec13f4715a",
- "x86_64-unknown-linux-gnu": "ddae7e904f5ecdff4c8993eb5256fbcec1e477923b40ec0515ffc77706dc2951",
+ "aarch64-apple-darwin": "34ab2bc4c51502145e1a624b4e4ea06877e3d1934a88cc73ac2e0fd5fd439b75",
+ "aarch64-unknown-linux-gnu": "1e486c054a4e86666cf24e04f5e29456324ba9c2b95bf1cae1805be90d3da154",
+ "ppc64le-unknown-linux-gnu": "9a24ccdbfc7f67545d859128f02a3150a160ea6c2fc134b0773bf56f2d90b397",
+ "s390x-unknown-linux-gnu": "2cee381069bf344fb20eba609af92dfe7ba67eb75bea08eeccf11048a2c380c0",
+ "x86_64-apple-darwin": "193dc7f0284e4917d52b17a077924474882ee172872f2257cfe3375d6d468ed9",
+ "x86_64-pc-windows-msvc": "5069008a237b90f6f7a86956903f2a0221b90d471daa6e4a94831eaa399e3993",
+ "x86_64-unknown-linux-gnu": "c20ee831f7f46c58fa57919b75a40eb2b6a31e03fd29aaa4e8dab4b9c4b60d5d",
+ "x86_64-unknown-linux-musl": "5c1cc348e317fe7af1acd6a7f665b46eccb554b20d6533f0e76c53f44d4556cc",
},
"strip_prefix": "python",
},
@@ -356,15 +359,16 @@
"strip_prefix": "python",
},
"3.10.15": {
- "url": "20241008/cpython-{python_version}+20241008-{platform}-{build}.tar.gz",
+ "url": "20241016/cpython-{python_version}+20241016-{platform}-{build}.tar.gz",
"sha256": {
- "aarch64-apple-darwin": "6bfed646145b9f1f512bbf3c37de8a29fae3544559c501185f552c3b92dc270b",
- "aarch64-unknown-linux-gnu": "51f08e2132dca177ac90175536118b3c01c106ec253b93db04e3ca7484525d00",
- "ppc64le-unknown-linux-gnu": "44b05f1f831fbef00b36f5d6ef82f308e32d3dee58e1272d1fac26004ce7c76f",
- "s390x-unknown-linux-gnu": "793bd6c565bd24b6db8e573d599492c6fddbaee43e4b4aeef240ada1105287d7",
- "x86_64-apple-darwin": "df1324c960b9023cfebfd2716f69af57156d823a4d286d8e67ffc4f876309611",
- "x86_64-pc-windows-msvc": "c519cb6bbb8caf508e3f3b91a3dd633b4bebdf84217ab34033a10c902b8a8519",
- "x86_64-unknown-linux-gnu": "5e07b34c66fbd99f1e2f06d3d42aed04c0f2991e66c1d171fb43e04b7ae71ad5",
+ "aarch64-apple-darwin": "f64776f455a44c24d50f947c813738cfb7b9ac43732c44891bc831fa7940a33c",
+ "aarch64-unknown-linux-gnu": "eb58581f85fde83d1f3e8e1f8c6f5a15c7ae4fdbe3b1d1083931f9167fdd8dbc",
+ "ppc64le-unknown-linux-gnu": "0c45af4e7525e2db59901606db32b2896ac1e9830c6f95551402207f537c2ce4",
+ "s390x-unknown-linux-gnu": "de205896b070e6f5259ac0f2b3379eead875ea84e6a6ef533b89886fcbb46a4c",
+ "x86_64-apple-darwin": "90b46dfb1abd98d45663c7a2a8c45d3047a59391d8586d71b459cec7b75f662b",
+ "x86_64-pc-windows-msvc": "e48952619796c66ec9719867b87be97edca791c2ef7fbf87d42c417c3331609e",
+ "x86_64-unknown-linux-gnu": "3db2171e03c1a7acdc599fba583c1b92306d3788b375c9323077367af1e9d9de",
+ "x86_64-unknown-linux-musl": "ed519c47d9620eb916a6f95ec2875396e7b1a9ab993ee40b2f31b837733f318c",
},
"strip_prefix": "python",
},
@@ -470,15 +474,16 @@
"strip_prefix": "python",
},
"3.11.10": {
- "url": "20241008/cpython-{python_version}+20241008-{platform}-{build}.tar.gz",
+ "url": "20241016/cpython-{python_version}+20241016-{platform}-{build}.tar.gz",
"sha256": {
- "aarch64-apple-darwin": "ecdc9c042b8f97bff211fcf9425bc51c96acd4037df1565964e89816f2c9564d",
- "aarch64-unknown-linux-gnu": "320635e957e13d2e10d70a3031563d032fae9e40e60e5ec32bc353643fae1335",
- "ppc64le-unknown-linux-gnu": "7eed40dc5751046e2164b1a3f08f177c2c965064f1e3b0f84c00f3f715d099ca",
- "s390x-unknown-linux-gnu": "eb86c655159d6f7b5fb245d9017f23aa388b5423f21caefeaee54469446ef9f2",
- "x86_64-apple-darwin": "a618c086e0514f681523947e2b66a4dc0c6560f91c36faa072fa6787455df9ea",
- "x86_64-pc-windows-msvc": "2cab4d2ee0c9313923c9b11297e23b1876ecb79ce6ad6de0b8b48baf8519ab67",
- "x86_64-unknown-linux-gnu": "ff121f14ed113c9da83a45f76c3cf41976fb4419fe406d5cc7066765761c6a4e",
+ "aarch64-apple-darwin": "5a69382da99c4620690643517ca1f1f53772331b347e75f536088c42a4cf6620",
+ "aarch64-unknown-linux-gnu": "803e49259280af0f5466d32829cd9d65a302b0226e424b3f0b261f9daf6aee8f",
+ "ppc64le-unknown-linux-gnu": "92b666d103902001322f42badbd68da92adc5cebb826af9c1c906c33166e2f34",
+ "s390x-unknown-linux-gnu": "6d584317651c1ad4a857cb32d1999707e8bb3046fcb2f156d80381814fa19fde",
+ "x86_64-apple-darwin": "1e23ffe5bc473e1323ab8f51464da62d77399afb423babf67f8e13c82b69c674",
+ "x86_64-pc-windows-msvc": "647b66ff4552e70aec3bf634dd470891b4a2b291e8e8715b3bdb162f577d4c55",
+ "x86_64-unknown-linux-gnu": "8b50a442b04724a24c1eebb65a36a0c0e833d35374dbdf9c9470d8a97b164cd9",
+ "x86_64-unknown-linux-musl": "d36fc77a8dd76155a7530f6235999a693b9e7c48aa11afeb5610a091cae5aa6f",
},
"strip_prefix": "python",
},
@@ -548,30 +553,55 @@
"strip_prefix": "python",
},
"3.12.7": {
- "url": "20241008/cpython-{python_version}+20241008-{platform}-{build}.tar.gz",
+ "url": "20241016/cpython-{python_version}+20241016-{platform}-{build}.tar.gz",
"sha256": {
- "aarch64-apple-darwin": "dd07d467f1d533b93d06e4d2ff88b91f491329510c6434297b88b584641bff5d",
- "aarch64-unknown-linux-gnu": "ce3230da53aacb17ff77e912170786f47db4a446d4acb6cde7c397953a032bca",
- "ppc64le-unknown-linux-gnu": "27d3cba42e94593c49f8610dcadd74f5b731c78f04ebabc2b0e1ba031ec09441",
- "s390x-unknown-linux-gnu": "1e28e0fc9cd1fa0365a149c715c44d3030b2c989ca397fc074809b943449df41",
- "x86_64-apple-darwin": "2347bf53ed3623645bed35adfca950b2c5291e3a759ec6c7765aa707b5dc866b",
- "x86_64-pc-windows-msvc": "4ed1a146c66c7dbd85b87df69b17afc166ea7d70056aaf59a49c3d987a030d3b",
- "x86_64-unknown-linux-gnu": "adbda1f3b77d7b65a551206e34a225375f408f9823e2e11df4c332aaecb8714b",
+ "aarch64-apple-darwin": "4c18852bf9c1a11b56f21bcf0df1946f7e98ee43e9e4c0c5374b2b3765cf9508",
+ "aarch64-unknown-linux-gnu": "bba3c6be6153f715f2941da34f3a6a69c2d0035c9c5396bc5bb68c6d2bd1065a",
+ "ppc64le-unknown-linux-gnu": "0a1d1d92e33a969bd2f40a80af53c97b6c0cc1060d384ceff50ff801593bf9d6",
+ "s390x-unknown-linux-gnu": "935676a0c960b552f95e9ac2e1e385de5de4b34038ff65ffdc688838f1189c17",
+ "x86_64-apple-darwin": "60c5271e7edc3c2ab47440b7abf4ed50fbc693880b474f74f05768f5b657045a",
+ "x86_64-pc-windows-msvc": "f05531bff16fa77b53be0776587b97b466070e768e6d5920894de988bdcd547a",
+ "x86_64-unknown-linux-gnu": "43576f7db1033dd57b900307f09c2e86f371152ac8a2607133afa51cbfc36064",
+ "x86_64-unknown-linux-musl": "5ed4a4078db3cbac563af66403aaa156cd6e48831d90382a1820db2b120627b5",
},
"strip_prefix": "python",
},
"3.13.0": {
- "url": "20241008/cpython-{python_version}+20241008-{platform}-{build}.tar.gz",
+ "url": "20241016/cpython-{python_version}+20241016-{platform}-{build}.{ext}",
"sha256": {
- "aarch64-apple-darwin": "5d3cb8d7ca4cfbbe7ae1f118f26be112ee417d982fab8c6d85cfd8ccccf70718",
- "aarch64-unknown-linux-gnu": "c1142af8f2c85923d2ba8201a35b913bb903a5d15f052c38bbecf2f49e2342dc",
- "ppc64le-unknown-linux-gnu": "1be64a330499fed4e1f864b97eef5445b0e4abc0559ae45df3108981800cf998",
- "s390x-unknown-linux-gnu": "c0b1cc51426feadaa932fdd9afd9a9af789916e128e48ac8909f9a269bbbd749",
- "x86_64-apple-darwin": "b58ca12d9ae14bbd79f9e5cf4b748211ff1953e59abeac63b0f4e8e49845669f",
- "x86_64-pc-windows-msvc": "c7651a7a575104f47c808902b020168057f3ad80f277e54cecfaf79a9ff50e22",
- "x86_64-unknown-linux-gnu": "455200e1a202e9d9ef4b630c04af701c0a91dcaa6462022efc76893fc762ec95",
+ "aarch64-apple-darwin": "31397953849d275aa2506580f3fa1cb5a85b6a3d392e495f8030e8b6412f5556",
+ "aarch64-unknown-linux-gnu": "e8378c0162b2e0e4cc1f62b29443a3305d116d09583304dbb0149fecaff6347b",
+ "ppc64le-unknown-linux-gnu": "fc4b7f27c4e84c78f3c8e6c7f8e4023e4638d11f1b36b6b5ce457b1926cebb53",
+ "s390x-unknown-linux-gnu": "66b19e6a07717f6cfcd3a8ca953f0a2eaa232291142f3d26a8d17c979ec0f467",
+ "x86_64-apple-darwin": "cff1b7e7cd26f2d47acac1ad6590e27d29829776f77e8afa067e9419f2f6ce77",
+ "x86_64-pc-windows-msvc": "b25926e8ce4164cf103bacc4f4d154894ea53e07dd3fdd5ebb16fb1a82a7b1a0",
+ "x86_64-unknown-linux-gnu": "2c8cb15c6a2caadaa98af51df6fe78a8155b8471cb3dd7b9836038e0d3657fb4",
+ "x86_64-unknown-linux-musl": "2f61ee3b628a56aceea63b46c7afe2df3e22a61da706606b0c8efda57f953cf4",
+ "aarch64-apple-darwin-freethreaded": "efc2e71c0e05bc5bedb7a846e05f28dd26491b1744ded35ed82f8b49ccfa684b",
+ "aarch64-unknown-linux-gnu-freethreaded": "59b50df9826475d24bb7eff781fa3949112b5e9c92adb29e96a09cdf1216d5bd",
+ "ppc64le-unknown-linux-gnu-freethreaded": "1217efa5f4ce67fcc9f7eb64165b1bd0912b2a21bc25c1a7e2cb174a21a5df7e",
+ "s390x-unknown-linux-gnu-freethreaded": "6c3e1e4f19d2b018b65a7e3ef4cd4225c5b9adfbc490218628466e636d5c4b8c",
+ "x86_64-apple-darwin-freethreaded": "2e07dfea62fe2215738551a179c87dbed1cc79d1b3654f4d7559889a6d5ce4eb",
+ "x86_64-pc-windows-msvc-freethreaded": "bfd89f9acf866463bc4baf01733da5e767d13f5d0112175a4f57ba91f1541310",
+ "x86_64-unknown-linux-gnu-freethreaded": "a73adeda301ad843cce05f31a2d3e76222b656984535a7b87696a24a098b216c",
},
- "strip_prefix": "python",
+ "strip_prefix": {
+ "aarch64-apple-darwin": "python",
+ "aarch64-unknown-linux-gnu": "python",
+ "ppc64le-unknown-linux-gnu": "python",
+ "s390x-unknown-linux-gnu": "python",
+ "x86_64-apple-darwin": "python",
+ "x86_64-pc-windows-msvc": "python",
+ "x86_64-unknown-linux-gnu": "python",
+ "x86_64-unknown-linux-musl": "python",
+ "aarch64-apple-darwin-freethreaded": "python/install",
+ "aarch64-unknown-linux-gnu-freethreaded": "python/install",
+ "ppc64le-unknown-linux-gnu-freethreaded": "python/install",
+ "s390x-unknown-linux-gnu-freethreaded": "python/install",
+ "x86_64-apple-darwin-freethreaded": "python/install",
+ "x86_64-pc-windows-msvc-freethreaded": "python/install",
+ "x86_64-unknown-linux-gnu-freethreaded": "python/install",
+ },
},
}
@@ -585,123 +615,155 @@
"3.13": "3.13.0",
}
-PLATFORMS = {
- "aarch64-apple-darwin": struct(
- compatible_with = [
- "@platforms//os:macos",
- "@platforms//cpu:aarch64",
- ],
- flag_values = {},
- os_name = MACOS_NAME,
- # Matches the value returned from:
- # repository_ctx.execute(["uname", "-m"]).stdout.strip()
- arch = "arm64",
- ),
- "aarch64-unknown-linux-gnu": struct(
- compatible_with = [
- "@platforms//os:linux",
- "@platforms//cpu:aarch64",
- ],
- flag_values = {
- Label("//python/config_settings:py_linux_libc"): "glibc",
- },
- os_name = LINUX_NAME,
- # Note: this string differs between OSX and Linux
- # Matches the value returned from:
- # repository_ctx.execute(["uname", "-m"]).stdout.strip()
- arch = "aarch64",
- ),
- "armv7-unknown-linux-gnu": struct(
- compatible_with = [
- "@platforms//os:linux",
- "@platforms//cpu:armv7",
- ],
- flag_values = {
- Label("//python/config_settings:py_linux_libc"): "glibc",
- },
- os_name = LINUX_NAME,
- arch = "armv7",
- ),
- "i386-unknown-linux-gnu": struct(
- compatible_with = [
- "@platforms//os:linux",
- "@platforms//cpu:i386",
- ],
- flag_values = {
- Label("//python/config_settings:py_linux_libc"): "glibc",
- },
- os_name = LINUX_NAME,
- arch = "i386",
- ),
- "ppc64le-unknown-linux-gnu": struct(
- compatible_with = [
- "@platforms//os:linux",
- "@platforms//cpu:ppc",
- ],
- flag_values = {
- Label("//python/config_settings:py_linux_libc"): "glibc",
- },
- os_name = LINUX_NAME,
- # Note: this string differs between OSX and Linux
- # Matches the value returned from:
- # repository_ctx.execute(["uname", "-m"]).stdout.strip()
- arch = "ppc64le",
- ),
- "riscv64-unknown-linux-gnu": struct(
- compatible_with = [
- "@platforms//os:linux",
- "@platforms//cpu:riscv64",
- ],
- flag_values = {
- Label("//python/config_settings:py_linux_libc"): "glibc",
- },
- os_name = LINUX_NAME,
- arch = "riscv64",
- ),
- "s390x-unknown-linux-gnu": struct(
- compatible_with = [
- "@platforms//os:linux",
- "@platforms//cpu:s390x",
- ],
- flag_values = {
- Label("//python/config_settings:py_linux_libc"): "glibc",
- },
- os_name = LINUX_NAME,
- # Note: this string differs between OSX and Linux
- # Matches the value returned from:
- # repository_ctx.execute(["uname", "-m"]).stdout.strip()
- arch = "s390x",
- ),
- "x86_64-apple-darwin": struct(
- compatible_with = [
- "@platforms//os:macos",
- "@platforms//cpu:x86_64",
- ],
- flag_values = {},
- os_name = MACOS_NAME,
- arch = "x86_64",
- ),
- "x86_64-pc-windows-msvc": struct(
- compatible_with = [
- "@platforms//os:windows",
- "@platforms//cpu:x86_64",
- ],
- flag_values = {},
- os_name = WINDOWS_NAME,
- arch = "x86_64",
- ),
- "x86_64-unknown-linux-gnu": struct(
- compatible_with = [
- "@platforms//os:linux",
- "@platforms//cpu:x86_64",
- ],
- flag_values = {
- Label("//python/config_settings:py_linux_libc"): "glibc",
- },
- os_name = LINUX_NAME,
- arch = "x86_64",
- ),
-}
+def _generate_platforms():
+ libc = Label("//python/config_settings:py_linux_libc")
+
+ platforms = {
+ "aarch64-apple-darwin": struct(
+ compatible_with = [
+ "@platforms//os:macos",
+ "@platforms//cpu:aarch64",
+ ],
+ flag_values = {},
+ os_name = MACOS_NAME,
+ # Matches the value in @platforms//cpu package
+ arch = "aarch64",
+ ),
+ "aarch64-unknown-linux-gnu": struct(
+ compatible_with = [
+ "@platforms//os:linux",
+ "@platforms//cpu:aarch64",
+ ],
+ flag_values = {
+ libc: "glibc",
+ },
+ os_name = LINUX_NAME,
+ # Matches the value in @platforms//cpu package
+ arch = "aarch64",
+ ),
+ "armv7-unknown-linux-gnu": struct(
+ compatible_with = [
+ "@platforms//os:linux",
+ "@platforms//cpu:armv7",
+ ],
+ flag_values = {
+ libc: "glibc",
+ },
+ os_name = LINUX_NAME,
+ # Matches the value in @platforms//cpu package
+ arch = "arm",
+ ),
+ "i386-unknown-linux-gnu": struct(
+ compatible_with = [
+ "@platforms//os:linux",
+ "@platforms//cpu:i386",
+ ],
+ flag_values = {
+ libc: "glibc",
+ },
+ os_name = LINUX_NAME,
+ # Matches the value in @platforms//cpu package
+ arch = "x86_32",
+ ),
+ "ppc64le-unknown-linux-gnu": struct(
+ compatible_with = [
+ "@platforms//os:linux",
+ "@platforms//cpu:ppc",
+ ],
+ flag_values = {
+ libc: "glibc",
+ },
+ os_name = LINUX_NAME,
+ # Matches the value in @platforms//cpu package
+ arch = "ppc",
+ ),
+ "riscv64-unknown-linux-gnu": struct(
+ compatible_with = [
+ "@platforms//os:linux",
+ "@platforms//cpu:riscv64",
+ ],
+ flag_values = {
+ Label("//python/config_settings:py_linux_libc"): "glibc",
+ },
+ os_name = LINUX_NAME,
+ # Matches the value in @platforms//cpu package
+ arch = "riscv64",
+ ),
+ "s390x-unknown-linux-gnu": struct(
+ compatible_with = [
+ "@platforms//os:linux",
+ "@platforms//cpu:s390x",
+ ],
+ flag_values = {
+ Label("//python/config_settings:py_linux_libc"): "glibc",
+ },
+ os_name = LINUX_NAME,
+ # Matches the value in @platforms//cpu package
+ arch = "s390x",
+ ),
+ "x86_64-apple-darwin": struct(
+ compatible_with = [
+ "@platforms//os:macos",
+ "@platforms//cpu:x86_64",
+ ],
+ flag_values = {},
+ os_name = MACOS_NAME,
+ # Matches the value in @platforms//cpu package
+ arch = "x86_64",
+ ),
+ "x86_64-pc-windows-msvc": struct(
+ compatible_with = [
+ "@platforms//os:windows",
+ "@platforms//cpu:x86_64",
+ ],
+ flag_values = {},
+ os_name = WINDOWS_NAME,
+ # Matches the value in @platforms//cpu package
+ arch = "x86_64",
+ ),
+ "x86_64-unknown-linux-gnu": struct(
+ compatible_with = [
+ "@platforms//os:linux",
+ "@platforms//cpu:x86_64",
+ ],
+ flag_values = {
+ libc: "glibc",
+ },
+ os_name = LINUX_NAME,
+ # Matches the value in @platforms//cpu package
+ arch = "x86_64",
+ ),
+ "x86_64-unknown-linux-musl": struct(
+ compatible_with = [
+ "@platforms//os:linux",
+ "@platforms//cpu:x86_64",
+ ],
+ flag_values = {
+ libc: "musl",
+ },
+ os_name = LINUX_NAME,
+ arch = "x86_64",
+ ),
+ }
+
+ freethreaded = Label("//python/config_settings:py_freethreaded")
+ return {
+ p + suffix: struct(
+ compatible_with = v.compatible_with,
+ flag_values = {
+ freethreaded: freethreaded_value,
+ } | v.flag_values,
+ os_name = v.os_name,
+ arch = v.arch,
+ )
+ for p, v in platforms.items()
+ for suffix, freethreaded_value in {
+ "": "no",
+ "-" + FREETHREADED: "yes",
+ }.items()
+ }
+
+PLATFORMS = _generate_platforms()
def get_release_info(platform, python_version, base_url = DEFAULT_RELEASE_BASE_URL, tool_versions = TOOL_VERSIONS):
"""Resolve the release URL for the requested interpreter version
@@ -731,10 +793,32 @@
release_filename = None
rendered_urls = []
for u in url:
+ p, _, _ = platform.partition("-" + FREETHREADED)
+
+ if FREETHREADED in platform:
+ build = "{}+{}-full".format(
+ FREETHREADED,
+ {
+ "aarch64-apple-darwin": "pgo+lto",
+ "aarch64-unknown-linux-gnu": "lto",
+ "ppc64le-unknown-linux-gnu": "lto",
+ "s390x-unknown-linux-gnu": "lto",
+ "x86_64-apple-darwin": "pgo+lto",
+ "x86_64-pc-windows-msvc": "pgo",
+ "x86_64-unknown-linux-gnu": "pgo+lto",
+ }[p],
+ )
+ else:
+ build = INSTALL_ONLY
+
+ if WINDOWS_NAME in platform:
+ build = "shared-" + build
+
release_filename = u.format(
- platform = platform,
+ platform = p,
python_version = python_version,
- build = "shared-install_only" if (WINDOWS_NAME in platform) else "install_only",
+ build = build,
+ ext = "tar.zst" if build.endswith("full") else "tar.gz",
)
if "://" in release_filename: # is absolute url?
rendered_urls.append(release_filename)
@@ -760,11 +844,18 @@
return (release_filename, rendered_urls, strip_prefix, patches, patch_strip)
def print_toolchains_checksums(name):
- native.genrule(
- name = name,
- srcs = [],
- outs = ["print_toolchains_checksums.sh"],
- cmd = """\
+ """A macro to print checksums for a particular Python interpreter version.
+
+ Args:
+ name: {type}`str`: the name of the runnable target.
+ """
+ all_commands = []
+ by_version = {}
+ for python_version in TOOL_VERSIONS.keys():
+ by_version[python_version] = _commands_for_version(python_version)
+ all_commands.append(_commands_for_version(python_version))
+
+ template = """\
cat > "$@" <<'EOF'
#!/bin/bash
@@ -774,12 +865,20 @@
{commands}
EOF
- """.format(
- commands = "\n".join([
- _commands_for_version(python_version)
- for python_version in TOOL_VERSIONS.keys()
- ]),
- ),
+ """
+
+ native.genrule(
+ name = name,
+ srcs = [],
+ outs = ["print_toolchains_checksums.sh"],
+ cmd = select({
+ "//python/config_settings:is_python_{}".format(version): template.format(
+ commands = commands,
+ )
+ for version, commands in by_version.items()
+ } | {
+ "//conditions:default": template.format(commands = "\n".join(all_commands)),
+ }),
executable = True,
)
diff --git a/sphinxdocs/docs/BUILD.bazel b/sphinxdocs/docs/BUILD.bazel
index 6af908d..070e048 100644
--- a/sphinxdocs/docs/BUILD.bazel
+++ b/sphinxdocs/docs/BUILD.bazel
@@ -1,4 +1,4 @@
-load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility
+load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility
load("//sphinxdocs:sphinx_docs_library.bzl", "sphinx_docs_library")
load("//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardocs")
@@ -14,7 +14,7 @@
"@platforms//os:linux": [],
"@platforms//os:macos": [],
"//conditions:default": ["@platforms//:incompatible"],
-}) if IS_BAZEL_7_OR_HIGHER else ["@platforms//:incompatible"]
+}) if BZLMOD_ENABLED else ["@platforms//:incompatible"]
sphinx_docs_library(
name = "docs_lib",
diff --git a/sphinxdocs/docs/index.md b/sphinxdocs/docs/index.md
index ac857d6..bd6448c 100644
--- a/sphinxdocs/docs/index.md
+++ b/sphinxdocs/docs/index.md
@@ -17,4 +17,5 @@
starlark-docgen
sphinx-bzl
+readthedocs
```
diff --git a/sphinxdocs/docs/readthedocs.md b/sphinxdocs/docs/readthedocs.md
new file mode 100644
index 0000000..66e4be8
--- /dev/null
+++ b/sphinxdocs/docs/readthedocs.md
@@ -0,0 +1,156 @@
+:::{default-domain} bzl
+:::
+
+# Read the Docs integration
+
+The {obj}`readthedocs_install` rule provides support for making it easy
+to build for, and deploy to, Read the Docs. It does this by having Bazel do
+all the work of building, and then the outputs are copied to where Read the Docs
+expects served content to be placed. By having Bazel do the majority of work,
+you have more certainty that the docs you generate locally will match what
+is created in the Read the Docs build environment.
+
+Setting this up is conceptually simple: make the Read the Docs build call `bazel
+run` with the appropriate args. To do this, it requires gluing a couple things
+together, most of which can be copy/pasted from the examples below.
+
+## `.readthedocs.yaml` config
+
+In order for Read the Docs to call our custom commands, we have to use the
+advanced `build.commands` setting of the config file. This needs to do two key
+things:
+1. Install Bazel
+2. Call `bazel run` with the appropriate args.
+
+In the example below, `npm` is used to install Bazelisk and a helper shell
+script, `readthedocs_build.sh` is used to construct the Bazel invocation.
+
+The key purpose of the shell script it to set the
+`--@rules_python//sphinxdocs:extra_env` and
+`--@rules_python//sphinxdocs:extra_defines` flags. These are used to communicate
+`READTHEDOCS*` environment variables and settings to the Bazel invocation.
+
+## BUILD config
+
+In your build file, the {obj}`readthedocs_install` rule handles building the
+docs and copying the output to the Read the Docs output directory
+(`$READTHEDOCS_OUTPUT` environment variable). As input, it takes a `sphinx_docs`
+target (the generated docs).
+
+## conf.py config
+
+Normally, readthedocs will inject extra content into your `conf.py` file
+to make certain integration available (e.g. the version selection flyout).
+However, because our yaml config uses the advanced `build.commands` feature,
+those config injections are disabled and we have to manually re-enable them.
+
+To do this, we modify `conf.py` to detect `READTHEDOCS=True` in the environment
+and perform some additional logic. See the example code below for the
+modifications.
+
+Depending on your theme, you may have to tweak the conf.py; the example is
+based on using the sphinx_rtd_theme.
+
+## Example
+
+```
+# File: .readthedocs.yaml
+version: 2
+
+build:
+ os: "ubuntu-22.04"
+ tools:
+ nodejs: "19"
+ commands:
+ - env
+ - npm install -g @bazel/bazelisk
+ - bazel version
+ # Put the actual action behind a shell script because it's
+ # easier to modify than the yaml config.
+ - docs/readthedocs_build.sh
+```
+
+```
+# File: docs/BUILD
+
+load("@rules_python//sphinxdocs:readthedocs.bzl.bzl", "readthedocs_install")
+readthedocs_install(
+ name = "readthedocs_install",
+ docs = [":docs"],
+)
+```
+
+```
+# File: docs/readthedocs_build.sh
+
+#!/bin/bash
+
+set -eou pipefail
+
+declare -a extra_env
+while IFS='=' read -r -d '' name value; do
+ if [[ "$name" == READTHEDOCS* ]]; then
+ extra_env+=("--@rules_python//sphinxdocs:extra_env=$name=$value")
+ fi
+done < <(env -0)
+
+# In order to get the build number, we extract it from the host name
+extra_env+=("--@rules_python//sphinxdocs:extra_env=HOSTNAME=$HOSTNAME")
+
+set -x
+bazel run \
+ --stamp \
+ "--@rules_python//sphinxdocs:extra_defines=version=$READTHEDOCS_VERSION" \
+ "${extra_env[@]}" \
+ //docs:readthedocs_install
+```
+
+```
+# File: docs/conf.py
+
+# Adapted from the template code:
+# https://github.com/readthedocs/readthedocs.org/blob/main/readthedocs/doc_builder/templates/doc_builder/conf.py.tmpl
+if os.environ.get("READTHEDOCS") == "True":
+ # Must come first because it can interfere with other extensions, according
+ # to the original conf.py template comments
+ extensions.insert(0, "readthedocs_ext.readthedocs")
+
+ if os.environ.get("READTHEDOCS_VERSION_TYPE") == "external":
+ # Insert after the main extension
+ extensions.insert(1, "readthedocs_ext.external_version_warning")
+ readthedocs_vcs_url = (
+ "http://github.com/bazelbuild/rules_python/pull/{}".format(
+ os.environ.get("READTHEDOCS_VERSION", "")
+ )
+ )
+ # The build id isn't directly available, but it appears to be encoded
+ # into the host name, so we can parse it from that. The format appears
+ # to be `build-X-project-Y-Z`, where:
+ # * X is an integer build id
+ # * Y is an integer project id
+ # * Z is the project name
+ _build_id = os.environ.get("HOSTNAME", "build-0-project-0-rules-python")
+ _build_id = _build_id.split("-")[1]
+ readthedocs_build_url = (
+ f"https://readthedocs.org/projects/rules-python/builds/{_build_id}"
+ )
+
+html_context = {
+ # This controls whether the flyout menu is shown. It is always false
+ # because:
+ # * For local builds, the flyout menu is empty and doesn't show in the
+ # same place as for RTD builds. No point in showing it locally.
+ # * For RTD builds, the flyout menu is always automatically injected,
+ # so having it be True makes the flyout show up twice.
+ "READTHEDOCS": False,
+ "github_version": os.environ.get("READTHEDOCS_GIT_IDENTIFIER", ""),
+ # For local builds, the github link won't work. Disabling it replaces
+ # it with a "view source" link to view the source Sphinx saw, which
+ # is useful for local development.
+ "display_github": os.environ.get("READTHEDOCS") == "True",
+ "commit": os.environ.get("READTHEDOCS_GIT_COMMIT_HASH", "unknown commit"),
+ # Used by readthedocs_ext.external_version_warning extension
+ # This is the PR number being built
+ "current_version": os.environ.get("READTHEDOCS_VERSION", ""),
+}
+```
diff --git a/sphinxdocs/private/sphinx.bzl b/sphinxdocs/private/sphinx.bzl
index 2ee6cfc..7ec35f9 100644
--- a/sphinxdocs/private/sphinx.bzl
+++ b/sphinxdocs/private/sphinx.bzl
@@ -190,6 +190,7 @@
sphinx_run(
name = name + ".run",
docs = name,
+ **common_kwargs
)
build_test(
@@ -325,7 +326,12 @@
def _relocate(source_file, dest_path = None):
if not dest_path:
dest_path = source_file.short_path.removeprefix(ctx.attr.strip_prefix)
- dest_file = ctx.actions.declare_file(paths.join(source_prefix, dest_path))
+
+ dest_path = paths.join(source_prefix, dest_path)
+ if source_file.is_directory:
+ dest_file = ctx.actions.declare_directory(dest_path)
+ else:
+ dest_file = ctx.actions.declare_file(dest_path)
ctx.actions.symlink(
output = dest_file,
target_file = source_file,
diff --git a/sphinxdocs/tests/sphinx_docs/BUILD.bazel b/sphinxdocs/tests/sphinx_docs/BUILD.bazel
new file mode 100644
index 0000000..1a05db0
--- /dev/null
+++ b/sphinxdocs/tests/sphinx_docs/BUILD.bazel
@@ -0,0 +1,45 @@
+load("@bazel_skylib//rules:build_test.bzl", "build_test")
+load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility
+load("//sphinxdocs:sphinx.bzl", "sphinx_build_binary", "sphinx_docs")
+load(":defs.bzl", "gen_directory")
+
+# We only build for Linux and Mac because:
+# 1. The actual doc process only runs on Linux
+# 2. Mac is a common development platform, and is close enough to Linux
+# it's feasible to make work.
+# Making CI happy under Windows is too much of a headache, though, so we don't
+# bother with that.
+_TARGET_COMPATIBLE_WITH = select({
+ "@platforms//os:linux": [],
+ "@platforms//os:macos": [],
+ "//conditions:default": ["@platforms//:incompatible"],
+}) if IS_BAZEL_7_OR_HIGHER else ["@platforms//:incompatible"]
+
+sphinx_docs(
+ name = "docs",
+ srcs = glob(["*.md"]) + [
+ ":generated_directory",
+ ],
+ config = "conf.py",
+ formats = ["html"],
+ sphinx = ":sphinx-build",
+ target_compatible_with = _TARGET_COMPATIBLE_WITH,
+)
+
+gen_directory(
+ name = "generated_directory",
+)
+
+sphinx_build_binary(
+ name = "sphinx-build",
+ tags = ["manual"], # Only needed as part of sphinx doc building
+ deps = [
+ "@dev_pip//myst_parser",
+ "@dev_pip//sphinx",
+ ],
+)
+
+build_test(
+ name = "build_tests",
+ targets = [":docs"],
+)
diff --git a/sphinxdocs/tests/sphinx_docs/conf.py b/sphinxdocs/tests/sphinx_docs/conf.py
new file mode 100644
index 0000000..d96fa36
--- /dev/null
+++ b/sphinxdocs/tests/sphinx_docs/conf.py
@@ -0,0 +1,15 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# For the full list of built-in configuration values, see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+# -- Project info
+
+project = "Sphinx Docs Test"
+
+extensions = [
+ "myst_parser",
+]
+myst_enable_extensions = [
+ "colon_fence",
+]
diff --git a/sphinxdocs/tests/sphinx_docs/defs.bzl b/sphinxdocs/tests/sphinx_docs/defs.bzl
new file mode 100644
index 0000000..2e47ecc
--- /dev/null
+++ b/sphinxdocs/tests/sphinx_docs/defs.bzl
@@ -0,0 +1,19 @@
+"""Supporting code for tests."""
+
+def _gen_directory_impl(ctx):
+ out = ctx.actions.declare_directory(ctx.label.name)
+
+ ctx.actions.run_shell(
+ outputs = [out],
+ command = """
+echo "# Hello" > {outdir}/index.md
+""".format(
+ outdir = out.path,
+ ),
+ )
+
+ return [DefaultInfo(files = depset([out]))]
+
+gen_directory = rule(
+ implementation = _gen_directory_impl,
+)
diff --git a/sphinxdocs/tests/sphinx_docs/index.md b/sphinxdocs/tests/sphinx_docs/index.md
new file mode 100644
index 0000000..cdce641
--- /dev/null
+++ b/sphinxdocs/tests/sphinx_docs/index.md
@@ -0,0 +1,8 @@
+# Sphinx docs test
+
+:::{toctree}
+:glob:
+
+**
+genindex
+:::
diff --git a/tests/base_rules/base_tests.bzl b/tests/base_rules/base_tests.bzl
index ae298ed..3518e6f 100644
--- a/tests/base_rules/base_tests.bzl
+++ b/tests/base_rules/base_tests.bzl
@@ -43,7 +43,7 @@
)
def _produces_py_info_impl(ctx):
- return _create_py_info(ctx, BuiltinPyInfo)
+ return _create_py_info(ctx, PyInfo)
_produces_py_info = rule(
implementation = _produces_py_info_impl,
@@ -86,6 +86,9 @@
info.imports().contains("custom-import")
def _test_py_info_propagation_builtin(name, config):
+ if not BuiltinPyInfo:
+ rt_util.skip_test(name = name)
+ return
_py_info_propagation_setup(
name,
config,
diff --git a/tests/base_rules/py_info/py_info_tests.bzl b/tests/base_rules/py_info/py_info_tests.bzl
index 0f46d12..4067a59 100644
--- a/tests/base_rules/py_info/py_info_tests.bzl
+++ b/tests/base_rules/py_info/py_info_tests.bzl
@@ -39,7 +39,7 @@
providers.append(PyInfo(**kwargs))
# Handle Bazel 6 or if Bazel autoloading is enabled
- if not config.enable_pystar or PyInfo != BuiltinPyInfo:
+ if not config.enable_pystar or (BuiltinPyInfo and PyInfo != BuiltinPyInfo):
providers.append(BuiltinPyInfo(**{
k: kwargs[k]
for k in (
diff --git a/tests/bootstrap_impls/BUILD.bazel b/tests/bootstrap_impls/BUILD.bazel
index cd57715..8e50f34 100644
--- a/tests/bootstrap_impls/BUILD.bazel
+++ b/tests/bootstrap_impls/BUILD.bazel
@@ -11,14 +11,9 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
-
-load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility
load("//tests/support:sh_py_run_test.bzl", "py_reconfig_test", "sh_py_run_test")
-
-_SUPPORTS_BOOTSTRAP_SCRIPT = select({
- "@platforms//os:windows": ["@platforms//:incompatible"],
- "//conditions:default": [],
-}) if IS_BAZEL_7_OR_HIGHER else ["@platforms//:incompatible"]
+load("//tests/support:support.bzl", "SUPPORTS_BOOTSTRAP_SCRIPT")
+load(":venv_relative_path_tests.bzl", "relative_path_test_suite")
sh_py_run_test(
name = "run_binary_zip_no_test",
@@ -40,7 +35,7 @@
build_python_zip = "yes",
py_src = "bin.py",
sh_src = "run_binary_zip_yes_test.sh",
- target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT,
+ target_compatible_with = SUPPORTS_BOOTSTRAP_SCRIPT,
)
sh_py_run_test(
@@ -49,7 +44,7 @@
build_python_zip = "no",
py_src = "bin.py",
sh_src = "run_binary_zip_no_test.sh",
- target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT,
+ target_compatible_with = SUPPORTS_BOOTSTRAP_SCRIPT,
)
py_reconfig_test(
@@ -57,9 +52,9 @@
srcs = ["sys_path_order_test.py"],
bootstrap_impl = "script",
env = {"BOOTSTRAP": "script"},
- imports = ["./site-packages"],
+ imports = ["./USER_IMPORT/site-packages"],
main = "sys_path_order_test.py",
- target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT,
+ target_compatible_with = SUPPORTS_BOOTSTRAP_SCRIPT,
)
py_reconfig_test(
@@ -76,5 +71,16 @@
bootstrap_impl = "script",
py_src = "bin.py",
sh_src = "inherit_pythonsafepath_env_test.sh",
- target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT,
+ target_compatible_with = SUPPORTS_BOOTSTRAP_SCRIPT,
)
+
+sh_py_run_test(
+ name = "sys_executable_inherits_sys_path",
+ bootstrap_impl = "script",
+ imports = ["./MARKER"],
+ py_src = "call_sys_exe.py",
+ sh_src = "sys_executable_inherits_sys_path_test.sh",
+ target_compatible_with = SUPPORTS_BOOTSTRAP_SCRIPT,
+)
+
+relative_path_test_suite(name = "relative_path_tests")
diff --git a/tests/bootstrap_impls/a/b/c/BUILD.bazel b/tests/bootstrap_impls/a/b/c/BUILD.bazel
new file mode 100644
index 0000000..8ffcbcd
--- /dev/null
+++ b/tests/bootstrap_impls/a/b/c/BUILD.bazel
@@ -0,0 +1,15 @@
+load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility
+load("//tests/support:sh_py_run_test.bzl", "py_reconfig_test")
+
+_SUPPORTS_BOOTSTRAP_SCRIPT = select({
+ "@platforms//os:windows": ["@platforms//:incompatible"],
+ "//conditions:default": [],
+}) if IS_BAZEL_7_OR_HIGHER else ["@platforms//:incompatible"]
+
+py_reconfig_test(
+ name = "nested_dir_test",
+ srcs = ["nested_dir_test.py"],
+ bootstrap_impl = "script",
+ main = "nested_dir_test.py",
+ target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT,
+)
diff --git a/python/private/py_library_macro_bazel.bzl b/tests/bootstrap_impls/a/b/c/nested_dir_test.py
similarity index 66%
copy from python/private/py_library_macro_bazel.bzl
copy to tests/bootstrap_impls/a/b/c/nested_dir_test.py
index b4f51ef..2db0e6c 100644
--- a/python/private/py_library_macro_bazel.bzl
+++ b/tests/bootstrap_impls/a/b/c/nested_dir_test.py
@@ -1,4 +1,4 @@
-# Copyright 2022 The Bazel Authors. All rights reserved.
+# Copyright 2024 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -11,9 +11,14 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
-"""Implementation of macro-half of py_library rule."""
+"""Test that the binary being a different directory depth than the underlying interpreter works."""
-load(":py_library_rule_bazel.bzl", py_library_rule = "py_library")
+import unittest
-def py_library(**kwargs):
- py_library_rule(**kwargs)
+
+class RunsTest(unittest.TestCase):
+ def test_runs(self):
+ pass
+
+
+unittest.main()
diff --git a/tests/bootstrap_impls/call_sys_exe.py b/tests/bootstrap_impls/call_sys_exe.py
new file mode 100644
index 0000000..0c61570
--- /dev/null
+++ b/tests/bootstrap_impls/call_sys_exe.py
@@ -0,0 +1,51 @@
+# Copyright 2024 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import os
+import subprocess
+import sys
+
+print("outer sys.path:")
+for i, x in enumerate(sys.path):
+ print(i, x)
+print()
+
+outer_paths = set(sys.path)
+output = subprocess.check_output(
+ [
+ sys.executable,
+ "-c",
+ "import sys; [print(v) for v in sys.path]",
+ ],
+ text=True,
+)
+inner_lines = [v for v in output.splitlines() if v.strip()]
+print("inner sys.path:")
+for i, v in enumerate(inner_lines):
+ print(i, v)
+print()
+
+inner_paths = set(inner_lines)
+common = sorted(outer_paths.intersection(inner_paths))
+extra_outer = sorted(outer_paths - inner_paths)
+extra_inner = sorted(inner_paths - outer_paths)
+
+for v in common:
+ print("common:", v)
+print()
+for v in extra_outer:
+ print("extra_outer:", v)
+print()
+for v in extra_inner:
+ print("extra_inner:", v)
diff --git a/tests/bootstrap_impls/sys_executable_inherits_sys_path_test.sh b/tests/bootstrap_impls/sys_executable_inherits_sys_path_test.sh
new file mode 100755
index 0000000..ca4d7aa
--- /dev/null
+++ b/tests/bootstrap_impls/sys_executable_inherits_sys_path_test.sh
@@ -0,0 +1,47 @@
+# Copyright 2024 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# --- begin runfiles.bash initialization v3 ---
+# Copy-pasted from the Bazel Bash runfiles library v3.
+set -uo pipefail; set +e; f=bazel_tools/tools/bash/runfiles/runfiles.bash
+source "${RUNFILES_DIR:-/dev/null}/$f" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "${RUNFILES_MANIFEST_FILE:-/dev/null}" | cut -f2- -d' ')" 2>/dev/null || \
+ source "$0.runfiles/$f" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "$0.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "$0.exe.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+ { echo>&2 "ERROR: cannot find $f"; exit 1; }; f=; set -e
+# --- end runfiles.bash initialization v3 ---
+set +e
+
+bin=$(rlocation $BIN_RLOCATION)
+if [[ -z "$bin" ]]; then
+ echo "Unable to locate test binary: $BIN_RLOCATION"
+ exit 1
+fi
+
+actual=$($bin)
+function assert_pattern () {
+ expected_pattern=$1
+ if ! (echo "$actual" | grep "$expected_pattern" ) >/dev/null; then
+ echo "Test case failed"
+ echo "expected output to match: $expected_pattern"
+ echo "but got: "
+ echo "$actual"
+ exit 1
+ fi
+}
+
+assert_pattern "common.*/MARKER"
+
+exit 0
diff --git a/tests/bootstrap_impls/sys_path_order_test.py b/tests/bootstrap_impls/sys_path_order_test.py
index 2e33464..97c62a6 100644
--- a/tests/bootstrap_impls/sys_path_order_test.py
+++ b/tests/bootstrap_impls/sys_path_order_test.py
@@ -35,9 +35,9 @@
for i, value in enumerate(sys.path):
# The runtime's root repo may be added to sys.path, but it
# counts as a user directory, not stdlib directory.
- if value == sys.prefix:
+ if value in (sys.prefix, sys.base_prefix):
category = "user"
- elif value.startswith(sys.prefix):
+ elif value.startswith(sys.base_prefix):
# The runtime's site-package directory might be called
# dist-packages when using Debian's system python.
if os.path.basename(value).endswith("-packages"):
@@ -67,19 +67,29 @@
self.fail(
"Failed to find position for one of:\n"
+ f"{last_stdlib=} {first_user=} {first_runtime_site=}\n"
+ + f"for sys.prefix={sys.prefix}\n"
+ + f"for sys.exec_prefix={sys.exec_prefix}\n"
+ + f"for sys.base_prefix={sys.base_prefix}\n"
+ f"for sys.path:\n{sys_path_str}"
)
if os.environ["BOOTSTRAP"] == "script":
self.assertTrue(
last_stdlib < first_user < first_runtime_site,
- f"Expected {last_stdlib=} < {first_user=} < {first_runtime_site=}\n"
+ "Expected overall order to be (stdlib, user imports, runtime site) "
+ + f"with {last_stdlib=} < {first_user=} < {first_runtime_site=}\n"
+ + f"for sys.prefix={sys.prefix}\n"
+ + f"for sys.exec_prefix={sys.exec_prefix}\n"
+ + f"for sys.base_prefix={sys.base_prefix}\n"
+ f"for sys.path:\n{sys_path_str}",
)
else:
self.assertTrue(
first_user < last_stdlib < first_runtime_site,
f"Expected {first_user=} < {last_stdlib=} < {first_runtime_site=}\n"
+ + f"for sys.prefix={sys.prefix}\n"
+ + f"for sys.exec_prefix={sys.exec_prefix}\n"
+ + f"for sys.base_prefix={sys.base_prefix}\n"
+ f"for sys.path:\n{sys_path_str}",
)
diff --git a/tests/bootstrap_impls/venv_relative_path_tests.bzl b/tests/bootstrap_impls/venv_relative_path_tests.bzl
new file mode 100644
index 0000000..b21f220
--- /dev/null
+++ b/tests/bootstrap_impls/venv_relative_path_tests.bzl
@@ -0,0 +1,90 @@
+# Copyright 2023 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"Unit tests for relative_path computation"
+
+load("@rules_testing//lib:test_suite.bzl", "test_suite")
+load("//python/private:py_executable_bazel.bzl", "relative_path") # buildifier: disable=bzl-visibility
+
+_tests = []
+
+def _relative_path_test(env):
+ # Basic test cases
+
+ env.expect.that_str(
+ relative_path(
+ from_ = "a/b",
+ to = "c/d",
+ ),
+ ).equals("../../c/d")
+
+ env.expect.that_str(
+ relative_path(
+ from_ = "a/b/c",
+ to = "a/d",
+ ),
+ ).equals("../../d")
+ env.expect.that_str(
+ relative_path(
+ from_ = "a/b/c",
+ to = "a/b/c/d/e",
+ ),
+ ).equals("d/e")
+
+ # Real examples
+
+ # external py_binary uses external python runtime
+ env.expect.that_str(
+ relative_path(
+ from_ = "other_repo~/python/private/_py_console_script_gen_py.venv/bin",
+ to = "rules_python~~python~python_3_9_x86_64-unknown-linux-gnu/bin/python3",
+ ),
+ ).equals(
+ "../../../../../rules_python~~python~python_3_9_x86_64-unknown-linux-gnu/bin/python3",
+ )
+
+ # internal py_binary uses external python runtime
+ env.expect.that_str(
+ relative_path(
+ from_ = "_main/test/version_default.venv/bin",
+ to = "rules_python~~python~python_3_9_x86_64-unknown-linux-gnu/bin/python3",
+ ),
+ ).equals(
+ "../../../../rules_python~~python~python_3_9_x86_64-unknown-linux-gnu/bin/python3",
+ )
+
+ # external py_binary uses internal python runtime
+ env.expect.that_str(
+ relative_path(
+ from_ = "other_repo~/python/private/_py_console_script_gen_py.venv/bin",
+ to = "_main/python/python_3_9_x86_64-unknown-linux-gnu/bin/python3",
+ ),
+ ).equals(
+ "../../../../../_main/python/python_3_9_x86_64-unknown-linux-gnu/bin/python3",
+ )
+
+ # internal py_binary uses internal python runtime
+ env.expect.that_str(
+ relative_path(
+ from_ = "_main/scratch/main.venv/bin",
+ to = "_main/python/python_3_9_x86_64-unknown-linux-gnu/bin/python3",
+ ),
+ ).equals(
+ "../../../python/python_3_9_x86_64-unknown-linux-gnu/bin/python3",
+ )
+
+_tests.append(_relative_path_test)
+
+def relative_path_test_suite(*, name):
+ test_suite(name = name, basic_tests = _tests)
diff --git a/tests/cc/current_py_cc_headers/current_py_cc_headers_tests.bzl b/tests/cc/current_py_cc_headers/current_py_cc_headers_tests.bzl
index 8bbdace..d07d08a 100644
--- a/tests/cc/current_py_cc_headers/current_py_cc_headers_tests.bzl
+++ b/tests/cc/current_py_cc_headers/current_py_cc_headers_tests.bzl
@@ -14,7 +14,7 @@
"""Tests for current_py_cc_headers."""
-load("@rules_cc//cc:defs.bzl", "CcInfo")
+load("@rules_cc//cc/common:cc_info.bzl", "CcInfo")
load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite")
load("@rules_testing//lib:truth.bzl", "matching")
load("//tests/support:cc_info_subject.bzl", "cc_info_subject")
diff --git a/tests/cc/current_py_cc_libs/BUILD.bazel b/tests/cc/current_py_cc_libs/BUILD.bazel
index 2180555..9269553 100644
--- a/tests/cc/current_py_cc_libs/BUILD.bazel
+++ b/tests/cc/current_py_cc_libs/BUILD.bazel
@@ -20,14 +20,23 @@
cc_test(
name = "python_libs_linking_test",
srcs = ["python_libs_linking_test.cc"],
- # Windows fails with linking errors, but its not clear why; someone
- # with more C + Windows experience will have to figure it out.
- # - rickeylev@
- target_compatible_with = select({
- "@platforms//os:linux": [],
- "@platforms//os:osx": [],
- "//conditions:default": ["@platforms//:incompatible"],
- }),
+ deps = [
+ "@rules_python//python/cc:current_py_cc_headers",
+ "@rules_python//python/cc:current_py_cc_libs",
+ ],
+)
+
+# This is technically a headers test, but since the pyconfig.h header
+# designates the appropriate lib to link on Win+MSVC, this test verifies that
+# the expected Windows libraries are all present in the expected location.
+# Since we define the Py_LIMITED_API macro, we expect the linker to go search
+# for libs/python3.lib.
+# buildifier: disable=native-cc
+cc_test(
+ name = "python_abi3_libs_linking_windows_test",
+ srcs = ["python_libs_linking_test.cc"],
+ defines = ["Py_LIMITED_API=0x030A0000"],
+ target_compatible_with = ["@platforms//os:windows"],
deps = [
"@rules_python//python/cc:current_py_cc_headers",
"@rules_python//python/cc:current_py_cc_libs",
diff --git a/tests/cc/current_py_cc_libs/current_py_cc_libs_tests.bzl b/tests/cc/current_py_cc_libs/current_py_cc_libs_tests.bzl
index 4a08ce7..26f9724 100644
--- a/tests/cc/current_py_cc_libs/current_py_cc_libs_tests.bzl
+++ b/tests/cc/current_py_cc_libs/current_py_cc_libs_tests.bzl
@@ -14,7 +14,7 @@
"""Tests for current_py_cc_libs."""
-load("@rules_cc//cc:defs.bzl", "CcInfo")
+load("@rules_cc//cc/common:cc_info.bzl", "CcInfo")
load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite")
load("@rules_testing//lib:truth.bzl", "matching")
load("//tests/support:cc_info_subject.bzl", "cc_info_subject")
diff --git a/tests/cc/current_py_cc_libs/python_libs_linking_test.cc b/tests/cc/current_py_cc_libs/python_libs_linking_test.cc
index 1ecce08..2f26a2c 100644
--- a/tests/cc/current_py_cc_libs/python_libs_linking_test.cc
+++ b/tests/cc/current_py_cc_libs/python_libs_linking_test.cc
@@ -12,7 +12,7 @@
// To make it actually run, more custom initialization is necessary.
// See https://docs.python.org/3/c-api/intro.html#embedding-python
Py_Initialize();
- PyRun_SimpleString("print('Hello, world')\n");
+ Py_BytesMain(argc, argv);
Py_Finalize();
return 0;
}
diff --git a/tests/config_settings/transition/multi_version_tests.bzl b/tests/config_settings/transition/multi_version_tests.bzl
index 367837b..5805bab 100644
--- a/tests/config_settings/transition/multi_version_tests.bzl
+++ b/tests/config_settings/transition/multi_version_tests.bzl
@@ -49,7 +49,8 @@
def _test_py_test_with_transition_impl(env, target):
# Nothing to assert; we just want to make sure it builds
env.expect.that_target(target).has_provider(PyInfo)
- env.expect.that_target(target).has_provider(BuiltinPyInfo)
+ if BuiltinPyInfo:
+ env.expect.that_target(target).has_provider(BuiltinPyInfo)
_tests.append(_test_py_test_with_transition)
@@ -70,7 +71,8 @@
def _test_py_binary_with_transition_impl(env, target):
# Nothing to assert; we just want to make sure it builds
env.expect.that_target(target).has_provider(PyInfo)
- env.expect.that_target(target).has_provider(BuiltinPyInfo)
+ if BuiltinPyInfo:
+ env.expect.that_target(target).has_provider(BuiltinPyInfo)
_tests.append(_test_py_binary_with_transition)
diff --git a/tests/integration/compile_pip_requirements/.bazelrc b/tests/integration/compile_pip_requirements/.bazelrc
index 8a42e64..b85f03b 100644
--- a/tests/integration/compile_pip_requirements/.bazelrc
+++ b/tests/integration/compile_pip_requirements/.bazelrc
@@ -2,3 +2,4 @@
# Windows requires these for multi-python support:
build --enable_runfiles
+common:bazel7.x --incompatible_python_disallow_native_rules
diff --git a/tests/integration/compile_pip_requirements_test_from_external_repo/.bazelrc b/tests/integration/compile_pip_requirements_test_from_external_repo/.bazelrc
index b98fc09..ab10c8c 100644
--- a/tests/integration/compile_pip_requirements_test_from_external_repo/.bazelrc
+++ b/tests/integration/compile_pip_requirements_test_from_external_repo/.bazelrc
@@ -1 +1,2 @@
test --test_output=errors
+common:bazel7.x --incompatible_python_disallow_native_rules
diff --git a/tests/integration/compile_pip_requirements_test_from_external_repo/WORKSPACE b/tests/integration/compile_pip_requirements_test_from_external_repo/WORKSPACE
index 48caeb4..7834000 100644
--- a/tests/integration/compile_pip_requirements_test_from_external_repo/WORKSPACE
+++ b/tests/integration/compile_pip_requirements_test_from_external_repo/WORKSPACE
@@ -12,7 +12,6 @@
python_version = "3.9",
)
-load("@python39//:defs.bzl", "interpreter")
load("@rules_python//python:pip.bzl", "pip_parse")
local_repository(
@@ -22,7 +21,7 @@
pip_parse(
name = "pypi",
- python_interpreter_target = interpreter,
+ python_interpreter_target = "@python39_host//:python",
requirements_lock = "@compile_pip_requirements//:requirements_lock.txt",
)
diff --git a/tests/integration/ignore_root_user_error/.bazelrc b/tests/integration/ignore_root_user_error/.bazelrc
index 27d7d13..bb7b574 100644
--- a/tests/integration/ignore_root_user_error/.bazelrc
+++ b/tests/integration/ignore_root_user_error/.bazelrc
@@ -4,3 +4,4 @@
# Windows requires these for multi-python support:
build --enable_runfiles
+common:bazel7.x --incompatible_python_disallow_native_rules
diff --git a/tests/integration/ignore_root_user_error/WORKSPACE b/tests/integration/ignore_root_user_error/WORKSPACE
index c21b01e..0a25819 100644
--- a/tests/integration/ignore_root_user_error/WORKSPACE
+++ b/tests/integration/ignore_root_user_error/WORKSPACE
@@ -1,3 +1,5 @@
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+
local_repository(
name = "rules_python",
path = "../../..",
@@ -13,8 +15,6 @@
python_version = "3.9",
)
-load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
-
http_archive(
name = "bazel_skylib",
sha256 = "c6966ec828da198c5d9adbaa94c05e3a1c7f21bd012a0b29ba8ddbccb2c93b0d",
diff --git a/tests/integration/ignore_root_user_error/bzlmod_test.py b/tests/integration/ignore_root_user_error/bzlmod_test.py
index 1283415..a1d6dc0 100644
--- a/tests/integration/ignore_root_user_error/bzlmod_test.py
+++ b/tests/integration/ignore_root_user_error/bzlmod_test.py
@@ -20,26 +20,20 @@
class BzlmodTest(unittest.TestCase):
- def test_toolchains(self):
+ def test_ignore_root_user_error_true_for_all_toolchains(self):
rf = runfiles.Create()
debug_path = pathlib.Path(
rf.Rlocation("rules_python_bzlmod_debug/debug_info.json")
)
debug_info = json.loads(debug_path.read_bytes())
-
- expected = [
- {
- "ignore_root_user_error": True,
- "module": {"is_root": False, "name": "submodule"},
- "name": "python_3_10",
- },
- {
- "ignore_root_user_error": True,
- "module": {"is_root": True, "name": "ignore_root_user_error"},
- "name": "python_3_11",
- },
- ]
- self.assertCountEqual(debug_info["toolchains_registered"], expected)
+ actual = debug_info["toolchains_registered"]
+ # Because the root module set ignore_root_user_error=True, that should
+ # be the default for all other toolchains.
+ for entry in actual:
+ self.assertTrue(
+ entry["ignore_root_user_error"],
+ msg=f"Expected ignore_root_user_error=True, but got: {entry}",
+ )
if __name__ == "__main__":
diff --git a/tests/integration/local_toolchains/.bazelrc b/tests/integration/local_toolchains/.bazelrc
index 551df40..39df41d 100644
--- a/tests/integration/local_toolchains/.bazelrc
+++ b/tests/integration/local_toolchains/.bazelrc
@@ -3,3 +3,4 @@
test --test_output=errors
# Windows requires these for multi-python support:
build --enable_runfiles
+common:bazel7.x --incompatible_python_disallow_native_rules
diff --git a/tests/integration/local_toolchains/test.py b/tests/integration/local_toolchains/test.py
index 63771cf..d85a4c3 100644
--- a/tests/integration/local_toolchains/test.py
+++ b/tests/integration/local_toolchains/test.py
@@ -18,8 +18,9 @@
[shell_path, "-c", "import sys; print(sys.executable)"],
text=True,
)
- expected = expected.strip()
- self.assertEqual(expected, sys.executable)
+ expected = expected.strip().lower()
+ # Normalize case: Windows may have case differences
+ self.assertEqual(expected.lower(), sys.executable.lower())
if __name__ == "__main__":
diff --git a/tests/integration/pip_parse/.bazelrc b/tests/integration/pip_parse/.bazelrc
index efeccbe..a749092 100644
--- a/tests/integration/pip_parse/.bazelrc
+++ b/tests/integration/pip_parse/.bazelrc
@@ -5,3 +5,4 @@
# https://docs.bazel.build/versions/main/best-practices.html#using-the-bazelrc-file
try-import %workspace%/user.bazelrc
+common:bazel7.x --incompatible_python_disallow_native_rules
diff --git a/tests/integration/pip_parse/WORKSPACE b/tests/integration/pip_parse/WORKSPACE
index db0cd0c..e31655d 100644
--- a/tests/integration/pip_parse/WORKSPACE
+++ b/tests/integration/pip_parse/WORKSPACE
@@ -7,15 +7,6 @@
py_repositories()
-# This call is included in `py_repositories` and we are calling
-# `pip_install_dependencies` only to ensure that we are not breaking really old
-# code.
-#
-# TODO @aignas 2024-06-23: remove this before 1.0.0
-load("@rules_python//python/pip_install:repositories.bzl", "pip_install_dependencies")
-
-pip_install_dependencies()
-
python_register_toolchains(
name = "python39",
python_version = "3.9",
diff --git a/tests/integration/py_cc_toolchain_registered/.bazelrc b/tests/integration/py_cc_toolchain_registered/.bazelrc
index 741d758..fb31561 100644
--- a/tests/integration/py_cc_toolchain_registered/.bazelrc
+++ b/tests/integration/py_cc_toolchain_registered/.bazelrc
@@ -1,2 +1,3 @@
# This aids debugging on failure
build --toolchain_resolution_debug=python
+common:bazel7.x --incompatible_python_disallow_native_rules
diff --git a/tests/no_unsafe_paths/BUILD.bazel b/tests/no_unsafe_paths/BUILD.bazel
new file mode 100644
index 0000000..f12d1c9
--- /dev/null
+++ b/tests/no_unsafe_paths/BUILD.bazel
@@ -0,0 +1,33 @@
+# Copyright 2024 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+load("//tests/support:sh_py_run_test.bzl", "py_reconfig_test")
+load("//tests/support:support.bzl", "SUPPORTS_BOOTSTRAP_SCRIPT")
+
+py_reconfig_test(
+ name = "no_unsafe_paths_3.10_test",
+ srcs = ["test.py"],
+ bootstrap_impl = "script",
+ main = "test.py",
+ python_version = "3.10",
+ target_compatible_with = SUPPORTS_BOOTSTRAP_SCRIPT,
+)
+
+py_reconfig_test(
+ name = "no_unsafe_paths_3.11_test",
+ srcs = ["test.py"],
+ bootstrap_impl = "script",
+ main = "test.py",
+ python_version = "3.11",
+ target_compatible_with = SUPPORTS_BOOTSTRAP_SCRIPT,
+)
diff --git a/tests/no_unsafe_paths/test.py b/tests/no_unsafe_paths/test.py
new file mode 100644
index 0000000..1f6cd4e
--- /dev/null
+++ b/tests/no_unsafe_paths/test.py
@@ -0,0 +1,44 @@
+# Copyright 2024 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import os
+import sys
+import unittest
+
+
+class NoUnsafePathsTest(unittest.TestCase):
+ def test_no_unsafe_paths_in_search_path(self):
+ # Based on sys.path documentation, the first item added is the zip
+ # archive
+ # (see: https://docs.python.org/3/library/sys_path_init.html)
+ #
+ # We can use this as a marker to verify that during bootstrapping,
+ # (1) no unexpected paths were prepended, and (2) no paths were
+ # accidentally dropped.
+ #
+ major, minor, *_ = sys.version_info
+ archive = f"python{major}{minor}.zip"
+
+ # < Python 3.11 behaviour
+ if (major, minor) < (3, 11):
+ # Because of https://github.com/bazelbuild/rules_python/blob/0.39.0/python/private/stage2_bootstrap_template.py#L415-L436
+ self.assertEqual(os.path.dirname(sys.argv[0]), sys.path[0])
+ self.assertEqual(os.path.basename(sys.path[1]), archive)
+ # >= Python 3.11 behaviour
+ else:
+ self.assertEqual(os.path.basename(sys.path[0]), archive)
+
+
+if __name__ == '__main__':
+ unittest.main()
\ No newline at end of file
diff --git a/tests/py_runtime_pair/py_runtime_pair_tests.bzl b/tests/py_runtime_pair/py_runtime_pair_tests.bzl
index e89e080..f865697 100644
--- a/tests/py_runtime_pair/py_runtime_pair_tests.bzl
+++ b/tests/py_runtime_pair/py_runtime_pair_tests.bzl
@@ -76,6 +76,9 @@
_tests.append(_test_basic)
def _test_builtin_py_info_accepted(name):
+ if not BuiltinPyRuntimeInfo:
+ rt_util.skip_test(name = name)
+ return
rt_util.helper_target(
_provides_builtin_py_runtime_info,
name = name + "_runtime",
diff --git a/python/pip_install/repositories.bzl b/tests/pypi/extension/BUILD.bazel
similarity index 76%
rename from python/pip_install/repositories.bzl
rename to tests/pypi/extension/BUILD.bazel
index 5231d1f..39000e8 100644
--- a/python/pip_install/repositories.bzl
+++ b/tests/pypi/extension/BUILD.bazel
@@ -1,4 +1,4 @@
-# Copyright 2023 The Bazel Authors. All rights reserved.
+# Copyright 2024 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -12,8 +12,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-""
+load(":extension_tests.bzl", "extension_test_suite")
-load("//python/private/pypi:deps.bzl", "pypi_deps")
-
-pip_install_dependencies = pypi_deps
+extension_test_suite(name = "extension_tests")
diff --git a/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl
new file mode 100644
index 0000000..b942779
--- /dev/null
+++ b/tests/pypi/extension/extension_tests.bzl
@@ -0,0 +1,583 @@
+# Copyright 2024 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+""
+
+load("@rules_testing//lib:test_suite.bzl", "test_suite")
+load("@rules_testing//lib:truth.bzl", "subjects")
+load("//python/private/pypi:extension.bzl", "parse_modules") # buildifier: disable=bzl-visibility
+load("//python/private/pypi:whl_config_setting.bzl", "whl_config_setting") # buildifier: disable=bzl-visibility
+
+_tests = []
+
+def _mock_mctx(*modules, environ = {}, read = None):
+ return struct(
+ os = struct(
+ environ = environ,
+ name = "unittest",
+ arch = "exotic",
+ ),
+ read = read or (lambda _: "simple==0.0.1 --hash=sha256:deadbeef --hash=sha256:deadbaaf"),
+ modules = [
+ struct(
+ name = modules[0].name,
+ tags = modules[0].tags,
+ is_root = modules[0].is_root,
+ ),
+ ] + [
+ struct(
+ name = mod.name,
+ tags = mod.tags,
+ is_root = False,
+ )
+ for mod in modules[1:]
+ ],
+ )
+
+def _mod(*, name, parse = [], override = [], whl_mods = [], is_root = True):
+ return struct(
+ name = name,
+ tags = struct(
+ parse = parse,
+ override = override,
+ whl_mods = whl_mods,
+ ),
+ is_root = is_root,
+ )
+
+def _parse_modules(env, **kwargs):
+ return env.expect.that_struct(
+ parse_modules(**kwargs),
+ attrs = dict(
+ is_reproducible = subjects.bool,
+ exposed_packages = subjects.dict,
+ hub_group_map = subjects.dict,
+ hub_whl_map = subjects.dict,
+ whl_libraries = subjects.dict,
+ whl_mods = subjects.dict,
+ ),
+ )
+
+def _parse(
+ *,
+ hub_name,
+ python_version,
+ _evaluate_markers_srcs = [],
+ auth_patterns = {},
+ download_only = False,
+ enable_implicit_namespace_pkgs = False,
+ environment = {},
+ envsubst = {},
+ experimental_index_url = "",
+ experimental_requirement_cycles = {},
+ experimental_target_platforms = [],
+ extra_hub_aliases = {},
+ extra_pip_args = [],
+ isolated = True,
+ netrc = None,
+ parse_all_requirements_files = True,
+ pip_data_exclude = None,
+ python_interpreter = None,
+ python_interpreter_target = None,
+ quiet = True,
+ requirements_by_platform = {},
+ requirements_darwin = None,
+ requirements_linux = None,
+ requirements_lock = None,
+ requirements_windows = None,
+ timeout = 600,
+ whl_modifications = {},
+ **kwargs):
+ return struct(
+ _evaluate_markers_srcs = _evaluate_markers_srcs,
+ auth_patterns = auth_patterns,
+ download_only = download_only,
+ enable_implicit_namespace_pkgs = enable_implicit_namespace_pkgs,
+ environment = environment,
+ envsubst = envsubst,
+ experimental_index_url = experimental_index_url,
+ experimental_requirement_cycles = experimental_requirement_cycles,
+ experimental_target_platforms = experimental_target_platforms,
+ extra_hub_aliases = extra_hub_aliases,
+ extra_pip_args = extra_pip_args,
+ hub_name = hub_name,
+ isolated = isolated,
+ netrc = netrc,
+ parse_all_requirements_files = parse_all_requirements_files,
+ pip_data_exclude = pip_data_exclude,
+ python_interpreter = python_interpreter,
+ python_interpreter_target = python_interpreter_target,
+ python_version = python_version,
+ quiet = quiet,
+ requirements_by_platform = requirements_by_platform,
+ requirements_darwin = requirements_darwin,
+ requirements_linux = requirements_linux,
+ requirements_lock = requirements_lock,
+ requirements_windows = requirements_windows,
+ timeout = timeout,
+ whl_modifications = whl_modifications,
+ # The following are covered by other unit tests
+ experimental_extra_index_urls = [],
+ parallel_download = False,
+ experimental_index_url_overrides = {},
+ **kwargs
+ )
+
+def _test_simple(env):
+ pypi = _parse_modules(
+ env,
+ module_ctx = _mock_mctx(
+ _mod(
+ name = "rules_python",
+ parse = [
+ _parse(
+ hub_name = "pypi",
+ python_version = "3.15",
+ requirements_lock = "requirements.txt",
+ ),
+ ],
+ ),
+ ),
+ available_interpreters = {
+ "python_3_15_host": "unit_test_interpreter_target",
+ },
+ )
+
+ pypi.is_reproducible().equals(True)
+ pypi.exposed_packages().contains_exactly({"pypi": ["simple"]})
+ pypi.hub_group_map().contains_exactly({"pypi": {}})
+ pypi.hub_whl_map().contains_exactly({"pypi": {
+ "simple": {
+ "pypi_315_simple": [
+ whl_config_setting(
+ version = "3.15",
+ ),
+ ],
+ },
+ }})
+ pypi.whl_libraries().contains_exactly({
+ "pypi_315_simple": {
+ "dep_template": "@pypi//{name}:{target}",
+ "python_interpreter_target": "unit_test_interpreter_target",
+ "repo": "pypi_315",
+ "requirement": "simple==0.0.1 --hash=sha256:deadbeef --hash=sha256:deadbaaf",
+ },
+ })
+ pypi.whl_mods().contains_exactly({})
+
+_tests.append(_test_simple)
+
+def _test_simple_multiple_requirements(env):
+ pypi = _parse_modules(
+ env,
+ module_ctx = _mock_mctx(
+ _mod(
+ name = "rules_python",
+ parse = [
+ _parse(
+ hub_name = "pypi",
+ python_version = "3.15",
+ requirements_darwin = "darwin.txt",
+ requirements_windows = "win.txt",
+ ),
+ ],
+ ),
+ read = lambda x: {
+ "darwin.txt": "simple==0.0.2 --hash=sha256:deadb00f",
+ "win.txt": "simple==0.0.1 --hash=sha256:deadbeef",
+ }[x],
+ ),
+ available_interpreters = {
+ "python_3_15_host": "unit_test_interpreter_target",
+ },
+ )
+
+ pypi.is_reproducible().equals(True)
+ pypi.exposed_packages().contains_exactly({"pypi": ["simple"]})
+ pypi.hub_group_map().contains_exactly({"pypi": {}})
+ pypi.hub_whl_map().contains_exactly({"pypi": {
+ "simple": {
+ "pypi_315_simple_osx_aarch64_osx_x86_64": [
+ whl_config_setting(
+ target_platforms = [
+ "cp315_osx_aarch64",
+ "cp315_osx_x86_64",
+ ],
+ version = "3.15",
+ ),
+ ],
+ "pypi_315_simple_windows_x86_64": [
+ whl_config_setting(
+ target_platforms = [
+ "cp315_windows_x86_64",
+ ],
+ version = "3.15",
+ ),
+ ],
+ },
+ }})
+ pypi.whl_libraries().contains_exactly({
+ "pypi_315_simple_osx_aarch64_osx_x86_64": {
+ "dep_template": "@pypi//{name}:{target}",
+ "python_interpreter_target": "unit_test_interpreter_target",
+ "repo": "pypi_315",
+ "requirement": "simple==0.0.2 --hash=sha256:deadb00f",
+ },
+ "pypi_315_simple_windows_x86_64": {
+ "dep_template": "@pypi//{name}:{target}",
+ "python_interpreter_target": "unit_test_interpreter_target",
+ "repo": "pypi_315",
+ "requirement": "simple==0.0.1 --hash=sha256:deadbeef",
+ },
+ })
+ pypi.whl_mods().contains_exactly({})
+
+_tests.append(_test_simple_multiple_requirements)
+
+def _test_simple_with_markers(env):
+ pypi = _parse_modules(
+ env,
+ module_ctx = _mock_mctx(
+ _mod(
+ name = "rules_python",
+ parse = [
+ _parse(
+ hub_name = "pypi",
+ python_version = "3.15",
+ requirements_lock = "universal.txt",
+ ),
+ ],
+ ),
+ read = lambda x: {
+ "universal.txt": """\
+torch==2.4.1+cpu ; platform_machine == 'x86_64'
+torch==2.4.1 ; platform_machine != 'x86_64'
+""",
+ }[x],
+ ),
+ available_interpreters = {
+ "python_3_15_host": "unit_test_interpreter_target",
+ },
+ evaluate_markers = lambda _, requirements, **__: {
+ key: [
+ platform
+ for platform in platforms
+ if ("x86_64" in platform and "platform_machine ==" in key) or ("x86_64" not in platform and "platform_machine !=" in key)
+ ]
+ for key, platforms in requirements.items()
+ },
+ )
+
+ pypi.is_reproducible().equals(True)
+ pypi.exposed_packages().contains_exactly({"pypi": ["torch"]})
+ pypi.hub_group_map().contains_exactly({"pypi": {}})
+ pypi.hub_whl_map().contains_exactly({"pypi": {
+ "torch": {
+ "pypi_315_torch_linux_aarch64_linux_arm_linux_ppc_linux_s390x_osx_aarch64": [
+ whl_config_setting(
+ target_platforms = [
+ "cp315_linux_aarch64",
+ "cp315_linux_arm",
+ "cp315_linux_ppc",
+ "cp315_linux_s390x",
+ "cp315_osx_aarch64",
+ ],
+ version = "3.15",
+ ),
+ ],
+ "pypi_315_torch_linux_x86_64_osx_x86_64_windows_x86_64": [
+ whl_config_setting(
+ target_platforms = [
+ "cp315_linux_x86_64",
+ "cp315_osx_x86_64",
+ "cp315_windows_x86_64",
+ ],
+ version = "3.15",
+ ),
+ ],
+ },
+ }})
+ pypi.whl_libraries().contains_exactly({
+ "pypi_315_torch_linux_aarch64_linux_arm_linux_ppc_linux_s390x_osx_aarch64": {
+ "dep_template": "@pypi//{name}:{target}",
+ "python_interpreter_target": "unit_test_interpreter_target",
+ "repo": "pypi_315",
+ "requirement": "torch==2.4.1 ; platform_machine != 'x86_64'",
+ },
+ "pypi_315_torch_linux_x86_64_osx_x86_64_windows_x86_64": {
+ "dep_template": "@pypi//{name}:{target}",
+ "python_interpreter_target": "unit_test_interpreter_target",
+ "repo": "pypi_315",
+ "requirement": "torch==2.4.1+cpu ; platform_machine == 'x86_64'",
+ },
+ })
+ pypi.whl_mods().contains_exactly({})
+
+_tests.append(_test_simple_with_markers)
+
+def _test_download_only_multiple(env):
+ pypi = _parse_modules(
+ env,
+ module_ctx = _mock_mctx(
+ _mod(
+ name = "rules_python",
+ parse = [
+ _parse(
+ hub_name = "pypi",
+ python_version = "3.15",
+ download_only = True,
+ requirements_by_platform = {
+ "requirements.linux_x86_64.txt": "linux_x86_64",
+ "requirements.osx_aarch64.txt": "osx_aarch64",
+ },
+ ),
+ ],
+ ),
+ read = lambda x: {
+ "requirements.linux_x86_64.txt": """\
+--platform=manylinux_2_17_x86_64
+--python-version=315
+--implementation=cp
+--abi=cp315
+
+simple==0.0.1 --hash=sha256:deadbeef
+extra==0.0.1 --hash=sha256:deadb00f
+""",
+ "requirements.osx_aarch64.txt": """\
+--platform=macosx_10_9_arm64
+--python-version=315
+--implementation=cp
+--abi=cp315
+
+simple==0.0.3 --hash=sha256:deadbaaf
+""",
+ }[x],
+ ),
+ available_interpreters = {
+ "python_3_15_host": "unit_test_interpreter_target",
+ },
+ )
+
+ pypi.is_reproducible().equals(True)
+ pypi.exposed_packages().contains_exactly({"pypi": ["simple"]})
+ pypi.hub_group_map().contains_exactly({"pypi": {}})
+ pypi.hub_whl_map().contains_exactly({"pypi": {
+ "extra": {
+ "pypi_315_extra": [
+ whl_config_setting(version = "3.15"),
+ ],
+ },
+ "simple": {
+ "pypi_315_simple_linux_x86_64": [
+ whl_config_setting(
+ target_platforms = ["cp315_linux_x86_64"],
+ version = "3.15",
+ ),
+ ],
+ "pypi_315_simple_osx_aarch64": [
+ whl_config_setting(
+ target_platforms = ["cp315_osx_aarch64"],
+ version = "3.15",
+ ),
+ ],
+ },
+ }})
+ pypi.whl_libraries().contains_exactly({
+ "pypi_315_extra": {
+ "dep_template": "@pypi//{name}:{target}",
+ "download_only": True,
+ "experimental_target_platforms": ["cp315_linux_x86_64"],
+ "extra_pip_args": ["--platform=manylinux_2_17_x86_64", "--python-version=315", "--implementation=cp", "--abi=cp315"],
+ "python_interpreter_target": "unit_test_interpreter_target",
+ "repo": "pypi_315",
+ "requirement": "extra==0.0.1 --hash=sha256:deadb00f",
+ },
+ "pypi_315_simple_linux_x86_64": {
+ "dep_template": "@pypi//{name}:{target}",
+ "download_only": True,
+ "experimental_target_platforms": ["cp315_linux_x86_64"],
+ "extra_pip_args": ["--platform=manylinux_2_17_x86_64", "--python-version=315", "--implementation=cp", "--abi=cp315"],
+ "python_interpreter_target": "unit_test_interpreter_target",
+ "repo": "pypi_315",
+ "requirement": "simple==0.0.1 --hash=sha256:deadbeef",
+ },
+ "pypi_315_simple_osx_aarch64": {
+ "dep_template": "@pypi//{name}:{target}",
+ "download_only": True,
+ "experimental_target_platforms": ["cp315_osx_aarch64"],
+ "extra_pip_args": ["--platform=macosx_10_9_arm64", "--python-version=315", "--implementation=cp", "--abi=cp315"],
+ "python_interpreter_target": "unit_test_interpreter_target",
+ "repo": "pypi_315",
+ "requirement": "simple==0.0.3 --hash=sha256:deadbaaf",
+ },
+ })
+ pypi.whl_mods().contains_exactly({})
+
+_tests.append(_test_download_only_multiple)
+
+def _test_simple_get_index(env):
+ got_simpleapi_download_args = []
+ got_simpleapi_download_kwargs = {}
+
+ def mocksimpleapi_download(*args, **kwargs):
+ got_simpleapi_download_args.extend(args)
+ got_simpleapi_download_kwargs.update(kwargs)
+ return {
+ "simple": struct(
+ whls = {
+ "deadb00f": struct(
+ yanked = False,
+ filename = "simple-0.0.1-py3-none-any.whl",
+ sha256 = "deadb00f",
+ url = "example2.org",
+ ),
+ },
+ sdists = {
+ "deadbeef": struct(
+ yanked = False,
+ filename = "simple-0.0.1.tar.gz",
+ sha256 = "deadbeef",
+ url = "example.org",
+ ),
+ },
+ ),
+ }
+
+ pypi = _parse_modules(
+ env,
+ module_ctx = _mock_mctx(
+ _mod(
+ name = "rules_python",
+ parse = [
+ _parse(
+ hub_name = "pypi",
+ python_version = "3.15",
+ requirements_lock = "requirements.txt",
+ experimental_index_url = "pypi.org",
+ extra_pip_args = [
+ "--extra-args-for-sdist-building",
+ ],
+ ),
+ ],
+ ),
+ read = lambda x: {
+ "requirements.txt": """
+simple==0.0.1 --hash=sha256:deadbeef --hash=sha256:deadb00f
+some_pkg==0.0.1
+""",
+ }[x],
+ ),
+ available_interpreters = {
+ "python_3_15_host": "unit_test_interpreter_target",
+ },
+ simpleapi_download = mocksimpleapi_download,
+ )
+
+ pypi.is_reproducible().equals(False)
+ pypi.exposed_packages().contains_exactly({"pypi": ["simple", "some_pkg"]})
+ pypi.hub_group_map().contains_exactly({"pypi": {}})
+ pypi.hub_whl_map().contains_exactly({
+ "pypi": {
+ "simple": {
+ "pypi_315_simple_py3_none_any_deadb00f": [
+ whl_config_setting(
+ filename = "simple-0.0.1-py3-none-any.whl",
+ version = "3.15",
+ ),
+ ],
+ "pypi_315_simple_sdist_deadbeef": [
+ whl_config_setting(
+ filename = "simple-0.0.1.tar.gz",
+ version = "3.15",
+ ),
+ ],
+ },
+ "some_pkg": {
+ "pypi_315_some_pkg": [whl_config_setting(version = "3.15")],
+ },
+ },
+ })
+ pypi.whl_libraries().contains_exactly({
+ "pypi_315_simple_py3_none_any_deadb00f": {
+ "dep_template": "@pypi//{name}:{target}",
+ "experimental_target_platforms": [
+ "cp315_linux_aarch64",
+ "cp315_linux_arm",
+ "cp315_linux_ppc",
+ "cp315_linux_s390x",
+ "cp315_linux_x86_64",
+ "cp315_osx_aarch64",
+ "cp315_osx_x86_64",
+ "cp315_windows_x86_64",
+ ],
+ "filename": "simple-0.0.1-py3-none-any.whl",
+ "python_interpreter_target": "unit_test_interpreter_target",
+ "repo": "pypi_315",
+ "requirement": "simple==0.0.1",
+ "sha256": "deadb00f",
+ "urls": ["example2.org"],
+ },
+ "pypi_315_simple_sdist_deadbeef": {
+ "dep_template": "@pypi//{name}:{target}",
+ "experimental_target_platforms": [
+ "cp315_linux_aarch64",
+ "cp315_linux_arm",
+ "cp315_linux_ppc",
+ "cp315_linux_s390x",
+ "cp315_linux_x86_64",
+ "cp315_osx_aarch64",
+ "cp315_osx_x86_64",
+ "cp315_windows_x86_64",
+ ],
+ "extra_pip_args": ["--extra-args-for-sdist-building"],
+ "filename": "simple-0.0.1.tar.gz",
+ "python_interpreter_target": "unit_test_interpreter_target",
+ "repo": "pypi_315",
+ "requirement": "simple==0.0.1",
+ "sha256": "deadbeef",
+ "urls": ["example.org"],
+ },
+ # We are falling back to regular `pip`
+ "pypi_315_some_pkg": {
+ "dep_template": "@pypi//{name}:{target}",
+ "extra_pip_args": ["--extra-args-for-sdist-building"],
+ "python_interpreter_target": "unit_test_interpreter_target",
+ "repo": "pypi_315",
+ "requirement": "some_pkg==0.0.1",
+ },
+ })
+ pypi.whl_mods().contains_exactly({})
+ env.expect.that_dict(got_simpleapi_download_kwargs).contains_exactly({
+ "attr": struct(
+ auth_patterns = {},
+ envsubst = {},
+ extra_index_urls = [],
+ index_url = "pypi.org",
+ index_url_overrides = {},
+ netrc = None,
+ sources = ["simple", "some_pkg"],
+ ),
+ "cache": {},
+ "parallel_download": False,
+ })
+
+_tests.append(_test_simple_get_index)
+
+def extension_test_suite(name):
+ """Create the test suite.
+
+ Args:
+ name: the name of the test suite
+ """
+ test_suite(name = name, basic_tests = _tests)
diff --git a/tests/pypi/generate_whl_library_build_bazel/generate_whl_library_build_bazel_tests.bzl b/tests/pypi/generate_whl_library_build_bazel/generate_whl_library_build_bazel_tests.bzl
index 9453011..b0d8f6d 100644
--- a/tests/pypi/generate_whl_library_build_bazel/generate_whl_library_build_bazel_tests.bzl
+++ b/tests/pypi/generate_whl_library_build_bazel/generate_whl_library_build_bazel_tests.bzl
@@ -19,560 +19,85 @@
_tests = []
-def _test_simple(env):
+def _test_all(env):
want = """\
-load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
-load("@rules_python//python:defs.bzl", "py_library", "py_binary")
+load("@rules_python//python/private/pypi:whl_library_targets.bzl", "whl_library_targets")
package(default_visibility = ["//visibility:public"])
-filegroup(
- name = "dist_info",
- srcs = glob(["site-packages/*.dist-info/**"], allow_empty = True),
-)
-
-filegroup(
- name = "data",
- srcs = glob(["data/**"], allow_empty = True),
-)
-
-filegroup(
- name = "whl",
- srcs = ["foo.whl"],
- data = [
- "@pypi_bar_baz//:whl",
- "@pypi_foo//:whl",
- ],
- visibility = ["//visibility:public"],
-)
-
-py_library(
- name = "pkg",
- srcs = glob(
- ["site-packages/**/*.py"],
- exclude=[],
- # Empty sources are allowed to support wheels that don't have any
- # pure-Python code, e.g. pymssql, which is written in Cython.
- allow_empty = True,
- ),
- data = [] + glob(
- ["site-packages/**/*"],
- exclude=["**/* *", "**/*.py", "**/*.pyc", "**/*.pyc.*", "**/*.dist-info/RECORD"],
- ),
- # This makes this directory a top-level in the python import
- # search path for anything that depends on this.
- imports = ["site-packages"],
- deps = [
- "@pypi_bar_baz//:pkg",
- "@pypi_foo//:pkg",
- ],
- tags = ["tag1", "tag2"],
- visibility = ["//visibility:public"],
-)
-"""
- actual = generate_whl_library_build_bazel(
- dep_template = "@pypi_{name}//:{target}",
- whl_name = "foo.whl",
- dependencies = ["foo", "bar-baz"],
- dependencies_by_platform = {},
- data_exclude = [],
- tags = ["tag1", "tag2"],
- entry_points = {},
- annotation = None,
- )
- env.expect.that_str(actual).equals(want)
-
-_tests.append(_test_simple)
-
-def _test_dep_selects(env):
- want = """\
-load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
-load("@rules_python//python:defs.bzl", "py_library", "py_binary")
-
-package(default_visibility = ["//visibility:public"])
-
-filegroup(
- name = "dist_info",
- srcs = glob(["site-packages/*.dist-info/**"], allow_empty = True),
-)
-
-filegroup(
- name = "data",
- srcs = glob(["data/**"], allow_empty = True),
-)
-
-filegroup(
- name = "whl",
- srcs = ["foo.whl"],
- data = [
- "@pypi_bar_baz//:whl",
- "@pypi_foo//:whl",
- ] + select(
- {
- "@//python/config_settings:is_python_3.9": ["@pypi_py39_dep//:whl"],
- "@platforms//cpu:aarch64": ["@pypi_arm_dep//:whl"],
- "@platforms//os:windows": ["@pypi_win_dep//:whl"],
- ":is_python_3.10_linux_ppc": ["@pypi_py310_linux_ppc_dep//:whl"],
- ":is_python_3.9_anyos_aarch64": ["@pypi_py39_arm_dep//:whl"],
- ":is_python_3.9_linux_anyarch": ["@pypi_py39_linux_dep//:whl"],
- ":is_linux_x86_64": ["@pypi_linux_intel_dep//:whl"],
- "//conditions:default": [],
- },
- ),
- visibility = ["//visibility:public"],
-)
-
-py_library(
- name = "pkg",
- srcs = glob(
- ["site-packages/**/*.py"],
- exclude=[],
- # Empty sources are allowed to support wheels that don't have any
- # pure-Python code, e.g. pymssql, which is written in Cython.
- allow_empty = True,
- ),
- data = [] + glob(
- ["site-packages/**/*"],
- exclude=["**/* *", "**/*.py", "**/*.pyc", "**/*.pyc.*", "**/*.dist-info/RECORD"],
- ),
- # This makes this directory a top-level in the python import
- # search path for anything that depends on this.
- imports = ["site-packages"],
- deps = [
- "@pypi_bar_baz//:pkg",
- "@pypi_foo//:pkg",
- ] + select(
- {
- "@//python/config_settings:is_python_3.9": ["@pypi_py39_dep//:pkg"],
- "@platforms//cpu:aarch64": ["@pypi_arm_dep//:pkg"],
- "@platforms//os:windows": ["@pypi_win_dep//:pkg"],
- ":is_python_3.10_linux_ppc": ["@pypi_py310_linux_ppc_dep//:pkg"],
- ":is_python_3.9_anyos_aarch64": ["@pypi_py39_arm_dep//:pkg"],
- ":is_python_3.9_linux_anyarch": ["@pypi_py39_linux_dep//:pkg"],
- ":is_linux_x86_64": ["@pypi_linux_intel_dep//:pkg"],
- "//conditions:default": [],
- },
- ),
- tags = ["tag1", "tag2"],
- visibility = ["//visibility:public"],
-)
-
-config_setting(
- name = "is_python_3.10_linux_ppc",
- flag_values = {
- "@rules_python//python/config_settings:python_version_major_minor": "3.10",
+whl_library_targets(
+ copy_executables = {
+ "exec_src": "exec_dest",
},
- constraint_values = [
- "@platforms//cpu:ppc",
- "@platforms//os:linux",
- ],
- visibility = ["//visibility:private"],
-)
-
-config_setting(
- name = "is_python_3.9_anyos_aarch64",
- flag_values = {
- "@rules_python//python/config_settings:python_version_major_minor": "3.9",
+ copy_files = {
+ "file_src": "file_dest",
},
- constraint_values = ["@platforms//cpu:aarch64"],
- visibility = ["//visibility:private"],
-)
-
-config_setting(
- name = "is_python_3.9_linux_anyarch",
- flag_values = {
- "@rules_python//python/config_settings:python_version_major_minor": "3.9",
+ data = ["extra_target"],
+ data_exclude = [
+ "exclude_via_attr",
+ "data_exclude_all",
+ ],
+ dep_template = "@pypi//{name}:{target}",
+ dependencies = [
+ "foo",
+ "bar-baz",
+ "qux",
+ ],
+ dependencies_by_platform = {
+ "linux_x86_64": [
+ "box",
+ "box-amd64",
+ ],
+ "windows_x86_64": ["fox"],
+ "@platforms//os:linux": ["box"],
},
- constraint_values = ["@platforms//os:linux"],
- visibility = ["//visibility:private"],
-)
-
-config_setting(
- name = "is_linux_x86_64",
- constraint_values = [
- "@platforms//cpu:x86_64",
- "@platforms//os:linux",
+ entry_points = {
+ "foo": "bar.py",
+ },
+ group_deps = [
+ "foo",
+ "fox",
+ "qux",
],
- visibility = ["//visibility:private"],
-)
-"""
- actual = generate_whl_library_build_bazel(
- dep_template = "@pypi_{name}//:{target}",
- whl_name = "foo.whl",
- dependencies = ["foo", "bar-baz"],
- dependencies_by_platform = {
- "@//python/config_settings:is_python_3.9": ["py39_dep"],
- "@platforms//cpu:aarch64": ["arm_dep"],
- "@platforms//os:windows": ["win_dep"],
- "cp310_linux_ppc": ["py310_linux_ppc_dep"],
- "cp39_anyos_aarch64": ["py39_arm_dep"],
- "cp39_linux_anyarch": ["py39_linux_dep"],
- "linux_x86_64": ["linux_intel_dep"],
- },
- data_exclude = [],
- tags = ["tag1", "tag2"],
- entry_points = {},
- annotation = None,
- )
- env.expect.that_str(actual.replace("@@", "@")).equals(want)
-
-_tests.append(_test_dep_selects)
-
-def _test_with_annotation(env):
- want = """\
-load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
-load("@rules_python//python:defs.bzl", "py_library", "py_binary")
-
-package(default_visibility = ["//visibility:public"])
-
-filegroup(
- name = "dist_info",
- srcs = glob(["site-packages/*.dist-info/**"], allow_empty = True),
-)
-
-filegroup(
- name = "data",
- srcs = glob(["data/**"], allow_empty = True),
-)
-
-filegroup(
- name = "whl",
- srcs = ["foo.whl"],
- data = [
- "@pypi_bar_baz//:whl",
- "@pypi_foo//:whl",
+ group_name = "qux",
+ name = "foo.whl",
+ srcs_exclude = ["srcs_exclude_all"],
+ tags = [
+ "tag2",
+ "tag1",
],
- visibility = ["//visibility:public"],
-)
-
-py_library(
- name = "pkg",
- srcs = glob(
- ["site-packages/**/*.py"],
- exclude=["srcs_exclude_all"],
- # Empty sources are allowed to support wheels that don't have any
- # pure-Python code, e.g. pymssql, which is written in Cython.
- allow_empty = True,
- ),
- data = ["file_dest", "exec_dest"] + glob(
- ["site-packages/**/*"],
- exclude=["**/* *", "**/*.py", "**/*.pyc", "**/*.pyc.*", "**/*.dist-info/RECORD", "data_exclude_all"],
- ),
- # This makes this directory a top-level in the python import
- # search path for anything that depends on this.
- imports = ["site-packages"],
- deps = [
- "@pypi_bar_baz//:pkg",
- "@pypi_foo//:pkg",
- ],
- tags = ["tag1", "tag2"],
- visibility = ["//visibility:public"],
-)
-
-copy_file(
- name = "file_dest.copy",
- src = "file_src",
- out = "file_dest",
- is_executable = False,
-)
-
-copy_file(
- name = "exec_dest.copy",
- src = "exec_src",
- out = "exec_dest",
- is_executable = True,
)
# SOMETHING SPECIAL AT THE END
"""
actual = generate_whl_library_build_bazel(
- dep_template = "@pypi_{name}//:{target}",
- whl_name = "foo.whl",
- dependencies = ["foo", "bar-baz"],
- dependencies_by_platform = {},
- data_exclude = [],
- tags = ["tag1", "tag2"],
- entry_points = {},
+ dep_template = "@pypi//{name}:{target}",
+ name = "foo.whl",
+ dependencies = ["foo", "bar-baz", "qux"],
+ dependencies_by_platform = {
+ "linux_x86_64": ["box", "box-amd64"],
+ "windows_x86_64": ["fox"],
+ "@platforms//os:linux": ["box"], # buildifier: disable=unsorted-dict-items to check that we sort inside the test
+ },
+ tags = ["tag2", "tag1"],
+ entry_points = {
+ "foo": "bar.py",
+ },
+ data_exclude = ["exclude_via_attr"],
annotation = struct(
copy_files = {"file_src": "file_dest"},
copy_executables = {"exec_src": "exec_dest"},
- data = [],
+ data = ["extra_target"],
data_exclude_glob = ["data_exclude_all"],
srcs_exclude_glob = ["srcs_exclude_all"],
additive_build_content = """# SOMETHING SPECIAL AT THE END""",
),
- )
- env.expect.that_str(actual).equals(want)
-
-_tests.append(_test_with_annotation)
-
-def _test_with_entry_points(env):
- want = """\
-load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
-load("@rules_python//python:defs.bzl", "py_library", "py_binary")
-
-package(default_visibility = ["//visibility:public"])
-
-filegroup(
- name = "dist_info",
- srcs = glob(["site-packages/*.dist-info/**"], allow_empty = True),
-)
-
-filegroup(
- name = "data",
- srcs = glob(["data/**"], allow_empty = True),
-)
-
-filegroup(
- name = "whl",
- srcs = ["foo.whl"],
- data = [
- "@pypi_bar_baz//:whl",
- "@pypi_foo//:whl",
- ],
- visibility = ["//visibility:public"],
-)
-
-py_library(
- name = "pkg",
- srcs = glob(
- ["site-packages/**/*.py"],
- exclude=[],
- # Empty sources are allowed to support wheels that don't have any
- # pure-Python code, e.g. pymssql, which is written in Cython.
- allow_empty = True,
- ),
- data = [] + glob(
- ["site-packages/**/*"],
- exclude=["**/* *", "**/*.py", "**/*.pyc", "**/*.pyc.*", "**/*.dist-info/RECORD"],
- ),
- # This makes this directory a top-level in the python import
- # search path for anything that depends on this.
- imports = ["site-packages"],
- deps = [
- "@pypi_bar_baz//:pkg",
- "@pypi_foo//:pkg",
- ],
- tags = ["tag1", "tag2"],
- visibility = ["//visibility:public"],
-)
-
-py_binary(
- name = "rules_python_wheel_entry_point_fizz",
- srcs = ["buzz.py"],
- # This makes this directory a top-level in the python import
- # search path for anything that depends on this.
- imports = ["."],
- deps = [":pkg"],
-)
-"""
- actual = generate_whl_library_build_bazel(
- dep_template = "@pypi_{name}//:{target}",
- whl_name = "foo.whl",
- dependencies = ["foo", "bar-baz"],
- dependencies_by_platform = {},
- data_exclude = [],
- tags = ["tag1", "tag2"],
- entry_points = {"fizz": "buzz.py"},
- annotation = None,
- )
- env.expect.that_str(actual).equals(want)
-
-_tests.append(_test_with_entry_points)
-
-def _test_group_member(env):
- want = """\
-load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
-load("@rules_python//python:defs.bzl", "py_library", "py_binary")
-
-package(default_visibility = ["//visibility:public"])
-
-filegroup(
- name = "dist_info",
- srcs = glob(["site-packages/*.dist-info/**"], allow_empty = True),
-)
-
-filegroup(
- name = "data",
- srcs = glob(["data/**"], allow_empty = True),
-)
-
-filegroup(
- name = "_whl",
- srcs = ["foo.whl"],
- data = ["@pypi_bar_baz//:whl"] + select(
- {
- "@platforms//os:linux": ["@pypi_box//:whl"],
- ":is_linux_x86_64": [
- "@pypi_box//:whl",
- "@pypi_box_amd64//:whl",
- ],
- "//conditions:default": [],
- },
- ),
- visibility = ["@pypi__groups//:__pkg__"],
-)
-
-py_library(
- name = "_pkg",
- srcs = glob(
- ["site-packages/**/*.py"],
- exclude=[],
- # Empty sources are allowed to support wheels that don't have any
- # pure-Python code, e.g. pymssql, which is written in Cython.
- allow_empty = True,
- ),
- data = [] + glob(
- ["site-packages/**/*"],
- exclude=["**/* *", "**/*.py", "**/*.pyc", "**/*.pyc.*", "**/*.dist-info/RECORD"],
- ),
- # This makes this directory a top-level in the python import
- # search path for anything that depends on this.
- imports = ["site-packages"],
- deps = ["@pypi_bar_baz//:pkg"] + select(
- {
- "@platforms//os:linux": ["@pypi_box//:pkg"],
- ":is_linux_x86_64": [
- "@pypi_box//:pkg",
- "@pypi_box_amd64//:pkg",
- ],
- "//conditions:default": [],
- },
- ),
- tags = [],
- visibility = ["@pypi__groups//:__pkg__"],
-)
-
-config_setting(
- name = "is_linux_x86_64",
- constraint_values = [
- "@platforms//cpu:x86_64",
- "@platforms//os:linux",
- ],
- visibility = ["//visibility:private"],
-)
-
-alias(
- name = "pkg",
- actual = "@pypi__groups//:qux_pkg",
-)
-
-alias(
- name = "whl",
- actual = "@pypi__groups//:qux_whl",
-)
-"""
- actual = generate_whl_library_build_bazel(
- dep_template = "@pypi_{name}//:{target}",
- whl_name = "foo.whl",
- dependencies = ["foo", "bar-baz", "qux"],
- dependencies_by_platform = {
- "linux_x86_64": ["box", "box-amd64"],
- "windows_x86_64": ["fox"],
- "@platforms//os:linux": ["box"], # buildifier: disable=unsorted-dict-items to check that we sort inside the test
- },
- tags = [],
- entry_points = {},
- data_exclude = [],
- annotation = None,
group_name = "qux",
group_deps = ["foo", "fox", "qux"],
)
env.expect.that_str(actual.replace("@@", "@")).equals(want)
-_tests.append(_test_group_member)
-
-def _test_group_member_deps_to_hub(env):
- want = """\
-load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
-load("@rules_python//python:defs.bzl", "py_library", "py_binary")
-
-package(default_visibility = ["//visibility:public"])
-
-filegroup(
- name = "dist_info",
- srcs = glob(["site-packages/*.dist-info/**"], allow_empty = True),
-)
-
-filegroup(
- name = "data",
- srcs = glob(["data/**"], allow_empty = True),
-)
-
-filegroup(
- name = "whl",
- srcs = ["foo.whl"],
- data = ["@pypi//bar_baz:whl"] + select(
- {
- "@platforms//os:linux": ["@pypi//box:whl"],
- ":is_linux_x86_64": [
- "@pypi//box:whl",
- "@pypi//box_amd64:whl",
- ],
- "//conditions:default": [],
- },
- ),
- visibility = ["@pypi//:__subpackages__"],
-)
-
-py_library(
- name = "pkg",
- srcs = glob(
- ["site-packages/**/*.py"],
- exclude=[],
- # Empty sources are allowed to support wheels that don't have any
- # pure-Python code, e.g. pymssql, which is written in Cython.
- allow_empty = True,
- ),
- data = [] + glob(
- ["site-packages/**/*"],
- exclude=["**/* *", "**/*.py", "**/*.pyc", "**/*.pyc.*", "**/*.dist-info/RECORD"],
- ),
- # This makes this directory a top-level in the python import
- # search path for anything that depends on this.
- imports = ["site-packages"],
- deps = ["@pypi//bar_baz:pkg"] + select(
- {
- "@platforms//os:linux": ["@pypi//box:pkg"],
- ":is_linux_x86_64": [
- "@pypi//box:pkg",
- "@pypi//box_amd64:pkg",
- ],
- "//conditions:default": [],
- },
- ),
- tags = [],
- visibility = ["@pypi//:__subpackages__"],
-)
-
-config_setting(
- name = "is_linux_x86_64",
- constraint_values = [
- "@platforms//cpu:x86_64",
- "@platforms//os:linux",
- ],
- visibility = ["//visibility:private"],
-)
-"""
- actual = generate_whl_library_build_bazel(
- dep_template = "@pypi//{name}:{target}",
- whl_name = "foo.whl",
- dependencies = ["foo", "bar-baz", "qux"],
- dependencies_by_platform = {
- "linux_x86_64": ["box", "box-amd64"],
- "windows_x86_64": ["fox"],
- "@platforms//os:linux": ["box"], # buildifier: disable=unsorted-dict-items to check that we sort inside the test
- },
- tags = [],
- entry_points = {},
- data_exclude = [],
- annotation = None,
- group_name = "qux",
- group_deps = ["foo", "fox", "qux"],
- )
- env.expect.that_str(actual.replace("@@", "@")).equals(want)
-
-_tests.append(_test_group_member_deps_to_hub)
+_tests.append(_test_all)
def generate_whl_library_build_bazel_test_suite(name):
"""Create the test suite.
diff --git a/tests/pypi/parse_requirements/parse_requirements_tests.bzl b/tests/pypi/parse_requirements/parse_requirements_tests.bzl
index c719ad6..dfa1fef 100644
--- a/tests/pypi/parse_requirements/parse_requirements_tests.bzl
+++ b/tests/pypi/parse_requirements/parse_requirements_tests.bzl
@@ -19,6 +19,10 @@
def _mock_ctx():
testdata = {
+ "requirements_different_package_version": """\
+foo==0.0.1+local --hash=sha256:deadbeef
+foo==0.0.1 --hash=sha256:deadb00f
+""",
"requirements_direct": """\
foo[extra] @ https://some-url
""",
@@ -30,6 +34,16 @@
"requirements_linux": """\
foo==0.0.3 --hash=sha256:deadbaaf
""",
+ # download_only = True
+ "requirements_linux_download_only": """\
+--platform=manylinux_2_17_x86_64
+--python-version=39
+--implementation=cp
+--abi=cp39
+
+foo==0.0.1 --hash=sha256:deadbeef
+bar==0.0.1 --hash=sha256:deadb00f
+""",
"requirements_lock": """\
foo[extra]==0.0.1 --hash=sha256:deadbeef
""",
@@ -45,6 +59,14 @@
"requirements_osx": """\
foo==0.0.3 --hash=sha256:deadbaaf
""",
+ "requirements_osx_download_only": """\
+--platform=macosx_10_9_arm64
+--python-version=39
+--implementation=cp
+--abi=cp39
+
+foo==0.0.3 --hash=sha256:deadbaaf
+""",
"requirements_windows": """\
foo[extra]==0.0.2 --hash=sha256:deadbeef
bar==0.0.1 --hash=sha256:deadb00f
@@ -229,6 +251,66 @@
_tests.append(_test_multi_os)
+def _test_multi_os_legacy(env):
+ got = parse_requirements(
+ ctx = _mock_ctx(),
+ requirements_by_platform = {
+ "requirements_linux_download_only": ["cp39_linux_x86_64"],
+ "requirements_osx_download_only": ["cp39_osx_aarch64"],
+ },
+ )
+
+ env.expect.that_dict(got).contains_exactly({
+ "bar": [
+ struct(
+ distribution = "bar",
+ extra_pip_args = ["--platform=manylinux_2_17_x86_64", "--python-version=39", "--implementation=cp", "--abi=cp39"],
+ is_exposed = False,
+ requirement_line = "bar==0.0.1 --hash=sha256:deadb00f",
+ sdist = None,
+ srcs = struct(
+ requirement = "bar==0.0.1",
+ shas = ["deadb00f"],
+ version = "0.0.1",
+ ),
+ target_platforms = ["cp39_linux_x86_64"],
+ whls = [],
+ ),
+ ],
+ "foo": [
+ struct(
+ distribution = "foo",
+ extra_pip_args = ["--platform=manylinux_2_17_x86_64", "--python-version=39", "--implementation=cp", "--abi=cp39"],
+ is_exposed = True,
+ requirement_line = "foo==0.0.1 --hash=sha256:deadbeef",
+ sdist = None,
+ srcs = struct(
+ requirement = "foo==0.0.1",
+ shas = ["deadbeef"],
+ version = "0.0.1",
+ ),
+ target_platforms = ["cp39_linux_x86_64"],
+ whls = [],
+ ),
+ struct(
+ distribution = "foo",
+ extra_pip_args = ["--platform=macosx_10_9_arm64", "--python-version=39", "--implementation=cp", "--abi=cp39"],
+ is_exposed = True,
+ requirement_line = "foo==0.0.3 --hash=sha256:deadbaaf",
+ sdist = None,
+ srcs = struct(
+ requirement = "foo==0.0.3",
+ shas = ["deadbaaf"],
+ version = "0.0.3",
+ ),
+ target_platforms = ["cp39_osx_aarch64"],
+ whls = [],
+ ),
+ ],
+ })
+
+_tests.append(_test_multi_os_legacy)
+
def _test_select_requirement_none_platform(env):
got = select_requirement(
[
@@ -304,6 +386,48 @@
_tests.append(_test_env_marker_resolution)
+def _test_different_package_version(env):
+ got = parse_requirements(
+ ctx = _mock_ctx(),
+ requirements_by_platform = {
+ "requirements_different_package_version": ["linux_x86_64"],
+ },
+ )
+ env.expect.that_dict(got).contains_exactly({
+ "foo": [
+ struct(
+ distribution = "foo",
+ extra_pip_args = [],
+ requirement_line = "foo==0.0.1 --hash=sha256:deadb00f",
+ srcs = struct(
+ requirement = "foo==0.0.1",
+ shas = ["deadb00f"],
+ version = "0.0.1",
+ ),
+ target_platforms = ["linux_x86_64"],
+ whls = [],
+ sdist = None,
+ is_exposed = True,
+ ),
+ struct(
+ distribution = "foo",
+ extra_pip_args = [],
+ requirement_line = "foo==0.0.1+local --hash=sha256:deadbeef",
+ srcs = struct(
+ requirement = "foo==0.0.1+local",
+ shas = ["deadbeef"],
+ version = "0.0.1+local",
+ ),
+ target_platforms = ["linux_x86_64"],
+ whls = [],
+ sdist = None,
+ is_exposed = True,
+ ),
+ ],
+ })
+
+_tests.append(_test_different_package_version)
+
def parse_requirements_test_suite(name):
"""Create the test suite.
diff --git a/tests/pypi/patch_whl/BUILD.bazel b/tests/pypi/patch_whl/BUILD.bazel
new file mode 100644
index 0000000..d6c4f47
--- /dev/null
+++ b/tests/pypi/patch_whl/BUILD.bazel
@@ -0,0 +1,3 @@
+load(":patch_whl_tests.bzl", "patch_whl_test_suite")
+
+patch_whl_test_suite(name = "patch_whl_tests")
diff --git a/tests/pypi/patch_whl/patch_whl_tests.bzl b/tests/pypi/patch_whl/patch_whl_tests.bzl
new file mode 100644
index 0000000..f93fe45
--- /dev/null
+++ b/tests/pypi/patch_whl/patch_whl_tests.bzl
@@ -0,0 +1,40 @@
+# Copyright 2024 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+""
+
+load("@rules_testing//lib:test_suite.bzl", "test_suite")
+load("//python/private/pypi:patch_whl.bzl", "patched_whl_name") # buildifier: disable=bzl-visibility
+
+_tests = []
+
+def _test_simple(env):
+ got = patched_whl_name("foo-1.2.3-py3-none-any.whl")
+ env.expect.that_str(got).equals("foo-1.2.3+patched-py3-none-any.whl")
+
+_tests.append(_test_simple)
+
+def _test_simple_local_version(env):
+ got = patched_whl_name("foo-1.2.3+special-py3-none-any.whl")
+ env.expect.that_str(got).equals("foo-1.2.3+special.patched-py3-none-any.whl")
+
+_tests.append(_test_simple_local_version)
+
+def patch_whl_test_suite(name):
+ """Create the test suite.
+
+ Args:
+ name: the name of the test suite
+ """
+ test_suite(name = name, basic_tests = _tests)
diff --git a/tests/pypi/pkg_aliases/BUILD.bazel b/tests/pypi/pkg_aliases/BUILD.bazel
new file mode 100644
index 0000000..e1a015c
--- /dev/null
+++ b/tests/pypi/pkg_aliases/BUILD.bazel
@@ -0,0 +1,3 @@
+load(":pkg_aliases_test.bzl", "pkg_aliases_test_suite")
+
+pkg_aliases_test_suite(name = "pkg_aliases_tests")
diff --git a/tests/pypi/pkg_aliases/pkg_aliases_test.bzl b/tests/pypi/pkg_aliases/pkg_aliases_test.bzl
new file mode 100644
index 0000000..0fa66d0
--- /dev/null
+++ b/tests/pypi/pkg_aliases/pkg_aliases_test.bzl
@@ -0,0 +1,474 @@
+# Copyright 2024 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""pkg_aliases tests"""
+
+load("@rules_testing//lib:test_suite.bzl", "test_suite")
+load("//python/private/pypi:config_settings.bzl", "config_settings") # buildifier: disable=bzl-visibility
+load(
+ "//python/private/pypi:pkg_aliases.bzl",
+ "multiplatform_whl_aliases",
+ "pkg_aliases",
+) # buildifier: disable=bzl-visibility
+load("//python/private/pypi:whl_config_setting.bzl", "whl_config_setting") # buildifier: disable=bzl-visibility
+
+_tests = []
+
+def _test_legacy_aliases(env):
+ got = {}
+ pkg_aliases(
+ name = "foo",
+ actual = "repo",
+ native = struct(
+ alias = lambda name, actual: got.update({name: actual}),
+ ),
+ extra_aliases = ["my_special"],
+ )
+
+ # buildifier: disable=unsorted-dict-items
+ want = {
+ "foo": ":pkg",
+ "pkg": "@repo//:pkg",
+ "whl": "@repo//:whl",
+ "data": "@repo//:data",
+ "dist_info": "@repo//:dist_info",
+ "my_special": "@repo//:my_special",
+ }
+
+ env.expect.that_dict(got).contains_exactly(want)
+
+_tests.append(_test_legacy_aliases)
+
+def _test_config_setting_aliases(env):
+ # Use this function as it is used in pip_repository
+ got = {}
+ actual_no_match_error = []
+
+ def mock_select(value, no_match_error = None):
+ actual_no_match_error.append(no_match_error)
+ env.expect.that_str(no_match_error).contains("""\
+configuration settings:
+ //:my_config_setting
+
+""")
+ return value
+
+ pkg_aliases(
+ name = "bar_baz",
+ actual = {
+ "//:my_config_setting": "bar_baz_repo",
+ },
+ extra_aliases = ["my_special"],
+ native = struct(
+ alias = lambda name, actual: got.update({name: actual}),
+ ),
+ select = mock_select,
+ )
+
+ # buildifier: disable=unsorted-dict-items
+ want = {
+ "pkg": {
+ "//:my_config_setting": "@bar_baz_repo//:pkg",
+ },
+ }
+ env.expect.that_dict(got).contains_at_least(want)
+
+_tests.append(_test_config_setting_aliases)
+
+def _test_config_setting_aliases_many(env):
+ # Use this function as it is used in pip_repository
+ got = {}
+ actual_no_match_error = []
+
+ def mock_select(value, no_match_error = None):
+ actual_no_match_error.append(no_match_error)
+ env.expect.that_str(no_match_error).contains("""\
+configuration settings:
+ //:another_config_setting
+ //:my_config_setting
+ //:third_config_setting
+""")
+ return value
+
+ pkg_aliases(
+ name = "bar_baz",
+ actual = {
+ (
+ "//:my_config_setting",
+ "//:another_config_setting",
+ ): "bar_baz_repo",
+ "//:third_config_setting": "foo_repo",
+ },
+ extra_aliases = ["my_special"],
+ native = struct(
+ alias = lambda name, actual: got.update({name: actual}),
+ ),
+ select = mock_select,
+ )
+
+ # buildifier: disable=unsorted-dict-items
+ want = {
+ "my_special": {
+ (
+ "//:my_config_setting",
+ "//:another_config_setting",
+ ): "@bar_baz_repo//:my_special",
+ "//:third_config_setting": "@foo_repo//:my_special",
+ },
+ }
+ env.expect.that_dict(got).contains_at_least(want)
+
+_tests.append(_test_config_setting_aliases_many)
+
+def _test_multiplatform_whl_aliases(env):
+ # Use this function as it is used in pip_repository
+ got = {}
+ actual_no_match_error = []
+
+ def mock_select(value, no_match_error = None):
+ actual_no_match_error.append(no_match_error)
+ env.expect.that_str(no_match_error).contains("""\
+configuration settings:
+ //:my_config_setting
+ //_config:is_cp3.9_linux_x86_64
+ //_config:is_cp3.9_py3_none_any
+ //_config:is_cp3.9_py3_none_any_linux_x86_64
+
+""")
+ return value
+
+ pkg_aliases(
+ name = "bar_baz",
+ actual = {
+ whl_config_setting(
+ filename = "foo-0.0.0-py3-none-any.whl",
+ version = "3.9",
+ ): "filename_repo",
+ whl_config_setting(
+ filename = "foo-0.0.0-py3-none-any.whl",
+ version = "3.9",
+ target_platforms = ["cp39_linux_x86_64"],
+ ): "filename_repo_for_platform",
+ whl_config_setting(
+ version = "3.9",
+ target_platforms = ["cp39_linux_x86_64"],
+ ): "bzlmod_repo_for_a_particular_platform",
+ "//:my_config_setting": "bzlmod_repo",
+ },
+ extra_aliases = [],
+ native = struct(
+ alias = lambda name, actual: got.update({name: actual}),
+ ),
+ select = mock_select,
+ glibc_versions = [],
+ muslc_versions = [],
+ osx_versions = [],
+ )
+
+ # buildifier: disable=unsorted-dict-items
+ want = {
+ "pkg": {
+ "//:my_config_setting": "@bzlmod_repo//:pkg",
+ "//_config:is_cp3.9_linux_x86_64": "@bzlmod_repo_for_a_particular_platform//:pkg",
+ "//_config:is_cp3.9_py3_none_any": "@filename_repo//:pkg",
+ "//_config:is_cp3.9_py3_none_any_linux_x86_64": "@filename_repo_for_platform//:pkg",
+ },
+ }
+ env.expect.that_dict(got).contains_at_least(want)
+
+_tests.append(_test_multiplatform_whl_aliases)
+
+def _test_group_aliases(env):
+ # Use this function as it is used in pip_repository
+ actual = []
+
+ pkg_aliases(
+ name = "foo",
+ actual = "repo",
+ group_name = "my_group",
+ native = struct(
+ alias = lambda **kwargs: actual.append(kwargs),
+ ),
+ )
+
+ # buildifier: disable=unsorted-dict-items
+ want = [
+ {
+ "name": "foo",
+ "actual": ":pkg",
+ },
+ {
+ "name": "_pkg",
+ "actual": "@repo//:pkg",
+ "visibility": ["//_groups:__subpackages__"],
+ },
+ {
+ "name": "_whl",
+ "actual": "@repo//:whl",
+ "visibility": ["//_groups:__subpackages__"],
+ },
+ {
+ "name": "data",
+ "actual": "@repo//:data",
+ },
+ {
+ "name": "dist_info",
+ "actual": "@repo//:dist_info",
+ },
+ {
+ "name": "pkg",
+ "actual": "//_groups:my_group_pkg",
+ },
+ {
+ "name": "whl",
+ "actual": "//_groups:my_group_whl",
+ },
+ ]
+ env.expect.that_collection(actual).contains_exactly(want)
+
+_tests.append(_test_group_aliases)
+
+def _test_multiplatform_whl_aliases_empty(env):
+ # Check that we still work with an empty requirements.txt
+ got = multiplatform_whl_aliases(aliases = {})
+ env.expect.that_dict(got).contains_exactly({})
+
+_tests.append(_test_multiplatform_whl_aliases_empty)
+
+def _test_multiplatform_whl_aliases_nofilename(env):
+ aliases = {
+ "//:label": "foo",
+ }
+ got = multiplatform_whl_aliases(aliases = aliases)
+ env.expect.that_dict(got).contains_exactly(aliases)
+
+_tests.append(_test_multiplatform_whl_aliases_nofilename)
+
+def _test_multiplatform_whl_aliases_nofilename_target_platforms(env):
+ aliases = {
+ whl_config_setting(
+ config_setting = "//:ignored",
+ version = "3.1",
+ target_platforms = [
+ "cp31_linux_x86_64",
+ "cp31_linux_aarch64",
+ ],
+ ): "foo",
+ }
+
+ got = multiplatform_whl_aliases(aliases = aliases)
+
+ want = {
+ "//_config:is_cp3.1_linux_aarch64": "foo",
+ "//_config:is_cp3.1_linux_x86_64": "foo",
+ }
+ env.expect.that_dict(got).contains_exactly(want)
+
+_tests.append(_test_multiplatform_whl_aliases_nofilename_target_platforms)
+
+def _test_multiplatform_whl_aliases_filename(env):
+ aliases = {
+ whl_config_setting(
+ filename = "foo-0.0.3-py3-none-any.whl",
+ version = "3.2",
+ ): "foo-py3-0.0.3",
+ whl_config_setting(
+ filename = "foo-0.0.1-py3-none-any.whl",
+ version = "3.1",
+ ): "foo-py3-0.0.1",
+ whl_config_setting(
+ filename = "foo-0.0.2-py3-none-any.whl",
+ version = "3.1",
+ target_platforms = [
+ "cp31_linux_x86_64",
+ "cp31_linux_aarch64",
+ ],
+ ): "foo-0.0.2",
+ }
+ got = multiplatform_whl_aliases(
+ aliases = aliases,
+ glibc_versions = [],
+ muslc_versions = [],
+ osx_versions = [],
+ )
+ want = {
+ "//_config:is_cp3.1_py3_none_any": "foo-py3-0.0.1",
+ "//_config:is_cp3.1_py3_none_any_linux_aarch64": "foo-0.0.2",
+ "//_config:is_cp3.1_py3_none_any_linux_x86_64": "foo-0.0.2",
+ "//_config:is_cp3.2_py3_none_any": "foo-py3-0.0.3",
+ }
+ env.expect.that_dict(got).contains_exactly(want)
+
+_tests.append(_test_multiplatform_whl_aliases_filename)
+
+def _test_multiplatform_whl_aliases_filename_versioned(env):
+ aliases = {
+ whl_config_setting(
+ filename = "foo-0.0.1-py3-none-manylinux_2_17_x86_64.whl",
+ version = "3.1",
+ ): "glibc-2.17",
+ whl_config_setting(
+ filename = "foo-0.0.1-py3-none-manylinux_2_18_x86_64.whl",
+ version = "3.1",
+ ): "glibc-2.18",
+ whl_config_setting(
+ filename = "foo-0.0.1-py3-none-musllinux_1_1_x86_64.whl",
+ version = "3.1",
+ ): "musl-1.1",
+ }
+ got = multiplatform_whl_aliases(
+ aliases = aliases,
+ glibc_versions = [(2, 17), (2, 18)],
+ muslc_versions = [(1, 1), (1, 2)],
+ osx_versions = [],
+ )
+ want = {
+ # This could just work with:
+ # select({
+ # "//_config:is_gt_eq_2.18": "//_config:is_cp3.1_py3_none_manylinux_x86_64",
+ # "//conditions:default": "//_config:is_gt_eq_2.18",
+ # }): "glibc-2.18",
+ # select({
+ # "//_config:is_range_2.17_2.18": "//_config:is_cp3.1_py3_none_manylinux_x86_64",
+ # "//_config:is_glibc_default": "//_config:is_cp3.1_py3_none_manylinux_x86_64",
+ # "//conditions:default": "//_config:is_glibc_default",
+ # }): "glibc-2.17",
+ # (
+ # "//_config:is_gt_musl_1.1": "musl-1.1",
+ # "//_config:is_musl_default": "musl-1.1",
+ # ): "musl-1.1",
+ #
+ # For this to fully work we need to have the pypi:config_settings.bzl to generate the
+ # extra targets that use the FeatureFlagInfo and this to generate extra aliases for the
+ # config settings.
+ "//_config:is_cp3.1_py3_none_manylinux_2_17_x86_64": "glibc-2.17",
+ "//_config:is_cp3.1_py3_none_manylinux_2_18_x86_64": "glibc-2.18",
+ "//_config:is_cp3.1_py3_none_manylinux_x86_64": "glibc-2.17",
+ "//_config:is_cp3.1_py3_none_musllinux_1_1_x86_64": "musl-1.1",
+ "//_config:is_cp3.1_py3_none_musllinux_1_2_x86_64": "musl-1.1",
+ "//_config:is_cp3.1_py3_none_musllinux_x86_64": "musl-1.1",
+ }
+ env.expect.that_dict(got).contains_exactly(want)
+
+_tests.append(_test_multiplatform_whl_aliases_filename_versioned)
+
+def _mock_alias(container):
+ return lambda name, **kwargs: container.append(name)
+
+def _mock_config_setting(container):
+ def _inner(name, flag_values = None, constraint_values = None, **_):
+ if flag_values or constraint_values:
+ container.append(name)
+ return
+
+ fail("At least one of 'flag_values' or 'constraint_values' needs to be set")
+
+ return _inner
+
+def _test_config_settings_exist_legacy(env):
+ aliases = {
+ whl_config_setting(
+ version = "3.11",
+ target_platforms = [
+ "cp311_linux_aarch64",
+ "cp311_linux_x86_64",
+ ],
+ ): "repo",
+ }
+ available_config_settings = []
+ config_settings(
+ python_versions = ["3.11"],
+ native = struct(
+ alias = _mock_alias(available_config_settings),
+ config_setting = _mock_config_setting(available_config_settings),
+ ),
+ target_platforms = [
+ "linux_aarch64",
+ "linux_x86_64",
+ ],
+ )
+
+ got_aliases = multiplatform_whl_aliases(
+ aliases = aliases,
+ )
+ got = [a.partition(":")[-1] for a in got_aliases]
+
+ env.expect.that_collection(available_config_settings).contains_at_least(got)
+
+_tests.append(_test_config_settings_exist_legacy)
+
+def _test_config_settings_exist(env):
+ for py_tag in ["py2.py3", "py3", "py311", "cp311"]:
+ if py_tag == "py2.py3":
+ abis = ["none"]
+ elif py_tag.startswith("py"):
+ abis = ["none", "abi3"]
+ else:
+ abis = ["none", "abi3", "cp311"]
+
+ for abi_tag in abis:
+ for platform_tag, kwargs in {
+ "any": {},
+ "macosx_11_0_arm64": {
+ "osx_versions": [(11, 0)],
+ "target_platforms": ["osx_aarch64"],
+ },
+ "manylinux_2_17_x86_64": {
+ "glibc_versions": [(2, 17), (2, 18)],
+ "target_platforms": ["linux_x86_64"],
+ },
+ "manylinux_2_18_x86_64": {
+ "glibc_versions": [(2, 17), (2, 18)],
+ "target_platforms": ["linux_x86_64"],
+ },
+ "musllinux_1_1_aarch64": {
+ "muslc_versions": [(1, 2), (1, 1), (1, 0)],
+ "target_platforms": ["linux_aarch64"],
+ },
+ }.items():
+ aliases = {
+ whl_config_setting(
+ filename = "foo-0.0.1-{}-{}-{}.whl".format(py_tag, abi_tag, platform_tag),
+ version = "3.11",
+ ): "repo",
+ }
+ available_config_settings = []
+ config_settings(
+ python_versions = ["3.11"],
+ native = struct(
+ alias = _mock_alias(available_config_settings),
+ config_setting = _mock_config_setting(available_config_settings),
+ ),
+ **kwargs
+ )
+
+ got_aliases = multiplatform_whl_aliases(
+ aliases = aliases,
+ glibc_versions = kwargs.get("glibc_versions", []),
+ muslc_versions = kwargs.get("muslc_versions", []),
+ osx_versions = kwargs.get("osx_versions", []),
+ )
+ got = [a.partition(":")[-1] for a in got_aliases]
+
+ env.expect.that_collection(available_config_settings).contains_at_least(got)
+
+_tests.append(_test_config_settings_exist)
+
+def pkg_aliases_test_suite(name):
+ """Create the test suite.
+
+ Args:
+ name: the name of the test suite
+ """
+ test_suite(name = name, basic_tests = _tests)
diff --git a/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl b/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl
index 9de309b..ca1651a 100644
--- a/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl
+++ b/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl
@@ -15,40 +15,17 @@
"""render_pkg_aliases tests"""
load("@rules_testing//lib:test_suite.bzl", "test_suite")
-load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility
-load("//python/private/pypi:config_settings.bzl", "config_settings") # buildifier: disable=bzl-visibility
+load(
+ "//python/private/pypi:pkg_aliases.bzl",
+ "get_filename_config_settings",
+) # buildifier: disable=bzl-visibility
load(
"//python/private/pypi:render_pkg_aliases.bzl",
- "get_filename_config_settings",
"get_whl_flag_versions",
- "multiplatform_whl_aliases",
"render_multiplatform_pkg_aliases",
"render_pkg_aliases",
- "whl_alias",
) # buildifier: disable=bzl-visibility
-
-def _normalize_label_strings(want):
- """normalize expected strings.
-
- This function ensures that the desired `render_pkg_aliases` outputs are
- normalized from `bzlmod` to `WORKSPACE` values so that we don't have to
- have to sets of expected strings. The main difference is that under
- `bzlmod` the `str(Label("//my_label"))` results in `"@@//my_label"` whereas
- under `non-bzlmod` we have `"@//my_label"`. This function does
- `string.replace("@@", "@")` to normalize the strings.
-
- NOTE, in tests, we should only use keep `@@` usage in expectation values
- for the test cases where the whl_alias has the `config_setting` constructed
- from a `Label` instance.
- """
- if "@@" not in want:
- fail("The expected string does not have '@@' labels, consider not using the function")
-
- if BZLMOD_ENABLED:
- # our expectations are already with double @
- return want
-
- return want.replace("@@", "@")
+load("//python/private/pypi:whl_config_setting.bzl", "whl_config_setting") # buildifier: disable=bzl-visibility
_tests = []
@@ -66,41 +43,19 @@
def _test_legacy_aliases(env):
actual = render_pkg_aliases(
aliases = {
- "foo": [
- whl_alias(repo = "pypi_foo"),
- ],
+ "foo": "pypi_foo",
},
)
want_key = "foo/BUILD.bazel"
want_content = """\
-load("@bazel_skylib//lib:selects.bzl", "selects")
+load("@rules_python//python/private/pypi:pkg_aliases.bzl", "pkg_aliases")
package(default_visibility = ["//visibility:public"])
-alias(
+pkg_aliases(
name = "foo",
- actual = ":pkg",
-)
-
-alias(
- name = "pkg",
- actual = "@pypi_foo//:pkg",
-)
-
-alias(
- name = "whl",
- actual = "@pypi_foo//:whl",
-)
-
-alias(
- name = "data",
- actual = "@pypi_foo//:data",
-)
-
-alias(
- name = "dist_info",
- actual = "@pypi_foo//:dist_info",
+ actual = "pypi_foo",
)"""
env.expect.that_dict(actual).contains_exactly({want_key: want_content})
@@ -111,78 +66,61 @@
# Use this function as it is used in pip_repository
actual = render_multiplatform_pkg_aliases(
aliases = {
- "bar-baz": [
- whl_alias(version = "3.2", repo = "pypi_32_bar_baz", config_setting = "//:my_config_setting"),
- ],
+ "bar-baz": {
+ whl_config_setting(
+ version = "3.2",
+ config_setting = "//:my_config_setting",
+ ): "pypi_32_bar_baz",
+ whl_config_setting(
+ version = "3.2",
+ config_setting = "//:my_config_setting",
+ target_platforms = [
+ "cp32_linux_x86_64",
+ ],
+ ): "pypi_32_bar_baz_linux_x86_64",
+ whl_config_setting(
+ version = "3.2",
+ filename = "foo-0.0.0-py3-none-any.whl",
+ ): "filename_repo",
+ whl_config_setting(
+ version = "3.2",
+ filename = "foo-0.0.0-py3-none-any.whl",
+ target_platforms = [
+ "cp32_linux_x86_64",
+ ],
+ ): "filename_repo_linux_x86_64",
+ },
},
+ extra_hub_aliases = {"bar_baz": ["foo"]},
)
want_key = "bar_baz/BUILD.bazel"
want_content = """\
-load("@bazel_skylib//lib:selects.bzl", "selects")
+load("@rules_python//python/private/pypi:pkg_aliases.bzl", "pkg_aliases")
+load("@rules_python//python/private/pypi:whl_config_setting.bzl", "whl_config_setting")
package(default_visibility = ["//visibility:public"])
-_NO_MATCH_ERROR = \"\"\"\\
-No matching wheel for current configuration's Python version.
-
-The current build configuration's Python version doesn't match any of the Python
-wheels available for this wheel. This wheel supports the following Python
-configuration settings:
- //:my_config_setting
-
-To determine the current configuration's Python version, run:
- `bazel config <config id>` (shown further below)
-and look for
- rules_python//python/config_settings:python_version
-
-If the value is missing, then the "default" Python version is being used,
-which has a "null" version value and will not match version constraints.
-\"\"\"
-
-alias(
+pkg_aliases(
name = "bar_baz",
- actual = ":pkg",
-)
-
-alias(
- name = "pkg",
- actual = selects.with_or(
- {
- "//:my_config_setting": "@pypi_32_bar_baz//:pkg",
- },
- no_match_error = _NO_MATCH_ERROR,
- ),
-)
-
-alias(
- name = "whl",
- actual = selects.with_or(
- {
- "//:my_config_setting": "@pypi_32_bar_baz//:whl",
- },
- no_match_error = _NO_MATCH_ERROR,
- ),
-)
-
-alias(
- name = "data",
- actual = selects.with_or(
- {
- "//:my_config_setting": "@pypi_32_bar_baz//:data",
- },
- no_match_error = _NO_MATCH_ERROR,
- ),
-)
-
-alias(
- name = "dist_info",
- actual = selects.with_or(
- {
- "//:my_config_setting": "@pypi_32_bar_baz//:dist_info",
- },
- no_match_error = _NO_MATCH_ERROR,
- ),
+ actual = {
+ "//:my_config_setting": "pypi_32_bar_baz",
+ whl_config_setting(
+ target_platforms = ("cp32_linux_x86_64",),
+ config_setting = "//:my_config_setting",
+ version = "3.2",
+ ): "pypi_32_bar_baz_linux_x86_64",
+ whl_config_setting(
+ filename = "foo-0.0.0-py3-none-any.whl",
+ version = "3.2",
+ ): "filename_repo",
+ whl_config_setting(
+ filename = "foo-0.0.0-py3-none-any.whl",
+ target_platforms = ("cp32_linux_x86_64",),
+ version = "3.2",
+ ): "filename_repo_linux_x86_64",
+ },
+ extra_aliases = ["foo"],
)"""
env.expect.that_str(actual.pop("_config/BUILD.bazel")).equals(
@@ -191,11 +129,8 @@
config_settings(
name = "config_settings",
- glibc_versions = [],
- muslc_versions = [],
- osx_versions = [],
python_versions = ["3.2"],
- target_platforms = [],
+ target_platforms = ["linux_x86_64"],
visibility = ["//:__subpackages__"],
)""",
)
@@ -204,111 +139,17 @@
_tests.append(_test_bzlmod_aliases)
-def _test_bzlmod_aliases_with_no_default_version(env):
- actual = render_multiplatform_pkg_aliases(
- aliases = {
- "bar-baz": [
- whl_alias(
- version = "3.2",
- repo = "pypi_32_bar_baz",
- # pass the label to ensure that it gets converted to string
- config_setting = Label("//python/config_settings:is_python_3.2"),
- ),
- whl_alias(version = "3.1", repo = "pypi_31_bar_baz"),
- ],
- },
- )
-
- want_key = "bar_baz/BUILD.bazel"
- want_content = """\
-load("@bazel_skylib//lib:selects.bzl", "selects")
-
-package(default_visibility = ["//visibility:public"])
-
-_NO_MATCH_ERROR = \"\"\"\\
-No matching wheel for current configuration's Python version.
-
-The current build configuration's Python version doesn't match any of the Python
-wheels available for this wheel. This wheel supports the following Python
-configuration settings:
- //_config:is_python_3.1
- @@//python/config_settings:is_python_3.2
-
-To determine the current configuration's Python version, run:
- `bazel config <config id>` (shown further below)
-and look for
- rules_python//python/config_settings:python_version
-
-If the value is missing, then the "default" Python version is being used,
-which has a "null" version value and will not match version constraints.
-\"\"\"
-
-alias(
- name = "bar_baz",
- actual = ":pkg",
-)
-
-alias(
- name = "pkg",
- actual = selects.with_or(
- {
- "//_config:is_python_3.1": "@pypi_31_bar_baz//:pkg",
- "@@//python/config_settings:is_python_3.2": "@pypi_32_bar_baz//:pkg",
- },
- no_match_error = _NO_MATCH_ERROR,
- ),
-)
-
-alias(
- name = "whl",
- actual = selects.with_or(
- {
- "//_config:is_python_3.1": "@pypi_31_bar_baz//:whl",
- "@@//python/config_settings:is_python_3.2": "@pypi_32_bar_baz//:whl",
- },
- no_match_error = _NO_MATCH_ERROR,
- ),
-)
-
-alias(
- name = "data",
- actual = selects.with_or(
- {
- "//_config:is_python_3.1": "@pypi_31_bar_baz//:data",
- "@@//python/config_settings:is_python_3.2": "@pypi_32_bar_baz//:data",
- },
- no_match_error = _NO_MATCH_ERROR,
- ),
-)
-
-alias(
- name = "dist_info",
- actual = selects.with_or(
- {
- "//_config:is_python_3.1": "@pypi_31_bar_baz//:dist_info",
- "@@//python/config_settings:is_python_3.2": "@pypi_32_bar_baz//:dist_info",
- },
- no_match_error = _NO_MATCH_ERROR,
- ),
-)"""
-
- actual.pop("_config/BUILD.bazel")
- env.expect.that_collection(actual.keys()).contains_exactly([want_key])
- env.expect.that_str(actual[want_key]).equals(_normalize_label_strings(want_content))
-
-_tests.append(_test_bzlmod_aliases_with_no_default_version)
-
def _test_aliases_are_created_for_all_wheels(env):
actual = render_pkg_aliases(
aliases = {
- "bar": [
- whl_alias(version = "3.1", repo = "pypi_31_bar"),
- whl_alias(version = "3.2", repo = "pypi_32_bar"),
- ],
- "foo": [
- whl_alias(version = "3.1", repo = "pypi_32_foo"),
- whl_alias(version = "3.2", repo = "pypi_31_foo"),
- ],
+ "bar": {
+ whl_config_setting(version = "3.1"): "pypi_31_bar",
+ whl_config_setting(version = "3.2"): "pypi_32_bar",
+ },
+ "foo": {
+ whl_config_setting(version = "3.1"): "pypi_32_foo",
+ whl_config_setting(version = "3.2"): "pypi_31_foo",
+ },
},
)
@@ -324,18 +165,18 @@
def _test_aliases_with_groups(env):
actual = render_pkg_aliases(
aliases = {
- "bar": [
- whl_alias(version = "3.1", repo = "pypi_31_bar"),
- whl_alias(version = "3.2", repo = "pypi_32_bar"),
- ],
- "baz": [
- whl_alias(version = "3.1", repo = "pypi_31_baz"),
- whl_alias(version = "3.2", repo = "pypi_32_baz"),
- ],
- "foo": [
- whl_alias(version = "3.1", repo = "pypi_32_foo"),
- whl_alias(version = "3.2", repo = "pypi_31_foo"),
- ],
+ "bar": {
+ whl_config_setting(version = "3.1"): "pypi_31_bar",
+ whl_config_setting(version = "3.2"): "pypi_32_bar",
+ },
+ "baz": {
+ whl_config_setting(version = "3.1"): "pypi_31_baz",
+ whl_config_setting(version = "3.2"): "pypi_32_baz",
+ },
+ "foo": {
+ whl_config_setting(version = "3.1"): "pypi_32_foo",
+ whl_config_setting(version = "3.2"): "pypi_31_foo",
+ },
},
requirement_cycles = {
"group": ["bar", "baz"],
@@ -357,16 +198,14 @@
want_key = "bar/BUILD.bazel"
- # Just check that it contains a private whl
- env.expect.that_str(actual[want_key]).contains("name = \"_whl\"")
- env.expect.that_str(actual[want_key]).contains("name = \"whl\"")
- env.expect.that_str(actual[want_key]).contains("\"//_groups:group_whl\"")
+ # Just check that we pass the group name
+ env.expect.that_str(actual[want_key]).contains("group_name = \"group\"")
_tests.append(_test_aliases_with_groups)
def _test_empty_flag_versions(env):
got = get_whl_flag_versions(
- aliases = [],
+ settings = [],
)
want = {}
env.expect.that_dict(got).contains_exactly(want)
@@ -375,10 +214,10 @@
def _test_get_python_versions(env):
got = get_whl_flag_versions(
- aliases = [
- whl_alias(repo = "foo", version = "3.3"),
- whl_alias(repo = "foo", version = "3.2"),
- ],
+ settings = {
+ whl_config_setting(version = "3.3"): "foo",
+ whl_config_setting(version = "3.2"): "foo",
+ },
)
want = {
"python_versions": ["3.2", "3.3"],
@@ -387,11 +226,28 @@
_tests.append(_test_get_python_versions)
+def _test_get_python_versions_with_target_platforms(env):
+ got = get_whl_flag_versions(
+ settings = [
+ whl_config_setting(version = "3.3", target_platforms = ["cp33_linux_x86_64"]),
+ whl_config_setting(version = "3.2", target_platforms = ["cp32_linux_x86_64", "cp32_osx_aarch64"]),
+ ],
+ )
+ want = {
+ "python_versions": ["3.2", "3.3"],
+ "target_platforms": [
+ "linux_x86_64",
+ "osx_aarch64",
+ ],
+ }
+ env.expect.that_dict(got).contains_exactly(want)
+
+_tests.append(_test_get_python_versions_with_target_platforms)
+
def _test_get_python_versions_from_filenames(env):
got = get_whl_flag_versions(
- aliases = [
- whl_alias(
- repo = "foo",
+ settings = [
+ whl_config_setting(
version = "3.3",
filename = "foo-0.0.0-py3-none-" + plat + ".whl",
)
@@ -427,9 +283,8 @@
def _test_get_flag_versions_from_alias_target_platforms(env):
got = get_whl_flag_versions(
- aliases = [
- whl_alias(
- repo = "foo",
+ settings = [
+ whl_config_setting(
version = "3.3",
filename = "foo-0.0.0-py3-none-" + plat + ".whl",
)
@@ -437,8 +292,7 @@
"windows_x86_64",
]
] + [
- whl_alias(
- repo = "foo",
+ whl_config_setting(
version = "3.3",
filename = "foo-0.0.0-py3-none-any.whl",
target_platforms = [
@@ -640,159 +494,6 @@
_tests.append(_test_cp37_abi3_manylinux_2_17_musllinux_1_1_aarch64)
-def _test_multiplatform_whl_aliases_empty(env):
- # Check that we still work with an empty requirements.txt
- got = multiplatform_whl_aliases(aliases = [])
- env.expect.that_collection(got).contains_exactly([])
-
-_tests.append(_test_multiplatform_whl_aliases_empty)
-
-def _test_multiplatform_whl_aliases_nofilename(env):
- aliases = [
- whl_alias(
- repo = "foo",
- config_setting = "//:label",
- version = "3.1",
- ),
- ]
- got = multiplatform_whl_aliases(aliases = aliases)
- env.expect.that_collection(got).contains_exactly(aliases)
-
-_tests.append(_test_multiplatform_whl_aliases_nofilename)
-
-def _test_multiplatform_whl_aliases_filename(env):
- aliases = [
- whl_alias(
- repo = "foo-py3-0.0.3",
- filename = "foo-0.0.3-py3-none-any.whl",
- version = "3.2",
- ),
- whl_alias(
- repo = "foo-py3-0.0.1",
- filename = "foo-0.0.1-py3-none-any.whl",
- version = "3.1",
- ),
- whl_alias(
- repo = "foo-0.0.2",
- filename = "foo-0.0.2-py3-none-any.whl",
- version = "3.1",
- target_platforms = [
- "cp31_linux_x86_64",
- "cp31_linux_aarch64",
- ],
- ),
- ]
- got = multiplatform_whl_aliases(
- aliases = aliases,
- glibc_versions = [],
- muslc_versions = [],
- osx_versions = [],
- )
- want = [
- whl_alias(config_setting = "//_config:is_cp3.1_py3_none_any", repo = "foo-py3-0.0.1", version = "3.1"),
- whl_alias(config_setting = "//_config:is_cp3.1_py3_none_any_linux_aarch64", repo = "foo-0.0.2", version = "3.1"),
- whl_alias(config_setting = "//_config:is_cp3.1_py3_none_any_linux_x86_64", repo = "foo-0.0.2", version = "3.1"),
- whl_alias(config_setting = "//_config:is_cp3.2_py3_none_any", repo = "foo-py3-0.0.3", version = "3.2"),
- ]
- env.expect.that_collection(got).contains_exactly(want)
-
-_tests.append(_test_multiplatform_whl_aliases_filename)
-
-def _test_multiplatform_whl_aliases_filename_versioned(env):
- aliases = [
- whl_alias(
- repo = "glibc-2.17",
- filename = "foo-0.0.1-py3-none-manylinux_2_17_x86_64.whl",
- version = "3.1",
- ),
- whl_alias(
- repo = "glibc-2.18",
- filename = "foo-0.0.1-py3-none-manylinux_2_18_x86_64.whl",
- version = "3.1",
- ),
- whl_alias(
- repo = "musl",
- filename = "foo-0.0.1-py3-none-musllinux_1_1_x86_64.whl",
- version = "3.1",
- ),
- ]
- got = multiplatform_whl_aliases(
- aliases = aliases,
- glibc_versions = [(2, 17), (2, 18)],
- muslc_versions = [(1, 1), (1, 2)],
- osx_versions = [],
- )
- want = [
- whl_alias(config_setting = "//_config:is_cp3.1_py3_none_manylinux_2_17_x86_64", repo = "glibc-2.17", version = "3.1"),
- whl_alias(config_setting = "//_config:is_cp3.1_py3_none_manylinux_2_18_x86_64", repo = "glibc-2.18", version = "3.1"),
- whl_alias(config_setting = "//_config:is_cp3.1_py3_none_manylinux_x86_64", repo = "glibc-2.17", version = "3.1"),
- whl_alias(config_setting = "//_config:is_cp3.1_py3_none_musllinux_1_1_x86_64", repo = "musl", version = "3.1"),
- whl_alias(config_setting = "//_config:is_cp3.1_py3_none_musllinux_1_2_x86_64", repo = "musl", version = "3.1"),
- whl_alias(config_setting = "//_config:is_cp3.1_py3_none_musllinux_x86_64", repo = "musl", version = "3.1"),
- ]
- env.expect.that_collection(got).contains_exactly(want)
-
-_tests.append(_test_multiplatform_whl_aliases_filename_versioned)
-
-def _test_config_settings_exist(env):
- for py_tag in ["py2.py3", "py3", "py311", "cp311"]:
- if py_tag == "py2.py3":
- abis = ["none"]
- elif py_tag.startswith("py"):
- abis = ["none", "abi3"]
- else:
- abis = ["none", "abi3", "cp311"]
-
- for abi_tag in abis:
- for platform_tag, kwargs in {
- "any": {},
- "macosx_11_0_arm64": {
- "osx_versions": [(11, 0)],
- "target_platforms": ["osx_aarch64"],
- },
- "manylinux_2_17_x86_64": {
- "glibc_versions": [(2, 17), (2, 18)],
- "target_platforms": ["linux_x86_64"],
- },
- "manylinux_2_18_x86_64": {
- "glibc_versions": [(2, 17), (2, 18)],
- "target_platforms": ["linux_x86_64"],
- },
- "musllinux_1_1_aarch64": {
- "muslc_versions": [(1, 2), (1, 1), (1, 0)],
- "target_platforms": ["linux_aarch64"],
- },
- }.items():
- aliases = [
- whl_alias(
- repo = "repo",
- filename = "foo-0.0.1-{}-{}-{}.whl".format(py_tag, abi_tag, platform_tag),
- version = "3.11",
- ),
- ]
- available_config_settings = []
- mock_rule = lambda name, **kwargs: available_config_settings.append(name)
- config_settings(
- python_versions = ["3.11"],
- native = struct(
- alias = mock_rule,
- config_setting = mock_rule,
- ),
- **kwargs
- )
-
- got_aliases = multiplatform_whl_aliases(
- aliases = aliases,
- glibc_versions = kwargs.get("glibc_versions", []),
- muslc_versions = kwargs.get("muslc_versions", []),
- osx_versions = kwargs.get("osx_versions", []),
- )
- got = [a.config_setting.partition(":")[-1] for a in got_aliases]
-
- env.expect.that_collection(available_config_settings).contains_at_least(got)
-
-_tests.append(_test_config_settings_exist)
-
def render_pkg_aliases_test_suite(name):
"""Create the test suite.
diff --git a/tests/pypi/whl_library_targets/BUILD.bazel b/tests/pypi/whl_library_targets/BUILD.bazel
new file mode 100644
index 0000000..f3d25c2
--- /dev/null
+++ b/tests/pypi/whl_library_targets/BUILD.bazel
@@ -0,0 +1,5 @@
+load(":whl_library_targets_tests.bzl", "whl_library_targets_test_suite")
+
+whl_library_targets_test_suite(
+ name = "whl_library_targets_tests",
+)
diff --git a/tests/pypi/whl_library_targets/whl_library_targets_tests.bzl b/tests/pypi/whl_library_targets/whl_library_targets_tests.bzl
new file mode 100644
index 0000000..e69eb0f
--- /dev/null
+++ b/tests/pypi/whl_library_targets/whl_library_targets_tests.bzl
@@ -0,0 +1,360 @@
+# Copyright 2024 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+""
+
+load("@rules_testing//lib:test_suite.bzl", "test_suite")
+load("//python/private:glob_excludes.bzl", "glob_excludes") # buildifier: disable=bzl-visibility
+load("//python/private/pypi:whl_library_targets.bzl", "whl_library_targets") # buildifier: disable=bzl-visibility
+
+_tests = []
+
+def _test_filegroups(env):
+ calls = []
+
+ def glob(match, *, allow_empty):
+ env.expect.that_bool(allow_empty).equals(True)
+ return match
+
+ whl_library_targets(
+ name = "",
+ dep_template = "",
+ native = struct(
+ filegroup = lambda **kwargs: calls.append(kwargs),
+ glob = glob,
+ ),
+ rules = struct(),
+ )
+
+ env.expect.that_collection(calls).contains_exactly([
+ {
+ "name": "dist_info",
+ "srcs": ["site-packages/*.dist-info/**"],
+ "visibility": ["//visibility:public"],
+ },
+ {
+ "name": "data",
+ "srcs": ["data/**"],
+ "visibility": ["//visibility:public"],
+ },
+ {
+ "name": "whl",
+ "srcs": [""],
+ "data": [],
+ "visibility": ["//visibility:public"],
+ },
+ ]) # buildifier: @unsorted-dict-items
+
+_tests.append(_test_filegroups)
+
+def _test_platforms(env):
+ calls = []
+
+ whl_library_targets(
+ name = "",
+ dep_template = None,
+ dependencies_by_platform = {
+ "@//python/config_settings:is_python_3.9": ["py39_dep"],
+ "@platforms//cpu:aarch64": ["arm_dep"],
+ "@platforms//os:windows": ["win_dep"],
+ "cp310_linux_ppc": ["py310_linux_ppc_dep"],
+ "cp39_anyos_aarch64": ["py39_arm_dep"],
+ "cp39_linux_anyarch": ["py39_linux_dep"],
+ "linux_x86_64": ["linux_intel_dep"],
+ },
+ filegroups = {},
+ native = struct(
+ config_setting = lambda **kwargs: calls.append(kwargs),
+ ),
+ rules = struct(),
+ )
+
+ env.expect.that_collection(calls).contains_exactly([
+ {
+ "name": "is_python_3.10_linux_ppc",
+ "flag_values": {
+ "@rules_python//python/config_settings:python_version_major_minor": "3.10",
+ },
+ "constraint_values": [
+ "@platforms//cpu:ppc",
+ "@platforms//os:linux",
+ ],
+ "visibility": ["//visibility:private"],
+ },
+ {
+ "name": "is_python_3.9_anyos_aarch64",
+ "flag_values": {
+ "@rules_python//python/config_settings:python_version_major_minor": "3.9",
+ },
+ "constraint_values": ["@platforms//cpu:aarch64"],
+ "visibility": ["//visibility:private"],
+ },
+ {
+ "name": "is_python_3.9_linux_anyarch",
+ "flag_values": {
+ "@rules_python//python/config_settings:python_version_major_minor": "3.9",
+ },
+ "constraint_values": ["@platforms//os:linux"],
+ "visibility": ["//visibility:private"],
+ },
+ {
+ "name": "is_linux_x86_64",
+ "constraint_values": [
+ "@platforms//cpu:x86_64",
+ "@platforms//os:linux",
+ ],
+ "visibility": ["//visibility:private"],
+ },
+ ]) # buildifier: @unsorted-dict-items
+
+_tests.append(_test_platforms)
+
+def _test_copy(env):
+ calls = []
+
+ whl_library_targets(
+ name = "",
+ dep_template = None,
+ dependencies_by_platform = {},
+ filegroups = {},
+ copy_files = {"file_src": "file_dest"},
+ copy_executables = {"exec_src": "exec_dest"},
+ native = struct(),
+ rules = struct(
+ copy_file = lambda **kwargs: calls.append(kwargs),
+ ),
+ )
+
+ env.expect.that_collection(calls).contains_exactly([
+ {
+ "name": "file_dest.copy",
+ "out": "file_dest",
+ "src": "file_src",
+ "visibility": ["//visibility:public"],
+ },
+ {
+ "is_executable": True,
+ "name": "exec_dest.copy",
+ "out": "exec_dest",
+ "src": "exec_src",
+ "visibility": ["//visibility:public"],
+ },
+ ])
+
+_tests.append(_test_copy)
+
+def _test_entrypoints(env):
+ calls = []
+
+ whl_library_targets(
+ name = "",
+ dep_template = None,
+ dependencies_by_platform = {},
+ filegroups = {},
+ entry_points = {
+ "fizz": "buzz.py",
+ },
+ native = struct(),
+ rules = struct(
+ py_binary = lambda **kwargs: calls.append(kwargs),
+ ),
+ )
+
+ env.expect.that_collection(calls).contains_exactly([
+ {
+ "name": "rules_python_wheel_entry_point_fizz",
+ "srcs": ["buzz.py"],
+ "deps": [":pkg"],
+ "imports": ["."],
+ "visibility": ["//visibility:public"],
+ },
+ ]) # buildifier: @unsorted-dict-items
+
+_tests.append(_test_entrypoints)
+
+def _test_whl_and_library_deps(env):
+ filegroup_calls = []
+ py_library_calls = []
+
+ whl_library_targets(
+ name = "foo.whl",
+ dep_template = "@pypi_{name}//:{target}",
+ dependencies = ["foo", "bar-baz"],
+ dependencies_by_platform = {
+ "@//python/config_settings:is_python_3.9": ["py39_dep"],
+ "@platforms//cpu:aarch64": ["arm_dep"],
+ "@platforms//os:windows": ["win_dep"],
+ "cp310_linux_ppc": ["py310_linux_ppc_dep"],
+ "cp39_anyos_aarch64": ["py39_arm_dep"],
+ "cp39_linux_anyarch": ["py39_linux_dep"],
+ "linux_x86_64": ["linux_intel_dep"],
+ },
+ data_exclude = [],
+ tags = ["tag1", "tag2"],
+ # Overrides for testing
+ filegroups = {},
+ native = struct(
+ filegroup = lambda **kwargs: filegroup_calls.append(kwargs),
+ config_setting = lambda **_: None,
+ glob = _glob,
+ select = _select,
+ ),
+ rules = struct(
+ py_library = lambda **kwargs: py_library_calls.append(kwargs),
+ ),
+ )
+
+ env.expect.that_collection(filegroup_calls).contains_exactly([
+ {
+ "name": "whl",
+ "srcs": ["foo.whl"],
+ "data": [
+ "@pypi_bar_baz//:whl",
+ "@pypi_foo//:whl",
+ ] + _select(
+ {
+ Label("//python/config_settings:is_python_3.9"): ["@pypi_py39_dep//:whl"],
+ "@platforms//cpu:aarch64": ["@pypi_arm_dep//:whl"],
+ "@platforms//os:windows": ["@pypi_win_dep//:whl"],
+ ":is_python_3.10_linux_ppc": ["@pypi_py310_linux_ppc_dep//:whl"],
+ ":is_python_3.9_anyos_aarch64": ["@pypi_py39_arm_dep//:whl"],
+ ":is_python_3.9_linux_anyarch": ["@pypi_py39_linux_dep//:whl"],
+ ":is_linux_x86_64": ["@pypi_linux_intel_dep//:whl"],
+ "//conditions:default": [],
+ },
+ ),
+ "visibility": ["//visibility:public"],
+ },
+ ]) # buildifier: @unsorted-dict-items
+ env.expect.that_collection(py_library_calls).contains_exactly([
+ {
+ "name": "pkg",
+ "srcs": _glob(
+ ["site-packages/**/*.py"],
+ exclude = [],
+ allow_empty = True,
+ ),
+ "data": [] + _glob(
+ ["site-packages/**/*"],
+ exclude = [
+ "**/*.py",
+ "**/*.pyc",
+ "**/*.pyc.*",
+ "**/*.dist-info/RECORD",
+ ] + glob_excludes.version_dependent_exclusions(),
+ ),
+ "imports": ["site-packages"],
+ "deps": [
+ "@pypi_bar_baz//:pkg",
+ "@pypi_foo//:pkg",
+ ] + _select(
+ {
+ Label("//python/config_settings:is_python_3.9"): ["@pypi_py39_dep//:pkg"],
+ "@platforms//cpu:aarch64": ["@pypi_arm_dep//:pkg"],
+ "@platforms//os:windows": ["@pypi_win_dep//:pkg"],
+ ":is_python_3.10_linux_ppc": ["@pypi_py310_linux_ppc_dep//:pkg"],
+ ":is_python_3.9_anyos_aarch64": ["@pypi_py39_arm_dep//:pkg"],
+ ":is_python_3.9_linux_anyarch": ["@pypi_py39_linux_dep//:pkg"],
+ ":is_linux_x86_64": ["@pypi_linux_intel_dep//:pkg"],
+ "//conditions:default": [],
+ },
+ ),
+ "tags": ["tag1", "tag2"],
+ "visibility": ["//visibility:public"],
+ },
+ ]) # buildifier: @unsorted-dict-items
+
+_tests.append(_test_whl_and_library_deps)
+
+def _test_group(env):
+ alias_calls = []
+ py_library_calls = []
+
+ whl_library_targets(
+ name = "foo.whl",
+ dep_template = "@pypi_{name}//:{target}",
+ dependencies = ["foo", "bar-baz", "qux"],
+ dependencies_by_platform = {
+ "linux_x86_64": ["box", "box-amd64"],
+ "windows_x86_64": ["fox"],
+ "@platforms//os:linux": ["box"], # buildifier: disable=unsorted-dict-items to check that we sort inside the test
+ },
+ tags = [],
+ entry_points = {},
+ data_exclude = [],
+ group_name = "qux",
+ group_deps = ["foo", "fox", "qux"],
+ # Overrides for testing
+ filegroups = {},
+ native = struct(
+ config_setting = lambda **_: None,
+ glob = _glob,
+ alias = lambda **kwargs: alias_calls.append(kwargs),
+ select = _select,
+ ),
+ rules = struct(
+ py_library = lambda **kwargs: py_library_calls.append(kwargs),
+ ),
+ )
+
+ env.expect.that_collection(alias_calls).contains_exactly([
+ {"name": "pkg", "actual": "@pypi__groups//:qux_pkg", "visibility": ["//visibility:public"]},
+ {"name": "whl", "actual": "@pypi__groups//:qux_whl", "visibility": ["//visibility:public"]},
+ ]) # buildifier: @unsorted-dict-items
+ env.expect.that_collection(py_library_calls).contains_exactly([
+ {
+ "name": "_pkg",
+ "srcs": _glob(["site-packages/**/*.py"], exclude = [], allow_empty = True),
+ "data": [] + _glob(
+ ["site-packages/**/*"],
+ exclude = [
+ "**/*.py",
+ "**/*.pyc",
+ "**/*.pyc.*",
+ "**/*.dist-info/RECORD",
+ ] + glob_excludes.version_dependent_exclusions(),
+ ),
+ "imports": ["site-packages"],
+ "deps": ["@pypi_bar_baz//:pkg"] + _select({
+ "@platforms//os:linux": ["@pypi_box//:pkg"],
+ ":is_linux_x86_64": ["@pypi_box//:pkg", "@pypi_box_amd64//:pkg"],
+ "//conditions:default": [],
+ }),
+ "tags": [],
+ "visibility": ["@pypi__groups//:__pkg__"],
+ },
+ ]) # buildifier: @unsorted-dict-items
+
+_tests.append(_test_group)
+
+def _glob(*args, **kwargs):
+ return [struct(
+ glob = args,
+ kwargs = kwargs,
+ )]
+
+def _select(*args, **kwargs):
+ """We need to have this mock select because we still need to support bazel 6."""
+ return [struct(
+ select = args,
+ kwargs = kwargs,
+ )]
+
+def whl_library_targets_test_suite(name):
+ """create the test suite.
+
+ args:
+ name: the name of the test suite
+ """
+ test_suite(name = name, basic_tests = _tests)
diff --git a/tests/runfiles/runfiles_test.py b/tests/runfiles/runfiles_test.py
index 03350f3..cf6a70a 100644
--- a/tests/runfiles/runfiles_test.py
+++ b/tests/runfiles/runfiles_test.py
@@ -185,10 +185,11 @@
def testManifestBasedRlocation(self) -> None:
with _MockFile(
contents=[
- "Foo/runfile1",
+ "Foo/runfile1 ", # A trailing whitespace is always present in single entry lines.
"Foo/runfile2 C:/Actual Path\\runfile2",
"Foo/Bar/runfile3 D:\\the path\\run file 3.txt",
"Foo/Bar/Dir E:\\Actual Path\\Directory",
+ " Foo\\sBar\\bDir\\nNewline/runfile5 F:\\bActual Path\\bwith\\nnewline/runfile5",
]
) as mf:
r = runfiles.CreateManifestBased(mf.Path())
@@ -205,6 +206,10 @@
r.Rlocation("Foo/Bar/Dir/Deeply/Nested/runfile4"),
"E:\\Actual Path\\Directory/Deeply/Nested/runfile4",
)
+ self.assertEqual(
+ r.Rlocation("Foo Bar\\Dir\nNewline/runfile5"),
+ "F:\\Actual Path\\with\nnewline/runfile5",
+ )
self.assertIsNone(r.Rlocation("unknown"))
if RunfilesTest.IsWindows():
self.assertEqual(r.Rlocation("c:/foo"), "c:/foo")
diff --git a/tests/support/cc_toolchains/BUILD.bazel b/tests/support/cc_toolchains/BUILD.bazel
index 889f9e0..f6e6654 100644
--- a/tests/support/cc_toolchains/BUILD.bazel
+++ b/tests/support/cc_toolchains/BUILD.bazel
@@ -12,7 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-load("@rules_cc//cc:defs.bzl", "cc_toolchain", "cc_toolchain_suite")
+load("@rules_cc//cc/toolchains:cc_toolchain.bzl", "cc_toolchain")
+load("@rules_cc//cc/toolchains:cc_toolchain_suite.bzl", "cc_toolchain_suite")
load("@rules_testing//lib:util.bzl", "PREVENT_IMPLICIT_BUILDING_TAGS")
load("//python/cc:py_cc_toolchain.bzl", "py_cc_toolchain")
load(":fake_cc_toolchain_config.bzl", "fake_cc_toolchain_config")
diff --git a/tests/support/cc_toolchains/fake_cc_toolchain_config.bzl b/tests/support/cc_toolchains/fake_cc_toolchain_config.bzl
index a2ad615..8240f09 100644
--- a/tests/support/cc_toolchains/fake_cc_toolchain_config.bzl
+++ b/tests/support/cc_toolchains/fake_cc_toolchain_config.bzl
@@ -14,7 +14,7 @@
"""Fake for providing CcToolchainConfigInfo."""
-load("@rules_cc//cc:defs.bzl", "cc_common")
+load("@rules_cc//cc/common:cc_common.bzl", "cc_common")
def _impl(ctx):
return cc_common.create_cc_toolchain_config_info(
diff --git a/tests/support/sh_py_run_test.bzl b/tests/support/sh_py_run_test.bzl
index 066f091..7fb7016 100644
--- a/tests/support/sh_py_run_test.bzl
+++ b/tests/support/sh_py_run_test.bzl
@@ -136,7 +136,7 @@
reconfig_kwargs["env"] = kwargs.get("env")
reconfig_kwargs["target_compatible_with"] = kwargs.get("target_compatible_with")
- inner_name = "_{}_inner" + name
+ inner_name = "_{}_inner".format(name)
_py_reconfig_test(
name = name,
target = inner_name,
@@ -149,6 +149,14 @@
)
def sh_py_run_test(*, name, sh_src, py_src, **kwargs):
+ """Run a py_binary within a sh_test.
+
+ Args:
+ name: name of the sh_test and base name of inner targets.
+ sh_src: .sh file to run as a test
+ py_src: .py file for the py_binary
+ **kwargs: additional kwargs passed onto py_binary and/or sh_test
+ """
bin_name = "_{}_bin".format(name)
sh_test(
name = name,
@@ -158,10 +166,16 @@
"@bazel_tools//tools/bash/runfiles",
],
env = {
- "BIN_RLOCATION": "$(rlocationpath {})".format(bin_name),
+ "BIN_RLOCATION": "$(rlocationpaths {})".format(bin_name),
},
)
+ py_binary_kwargs = {
+ key: kwargs.pop(key)
+ for key in ("imports", "deps")
+ if key in kwargs
+ }
+
_py_reconfig_binary(
name = bin_name,
tags = ["manual"],
@@ -174,6 +188,7 @@
srcs = [py_src],
main = py_src,
tags = ["manual"],
+ **py_binary_kwargs
)
def _current_build_settings_impl(ctx):
diff --git a/tests/support/support.bzl b/tests/support/support.bzl
index 7358a6b..2b67038 100644
--- a/tests/support/support.bzl
+++ b/tests/support/support.bzl
@@ -19,6 +19,8 @@
# rules_testing or as config_setting values, which don't support Label in some
# places.
+load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility
+
MAC = Label("//tests/support:mac")
MAC_X86_64 = Label("//tests/support:mac_x86_64")
LINUX = Label("//tests/support:linux")
@@ -39,3 +41,8 @@
PYC_COLLECTION = str(Label("//python/config_settings:pyc_collection"))
PYTHON_VERSION = str(Label("//python/config_settings:python_version"))
VISIBLE_FOR_TESTING = str(Label("//python/private:visible_for_testing"))
+
+SUPPORTS_BOOTSTRAP_SCRIPT = select({
+ "@platforms//os:windows": ["@platforms//:incompatible"],
+ "//conditions:default": [],
+}) if IS_BAZEL_7_OR_HIGHER else ["@platforms//:incompatible"]
diff --git a/tests/whl_filegroup/BUILD.bazel b/tests/whl_filegroup/BUILD.bazel
index d8b711d..2176e9e 100644
--- a/tests/whl_filegroup/BUILD.bazel
+++ b/tests/whl_filegroup/BUILD.bazel
@@ -1,5 +1,6 @@
load("@bazel_skylib//rules:write_file.bzl", "write_file")
-load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test")
+load("@rules_cc//cc:cc_library.bzl", "cc_library")
+load("@rules_cc//cc:cc_test.bzl", "cc_test")
load("//python:defs.bzl", "py_library", "py_test")
load("//python:packaging.bzl", "py_package", "py_wheel")
load("//python:pip.bzl", "whl_filegroup")
diff --git a/tools/private/BUILD.bazel b/tools/private/BUILD.bazel
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/private/BUILD.bazel
diff --git a/tools/private/publish_deps.bzl b/tools/private/publish_deps.bzl
new file mode 100644
index 0000000..538cc1d
--- /dev/null
+++ b/tools/private/publish_deps.bzl
@@ -0,0 +1,29 @@
+# Copyright 2024 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""A simple macro to lock the requirements for twine
+"""
+
+load("//python/uv/private:lock.bzl", "lock") # buildifier: disable=bzl-visibility
+
+def publish_deps(*, name, outs, **kwargs):
+ """Generate all of the requirements files for all platforms."""
+ for out, platform in outs.items():
+ lock(
+ name = out.replace(".txt", ""),
+ out = out,
+ universal = platform == "",
+ args = [] if not platform else ["--python-platform=" + platform],
+ **kwargs
+ )
diff --git a/tools/private/update_bzlmod_lockfiles.sh b/tools/private/update_bzlmod_lockfiles.sh
deleted file mode 100755
index 309d64e..0000000
--- a/tools/private/update_bzlmod_lockfiles.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env bash
-set -euxo pipefail
-
-cd "$(dirname "$0")"/../../examples/bzlmod
-bazel mod deps
diff --git a/tools/private/update_deps/BUILD.bazel b/tools/private/update_deps/BUILD.bazel
index c83deb0..beecf82 100644
--- a/tools/private/update_deps/BUILD.bazel
+++ b/tools/private/update_deps/BUILD.bazel
@@ -58,6 +58,7 @@
"REQUIREMENTS_TXT": "$(rlocationpath //python/private/pypi:requirements_txt)",
},
imports = ["../../.."],
+ visibility = ["//private:__pkg__"],
deps = [
":args",
":update_file",
diff --git a/tools/private/update_deps/update_coverage_deps.py b/tools/private/update_deps/update_coverage_deps.py
index a856b7a..bbff67e 100755
--- a/tools/private/update_deps/update_coverage_deps.py
+++ b/tools/private/update_deps/update_coverage_deps.py
@@ -42,6 +42,10 @@
"manylinux2014_aarch64": "aarch64-unknown-linux-gnu",
"macosx_11_0_arm64": "aarch64-apple-darwin",
"macosx_10_9_x86_64": "x86_64-apple-darwin",
+ ("t", "manylinux2014_x86_64"): "x86_64-unknown-linux-gnu-freethreaded",
+ ("t", "manylinux2014_aarch64"): "aarch64-unknown-linux-gnu-freethreaded",
+ ("t", "macosx_11_0_arm64"): "aarch64-apple-darwin-freethreaded",
+ ("t", "macosx_10_9_x86_64"): "x86_64-apple-darwin-freethreaded",
}
@@ -87,10 +91,18 @@
return "{{\n{}\n}}".format(textwrap.indent("\n".join(parts), prefix=" "))
-def _get_platforms(filename: str, name: str, version: str, python_version: str):
- return filename[
- len(f"{name}-{version}-{python_version}-{python_version}-") : -len(".whl")
- ].split(".")
+def _get_platforms(filename: str, python_version: str):
+ name, _, tail = filename.partition("-")
+ version, _, tail = tail.partition("-")
+ got_python_version, _, tail = tail.partition("-")
+ if python_version != got_python_version:
+ return []
+ abi, _, tail = tail.partition("-")
+
+ platforms, _, tail = tail.rpartition(".")
+ platforms = platforms.split(".")
+
+ return [("t", p) for p in platforms] if abi.endswith("t") else platforms
def _map(
@@ -172,8 +184,6 @@
platforms = _get_platforms(
u["filename"],
- args.name,
- args.version,
u["python_version"],
)
diff --git a/tools/publish/BUILD.bazel b/tools/publish/BUILD.bazel
index a51693b..1648ac8 100644
--- a/tools/publish/BUILD.bazel
+++ b/tools/publish/BUILD.bazel
@@ -1,13 +1,6 @@
-load("//python:pip.bzl", "compile_pip_requirements")
load("//python/config_settings:transition.bzl", "py_binary")
load("//python/entry_points:py_console_script_binary.bzl", "py_console_script_binary")
-
-compile_pip_requirements(
- name = "requirements",
- src = "requirements.in",
- requirements_darwin = "requirements_darwin.txt",
- requirements_windows = "requirements_windows.txt",
-)
+load("//tools/private:publish_deps.bzl", "publish_deps")
py_console_script_binary(
name = "twine",
@@ -26,9 +19,24 @@
name = "distribution",
srcs = [
"BUILD.bazel",
- "requirements.txt",
"requirements_darwin.txt",
+ "requirements_linux.txt",
+ "requirements_universal.txt",
"requirements_windows.txt",
],
- visibility = ["//tools:__pkg__"],
+ visibility = ["//tools:__subpackages__"],
+)
+
+# Run bazel run //private:requirements.update to update the outs
+publish_deps(
+ name = "requirements",
+ srcs = ["requirements.in"],
+ outs = {
+ "requirements_darwin.txt": "macos",
+ "requirements_linux.txt": "linux",
+ "requirements_universal.txt": "", # universal
+ "requirements_windows.txt": "windows",
+ },
+ upgrade = True,
+ visibility = ["//private:__pkg__"],
)
diff --git a/tools/publish/requirements.txt b/tools/publish/requirements.txt
deleted file mode 100644
index 2a9721d..0000000
--- a/tools/publish/requirements.txt
+++ /dev/null
@@ -1,306 +0,0 @@
-#
-# This file is autogenerated by pip-compile with Python 3.11
-# by the following command:
-#
-# bazel run //tools/publish:requirements.update
-#
-bleach==6.0.0 \
- --hash=sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414 \
- --hash=sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4
- # via readme-renderer
-certifi==2022.12.7 \
- --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \
- --hash=sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18
- # via requests
-cffi==1.15.1 \
- --hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \
- --hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \
- --hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \
- --hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \
- --hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \
- --hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \
- --hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \
- --hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \
- --hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \
- --hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \
- --hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \
- --hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \
- --hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \
- --hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \
- --hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \
- --hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \
- --hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \
- --hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \
- --hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \
- --hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \
- --hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \
- --hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \
- --hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \
- --hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \
- --hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \
- --hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \
- --hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \
- --hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \
- --hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \
- --hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \
- --hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \
- --hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \
- --hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \
- --hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \
- --hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \
- --hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \
- --hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \
- --hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \
- --hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \
- --hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \
- --hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \
- --hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \
- --hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \
- --hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \
- --hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \
- --hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \
- --hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \
- --hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \
- --hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \
- --hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \
- --hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \
- --hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \
- --hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \
- --hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \
- --hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \
- --hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \
- --hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \
- --hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \
- --hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \
- --hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \
- --hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \
- --hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \
- --hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \
- --hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0
- # via cryptography
-charset-normalizer==3.0.1 \
- --hash=sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b \
- --hash=sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42 \
- --hash=sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d \
- --hash=sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b \
- --hash=sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a \
- --hash=sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59 \
- --hash=sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154 \
- --hash=sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1 \
- --hash=sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c \
- --hash=sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a \
- --hash=sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d \
- --hash=sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6 \
- --hash=sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b \
- --hash=sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b \
- --hash=sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783 \
- --hash=sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5 \
- --hash=sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918 \
- --hash=sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555 \
- --hash=sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639 \
- --hash=sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786 \
- --hash=sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e \
- --hash=sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed \
- --hash=sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820 \
- --hash=sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8 \
- --hash=sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3 \
- --hash=sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541 \
- --hash=sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14 \
- --hash=sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be \
- --hash=sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e \
- --hash=sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76 \
- --hash=sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b \
- --hash=sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c \
- --hash=sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b \
- --hash=sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3 \
- --hash=sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc \
- --hash=sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6 \
- --hash=sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59 \
- --hash=sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4 \
- --hash=sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d \
- --hash=sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d \
- --hash=sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3 \
- --hash=sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a \
- --hash=sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea \
- --hash=sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6 \
- --hash=sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e \
- --hash=sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603 \
- --hash=sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24 \
- --hash=sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a \
- --hash=sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58 \
- --hash=sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678 \
- --hash=sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a \
- --hash=sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c \
- --hash=sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6 \
- --hash=sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18 \
- --hash=sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174 \
- --hash=sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317 \
- --hash=sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f \
- --hash=sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc \
- --hash=sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837 \
- --hash=sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41 \
- --hash=sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c \
- --hash=sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579 \
- --hash=sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753 \
- --hash=sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8 \
- --hash=sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291 \
- --hash=sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087 \
- --hash=sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866 \
- --hash=sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3 \
- --hash=sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d \
- --hash=sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1 \
- --hash=sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca \
- --hash=sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e \
- --hash=sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db \
- --hash=sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72 \
- --hash=sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d \
- --hash=sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc \
- --hash=sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539 \
- --hash=sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d \
- --hash=sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af \
- --hash=sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b \
- --hash=sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602 \
- --hash=sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f \
- --hash=sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478 \
- --hash=sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c \
- --hash=sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e \
- --hash=sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479 \
- --hash=sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7 \
- --hash=sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8
- # via requests
-cryptography==42.0.4 \
- --hash=sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b \
- --hash=sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce \
- --hash=sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88 \
- --hash=sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7 \
- --hash=sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20 \
- --hash=sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9 \
- --hash=sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff \
- --hash=sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1 \
- --hash=sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764 \
- --hash=sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b \
- --hash=sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298 \
- --hash=sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1 \
- --hash=sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824 \
- --hash=sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257 \
- --hash=sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a \
- --hash=sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129 \
- --hash=sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb \
- --hash=sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929 \
- --hash=sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854 \
- --hash=sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52 \
- --hash=sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923 \
- --hash=sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885 \
- --hash=sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0 \
- --hash=sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd \
- --hash=sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2 \
- --hash=sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18 \
- --hash=sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b \
- --hash=sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992 \
- --hash=sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74 \
- --hash=sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660 \
- --hash=sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925 \
- --hash=sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449
- # via secretstorage
-docutils==0.19 \
- --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \
- --hash=sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc
- # via readme-renderer
-idna==3.4 \
- --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \
- --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2
- # via requests
-importlib-metadata==6.0.0 \
- --hash=sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad \
- --hash=sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d
- # via
- # keyring
- # twine
-jaraco-classes==3.2.3 \
- --hash=sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158 \
- --hash=sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a
- # via keyring
-jeepney==0.8.0 \
- --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \
- --hash=sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755
- # via
- # keyring
- # secretstorage
-keyring==23.13.1 \
- --hash=sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd \
- --hash=sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678
- # via twine
-markdown-it-py==2.1.0 \
- --hash=sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27 \
- --hash=sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da
- # via rich
-mdurl==0.1.2 \
- --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \
- --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
- # via markdown-it-py
-more-itertools==9.0.0 \
- --hash=sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41 \
- --hash=sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab
- # via jaraco-classes
-pkginfo==1.9.6 \
- --hash=sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546 \
- --hash=sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046
- # via twine
-pycparser==2.21 \
- --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \
- --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206
- # via cffi
-pygments==2.14.0 \
- --hash=sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297 \
- --hash=sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717
- # via
- # readme-renderer
- # rich
-readme-renderer==37.3 \
- --hash=sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273 \
- --hash=sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343
- # via twine
-requests==2.28.2 \
- --hash=sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa \
- --hash=sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf
- # via
- # requests-toolbelt
- # twine
-requests-toolbelt==0.10.1 \
- --hash=sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7 \
- --hash=sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d
- # via twine
-rfc3986==2.0.0 \
- --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \
- --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c
- # via twine
-rich==13.2.0 \
- --hash=sha256:7c963f0d03819221e9ac561e1bc866e3f95a02248c1234daa48954e6d381c003 \
- --hash=sha256:f1a00cdd3eebf999a15d85ec498bfe0b1a77efe9b34f645768a54132ef444ac5
- # via twine
-secretstorage==3.3.3 \
- --hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \
- --hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99
- # via keyring
-six==1.16.0 \
- --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \
- --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254
- # via bleach
-twine==4.0.2 \
- --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \
- --hash=sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8
- # via -r tools/publish/requirements.in
-urllib3==1.26.14 \
- --hash=sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72 \
- --hash=sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1
- # via
- # requests
- # twine
-webencodings==0.5.1 \
- --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \
- --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923
- # via bleach
-zipp==3.11.0 \
- --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \
- --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766
- # via importlib-metadata
diff --git a/tools/publish/requirements_darwin.txt b/tools/publish/requirements_darwin.txt
index ddd47c7..2f8088e 100644
--- a/tools/publish/requirements_darwin.txt
+++ b/tools/publish/requirements_darwin.txt
@@ -1,108 +1,121 @@
-#
-# This file is autogenerated by pip-compile with Python 3.11
-# by the following command:
-#
-# bazel run //tools/publish:requirements.update
-#
-bleach==6.0.0 \
- --hash=sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414 \
- --hash=sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4
- # via readme-renderer
+# This file was autogenerated by uv via the following command:
+# bazel run //tools/publish:requirements_darwin.update
+--index-url https://pypi.org/simple
+
+backports-tarfile==1.2.0 \
+ --hash=sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34 \
+ --hash=sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991
+ # via jaraco-context
certifi==2024.8.30 \
--hash=sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 \
--hash=sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9
# via requests
-charset-normalizer==3.3.2 \
- --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \
- --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \
- --hash=sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786 \
- --hash=sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8 \
- --hash=sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09 \
- --hash=sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185 \
- --hash=sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574 \
- --hash=sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e \
- --hash=sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519 \
- --hash=sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898 \
- --hash=sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269 \
- --hash=sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3 \
- --hash=sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f \
- --hash=sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6 \
- --hash=sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8 \
- --hash=sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a \
- --hash=sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73 \
- --hash=sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc \
- --hash=sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714 \
- --hash=sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2 \
- --hash=sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc \
- --hash=sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce \
- --hash=sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d \
- --hash=sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e \
- --hash=sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6 \
- --hash=sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269 \
- --hash=sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 \
- --hash=sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d \
- --hash=sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a \
- --hash=sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4 \
- --hash=sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 \
- --hash=sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d \
- --hash=sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0 \
- --hash=sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed \
- --hash=sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068 \
- --hash=sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac \
- --hash=sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25 \
- --hash=sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 \
- --hash=sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab \
- --hash=sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26 \
- --hash=sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2 \
- --hash=sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db \
- --hash=sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f \
- --hash=sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5 \
- --hash=sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99 \
- --hash=sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c \
- --hash=sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d \
- --hash=sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811 \
- --hash=sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa \
- --hash=sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a \
- --hash=sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03 \
- --hash=sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b \
- --hash=sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04 \
- --hash=sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c \
- --hash=sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001 \
- --hash=sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458 \
- --hash=sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389 \
- --hash=sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99 \
- --hash=sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985 \
- --hash=sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537 \
- --hash=sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238 \
- --hash=sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f \
- --hash=sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d \
- --hash=sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 \
- --hash=sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a \
- --hash=sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143 \
- --hash=sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8 \
- --hash=sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c \
- --hash=sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5 \
- --hash=sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5 \
- --hash=sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711 \
- --hash=sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4 \
- --hash=sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6 \
- --hash=sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c \
- --hash=sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7 \
- --hash=sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4 \
- --hash=sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b \
- --hash=sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae \
- --hash=sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12 \
- --hash=sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c \
- --hash=sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae \
- --hash=sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8 \
- --hash=sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887 \
- --hash=sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b \
- --hash=sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4 \
- --hash=sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f \
- --hash=sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5 \
- --hash=sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33 \
- --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \
- --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561
+charset-normalizer==3.4.0 \
+ --hash=sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621 \
+ --hash=sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6 \
+ --hash=sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8 \
+ --hash=sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912 \
+ --hash=sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c \
+ --hash=sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b \
+ --hash=sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d \
+ --hash=sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d \
+ --hash=sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95 \
+ --hash=sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e \
+ --hash=sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565 \
+ --hash=sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64 \
+ --hash=sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab \
+ --hash=sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be \
+ --hash=sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e \
+ --hash=sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907 \
+ --hash=sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0 \
+ --hash=sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2 \
+ --hash=sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62 \
+ --hash=sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62 \
+ --hash=sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23 \
+ --hash=sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc \
+ --hash=sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284 \
+ --hash=sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca \
+ --hash=sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455 \
+ --hash=sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858 \
+ --hash=sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b \
+ --hash=sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594 \
+ --hash=sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc \
+ --hash=sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db \
+ --hash=sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b \
+ --hash=sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea \
+ --hash=sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6 \
+ --hash=sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920 \
+ --hash=sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749 \
+ --hash=sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7 \
+ --hash=sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd \
+ --hash=sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99 \
+ --hash=sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242 \
+ --hash=sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee \
+ --hash=sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129 \
+ --hash=sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2 \
+ --hash=sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51 \
+ --hash=sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee \
+ --hash=sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8 \
+ --hash=sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b \
+ --hash=sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613 \
+ --hash=sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742 \
+ --hash=sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe \
+ --hash=sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3 \
+ --hash=sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5 \
+ --hash=sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631 \
+ --hash=sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7 \
+ --hash=sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15 \
+ --hash=sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c \
+ --hash=sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea \
+ --hash=sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417 \
+ --hash=sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250 \
+ --hash=sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88 \
+ --hash=sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca \
+ --hash=sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa \
+ --hash=sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99 \
+ --hash=sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149 \
+ --hash=sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41 \
+ --hash=sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574 \
+ --hash=sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0 \
+ --hash=sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f \
+ --hash=sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d \
+ --hash=sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654 \
+ --hash=sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3 \
+ --hash=sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19 \
+ --hash=sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90 \
+ --hash=sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578 \
+ --hash=sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9 \
+ --hash=sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1 \
+ --hash=sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51 \
+ --hash=sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719 \
+ --hash=sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236 \
+ --hash=sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a \
+ --hash=sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c \
+ --hash=sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade \
+ --hash=sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944 \
+ --hash=sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc \
+ --hash=sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6 \
+ --hash=sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6 \
+ --hash=sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27 \
+ --hash=sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6 \
+ --hash=sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2 \
+ --hash=sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12 \
+ --hash=sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf \
+ --hash=sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114 \
+ --hash=sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7 \
+ --hash=sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf \
+ --hash=sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d \
+ --hash=sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b \
+ --hash=sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed \
+ --hash=sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03 \
+ --hash=sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4 \
+ --hash=sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67 \
+ --hash=sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365 \
+ --hash=sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a \
+ --hash=sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748 \
+ --hash=sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b \
+ --hash=sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079 \
+ --hash=sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482
# via requests
docutils==0.21.2 \
--hash=sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f \
@@ -112,83 +125,103 @@
--hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \
--hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3
# via requests
-importlib-metadata==6.0.0 \
- --hash=sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad \
- --hash=sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d
+importlib-metadata==8.5.0 \
+ --hash=sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b \
+ --hash=sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7
# via
# keyring
# twine
-jaraco-classes==3.2.3 \
- --hash=sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158 \
- --hash=sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a
+jaraco-classes==3.4.0 \
+ --hash=sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd \
+ --hash=sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790
# via keyring
-keyring==23.13.1 \
- --hash=sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd \
- --hash=sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678
+jaraco-context==6.0.1 \
+ --hash=sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3 \
+ --hash=sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4
+ # via keyring
+jaraco-functools==4.1.0 \
+ --hash=sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d \
+ --hash=sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649
+ # via keyring
+keyring==25.4.1 \
+ --hash=sha256:5426f817cf7f6f007ba5ec722b1bcad95a75b27d780343772ad76b17cb47b0bf \
+ --hash=sha256:b07ebc55f3e8ed86ac81dd31ef14e81ace9dd9c3d4b5d77a6e9a2016d0d71a1b
# via twine
-markdown-it-py==2.1.0 \
- --hash=sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27 \
- --hash=sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da
+markdown-it-py==3.0.0 \
+ --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \
+ --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb
# via rich
mdurl==0.1.2 \
--hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \
--hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
# via markdown-it-py
-more-itertools==9.0.0 \
- --hash=sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41 \
- --hash=sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab
- # via jaraco-classes
-pkginfo==1.9.6 \
- --hash=sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546 \
- --hash=sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046
+more-itertools==10.5.0 \
+ --hash=sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef \
+ --hash=sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6
+ # via
+ # jaraco-classes
+ # jaraco-functools
+nh3==0.2.18 \
+ --hash=sha256:0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164 \
+ --hash=sha256:14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86 \
+ --hash=sha256:19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b \
+ --hash=sha256:34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad \
+ --hash=sha256:36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204 \
+ --hash=sha256:3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a \
+ --hash=sha256:42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200 \
+ --hash=sha256:5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189 \
+ --hash=sha256:6955369e4d9f48f41e3f238a9e60f9410645db7e07435e62c6a9ea6135a4907f \
+ --hash=sha256:7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811 \
+ --hash=sha256:8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844 \
+ --hash=sha256:94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4 \
+ --hash=sha256:a7f1b5b2c15866f2db413a3649a8fe4fd7b428ae58be2c0f6bca5eefd53ca2be \
+ --hash=sha256:c8b3a1cebcba9b3669ed1a84cc65bf005728d2f0bc1ed2a6594a992e817f3a50 \
+ --hash=sha256:de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307 \
+ --hash=sha256:f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe
+ # via readme-renderer
+pkginfo==1.10.0 \
+ --hash=sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297 \
+ --hash=sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097
# via twine
-pygments==2.14.0 \
- --hash=sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297 \
- --hash=sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717
+pygments==2.18.0 \
+ --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \
+ --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a
# via
# readme-renderer
# rich
-readme-renderer==37.3 \
- --hash=sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273 \
- --hash=sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343
+readme-renderer==44.0 \
+ --hash=sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151 \
+ --hash=sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1
# via twine
-requests==2.28.2 \
- --hash=sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa \
- --hash=sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf
+requests==2.32.3 \
+ --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \
+ --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6
# via
# requests-toolbelt
# twine
-requests-toolbelt==0.10.1 \
- --hash=sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7 \
- --hash=sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d
+requests-toolbelt==1.0.0 \
+ --hash=sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6 \
+ --hash=sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06
# via twine
rfc3986==2.0.0 \
--hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \
--hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c
# via twine
-rich==13.2.0 \
- --hash=sha256:7c963f0d03819221e9ac561e1bc866e3f95a02248c1234daa48954e6d381c003 \
- --hash=sha256:f1a00cdd3eebf999a15d85ec498bfe0b1a77efe9b34f645768a54132ef444ac5
+rich==13.9.3 \
+ --hash=sha256:9836f5096eb2172c9e77df411c1b009bace4193d6a481d534fea75ebba758283 \
+ --hash=sha256:bc1e01b899537598cf02579d2b9f4a415104d3fc439313a7a2c165d76557a08e
# via twine
-six==1.16.0 \
- --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \
- --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254
- # via bleach
-twine==4.0.2 \
- --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \
- --hash=sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8
+twine==5.1.1 \
+ --hash=sha256:215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997 \
+ --hash=sha256:9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db
# via -r tools/publish/requirements.in
-urllib3==1.26.19 \
- --hash=sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3 \
- --hash=sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429
+urllib3==2.2.3 \
+ --hash=sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac \
+ --hash=sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9
# via
# requests
# twine
-webencodings==0.5.1 \
- --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \
- --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923
- # via bleach
-zipp==3.19.2 \
- --hash=sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19 \
- --hash=sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c
+zipp==3.20.2 \
+ --hash=sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350 \
+ --hash=sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29
# via importlib-metadata
diff --git a/tools/publish/requirements_linux.txt b/tools/publish/requirements_linux.txt
new file mode 100644
index 0000000..785af7f
--- /dev/null
+++ b/tools/publish/requirements_linux.txt
@@ -0,0 +1,339 @@
+# This file was autogenerated by uv via the following command:
+# bazel run //tools/publish:requirements_linux.update
+--index-url https://pypi.org/simple
+
+backports-tarfile==1.2.0 \
+ --hash=sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34 \
+ --hash=sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991
+ # via jaraco-context
+certifi==2024.8.30 \
+ --hash=sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 \
+ --hash=sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9
+ # via requests
+cffi==1.17.1 \
+ --hash=sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8 \
+ --hash=sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2 \
+ --hash=sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1 \
+ --hash=sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15 \
+ --hash=sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36 \
+ --hash=sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824 \
+ --hash=sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8 \
+ --hash=sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36 \
+ --hash=sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17 \
+ --hash=sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf \
+ --hash=sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc \
+ --hash=sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3 \
+ --hash=sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed \
+ --hash=sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702 \
+ --hash=sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1 \
+ --hash=sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8 \
+ --hash=sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903 \
+ --hash=sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6 \
+ --hash=sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d \
+ --hash=sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b \
+ --hash=sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e \
+ --hash=sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be \
+ --hash=sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c \
+ --hash=sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683 \
+ --hash=sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9 \
+ --hash=sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c \
+ --hash=sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8 \
+ --hash=sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1 \
+ --hash=sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4 \
+ --hash=sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655 \
+ --hash=sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67 \
+ --hash=sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595 \
+ --hash=sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0 \
+ --hash=sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65 \
+ --hash=sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41 \
+ --hash=sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6 \
+ --hash=sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401 \
+ --hash=sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6 \
+ --hash=sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3 \
+ --hash=sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16 \
+ --hash=sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93 \
+ --hash=sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e \
+ --hash=sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4 \
+ --hash=sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964 \
+ --hash=sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c \
+ --hash=sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576 \
+ --hash=sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0 \
+ --hash=sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3 \
+ --hash=sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662 \
+ --hash=sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3 \
+ --hash=sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff \
+ --hash=sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5 \
+ --hash=sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd \
+ --hash=sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f \
+ --hash=sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5 \
+ --hash=sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14 \
+ --hash=sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d \
+ --hash=sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9 \
+ --hash=sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7 \
+ --hash=sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382 \
+ --hash=sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a \
+ --hash=sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e \
+ --hash=sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a \
+ --hash=sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4 \
+ --hash=sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99 \
+ --hash=sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87 \
+ --hash=sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b
+ # via cryptography
+charset-normalizer==3.4.0 \
+ --hash=sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621 \
+ --hash=sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6 \
+ --hash=sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8 \
+ --hash=sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912 \
+ --hash=sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c \
+ --hash=sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b \
+ --hash=sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d \
+ --hash=sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d \
+ --hash=sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95 \
+ --hash=sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e \
+ --hash=sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565 \
+ --hash=sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64 \
+ --hash=sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab \
+ --hash=sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be \
+ --hash=sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e \
+ --hash=sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907 \
+ --hash=sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0 \
+ --hash=sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2 \
+ --hash=sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62 \
+ --hash=sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62 \
+ --hash=sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23 \
+ --hash=sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc \
+ --hash=sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284 \
+ --hash=sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca \
+ --hash=sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455 \
+ --hash=sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858 \
+ --hash=sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b \
+ --hash=sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594 \
+ --hash=sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc \
+ --hash=sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db \
+ --hash=sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b \
+ --hash=sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea \
+ --hash=sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6 \
+ --hash=sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920 \
+ --hash=sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749 \
+ --hash=sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7 \
+ --hash=sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd \
+ --hash=sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99 \
+ --hash=sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242 \
+ --hash=sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee \
+ --hash=sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129 \
+ --hash=sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2 \
+ --hash=sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51 \
+ --hash=sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee \
+ --hash=sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8 \
+ --hash=sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b \
+ --hash=sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613 \
+ --hash=sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742 \
+ --hash=sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe \
+ --hash=sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3 \
+ --hash=sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5 \
+ --hash=sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631 \
+ --hash=sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7 \
+ --hash=sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15 \
+ --hash=sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c \
+ --hash=sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea \
+ --hash=sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417 \
+ --hash=sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250 \
+ --hash=sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88 \
+ --hash=sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca \
+ --hash=sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa \
+ --hash=sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99 \
+ --hash=sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149 \
+ --hash=sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41 \
+ --hash=sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574 \
+ --hash=sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0 \
+ --hash=sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f \
+ --hash=sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d \
+ --hash=sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654 \
+ --hash=sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3 \
+ --hash=sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19 \
+ --hash=sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90 \
+ --hash=sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578 \
+ --hash=sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9 \
+ --hash=sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1 \
+ --hash=sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51 \
+ --hash=sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719 \
+ --hash=sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236 \
+ --hash=sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a \
+ --hash=sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c \
+ --hash=sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade \
+ --hash=sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944 \
+ --hash=sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc \
+ --hash=sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6 \
+ --hash=sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6 \
+ --hash=sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27 \
+ --hash=sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6 \
+ --hash=sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2 \
+ --hash=sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12 \
+ --hash=sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf \
+ --hash=sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114 \
+ --hash=sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7 \
+ --hash=sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf \
+ --hash=sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d \
+ --hash=sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b \
+ --hash=sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed \
+ --hash=sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03 \
+ --hash=sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4 \
+ --hash=sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67 \
+ --hash=sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365 \
+ --hash=sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a \
+ --hash=sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748 \
+ --hash=sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b \
+ --hash=sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079 \
+ --hash=sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482
+ # via requests
+cryptography==43.0.3 \
+ --hash=sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362 \
+ --hash=sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4 \
+ --hash=sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa \
+ --hash=sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83 \
+ --hash=sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff \
+ --hash=sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805 \
+ --hash=sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6 \
+ --hash=sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664 \
+ --hash=sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08 \
+ --hash=sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e \
+ --hash=sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18 \
+ --hash=sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f \
+ --hash=sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73 \
+ --hash=sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5 \
+ --hash=sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984 \
+ --hash=sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd \
+ --hash=sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3 \
+ --hash=sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e \
+ --hash=sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405 \
+ --hash=sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2 \
+ --hash=sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c \
+ --hash=sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995 \
+ --hash=sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73 \
+ --hash=sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16 \
+ --hash=sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7 \
+ --hash=sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd \
+ --hash=sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7
+ # via secretstorage
+docutils==0.21.2 \
+ --hash=sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f \
+ --hash=sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2
+ # via readme-renderer
+idna==3.10 \
+ --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \
+ --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3
+ # via requests
+importlib-metadata==8.5.0 \
+ --hash=sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b \
+ --hash=sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7
+ # via
+ # keyring
+ # twine
+jaraco-classes==3.4.0 \
+ --hash=sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd \
+ --hash=sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790
+ # via keyring
+jaraco-context==6.0.1 \
+ --hash=sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3 \
+ --hash=sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4
+ # via keyring
+jaraco-functools==4.1.0 \
+ --hash=sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d \
+ --hash=sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649
+ # via keyring
+jeepney==0.8.0 \
+ --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \
+ --hash=sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755
+ # via
+ # keyring
+ # secretstorage
+keyring==25.4.1 \
+ --hash=sha256:5426f817cf7f6f007ba5ec722b1bcad95a75b27d780343772ad76b17cb47b0bf \
+ --hash=sha256:b07ebc55f3e8ed86ac81dd31ef14e81ace9dd9c3d4b5d77a6e9a2016d0d71a1b
+ # via twine
+markdown-it-py==3.0.0 \
+ --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \
+ --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb
+ # via rich
+mdurl==0.1.2 \
+ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \
+ --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
+ # via markdown-it-py
+more-itertools==10.5.0 \
+ --hash=sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef \
+ --hash=sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6
+ # via
+ # jaraco-classes
+ # jaraco-functools
+nh3==0.2.18 \
+ --hash=sha256:0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164 \
+ --hash=sha256:14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86 \
+ --hash=sha256:19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b \
+ --hash=sha256:34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad \
+ --hash=sha256:36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204 \
+ --hash=sha256:3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a \
+ --hash=sha256:42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200 \
+ --hash=sha256:5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189 \
+ --hash=sha256:6955369e4d9f48f41e3f238a9e60f9410645db7e07435e62c6a9ea6135a4907f \
+ --hash=sha256:7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811 \
+ --hash=sha256:8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844 \
+ --hash=sha256:94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4 \
+ --hash=sha256:a7f1b5b2c15866f2db413a3649a8fe4fd7b428ae58be2c0f6bca5eefd53ca2be \
+ --hash=sha256:c8b3a1cebcba9b3669ed1a84cc65bf005728d2f0bc1ed2a6594a992e817f3a50 \
+ --hash=sha256:de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307 \
+ --hash=sha256:f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe
+ # via readme-renderer
+pkginfo==1.10.0 \
+ --hash=sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297 \
+ --hash=sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097
+ # via twine
+pycparser==2.22 \
+ --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \
+ --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc
+ # via cffi
+pygments==2.18.0 \
+ --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \
+ --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a
+ # via
+ # readme-renderer
+ # rich
+readme-renderer==44.0 \
+ --hash=sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151 \
+ --hash=sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1
+ # via twine
+requests==2.32.3 \
+ --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \
+ --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6
+ # via
+ # requests-toolbelt
+ # twine
+requests-toolbelt==1.0.0 \
+ --hash=sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6 \
+ --hash=sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06
+ # via twine
+rfc3986==2.0.0 \
+ --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \
+ --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c
+ # via twine
+rich==13.9.3 \
+ --hash=sha256:9836f5096eb2172c9e77df411c1b009bace4193d6a481d534fea75ebba758283 \
+ --hash=sha256:bc1e01b899537598cf02579d2b9f4a415104d3fc439313a7a2c165d76557a08e
+ # via twine
+secretstorage==3.3.3 \
+ --hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \
+ --hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99
+ # via keyring
+twine==5.1.1 \
+ --hash=sha256:215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997 \
+ --hash=sha256:9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db
+ # via -r tools/publish/requirements.in
+urllib3==2.2.3 \
+ --hash=sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac \
+ --hash=sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9
+ # via
+ # requests
+ # twine
+zipp==3.20.2 \
+ --hash=sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350 \
+ --hash=sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29
+ # via importlib-metadata
diff --git a/tools/publish/requirements_universal.txt b/tools/publish/requirements_universal.txt
new file mode 100644
index 0000000..06f9328
--- /dev/null
+++ b/tools/publish/requirements_universal.txt
@@ -0,0 +1,343 @@
+# This file was autogenerated by uv via the following command:
+# bazel run //tools/publish:requirements_universal.update
+--index-url https://pypi.org/simple
+
+backports-tarfile==1.2.0 ; python_full_version < '3.12' \
+ --hash=sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34 \
+ --hash=sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991
+ # via jaraco-context
+certifi==2024.8.30 \
+ --hash=sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 \
+ --hash=sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9
+ # via requests
+cffi==1.17.1 ; platform_python_implementation != 'PyPy' and sys_platform == 'linux' \
+ --hash=sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8 \
+ --hash=sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2 \
+ --hash=sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1 \
+ --hash=sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15 \
+ --hash=sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36 \
+ --hash=sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824 \
+ --hash=sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8 \
+ --hash=sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36 \
+ --hash=sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17 \
+ --hash=sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf \
+ --hash=sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc \
+ --hash=sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3 \
+ --hash=sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed \
+ --hash=sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702 \
+ --hash=sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1 \
+ --hash=sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8 \
+ --hash=sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903 \
+ --hash=sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6 \
+ --hash=sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d \
+ --hash=sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b \
+ --hash=sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e \
+ --hash=sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be \
+ --hash=sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c \
+ --hash=sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683 \
+ --hash=sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9 \
+ --hash=sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c \
+ --hash=sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8 \
+ --hash=sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1 \
+ --hash=sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4 \
+ --hash=sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655 \
+ --hash=sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67 \
+ --hash=sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595 \
+ --hash=sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0 \
+ --hash=sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65 \
+ --hash=sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41 \
+ --hash=sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6 \
+ --hash=sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401 \
+ --hash=sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6 \
+ --hash=sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3 \
+ --hash=sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16 \
+ --hash=sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93 \
+ --hash=sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e \
+ --hash=sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4 \
+ --hash=sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964 \
+ --hash=sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c \
+ --hash=sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576 \
+ --hash=sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0 \
+ --hash=sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3 \
+ --hash=sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662 \
+ --hash=sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3 \
+ --hash=sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff \
+ --hash=sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5 \
+ --hash=sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd \
+ --hash=sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f \
+ --hash=sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5 \
+ --hash=sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14 \
+ --hash=sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d \
+ --hash=sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9 \
+ --hash=sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7 \
+ --hash=sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382 \
+ --hash=sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a \
+ --hash=sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e \
+ --hash=sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a \
+ --hash=sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4 \
+ --hash=sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99 \
+ --hash=sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87 \
+ --hash=sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b
+ # via cryptography
+charset-normalizer==3.4.0 \
+ --hash=sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621 \
+ --hash=sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6 \
+ --hash=sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8 \
+ --hash=sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912 \
+ --hash=sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c \
+ --hash=sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b \
+ --hash=sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d \
+ --hash=sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d \
+ --hash=sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95 \
+ --hash=sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e \
+ --hash=sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565 \
+ --hash=sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64 \
+ --hash=sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab \
+ --hash=sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be \
+ --hash=sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e \
+ --hash=sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907 \
+ --hash=sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0 \
+ --hash=sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2 \
+ --hash=sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62 \
+ --hash=sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62 \
+ --hash=sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23 \
+ --hash=sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc \
+ --hash=sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284 \
+ --hash=sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca \
+ --hash=sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455 \
+ --hash=sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858 \
+ --hash=sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b \
+ --hash=sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594 \
+ --hash=sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc \
+ --hash=sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db \
+ --hash=sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b \
+ --hash=sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea \
+ --hash=sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6 \
+ --hash=sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920 \
+ --hash=sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749 \
+ --hash=sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7 \
+ --hash=sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd \
+ --hash=sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99 \
+ --hash=sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242 \
+ --hash=sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee \
+ --hash=sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129 \
+ --hash=sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2 \
+ --hash=sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51 \
+ --hash=sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee \
+ --hash=sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8 \
+ --hash=sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b \
+ --hash=sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613 \
+ --hash=sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742 \
+ --hash=sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe \
+ --hash=sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3 \
+ --hash=sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5 \
+ --hash=sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631 \
+ --hash=sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7 \
+ --hash=sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15 \
+ --hash=sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c \
+ --hash=sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea \
+ --hash=sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417 \
+ --hash=sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250 \
+ --hash=sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88 \
+ --hash=sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca \
+ --hash=sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa \
+ --hash=sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99 \
+ --hash=sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149 \
+ --hash=sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41 \
+ --hash=sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574 \
+ --hash=sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0 \
+ --hash=sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f \
+ --hash=sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d \
+ --hash=sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654 \
+ --hash=sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3 \
+ --hash=sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19 \
+ --hash=sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90 \
+ --hash=sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578 \
+ --hash=sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9 \
+ --hash=sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1 \
+ --hash=sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51 \
+ --hash=sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719 \
+ --hash=sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236 \
+ --hash=sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a \
+ --hash=sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c \
+ --hash=sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade \
+ --hash=sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944 \
+ --hash=sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc \
+ --hash=sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6 \
+ --hash=sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6 \
+ --hash=sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27 \
+ --hash=sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6 \
+ --hash=sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2 \
+ --hash=sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12 \
+ --hash=sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf \
+ --hash=sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114 \
+ --hash=sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7 \
+ --hash=sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf \
+ --hash=sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d \
+ --hash=sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b \
+ --hash=sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed \
+ --hash=sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03 \
+ --hash=sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4 \
+ --hash=sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67 \
+ --hash=sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365 \
+ --hash=sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a \
+ --hash=sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748 \
+ --hash=sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b \
+ --hash=sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079 \
+ --hash=sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482
+ # via requests
+cryptography==43.0.3 ; sys_platform == 'linux' \
+ --hash=sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362 \
+ --hash=sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4 \
+ --hash=sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa \
+ --hash=sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83 \
+ --hash=sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff \
+ --hash=sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805 \
+ --hash=sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6 \
+ --hash=sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664 \
+ --hash=sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08 \
+ --hash=sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e \
+ --hash=sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18 \
+ --hash=sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f \
+ --hash=sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73 \
+ --hash=sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5 \
+ --hash=sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984 \
+ --hash=sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd \
+ --hash=sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3 \
+ --hash=sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e \
+ --hash=sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405 \
+ --hash=sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2 \
+ --hash=sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c \
+ --hash=sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995 \
+ --hash=sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73 \
+ --hash=sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16 \
+ --hash=sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7 \
+ --hash=sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd \
+ --hash=sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7
+ # via secretstorage
+docutils==0.21.2 \
+ --hash=sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f \
+ --hash=sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2
+ # via readme-renderer
+idna==3.10 \
+ --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \
+ --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3
+ # via requests
+importlib-metadata==8.5.0 \
+ --hash=sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b \
+ --hash=sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7
+ # via
+ # keyring
+ # twine
+jaraco-classes==3.4.0 \
+ --hash=sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd \
+ --hash=sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790
+ # via keyring
+jaraco-context==6.0.1 \
+ --hash=sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3 \
+ --hash=sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4
+ # via keyring
+jaraco-functools==4.1.0 \
+ --hash=sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d \
+ --hash=sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649
+ # via keyring
+jeepney==0.8.0 ; sys_platform == 'linux' \
+ --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \
+ --hash=sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755
+ # via
+ # keyring
+ # secretstorage
+keyring==25.4.1 \
+ --hash=sha256:5426f817cf7f6f007ba5ec722b1bcad95a75b27d780343772ad76b17cb47b0bf \
+ --hash=sha256:b07ebc55f3e8ed86ac81dd31ef14e81ace9dd9c3d4b5d77a6e9a2016d0d71a1b
+ # via twine
+markdown-it-py==3.0.0 \
+ --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \
+ --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb
+ # via rich
+mdurl==0.1.2 \
+ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \
+ --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
+ # via markdown-it-py
+more-itertools==10.5.0 \
+ --hash=sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef \
+ --hash=sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6
+ # via
+ # jaraco-classes
+ # jaraco-functools
+nh3==0.2.18 \
+ --hash=sha256:0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164 \
+ --hash=sha256:14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86 \
+ --hash=sha256:19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b \
+ --hash=sha256:34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad \
+ --hash=sha256:36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204 \
+ --hash=sha256:3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a \
+ --hash=sha256:42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200 \
+ --hash=sha256:5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189 \
+ --hash=sha256:6955369e4d9f48f41e3f238a9e60f9410645db7e07435e62c6a9ea6135a4907f \
+ --hash=sha256:7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811 \
+ --hash=sha256:8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844 \
+ --hash=sha256:94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4 \
+ --hash=sha256:a7f1b5b2c15866f2db413a3649a8fe4fd7b428ae58be2c0f6bca5eefd53ca2be \
+ --hash=sha256:c8b3a1cebcba9b3669ed1a84cc65bf005728d2f0bc1ed2a6594a992e817f3a50 \
+ --hash=sha256:de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307 \
+ --hash=sha256:f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe
+ # via readme-renderer
+pkginfo==1.10.0 \
+ --hash=sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297 \
+ --hash=sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097
+ # via twine
+pycparser==2.22 ; platform_python_implementation != 'PyPy' and sys_platform == 'linux' \
+ --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \
+ --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc
+ # via cffi
+pygments==2.18.0 \
+ --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \
+ --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a
+ # via
+ # readme-renderer
+ # rich
+pywin32-ctypes==0.2.3 ; sys_platform == 'win32' \
+ --hash=sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8 \
+ --hash=sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755
+ # via keyring
+readme-renderer==44.0 \
+ --hash=sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151 \
+ --hash=sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1
+ # via twine
+requests==2.32.3 \
+ --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \
+ --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6
+ # via
+ # requests-toolbelt
+ # twine
+requests-toolbelt==1.0.0 \
+ --hash=sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6 \
+ --hash=sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06
+ # via twine
+rfc3986==2.0.0 \
+ --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \
+ --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c
+ # via twine
+rich==13.9.3 \
+ --hash=sha256:9836f5096eb2172c9e77df411c1b009bace4193d6a481d534fea75ebba758283 \
+ --hash=sha256:bc1e01b899537598cf02579d2b9f4a415104d3fc439313a7a2c165d76557a08e
+ # via twine
+secretstorage==3.3.3 ; sys_platform == 'linux' \
+ --hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \
+ --hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99
+ # via keyring
+twine==5.1.1 \
+ --hash=sha256:215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997 \
+ --hash=sha256:9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db
+ # via -r tools/publish/requirements.in
+urllib3==2.2.3 \
+ --hash=sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac \
+ --hash=sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9
+ # via
+ # requests
+ # twine
+zipp==3.20.2 \
+ --hash=sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350 \
+ --hash=sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29
+ # via importlib-metadata
diff --git a/tools/publish/requirements_windows.txt b/tools/publish/requirements_windows.txt
index e9e523a..23d2986 100644
--- a/tools/publish/requirements_windows.txt
+++ b/tools/publish/requirements_windows.txt
@@ -1,108 +1,121 @@
-#
-# This file is autogenerated by pip-compile with Python 3.11
-# by the following command:
-#
-# bazel run //tools/publish:requirements.update
-#
-bleach==6.0.0 \
- --hash=sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414 \
- --hash=sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4
- # via readme-renderer
+# This file was autogenerated by uv via the following command:
+# bazel run //tools/publish:requirements_windows.update
+--index-url https://pypi.org/simple
+
+backports-tarfile==1.2.0 \
+ --hash=sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34 \
+ --hash=sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991
+ # via jaraco-context
certifi==2024.8.30 \
--hash=sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 \
--hash=sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9
# via requests
-charset-normalizer==3.3.2 \
- --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \
- --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \
- --hash=sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786 \
- --hash=sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8 \
- --hash=sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09 \
- --hash=sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185 \
- --hash=sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574 \
- --hash=sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e \
- --hash=sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519 \
- --hash=sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898 \
- --hash=sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269 \
- --hash=sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3 \
- --hash=sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f \
- --hash=sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6 \
- --hash=sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8 \
- --hash=sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a \
- --hash=sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73 \
- --hash=sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc \
- --hash=sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714 \
- --hash=sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2 \
- --hash=sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc \
- --hash=sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce \
- --hash=sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d \
- --hash=sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e \
- --hash=sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6 \
- --hash=sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269 \
- --hash=sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96 \
- --hash=sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d \
- --hash=sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a \
- --hash=sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4 \
- --hash=sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77 \
- --hash=sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d \
- --hash=sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0 \
- --hash=sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed \
- --hash=sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068 \
- --hash=sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac \
- --hash=sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25 \
- --hash=sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8 \
- --hash=sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab \
- --hash=sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26 \
- --hash=sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2 \
- --hash=sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db \
- --hash=sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f \
- --hash=sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5 \
- --hash=sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99 \
- --hash=sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c \
- --hash=sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d \
- --hash=sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811 \
- --hash=sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa \
- --hash=sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a \
- --hash=sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03 \
- --hash=sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b \
- --hash=sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04 \
- --hash=sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c \
- --hash=sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001 \
- --hash=sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458 \
- --hash=sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389 \
- --hash=sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99 \
- --hash=sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985 \
- --hash=sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537 \
- --hash=sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238 \
- --hash=sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f \
- --hash=sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d \
- --hash=sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796 \
- --hash=sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a \
- --hash=sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143 \
- --hash=sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8 \
- --hash=sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c \
- --hash=sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5 \
- --hash=sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5 \
- --hash=sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711 \
- --hash=sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4 \
- --hash=sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6 \
- --hash=sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c \
- --hash=sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7 \
- --hash=sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4 \
- --hash=sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b \
- --hash=sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae \
- --hash=sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12 \
- --hash=sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c \
- --hash=sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae \
- --hash=sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8 \
- --hash=sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887 \
- --hash=sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b \
- --hash=sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4 \
- --hash=sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f \
- --hash=sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5 \
- --hash=sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33 \
- --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \
- --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561
+charset-normalizer==3.4.0 \
+ --hash=sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621 \
+ --hash=sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6 \
+ --hash=sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8 \
+ --hash=sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912 \
+ --hash=sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c \
+ --hash=sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b \
+ --hash=sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d \
+ --hash=sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d \
+ --hash=sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95 \
+ --hash=sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e \
+ --hash=sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565 \
+ --hash=sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64 \
+ --hash=sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab \
+ --hash=sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be \
+ --hash=sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e \
+ --hash=sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907 \
+ --hash=sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0 \
+ --hash=sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2 \
+ --hash=sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62 \
+ --hash=sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62 \
+ --hash=sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23 \
+ --hash=sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc \
+ --hash=sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284 \
+ --hash=sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca \
+ --hash=sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455 \
+ --hash=sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858 \
+ --hash=sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b \
+ --hash=sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594 \
+ --hash=sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc \
+ --hash=sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db \
+ --hash=sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b \
+ --hash=sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea \
+ --hash=sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6 \
+ --hash=sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920 \
+ --hash=sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749 \
+ --hash=sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7 \
+ --hash=sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd \
+ --hash=sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99 \
+ --hash=sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242 \
+ --hash=sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee \
+ --hash=sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129 \
+ --hash=sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2 \
+ --hash=sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51 \
+ --hash=sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee \
+ --hash=sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8 \
+ --hash=sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b \
+ --hash=sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613 \
+ --hash=sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742 \
+ --hash=sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe \
+ --hash=sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3 \
+ --hash=sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5 \
+ --hash=sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631 \
+ --hash=sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7 \
+ --hash=sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15 \
+ --hash=sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c \
+ --hash=sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea \
+ --hash=sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417 \
+ --hash=sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250 \
+ --hash=sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88 \
+ --hash=sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca \
+ --hash=sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa \
+ --hash=sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99 \
+ --hash=sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149 \
+ --hash=sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41 \
+ --hash=sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574 \
+ --hash=sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0 \
+ --hash=sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f \
+ --hash=sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d \
+ --hash=sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654 \
+ --hash=sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3 \
+ --hash=sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19 \
+ --hash=sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90 \
+ --hash=sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578 \
+ --hash=sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9 \
+ --hash=sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1 \
+ --hash=sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51 \
+ --hash=sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719 \
+ --hash=sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236 \
+ --hash=sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a \
+ --hash=sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c \
+ --hash=sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade \
+ --hash=sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944 \
+ --hash=sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc \
+ --hash=sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6 \
+ --hash=sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6 \
+ --hash=sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27 \
+ --hash=sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6 \
+ --hash=sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2 \
+ --hash=sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12 \
+ --hash=sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf \
+ --hash=sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114 \
+ --hash=sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7 \
+ --hash=sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf \
+ --hash=sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d \
+ --hash=sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b \
+ --hash=sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed \
+ --hash=sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03 \
+ --hash=sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4 \
+ --hash=sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67 \
+ --hash=sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365 \
+ --hash=sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a \
+ --hash=sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748 \
+ --hash=sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b \
+ --hash=sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079 \
+ --hash=sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482
# via requests
docutils==0.21.2 \
--hash=sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f \
@@ -112,87 +125,107 @@
--hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \
--hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3
# via requests
-importlib-metadata==6.0.0 \
- --hash=sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad \
- --hash=sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d
+importlib-metadata==8.5.0 \
+ --hash=sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b \
+ --hash=sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7
# via
# keyring
# twine
-jaraco-classes==3.2.3 \
- --hash=sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158 \
- --hash=sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a
+jaraco-classes==3.4.0 \
+ --hash=sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd \
+ --hash=sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790
# via keyring
-keyring==23.13.1 \
- --hash=sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd \
- --hash=sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678
+jaraco-context==6.0.1 \
+ --hash=sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3 \
+ --hash=sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4
+ # via keyring
+jaraco-functools==4.1.0 \
+ --hash=sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d \
+ --hash=sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649
+ # via keyring
+keyring==25.4.1 \
+ --hash=sha256:5426f817cf7f6f007ba5ec722b1bcad95a75b27d780343772ad76b17cb47b0bf \
+ --hash=sha256:b07ebc55f3e8ed86ac81dd31ef14e81ace9dd9c3d4b5d77a6e9a2016d0d71a1b
# via twine
-markdown-it-py==2.1.0 \
- --hash=sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27 \
- --hash=sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da
+markdown-it-py==3.0.0 \
+ --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 \
+ --hash=sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb
# via rich
mdurl==0.1.2 \
--hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \
--hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba
# via markdown-it-py
-more-itertools==9.0.0 \
- --hash=sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41 \
- --hash=sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab
- # via jaraco-classes
-pkginfo==1.9.6 \
- --hash=sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546 \
- --hash=sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046
+more-itertools==10.5.0 \
+ --hash=sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef \
+ --hash=sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6
+ # via
+ # jaraco-classes
+ # jaraco-functools
+nh3==0.2.18 \
+ --hash=sha256:0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164 \
+ --hash=sha256:14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86 \
+ --hash=sha256:19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b \
+ --hash=sha256:34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad \
+ --hash=sha256:36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204 \
+ --hash=sha256:3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a \
+ --hash=sha256:42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200 \
+ --hash=sha256:5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189 \
+ --hash=sha256:6955369e4d9f48f41e3f238a9e60f9410645db7e07435e62c6a9ea6135a4907f \
+ --hash=sha256:7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811 \
+ --hash=sha256:8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844 \
+ --hash=sha256:94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4 \
+ --hash=sha256:a7f1b5b2c15866f2db413a3649a8fe4fd7b428ae58be2c0f6bca5eefd53ca2be \
+ --hash=sha256:c8b3a1cebcba9b3669ed1a84cc65bf005728d2f0bc1ed2a6594a992e817f3a50 \
+ --hash=sha256:de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307 \
+ --hash=sha256:f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe
+ # via readme-renderer
+pkginfo==1.10.0 \
+ --hash=sha256:5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297 \
+ --hash=sha256:889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097
# via twine
-pygments==2.14.0 \
- --hash=sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297 \
- --hash=sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717
+pygments==2.18.0 \
+ --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \
+ --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a
# via
# readme-renderer
# rich
-pywin32-ctypes==0.2.0 \
- --hash=sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942 \
- --hash=sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98
+pywin32-ctypes==0.2.3 \
+ --hash=sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8 \
+ --hash=sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755
# via keyring
-readme-renderer==37.3 \
- --hash=sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273 \
- --hash=sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343
+readme-renderer==44.0 \
+ --hash=sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151 \
+ --hash=sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1
# via twine
-requests==2.28.2 \
- --hash=sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa \
- --hash=sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf
+requests==2.32.3 \
+ --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \
+ --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6
# via
# requests-toolbelt
# twine
-requests-toolbelt==0.10.1 \
- --hash=sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7 \
- --hash=sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d
+requests-toolbelt==1.0.0 \
+ --hash=sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6 \
+ --hash=sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06
# via twine
rfc3986==2.0.0 \
--hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \
--hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c
# via twine
-rich==13.2.0 \
- --hash=sha256:7c963f0d03819221e9ac561e1bc866e3f95a02248c1234daa48954e6d381c003 \
- --hash=sha256:f1a00cdd3eebf999a15d85ec498bfe0b1a77efe9b34f645768a54132ef444ac5
+rich==13.9.3 \
+ --hash=sha256:9836f5096eb2172c9e77df411c1b009bace4193d6a481d534fea75ebba758283 \
+ --hash=sha256:bc1e01b899537598cf02579d2b9f4a415104d3fc439313a7a2c165d76557a08e
# via twine
-six==1.16.0 \
- --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \
- --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254
- # via bleach
-twine==4.0.2 \
- --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \
- --hash=sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8
+twine==5.1.1 \
+ --hash=sha256:215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997 \
+ --hash=sha256:9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db
# via -r tools/publish/requirements.in
-urllib3==1.26.19 \
- --hash=sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3 \
- --hash=sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429
+urllib3==2.2.3 \
+ --hash=sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac \
+ --hash=sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9
# via
# requests
# twine
-webencodings==0.5.1 \
- --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \
- --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923
- # via bleach
-zipp==3.19.2 \
- --hash=sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19 \
- --hash=sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c
+zipp==3.20.2 \
+ --hash=sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350 \
+ --hash=sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29
# via importlib-metadata
diff --git a/version.bzl b/version.bzl
index 5194f30..61fb81e 100644
--- a/version.bzl
+++ b/version.bzl
@@ -17,7 +17,7 @@
# against.
# This version should be updated together with the version of Bazel
# in .bazelversion.
-BAZEL_VERSION = "7.1.0"
+BAZEL_VERSION = "7.x"
# NOTE: Keep in sync with .bazelci/presubmit.yml
# This is the minimum supported bazel version, that we have some tests for.