From 5667a8652cca9a3a090a8c12c9824b24d25543f8 Mon Sep 17 00:00:00 2001 From: Douglas Thor Date: Fri, 5 Apr 2024 15:44:12 -0700 Subject: [PATCH 001/345] feat(gazelle): Add "python_test_file_pattern" directive (#1819) Add the `python_test_file_pattern` directive. This directive allows users to configure what python files get mapped to the `py_test` rule. The default behavior is unchanged: both `test_*` and `*_test.py` files generate `py_test` targets if the directive is unset. The directive supports multiple glob patterns, separated by a comma. Note: The original code used, effectively, `test_*` for one of the patterns. This code uses `test_*.py` instead. These are equivalent because of the `.py` extension check prior to pattern matching. Fixes #1816. --- CHANGELOG.md | 6 ++ gazelle/MODULE.bazel | 2 +- gazelle/README.md | 68 ++++++++++++++++++- gazelle/deps.bzl | 8 +-- gazelle/go.mod | 2 +- gazelle/go.sum | 4 +- gazelle/python/BUILD.bazel | 2 +- gazelle/python/configure.go | 14 ++++ gazelle/python/generate.go | 19 +++++- .../README.md | 19 ++++++ .../WORKSPACE | 0 .../test.yaml | 0 .../test1_unset/BUILD.in | 1 + .../test1_unset/BUILD.out | 18 +++++ .../test1_unset/hello_test.py | 0 .../test1_unset/test_goodbye.py | 0 .../test1_unset/test_hello.py | 0 .../test2_star_test_py/BUILD.in | 1 + .../test2_star_test_py/BUILD.out | 17 +++++ .../test2_star_test_py/hello_test.py | 0 .../test2_star_test_py/test_goodbye.py | 0 .../test2_star_test_py/test_hello.py | 0 .../test3_test_star_py/BUILD.in | 2 + .../test3_test_star_py/BUILD.out | 20 ++++++ .../test3_test_star_py/hello_test.py | 0 .../test3_test_star_py/test_goodbye.py | 0 .../test3_test_star_py/test_hello.py | 0 .../test4_glob/BUILD.in | 2 + .../test4_glob/BUILD.out | 20 ++++++ .../test4_glob/foo_helloworld_A_testA.py | 0 .../test4_glob/foo_my_filename_B_test1.py | 0 .../test4_glob/foo_nota_test0_Z1.py | 0 .../test5_multiple_patterns/BUILD.in | 3 + .../test5_multiple_patterns/BUILD.out | 34 ++++++++++ .../test5_multiple_patterns/foo_hello.py | 0 .../test5_multiple_patterns/foo_unittest.py | 0 .../test5_multiple_patterns/foo_unittest.pyc | 0 .../test5_multiple_patterns/hello_foo.py | 0 .../test5_multiple_patterns/mylib.py | 0 .../test5_multiple_patterns/mylib2.py | 0 .../test5_multiple_patterns/test_bar | 0 .../test5_multiple_patterns/unittest_foo.py | 0 .../test6_nesting/BUILD.in | 2 + .../test6_nesting/BUILD.out | 15 ++++ .../test6_nesting/hello_unittest.py | 0 .../test6_nesting/not_a_test.py | 0 .../test6_nesting/subpkg/BUILD.in | 2 + .../test6_nesting/subpkg/BUILD.out | 21 ++++++ .../test6_nesting/subpkg/not_a_test.py | 0 .../test6_nesting/subpkg/not_a_unittest.py | 0 .../test6_nesting/subpkg/test_bar.py | 0 .../BUILD.in | 1 + .../BUILD.out | 1 + .../README.md | 4 ++ .../WORKSPACE | 0 .../test.yaml | 19 ++++++ .../BUILD.in | 1 + .../BUILD.out | 1 + .../README.md | 8 +++ .../WORKSPACE | 0 .../foo_test.py | 0 .../test.yaml | 19 ++++++ gazelle/pythonconfig/pythonconfig.go | 20 +++++- 63 files changed, 362 insertions(+), 14 deletions(-) create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/README.md create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/WORKSPACE create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test.yaml create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test1_unset/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test1_unset/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test1_unset/hello_test.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test1_unset/test_goodbye.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test1_unset/test_hello.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test2_star_test_py/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test2_star_test_py/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test2_star_test_py/hello_test.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test2_star_test_py/test_goodbye.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test2_star_test_py/test_hello.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test3_test_star_py/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test3_test_star_py/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test3_test_star_py/hello_test.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test3_test_star_py/test_goodbye.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test3_test_star_py/test_hello.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test4_glob/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test4_glob/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test4_glob/foo_helloworld_A_testA.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test4_glob/foo_my_filename_B_test1.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test4_glob/foo_nota_test0_Z1.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/foo_hello.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/foo_unittest.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/foo_unittest.pyc create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/hello_foo.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/mylib.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/mylib2.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/test_bar create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/unittest_foo.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/hello_unittest.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/not_a_test.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/subpkg/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/subpkg/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/subpkg/not_a_test.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/subpkg/not_a_unittest.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/subpkg/test_bar.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/README.md create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/WORKSPACE create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/test.yaml create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern_no_value/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern_no_value/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern_no_value/README.md create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern_no_value/WORKSPACE create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern_no_value/foo_test.py create mode 100644 gazelle/python/testdata/directive_python_test_file_pattern_no_value/test.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f8e273cd2..5f0c2e0e2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,10 @@ A brief description of the categories of changes: * (gazelle) Added a new `python_default_visibility` directive to control the _default_ visibility of generated targets. See the [docs][python_default_visibility] for details. +* (gazelle) Added a new `python_test_file_pattern` directive. This directive tells + gazelle which python files should be mapped to the `py_test` rule. See the + [original issue][test_file_pattern_issue] and the [docs][test_file_pattern_docs] + for details. * (wheel) Add support for `data_files` attributes in py_wheel rule ([#1777](https://github.com/bazelbuild/rules_python/issues/1777)) * (py_wheel) `bzlmod` installations now provide a `twine` setup for the default @@ -66,6 +70,8 @@ A brief description of the categories of changes: [0.XX.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.XX.0 [python_default_visibility]: gazelle/README.md#directive-python_default_visibility +[test_file_pattern_issue]: https://github.com/bazelbuild/rules_python/issues/1816 +[test_file_pattern_docs]: gazelle/README.md#directive-python_test_file_pattern ### Changed diff --git a/gazelle/MODULE.bazel b/gazelle/MODULE.bazel index 940a263953..1d01f49e1a 100644 --- a/gazelle/MODULE.bazel +++ b/gazelle/MODULE.bazel @@ -14,7 +14,7 @@ go_deps.from_file(go_mod = "//:go.mod") use_repo( go_deps, "com_github_bazelbuild_buildtools", - "com_github_bmatcuk_doublestar", + "com_github_bmatcuk_doublestar_v4", "com_github_emirpasic_gods", "com_github_ghodss_yaml", "in_gopkg_yaml_v2", diff --git a/gazelle/README.md b/gazelle/README.md index 1caa677d34..e4fd3d8fef 100644 --- a/gazelle/README.md +++ b/gazelle/README.md @@ -202,6 +202,8 @@ Python-specific directives are as follows: | Instructs gazelle to use these visibility labels on all python targets. `labels` is a comma-separated list of labels (without spaces). | `//$python_root:__subpackages__` | | [`# gazelle:python_visibility label`](#directive-python_visibility) | | | Appends additional visibility labels to each generated target. This directive can be set multiple times. | | +| [`# gazelle:python_test_file_pattern`](#directive-python_test_file_pattern) | `*_test.py,test_*.py` | +| Filenames matching these comma-separated `glob`s will be mapped to `py_test` targets. | #### Directive: `python_root`: @@ -359,6 +361,70 @@ py_library( ``` +#### Directive: `python_test_file_pattern`: + +This directive adjusts which python files will be mapped to the `py_test` rule. + ++ The default is `*_test.py,test_*.py`: both `test_*.py` and `*_test.py` files + will generate `py_test` targets. ++ This directive must have a value. If no value is given, an error will be raised. ++ It is recommended, though not necessary, to include the `.py` extension in + the `glob`s: `foo*.py,?at.py`. ++ Like most directives, it applies to the current Bazel package and all subpackages + until the directive is set again. ++ This directive accepts multiple `glob` patterns, separated by commas without spaces: + +```starlark +# gazelle:python_test_file_pattern foo*.py,?at + +py_library( + name = "mylib", + srcs = ["mylib.py"], +) + +py_test( + name = "foo_bar", + srcs = ["foo_bar.py"], +) + +py_test( + name = "cat", + srcs = ["cat.py"], +) + +py_test( + name = "hat", + srcs = ["hat.py"], +) +``` + + +##### Notes + +Resetting to the default value (such as in a subpackage) is manual. Set: + +```starlark +# gazelle:python_test_file_pattern *_test.py,test_*.py +``` + +There currently is no way to tell gazelle that _no_ files in a package should +be mapped to `py_test` targets (see [Issue #1826][issue-1826]). The workaround +is to set this directive to a pattern that will never match a `.py` file, such +as `foo.bar`: + +```starlark +# No files in this package should be mapped to py_test targets. +# gazelle:python_test_file_pattern foo.bar + +py_library( + name = "my_test", + srcs = ["my_test.py"], +) +``` + +[issue-1826]: https://github.com/bazelbuild/rules_python/issues/1826 + + ### Libraries Python source files are those ending in `.py` but not ending in `_test.py`. @@ -438,7 +504,7 @@ for more information on extending Gazelle. If you add new Go dependencies to the plugin source code, you need to "tidy" the go.mod file. After changing that file, run `go mod tidy` or `bazel run @go_sdk//:bin/go -- mod tidy` -to update the go.mod and go.sum files. Then run `bazel run //:update_go_deps` to have gazelle +to update the go.mod and go.sum files. Then run `bazel run //:gazelle_update_repos` to have gazelle add the new dependenies to the deps.bzl file. The deps.bzl file is used as defined in our /WORKSPACE to include the external repos Bazel loads Go dependencies from. diff --git a/gazelle/deps.bzl b/gazelle/deps.bzl index 26f8c66aec..d9d38810be 100644 --- a/gazelle/deps.bzl +++ b/gazelle/deps.bzl @@ -38,10 +38,10 @@ def gazelle_deps(): ) go_repository( - name = "com_github_bmatcuk_doublestar", - importpath = "github.com/bmatcuk/doublestar", - sum = "h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0=", - version = "v1.3.4", + name = "com_github_bmatcuk_doublestar_v4", + importpath = "github.com/bmatcuk/doublestar/v4", + sum = "h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I=", + version = "v4.6.1", ) go_repository( diff --git a/gazelle/go.mod b/gazelle/go.mod index 6789aa152b..b9b79ac7a2 100644 --- a/gazelle/go.mod +++ b/gazelle/go.mod @@ -6,7 +6,7 @@ require ( github.com/bazelbuild/bazel-gazelle v0.31.1 github.com/bazelbuild/buildtools v0.0.0-20230510134650-37bd1811516d github.com/bazelbuild/rules_go v0.41.0 - github.com/bmatcuk/doublestar v1.3.4 + github.com/bmatcuk/doublestar/v4 v4.6.1 github.com/emirpasic/gods v1.18.1 github.com/ghodss/yaml v1.0.0 gopkg.in/yaml.v2 v2.4.0 diff --git a/gazelle/go.sum b/gazelle/go.sum index 5617f9b822..fcfcb283ec 100644 --- a/gazelle/go.sum +++ b/gazelle/go.sum @@ -6,8 +6,8 @@ github.com/bazelbuild/buildtools v0.0.0-20230510134650-37bd1811516d h1:Fl1FfItZp github.com/bazelbuild/buildtools v0.0.0-20230510134650-37bd1811516d/go.mod h1:689QdV3hBP7Vo9dJMmzhoYIyo/9iMhEmHkJcnaPRCbo= github.com/bazelbuild/rules_go v0.41.0 h1:JzlRxsFNhlX+g4drDRPhIaU5H5LnI978wdMJ0vK4I+k= github.com/bazelbuild/rules_go v0.41.0/go.mod h1:TMHmtfpvyfsxaqfL9WnahCsXMWDMICTw7XeK9yVb+YU= -github.com/bmatcuk/doublestar v1.3.4 h1:gPypJ5xD31uhX6Tf54sDPUOBXTqKH4c9aPY66CyQrS0= -github.com/bmatcuk/doublestar v1.3.4/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE= +github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= +github.com/bmatcuk/doublestar/v4 v4.6.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= diff --git a/gazelle/python/BUILD.bazel b/gazelle/python/BUILD.bazel index fd051ebda6..4cca8b31dc 100644 --- a/gazelle/python/BUILD.bazel +++ b/gazelle/python/BUILD.bazel @@ -38,7 +38,7 @@ go_library( "@bazel_gazelle//resolve:go_default_library", "@bazel_gazelle//rule:go_default_library", "@com_github_bazelbuild_buildtools//build:go_default_library", - "@com_github_bmatcuk_doublestar//:doublestar", + "@com_github_bmatcuk_doublestar_v4//:doublestar", "@com_github_emirpasic_gods//lists/singlylinkedlist", "@com_github_emirpasic_gods//sets/treeset", "@com_github_emirpasic_gods//utils", diff --git a/gazelle/python/configure.go b/gazelle/python/configure.go index 843609605c..2a0e142400 100644 --- a/gazelle/python/configure.go +++ b/gazelle/python/configure.go @@ -25,6 +25,7 @@ import ( "github.com/bazelbuild/bazel-gazelle/config" "github.com/bazelbuild/bazel-gazelle/rule" + "github.com/bmatcuk/doublestar/v4" "github.com/bazelbuild/rules_python/gazelle/manifest" "github.com/bazelbuild/rules_python/gazelle/pythonconfig" @@ -65,6 +66,7 @@ func (py *Configurer) KnownDirectives() []string { pythonconfig.TestNamingConvention, pythonconfig.DefaultVisibilty, pythonconfig.Visibility, + pythonconfig.TestFilePattern, } } @@ -181,6 +183,18 @@ func (py *Configurer) Configure(c *config.Config, rel string, f *rule.File) { } case pythonconfig.Visibility: config.AppendVisibility(strings.TrimSpace(d.Value)) + case pythonconfig.TestFilePattern: + value := strings.TrimSpace(d.Value) + if value == "" { + log.Fatal("directive 'python_test_file_pattern' requires a value") + } + globStrings := strings.Split(value, ",") + for _, g := range globStrings { + if !doublestar.ValidatePattern(g) { + log.Fatalf("invalid glob pattern '%s'", g) + } + } + config.SetTestFilePattern(globStrings) } } diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index 673076d350..1937831c44 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -28,7 +28,7 @@ import ( "github.com/bazelbuild/bazel-gazelle/language" "github.com/bazelbuild/bazel-gazelle/rule" "github.com/bazelbuild/rules_python/gazelle/pythonconfig" - "github.com/bmatcuk/doublestar" + "github.com/bmatcuk/doublestar/v4" "github.com/emirpasic/gods/lists/singlylinkedlist" "github.com/emirpasic/gods/sets/treeset" godsutils "github.com/emirpasic/gods/utils" @@ -54,6 +54,17 @@ func GetActualKindName(kind string, args language.GenerateArgs) string { return kind } +func matchesAnyGlob(s string, globs []string) bool { + // This function assumes that the globs have already been validated. If a glob is + // invalid, it's considered a non-match and we move on to the next pattern. + for _, g := range globs { + if ok, _ := doublestar.Match(g, s); ok { + return true + } + } + return false +} + // GenerateRules extracts build metadata from source files in a directory. // GenerateRules is called in each directory where an update is requested // in depth-first post-order. @@ -100,6 +111,8 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes hasPyTestEntryPointTarget := false hasConftestFile := false + testFileGlobs := cfg.TestFilePattern() + for _, f := range args.RegularFiles { if cfg.IgnoresFile(filepath.Base(f)) { continue @@ -113,7 +126,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes hasPyTestEntryPointFile = true } else if f == conftestFilename { hasConftestFile = true - } else if strings.HasSuffix(f, "_test.py") || strings.HasPrefix(f, "test_") { + } else if matchesAnyGlob(f, testFileGlobs) { pyTestFilenames.Add(f) } else { pyLibraryFilenames.Add(f) @@ -195,7 +208,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes } } baseName := filepath.Base(path) - if strings.HasSuffix(baseName, "_test.py") || strings.HasPrefix(baseName, "test_") { + if matchesAnyGlob(baseName, testFileGlobs) { pyTestFilenames.Add(srcPath) } else { pyLibraryFilenames.Add(srcPath) diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/README.md b/gazelle/python/testdata/directive_python_test_file_pattern/README.md new file mode 100644 index 0000000000..99142f7ab2 --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern/README.md @@ -0,0 +1,19 @@ +# Directive: `python_test_file_pattern` + +This test case asserts that the `# gazelle:python_test_file_pattern` directive +works as intended. + +It consists of 6 cases: + +1. When not set, both `*_test.py` and `test_*.py` files are mapped to the `py_test` + rule. +2. When set to a single value `*_test.py`, `test_*.py` files are mapped to the + `py_library` rule. +3. When set to a single value `test_*.py`, `*_test.py` files are mapped to the + `py_library` rule (ie: the inverse of case 2, but also with "file" generation + mode). +4. Arbitrary `glob` patterns are supported. +5. Multiple `glob` patterns are supported and that patterns don't technically + need to end in `.py` if they end in a wildcard (eg: we won't make a `py_test` + target for the extensionless file `test_foo`). +6. Sub-packages can override the directive's value. diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/WORKSPACE b/gazelle/python/testdata/directive_python_test_file_pattern/WORKSPACE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test.yaml b/gazelle/python/testdata/directive_python_test_file_pattern/test.yaml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test1_unset/BUILD.in b/gazelle/python/testdata/directive_python_test_file_pattern/test1_unset/BUILD.in new file mode 100644 index 0000000000..af2c2cea4b --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern/test1_unset/BUILD.in @@ -0,0 +1 @@ +# gazelle:python_generation_mode file diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test1_unset/BUILD.out b/gazelle/python/testdata/directive_python_test_file_pattern/test1_unset/BUILD.out new file mode 100644 index 0000000000..724b913fa6 --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern/test1_unset/BUILD.out @@ -0,0 +1,18 @@ +load("@rules_python//python:defs.bzl", "py_test") + +# gazelle:python_generation_mode file + +py_test( + name = "hello_test", + srcs = ["hello_test.py"], +) + +py_test( + name = "test_goodbye", + srcs = ["test_goodbye.py"], +) + +py_test( + name = "test_hello", + srcs = ["test_hello.py"], +) diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test1_unset/hello_test.py b/gazelle/python/testdata/directive_python_test_file_pattern/test1_unset/hello_test.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test1_unset/test_goodbye.py b/gazelle/python/testdata/directive_python_test_file_pattern/test1_unset/test_goodbye.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test1_unset/test_hello.py b/gazelle/python/testdata/directive_python_test_file_pattern/test1_unset/test_hello.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test2_star_test_py/BUILD.in b/gazelle/python/testdata/directive_python_test_file_pattern/test2_star_test_py/BUILD.in new file mode 100644 index 0000000000..57becc603b --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern/test2_star_test_py/BUILD.in @@ -0,0 +1 @@ +# gazelle:python_test_file_pattern *_test.py diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test2_star_test_py/BUILD.out b/gazelle/python/testdata/directive_python_test_file_pattern/test2_star_test_py/BUILD.out new file mode 100644 index 0000000000..be5917b356 --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern/test2_star_test_py/BUILD.out @@ -0,0 +1,17 @@ +load("@rules_python//python:defs.bzl", "py_library", "py_test") + +# gazelle:python_test_file_pattern *_test.py + +py_library( + name = "test2_star_test_py", + srcs = [ + "test_goodbye.py", + "test_hello.py", + ], + visibility = ["//:__subpackages__"], +) + +py_test( + name = "hello_test", + srcs = ["hello_test.py"], +) diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test2_star_test_py/hello_test.py b/gazelle/python/testdata/directive_python_test_file_pattern/test2_star_test_py/hello_test.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test2_star_test_py/test_goodbye.py b/gazelle/python/testdata/directive_python_test_file_pattern/test2_star_test_py/test_goodbye.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test2_star_test_py/test_hello.py b/gazelle/python/testdata/directive_python_test_file_pattern/test2_star_test_py/test_hello.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test3_test_star_py/BUILD.in b/gazelle/python/testdata/directive_python_test_file_pattern/test3_test_star_py/BUILD.in new file mode 100644 index 0000000000..cc91589f9a --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern/test3_test_star_py/BUILD.in @@ -0,0 +1,2 @@ +# gazelle:python_generation_mode file +# gazelle:python_test_file_pattern test_*.py diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test3_test_star_py/BUILD.out b/gazelle/python/testdata/directive_python_test_file_pattern/test3_test_star_py/BUILD.out new file mode 100644 index 0000000000..7ff0d5d0ad --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern/test3_test_star_py/BUILD.out @@ -0,0 +1,20 @@ +load("@rules_python//python:defs.bzl", "py_library", "py_test") + +# gazelle:python_generation_mode file +# gazelle:python_test_file_pattern test_*.py + +py_library( + name = "hello_test", + srcs = ["hello_test.py"], + visibility = ["//:__subpackages__"], +) + +py_test( + name = "test_goodbye", + srcs = ["test_goodbye.py"], +) + +py_test( + name = "test_hello", + srcs = ["test_hello.py"], +) diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test3_test_star_py/hello_test.py b/gazelle/python/testdata/directive_python_test_file_pattern/test3_test_star_py/hello_test.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test3_test_star_py/test_goodbye.py b/gazelle/python/testdata/directive_python_test_file_pattern/test3_test_star_py/test_goodbye.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test3_test_star_py/test_hello.py b/gazelle/python/testdata/directive_python_test_file_pattern/test3_test_star_py/test_hello.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test4_glob/BUILD.in b/gazelle/python/testdata/directive_python_test_file_pattern/test4_glob/BUILD.in new file mode 100644 index 0000000000..8bffaa149b --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern/test4_glob/BUILD.in @@ -0,0 +1,2 @@ +# gazelle:python_generation_mode file +# gazelle:python_test_file_pattern foo_*_[A-Z]_test?.py diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test4_glob/BUILD.out b/gazelle/python/testdata/directive_python_test_file_pattern/test4_glob/BUILD.out new file mode 100644 index 0000000000..ff0034ca45 --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern/test4_glob/BUILD.out @@ -0,0 +1,20 @@ +load("@rules_python//python:defs.bzl", "py_library", "py_test") + +# gazelle:python_generation_mode file +# gazelle:python_test_file_pattern foo_*_[A-Z]_test?.py + +py_library( + name = "foo_nota_test0_Z1", + srcs = ["foo_nota_test0_Z1.py"], + visibility = ["//:__subpackages__"], +) + +py_test( + name = "foo_helloworld_A_testA", + srcs = ["foo_helloworld_A_testA.py"], +) + +py_test( + name = "foo_my_filename_B_test1", + srcs = ["foo_my_filename_B_test1.py"], +) diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test4_glob/foo_helloworld_A_testA.py b/gazelle/python/testdata/directive_python_test_file_pattern/test4_glob/foo_helloworld_A_testA.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test4_glob/foo_my_filename_B_test1.py b/gazelle/python/testdata/directive_python_test_file_pattern/test4_glob/foo_my_filename_B_test1.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test4_glob/foo_nota_test0_Z1.py b/gazelle/python/testdata/directive_python_test_file_pattern/test4_glob/foo_nota_test0_Z1.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/BUILD.in b/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/BUILD.in new file mode 100644 index 0000000000..a0e25aa883 --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/BUILD.in @@ -0,0 +1,3 @@ +# gazelle:python_test_file_pattern *_hello.py,hello_*,unittest_*,*_unittest.py + +# Note that "foo_unittest.pyc" and "test_bar" files are ignored. diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/BUILD.out b/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/BUILD.out new file mode 100644 index 0000000000..1dcf9a4554 --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/BUILD.out @@ -0,0 +1,34 @@ +load("@rules_python//python:defs.bzl", "py_library", "py_test") + +# gazelle:python_test_file_pattern *_hello.py,hello_*,unittest_*,*_unittest.py + +# Note that "foo_unittest.pyc" and "test_bar" files are ignored. + +py_library( + name = "test5_multiple_patterns", + srcs = [ + "mylib.py", + "mylib2.py", + ], + visibility = ["//:__subpackages__"], +) + +py_test( + name = "foo_hello", + srcs = ["foo_hello.py"], +) + +py_test( + name = "foo_unittest", + srcs = ["foo_unittest.py"], +) + +py_test( + name = "hello_foo", + srcs = ["hello_foo.py"], +) + +py_test( + name = "unittest_foo", + srcs = ["unittest_foo.py"], +) diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/foo_hello.py b/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/foo_hello.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/foo_unittest.py b/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/foo_unittest.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/foo_unittest.pyc b/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/foo_unittest.pyc new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/hello_foo.py b/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/hello_foo.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/mylib.py b/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/mylib.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/mylib2.py b/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/mylib2.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/test_bar b/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/test_bar new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/unittest_foo.py b/gazelle/python/testdata/directive_python_test_file_pattern/test5_multiple_patterns/unittest_foo.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/BUILD.in b/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/BUILD.in new file mode 100644 index 0000000000..2acff9bf6c --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/BUILD.in @@ -0,0 +1,2 @@ +# gazelle:python_generation_mode file +# gazelle:python_test_file_pattern *_unittest.py diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/BUILD.out b/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/BUILD.out new file mode 100644 index 0000000000..7b9f55738c --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/BUILD.out @@ -0,0 +1,15 @@ +load("@rules_python//python:defs.bzl", "py_library", "py_test") + +# gazelle:python_generation_mode file +# gazelle:python_test_file_pattern *_unittest.py + +py_library( + name = "not_a_test", + srcs = ["not_a_test.py"], + visibility = ["//:__subpackages__"], +) + +py_test( + name = "hello_unittest", + srcs = ["hello_unittest.py"], +) diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/hello_unittest.py b/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/hello_unittest.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/not_a_test.py b/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/not_a_test.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/subpkg/BUILD.in b/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/subpkg/BUILD.in new file mode 100644 index 0000000000..cc91589f9a --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/subpkg/BUILD.in @@ -0,0 +1,2 @@ +# gazelle:python_generation_mode file +# gazelle:python_test_file_pattern test_*.py diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/subpkg/BUILD.out b/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/subpkg/BUILD.out new file mode 100644 index 0000000000..49107ee620 --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/subpkg/BUILD.out @@ -0,0 +1,21 @@ +load("@rules_python//python:defs.bzl", "py_library", "py_test") + +# gazelle:python_generation_mode file +# gazelle:python_test_file_pattern test_*.py + +py_library( + name = "not_a_test", + srcs = ["not_a_test.py"], + visibility = ["//:__subpackages__"], +) + +py_library( + name = "not_a_unittest", + srcs = ["not_a_unittest.py"], + visibility = ["//:__subpackages__"], +) + +py_test( + name = "test_bar", + srcs = ["test_bar.py"], +) diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/subpkg/not_a_test.py b/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/subpkg/not_a_test.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/subpkg/not_a_unittest.py b/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/subpkg/not_a_unittest.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/subpkg/test_bar.py b/gazelle/python/testdata/directive_python_test_file_pattern/test6_nesting/subpkg/test_bar.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/BUILD.in b/gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/BUILD.in new file mode 100644 index 0000000000..19ed002a76 --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/BUILD.in @@ -0,0 +1 @@ +# gazelle:python_test_file_pattern foo_*_[A-Z_test?.py diff --git a/gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/BUILD.out b/gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/BUILD.out new file mode 100644 index 0000000000..19ed002a76 --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/BUILD.out @@ -0,0 +1 @@ +# gazelle:python_test_file_pattern foo_*_[A-Z_test?.py diff --git a/gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/README.md b/gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/README.md new file mode 100644 index 0000000000..42ff63520c --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/README.md @@ -0,0 +1,4 @@ +# Directive: `python_test_file_pattern` + +This test case asserts that the `# gazelle:python_test_file_pattern` directive +fails with a nice message (rather than panicking) if the glob pattern is invalid. diff --git a/gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/WORKSPACE b/gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/WORKSPACE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/test.yaml b/gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/test.yaml new file mode 100644 index 0000000000..6bae723ea2 --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern_bad_glob/test.yaml @@ -0,0 +1,19 @@ +# 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. + +--- +expect: + exit_code: 1 + stderr: | + gazelle: invalid glob pattern 'foo_*_[A-Z_test?.py' diff --git a/gazelle/python/testdata/directive_python_test_file_pattern_no_value/BUILD.in b/gazelle/python/testdata/directive_python_test_file_pattern_no_value/BUILD.in new file mode 100644 index 0000000000..4e2b4cc036 --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern_no_value/BUILD.in @@ -0,0 +1 @@ +# gazelle:python_test_file_pattern diff --git a/gazelle/python/testdata/directive_python_test_file_pattern_no_value/BUILD.out b/gazelle/python/testdata/directive_python_test_file_pattern_no_value/BUILD.out new file mode 100644 index 0000000000..4e2b4cc036 --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern_no_value/BUILD.out @@ -0,0 +1 @@ +# gazelle:python_test_file_pattern diff --git a/gazelle/python/testdata/directive_python_test_file_pattern_no_value/README.md b/gazelle/python/testdata/directive_python_test_file_pattern_no_value/README.md new file mode 100644 index 0000000000..2c38eb78d2 --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern_no_value/README.md @@ -0,0 +1,8 @@ +# Directive: `python_test_file_pattern` + +This test case asserts that the `# gazelle:python_test_file_pattern` directive +fails with a nice message if the directive has no value. + +See discussion in [PR #1819 (comment)][comment]. + +[comment]: https://github.com/bazelbuild/rules_python/pull/1819#discussion_r1536906287 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern_no_value/WORKSPACE b/gazelle/python/testdata/directive_python_test_file_pattern_no_value/WORKSPACE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern_no_value/foo_test.py b/gazelle/python/testdata/directive_python_test_file_pattern_no_value/foo_test.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_test_file_pattern_no_value/test.yaml b/gazelle/python/testdata/directive_python_test_file_pattern_no_value/test.yaml new file mode 100644 index 0000000000..8eaa65920d --- /dev/null +++ b/gazelle/python/testdata/directive_python_test_file_pattern_no_value/test.yaml @@ -0,0 +1,19 @@ +# 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. + +--- +expect: + exit_code: 1 + stderr: | + gazelle: directive 'python_test_file_pattern' requires a value diff --git a/gazelle/pythonconfig/pythonconfig.go b/gazelle/pythonconfig/pythonconfig.go index a0bc9f689d..726b145aaf 100644 --- a/gazelle/pythonconfig/pythonconfig.go +++ b/gazelle/pythonconfig/pythonconfig.go @@ -74,6 +74,9 @@ const ( // visibility labels are added to generated targets. It mimics the behavior // of the `go_visibility` directive. Visibility = "python_visibility" + // TestFilePattern represents the directive that controls which python + // files are mapped to `py_test` targets. + TestFilePattern = "python_test_file_pattern" ) // GenerationModeType represents one of the generation modes for the Python @@ -96,9 +99,11 @@ const ( packageNameNamingConventionSubstitution = "$package_name$" ) -// The default visibility label, including a format placeholder for `python_root`. const ( + // The default visibility label, including a format placeholder for `python_root`. DefaultVisibilityFmtString = "//%s:__subpackages__" + // The default globs used to determine pt_test targets. + DefaultTestFilePatternString = "*_test.py,test_*.py" ) // defaultIgnoreFiles is the list of default values used in the @@ -150,6 +155,7 @@ type Config struct { testNamingConvention string defaultVisibility []string visibility []string + testFilePattern []string } // New creates a new Config. @@ -173,6 +179,7 @@ func New( testNamingConvention: fmt.Sprintf("%s_test", packageNameNamingConventionSubstitution), defaultVisibility: []string{fmt.Sprintf(DefaultVisibilityFmtString, "")}, visibility: []string{}, + testFilePattern: strings.Split(DefaultTestFilePatternString, ","), } } @@ -201,6 +208,7 @@ func (c *Config) NewChild() *Config { testNamingConvention: c.testNamingConvention, defaultVisibility: c.defaultVisibility, visibility: c.visibility, + testFilePattern: c.testFilePattern, } } @@ -425,3 +433,13 @@ func (c *Config) SetDefaultVisibility(visibility []string) { func (c *Config) DefaultVisibilty() []string { return c.defaultVisibility } + +// SetTestFilePattern sets the file patterns that should be mapped to 'py_test' rules. +func (c *Config) SetTestFilePattern(patterns []string) { + c.testFilePattern = patterns +} + +// TestFilePattern returns the patterns that should be mapped to 'py_test' rules. +func (c *Config) TestFilePattern() []string { + return c.testFilePattern +} From cdc7f2f43186899b970996f0051c702c40b10ea6 Mon Sep 17 00:00:00 2001 From: Douglas Thor Date: Fri, 5 Apr 2024 20:34:24 -0700 Subject: [PATCH 002/345] docs: Add basic docs for using credential helper with Bazel downloader of python packages (#1834) Add credential helper docs that were requested in https://github.com/bazelbuild/rules_python/pull/1827#issuecomment-2031018674 --- docs/sphinx/pip.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/docs/sphinx/pip.md b/docs/sphinx/pip.md index 34248d2d1c..e73c0c6a56 100644 --- a/docs/sphinx/pip.md +++ b/docs/sphinx/pip.md @@ -82,3 +82,51 @@ https://blog.aspect.dev/bazel-can-write-to-the-source-folder to put a copy of the generated requirements.bzl into your project. Then load the requirements.bzl file directly rather than from the generated repository. See the example in rules_python/examples/pip_parse_vendored. + + +(credential-helper)= +## Credential Helper + +The "use Bazel downloader for python wheels" experimental feature includes support for the Bazel +[Credential Helper][cred-helper-design]. + +Your python artifact registry may provide a credential helper for you. Refer to your index's docs +to see if one is provided. + +See the [Credential Helper Spec][cred-helper-spec] for details. + +[cred-helper-design]: https://github.com/bazelbuild/proposals/blob/main/designs/2022-06-07-bazel-credential-helpers.md +[cred-helper-spec]: https://github.com/EngFlow/credential-helper-spec/blob/main/spec.md + + +### Basic Example: + +The simplest form of a credential helper is a bash script that accepts an arg and spits out JSON to +stdout. For a service like Google Artifact Registry that uses ['Basic' HTTP Auth][rfc7617] and does +not provide a credential helper that conforms to the [spec][cred-helper-spec], the script might +look like: + +```bash +#!/bin/bash +# cred_helper.sh +ARG=$1 # but we don't do anything with it as it's always "get" + +# formatting is optional +echo '{' +echo ' "headers": {' +echo ' "Authorization": ["Basic dGVzdDoxMjPCow=="] +echo ' }' +echo '}' +``` + +Configure Bazel to use this credential helper for your python index `example.com`: + +``` +# .bazelrc +build --credential_helper=example.com=/full/path/to/cred_helper.sh +``` + +Bazel will call this file like `cred_helper.sh get` and use the returned JSON to inject headers +into whatever HTTP(S) request it performs against `example.com`. + +[rfc7617]: https://datatracker.ietf.org/doc/html/rfc7617 From 24a910dbdd9beda56a4d89d3c4ac08034f302b7e Mon Sep 17 00:00:00 2001 From: Douglas Thor Date: Sat, 6 Apr 2024 18:03:06 -0700 Subject: [PATCH 003/345] fix(gazelle): Consistent substitution pattern for python_default_visibility directive (#1835) Make the substitution pattern for `python_default_visibility` consistent with the existing `python_*_naming_convention` pattern. In #1787 I added the `python_default_visibility` directive and used a substitution pattern `$python_root`. However, I missed that the existing `python_*_naming_convention` directives include a trailing `$`. This PR is just: ``` rg -l -F "\$python_root" | xargs sed -i 's/\$python_root/$python_root$/g' ``` --- gazelle/README.md | 6 +++--- gazelle/python/configure.go | 4 ++-- .../test3_injection/BUILD.in | 2 +- .../test3_injection/BUILD.out | 2 +- .../test8_multiple_python_root_dirs/proj2/src/pkg2/BUILD.in | 2 +- .../proj2/src/pkg2/BUILD.out | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/gazelle/README.md b/gazelle/README.md index e4fd3d8fef..4c1cb2799e 100644 --- a/gazelle/README.md +++ b/gazelle/README.md @@ -199,7 +199,7 @@ Python-specific directives are as follows: | `# gazelle:resolve py ...` | n/a | | Instructs the plugin what target to add as a dependency to satisfy a given import statement. The syntax is `# gazelle:resolve py import-string label` where `import-string` is the symbol in the python `import` statement, and `label` is the Bazel label that Gazelle should write in `deps`. | | | [`# gazelle:python_default_visibility labels`](#directive-python_default_visibility) | | -| Instructs gazelle to use these visibility labels on all python targets. `labels` is a comma-separated list of labels (without spaces). | `//$python_root:__subpackages__` | +| Instructs gazelle to use these visibility labels on all python targets. `labels` is a comma-separated list of labels (without spaces). | `//$python_root$:__subpackages__` | | [`# gazelle:python_visibility label`](#directive-python_visibility) | | | Appends additional visibility labels to each generated target. This directive can be set multiple times. | | | [`# gazelle:python_test_file_pattern`](#directive-python_test_file_pattern) | `*_test.py,test_*.py` | @@ -268,11 +268,11 @@ py_library( ``` You can also inject the `python_root` value by using the exact string -`$python_root`. All instances of this string will be replaced by the `python_root` +`$python_root$`. All instances of this string will be replaced by the `python_root` value. ```starlark -# gazelle:python_default_visibility //$python_root:__pkg__,//foo/$python_root/tests:__subpackages__ +# gazelle:python_default_visibility //$python_root$:__pkg__,//foo/$python_root$/tests:__subpackages__ # Assuming the "# gazelle:python_root" directive is set in ./py/src/BUILD.bazel, # the results will be: diff --git a/gazelle/python/configure.go b/gazelle/python/configure.go index 2a0e142400..ed6e2e102c 100644 --- a/gazelle/python/configure.go +++ b/gazelle/python/configure.go @@ -177,8 +177,8 @@ func (py *Configurer) Configure(c *config.Config, rel string, f *rule.File) { config.SetDefaultVisibility([]string{defaultVisibility}) default: // Handle injecting the python root. Assume that the user used the - // exact string "$python_root". - labels := strings.ReplaceAll(directiveArg, "$python_root", config.PythonProjectRoot()) + // exact string "$python_root$". + labels := strings.ReplaceAll(directiveArg, "$python_root$", config.PythonProjectRoot()) config.SetDefaultVisibility(strings.Split(labels, ",")) } case pythonconfig.Visibility: diff --git a/gazelle/python/testdata/directive_python_default_visibility/test3_injection/BUILD.in b/gazelle/python/testdata/directive_python_default_visibility/test3_injection/BUILD.in index dd64538ef1..588f0c754e 100644 --- a/gazelle/python/testdata/directive_python_default_visibility/test3_injection/BUILD.in +++ b/gazelle/python/testdata/directive_python_default_visibility/test3_injection/BUILD.in @@ -1,2 +1,2 @@ # gazelle:python_root -# gazelle:python_default_visibility //foo/$python_root/bar:__pkg__ +# gazelle:python_default_visibility //foo/$python_root$/bar:__pkg__ diff --git a/gazelle/python/testdata/directive_python_default_visibility/test3_injection/BUILD.out b/gazelle/python/testdata/directive_python_default_visibility/test3_injection/BUILD.out index 1dc862bfd3..d4140e897e 100644 --- a/gazelle/python/testdata/directive_python_default_visibility/test3_injection/BUILD.out +++ b/gazelle/python/testdata/directive_python_default_visibility/test3_injection/BUILD.out @@ -1,7 +1,7 @@ load("@rules_python//python:defs.bzl", "py_library") # gazelle:python_root -# gazelle:python_default_visibility //foo/$python_root/bar:__pkg__ +# gazelle:python_default_visibility //foo/$python_root$/bar:__pkg__ py_library( name = "test3_injection", diff --git a/gazelle/python/testdata/directive_python_default_visibility/test8_multiple_python_root_dirs/proj2/src/pkg2/BUILD.in b/gazelle/python/testdata/directive_python_default_visibility/test8_multiple_python_root_dirs/proj2/src/pkg2/BUILD.in index be5aae68f0..ebaccfda2f 100644 --- a/gazelle/python/testdata/directive_python_default_visibility/test8_multiple_python_root_dirs/proj2/src/pkg2/BUILD.in +++ b/gazelle/python/testdata/directive_python_default_visibility/test8_multiple_python_root_dirs/proj2/src/pkg2/BUILD.in @@ -1,3 +1,3 @@ # proj1 depends on proj2 # So we have to make sure that proj2 is visible by proj1 -# gazelle:python_default_visibility //$python_root:__subpackages__,//test8_multiple_python_root_dirs/proj1/src:__subpackages__ +# gazelle:python_default_visibility //$python_root$:__subpackages__,//test8_multiple_python_root_dirs/proj1/src:__subpackages__ diff --git a/gazelle/python/testdata/directive_python_default_visibility/test8_multiple_python_root_dirs/proj2/src/pkg2/BUILD.out b/gazelle/python/testdata/directive_python_default_visibility/test8_multiple_python_root_dirs/proj2/src/pkg2/BUILD.out index d6942c4e33..8b30e97a0f 100644 --- a/gazelle/python/testdata/directive_python_default_visibility/test8_multiple_python_root_dirs/proj2/src/pkg2/BUILD.out +++ b/gazelle/python/testdata/directive_python_default_visibility/test8_multiple_python_root_dirs/proj2/src/pkg2/BUILD.out @@ -2,7 +2,7 @@ load("@rules_python//python:defs.bzl", "py_library") # proj1 depends on proj2 # So we have to make sure that proj2 is visible by proj1 -# gazelle:python_default_visibility //$python_root:__subpackages__,//test8_multiple_python_root_dirs/proj1/src:__subpackages__ +# gazelle:python_default_visibility //$python_root$:__subpackages__,//test8_multiple_python_root_dirs/proj1/src:__subpackages__ py_library( name = "pkg2", From 4be00a69ae3a0c4e7ef3a5f952254bacd16d0a2a Mon Sep 17 00:00:00 2001 From: Sahin Yort Date: Thu, 11 Apr 2024 11:26:42 -0700 Subject: [PATCH 004/345] refactor: toolchainize py_proto_library (#1577) Enables use of `--incompatible_enable_proto_toolchain_resolution` flag that launched in Bazel 7. This allows users to choose a pre-built `protoc` or use the runtime from https://pypi.org/project/protobuf/ rather than be forced to use hard-coded values in Bazel core. This change is also happening in other language rulesets that provide first-class protobuf support, e.g. https://github.com/bazelbuild/rules_go/issues/3895 No update to CHANGELOG.md in this PR as the feature is not yet documented for end-users, this just makes it possible to enable the flag. A follow-up PR will provide user instructions. --------- Co-authored-by: Alex Eagle --- MODULE.bazel | 2 +- examples/py_proto_library/WORKSPACE | 33 ++++++++++++----------- internal_deps.bzl | 8 +++--- python/private/proto/py_proto_library.bzl | 18 ++++++++++--- 4 files changed, 35 insertions(+), 26 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index fc32a3e51f..c7d5e23d0b 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -9,7 +9,7 @@ bazel_dep(name = "bazel_skylib", version = "1.3.0") bazel_dep(name = "platforms", version = "0.0.4") # Those are loaded only when using py_proto_library -bazel_dep(name = "rules_proto", version = "5.3.0-21.7") +bazel_dep(name = "rules_proto", version = "6.0.0-rc1") bazel_dep(name = "protobuf", version = "21.7", repo_name = "com_google_protobuf") internal_deps = use_extension("//python/private/bzlmod:internal_deps.bzl", "internal_deps") diff --git a/examples/py_proto_library/WORKSPACE b/examples/py_proto_library/WORKSPACE index bf38112f98..81f189dbbf 100644 --- a/examples/py_proto_library/WORKSPACE +++ b/examples/py_proto_library/WORKSPACE @@ -1,4 +1,6 @@ -workspace(name = "rules_python_py_proto_library_example") +# NB: short workspace name is required to workaround PATH length limitation, see +# https://github.com/bazelbuild/bazel/issues/18683#issuecomment-1843857373 +workspace(name = "p") # The following local_path_override is only needed to run this example as part of our CI. local_repository( @@ -24,21 +26,9 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name = "rules_proto", - sha256 = "dc3fb206a2cb3441b485eb1e423165b231235a1ea9b031b4433cf7bc1fa460dd", - strip_prefix = "rules_proto-5.3.0-21.7", - urls = [ - "https://github.com/bazelbuild/rules_proto/archive/refs/tags/5.3.0-21.7.tar.gz", - ], -) - -http_archive( - name = "com_google_protobuf", - sha256 = "75be42bd736f4df6d702a0e4e4d30de9ee40eac024c4b845d17ae4cc831fe4ae", - strip_prefix = "protobuf-21.7", - urls = [ - "https://mirror.bazel.build/github.com/protocolbuffers/protobuf/archive/v21.7.tar.gz", - "https://github.com/protocolbuffers/protobuf/archive/v21.7.tar.gz", - ], + sha256 = "904a8097fae42a690c8e08d805210e40cccb069f5f9a0f6727cf4faa7bed2c9c", + strip_prefix = "rules_proto-6.0.0-rc1", + url = "https://github.com/bazelbuild/rules_proto/releases/download/6.0.0-rc1/rules_proto-6.0.0-rc1.tar.gz", ) load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") @@ -46,3 +36,14 @@ load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_ rules_proto_dependencies() rules_proto_toolchains() + +http_archive( + name = "com_google_protobuf", + sha256 = "4fc5ff1b2c339fb86cd3a25f0b5311478ab081e65ad258c6789359cd84d421f8", + strip_prefix = "protobuf-26.1", + urls = ["https://github.com/protocolbuffers/protobuf/archive/v26.1.tar.gz"], +) + +load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") + +protobuf_deps() diff --git a/internal_deps.bzl b/internal_deps.bzl index 2ef0dc5751..a8bfd471dd 100644 --- a/internal_deps.bzl +++ b/internal_deps.bzl @@ -166,11 +166,9 @@ def rules_python_internal_deps(): http_archive( name = "rules_proto", - sha256 = "dc3fb206a2cb3441b485eb1e423165b231235a1ea9b031b4433cf7bc1fa460dd", - strip_prefix = "rules_proto-5.3.0-21.7", - urls = [ - "https://github.com/bazelbuild/rules_proto/archive/refs/tags/5.3.0-21.7.tar.gz", - ], + sha256 = "904a8097fae42a690c8e08d805210e40cccb069f5f9a0f6727cf4faa7bed2c9c", + strip_prefix = "rules_proto-6.0.0-rc1", + url = "https://github.com/bazelbuild/rules_proto/releases/download/6.0.0-rc1/rules_proto-6.0.0-rc1.tar.gz", ) http_archive( diff --git a/python/private/proto/py_proto_library.bzl b/python/private/proto/py_proto_library.bzl index 91faa2dc60..e123ff8476 100644 --- a/python/private/proto/py_proto_library.bzl +++ b/python/private/proto/py_proto_library.bzl @@ -17,7 +17,7 @@ load("@rules_proto//proto:defs.bzl", "ProtoInfo", "proto_common") load("//python:defs.bzl", "PyInfo") -ProtoLangToolchainInfo = proto_common.ProtoLangToolchainInfo +PY_PROTO_TOOLCHAIN = "@rules_python//python/proto:toolchain_type" _PyProtoInfo = provider( doc = "Encapsulates information needed by the Python proto rules.", @@ -35,6 +35,9 @@ _PyProtoInfo = provider( def _filter_provider(provider, *attrs): return [dep[provider] for attr in attrs for dep in attr if provider in dep] +def _incompatible_toolchains_enabled(): + return getattr(proto_common, "INCOMPATIBLE_ENABLE_PROTO_TOOLCHAIN_RESOLUTION", False) + def _py_proto_aspect_impl(target, ctx): """Generates and compiles Python code for a proto_library. @@ -51,7 +54,6 @@ def _py_proto_aspect_impl(target, ctx): ([_PyProtoInfo]) Providers collecting transitive information about generated files. """ - _proto_library = ctx.rule.attr # Check Proto file names @@ -61,7 +63,14 @@ def _py_proto_aspect_impl(target, ctx): proto.path, )) - proto_lang_toolchain_info = ctx.attr._aspect_proto_toolchain[ProtoLangToolchainInfo] + if _incompatible_toolchains_enabled(): + toolchain = ctx.toolchains[PY_PROTO_TOOLCHAIN] + if not toolchain: + fail("No toolchains registered for '%s'." % PY_PROTO_TOOLCHAIN) + proto_lang_toolchain_info = toolchain.proto + else: + proto_lang_toolchain_info = getattr(ctx.attr, "_aspect_proto_toolchain")[proto_common.ProtoLangToolchainInfo] + api_deps = [proto_lang_toolchain_info.runtime] generated_sources = [] @@ -123,7 +132,7 @@ def _py_proto_aspect_impl(target, ctx): _py_proto_aspect = aspect( implementation = _py_proto_aspect_impl, - attrs = { + attrs = {} if _incompatible_toolchains_enabled() else { "_aspect_proto_toolchain": attr.label( default = ":python_toolchain", ), @@ -131,6 +140,7 @@ _py_proto_aspect = aspect( attr_aspects = ["deps"], required_providers = [ProtoInfo], provides = [_PyProtoInfo], + toolchains = [PY_PROTO_TOOLCHAIN] if _incompatible_toolchains_enabled() else [], ) def _py_proto_library_rule(ctx): From afae3f08fe44ab87c6f445b94c647845b22220d0 Mon Sep 17 00:00:00 2001 From: Zhongpeng Lin Date: Wed, 17 Apr 2024 13:11:24 -0700 Subject: [PATCH 005/345] fix: using thread pool on macOS (#1861) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The python parser uses ProcessPoolExecutor, which is problematic on macOS when it is distributed as a zip file, leading to errors like: ``` Traceback (most recent call last): File "", line 1, in File "/var/folders/fw/vythc6112ygfsvky8mdb5p580000gn/T/Bazel.runfiles_esxfeg_v/runfiles/python3_aarch64-apple-darwin/lib/python3.9/multiprocessing/resource_tracker.py", line 24, in from . import spawn File "/var/folders/fw/vythc6112ygfsvky8mdb5p580000gn/T/Bazel.runfiles_esxfeg_v/runfiles/python3_aarch64-apple-darwin/lib/python3.9/multiprocessing/spawn.py", line 13, in import runpy File "/var/folders/fw/vythc6112ygfsvky8mdb5p580000gn/T/Bazel.runfiles_esxfeg_v/runfiles/python3_aarch64-apple-darwin/lib/python3.9/runpy.py", line 19, in from pkgutil import read_code, get_importer ModuleNotFoundError: No module named 'pkgutil' ``` According to ["Contexts and start methods" section](https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods) of the documentation: > On macOS, the spawn start method is now the default. The fork start method should be considered unsafe as it can lead to crashes of the subprocess as macOS system libraries may start threads. meanwhile: > The 'spawn' and 'forkserver' start methods generally cannot be used with “frozen” executables (i.e., binaries produced by packages like PyInstaller and cx_Freeze) on POSIX systems. This means there is no way to start a ProcessPoolExecutor when the Python zip file is running on macOS. This PR switches it to ThreadPoolExecutor instead. --- gazelle/python/parse.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/gazelle/python/parse.py b/gazelle/python/parse.py index daa6d2b47c..ae9ce87680 100644 --- a/gazelle/python/parse.py +++ b/gazelle/python/parse.py @@ -20,6 +20,7 @@ import concurrent.futures import json import os +import platform import sys from io import BytesIO from tokenize import COMMENT, NAME, OP, STRING, tokenize @@ -108,8 +109,19 @@ def parse(repo_root, rel_package_path, filename): return output +def create_main_executor(): + # We cannot use ProcessPoolExecutor on macOS, because the fork start method should be considered unsafe as it can + # lead to crashes of the subprocess as macOS system libraries may start threads. Meanwhile, the 'spawn' and + # 'forkserver' start methods generally cannot be used with “frozen” executables (i.e., Python zip file) on POSIX + # systems. Therefore, there is no good way to use ProcessPoolExecutor on macOS when we distribute this program with + # a zip file. + # Ref: https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods + if platform.system() == "Darwin": + return concurrent.futures.ThreadPoolExecutor() + return concurrent.futures.ProcessPoolExecutor() + def main(stdin, stdout): - with concurrent.futures.ProcessPoolExecutor() as executor: + with create_main_executor() as executor: for parse_request in stdin: parse_request = json.loads(parse_request) repo_root = parse_request["repo_root"] From 55af3ebcda114a59fe57a496f6e5383a95b4ecbc Mon Sep 17 00:00:00 2001 From: Douglas Thor Date: Wed, 17 Apr 2024 13:16:33 -0700 Subject: [PATCH 006/345] refactor: Run `isort` and `black` on all python files (#1859) Run `isort` and `black` on all python files so that the pre-commit hooks do not fail anymore. It seems like most of the issues were quotation marks and vertical whitespace. Fixes #1674. --- CHANGELOG.md | 2 ++ examples/build_file_generation/__init__.py | 10 ++++++---- examples/build_file_generation/__main__.py | 2 +- examples/build_file_generation/__test__.py | 13 ++++++++----- .../random_number_generator/__init__.py | 1 - .../random_number_generator/__test__.py | 7 +++++-- .../generate_random_number.py | 3 ++- examples/bzlmod/__main__.py | 3 ++- examples/bzlmod/lib.py | 3 ++- .../runfiles/runfiles_test.py | 4 +++- .../tests/my_lib_test.py | 8 +++++--- examples/pip_parse/pip_parse_test.py | 5 +---- examples/py_proto_library/message_test.py | 5 +++-- examples/wheel/private/directory_writer.py | 2 +- examples/wheel/wheel_test.py | 4 ++-- gazelle/manifest/copy_to_source.py | 2 +- gazelle/python/parse.py | 2 +- gazelle/python/parse_test.py | 2 ++ .../collided_main.py | 2 +- .../binary_without_entrypoint/main.py | 2 +- .../binary_without_entrypoint/main_test.py | 2 ++ .../testdata/dont_rename_target/__init__.py | 1 - .../baz.py | 1 + .../foo.py | 1 + .../one/two.py | 1 + .../package1/subpackage1/module1.py | 1 + .../testdata/generated_test_entrypoint/foo.py | 1 + .../coarse_grained/_boundary/__init__.py | 1 - .../testdata/naming_convention/__main__.py | 2 +- .../testdata/naming_convention/__test__.py | 2 +- .../naming_convention/dont_rename/__main__.py | 2 +- .../naming_convention/dont_rename/__test__.py | 2 +- .../resolve_conflict/__main__.py | 2 +- .../resolve_conflict/__test__.py | 2 +- .../testdata/per_file_subdirs/bar/foo.py | 1 + .../real_test.py | 2 +- .../test_reality.py | 2 +- .../relative_imports/package1/module2.py | 1 + .../relative_imports/package2/__init__.py | 1 + .../relative_imports/package2/module3.py | 3 ++- .../relative_imports/package2/module4.py | 1 + .../testdata/respect_kind_mapping/foo.py | 1 + .../python/testdata/sibling_imports/pkg/b.py | 2 +- .../testdata/sibling_imports/pkg/unit_test.py | 2 +- gazelle/python/testdata/simple_test/foo.py | 1 + .../simple_test_with_conftest/conftest.py | 1 - .../testdata/simple_test_with_conftest/foo.py | 1 + .../subdir_sources/foo/has_main/__main__.py | 2 +- .../subdir_sources/foo/has_test/__test__.py | 2 +- .../tools/dependency_resolver/__init__.py | 1 - .../dependency_resolver.py | 14 +++++++++----- python/private/repack_whl.py | 4 +++- .../ignore_root_user_error/bzlmod_test.py | 19 ++++++++++--------- .../pycross/patched_py_wheel_library_test.py | 4 +++- 54 files changed, 102 insertions(+), 66 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f0c2e0e2a..1f577f2120 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,8 @@ A brief description of the categories of changes: `pip.parse` extension is now possible, see the `examples/pip_parse/MODULE.bazel` for how to do it. See [#1371](https://github.com/bazelbuild/rules_python/issues/1371). +* (refactor) The pre-commit developer workflow should now pass `isort` and `black` + checks (see [#1674](https://github.com/bazelbuild/rules_python/issues/1674)). ### Added diff --git a/examples/build_file_generation/__init__.py b/examples/build_file_generation/__init__.py index 37dea1b0de..22e42212de 100644 --- a/examples/build_file_generation/__init__.py +++ b/examples/build_file_generation/__init__.py @@ -12,16 +12,18 @@ # See the License for the specific language governing permissions and # limitations under the License. +import sphinx # noqa from flask import Flask, jsonify from random_number_generator import generate_random_number -import sphinx # noqa app = Flask(__name__) -@app.route('/random-number', methods=['GET']) + +@app.route("/random-number", methods=["GET"]) def get_random_number(): - return jsonify({'number': generate_random_number.generate_random_number()}) + return jsonify({"number": generate_random_number.generate_random_number()}) + -"""Start the python web server""" def main(): + """Start the python web server""" app.run() diff --git a/examples/build_file_generation/__main__.py b/examples/build_file_generation/__main__.py index 8f8efbaaa3..a77055f2d5 100644 --- a/examples/build_file_generation/__main__.py +++ b/examples/build_file_generation/__main__.py @@ -14,5 +14,5 @@ from __init__ import main -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/examples/build_file_generation/__test__.py b/examples/build_file_generation/__test__.py index c4fa5ef9b5..45e127bab8 100644 --- a/examples/build_file_generation/__test__.py +++ b/examples/build_file_generation/__test__.py @@ -13,16 +13,19 @@ # limitations under the License. import unittest + from __init__ import app + class TestServer(unittest.TestCase): def setUp(self): self.app = app.test_client() - + def test_get_random_number(self): - response = self.app.get('/random-number') + response = self.app.get("/random-number") self.assertEqual(response.status_code, 200) - self.assertIn('number', response.json) - -if __name__ == '__main__': + self.assertIn("number", response.json) + + +if __name__ == "__main__": unittest.main() diff --git a/examples/build_file_generation/random_number_generator/__init__.py b/examples/build_file_generation/random_number_generator/__init__.py index bbdfb4c588..41010956cf 100644 --- a/examples/build_file_generation/random_number_generator/__init__.py +++ b/examples/build_file_generation/random_number_generator/__init__.py @@ -11,4 +11,3 @@ # 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. - diff --git a/examples/build_file_generation/random_number_generator/__test__.py b/examples/build_file_generation/random_number_generator/__test__.py index 8cfb235d57..5facfeee9e 100644 --- a/examples/build_file_generation/random_number_generator/__test__.py +++ b/examples/build_file_generation/random_number_generator/__test__.py @@ -13,13 +13,16 @@ # limitations under the License. import unittest + import random_number_generator.generate_random_number as generate_random_number + class TestRandomNumberGenerator(unittest.TestCase): def test_generate_random_number(self): number = generate_random_number.generate_random_number() self.assertGreaterEqual(number, 1) self.assertLessEqual(number, 10) - -if __name__ == '__main__': + + +if __name__ == "__main__": unittest.main() diff --git a/examples/build_file_generation/random_number_generator/generate_random_number.py b/examples/build_file_generation/random_number_generator/generate_random_number.py index e198b5bbcd..d551e3367f 100644 --- a/examples/build_file_generation/random_number_generator/generate_random_number.py +++ b/examples/build_file_generation/random_number_generator/generate_random_number.py @@ -14,6 +14,7 @@ import random -"""Generate a random number""" + def generate_random_number(): + """Generate a random number""" return random.randint(1, 10) diff --git a/examples/bzlmod/__main__.py b/examples/bzlmod/__main__.py index daf17495c2..2dd322adc6 100644 --- a/examples/bzlmod/__main__.py +++ b/examples/bzlmod/__main__.py @@ -12,9 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -from lib import main import sys +from lib import main + if __name__ == "__main__": print(main([["A", 1], ["B", 2]])) print(sys.version) diff --git a/examples/bzlmod/lib.py b/examples/bzlmod/lib.py index 5f0167f4e7..e76042d8ec 100644 --- a/examples/bzlmod/lib.py +++ b/examples/bzlmod/lib.py @@ -12,8 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -from tabulate import tabulate import sphinx # noqa +from tabulate import tabulate + def main(table): return tabulate(table) diff --git a/examples/bzlmod_build_file_generation/runfiles/runfiles_test.py b/examples/bzlmod_build_file_generation/runfiles/runfiles_test.py index a588040cfd..5bfa5302ef 100644 --- a/examples/bzlmod_build_file_generation/runfiles/runfiles_test.py +++ b/examples/bzlmod_build_file_generation/runfiles/runfiles_test.py @@ -26,7 +26,9 @@ def testCurrentRepository(self): self.assertEqual(runfiles.Create().CurrentRepository(), "") def testRunfilesWithRepoMapping(self): - data_path = runfiles.Create().Rlocation("example_bzlmod_build_file_generation/runfiles/data/data.txt") + data_path = runfiles.Create().Rlocation( + "example_bzlmod_build_file_generation/runfiles/data/data.txt" + ) with open(data_path) as f: self.assertEqual(f.read().strip(), "Hello, example_bzlmod!") diff --git a/examples/multi_python_versions/tests/my_lib_test.py b/examples/multi_python_versions/tests/my_lib_test.py index 3f334f531f..449cb8473c 100644 --- a/examples/multi_python_versions/tests/my_lib_test.py +++ b/examples/multi_python_versions/tests/my_lib_test.py @@ -23,7 +23,9 @@ if not my_lib.websockets_is_for_python_version( workspace_version ) and not my_lib.websockets_is_for_python_version(bzlmod_version): - print("expected package for Python version is different than returned\n" - f"expected either {workspace_version} or {bzlmod_version}\n" - f"but got {my_lib.websockets.__file__}") + print( + "expected package for Python version is different than returned\n" + f"expected either {workspace_version} or {bzlmod_version}\n" + f"but got {my_lib.websockets.__file__}" + ) sys.exit(1) diff --git a/examples/pip_parse/pip_parse_test.py b/examples/pip_parse/pip_parse_test.py index 79e1a754ab..2fdd45477e 100644 --- a/examples/pip_parse/pip_parse_test.py +++ b/examples/pip_parse/pip_parse_test.py @@ -28,10 +28,7 @@ class PipInstallTest(unittest.TestCase): def _remove_leading_dirs(self, paths): # Removes the first two directories (external/) # to normalize what workspace and bzlmod produce. - return [ - '/'.join(v.split('/')[2:]) - for v in paths - ] + return ["/".join(v.split("/")[2:]) for v in paths] def test_entry_point(self): entry_point_path = os.environ.get("YAMLLINT_ENTRY_POINT") diff --git a/examples/py_proto_library/message_test.py b/examples/py_proto_library/message_test.py index 3aee1ee8c5..b1a6942a54 100644 --- a/examples/py_proto_library/message_test.py +++ b/examples/py_proto_library/message_test.py @@ -3,13 +3,14 @@ from another_proto import message_pb2 + class TestCase(unittest.TestCase): def test_message(self): got = message_pb2.TestMessage( - index = 5, + index=5, ) self.assertIsNotNone(got) if __name__ == "__main__": - sys.exit(unittest.main()) + sys.exit(unittest.main()) diff --git a/examples/wheel/private/directory_writer.py b/examples/wheel/private/directory_writer.py index 7d9a93ed3f..4b69f3a5d0 100644 --- a/examples/wheel/private/directory_writer.py +++ b/examples/wheel/private/directory_writer.py @@ -48,7 +48,7 @@ def main() -> None: args.output.mkdir(parents=True, exist_ok=True) - for (path, content) in args.files: + for path, content in args.files: new_file = args.output / path new_file.parent.mkdir(parents=True, exist_ok=True) new_file.write_text(content) diff --git a/examples/wheel/wheel_test.py b/examples/wheel/wheel_test.py index e135eaad64..66ebd5044d 100644 --- a/examples/wheel/wheel_test.py +++ b/examples/wheel/wheel_test.py @@ -62,7 +62,7 @@ def assertAllEntriesHasReproducibleMetadata(self, zf): self.assertEqual( zinfo.external_attr, (stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO | stat.S_IFREG) << 16, - msg=zinfo.filename + msg=zinfo.filename, ) self.assertEqual( zinfo.compress_type, zipfile.ZIP_DEFLATED, msg=zinfo.filename @@ -486,7 +486,7 @@ def test_minimal_data_files(self): "minimal_data_files-0.0.1.data/data/target/path/README.md", "minimal_data_files-0.0.1.data/scripts/NOTICE", "minimal_data_files-0.0.1.dist-info/RECORD", - ] + ], ) diff --git a/gazelle/manifest/copy_to_source.py b/gazelle/manifest/copy_to_source.py index 6854192332..4ebb958c3d 100644 --- a/gazelle/manifest/copy_to_source.py +++ b/gazelle/manifest/copy_to_source.py @@ -26,7 +26,7 @@ def copy_to_source(generated_relative_path: Path, target_relative_path: Path) -> target_absolute_path.parent.mkdir(parents=True, exist_ok=True) shutil.copy(generated_absolute_path, target_absolute_path) - target_absolute_path.chmod(0O664) + target_absolute_path.chmod(0o664) if __name__ == "__main__": diff --git a/gazelle/python/parse.py b/gazelle/python/parse.py index ae9ce87680..ea331bc23a 100644 --- a/gazelle/python/parse.py +++ b/gazelle/python/parse.py @@ -73,7 +73,7 @@ def parse_main(content): if token_type != OP or token_val != "==": continue token_type, token_val, start, _, _ = next(g) - if token_type != STRING or token_val.strip("\"'") != '__main__': + if token_type != STRING or token_val.strip("\"'") != "__main__": continue token_type, token_val, start, _, _ = next(g) if token_type != OP or token_val != ":": diff --git a/gazelle/python/parse_test.py b/gazelle/python/parse_test.py index 3ebded44b3..6d1fa49547 100644 --- a/gazelle/python/parse_test.py +++ b/gazelle/python/parse_test.py @@ -1,6 +1,8 @@ import unittest + import parse + class TestParse(unittest.TestCase): def test_not_has_main(self): content = "a = 1\nb = 2" diff --git a/gazelle/python/testdata/binary_without_entrypoint/collided_main.py b/gazelle/python/testdata/binary_without_entrypoint/collided_main.py index 3bf59c7795..ba732516c4 100644 --- a/gazelle/python/testdata/binary_without_entrypoint/collided_main.py +++ b/gazelle/python/testdata/binary_without_entrypoint/collided_main.py @@ -1,4 +1,4 @@ import numpy if __name__ == "__main__": - run() \ No newline at end of file + run() diff --git a/gazelle/python/testdata/binary_without_entrypoint/main.py b/gazelle/python/testdata/binary_without_entrypoint/main.py index f7b317062b..49f1049475 100644 --- a/gazelle/python/testdata/binary_without_entrypoint/main.py +++ b/gazelle/python/testdata/binary_without_entrypoint/main.py @@ -2,4 +2,4 @@ import pandas if __name__ == "__main__": - run() \ No newline at end of file + run() diff --git a/gazelle/python/testdata/binary_without_entrypoint/main_test.py b/gazelle/python/testdata/binary_without_entrypoint/main_test.py index 505a766319..a010fe71de 100644 --- a/gazelle/python/testdata/binary_without_entrypoint/main_test.py +++ b/gazelle/python/testdata/binary_without_entrypoint/main_test.py @@ -1,7 +1,9 @@ import unittest + class TestMain(unittest.unittest): pass + if __name__ == "__main__": unittest.main() diff --git a/gazelle/python/testdata/dont_rename_target/__init__.py b/gazelle/python/testdata/dont_rename_target/__init__.py index bbdfb4c588..41010956cf 100644 --- a/gazelle/python/testdata/dont_rename_target/__init__.py +++ b/gazelle/python/testdata/dont_rename_target/__init__.py @@ -11,4 +11,3 @@ # 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. - diff --git a/gazelle/python/testdata/first_party_file_and_directory_modules/baz.py b/gazelle/python/testdata/first_party_file_and_directory_modules/baz.py index e03a9ecb9d..8f8820d3f4 100644 --- a/gazelle/python/testdata/first_party_file_and_directory_modules/baz.py +++ b/gazelle/python/testdata/first_party_file_and_directory_modules/baz.py @@ -12,5 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. + def baz(): return "baz from baz.py" diff --git a/gazelle/python/testdata/first_party_file_and_directory_modules/foo.py b/gazelle/python/testdata/first_party_file_and_directory_modules/foo.py index 04474d83a8..be6d7dda45 100644 --- a/gazelle/python/testdata/first_party_file_and_directory_modules/foo.py +++ b/gazelle/python/testdata/first_party_file_and_directory_modules/foo.py @@ -12,5 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. + def foo(): print("foo") diff --git a/gazelle/python/testdata/first_party_file_and_directory_modules/one/two.py b/gazelle/python/testdata/first_party_file_and_directory_modules/one/two.py index 94cca3d002..d1909b1ab2 100644 --- a/gazelle/python/testdata/first_party_file_and_directory_modules/one/two.py +++ b/gazelle/python/testdata/first_party_file_and_directory_modules/one/two.py @@ -12,5 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. + def two(): return "two" diff --git a/gazelle/python/testdata/first_party_file_and_directory_modules/undiscoverable/package1/subpackage1/module1.py b/gazelle/python/testdata/first_party_file_and_directory_modules/undiscoverable/package1/subpackage1/module1.py index 76c72273fa..c5ccb8792f 100644 --- a/gazelle/python/testdata/first_party_file_and_directory_modules/undiscoverable/package1/subpackage1/module1.py +++ b/gazelle/python/testdata/first_party_file_and_directory_modules/undiscoverable/package1/subpackage1/module1.py @@ -12,5 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. + def find_me(): return "found" diff --git a/gazelle/python/testdata/generated_test_entrypoint/foo.py b/gazelle/python/testdata/generated_test_entrypoint/foo.py index 932de45b74..3f049df738 100644 --- a/gazelle/python/testdata/generated_test_entrypoint/foo.py +++ b/gazelle/python/testdata/generated_test_entrypoint/foo.py @@ -12,5 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. + def foo(): return "foo" diff --git a/gazelle/python/testdata/monorepo/coarse_grained/_boundary/__init__.py b/gazelle/python/testdata/monorepo/coarse_grained/_boundary/__init__.py index bbdfb4c588..41010956cf 100644 --- a/gazelle/python/testdata/monorepo/coarse_grained/_boundary/__init__.py +++ b/gazelle/python/testdata/monorepo/coarse_grained/_boundary/__init__.py @@ -11,4 +11,3 @@ # 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. - diff --git a/gazelle/python/testdata/naming_convention/__main__.py b/gazelle/python/testdata/naming_convention/__main__.py index a3afc79dcd..97955897bf 100644 --- a/gazelle/python/testdata/naming_convention/__main__.py +++ b/gazelle/python/testdata/naming_convention/__main__.py @@ -13,4 +13,4 @@ # limitations under the License. # For test purposes only. -import __init__ \ No newline at end of file +import __init__ diff --git a/gazelle/python/testdata/naming_convention/__test__.py b/gazelle/python/testdata/naming_convention/__test__.py index a3afc79dcd..97955897bf 100644 --- a/gazelle/python/testdata/naming_convention/__test__.py +++ b/gazelle/python/testdata/naming_convention/__test__.py @@ -13,4 +13,4 @@ # limitations under the License. # For test purposes only. -import __init__ \ No newline at end of file +import __init__ diff --git a/gazelle/python/testdata/naming_convention/dont_rename/__main__.py b/gazelle/python/testdata/naming_convention/dont_rename/__main__.py index a3afc79dcd..97955897bf 100644 --- a/gazelle/python/testdata/naming_convention/dont_rename/__main__.py +++ b/gazelle/python/testdata/naming_convention/dont_rename/__main__.py @@ -13,4 +13,4 @@ # limitations under the License. # For test purposes only. -import __init__ \ No newline at end of file +import __init__ diff --git a/gazelle/python/testdata/naming_convention/dont_rename/__test__.py b/gazelle/python/testdata/naming_convention/dont_rename/__test__.py index a3afc79dcd..97955897bf 100644 --- a/gazelle/python/testdata/naming_convention/dont_rename/__test__.py +++ b/gazelle/python/testdata/naming_convention/dont_rename/__test__.py @@ -13,4 +13,4 @@ # limitations under the License. # For test purposes only. -import __init__ \ No newline at end of file +import __init__ diff --git a/gazelle/python/testdata/naming_convention/resolve_conflict/__main__.py b/gazelle/python/testdata/naming_convention/resolve_conflict/__main__.py index a3afc79dcd..97955897bf 100644 --- a/gazelle/python/testdata/naming_convention/resolve_conflict/__main__.py +++ b/gazelle/python/testdata/naming_convention/resolve_conflict/__main__.py @@ -13,4 +13,4 @@ # limitations under the License. # For test purposes only. -import __init__ \ No newline at end of file +import __init__ diff --git a/gazelle/python/testdata/naming_convention/resolve_conflict/__test__.py b/gazelle/python/testdata/naming_convention/resolve_conflict/__test__.py index a3afc79dcd..97955897bf 100644 --- a/gazelle/python/testdata/naming_convention/resolve_conflict/__test__.py +++ b/gazelle/python/testdata/naming_convention/resolve_conflict/__test__.py @@ -13,4 +13,4 @@ # limitations under the License. # For test purposes only. -import __init__ \ No newline at end of file +import __init__ diff --git a/gazelle/python/testdata/per_file_subdirs/bar/foo.py b/gazelle/python/testdata/per_file_subdirs/bar/foo.py index 59eb08c42f..506f02851b 100644 --- a/gazelle/python/testdata/per_file_subdirs/bar/foo.py +++ b/gazelle/python/testdata/per_file_subdirs/bar/foo.py @@ -12,5 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. + def func(): pass diff --git a/gazelle/python/testdata/python_target_with_test_in_name/real_test.py b/gazelle/python/testdata/python_target_with_test_in_name/real_test.py index e390866be3..b25d5bd734 100644 --- a/gazelle/python/testdata/python_target_with_test_in_name/real_test.py +++ b/gazelle/python/testdata/python_target_with_test_in_name/real_test.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import boto3 import __init__ +import boto3 _ = boto3 diff --git a/gazelle/python/testdata/python_target_with_test_in_name/test_reality.py b/gazelle/python/testdata/python_target_with_test_in_name/test_reality.py index a3afc79dcd..97955897bf 100644 --- a/gazelle/python/testdata/python_target_with_test_in_name/test_reality.py +++ b/gazelle/python/testdata/python_target_with_test_in_name/test_reality.py @@ -13,4 +13,4 @@ # limitations under the License. # For test purposes only. -import __init__ \ No newline at end of file +import __init__ diff --git a/gazelle/python/testdata/relative_imports/package1/module2.py b/gazelle/python/testdata/relative_imports/package1/module2.py index f8893b24e6..0cbc5f0be0 100644 --- a/gazelle/python/testdata/relative_imports/package1/module2.py +++ b/gazelle/python/testdata/relative_imports/package1/module2.py @@ -12,5 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. + def function2(): return "function2" diff --git a/gazelle/python/testdata/relative_imports/package2/__init__.py b/gazelle/python/testdata/relative_imports/package2/__init__.py index 0f5956835b..fcaa33000e 100644 --- a/gazelle/python/testdata/relative_imports/package2/__init__.py +++ b/gazelle/python/testdata/relative_imports/package2/__init__.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. + class Class1: def method1(self): return "method1" diff --git a/gazelle/python/testdata/relative_imports/package2/module3.py b/gazelle/python/testdata/relative_imports/package2/module3.py index 478dea9aa6..29bb571a66 100644 --- a/gazelle/python/testdata/relative_imports/package2/module3.py +++ b/gazelle/python/testdata/relative_imports/package2/module3.py @@ -12,10 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. +import resolved_package + from . import Class1 from .subpackage1.module5 import function5 -import resolved_package def function3(): c1 = Class1() diff --git a/gazelle/python/testdata/relative_imports/package2/module4.py b/gazelle/python/testdata/relative_imports/package2/module4.py index b7509dc7cf..28cdc13663 100644 --- a/gazelle/python/testdata/relative_imports/package2/module4.py +++ b/gazelle/python/testdata/relative_imports/package2/module4.py @@ -12,5 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. + def function4(): return "function4" diff --git a/gazelle/python/testdata/respect_kind_mapping/foo.py b/gazelle/python/testdata/respect_kind_mapping/foo.py index 932de45b74..3f049df738 100644 --- a/gazelle/python/testdata/respect_kind_mapping/foo.py +++ b/gazelle/python/testdata/respect_kind_mapping/foo.py @@ -12,5 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. + def foo(): return "foo" diff --git a/gazelle/python/testdata/sibling_imports/pkg/b.py b/gazelle/python/testdata/sibling_imports/pkg/b.py index 7095bdcfb2..d04d423678 100644 --- a/gazelle/python/testdata/sibling_imports/pkg/b.py +++ b/gazelle/python/testdata/sibling_imports/pkg/b.py @@ -1,2 +1,2 @@ def run(): - pass \ No newline at end of file + pass diff --git a/gazelle/python/testdata/sibling_imports/pkg/unit_test.py b/gazelle/python/testdata/sibling_imports/pkg/unit_test.py index a3218e2ec2..f42878aa1b 100644 --- a/gazelle/python/testdata/sibling_imports/pkg/unit_test.py +++ b/gazelle/python/testdata/sibling_imports/pkg/unit_test.py @@ -1,3 +1,3 @@ import a +import test_util from b import run -import test_util \ No newline at end of file diff --git a/gazelle/python/testdata/simple_test/foo.py b/gazelle/python/testdata/simple_test/foo.py index 932de45b74..3f049df738 100644 --- a/gazelle/python/testdata/simple_test/foo.py +++ b/gazelle/python/testdata/simple_test/foo.py @@ -12,5 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. + def foo(): return "foo" diff --git a/gazelle/python/testdata/simple_test_with_conftest/conftest.py b/gazelle/python/testdata/simple_test_with_conftest/conftest.py index bbdfb4c588..41010956cf 100644 --- a/gazelle/python/testdata/simple_test_with_conftest/conftest.py +++ b/gazelle/python/testdata/simple_test_with_conftest/conftest.py @@ -11,4 +11,3 @@ # 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. - diff --git a/gazelle/python/testdata/simple_test_with_conftest/foo.py b/gazelle/python/testdata/simple_test_with_conftest/foo.py index 932de45b74..3f049df738 100644 --- a/gazelle/python/testdata/simple_test_with_conftest/foo.py +++ b/gazelle/python/testdata/simple_test_with_conftest/foo.py @@ -12,5 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. + def foo(): return "foo" diff --git a/gazelle/python/testdata/subdir_sources/foo/has_main/__main__.py b/gazelle/python/testdata/subdir_sources/foo/has_main/__main__.py index bd0fe61faa..78d23482a7 100644 --- a/gazelle/python/testdata/subdir_sources/foo/has_main/__main__.py +++ b/gazelle/python/testdata/subdir_sources/foo/has_main/__main__.py @@ -13,4 +13,4 @@ # limitations under the License. # For test purposes only. -import foo.has_main.python.my_module \ No newline at end of file +import foo.has_main.python.my_module diff --git a/gazelle/python/testdata/subdir_sources/foo/has_test/__test__.py b/gazelle/python/testdata/subdir_sources/foo/has_test/__test__.py index 3c9ed1a1bd..ad77cb7dcb 100644 --- a/gazelle/python/testdata/subdir_sources/foo/has_test/__test__.py +++ b/gazelle/python/testdata/subdir_sources/foo/has_test/__test__.py @@ -13,4 +13,4 @@ # limitations under the License. # For test purposes only. -import foo.has_test.python.my_module \ No newline at end of file +import foo.has_test.python.my_module diff --git a/python/pip_install/tools/dependency_resolver/__init__.py b/python/pip_install/tools/dependency_resolver/__init__.py index bbdfb4c588..41010956cf 100644 --- a/python/pip_install/tools/dependency_resolver/__init__.py +++ b/python/pip_install/tools/dependency_resolver/__init__.py @@ -11,4 +11,3 @@ # 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. - diff --git a/python/pip_install/tools/dependency_resolver/dependency_resolver.py b/python/pip_install/tools/dependency_resolver/dependency_resolver.py index 5e914bc9e9..afe5076b4f 100644 --- a/python/pip_install/tools/dependency_resolver/dependency_resolver.py +++ b/python/pip_install/tools/dependency_resolver/dependency_resolver.py @@ -99,8 +99,10 @@ def main( bazel_runfiles = runfiles.Create() requirements_file = _select_golden_requirements_file( - requirements_txt=requirements_txt, requirements_linux=requirements_linux, - requirements_darwin=requirements_darwin, requirements_windows=requirements_windows + requirements_txt=requirements_txt, + requirements_linux=requirements_linux, + requirements_darwin=requirements_darwin, + requirements_windows=requirements_windows, ) resolved_requirements_in = _locate(bazel_runfiles, requirements_in) @@ -120,8 +122,8 @@ def main( # use the runfiles file first. Thus, we need to compute the relative path # from the execution root. # Note: Windows cannot reference generated files without runfiles support enabled. - requirements_in_relative = requirements_in[len(repository_prefix):] - requirements_file_relative = requirements_file[len(repository_prefix):] + requirements_in_relative = requirements_in[len(repository_prefix) :] + requirements_file_relative = requirements_file[len(repository_prefix) :] # Before loading click, set the locale for its parser. # If it leaks through to the system setting, it may fail: @@ -157,7 +159,9 @@ def main( os.environ["CUSTOM_COMPILE_COMMAND"] = update_command os.environ["PIP_CONFIG_FILE"] = os.getenv("PIP_CONFIG_FILE") or os.devnull - argv.append(f"--output-file={requirements_file_relative if UPDATE else requirements_out}") + argv.append( + f"--output-file={requirements_file_relative if UPDATE else requirements_out}" + ) argv.append( requirements_in_relative if Path(requirements_in_relative).exists() diff --git a/python/private/repack_whl.py b/python/private/repack_whl.py index ea9c01f76f..9052ac39c6 100644 --- a/python/private/repack_whl.py +++ b/python/private/repack_whl.py @@ -152,7 +152,9 @@ def main(sys_argv): record_contents = record_path.read_text() if record_path.exists() else "" distribution_prefix = distinfo_dir.with_suffix("").name - with _WhlFile(args.output, mode="w", distribution_prefix=distribution_prefix) as out: + with _WhlFile( + args.output, mode="w", distribution_prefix=distribution_prefix + ) as out: for p in _files_to_pack(patched_wheel_dir, record_contents): rel_path = p.relative_to(patched_wheel_dir) out.add_file(str(rel_path), p) diff --git a/tests/integration/ignore_root_user_error/bzlmod_test.py b/tests/integration/ignore_root_user_error/bzlmod_test.py index 62bc4f4695..98715b32ec 100644 --- a/tests/integration/ignore_root_user_error/bzlmod_test.py +++ b/tests/integration/ignore_root_user_error/bzlmod_test.py @@ -12,26 +12,27 @@ # See the License for the specific language governing permissions and # limitations under the License. -import unittest -import pathlib import json +import pathlib +import unittest from python.runfiles import runfiles + class BzlmodTest(unittest.TestCase): def test_toolchains(self): rf = runfiles.Create() - debug_path = pathlib.Path(rf.Rlocation( - "rules_python_bzlmod_debug/debug_info.json" - )) + 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, 'name': 'python_3_11', }, - {'ignore_root_user_error': True, 'name': 'python_3_10'} + {"ignore_root_user_error": True, "name": "python_3_11"}, + {"ignore_root_user_error": True, "name": "python_3_10"}, ] - self.assertCountEqual(debug_info["toolchains_registered"], - expected) + self.assertCountEqual(debug_info["toolchains_registered"], expected) + if __name__ == "__main__": unittest.main() diff --git a/tests/pycross/patched_py_wheel_library_test.py b/tests/pycross/patched_py_wheel_library_test.py index 4591187f57..e1b404a0ef 100644 --- a/tests/pycross/patched_py_wheel_library_test.py +++ b/tests/pycross/patched_py_wheel_library_test.py @@ -23,7 +23,9 @@ class TestPyWheelLibrary(unittest.TestCase): def setUp(self): self.extraction_dir = Path( - RUNFILES.Rlocation("rules_python/tests/pycross/patched_extracted_wheel_for_testing") + RUNFILES.Rlocation( + "rules_python/tests/pycross/patched_extracted_wheel_for_testing" + ) ) self.assertTrue(self.extraction_dir.exists(), self.extraction_dir) self.assertTrue(self.extraction_dir.is_dir(), self.extraction_dir) From e3e8af80359a8c819384a53ec2172b6ef1e09eac Mon Sep 17 00:00:00 2001 From: Douglas Thor Date: Wed, 17 Apr 2024 18:00:20 -0700 Subject: [PATCH 007/345] build(deps): Bump pip tools to >= 7.4.0 (#1841) Bump pip_tools to >= 7.4.0 so that we can make use of better `pyproject.toml` parsing error messages during compiling. Specifically: https://github.com/jazzband/pip-tools/pull/1979 --- CHANGELOG.md | 5 ++--- python/pip_install/repositories.bzl | 8 ++++---- python/pip_install/tools/requirements.txt | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f577f2120..d4c059ec5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,8 +24,10 @@ A brief description of the categories of changes: * (bzlmod): The `MODULE.bazel.lock` `whl_library` rule attributes are now sorted in the attributes section. We are also removing values that are not default in order to reduce the size of the lock file. +* (coverage) Bump `coverage.py` to [7.4.3](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst#version-743--2024-02-23). * (deps): Bumped bazel_features to 1.9.1 to detect optional support non-blocking downloads. +* (deps): Updated `pip_tools` to >= 7.4.0 ### Fixed @@ -75,9 +77,6 @@ A brief description of the categories of changes: [test_file_pattern_issue]: https://github.com/bazelbuild/rules_python/issues/1816 [test_file_pattern_docs]: gazelle/README.md#directive-python_test_file_pattern -### Changed - -* (coverage) Bump `coverage.py` to [7.4.3](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst#version-743--2024-02-23). ## [0.31.0] - 2024-02-12 diff --git a/python/pip_install/repositories.bzl b/python/pip_install/repositories.bzl index b8679e5ef0..2bd52b9fd5 100644 --- a/python/pip_install/repositories.bzl +++ b/python/pip_install/repositories.bzl @@ -21,8 +21,8 @@ _RULE_DEPS = [ # START: maintained by 'bazel run //tools/private/update_deps:update_pip_deps' ( "pypi__build", - "https://files.pythonhosted.org/packages/58/91/17b00d5fac63d3dca605f1b8269ba3c65e98059e1fd99d00283e42a454f0/build-0.10.0-py3-none-any.whl", - "af266720050a66c893a6096a2f410989eeac74ff9a68ba194b3f6473e8e26171", + "https://files.pythonhosted.org/packages/e2/03/f3c8ba0a6b6e30d7d18c40faab90807c9bb5e9a1e3b2fe2008af624a9c97/build-1.2.1-py3-none-any.whl", + "75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4", ), ( "pypi__click", @@ -66,8 +66,8 @@ _RULE_DEPS = [ ), ( "pypi__pip_tools", - "https://files.pythonhosted.org/packages/e8/df/47e6267c6b5cdae867adbdd84b437393e6202ce4322de0a5e0b92960e1d6/pip_tools-7.3.0-py3-none-any.whl", - "8717693288720a8c6ebd07149c93ab0be1fced0b5191df9e9decd3263e20d85e", + "https://files.pythonhosted.org/packages/0d/dc/38f4ce065e92c66f058ea7a368a9c5de4e702272b479c0992059f7693941/pip_tools-7.4.1-py3-none-any.whl", + "4c690e5fbae2f21e87843e89c26191f0d9454f362d8acdbd695716493ec8b3a9", ), ( "pypi__pyproject_hooks", diff --git a/python/pip_install/tools/requirements.txt b/python/pip_install/tools/requirements.txt index bf9fe46afd..006ef21786 100755 --- a/python/pip_install/tools/requirements.txt +++ b/python/pip_install/tools/requirements.txt @@ -7,7 +7,7 @@ more_itertools packaging pep517 pip -pip_tools +pip_tools >= 7.4.0 setuptools tomli wheel From 9a638ea7751aef414cec4a12b56862799b359ece Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Tue, 23 Apr 2024 08:29:02 +0900 Subject: [PATCH 008/345] feat(bzlmod): add a flag to control if the parallel downloading is used (#1854) I have found this to be useful when debugging auth issues when using a private repo and I thought that having it configurable from the user's MODULE.bazel is a better user experience. Ammending #1827. --- CHANGELOG.md | 4 +++- python/private/bzlmod/pip.bzl | 18 ++++++++++++++++++ python/private/pypi_index.bzl | 16 ++++------------ 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4c059ec5f..2c2b388f1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -70,7 +70,9 @@ A brief description of the categories of changes: `experimental_index_url_overrides` to `pip.parse` for using the bazel downloader. If you see any issues, report in [#1357](https://github.com/bazelbuild/rules_python/issues/1357). The URLs for - the whl and sdist files will be written to the lock file. + the whl and sdist files will be written to the lock file. Controlling whether + the downloading of metadata is done in parallel can be done using + `parallel_download` attribute. [0.XX.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.XX.0 [python_default_visibility]: gazelle/README.md#directive-python_default_visibility diff --git a/python/private/bzlmod/pip.bzl b/python/private/bzlmod/pip.bzl index 2ba275bb0e..3d5c0f5a86 100644 --- a/python/private/bzlmod/pip.bzl +++ b/python/private/bzlmod/pip.bzl @@ -199,6 +199,7 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, simpleapi_ca auth_patterns = pip_attr.auth_patterns, ), cache = simpleapi_cache, + parallel_download = pip_attr.parallel_download, ) major_minor = _major_minor_version(pip_attr.python_version) @@ -539,6 +540,23 @@ hubs can be created, and each program can use its respective hub's targets. Targets from different hubs should not be used together. """, ), + "parallel_download": attr.bool( + doc = """\ +The flag allows to make use of parallel downloading feature in bazel 7.1 and above +when the bazel downloader is used. This is by default enabled as it improves the +performance by a lot, but in case the queries to the simple API are very expensive +or when debugging authentication issues one may want to disable this feature. + +NOTE, This will download (potentially duplicate) data for multiple packages if +there is more than one index available, but in general this should be negligible +because the simple API calls are very cheap and the user should not notice any +extra overhead. + +If we are in synchronous mode, then we will use the first result that we +find in case extra indexes are specified. +""", + default = True, + ), "python_version": attr.string( mandatory = True, doc = """ diff --git a/python/private/pypi_index.bzl b/python/private/pypi_index.bzl index e716831d5a..28f1007b48 100644 --- a/python/private/pypi_index.bzl +++ b/python/private/pypi_index.bzl @@ -23,7 +23,7 @@ load(":auth.bzl", "get_auth") load(":envsubst.bzl", "envsubst") load(":normalize_name.bzl", "normalize_name") -def simpleapi_download(ctx, *, attr, cache): +def simpleapi_download(ctx, *, attr, cache, parallel_download = True): """Download Simple API HTML. Args: @@ -49,6 +49,7 @@ def simpleapi_download(ctx, *, attr, cache): undesirable because additions to the PyPI index would not be reflected when re-evaluating the extension unless we do `bazel clean --expunge`. + parallel_download: A boolean to enable usage of bazel 7.1 non-blocking downloads. Returns: dict of pkg name to the parsed HTML contents - a list of structs. @@ -60,17 +61,8 @@ def simpleapi_download(ctx, *, attr, cache): download_kwargs = {} if bazel_features.external_deps.download_has_block_param: - download_kwargs["block"] = False - - # Download in parallel if possible. This will download (potentially - # duplicate) data for multiple packages if there is more than one index - # available, but that is the price of convenience. However, that price - # should be mostly negligible because the simple API calls are very cheap - # and the user should not notice any extra overhead. - # - # If we are in synchronous mode, then we will use the first result that we - # find. - # + download_kwargs["block"] = not parallel_download + # NOTE @aignas 2024-03-31: we are not merging results from multiple indexes # to replicate how `pip` would handle this case. async_downloads = {} From 1f17637b88489a5c35a5c83595c0e8dbb6d983e9 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 23 Apr 2024 15:36:56 -0700 Subject: [PATCH 009/345] docs: document how to configure MODULE.bazel for different use cases (#1864) This largely comes from being regularly tagged on BCR PRs about how a module should be configured. This info was sort of already in the getting started docs, but that isn't an obvious place to go and bloated the what should be simplified steps to getting started. --- docs/sphinx/getting-started.md | 129 ++++--------------- docs/sphinx/index.md | 1 + docs/sphinx/toolchains.md | 223 +++++++++++++++++++++++++++++++++ 3 files changed, 246 insertions(+), 107 deletions(-) create mode 100644 docs/sphinx/toolchains.md diff --git a/docs/sphinx/getting-started.md b/docs/sphinx/getting-started.md index fbecd7b6b2..45d1962ad8 100644 --- a/docs/sphinx/getting-started.md +++ b/docs/sphinx/getting-started.md @@ -1,12 +1,17 @@ # Getting started -The following two sections cover using `rules_python` with bzlmod and -the older way of configuring bazel with a `WORKSPACE` file. +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 +and the older way of using `WORKSPACE`. +It assumes you have a `requirements.txt` file with your PyPI dependencies. -## Using bzlmod +For more details information about configuring `rules_python`, see: +* [Configuring the runtime](toolchains) +* [Configuring third party dependencies (pip/pypi)](pypi-dependencies) +* [API docs](api/index) -**IMPORTANT: bzlmod support is still in Beta; APIs are subject to change.** +## Using bzlmod The first step to using rules_python with bzlmod is to add the dependency to your MODULE.bazel file: @@ -15,99 +20,20 @@ your MODULE.bazel file: # Update the version "0.0.0" to the release found here: # https://github.com/bazelbuild/rules_python/releases. bazel_dep(name = "rules_python", version = "0.0.0") -``` - -Once added, you can load the rules and use them: - -```starlark -load("@rules_python//python:py_binary.bzl", "py_binary") - -py_binary(...) -``` - -Depending on what you're doing, you likely want to do some additional -configuration to control what Python version is used; read the following -sections for how to do that. - -### Toolchain registration with bzlmod -A default toolchain is automatically configured depending on -`rules_python`. Note, however, the version used tracks the most recent Python -release and will change often. - -If you want to use a specific Python version for your programs, then how -to do so depends on if you're configuring the root module or not. The root -module is special because it can set the *default* Python version, which -is used by the version-unaware rules (e.g. `//python:py_binary.bzl` et al). For -submodules, it's recommended to use the version-aware rules to pin your programs -to a specific Python version so they don't accidentally run with a different -version configured by the root module. - -#### Configuring and using the default Python version - -To specify what the default Python version is, set `is_default = True` when -calling `python.toolchain()`. This can only be done by the root module; it is -silently ignored if a submodule does it. Similarly, using the version-unaware -rules (which always use the default Python version) should only be done by the -root module. If submodules use them, then they may run with a different Python -version than they expect. - -```starlark -python = use_extension("@rules_python//python/extensions:python.bzl", "python") - -python.toolchain( +pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip") +pip.parse( + hub_name = "my_deps", python_version = "3.11", - is_default = True, + requirements_lock = "//:requirements.txt", ) +use_repo(pip, "my_deps") ``` -Then use the base rules from e.g. `//python:py_binary.bzl`. - -#### Pinning to a Python version - -Pinning to a version allows targets to force that a specific Python version is -used, even if the root module configures a different version as a default. This -is most useful for two cases: - -1. For submodules to ensure they run with the appropriate Python version -2. To allow incremental, per-target, upgrading to newer Python versions, - typically in a mono-repo situation. - -To configure a submodule with the version-aware rules, request the particular -version you need, then use the `@python_versions` repo to use the rules that -force specific versions: - -```starlark -python = use_extension("@rules_python//python/extensions:python.bzl", "python") - -python.toolchain( - python_version = "3.11", -) -use_repo(python, "python_versions") -``` - -Then use e.g. `load("@python_versions//3.11:defs.bzl", "py_binary")` to use -the rules that force that particular version. Multiple versions can be specified -and use within a single build. - -For more documentation, see the bzlmod examples under the {gh-path}`examples` -folder. Look for the examples that contain a `MODULE.bazel` file. - -#### Other toolchain details - -The `python.toolchain()` call makes its contents available under a repo named -`python_X_Y`, where X and Y are the major and minor versions. For example, -`python.toolchain(python_version="3.11")` creates the repo `@python_3_11`. -Remember to call `use_repo()` to make repos visible to your module: -`use_repo(python, "python_3_11")` - ## Using a WORKSPACE file -To import rules_python in your project, you first need to add it to your -`WORKSPACE` file, using the snippet provided in the -[release you choose](https://github.com/bazelbuild/rules_python/releases) - -To depend on a particular unreleased version, you can do the following: +Using WORKSPACE is deprecated, but still supported, and a bit more involved than +using Bzlmod. Here is a simplified setup to download the prebuilt runtimes. ```starlark load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") @@ -130,13 +56,7 @@ http_archive( load("@rules_python//python:repositories.bzl", "py_repositories") py_repositories() -``` - -### Toolchain registration - -To register a hermetic Python toolchain rather than rely on a system-installed interpreter for runtime execution, you can add to the `WORKSPACE` file: -```starlark load("@rules_python//python:repositories.bzl", "python_register_toolchains") python_register_toolchains( @@ -157,19 +77,10 @@ pip_parse( ) ``` -After registration, your Python targets will use the toolchain's interpreter during execution, but a system-installed interpreter -is still used to 'bootstrap' Python targets (see https://github.com/bazelbuild/rules_python/issues/691). -You may also find some quirks while using this toolchain. Please refer to [python-build-standalone documentation's _Quirks_ section](https://gregoryszorc.com/docs/python-build-standalone/main/quirks.html). - -## Toolchain usage in other rules - -Python toolchains can be utilized in other bazel rules, such as `genrule()`, by adding the `toolchains=["@rules_python//python:current_py_toolchain"]` attribute. You can obtain the path to the Python interpreter using the `$(PYTHON2)` and `$(PYTHON3)` ["Make" Variables](https://bazel.build/reference/be/make-variables). See the -{gh-path}`test_current_py_toolchain ` target for an example. - ## "Hello World" -Once you've imported the rule set into your `WORKSPACE` using any of these -methods, you can then load the core rules in your `BUILD` files with the following: +Once you've imported the rule set using either Bzlmod or WORKSPACE, you can then +load the core rules in your `BUILD` files with the following: ```starlark load("@rules_python//python:defs.bzl", "py_binary") @@ -177,5 +88,9 @@ load("@rules_python//python:defs.bzl", "py_binary") py_binary( name = "main", srcs = ["main.py"], + deps = [ + "@my_deps//foo", + "@my_deps//bar", + ] ) ``` diff --git a/docs/sphinx/index.md b/docs/sphinx/index.md index 0a9c70f93f..d7dbb44dbc 100644 --- a/docs/sphinx/index.md +++ b/docs/sphinx/index.md @@ -57,6 +57,7 @@ by buildifier. self getting-started pypi-dependencies +configuring pip coverage gazelle diff --git a/docs/sphinx/toolchains.md b/docs/sphinx/toolchains.md new file mode 100644 index 0000000000..6e0203a4fb --- /dev/null +++ b/docs/sphinx/toolchains.md @@ -0,0 +1,223 @@ +# Configuring Python toolchains and runtimes + +This documents how to configure the Python toolchain and runtimes for different +use cases. + +## Bzlmod MODULE configuration + +How to configure `rules_python` in your MODULE.bazel file depends on how and why +you're using Python. There are 4 basic use cases: + +1. A root module that always uses Python. For example, you're building a + Python application. +2. A library module with dev-only uses of Python. For example, a Java project + that only uses Python as part of testing itself. +3. A library module without version constraints. For example, a rule set with + Python build tools, but defers to the user as to what Python version is used + for the tools. +4. A library module with version constraints. For example, a rule set with + Python build tools, and the module requires a specific version of Python + be used with its tools. + +### Root modules + +Root modules are always the top-most module. These are special in two ways: + +1. Some `rules_python` bzlmod APIs are only respected by the root module. +2. The root module can force module overrides and specific module dependency + ordering. + +When configuring `rules_python` for a root module, you typically want to +explicitly specify the Python version you want to use. This ensures that +dependencies don't change the Python version out from under you. Remember that +`rules_python` will set a version by default, but it will change regularly as +it tracks a recent Python version. + +NOTE: If your root module only uses Python for development of the module itself, +you should read the dev-only library module section. + +``` +bazel_dep(name="rules_python", version=...) +python = use_extension("@rules_python//extensions:python.bzl", "python") + +python.toolchain(python_version = "3.12", is_default = True) +``` + +### Library modules + +A library module is a module that can show up in arbitrary locations in the +bzlmod module graph -- it's unknown where in the breadth-first search order the +module will be relative to other modules. For example, `rules_python` is a +library module. + +#### Library modules with dev-only Python usage + +A library module with dev-only Python usage is usually one where Python is only +used as part of its tests. For example, a module for Java rules might run some +Python program to generate test data, but real usage of the rules don't need +Python to work. To configure this, follow the root-module setup, but remember to +specify `dev_dependency = True` to the bzlmod APIs: + +``` +# MODULE.bazel +bazel_dep(name = "rules_python", version=..., dev_dependency = True) + +python = use_extension( + "@rules_python//extensions:python.bzl", + "python", + dev_dependency = True +) + +python.toolchain(python_version = "3.12", is_default=True) +``` + +#### Library modules without version constraints + +A library module without version constraints is one where the version of Python +used for the Python programs it runs isn't chosen by the module itself. Instead, +it's up to the root module to pick an appropriate version of Python. + +For this case, configuration is simple: just depend on `rules_python` and use +the normal `//python:py_binary.bzl` et al rules. There is no need to call +`python.toolchain` -- rules_python ensures _some_ Python version is available, +but more often the root module will specify some version. + +``` +# MODULE.bazel +bazel_dep(name = "rules_python", version=...) +``` + +#### Library modules with version constraints + +A library module with version constraints is one where the module requires a +specific Python version be used with its tools. This has some pros/cons: + +* It allows the library's tools to use a different version of Python than + the rest of the build. For example, a user's program could use Python 3.12, + while the library module's tools use Python 3.10. +* It reduces the support burden for the library module because the library only needs + to test for the particular Python version they intend to run as. +* It raises the support burden for the library module because the version of + Python being used needs to be regularly incremented. +* It has higher build overhead because additional runtimes and libraries need + to be downloaded, and Bazel has to keep additional configuration state. + +To configure this, request the Python versions needed in MODULE.bazel and use +the version-aware rules for `py_binary`. + +``` +# MODULE.bazel +bazel_dep(name = "rules_python", version=...) + +python = use_extension("@rules_python//extensions:python.bzl", "python") +python.toolchain(python_version = "3.12") + +# BUILD.bazel +load("@python_versions//3.12:defs.bzl", "py_binary") + +py_binary(...) +``` + +### Pinning to a Python version + +Pinning to a version allows targets to force that a specific Python version is +used, even if the root module configures a different version as a default. This +is most useful for two cases: + +1. For submodules to ensure they run with the appropriate Python version +2. To allow incremental, per-target, upgrading to newer Python versions, + typically in a mono-repo situation. + +To configure a submodule with the version-aware rules, request the particular +version you need, then use the `@python_versions` repo to use the rules that +force specific versions: + +```starlark +python = use_extension("@rules_python//python/extensions:python.bzl", "python") + +python.toolchain( + python_version = "3.11", +) +use_repo(python, "python_versions") +``` + +Then use e.g. `load("@python_versions//3.11:defs.bzl", "py_binary")` to use +the rules that force that particular version. Multiple versions can be specified +and use within a single build. + +For more documentation, see the bzlmod examples under the {gh-path}`examples` +folder. Look for the examples that contain a `MODULE.bazel` file. + +### Other toolchain details + +The `python.toolchain()` call makes its contents available under a repo named +`python_X_Y`, where X and Y are the major and minor versions. For example, +`python.toolchain(python_version="3.11")` creates the repo `@python_3_11`. +Remember to call `use_repo()` to make repos visible to your module: +`use_repo(python, "python_3_11")` + +#### Toolchain usage in other rules + +Python toolchains can be utilized in other bazel rules, such as `genrule()`, by adding the `toolchains=["@rules_python//python:current_py_toolchain"]` attribute. You can obtain the path to the Python interpreter using the `$(PYTHON2)` and `$(PYTHON3)` ["Make" Variables](https://bazel.build/reference/be/make-variables). See the +{gh-path}`test_current_py_toolchain ` target for an example. + + +## Workspace configuration + +To import rules_python in your project, you first need to add it to your +`WORKSPACE` file, using the snippet provided in the +[release you choose](https://github.com/bazelbuild/rules_python/releases) + +To depend on a particular unreleased version, you can do the following: + +```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" + +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), +) + +load("@rules_python//python:repositories.bzl", "py_repositories") + +py_repositories() +``` + +#### Workspace toolchain registration + +To register a hermetic Python toolchain rather than rely on a system-installed interpreter for runtime execution, you can add to the `WORKSPACE` file: + +```starlark +load("@rules_python//python:repositories.bzl", "python_register_toolchains") + +python_register_toolchains( + name = "python_3_11", + # Available versions are listed in @rules_python//python:versions.bzl. + # We recommend using the same version your team is already standardized on. + 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, + ... +) +``` + +After registration, your Python targets will use the toolchain's interpreter during execution, but a system-installed interpreter +is still used to 'bootstrap' Python targets (see https://github.com/bazelbuild/rules_python/issues/691). +You may also find some quirks while using this toolchain. Please refer to [python-build-standalone documentation's _Quirks_ section](https://gregoryszorc.com/docs/python-build-standalone/main/quirks.html). From 397c1b17d04af195eb62bf8645b4d820eb4b21e7 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 24 Apr 2024 11:33:53 -0700 Subject: [PATCH 010/345] docs: Fix link to toolchain configuration doc in side bar (#1866) The index had the wrong doc name, so it wasn't showing up in the rendered docs. --- docs/sphinx/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sphinx/index.md b/docs/sphinx/index.md index d7dbb44dbc..eadd3ac11a 100644 --- a/docs/sphinx/index.md +++ b/docs/sphinx/index.md @@ -57,7 +57,7 @@ by buildifier. self getting-started pypi-dependencies -configuring +toolchains pip coverage gazelle From ced8cc6a15ba7b0c422dba17cb7e5afdd88cf985 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 29 Apr 2024 19:49:21 +0900 Subject: [PATCH 011/345] refactor: use bazel-skylib for creating hub repo aliases (#1855) With this PR the code becomes more maintainable and easier to inspect. Since bazel-skylib is already a dependency of rules_python, this is a backwards compatible change. Skipping the CHANGELOG notes because it should not be an externally visible change. Work towards #735. --- python/private/render_pkg_aliases.bzl | 26 ++++++--- python/private/text_util.bzl | 27 +++++++-- .../render_pkg_aliases_test.bzl | 56 ++++++++++++------- tests/private/text_util/render_tests.bzl | 19 +++++++ 4 files changed, 95 insertions(+), 33 deletions(-) diff --git a/python/private/render_pkg_aliases.bzl b/python/private/render_pkg_aliases.bzl index e38f13321d..5851baf570 100644 --- a/python/private/render_pkg_aliases.bzl +++ b/python/private/render_pkg_aliases.bzl @@ -42,7 +42,8 @@ def _render_whl_library_alias( *, name, default_version, - aliases): + aliases, + **kwargs): """Render an alias for common targets.""" if len(aliases) == 1 and not aliases[0].version: alias = aliases[0] @@ -56,27 +57,36 @@ def _render_whl_library_alias( # whls that are based on a specific version of Python. selects = {} no_match_error = "_NO_MATCH_ERROR" - default = None for alias in sorted(aliases, key = lambda x: x.version): actual = "@{repo}//:{name}".format(repo = alias.repo, name = name) - selects[alias.config_setting] = actual + selects.setdefault(actual, []).append(alias.config_setting) if alias.version == default_version: - default = actual + selects[actual].append("//conditions:default") no_match_error = None - if default: - selects["//conditions:default"] = default - return render.alias( name = name, actual = render.select( - selects, + { + 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, default_version = None): lines = [ + """load("@bazel_skylib//lib:selects.bzl", "selects")""", """package(default_visibility = ["//visibility:public"])""", ] diff --git a/python/private/text_util.bzl b/python/private/text_util.bzl index 78f62be1aa..dade9cba9b 100644 --- a/python/private/text_util.bzl +++ b/python/private/text_util.bzl @@ -35,18 +35,18 @@ def _render_alias(name, actual, *, visibility = None): ")", ]) -def _render_dict(d, *, value_repr = repr): +def _render_dict(d, *, key_repr = repr, value_repr = repr): return "\n".join([ "{", _indent("\n".join([ - "{}: {},".format(repr(k), value_repr(v)) + "{}: {},".format(key_repr(k), value_repr(v)) for k, v in d.items() ])), "}", ]) -def _render_select(selects, *, no_match_error = None, value_repr = repr): - dict_str = _render_dict(selects, value_repr = value_repr) + "," +def _render_select(selects, *, no_match_error = None, key_repr = repr, value_repr = repr, name = "select"): + dict_str = _render_dict(selects, key_repr = key_repr, value_repr = value_repr) + "," if no_match_error: args = "\n".join([ @@ -62,7 +62,7 @@ def _render_select(selects, *, no_match_error = None, value_repr = repr): "", ]) - return "select({})".format(args) + return "{}({})".format(name, args) def _render_list(items): if not items: @@ -80,10 +80,27 @@ def _render_list(items): "]", ]) +def _render_tuple(items, *, value_repr = repr): + if not items: + return "tuple()" + + if len(items) == 1: + return "({},)".format(value_repr(items[0])) + + return "\n".join([ + "(", + _indent("\n".join([ + "{},".format(value_repr(item)) + for item in items + ])), + ")", + ]) + render = struct( alias = _render_alias, dict = _render_dict, indent = _indent, list = _render_list, select = _render_select, + tuple = _render_tuple, ) diff --git a/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl b/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl index c61e5ef9b6..ddc9da7097 100644 --- a/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl +++ b/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl @@ -65,6 +65,8 @@ def _test_legacy_aliases(env): want_key = "foo/BUILD.bazel" want_content = """\ +load("@bazel_skylib//lib:selects.bzl", "selects") + package(default_visibility = ["//visibility:public"]) alias( @@ -108,6 +110,8 @@ def _test_bzlmod_aliases(env): want_key = "bar_baz/BUILD.bazel" want_content = """\ +load("@bazel_skylib//lib:selects.bzl", "selects") + package(default_visibility = ["//visibility:public"]) alias( @@ -117,40 +121,48 @@ alias( alias( name = "pkg", - actual = select( + actual = selects.with_or( { - "//:my_config_setting": "@pypi_32_bar_baz//:pkg", - "//conditions:default": "@pypi_32_bar_baz//:pkg", + ( + "//:my_config_setting", + "//conditions:default", + ): "@pypi_32_bar_baz//:pkg", }, ), ) alias( name = "whl", - actual = select( + actual = selects.with_or( { - "//:my_config_setting": "@pypi_32_bar_baz//:whl", - "//conditions:default": "@pypi_32_bar_baz//:whl", + ( + "//:my_config_setting", + "//conditions:default", + ): "@pypi_32_bar_baz//:whl", }, ), ) alias( name = "data", - actual = select( + actual = selects.with_or( { - "//:my_config_setting": "@pypi_32_bar_baz//:data", - "//conditions:default": "@pypi_32_bar_baz//:data", + ( + "//:my_config_setting", + "//conditions:default", + ): "@pypi_32_bar_baz//:data", }, ), ) alias( name = "dist_info", - actual = select( + actual = selects.with_or( { - "//:my_config_setting": "@pypi_32_bar_baz//:dist_info", - "//conditions:default": "@pypi_32_bar_baz//:dist_info", + ( + "//:my_config_setting", + "//conditions:default", + ): "@pypi_32_bar_baz//:dist_info", }, ), )""" @@ -178,6 +190,8 @@ def _test_bzlmod_aliases_with_no_default_version(env): want_key = "bar_baz/BUILD.bazel" want_content = """\ +load("@bazel_skylib//lib:selects.bzl", "selects") + package(default_visibility = ["//visibility:public"]) _NO_MATCH_ERROR = \"\"\"\\ @@ -206,7 +220,7 @@ alias( alias( name = "pkg", - actual = select( + actual = selects.with_or( { "@@//python/config_settings:is_python_3.1": "@pypi_31_bar_baz//:pkg", "@@//python/config_settings:is_python_3.2": "@pypi_32_bar_baz//:pkg", @@ -217,7 +231,7 @@ alias( alias( name = "whl", - actual = select( + actual = selects.with_or( { "@@//python/config_settings:is_python_3.1": "@pypi_31_bar_baz//:whl", "@@//python/config_settings:is_python_3.2": "@pypi_32_bar_baz//:whl", @@ -228,7 +242,7 @@ alias( alias( name = "data", - actual = select( + actual = selects.with_or( { "@@//python/config_settings:is_python_3.1": "@pypi_31_bar_baz//:data", "@@//python/config_settings:is_python_3.2": "@pypi_32_bar_baz//:data", @@ -239,7 +253,7 @@ alias( alias( name = "dist_info", - actual = select( + actual = selects.with_or( { "@@//python/config_settings:is_python_3.1": "@pypi_31_bar_baz//:dist_info", "@@//python/config_settings:is_python_3.2": "@pypi_32_bar_baz//:dist_info", @@ -273,6 +287,8 @@ def _test_bzlmod_aliases_for_non_root_modules(env): want_key = "bar_baz/BUILD.bazel" want_content = """\ +load("@bazel_skylib//lib:selects.bzl", "selects") + package(default_visibility = ["//visibility:public"]) _NO_MATCH_ERROR = \"\"\"\\ @@ -301,7 +317,7 @@ alias( alias( name = "pkg", - actual = select( + actual = selects.with_or( { "@@//python/config_settings:is_python_3.1": "@pypi_31_bar_baz//:pkg", "@@//python/config_settings:is_python_3.2": "@pypi_32_bar_baz//:pkg", @@ -312,7 +328,7 @@ alias( alias( name = "whl", - actual = select( + actual = selects.with_or( { "@@//python/config_settings:is_python_3.1": "@pypi_31_bar_baz//:whl", "@@//python/config_settings:is_python_3.2": "@pypi_32_bar_baz//:whl", @@ -323,7 +339,7 @@ alias( alias( name = "data", - actual = select( + actual = selects.with_or( { "@@//python/config_settings:is_python_3.1": "@pypi_31_bar_baz//:data", "@@//python/config_settings:is_python_3.2": "@pypi_32_bar_baz//:data", @@ -334,7 +350,7 @@ alias( alias( name = "dist_info", - actual = select( + actual = selects.with_or( { "@@//python/config_settings:is_python_3.1": "@pypi_31_bar_baz//:dist_info", "@@//python/config_settings:is_python_3.2": "@pypi_32_bar_baz//:dist_info", diff --git a/tests/private/text_util/render_tests.bzl b/tests/private/text_util/render_tests.bzl index 7c3dddfc7f..14967a9eab 100644 --- a/tests/private/text_util/render_tests.bzl +++ b/tests/private/text_util/render_tests.bzl @@ -54,6 +54,25 @@ def _test_render_alias(env): _tests.append(_test_render_alias) +def _test_render_tuple_dict(env): + got = render.dict( + { + ("foo", "bar"): "baz", + ("foo",): "bar", + }, + key_repr = render.tuple, + ) + env.expect.that_str(got).equals("""\ +{ + ( + "foo", + "bar", + ): "baz", + ("foo",): "bar", +}""") + +_tests.append(_test_render_tuple_dict) + def render_test_suite(name): """Create the test suite. From e3d2dada0f512741f2c11ba9b1fb20c7c50fedd0 Mon Sep 17 00:00:00 2001 From: Martin Medler <36563496+martis42@users.noreply.github.com> Date: Mon, 29 Apr 2024 19:33:58 +0200 Subject: [PATCH 012/345] deps: load cc symbols from @rules_cc (#1852) Adds dependency on rules_cc 0.0.9 for both bzlmod and workspace This elevates rules_cc from a dev dependency to a full dependency of rules_python. Work towards incompatible_stop_exporting_language_modules, see https://github.com/bazelbuild/bazel/issues/19455 --- .gitignore | 3 +++ CHANGELOG.md | 1 + MODULE.bazel | 2 +- internal_deps.bzl | 7 +++++++ python/private/BUILD.bazel | 8 ++++++++ python/private/common/BUILD.bazel | 4 ++++ python/private/common/attributes.bzl | 5 ++--- python/private/common/common_bazel.bzl | 13 ++++--------- python/private/common/providers.bzl | 6 ++---- python/private/common/py_executable.bzl | 10 ++++------ python/private/current_py_cc_headers.bzl | 2 ++ python/private/current_py_cc_libs.bzl | 2 ++ python/private/py_cc_toolchain_rule.bzl | 1 + python/repositories.bzl | 6 ++++++ .../current_py_cc_headers_tests.bzl | 1 + .../current_py_cc_libs/current_py_cc_libs_tests.bzl | 1 + tests/cc/fake_cc_toolchain_config.bzl | 2 ++ 17 files changed, 51 insertions(+), 23 deletions(-) diff --git a/.gitignore b/.gitignore index 6da16fe456..863b0e9c3f 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,9 @@ user.bazelrc *.swp *.swo +# CLion +.clwb + # Python cache **/__pycache__/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c2b388f1a..b481832c4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,6 +73,7 @@ A brief description of the categories of changes: the whl and sdist files will be written to the lock file. Controlling whether the downloading of metadata is done in parallel can be done using `parallel_download` attribute. +* (deps): `rules_python` depends now on `rules_cc` 0.0.9 [0.XX.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.XX.0 [python_default_visibility]: gazelle/README.md#directive-python_default_visibility diff --git a/MODULE.bazel b/MODULE.bazel index c7d5e23d0b..2c325a6ef8 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -6,6 +6,7 @@ module( bazel_dep(name = "bazel_features", version = "1.9.1") bazel_dep(name = "bazel_skylib", version = "1.3.0") +bazel_dep(name = "rules_cc", version = "0.0.9") bazel_dep(name = "platforms", version = "0.0.4") # Those are loaded only when using py_proto_library @@ -71,7 +72,6 @@ use_repo(pip, "rules_python_publish_deps") bazel_dep(name = "stardoc", version = "0.6.2", dev_dependency = True, repo_name = "io_bazel_stardoc") bazel_dep(name = "rules_bazel_integration_test", version = "0.20.0", dev_dependency = True) bazel_dep(name = "rules_testing", version = "0.6.0", dev_dependency = True) -bazel_dep(name = "rules_cc", version = "0.0.9", 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. diff --git a/internal_deps.bzl b/internal_deps.bzl index a8bfd471dd..8818751644 100644 --- a/internal_deps.bzl +++ b/internal_deps.bzl @@ -217,3 +217,10 @@ def rules_python_internal_deps(): strip_prefix = "bazel_features-1.9.1", url = "https://github.com/bazel-contrib/bazel_features/releases/download/v1.9.1/bazel_features-v1.9.1.tar.gz", ) + + 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"], + ) diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index b105c470aa..f1928e2441 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -143,6 +143,7 @@ bzl_library( ], deps = [ ":py_cc_toolchain_info_bzl", + ":rules_cc_srcs_bzl", ":util_bzl", ], ) @@ -293,6 +294,13 @@ bzl_library( ], ) +# @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"], +) + # Needed to define bzl_library targets for docgen. (We don't define the # bzl_library target here because it'd give our users a transitive dependency # on Skylib.) diff --git a/python/private/common/BUILD.bazel b/python/private/common/BUILD.bazel index 4d329bb192..2f0683bf1b 100644 --- a/python/private/common/BUILD.bazel +++ b/python/private/common/BUILD.bazel @@ -21,6 +21,7 @@ package( bzl_library( name = "attributes_bazel_bzl", srcs = ["attributes_bazel.bzl"], + deps = ["//python/private:rules_cc_srcs_bzl"], ) bzl_library( @@ -61,6 +62,7 @@ bzl_library( ":py_internal_bzl", ":semantics_bzl", "//python/private:reexports_bzl", + "//python/private:rules_cc_srcs_bzl", ], ) @@ -74,6 +76,7 @@ bzl_library( srcs = ["providers.bzl"], deps = [ ":semantics_bzl", + "//python/private:rules_cc_srcs_bzl", "//python/private:util_bzl", ], ) @@ -121,6 +124,7 @@ bzl_library( ":common_bzl", ":providers_bzl", ":py_internal_bzl", + "//python/private:rules_cc_srcs_bzl", "@bazel_skylib//lib:dicts", ], ) diff --git a/python/private/common/attributes.bzl b/python/private/common/attributes.bzl index 5ddca72a65..d4f853247f 100644 --- a/python/private/common/attributes.bzl +++ b/python/private/common/attributes.bzl @@ -13,6 +13,7 @@ # limitations under the License. """Attributes for Python rules.""" +load("@rules_cc//cc:defs.bzl", "CcInfo") load("//python/private:reexports.bzl", "BuiltinPyInfo") load(":common.bzl", "union_attrs") load(":providers.bzl", "PyInfo") @@ -23,8 +24,6 @@ load( "SRCS_ATTR_ALLOW_FILES", ) -# TODO: Load CcInfo from rules_cc -_CcInfo = CcInfo _PackageSpecificationInfo = getattr(py_internal, "PackageSpecificationInfo", None) _STAMP_VALUES = [-1, 0, 1] @@ -166,7 +165,7 @@ PY_SRCS_ATTRS = union_attrs( "deps": attr.label_list( providers = [ [PyInfo], - [_CcInfo], + [CcInfo], [BuiltinPyInfo], ], # TODO(b/228692666): Google-specific; remove these allowances once diff --git a/python/private/common/common_bazel.bzl b/python/private/common/common_bazel.bzl index 7277337849..a03721334d 100644 --- a/python/private/common/common_bazel.bzl +++ b/python/private/common/common_bazel.bzl @@ -14,16 +14,11 @@ """Common functions that are specific to Bazel rule implementation""" load("@bazel_skylib//lib:paths.bzl", "paths") +load("@rules_cc//cc:defs.bzl", "CcInfo", "cc_common") load(":common.bzl", "is_bool") load(":providers.bzl", "PyCcLinkParamsProvider") load(":py_internal.bzl", "py_internal") -# TODO: Load cc_common from rules_cc -_cc_common = cc_common - -# TODO: Load CcInfo from rules_cc -_CcInfo = CcInfo - _py_builtins = py_internal def collect_cc_info(ctx, extra_deps = []): @@ -42,13 +37,13 @@ def collect_cc_info(ctx, extra_deps = []): deps.extend(extra_deps) cc_infos = [] for dep in deps: - if _CcInfo in dep: - cc_infos.append(dep[_CcInfo]) + if CcInfo in dep: + cc_infos.append(dep[CcInfo]) if PyCcLinkParamsProvider in dep: cc_infos.append(dep[PyCcLinkParamsProvider].cc_info) - return _cc_common.merge_cc_infos(cc_infos = cc_infos) + return cc_common.merge_cc_infos(cc_infos = cc_infos) def maybe_precompile(ctx, srcs): """Computes all the outputs (maybe precompiled) from the input srcs. diff --git a/python/private/common/providers.bzl b/python/private/common/providers.bzl index f36a2d12c1..0b43413dc0 100644 --- a/python/private/common/providers.bzl +++ b/python/private/common/providers.bzl @@ -13,11 +13,9 @@ # limitations under the License. """Providers for Python rules.""" +load("@rules_cc//cc:defs.bzl", "CcInfo") load("//python/private:util.bzl", "IS_BAZEL_6_OR_HIGHER") -# TODO: load CcInfo from rules_cc -_CcInfo = CcInfo - DEFAULT_STUB_SHEBANG = "#!/usr/bin/env python3" DEFAULT_BOOTSTRAP_TEMPLATE = Label("//python/private:python_bootstrap_template.txt") @@ -241,7 +239,7 @@ This field is currently unused in Bazel and may go away in the future. def _PyCcLinkParamsProvider_init(cc_info): return { - "cc_info": _CcInfo(linking_context = cc_info.linking_context), + "cc_info": CcInfo(linking_context = cc_info.linking_context), } # buildifier: disable=name-conventions diff --git a/python/private/common/py_executable.bzl b/python/private/common/py_executable.bzl index df739273e4..03608930f0 100644 --- a/python/private/common/py_executable.bzl +++ b/python/private/common/py_executable.bzl @@ -14,6 +14,7 @@ """Common functionality between test/binary executables.""" load("@bazel_skylib//lib:dicts.bzl", "dicts") +load("@rules_cc//cc:defs.bzl", "cc_common") load("//python/private:reexports.bzl", "BuiltinPyRuntimeInfo") load( ":attributes.bzl", @@ -53,9 +54,6 @@ load( "PY_RUNTIME_ATTR_NAME", ) -# TODO: Load cc_common from rules_cc -_cc_common = cc_common - _py_builtins = py_internal # Bazel 5.4 doesn't have config_common.toolchain_type @@ -559,10 +557,10 @@ def _create_shared_native_deps_dso( linkstamps = py_internal.linking_context_linkstamps(cc_info.linking_context) partially_disabled_thin_lto = ( - _cc_common.is_enabled( + cc_common.is_enabled( feature_name = "thin_lto_linkstatic_tests_use_shared_nonlto_backends", feature_configuration = feature_configuration, - ) and not _cc_common.is_enabled( + ) and not cc_common.is_enabled( feature_name = "thin_lto_all_linkstatic_use_shared_nonlto_backends", feature_configuration = feature_configuration, ) @@ -876,7 +874,7 @@ def cc_configure_features(ctx, *, cc_toolchain, extra_features): requested_features.extend(ctx.features) if "legacy_whole_archive" not in ctx.disabled_features: requested_features.append("legacy_whole_archive") - feature_configuration = _cc_common.configure_features( + feature_configuration = cc_common.configure_features( ctx = ctx, cc_toolchain = cc_toolchain, requested_features = requested_features, diff --git a/python/private/current_py_cc_headers.bzl b/python/private/current_py_cc_headers.bzl index be7f8f8d46..e72199efcd 100644 --- a/python/private/current_py_cc_headers.bzl +++ b/python/private/current_py_cc_headers.bzl @@ -14,6 +14,8 @@ """Implementation of current_py_cc_headers rule.""" +load("@rules_cc//cc:defs.bzl", "CcInfo") + def _current_py_cc_headers_impl(ctx): py_cc_toolchain = ctx.toolchains["//python/cc:toolchain_type"].py_cc_toolchain return py_cc_toolchain.headers.providers_map.values() diff --git a/python/private/current_py_cc_libs.bzl b/python/private/current_py_cc_libs.bzl index 863e59a927..d66c401863 100644 --- a/python/private/current_py_cc_libs.bzl +++ b/python/private/current_py_cc_libs.bzl @@ -14,6 +14,8 @@ """Implementation of current_py_cc_libs rule.""" +load("@rules_cc//cc:defs.bzl", "CcInfo") + def _current_py_cc_libs_impl(ctx): py_cc_toolchain = ctx.toolchains["//python/cc:toolchain_type"].py_cc_toolchain return py_cc_toolchain.libs.providers_map.values() diff --git a/python/private/py_cc_toolchain_rule.bzl b/python/private/py_cc_toolchain_rule.bzl index abb3fb6e9f..5d3debb702 100644 --- a/python/private/py_cc_toolchain_rule.bzl +++ b/python/private/py_cc_toolchain_rule.bzl @@ -18,6 +18,7 @@ NOTE: This is a beta-quality feature. APIs subject to change until https://github.com/bazelbuild/rules_python/issues/824 is considered done. """ +load("@rules_cc//cc:defs.bzl", "CcInfo") load(":py_cc_toolchain_info.bzl", "PyCcToolchainInfo") def _py_cc_toolchain_impl(ctx): diff --git a/python/repositories.bzl b/python/repositories.bzl index aab68eb086..f77d302ca6 100644 --- a/python/repositories.bzl +++ b/python/repositories.bzl @@ -62,6 +62,12 @@ def py_repositories(): "https://github.com/bazelbuild/bazel-skylib/releases/download/1.3.0/bazel-skylib-1.3.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", + ) pip_install_dependencies() ######## 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 931a9c1e64..9aeec38698 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,6 +14,7 @@ """Tests for current_py_cc_headers.""" +load("@rules_cc//cc:defs.bzl", "CcInfo") load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite") load("@rules_testing//lib:truth.bzl", "matching") load("//tests:cc_info_subject.bzl", "cc_info_subject") 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 5699b75cc1..44615eeb4b 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,6 +14,7 @@ """Tests for current_py_cc_libs.""" +load("@rules_cc//cc:defs.bzl", "CcInfo") load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite") load("@rules_testing//lib:truth.bzl", "matching") load("//tests:cc_info_subject.bzl", "cc_info_subject") diff --git a/tests/cc/fake_cc_toolchain_config.bzl b/tests/cc/fake_cc_toolchain_config.bzl index b3214a61ba..a2ad615e6e 100644 --- a/tests/cc/fake_cc_toolchain_config.bzl +++ b/tests/cc/fake_cc_toolchain_config.bzl @@ -14,6 +14,8 @@ """Fake for providing CcToolchainConfigInfo.""" +load("@rules_cc//cc:defs.bzl", "cc_common") + def _impl(ctx): return cc_common.create_cc_toolchain_config_info( ctx = ctx, From d3cec48e415dd598a773335532cbc5647c985a93 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Tue, 30 Apr 2024 10:29:18 +0900 Subject: [PATCH 013/345] feat(pip_parse): support referencing dependencies to packages via hub (#1856) With this change we can in theory have multi-platform libraries in the dependency cycle and use the pip hub repo for the dependencies. With this we can also make the contents of `whl_library` not depend on what platform the actual dependencies are. This allows us to support the following topologies: * A platform-specific wheel depends on cross-platform wheel. * A cross-platform wheel depends on cross-platform wheel. * A whl_library can have `select` dependencies based on the interpreter version, e.g. pull in a `tomli` dependency only when the Python interpreter is less than 3.11. Relates to #1663. Work towards #735. --- CHANGELOG.md | 7 ++ python/pip_install/pip_repository.bzl | 32 +++++- .../pip_repository_requirements.bzl.tmpl | 7 +- .../generate_group_library_build_bazel.bzl | 46 +++++--- .../generate_whl_library_build_bazel.bzl | 31 ++++-- python/private/BUILD.bazel | 1 + python/private/bzlmod/pip.bzl | 23 ++-- python/private/bzlmod/pip_repository.bzl | 4 + python/private/render_pkg_aliases.bzl | 75 +++++++++++-- .../render_pkg_aliases_test.bzl | 44 ++++++++ .../generate_build_bazel_tests.bzl | 59 ++++++++-- .../generate_build_bazel_tests.bzl | 102 +++++++++++++++++- 12 files changed, 366 insertions(+), 65 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b481832c4c..415b936e8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -74,6 +74,13 @@ A brief description of the categories of changes: the downloading of metadata is done in parallel can be done using `parallel_download` attribute. * (deps): `rules_python` depends now on `rules_cc` 0.0.9 +* (pip_parse): A new flag `use_hub_alias_dependencies` has been added that is going + to become default in the next release. This makes use of `dep_template` flag + in the `whl_library` rule. This also affects the + `experimental_requirement_cycles` feature where the dependencies that are in + a group would be only accessible via the hub repo aliases. If you still + depend on legacy labels instead of the hub repo aliases and you use the + `experimental_requirement_cycles`, now is a good time to migrate. [0.XX.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.XX.0 [python_default_visibility]: gazelle/README.md#directive-python_default_visibility diff --git a/python/pip_install/pip_repository.bzl b/python/pip_install/pip_repository.bzl index 55d61fcea0..db6736836f 100644 --- a/python/pip_install/pip_repository.bzl +++ b/python/pip_install/pip_repository.bzl @@ -365,9 +365,12 @@ def _pip_repository_impl(rctx): "python_interpreter": _get_python_interpreter_attr(rctx), "quiet": rctx.attr.quiet, "repo": rctx.attr.name, - "repo_prefix": "{}_".format(rctx.attr.name), "timeout": rctx.attr.timeout, } + if rctx.attr.use_hub_alias_dependencies: + config["dep_template"] = "@{}//{{name}}:{{target}}".format(rctx.attr.name) + else: + config["repo_prefix"] = "{}_".format(rctx.attr.name) if rctx.attr.python_interpreter_target: config["python_interpreter_target"] = str(rctx.attr.python_interpreter_target) @@ -387,6 +390,13 @@ def _pip_repository_impl(rctx): rctx.file("BUILD.bazel", _BUILD_FILE_CONTENTS) rctx.template("requirements.bzl", rctx.attr._template, substitutions = { + " # %%GROUP_LIBRARY%%": """\ + group_repo = "{name}__groups" + group_library( + name = group_repo, + repo_prefix = "{name}_", + groups = all_requirement_groups, + )""".format(name = rctx.attr.name) if not rctx.attr.use_hub_alias_dependencies else "", "%%ALL_DATA_REQUIREMENTS%%": _format_repr_list([ macro_tmpl.format(p, "data") for p in bzl_packages @@ -595,6 +605,8 @@ python_interpreter. An example value: "@python3_x86_64-unknown-linux-gnu//:pytho "repo_prefix": attr.string( doc = """ Prefix for the generated packages will be of the form `@//...` + +DEPRECATED. Only left for people who vendor requirements.bzl. """, ), # 600 is documented as default here: https://docs.bazel.build/versions/master/skylark/lib/repository_ctx.html#execute @@ -637,6 +649,15 @@ attributes. allow_single_file = True, doc = "Override the requirements_lock attribute when the host platform is Windows", ), + "use_hub_alias_dependencies": attr.bool( + default = False, + doc = """\ +Controls if the hub alias dependencies are used. If set to true, then the +group_library will be included in the hub repo. + +True will become default in a subsequent release. +""", + ), "_template": attr.label( default = ":pip_repository_requirements.bzl.tmpl", ), @@ -886,7 +907,7 @@ def _whl_library_impl(rctx): entry_points[entry_point_without_py] = entry_point_script_name build_file_contents = generate_whl_library_build_bazel( - repo_prefix = rctx.attr.repo_prefix, + 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"], @@ -941,6 +962,13 @@ whl_library_attrs = dict({ ), allow_files = True, ), + "dep_template": attr.string( + doc = """ +The dep template to use for referencing the dependencies. It should have `{name}` +and `{target}` tokens that will be replaced with the normalized distribution name +and the target that we need respectively. +""", + ), "filename": attr.string( doc = "Download the whl file to this filename. Only used when the `urls` is passed. If not specified, will be auto-detected from the `urls`.", ), diff --git a/python/pip_install/pip_repository_requirements.bzl.tmpl b/python/pip_install/pip_repository_requirements.bzl.tmpl index 2b88f5c41a..8e17720374 100644 --- a/python/pip_install/pip_repository_requirements.bzl.tmpl +++ b/python/pip_install/pip_repository_requirements.bzl.tmpl @@ -58,12 +58,7 @@ def install_deps(**whl_library_kwargs): for requirement in group_requirements } - group_repo = "%%NAME%%__groups" - group_library( - name = group_repo, - repo_prefix = "%%NAME%%_", - groups = all_requirement_groups, - ) + # %%GROUP_LIBRARY%% # Install wheels which may be participants in a group whl_config = dict(_config) diff --git a/python/pip_install/private/generate_group_library_build_bazel.bzl b/python/pip_install/private/generate_group_library_build_bazel.bzl index c122b04781..5fa93e22b7 100644 --- a/python/pip_install/private/generate_group_library_build_bazel.bzl +++ b/python/pip_install/private/generate_group_library_build_bazel.bzl @@ -22,9 +22,10 @@ load( "WHEEL_FILE_PUBLIC_LABEL", ) load("//python/private:normalize_name.bzl", "normalize_name") +load("//python/private:text_util.bzl", "render") _PRELUDE = """\ -load("@rules_python//python:defs.bzl", "py_library", "py_binary") +load("@rules_python//python:defs.bzl", "py_library") """ _GROUP_TEMPLATE = """\ @@ -62,26 +63,39 @@ def _generate_group_libraries(repo_prefix, group_name, group_members): which make up the group. """ - lib_dependencies = [ - "@%s%s//:%s" % (repo_prefix, normalize_name(d), PY_LIBRARY_IMPL_LABEL) - for d in group_members - ] - whl_file_deps = [ - "@%s%s//:%s" % (repo_prefix, normalize_name(d), WHEEL_FILE_IMPL_LABEL) - for d in group_members - ] - visibility = [ - "@%s%s//:__pkg__" % (repo_prefix, normalize_name(d)) - for d in group_members - ] + group_members = sorted(group_members) + + if repo_prefix: + lib_dependencies = [ + "@%s%s//:%s" % (repo_prefix, normalize_name(d), PY_LIBRARY_IMPL_LABEL) + for d in group_members + ] + whl_file_deps = [ + "@%s%s//:%s" % (repo_prefix, normalize_name(d), WHEEL_FILE_IMPL_LABEL) + for d in group_members + ] + visibility = [ + "@%s%s//:__pkg__" % (repo_prefix, normalize_name(d)) + for d in group_members + ] + else: + lib_dependencies = [ + "//%s:%s" % (normalize_name(d), PY_LIBRARY_IMPL_LABEL) + for d in group_members + ] + whl_file_deps = [ + "//%s:%s" % (normalize_name(d), WHEEL_FILE_IMPL_LABEL) + for d in group_members + ] + visibility = ["//:__subpackages__"] return _GROUP_TEMPLATE.format( name = normalize_name(group_name), whl_public_label = WHEEL_FILE_PUBLIC_LABEL, - whl_deps = repr(whl_file_deps), + whl_deps = render.indent(render.list(whl_file_deps)).lstrip(), lib_public_label = PY_LIBRARY_PUBLIC_LABEL, - lib_deps = repr(lib_dependencies), - visibility = repr(visibility), + lib_deps = render.indent(render.list(lib_dependencies)).lstrip(), + visibility = render.indent(render.list(visibility)).lstrip(), ) def generate_group_library_build_bazel( diff --git a/python/pip_install/private/generate_whl_library_build_bazel.bzl b/python/pip_install/private/generate_whl_library_build_bazel.bzl index b1219096ba..8010ccbad8 100644 --- a/python/pip_install/private/generate_whl_library_build_bazel.bzl +++ b/python/pip_install/private/generate_whl_library_build_bazel.bzl @@ -213,7 +213,7 @@ selects.config_setting_group( def generate_whl_library_build_bazel( *, - repo_prefix, + dep_template, whl_name, dependencies, dependencies_by_platform, @@ -226,7 +226,7 @@ def generate_whl_library_build_bazel( """Generate a BUILD file for an unzipped Wheel Args: - repo_prefix: the repo prefix that should be used for dependency lists. + 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. @@ -328,38 +328,49 @@ def generate_whl_library_build_bazel( lib_dependencies = _render_list_and_select( deps = dependencies, deps_by_platform = dependencies_by_platform, - tmpl = "@{}{{}}//:{}".format(repo_prefix, PY_LIBRARY_PUBLIC_LABEL), + 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 = "@{}{{}}//:{}".format(repo_prefix, WHEEL_FILE_PUBLIC_LABEL), + 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: - group_repo = repo_prefix + "_groups" - label_tmpl = "\"@{}//:{}_{{}}\"".format(group_repo, normalize_name(group_name)) - impl_vis = ["@{}//:__pkg__".format(group_repo)] + 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 = label_tmpl.format(PY_LIBRARY_PUBLIC_LABEL), + actual = repr(label_tmpl.format(PY_LIBRARY_PUBLIC_LABEL)), ), "", render.alias( name = WHEEL_FILE_PUBLIC_LABEL, - actual = label_tmpl.format(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 diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index f1928e2441..fdbd20b896 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -227,6 +227,7 @@ bzl_library( ":normalize_name_bzl", ":text_util_bzl", ":version_label_bzl", + "//python/pip_install/private:generate_group_library_build_bazel_bzl", ], ) diff --git a/python/private/bzlmod/pip.bzl b/python/private/bzlmod/pip.bzl index 3d5c0f5a86..ce681259ed 100644 --- a/python/private/bzlmod/pip.bzl +++ b/python/private/bzlmod/pip.bzl @@ -18,7 +18,6 @@ load("@bazel_features//:features.bzl", "bazel_features") load("@pythons_hub//:interpreters.bzl", "DEFAULT_PYTHON_VERSION", "INTERPRETER_LABELS") load( "//python/pip_install:pip_repository.bzl", - "group_library", "locked_requirements_label", "pip_repository_attrs", "use_isolated", @@ -101,7 +100,7 @@ You cannot use both the additive_build_content and additive_build_content_file a whl_mods = whl_mods, ) -def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, simpleapi_cache): +def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, simpleapi_cache): python_interpreter_target = pip_attr.python_interpreter_target # if we do not have the python_interpreter set in the attributes @@ -129,6 +128,7 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, simpleapi_ca hub_name, version_label(pip_attr.python_version), ) + major_minor = _major_minor_version(pip_attr.python_version) requirements_lock = locked_requirements_label(module_ctx, pip_attr) @@ -171,12 +171,11 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, simpleapi_ca for whl_name in group_whls } - group_repo = "%s__groups" % (pip_name,) - group_library( - name = group_repo, - repo_prefix = pip_name + "_", - groups = pip_attr.experimental_requirement_cycles, - ) + # 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 = {} @@ -202,8 +201,6 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, simpleapi_ca parallel_download = pip_attr.parallel_download, ) - major_minor = _major_minor_version(pip_attr.python_version) - # Create a new wheel library for each of the different whls for whl_name, requirement_line in requirements: # We are not using the "sanitized name" because the user @@ -220,7 +217,7 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, simpleapi_ca repo_name = "{}_{}".format(pip_name, whl_name) whl_library_args = dict( repo = pip_name, - repo_prefix = pip_name + "_", + dep_template = "@{}//{{name}}:{{target}}".format(hub_name), requirement = requirement_line, ) maybe_args = dict( @@ -422,6 +419,7 @@ def _pip_impl(module_ctx): # dict[hub, dict[whl, dict[version, str pip]]] # Where hub, whl, and pip are the repo names hub_whl_map = {} + hub_group_map = {} simpleapi_cache = {} @@ -460,7 +458,7 @@ def _pip_impl(module_ctx): else: pip_hub_map[pip_attr.hub_name].python_versions.append(pip_attr.python_version) - _create_whl_repos(module_ctx, pip_attr, hub_whl_map, whl_overrides, simpleapi_cache) + _create_whl_repos(module_ctx, pip_attr, hub_whl_map, whl_overrides, hub_group_map, simpleapi_cache) for hub_name, whl_map in hub_whl_map.items(): pip_repository( @@ -471,6 +469,7 @@ def _pip_impl(module_ctx): for key, value in whl_map.items() }, default_version = _major_minor_version(DEFAULT_PYTHON_VERSION), + groups = hub_group_map.get(hub_name), ) def _pip_parse_ext_attrs(): diff --git a/python/private/bzlmod/pip_repository.bzl b/python/private/bzlmod/pip_repository.bzl index d96131dad7..3a09766f65 100644 --- a/python/private/bzlmod/pip_repository.bzl +++ b/python/private/bzlmod/pip_repository.bzl @@ -32,6 +32,7 @@ def _pip_repository_impl(rctx): for key, values in rctx.attr.whl_map.items() }, default_version = rctx.attr.default_version, + requirement_cycles = rctx.attr.groups, ) for path, contents in aliases.items(): rctx.file(path, contents) @@ -68,6 +69,9 @@ This is the default python version in the format of X.Y. This should match what is setup by the 'python' extension using the 'is_default = True' setting.""", ), + "groups": attr.string_list_dict( + mandatory = False, + ), "repo_name": attr.string( mandatory = True, doc = "The apparent name of the repo. This is needed because in bzlmod, the name attribute becomes the canonical name.", diff --git a/python/private/render_pkg_aliases.bzl b/python/private/render_pkg_aliases.bzl index 5851baf570..bc1bab2049 100644 --- a/python/private/render_pkg_aliases.bzl +++ b/python/private/render_pkg_aliases.bzl @@ -16,6 +16,19 @@ This is used in bzlmod and non-bzlmod setups.""" +load( + "//python/pip_install/private: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(":normalize_name.bzl", "normalize_name") load(":text_util.bzl", "render") @@ -43,13 +56,18 @@ def _render_whl_library_alias( name, default_version, 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 = name)), + actual = repr("@{repo}//:{name}".format( + repo = alias.repo, + name = target_name, + )), + **kwargs ) # Create the alias repositories which contains different select @@ -58,7 +76,7 @@ def _render_whl_library_alias( 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 = name) + actual = "@{repo}//:{name}".format(repo = alias.repo, name = target_name) selects.setdefault(actual, []).append(alias.config_setting) if alias.version == default_version: selects[actual].append("//conditions:default") @@ -84,7 +102,7 @@ def _render_whl_library_alias( **kwargs ) -def _render_common_aliases(*, name, aliases, default_version = None): +def _render_common_aliases(*, name, aliases, default_version = None, group_name = None): lines = [ """load("@bazel_skylib//lib:selects.bzl", "selects")""", """package(default_visibility = ["//visibility:public"])""", @@ -119,17 +137,37 @@ def _render_common_aliases(*, name, aliases, default_version = None): lines.extend( [ _render_whl_library_alias( - name = target, + name = name, default_version = default_version, aliases = aliases, + target_name = target_name, + visibility = ["//_groups:__subpackages__"] if name.startswith("_") else None, ) - for target in ["pkg", "whl", "data", "dist_info"] + 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)), + ), + ], + ) return "\n\n".join(lines) -def render_pkg_aliases(*, aliases, default_version = None): +def render_pkg_aliases(*, aliases, default_version = None, requirement_cycles = None): """Create alias declarations for each PyPI package. The aliases should be appended to the pip_repository BUILD.bazel file. These aliases @@ -140,6 +178,7 @@ def render_pkg_aliases(*, aliases, default_version = None): aliases: dict, the keys are normalized distribution names and values are the whl_alias instances. default_version: the default version to be used for the aliases. + requirement_cycles: any package groups to also add. Returns: A dict of file paths and their contents. @@ -150,16 +189,33 @@ def render_pkg_aliases(*, aliases, default_version = None): elif type(aliases) != type({}): fail("The aliases need to be provided as a dict, got: {}".format(type(aliases))) - return { + whl_group_mapping = {} + if requirement_cycles: + requirement_cycles = { + name: [normalize_name(whl_name) for whl_name in whls] + for name, whls in requirement_cycles.items() + } + + whl_group_mapping = { + whl_name: group_name + for group_name, group_whls in requirement_cycles.items() + for whl_name in group_whls + } + + files = { "{}/BUILD.bazel".format(normalize_name(name)): _render_common_aliases( name = normalize_name(name), aliases = pkg_aliases, default_version = default_version, + group_name = whl_group_mapping.get(normalize_name(name)), ).strip() for name, pkg_aliases in aliases.items() } + if requirement_cycles: + files["_groups/BUILD.bazel"] = generate_group_library_build_bazel("", requirement_cycles) + return files -def whl_alias(*, repo, version = None, config_setting = None): +def whl_alias(*, repo, version = None, config_setting = None, extra_targets = None): """The bzl_packages value used by by the render_pkg_aliases function. This contains the minimum amount of information required to generate correct @@ -173,6 +229,8 @@ def whl_alias(*, repo, version = None, config_setting = None): is no match found during a select. config_setting: optional(Label or str), the config setting that we should use. Defaults to "@rules_python//python/config_settings:is_python_{version}". + extra_targets: optional(list[str]), the extra targets that we need to create + aliases for. Returns: a struct with the validated and parsed values. @@ -188,4 +246,5 @@ def whl_alias(*, repo, version = None, config_setting = None): repo = repo, version = version, config_setting = config_setting, + extra_targets = extra_targets or [], ) diff --git a/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl b/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl index ddc9da7097..a38d657962 100644 --- a/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl +++ b/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl @@ -388,6 +388,50 @@ def _test_aliases_are_created_for_all_wheels(env): _tests.append(_test_aliases_are_created_for_all_wheels) +def _test_aliases_with_groups(env): + actual = render_pkg_aliases( + default_version = "3.2", + 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"), + ], + }, + requirement_cycles = { + "group": ["bar", "baz"], + }, + ) + + want_files = [ + "bar/BUILD.bazel", + "foo/BUILD.bazel", + "baz/BUILD.bazel", + "_groups/BUILD.bazel", + ] + env.expect.that_dict(actual).keys().contains_exactly(want_files) + + want_key = "_groups/BUILD.bazel" + + # Just check that it contains a private whl + env.expect.that_str(actual[want_key]).contains("//bar:_whl") + + 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\"") + +_tests.append(_test_aliases_with_groups) + def render_pkg_aliases_test_suite(name): """Create the test suite. diff --git a/tests/pip_install/group_library/generate_build_bazel_tests.bzl b/tests/pip_install/group_library/generate_build_bazel_tests.bzl index e7d6b44d3f..cf082c2990 100644 --- a/tests/pip_install/group_library/generate_build_bazel_tests.bzl +++ b/tests/pip_install/group_library/generate_build_bazel_tests.bzl @@ -21,7 +21,7 @@ _tests = [] def _test_simple(env): want = """\ -load("@rules_python//python:defs.bzl", "py_library", "py_binary") +load("@rules_python//python:defs.bzl", "py_library") ## Group vbap @@ -29,25 +29,72 @@ load("@rules_python//python:defs.bzl", "py_library", "py_binary") filegroup( name = "vbap_whl", srcs = [], - data = ["@pypi_oletools//:_whl", "@pypi_pcodedmp//:_whl"], - visibility = ["@pypi_oletools//:__pkg__", "@pypi_pcodedmp//:__pkg__"], + data = [ + "@pypi_oletools//:_whl", + "@pypi_pcodedmp//:_whl", + ], + visibility = [ + "@pypi_oletools//:__pkg__", + "@pypi_pcodedmp//:__pkg__", + ], ) py_library( name = "vbap_pkg", srcs = [], - deps = ["@pypi_oletools//:_pkg", "@pypi_pcodedmp//:_pkg"], - visibility = ["@pypi_oletools//:__pkg__", "@pypi_pcodedmp//:__pkg__"], + deps = [ + "@pypi_oletools//:_pkg", + "@pypi_pcodedmp//:_pkg", + ], + visibility = [ + "@pypi_oletools//:__pkg__", + "@pypi_pcodedmp//:__pkg__", + ], ) """ actual = generate_group_library_build_bazel( repo_prefix = "pypi_", - groups = {"vbap": ["oletools", "pcodedmp"]}, + groups = {"vbap": ["pcodedmp", "oletools"]}, ) env.expect.that_str(actual).equals(want) _tests.append(_test_simple) +def _test_in_hub(env): + want = """\ +load("@rules_python//python:defs.bzl", "py_library") + + +## Group vbap + +filegroup( + name = "vbap_whl", + srcs = [], + data = [ + "//oletools:_whl", + "//pcodedmp:_whl", + ], + visibility = ["//:__subpackages__"], +) + +py_library( + name = "vbap_pkg", + srcs = [], + deps = [ + "//oletools:_pkg", + "//pcodedmp:_pkg", + ], + visibility = ["//:__subpackages__"], +) +""" + actual = generate_group_library_build_bazel( + repo_prefix = "", + groups = {"vbap": ["pcodedmp", "oletools"]}, + ) + env.expect.that_str(actual).equals(want) + +_tests.append(_test_in_hub) + def generate_build_bazel_test_suite(name): """Create the test suite. diff --git a/tests/pip_install/whl_library/generate_build_bazel_tests.bzl b/tests/pip_install/whl_library/generate_build_bazel_tests.bzl index 11611b9a4a..66126cf6fb 100644 --- a/tests/pip_install/whl_library/generate_build_bazel_tests.bzl +++ b/tests/pip_install/whl_library/generate_build_bazel_tests.bzl @@ -71,7 +71,7 @@ py_library( ) """ actual = generate_whl_library_build_bazel( - repo_prefix = "pypi_", + dep_template = "@pypi_{name}//:{target}", whl_name = "foo.whl", dependencies = ["foo", "bar-baz"], dependencies_by_platform = {}, @@ -216,7 +216,7 @@ config_setting( ) """ actual = generate_whl_library_build_bazel( - repo_prefix = "pypi_", + dep_template = "@pypi_{name}//:{target}", whl_name = "foo.whl", dependencies = ["foo", "bar-baz"], dependencies_by_platform = { @@ -305,7 +305,7 @@ copy_file( # SOMETHING SPECIAL AT THE END """ actual = generate_whl_library_build_bazel( - repo_prefix = "pypi_", + dep_template = "@pypi_{name}//:{target}", whl_name = "foo.whl", dependencies = ["foo", "bar-baz"], dependencies_by_platform = {}, @@ -386,7 +386,7 @@ py_binary( ) """ actual = generate_whl_library_build_bazel( - repo_prefix = "pypi_", + dep_template = "@pypi_{name}//:{target}", whl_name = "foo.whl", dependencies = ["foo", "bar-baz"], dependencies_by_platform = {}, @@ -482,7 +482,7 @@ alias( ) """ actual = generate_whl_library_build_bazel( - repo_prefix = "pypi_", + dep_template = "@pypi_{name}//:{target}", whl_name = "foo.whl", dependencies = ["foo", "bar-baz", "qux"], dependencies_by_platform = { @@ -501,6 +501,98 @@ alias( _tests.append(_test_group_member) +def _test_group_member_deps_to_hub(env): + want = """\ +load("@rules_python//python:defs.bzl", "py_library", "py_binary") +load("@bazel_skylib//rules:copy_file.bzl", "copy_file") + +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) + def generate_build_bazel_test_suite(name): """Create the test suite. From a1d3c0de0ae23ee2470c512db88c46f2fd06098b Mon Sep 17 00:00:00 2001 From: Douglas Thor Date: Wed, 8 May 2024 18:33:09 -0700 Subject: [PATCH 014/345] feat(gazelle): Add "include_dep" Python comment annotation (#1863) Add a new Python comment annotation for Gazelle: `include_dep`. This annotation accepts a comma-separated string of values. Values _should_ be targets names, but no validation is done. The annotation can be added multiple times, and all values are combined and de-duplicated. For `python_generation_mode = "package"`, the `include_dep` annotations found across all files included in the generated target. The `parser.annotations` struct is updated to include a new `includeDep` field, and `parser.parse` is updated to return the `annotations` struct. All target builders then add the resolved dependencies. Fixes #1862. Example: ```python # gazelle:include_dep //foo:bar,:hello_world,//:abc # gazelle:include_dep //:def,//foo:bar ``` will cause gazelle to generate: ```starlark deps = [ ":hello_world", "//:abc", "//:def", "//foo:bar", ] ``` --------- Co-authored-by: Thulio Ferraz Assis <3149049+f0rmiga@users.noreply.github.com> --- CHANGELOG.md | 2 + gazelle/README.md | 102 ++++++++++++++++++ gazelle/python/generate.go | 13 ++- gazelle/python/parser.go | 58 ++++++++-- gazelle/python/target.go | 9 ++ .../testdata/annotation_include_dep/BUILD.in | 1 + .../testdata/annotation_include_dep/BUILD.out | 53 +++++++++ .../testdata/annotation_include_dep/README.md | 10 ++ .../WORKSPACE} | 0 .../annotation_include_dep/__init__.py | 9 ++ .../annotation_include_dep/__main__.py | 7 ++ .../gazelle_python.yaml | 18 ++++ .../module1.py} | 0 .../annotation_include_dep/module2.py | 5 + .../annotation_include_dep/module2_test.py | 5 + .../annotation_include_dep/subpkg/BUILD.in | 1 + .../annotation_include_dep/subpkg/BUILD.out | 29 +++++ .../annotation_include_dep/subpkg/__init__.py | 0 .../annotation_include_dep/subpkg/module1.py | 3 + .../subpkg/module1_test.py | 5 + .../annotation_include_dep/subpkg/module2.py | 4 + .../annotation_include_dep/subpkg/module3.py | 3 + .../testdata/annotation_include_dep/test.yaml | 17 +++ .../invalid_annotation_exclude/BUILD.in | 0 .../invalid_annotation_exclude/BUILD.out | 0 .../README.md | 0 .../WORKSPACE | 0 .../__init__.py | 0 .../test.yaml | 0 .../invalid_annotation_include_dep/BUILD.in | 0 .../invalid_annotation_include_dep/BUILD.out | 0 .../invalid_annotation_include_dep/README.md | 3 + .../invalid_annotation_include_dep/WORKSPACE | 1 + .../__init__.py | 15 +++ .../invalid_annotation_include_dep/test.yaml | 19 ++++ 35 files changed, 379 insertions(+), 13 deletions(-) create mode 100644 gazelle/python/testdata/annotation_include_dep/BUILD.in create mode 100644 gazelle/python/testdata/annotation_include_dep/BUILD.out create mode 100644 gazelle/python/testdata/annotation_include_dep/README.md rename gazelle/python/testdata/{invalid_annotation/BUILD.in => annotation_include_dep/WORKSPACE} (100%) create mode 100644 gazelle/python/testdata/annotation_include_dep/__init__.py create mode 100644 gazelle/python/testdata/annotation_include_dep/__main__.py create mode 100644 gazelle/python/testdata/annotation_include_dep/gazelle_python.yaml rename gazelle/python/testdata/{invalid_annotation/BUILD.out => annotation_include_dep/module1.py} (100%) create mode 100644 gazelle/python/testdata/annotation_include_dep/module2.py create mode 100644 gazelle/python/testdata/annotation_include_dep/module2_test.py create mode 100644 gazelle/python/testdata/annotation_include_dep/subpkg/BUILD.in create mode 100644 gazelle/python/testdata/annotation_include_dep/subpkg/BUILD.out create mode 100644 gazelle/python/testdata/annotation_include_dep/subpkg/__init__.py create mode 100644 gazelle/python/testdata/annotation_include_dep/subpkg/module1.py create mode 100644 gazelle/python/testdata/annotation_include_dep/subpkg/module1_test.py create mode 100644 gazelle/python/testdata/annotation_include_dep/subpkg/module2.py create mode 100644 gazelle/python/testdata/annotation_include_dep/subpkg/module3.py create mode 100644 gazelle/python/testdata/annotation_include_dep/test.yaml create mode 100644 gazelle/python/testdata/invalid_annotation_exclude/BUILD.in create mode 100644 gazelle/python/testdata/invalid_annotation_exclude/BUILD.out rename gazelle/python/testdata/{invalid_annotation => invalid_annotation_exclude}/README.md (100%) rename gazelle/python/testdata/{invalid_annotation => invalid_annotation_exclude}/WORKSPACE (100%) rename gazelle/python/testdata/{invalid_annotation => invalid_annotation_exclude}/__init__.py (100%) rename gazelle/python/testdata/{invalid_annotation => invalid_annotation_exclude}/test.yaml (100%) create mode 100644 gazelle/python/testdata/invalid_annotation_include_dep/BUILD.in create mode 100644 gazelle/python/testdata/invalid_annotation_include_dep/BUILD.out create mode 100644 gazelle/python/testdata/invalid_annotation_include_dep/README.md create mode 100644 gazelle/python/testdata/invalid_annotation_include_dep/WORKSPACE create mode 100644 gazelle/python/testdata/invalid_annotation_include_dep/__init__.py create mode 100644 gazelle/python/testdata/invalid_annotation_include_dep/test.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index 415b936e8d..449dae0cd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,6 +73,8 @@ A brief description of the categories of changes: the whl and sdist files will be written to the lock file. Controlling whether the downloading of metadata is done in parallel can be done using `parallel_download` attribute. +* (gazelle) Add a new annotation `include_deps`. Also add documentation for + annotations to `gazelle/README.md`. * (deps): `rules_python` depends now on `rules_cc` 0.0.9 * (pip_parse): A new flag `use_hub_alias_dependencies` has been added that is going to become default in the next release. This makes use of `dep_template` flag diff --git a/gazelle/README.md b/gazelle/README.md index 4c1cb2799e..e7b17669aa 100644 --- a/gazelle/README.md +++ b/gazelle/README.md @@ -425,6 +425,108 @@ py_library( [issue-1826]: https://github.com/bazelbuild/rules_python/issues/1826 +### Annotations + +*Annotations* refer to comments found _within Python files_ that configure how +Gazelle acts for that particular file. + +Annotations have the form: + +```python +# gazelle:annotation_name value +``` + +and can reside anywhere within a Python file where comments are valid. For example: + +```python +import foo +# gazelle:annotation_name value + +def bar(): # gazelle:annotation_name value + pass +``` + +The annotations are: + +| **Annotation** | **Default value** | +|---------------------------------------------------------------|-------------------| +| [`# gazelle:ignore imports`](#annotation-ignore) | N/A | +| Tells Gazelle to ignore import statements. `imports` is a comma-separated list of imports to ignore. | | +| [`# gazelle:include_dep targets`](#annotation-include_dep) | N/A | +| Tells Gazelle to include a set of dependencies, even if they are not imported in a Python module. `targets` is a comma-separated list of target names to include as dependencies. | | + + +#### Annotation: `ignore` + +This annotation accepts a comma-separated string of values. Values are names of Python +imports that Gazelle should _not_ include in target dependencies. + +The annotation can be added multiple times, and all values are combined and +de-duplicated. + +For `python_generation_mode = "package"`, the `ignore` annotations +found across all files included in the generated target are removed from `deps`. + +Example: + +```python +import numpy # a pypi package + +# gazelle:ignore bar.baz.hello,foo +import bar.baz.hello +import foo + +# Ignore this import because _reasons_ +import baz # gazelle:ignore baz +``` + +will cause Gazelle to generate: + +```starlark +deps = ["@pypi//numpy"], +``` + + +#### Annotation: `include_dep` + +This annotation accepts a comma-separated string of values. Values _must_ +be Python targets, but _no validation is done_. If a value is not a Python +target, building will result in an error saying: + +``` + does not have mandatory providers: 'PyInfo' or 'CcInfo' or 'PyInfo'. +``` + +Adding non-Python targets to the generated target is a feature request being +tracked in [Issue #1865](https://github.com/bazelbuild/rules_python/issues/1865). + +The annotation can be added multiple times, and all values are combined +and de-duplicated. + +For `python_generation_mode = "package"`, the `include_dep` annotations +found across all files included in the generated target are included in `deps`. + +Example: + +```python +# gazelle:include_dep //foo:bar,:hello_world,//:abc +# gazelle:include_dep //:def,//foo:bar +import numpy # a pypi package +``` + +will cause Gazelle to generate: + +```starlark +deps = [ + ":hello_world", + "//:abc", + "//:def", + "//foo:bar", + "@pypi//numpy", +] +``` + + ### Libraries Python source files are those ending in `.py` but not ending in `_test.py`. diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index 1937831c44..8889438c05 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -233,7 +233,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes collisionErrors := singlylinkedlist.New() appendPyLibrary := func(srcs *treeset.Set, pyLibraryTargetName string) { - allDeps, mainModules, err := parser.parse(srcs) + allDeps, mainModules, annotations, err := parser.parse(srcs) if err != nil { log.Fatalf("ERROR: %v\n", err) } @@ -263,6 +263,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes addVisibility(visibility). addSrc(filename). addModuleDependencies(mainModules[filename]). + addResolvedDependencies(annotations.includeDeps). generateImportsAttribute().build() result.Gen = append(result.Gen, pyBinary) result.Imports = append(result.Imports, pyBinary.PrivateAttr(config.GazelleImportsKey)) @@ -290,6 +291,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes addVisibility(visibility). addSrcs(srcs). addModuleDependencies(allDeps). + addResolvedDependencies(annotations.includeDeps). generateImportsAttribute(). build() @@ -314,7 +316,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes } if hasPyBinaryEntryPointFile { - deps, _, err := parser.parseSingle(pyBinaryEntrypointFilename) + deps, _, annotations, err := parser.parseSingle(pyBinaryEntrypointFilename) if err != nil { log.Fatalf("ERROR: %v\n", err) } @@ -338,6 +340,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes addVisibility(visibility). addSrc(pyBinaryEntrypointFilename). addModuleDependencies(deps). + addResolvedDependencies(annotations.includeDeps). generateImportsAttribute() pyBinary := pyBinaryTarget.build() @@ -348,7 +351,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes var conftest *rule.Rule if hasConftestFile { - deps, _, err := parser.parseSingle(conftestFilename) + deps, _, annotations, err := parser.parseSingle(conftestFilename) if err != nil { log.Fatalf("ERROR: %v\n", err) } @@ -367,6 +370,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes conftestTarget := newTargetBuilder(pyLibraryKind, conftestTargetname, pythonProjectRoot, args.Rel, pyFileNames). addSrc(conftestFilename). addModuleDependencies(deps). + addResolvedDependencies(annotations.includeDeps). addVisibility(visibility). setTestonly(). generateImportsAttribute() @@ -379,7 +383,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes var pyTestTargets []*targetBuilder newPyTestTargetBuilder := func(srcs *treeset.Set, pyTestTargetName string) *targetBuilder { - deps, _, err := parser.parse(srcs) + deps, _, annotations, err := parser.parse(srcs) if err != nil { log.Fatalf("ERROR: %v\n", err) } @@ -397,6 +401,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes return newTargetBuilder(pyTestKind, pyTestTargetName, pythonProjectRoot, args.Rel, pyFileNames). addSrcs(srcs). addModuleDependencies(deps). + addResolvedDependencies(annotations.includeDeps). generateImportsAttribute() } if (hasPyTestEntryPointFile || hasPyTestEntryPointTarget || cfg.CoarseGrainedGeneration()) && !cfg.PerFileGeneration() { diff --git a/gazelle/python/parser.go b/gazelle/python/parser.go index 9b00b831e9..184fad7c14 100644 --- a/gazelle/python/parser.go +++ b/gazelle/python/parser.go @@ -101,7 +101,7 @@ func newPython3Parser( // parseSingle parses a single Python file and returns the extracted modules // from the import statements as well as the parsed comments. -func (p *python3Parser) parseSingle(pyFilename string) (*treeset.Set, map[string]*treeset.Set, error) { +func (p *python3Parser) parseSingle(pyFilename string) (*treeset.Set, map[string]*treeset.Set, *annotations, error) { pyFilenames := treeset.NewWith(godsutils.StringComparator) pyFilenames.Add(pyFilename) return p.parse(pyFilenames) @@ -109,7 +109,7 @@ func (p *python3Parser) parseSingle(pyFilename string) (*treeset.Set, map[string // parse parses multiple Python files and returns the extracted modules from // the import statements as well as the parsed comments. -func (p *python3Parser) parse(pyFilenames *treeset.Set) (*treeset.Set, map[string]*treeset.Set, error) { +func (p *python3Parser) parse(pyFilenames *treeset.Set) (*treeset.Set, map[string]*treeset.Set, *annotations, error) { parserMutex.Lock() defer parserMutex.Unlock() @@ -122,28 +122,30 @@ func (p *python3Parser) parse(pyFilenames *treeset.Set) (*treeset.Set, map[strin } encoder := json.NewEncoder(parserStdin) if err := encoder.Encode(&req); err != nil { - return nil, nil, fmt.Errorf("failed to parse: %w", err) + return nil, nil, nil, fmt.Errorf("failed to parse: %w", err) } reader := bufio.NewReader(parserStdout) data, err := reader.ReadBytes(0) if err != nil { - return nil, nil, fmt.Errorf("failed to parse: %w", err) + return nil, nil, nil, fmt.Errorf("failed to parse: %w", err) } data = data[:len(data)-1] var allRes []parserResponse if err := json.Unmarshal(data, &allRes); err != nil { - return nil, nil, fmt.Errorf("failed to parse: %w", err) + return nil, nil, nil, fmt.Errorf("failed to parse: %w", err) } mainModules := make(map[string]*treeset.Set, len(allRes)) + allAnnotations := new(annotations) + allAnnotations.ignore = make(map[string]struct{}) for _, res := range allRes { if res.HasMain { mainModules[res.FileName] = treeset.NewWith(moduleComparator) } annotations, err := annotationsFromComments(res.Comments) if err != nil { - return nil, nil, fmt.Errorf("failed to parse annotations: %w", err) + return nil, nil, nil, fmt.Errorf("failed to parse annotations: %w", err) } for _, m := range res.Modules { @@ -164,9 +166,32 @@ func (p *python3Parser) parse(pyFilenames *treeset.Set) (*treeset.Set, map[strin mainModules[res.FileName].Add(m) } } + + // Collect all annotations from each file into a single annotations struct. + for k, v := range annotations.ignore { + allAnnotations.ignore[k] = v + } + allAnnotations.includeDeps = append(allAnnotations.includeDeps, annotations.includeDeps...) } - return modules, mainModules, nil + allAnnotations.includeDeps = removeDupesFromStringTreeSetSlice(allAnnotations.includeDeps) + + return modules, mainModules, allAnnotations, nil +} + +// removeDupesFromStringTreeSetSlice takes a []string, makes a set out of the +// elements, and then returns a new []string with all duplicates removed. Order +// is preserved. +func removeDupesFromStringTreeSetSlice(array []string) []string { + s := treeset.NewWith(godsutils.StringComparator) + for _, v := range array { + s.Add(v) + } + dedupe := make([]string, s.Size()) + for i, v := range s.Values() { + dedupe[i] = fmt.Sprint(v) + } + return dedupe } // parserResponse represents a response returned by the parser.py for a given @@ -211,7 +236,8 @@ const ( // The Gazelle annotation prefix. annotationPrefix string = "gazelle:" // The ignore annotation kind. E.g. '# gazelle:ignore '. - annotationKindIgnore annotationKind = "ignore" + annotationKindIgnore annotationKind = "ignore" + annotationKindIncludeDep annotationKind = "include_dep" ) // comment represents a Python comment. @@ -247,12 +273,15 @@ type annotation struct { type annotations struct { // The parsed modules to be ignored by Gazelle. ignore map[string]struct{} + // Labels that Gazelle should include as deps of the generated target. + includeDeps []string } // annotationsFromComments returns all the annotations parsed out of the // comments of a Python module. func annotationsFromComments(comments []comment) (*annotations, error) { ignore := make(map[string]struct{}) + includeDeps := []string{} for _, comment := range comments { annotation, err := comment.asAnnotation() if err != nil { @@ -269,10 +298,21 @@ func annotationsFromComments(comments []comment) (*annotations, error) { ignore[m] = struct{}{} } } + if annotation.kind == annotationKindIncludeDep { + targets := strings.Split(annotation.value, ",") + for _, t := range targets { + if t == "" { + continue + } + t = strings.TrimSpace(t) + includeDeps = append(includeDeps, t) + } + } } } return &annotations{ - ignore: ignore, + ignore: ignore, + includeDeps: includeDeps, }, nil } diff --git a/gazelle/python/target.go b/gazelle/python/target.go index a941a7cc7e..c40d6fb3b7 100644 --- a/gazelle/python/target.go +++ b/gazelle/python/target.go @@ -99,6 +99,15 @@ func (t *targetBuilder) addResolvedDependency(dep string) *targetBuilder { return t } +// addResolvedDependencies adds multiple dependencies, that have already been +// resolved or generated, to the target. +func (t *targetBuilder) addResolvedDependencies(deps []string) *targetBuilder { + for _, dep := range deps { + t.addResolvedDependency(dep) + } + return t +} + // addVisibility adds visibility labels to the target. func (t *targetBuilder) addVisibility(visibility []string) *targetBuilder { for _, item := range visibility { diff --git a/gazelle/python/testdata/annotation_include_dep/BUILD.in b/gazelle/python/testdata/annotation_include_dep/BUILD.in new file mode 100644 index 0000000000..af2c2cea4b --- /dev/null +++ b/gazelle/python/testdata/annotation_include_dep/BUILD.in @@ -0,0 +1 @@ +# gazelle:python_generation_mode file diff --git a/gazelle/python/testdata/annotation_include_dep/BUILD.out b/gazelle/python/testdata/annotation_include_dep/BUILD.out new file mode 100644 index 0000000000..1cff8f4676 --- /dev/null +++ b/gazelle/python/testdata/annotation_include_dep/BUILD.out @@ -0,0 +1,53 @@ +load("@rules_python//python:defs.bzl", "py_binary", "py_library", "py_test") + +# gazelle:python_generation_mode file + +py_library( + name = "__init__", + srcs = ["__init__.py"], + visibility = ["//:__subpackages__"], + deps = [ + ":module1", + ":module2", + "//foo/bar:baz", + "//hello:world", + "@gazelle_python_test//foo", + "@star_wars//rebel_alliance/luke:skywalker", + ], +) + +py_library( + name = "module1", + srcs = ["module1.py"], + visibility = ["//:__subpackages__"], +) + +py_library( + name = "module2", + srcs = ["module2.py"], + visibility = ["//:__subpackages__"], + deps = [ + "//checking/py_binary/from/if:works", + "//foo:bar", + ], +) + +py_binary( + name = "annotation_include_dep_bin", + srcs = ["__main__.py"], + main = "__main__.py", + visibility = ["//:__subpackages__"], + deps = [ + ":module2", + "//checking/py_binary/from/__main__:works", + ], +) + +py_test( + name = "module2_test", + srcs = ["module2_test.py"], + deps = [ + ":module2", + "//checking/py_test/works:too", + ], +) diff --git a/gazelle/python/testdata/annotation_include_dep/README.md b/gazelle/python/testdata/annotation_include_dep/README.md new file mode 100644 index 0000000000..4c8afbe5eb --- /dev/null +++ b/gazelle/python/testdata/annotation_include_dep/README.md @@ -0,0 +1,10 @@ +# Annotation: Include Dep + +Test that the Python gazelle annotation `# gazelle:include_dep` correctly adds dependences +to the generated target even if those dependencies are not imported by the Python module. + +The root directory tests that all `py_*` targets will correctly include the additional +dependencies. + +The `subpkg` directory tests that all `# gazlle:include_dep` annotations found in all source +files are included in the generated target (such as during `generation_mode package`). diff --git a/gazelle/python/testdata/invalid_annotation/BUILD.in b/gazelle/python/testdata/annotation_include_dep/WORKSPACE similarity index 100% rename from gazelle/python/testdata/invalid_annotation/BUILD.in rename to gazelle/python/testdata/annotation_include_dep/WORKSPACE diff --git a/gazelle/python/testdata/annotation_include_dep/__init__.py b/gazelle/python/testdata/annotation_include_dep/__init__.py new file mode 100644 index 0000000000..61015346de --- /dev/null +++ b/gazelle/python/testdata/annotation_include_dep/__init__.py @@ -0,0 +1,9 @@ +import module1 +import foo # third party package + +# gazelle:include_dep //foo/bar:baz +# gazelle:include_dep //hello:world,@star_wars//rebel_alliance/luke:skywalker +# gazelle:include_dep :module2 + +del module1 +del foo diff --git a/gazelle/python/testdata/annotation_include_dep/__main__.py b/gazelle/python/testdata/annotation_include_dep/__main__.py new file mode 100644 index 0000000000..6d9d8aa246 --- /dev/null +++ b/gazelle/python/testdata/annotation_include_dep/__main__.py @@ -0,0 +1,7 @@ +# gazelle:include_dep //checking/py_binary/from/__main__:works +# Check deduping +# gazelle:include_dep //checking/py_binary/from/__main__:works + +import module2 + +del module2 diff --git a/gazelle/python/testdata/annotation_include_dep/gazelle_python.yaml b/gazelle/python/testdata/annotation_include_dep/gazelle_python.yaml new file mode 100644 index 0000000000..7afe81f818 --- /dev/null +++ b/gazelle/python/testdata/annotation_include_dep/gazelle_python.yaml @@ -0,0 +1,18 @@ +# 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. + +manifest: + modules_mapping: + foo: foo + pip_deps_repository_name: gazelle_python_test diff --git a/gazelle/python/testdata/invalid_annotation/BUILD.out b/gazelle/python/testdata/annotation_include_dep/module1.py similarity index 100% rename from gazelle/python/testdata/invalid_annotation/BUILD.out rename to gazelle/python/testdata/annotation_include_dep/module1.py diff --git a/gazelle/python/testdata/annotation_include_dep/module2.py b/gazelle/python/testdata/annotation_include_dep/module2.py new file mode 100644 index 0000000000..23a75afee7 --- /dev/null +++ b/gazelle/python/testdata/annotation_include_dep/module2.py @@ -0,0 +1,5 @@ +# gazelle:include_dep //foo:bar + +if __name__ == "__main__": + # gazelle:include_dep //checking/py_binary/from/if:works + print("hello") diff --git a/gazelle/python/testdata/annotation_include_dep/module2_test.py b/gazelle/python/testdata/annotation_include_dep/module2_test.py new file mode 100644 index 0000000000..6fa18c6f56 --- /dev/null +++ b/gazelle/python/testdata/annotation_include_dep/module2_test.py @@ -0,0 +1,5 @@ +# gazelle:include_dep //checking/py_test/works:too + +import module2 + +del module2 diff --git a/gazelle/python/testdata/annotation_include_dep/subpkg/BUILD.in b/gazelle/python/testdata/annotation_include_dep/subpkg/BUILD.in new file mode 100644 index 0000000000..421b48688a --- /dev/null +++ b/gazelle/python/testdata/annotation_include_dep/subpkg/BUILD.in @@ -0,0 +1 @@ +# gazelle:python_generation_mode package diff --git a/gazelle/python/testdata/annotation_include_dep/subpkg/BUILD.out b/gazelle/python/testdata/annotation_include_dep/subpkg/BUILD.out new file mode 100644 index 0000000000..921c892889 --- /dev/null +++ b/gazelle/python/testdata/annotation_include_dep/subpkg/BUILD.out @@ -0,0 +1,29 @@ +load("@rules_python//python:defs.bzl", "py_library", "py_test") + +# gazelle:python_generation_mode package + +py_library( + name = "subpkg", + srcs = [ + "__init__.py", + "module1.py", + "module2.py", + "module3.py", + ], + visibility = ["//:__subpackages__"], + deps = [ + ":nonexistant_target_from_include_dep_in_module3", + "//me_from_module1", + "//other/thing:from_include_dep_in_module2", + "//you_from_module1", + ], +) + +py_test( + name = "module1_test", + srcs = ["module1_test.py"], + deps = [ + ":subpkg", + "//:bagel_from_include_dep_in_module1_test", + ], +) diff --git a/gazelle/python/testdata/annotation_include_dep/subpkg/__init__.py b/gazelle/python/testdata/annotation_include_dep/subpkg/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/annotation_include_dep/subpkg/module1.py b/gazelle/python/testdata/annotation_include_dep/subpkg/module1.py new file mode 100644 index 0000000000..01566a07ec --- /dev/null +++ b/gazelle/python/testdata/annotation_include_dep/subpkg/module1.py @@ -0,0 +1,3 @@ +def hello(): + # gazelle:include_dep //you_from_module1,//me_from_module1 + pass diff --git a/gazelle/python/testdata/annotation_include_dep/subpkg/module1_test.py b/gazelle/python/testdata/annotation_include_dep/subpkg/module1_test.py new file mode 100644 index 0000000000..087763a693 --- /dev/null +++ b/gazelle/python/testdata/annotation_include_dep/subpkg/module1_test.py @@ -0,0 +1,5 @@ +# gazelle:include_dep //:bagel_from_include_dep_in_module1_test + +import module1 + +del module1 diff --git a/gazelle/python/testdata/annotation_include_dep/subpkg/module2.py b/gazelle/python/testdata/annotation_include_dep/subpkg/module2.py new file mode 100644 index 0000000000..dabeb6794a --- /dev/null +++ b/gazelle/python/testdata/annotation_include_dep/subpkg/module2.py @@ -0,0 +1,4 @@ +# gazelle:include_dep //other/thing:from_include_dep_in_module2 +import module1 + +del module1 diff --git a/gazelle/python/testdata/annotation_include_dep/subpkg/module3.py b/gazelle/python/testdata/annotation_include_dep/subpkg/module3.py new file mode 100644 index 0000000000..899a7c4f53 --- /dev/null +++ b/gazelle/python/testdata/annotation_include_dep/subpkg/module3.py @@ -0,0 +1,3 @@ +def goodbye(): + # gazelle:include_dep :nonexistant_target_from_include_dep_in_module3 + pass diff --git a/gazelle/python/testdata/annotation_include_dep/test.yaml b/gazelle/python/testdata/annotation_include_dep/test.yaml new file mode 100644 index 0000000000..2410223e59 --- /dev/null +++ b/gazelle/python/testdata/annotation_include_dep/test.yaml @@ -0,0 +1,17 @@ +# 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. + +--- +expect: + exit_code: 0 diff --git a/gazelle/python/testdata/invalid_annotation_exclude/BUILD.in b/gazelle/python/testdata/invalid_annotation_exclude/BUILD.in new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/invalid_annotation_exclude/BUILD.out b/gazelle/python/testdata/invalid_annotation_exclude/BUILD.out new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/invalid_annotation/README.md b/gazelle/python/testdata/invalid_annotation_exclude/README.md similarity index 100% rename from gazelle/python/testdata/invalid_annotation/README.md rename to gazelle/python/testdata/invalid_annotation_exclude/README.md diff --git a/gazelle/python/testdata/invalid_annotation/WORKSPACE b/gazelle/python/testdata/invalid_annotation_exclude/WORKSPACE similarity index 100% rename from gazelle/python/testdata/invalid_annotation/WORKSPACE rename to gazelle/python/testdata/invalid_annotation_exclude/WORKSPACE diff --git a/gazelle/python/testdata/invalid_annotation/__init__.py b/gazelle/python/testdata/invalid_annotation_exclude/__init__.py similarity index 100% rename from gazelle/python/testdata/invalid_annotation/__init__.py rename to gazelle/python/testdata/invalid_annotation_exclude/__init__.py diff --git a/gazelle/python/testdata/invalid_annotation/test.yaml b/gazelle/python/testdata/invalid_annotation_exclude/test.yaml similarity index 100% rename from gazelle/python/testdata/invalid_annotation/test.yaml rename to gazelle/python/testdata/invalid_annotation_exclude/test.yaml diff --git a/gazelle/python/testdata/invalid_annotation_include_dep/BUILD.in b/gazelle/python/testdata/invalid_annotation_include_dep/BUILD.in new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/invalid_annotation_include_dep/BUILD.out b/gazelle/python/testdata/invalid_annotation_include_dep/BUILD.out new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/invalid_annotation_include_dep/README.md b/gazelle/python/testdata/invalid_annotation_include_dep/README.md new file mode 100644 index 0000000000..2f8e024050 --- /dev/null +++ b/gazelle/python/testdata/invalid_annotation_include_dep/README.md @@ -0,0 +1,3 @@ +# Invalid annotation +This test case asserts that the parse step fails as expected due to invalid annotation format of +the `include_dep` annotation. diff --git a/gazelle/python/testdata/invalid_annotation_include_dep/WORKSPACE b/gazelle/python/testdata/invalid_annotation_include_dep/WORKSPACE new file mode 100644 index 0000000000..faff6af87a --- /dev/null +++ b/gazelle/python/testdata/invalid_annotation_include_dep/WORKSPACE @@ -0,0 +1 @@ +# This is a Bazel workspace for the Gazelle test data. diff --git a/gazelle/python/testdata/invalid_annotation_include_dep/__init__.py b/gazelle/python/testdata/invalid_annotation_include_dep/__init__.py new file mode 100644 index 0000000000..61f4c76c34 --- /dev/null +++ b/gazelle/python/testdata/invalid_annotation_include_dep/__init__.py @@ -0,0 +1,15 @@ +# 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. + +# gazelle:include_dep diff --git a/gazelle/python/testdata/invalid_annotation_include_dep/test.yaml b/gazelle/python/testdata/invalid_annotation_include_dep/test.yaml new file mode 100644 index 0000000000..f2159a6cd1 --- /dev/null +++ b/gazelle/python/testdata/invalid_annotation_include_dep/test.yaml @@ -0,0 +1,19 @@ +# 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. + +--- +expect: + exit_code: 1 + stderr: | + gazelle: ERROR: failed to parse annotations: `# gazelle:include_dep` requires a value From 55f31a306c8d69b46e50a1b2618c93081d4e11e8 Mon Sep 17 00:00:00 2001 From: Douglas Thor Date: Thu, 9 May 2024 15:01:32 -0700 Subject: [PATCH 015/345] Fix typo in changelog text from #1863 (#1889) The annotation is `include_dep`, not `include_deps`. ```console $ # Before this PR: $ rg -F "include_deps" CHANGELOG.md 76:* (gazelle) Add a new annotation `include_deps`. Also add documentation for $ $ # After this PR, there are no more references to "include_deps" $ rg -F "include_deps" $ ``` --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 449dae0cd5..b8745f5375 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,7 +73,7 @@ A brief description of the categories of changes: the whl and sdist files will be written to the lock file. Controlling whether the downloading of metadata is done in parallel can be done using `parallel_download` attribute. -* (gazelle) Add a new annotation `include_deps`. Also add documentation for +* (gazelle) Add a new annotation `include_dep`. Also add documentation for annotations to `gazelle/README.md`. * (deps): `rules_python` depends now on `rules_cc` 0.0.9 * (pip_parse): A new flag `use_hub_alias_dependencies` has been added that is going From 165da68caf2a4cce0f8d38d56991c3a73c2035e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 18:07:55 +0900 Subject: [PATCH 016/345] build(deps): bump jinja2 from 3.1.3 to 3.1.4 in /docs/sphinx (#1884) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4.
Release notes

Sourced from jinja2's releases.

3.1.4

This is the Jinja 3.1.4 security release, which fixes security issues and bugs but does not otherwise change behavior and should not result in breaking changes.

PyPI: https://pypi.org/project/Jinja2/3.1.4/ Changes: https://jinja.palletsprojects.com/en/3.1.x/changes/#version-3-1-4

  • The xmlattr filter does not allow keys with / solidus, > greater-than sign, or = equals sign, in addition to disallowing spaces. Regardless of any validation done by Jinja, user input should never be used as keys to this filter, or must be separately validated first. GHSA-h75v-3vvj-5mfj
Changelog

Sourced from jinja2's changelog.

Version 3.1.4

Released 2024-05-05

  • The xmlattr filter does not allow keys with / solidus, > greater-than sign, or = equals sign, in addition to disallowing spaces. Regardless of any validation done by Jinja, user input should never be used as keys to this filter, or must be separately validated first. :ghsa:h75v-3vvj-5mfj
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=jinja2&package-manager=pip&previous-version=3.1.3&new-version=3.1.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/bazelbuild/rules_python/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/sphinx/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/sphinx/requirements.txt b/docs/sphinx/requirements.txt index 06b73a2697..4c340b39be 100644 --- a/docs/sphinx/requirements.txt +++ b/docs/sphinx/requirements.txt @@ -127,9 +127,9 @@ imagesize==1.4.1 \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a # via sphinx -jinja2==3.1.3 \ - --hash=sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa \ - --hash=sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90 +jinja2==3.1.4 \ + --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ + --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d # via # myst-parser # readthedocs-sphinx-ext From 985031f1102cbb364ac14c266932ca29c1162aba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 18:09:45 +0900 Subject: [PATCH 017/345] build(deps): bump jinja2 from 3.1.3 to 3.1.4 in /examples/pip_parse (#1882) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4.
Release notes

Sourced from jinja2's releases.

3.1.4

This is the Jinja 3.1.4 security release, which fixes security issues and bugs but does not otherwise change behavior and should not result in breaking changes.

PyPI: https://pypi.org/project/Jinja2/3.1.4/ Changes: https://jinja.palletsprojects.com/en/3.1.x/changes/#version-3-1-4

  • The xmlattr filter does not allow keys with / solidus, > greater-than sign, or = equals sign, in addition to disallowing spaces. Regardless of any validation done by Jinja, user input should never be used as keys to this filter, or must be separately validated first. GHSA-h75v-3vvj-5mfj
Changelog

Sourced from jinja2's changelog.

Version 3.1.4

Released 2024-05-05

  • The xmlattr filter does not allow keys with / solidus, > greater-than sign, or = equals sign, in addition to disallowing spaces. Regardless of any validation done by Jinja, user input should never be used as keys to this filter, or must be separately validated first. :ghsa:h75v-3vvj-5mfj
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=jinja2&package-manager=pip&previous-version=3.1.3&new-version=3.1.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/bazelbuild/rules_python/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/pip_parse/requirements_lock.txt | 6 +++--- examples/pip_parse/requirements_windows.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/pip_parse/requirements_lock.txt b/examples/pip_parse/requirements_lock.txt index 2eaed619b7..91fa56d0e0 100644 --- a/examples/pip_parse/requirements_lock.txt +++ b/examples/pip_parse/requirements_lock.txt @@ -36,9 +36,9 @@ importlib-metadata==6.8.0 \ --hash=sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb \ --hash=sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743 # via sphinx -jinja2==3.1.3 \ - --hash=sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa \ - --hash=sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90 +jinja2==3.1.4 \ + --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ + --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d # via sphinx markupsafe==2.1.3 \ --hash=sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e \ diff --git a/examples/pip_parse/requirements_windows.txt b/examples/pip_parse/requirements_windows.txt index 07a5622619..d249f9382f 100644 --- a/examples/pip_parse/requirements_windows.txt +++ b/examples/pip_parse/requirements_windows.txt @@ -40,9 +40,9 @@ importlib-metadata==6.8.0 \ --hash=sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb \ --hash=sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743 # via sphinx -jinja2==3.1.3 \ - --hash=sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa \ - --hash=sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90 +jinja2==3.1.4 \ + --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ + --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d # via sphinx markupsafe==2.1.3 \ --hash=sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e \ From bb16941f39a0d73332b5f6173e9cdb8620be4eeb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 18:09:51 +0900 Subject: [PATCH 018/345] build(deps): bump jinja2 from 3.1.3 to 3.1.4 in /tests/integration/pip_repository_entry_points (#1880) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4.
Release notes

Sourced from jinja2's releases.

3.1.4

This is the Jinja 3.1.4 security release, which fixes security issues and bugs but does not otherwise change behavior and should not result in breaking changes.

PyPI: https://pypi.org/project/Jinja2/3.1.4/ Changes: https://jinja.palletsprojects.com/en/3.1.x/changes/#version-3-1-4

  • The xmlattr filter does not allow keys with / solidus, > greater-than sign, or = equals sign, in addition to disallowing spaces. Regardless of any validation done by Jinja, user input should never be used as keys to this filter, or must be separately validated first. GHSA-h75v-3vvj-5mfj
Changelog

Sourced from jinja2's changelog.

Version 3.1.4

Released 2024-05-05

  • The xmlattr filter does not allow keys with / solidus, > greater-than sign, or = equals sign, in addition to disallowing spaces. Regardless of any validation done by Jinja, user input should never be used as keys to this filter, or must be separately validated first. :ghsa:h75v-3vvj-5mfj
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=jinja2&package-manager=pip&previous-version=3.1.3&new-version=3.1.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/bazelbuild/rules_python/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../pip_repository_entry_points/requirements_windows.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/integration/pip_repository_entry_points/requirements_windows.txt b/tests/integration/pip_repository_entry_points/requirements_windows.txt index 904024e6bb..6885a26aa6 100644 --- a/tests/integration/pip_repository_entry_points/requirements_windows.txt +++ b/tests/integration/pip_repository_entry_points/requirements_windows.txt @@ -38,9 +38,9 @@ imagesize==1.3.0 \ --hash=sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c \ --hash=sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d # via sphinx -jinja2==3.1.3 \ - --hash=sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa \ - --hash=sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90 +jinja2==3.1.4 \ + --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ + --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d # via sphinx markupsafe==2.0.1 \ --hash=sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298 \ From 5565bf6a45d61d25456cc689266c1d7a3f6a0422 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 18:14:16 +0900 Subject: [PATCH 019/345] build(deps): bump idna from 3.4 to 3.7 in /examples/pip_repository_annotations (#1847) Bumps [idna](https://github.com/kjd/idna) from 3.4 to 3.7.
Release notes

Sourced from idna's releases.

v3.7

What's Changed

  • Fix issue where specially crafted inputs to encode() could take exceptionally long amount of time to process. [CVE-2024-3651]

Thanks to Guido Vranken for reporting the issue.

Full Changelog: https://github.com/kjd/idna/compare/v3.6...v3.7

Changelog

Sourced from idna's changelog.

3.7 (2024-04-11) ++++++++++++++++

  • Fix issue where specially crafted inputs to encode() could take exceptionally long amount of time to process. [CVE-2024-3651]

Thanks to Guido Vranken for reporting the issue.

3.6 (2023-11-25) ++++++++++++++++

  • Fix regression to include tests in source distribution.

3.5 (2023-11-24) ++++++++++++++++

  • Update to Unicode 15.1.0
  • String codec name is now "idna2008" as overriding the system codec "idna" was not working.
  • Fix typing error for codec encoding
  • "setup.cfg" has been added for this release due to some downstream lack of adherence to PEP 517. Should be removed in a future release so please prepare accordingly.
  • Removed reliance on a symlink for the "idna-data" tool to comport with PEP 517 and the Python Packaging User Guide for sdist archives.
  • Added security reporting protocol for project

Thanks Jon Ribbens, Diogo Teles Sant'Anna, Wu Tingfeng for contributions to this release.

Commits
  • 1d365e1 Release v3.7
  • c1b3154 Merge pull request #172 from kjd/optimize-contextj
  • 0394ec7 Merge branch 'master' into optimize-contextj
  • cd58a23 Merge pull request #152 from elliotwutingfeng/dev
  • 5beb28b More efficient resolution of joiner contexts
  • 1b12148 Update ossf/scorecard-action to v2.3.1
  • d516b87 Update Github actions/checkout to v4
  • c095c75 Merge branch 'master' into dev
  • 60a0a4c Fix typo in GitHub Actions workflow key
  • 5918a0e Merge branch 'master' into dev
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=idna&package-manager=pip&previous-version=3.4&new-version=3.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/bazelbuild/rules_python/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/pip_repository_annotations/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/pip_repository_annotations/requirements.txt b/examples/pip_repository_annotations/requirements.txt index 290d93e15c..f1069a7452 100644 --- a/examples/pip_repository_annotations/requirements.txt +++ b/examples/pip_repository_annotations/requirements.txt @@ -16,9 +16,9 @@ charset-normalizer==2.1.1 \ --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f # via requests -idna==3.4 \ - --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ - --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 +idna==3.7 \ + --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ + --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 # via requests requests[security]==2.28.1 \ --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 \ From 18d379e068339762a61dac8faf75ae3d1e11b282 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 18:14:46 +0900 Subject: [PATCH 020/345] build(deps): bump idna from 3.3 to 3.7 in /tests/integration/pip_repository_entry_points (#1846) Bumps [idna](https://github.com/kjd/idna) from 3.3 to 3.7.
Release notes

Sourced from idna's releases.

v3.7

What's Changed

  • Fix issue where specially crafted inputs to encode() could take exceptionally long amount of time to process. [CVE-2024-3651]

Thanks to Guido Vranken for reporting the issue.

Full Changelog: https://github.com/kjd/idna/compare/v3.6...v3.7

Changelog

Sourced from idna's changelog.

3.7 (2024-04-11) ++++++++++++++++

  • Fix issue where specially crafted inputs to encode() could take exceptionally long amount of time to process. [CVE-2024-3651]

Thanks to Guido Vranken for reporting the issue.

3.6 (2023-11-25) ++++++++++++++++

  • Fix regression to include tests in source distribution.

3.5 (2023-11-24) ++++++++++++++++

  • Update to Unicode 15.1.0
  • String codec name is now "idna2008" as overriding the system codec "idna" was not working.
  • Fix typing error for codec encoding
  • "setup.cfg" has been added for this release due to some downstream lack of adherence to PEP 517. Should be removed in a future release so please prepare accordingly.
  • Removed reliance on a symlink for the "idna-data" tool to comport with PEP 517 and the Python Packaging User Guide for sdist archives.
  • Added security reporting protocol for project

Thanks Jon Ribbens, Diogo Teles Sant'Anna, Wu Tingfeng for contributions to this release.

3.4 (2022-09-14) ++++++++++++++++

  • Update to Unicode 15.0.0
  • Migrate to pyproject.toml for build information (PEP 621)
  • Correct another instance where generic exception was raised instead of IDNAError for malformed input
  • Source distribution uses zeroized file ownership for improved reproducibility

Thanks to Seth Michael Larson for contributions to this release.

Commits
  • 1d365e1 Release v3.7
  • c1b3154 Merge pull request #172 from kjd/optimize-contextj
  • 0394ec7 Merge branch 'master' into optimize-contextj
  • cd58a23 Merge pull request #152 from elliotwutingfeng/dev
  • 5beb28b More efficient resolution of joiner contexts
  • 1b12148 Update ossf/scorecard-action to v2.3.1
  • d516b87 Update Github actions/checkout to v4
  • c095c75 Merge branch 'master' into dev
  • 60a0a4c Fix typo in GitHub Actions workflow key
  • 5918a0e Merge branch 'master' into dev
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=idna&package-manager=pip&previous-version=3.3&new-version=3.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/bazelbuild/rules_python/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../pip_repository_entry_points/requirements_windows.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/integration/pip_repository_entry_points/requirements_windows.txt b/tests/integration/pip_repository_entry_points/requirements_windows.txt index 6885a26aa6..83f2daaf4d 100644 --- a/tests/integration/pip_repository_entry_points/requirements_windows.txt +++ b/tests/integration/pip_repository_entry_points/requirements_windows.txt @@ -30,9 +30,9 @@ docutils==0.17.1 \ --hash=sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125 \ --hash=sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61 # via sphinx -idna==3.3 \ - --hash=sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff \ - --hash=sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d +idna==3.7 \ + --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ + --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 # via requests imagesize==1.3.0 \ --hash=sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c \ From 01ae7e7222e9b754b21e2561cc48a9ffb039036e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 18:16:34 +0900 Subject: [PATCH 021/345] build(deps): bump idna from 3.6 to 3.7 in /docs/sphinx (#1851) Bumps [idna](https://github.com/kjd/idna) from 3.6 to 3.7.
Release notes

Sourced from idna's releases.

v3.7

What's Changed

  • Fix issue where specially crafted inputs to encode() could take exceptionally long amount of time to process. [CVE-2024-3651]

Thanks to Guido Vranken for reporting the issue.

Full Changelog: https://github.com/kjd/idna/compare/v3.6...v3.7

Changelog

Sourced from idna's changelog.

3.7 (2024-04-11) ++++++++++++++++

  • Fix issue where specially crafted inputs to encode() could take exceptionally long amount of time to process. [CVE-2024-3651]

Thanks to Guido Vranken for reporting the issue.

Commits
  • 1d365e1 Release v3.7
  • c1b3154 Merge pull request #172 from kjd/optimize-contextj
  • 0394ec7 Merge branch 'master' into optimize-contextj
  • cd58a23 Merge pull request #152 from elliotwutingfeng/dev
  • 5beb28b More efficient resolution of joiner contexts
  • 1b12148 Update ossf/scorecard-action to v2.3.1
  • d516b87 Update Github actions/checkout to v4
  • c095c75 Merge branch 'master' into dev
  • 60a0a4c Fix typo in GitHub Actions workflow key
  • 5918a0e Merge branch 'master' into dev
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=idna&package-manager=pip&previous-version=3.6&new-version=3.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) You can trigger a rebase of this PR by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/bazelbuild/rules_python/network/alerts).
> **Note** > Automatic rebases have been disabled on this pull request as it has been open for over 30 days. Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/sphinx/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/sphinx/requirements.txt b/docs/sphinx/requirements.txt index 4c340b39be..ed74550e83 100644 --- a/docs/sphinx/requirements.txt +++ b/docs/sphinx/requirements.txt @@ -119,9 +119,9 @@ docutils==0.20.1 \ # myst-parser # sphinx # sphinx-rtd-theme -idna==3.6 \ - --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ - --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f +idna==3.7 \ + --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ + --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 # via requests imagesize==1.4.1 \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ From 4c4c06c22badec4c6fa6840d22128806d67f6916 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 13 May 2024 07:36:07 +0900 Subject: [PATCH 022/345] fix(whl_library): stop duplicating deps in whl_library (#1874) Before this PR we would incorrectly add deps to the platform-specific list if there were multiple entries in the `METADATA` file. It seems that some projects (e.g. [opencv-python]) have multiple entries in their METADATA file to help SAT solvers with selecting the right version when different interpreter versions are used. In our case, we will have only one version of a given package because we are operating with a locked dependency list, so we should ensure that we do not have duplicates across the lists. With this PR we are solving this during the construction of the dependency sets so that the internal model is always consistent. Fixes #1873 [opencv-python]: https://pypi.org/project/opencv-python/ --- CHANGELOG.md | 3 ++ .../tools/wheel_installer/wheel.py | 18 ++++++++ .../tools/wheel_installer/wheel_test.py | 42 +++++++++++++++++++ 3 files changed, 63 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b8745f5375..14f179f7a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,9 @@ A brief description of the categories of changes: * (whl_library): Fix the experimental_target_platforms overriding for platform specific wheels when the wheels are for any python interpreter version. Fixes [#1810](https://github.com/bazelbuild/rules_python/issues/1810). +* (whl_library): Stop generating duplicate dependencies when encountering + duplicates in the METADATA. Fixes + [#1873](https://github.com/bazelbuild/rules_python/issues/1873). * (gazelle) In `project` or `package` generation modes, do not generate `py_test` rules when there are no test files and do not set `main = "__test__.py"` when that file doesn't exist. diff --git a/python/pip_install/tools/wheel_installer/wheel.py b/python/pip_install/tools/wheel_installer/wheel.py index 750ebfcf7a..f7c686d9ba 100644 --- a/python/pip_install/tools/wheel_installer/wheel.py +++ b/python/pip_install/tools/wheel_installer/wheel.py @@ -370,6 +370,24 @@ def _add(self, dep: str, platform: Optional[Platform]): if not platform: self._deps.add(dep) + + # If the dep is in the platform-specific list, remove it from the select. + pop_keys = [] + for p, deps in self._select.items(): + if dep not in deps: + continue + + deps.remove(dep) + if not deps: + pop_keys.append(p) + + for p in pop_keys: + self._select.pop(p) + return + + if dep in self._deps: + # If the dep is already in the main dependency list, no need to add it in the + # platform-specific dependency list. return # Add the platform-specific dep diff --git a/python/pip_install/tools/wheel_installer/wheel_test.py b/python/pip_install/tools/wheel_installer/wheel_test.py index f7c847fc9e..20141e2867 100644 --- a/python/pip_install/tools/wheel_installer/wheel_test.py +++ b/python/pip_install/tools/wheel_installer/wheel_test.py @@ -264,6 +264,48 @@ def test_deps_spanning_all_target_py_versions_are_added_to_common(self): self.assertEqual(["bar", "baz"], got.deps) self.assertEqual({}, got.deps_select) + def test_deps_are_not_duplicated(self): + # See an example in + # https://files.pythonhosted.org/packages/76/9e/db1c2d56c04b97981c06663384f45f28950a73d9acf840c4006d60d0a1ff/opencv_python-4.9.0.80-cp37-abi3-win32.whl.metadata + requires_dist = [ + "bar >=0.1.0 ; python_version < '3.7'", + "bar >=0.2.0 ; python_version >= '3.7'", + "bar >=0.4.0 ; python_version >= '3.6' and platform_system == 'Linux' and platform_machine == 'aarch64'", + "bar >=0.4.0 ; python_version >= '3.9'", + "bar >=0.5.0 ; python_version <= '3.9' and platform_system == 'Darwin' and platform_machine == 'arm64'", + "bar >=0.5.0 ; python_version >= '3.10' and platform_system == 'Darwin'", + "bar >=0.5.0 ; python_version >= '3.10'", + "bar >=0.6.0 ; python_version >= '3.11'", + ] + + deps = wheel.Deps( + "foo", + requires_dist=requires_dist, + platforms=wheel.Platform.from_string(["cp310_*"]), + ) + got = deps.build() + + self.assertEqual(["bar"], got.deps) + self.assertEqual({}, got.deps_select) + + def test_deps_are_not_duplicated_when_encountering_platform_dep_first(self): + # Note, that we are sorting the incoming `requires_dist` and we need to ensure that we are not getting any + # issues even if the platform-specific line comes first. + requires_dist = [ + "bar >=0.4.0 ; python_version >= '3.6' and platform_system == 'Linux' and platform_machine == 'aarch64'", + "bar >=0.5.0 ; python_version >= '3.9'", + ] + + deps = wheel.Deps( + "foo", + requires_dist=requires_dist, + platforms=wheel.Platform.from_string(["cp310_*"]), + ) + got = deps.build() + + self.assertEqual(["bar"], got.deps) + self.assertEqual({}, got.deps_select) + class MinorVersionTest(unittest.TestCase): def test_host(self): From 6aecae3aaf39fe1909ce62302b3f72b9ebb6b778 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 13 May 2024 08:30:19 +0900 Subject: [PATCH 023/345] chore: bump toolchain versions (#1878) Bump toolchain versions to use the latest available releases. * `3.8 -> 3.8.19` * `3.9 -> 3.9.19` * `3.10 -> 3.10.14` * `3.11 -> 3.11.9` * `3.12 -> 3.12.3` * Use release `20240224` to pick up some security fixes Fixes #1785 --- CHANGELOG.md | 16 ++++-- WORKSPACE | 2 +- python/versions.bzl | 117 ++++++++++++++++++++++++++++++++++---------- 3 files changed, 104 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 14f179f7a2..d727bb879e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,14 @@ A brief description of the categories of changes: * (deps): Bumped bazel_features to 1.9.1 to detect optional support non-blocking downloads. * (deps): Updated `pip_tools` to >= 7.4.0 +* (toolchains): Change some old toolchain versions to use [20240224] release to + include security fixes `3.8.18`, `3.9.18` and `3.10.13` +* (toolchains): Bump default toolchain versions to: + * `3.8 -> 3.8.19` + * `3.9 -> 3.9.19` + * `3.10 -> 3.10.14` + * `3.11 -> 3.11.9` + * `3.12 -> 3.12.3` ### Fixed @@ -53,9 +61,9 @@ A brief description of the categories of changes: ### Added * (toolchains) Added armv7 platform definition for python toolchains. - -* New Python versions available: `3.11.8`, `3.12.2` using - https://github.com/indygreg/python-build-standalone/releases/tag/20240224. +* (toolchains) New Python versions available: `3.11.8`, `3.12.2` using the [20240224] release. +* (toolchains) New Python versions available: `3.8.19`, `3.9.19`, `3.10.14`, `3.11.9`, `3.12.3` using + the [20240415] release. * (gazelle) Added a new `python_visibility` directive to control visibility of generated targets by appending additional visibility labels. * (gazelle) Added a new `python_default_visibility` directive to control the @@ -91,6 +99,8 @@ A brief description of the categories of changes: [python_default_visibility]: gazelle/README.md#directive-python_default_visibility [test_file_pattern_issue]: https://github.com/bazelbuild/rules_python/issues/1816 [test_file_pattern_docs]: gazelle/README.md#directive-python_test_file_pattern +[20240224]: https://github.com/indygreg/python-build-standalone/releases/tag/20240224. +[20240415]: https://github.com/indygreg/python-build-standalone/releases/tag/20240415. ## [0.31.0] - 2024-02-12 diff --git a/WORKSPACE b/WORKSPACE index 86a80bdda5..90e9305684 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -85,7 +85,7 @@ load("@rules_python_gazelle_plugin//:deps.bzl", _py_gazelle_deps = "gazelle_deps _py_gazelle_deps() # This interpreter is used for various rules_python dev-time tools -load("@python//3.11.8:defs.bzl", "interpreter") +load("@python//3.11.9:defs.bzl", "interpreter") ##################### # Install twine for our own runfiles wheel publishing. diff --git a/python/versions.bzl b/python/versions.bzl index 576a3c8928..b4c837ee8f 100644 --- a/python/versions.bzl +++ b/python/versions.bzl @@ -109,13 +109,24 @@ TOOL_VERSIONS = { "strip_prefix": "python", }, "3.8.18": { - "url": "20231002/cpython-{python_version}+20231002-{platform}-{build}.tar.gz", + "url": "20240224/cpython-{python_version}+20240224-{platform}-{build}.tar.gz", "sha256": { - "aarch64-apple-darwin": "1825b1f7220bc93ff143f2e70b5c6a79c6469e0eeb40824e07a7277f59aabfda", - "aarch64-unknown-linux-gnu": "236a300f386ead02ca98dbddbc026ff4ef4de6701a394106e291ff8b75445ee1", - "x86_64-apple-darwin": "fcf04532e644644213977242cd724fe5e84c0a5ac92ae038e07f1b01b474fca3", - "x86_64-pc-windows-msvc": "a9d203e78caed94de368d154e841610cef6f6b484738573f4ae9059d37e898a5", - "x86_64-unknown-linux-gnu": "1e8a3babd1500111359b0f5675d770984bcbcb2cc8890b117394f0ed342fb9ec", + "aarch64-apple-darwin": "4d493a1792bf211f37f98404cc1468f09bd781adc2602dea0df82ad264c11abc", + "aarch64-unknown-linux-gnu": "6588c9eed93833d9483d01fe40ac8935f691a1af8e583d404ec7666631b52487", + "x86_64-apple-darwin": "7d2cd8d289d5e3cdd0a8c06c028c7c621d3d00ce44b7e2f08c1724ae0471c626", + "x86_64-pc-windows-msvc": "dba923ee5df8f99db04f599e826be92880746c02247c8d8e4d955d4bc711af11", + "x86_64-unknown-linux-gnu": "5ae36825492372554c02708bdd26b8dcd57e3dbf34b3d6d599ad91d93540b2b7", + }, + "strip_prefix": "python", + }, + "3.8.19": { + "url": "20240415/cpython-{python_version}+20240415-{platform}-{build}.tar.gz", + "sha256": { + "aarch64-apple-darwin": "eae09ed83ee66353c0cee435ea2d3e4868bd0537214803fb256a1a2928710bc0", + "aarch64-unknown-linux-gnu": "5bde36c53a9a511a1618f159abed77264392eb054edeb57bb5740f6335db34a3", + "x86_64-apple-darwin": "05f0c488d84f7590afb6f5d192f071df80584339dda581b6186effc6cd690f6b", + "x86_64-pc-windows-msvc": "ee95c27e5d9de165e77c280ad4d7b51b0dab9567e7e233fc3acf72363870a168", + "x86_64-unknown-linux-gnu": "b33feb5ce0d7f9c4aca8621a9d231dfd9d2f6e26eccb56b63f07041ff573d5a5", }, "strip_prefix": "python", }, @@ -189,15 +200,28 @@ TOOL_VERSIONS = { "strip_prefix": "python", }, "3.9.18": { - "url": "20231002/cpython-{python_version}+20231002-{platform}-{build}.tar.gz", + "url": "20240224/cpython-{python_version}+20240224-{platform}-{build}.tar.gz", + "sha256": { + "aarch64-apple-darwin": "2548f911a6e316575c303ba42bb51540dc9b47a9f76a06a2a37460d93b177aa2", + "aarch64-unknown-linux-gnu": "e5bc5196baa603d635ee6b0cd141e359752ad3e8ea76127eb9141a3155c51200", + "ppc64le-unknown-linux-gnu": "d6b18df7a25fe034fd5ce4e64216df2cc78b2d4d908d2a1c94058ae700d73d22", + "s390x-unknown-linux-gnu": "15d059507c7e900e9665f31e8d903e5a24a68ceed24f9a1c5ac06ab42a354f3f", + "x86_64-apple-darwin": "171d8b472fce0295be0e28bb702c43d5a2a39feccb3e72efe620ac3843c3e402", + "x86_64-pc-windows-msvc": "a9bdbd728ed4c353a4157ecf74386117fb2a2769a9353f491c528371cfe7f6cd", + "x86_64-unknown-linux-gnu": "0e5663025121186bd17d331538a44f48b41baff247891d014f3f962cbe2716b4", + }, + "strip_prefix": "python", + }, + "3.9.19": { + "url": "20240415/cpython-{python_version}+20240415-{platform}-{build}.tar.gz", "sha256": { - "aarch64-apple-darwin": "fdc4054837e37b69798c2ef796222a480bc1f80e8ad3a01a95d0168d8282a007", - "aarch64-unknown-linux-gnu": "1e0a3e8ce8e58901a259748c0ab640d2b8294713782d14229e882c6898b2fb36", - "ppc64le-unknown-linux-gnu": "101c38b22fb2f5a0945156da4259c8e9efa0c08de9d7f59afa51e7ce6e22a1cc", - "s390x-unknown-linux-gnu": "eee31e55ffbc1f460d7b17f05dd89e45a2636f374a6f8dc29ea13d0497f7f586", - "x86_64-apple-darwin": "82231cb77d4a5c8081a1a1d5b8ae440abe6993514eb77a926c826e9a69a94fb1", - "x86_64-pc-windows-msvc": "02ea7bb64524886bd2b05d6b6be4401035e4ba4319146f274f0bcd992822cd75", - "x86_64-unknown-linux-gnu": "f3ff38b1ccae7dcebd8bbf2e533c9a984fac881de0ffd1636fbb61842bd924de", + "aarch64-apple-darwin": "2671bb4ffd036f03076c8aa41e3828c4c16a602e93e2249a8e7b28fd83fdde51", + "aarch64-unknown-linux-gnu": "b18ad819f04c5b2cff6ffa95dd59263d00dcd6f5633d11e43685b4017469cb1c", + "ppc64le-unknown-linux-gnu": "2521ebe9eef273ab718670ed6c6c11760214cdc2e34b7609674179629659a6cd", + "s390x-unknown-linux-gnu": "8f83b8f357031cd6788ca253b1ac29020b73c8b41d0e5fb09a554d0d6c04ae83", + "x86_64-apple-darwin": "627d903588c0e69ed8b941ba9f91e070e38105a627c5b8c730267744760dca84", + "x86_64-pc-windows-msvc": "9b46faee13e37d8bfa4c02de3775ca3d5dec9378697d755b750fd37788179286", + "x86_64-unknown-linux-gnu": "00f698873804863dedc0e2b2c2cc4303b49ab0703af2e5883e11340cb8079d0f", }, "strip_prefix": "python", }, @@ -282,15 +306,28 @@ TOOL_VERSIONS = { "strip_prefix": "python", }, "3.10.13": { - "url": "20231002/cpython-{python_version}+20231002-{platform}-{build}.tar.gz", + "url": "20240224/cpython-{python_version}+20240224-{platform}-{build}.tar.gz", "sha256": { - "aarch64-apple-darwin": "fd027b1dedf1ea034cdaa272e91771bdf75ddef4c8653b05d224a0645aa2ca3c", - "aarch64-unknown-linux-gnu": "8675915ff454ed2f1597e27794bc7df44f5933c26b94aa06af510fe91b58bb97", - "ppc64le-unknown-linux-gnu": "f3f9c43eec1a0c3f72845d0b705da17a336d3906b7df212d2640b8f47e8ff375", - "s390x-unknown-linux-gnu": "859f6cfe9aedb6e8858892fdc124037e83ab05f28d42a7acd314c6a16d6bd66c", - "x86_64-apple-darwin": "be0b19b6af1f7d8c667e5abef5505ad06cf72e5a11bb5844970c395a7e5b1275", - "x86_64-pc-windows-msvc": "b8d930ce0d04bda83037ad3653d7450f8907c88e24bb8255a29b8dab8930d6f1", - "x86_64-unknown-linux-gnu": "5d0429c67c992da19ba3eb58b3acd0b35ec5e915b8cae9a4aa8ca565c423847a", + "aarch64-apple-darwin": "5fdc0f6a5b5a90fd3c528e8b1da8e3aac931ea8690126c2fdb4254c84a3ff04a", + "aarch64-unknown-linux-gnu": "a898a88705611b372297bb8fe4d23cc16b8603ce5f24494c3a8cfa65d83787f9", + "ppc64le-unknown-linux-gnu": "c23706e138a0351fc1e9def2974af7b8206bac7ecbbb98a78f5aa9e7535fee42", + "s390x-unknown-linux-gnu": "09be8fb2cdfbb4a93d555f268f244dbe4d8ff1854b2658e8043aa4ec08aede3e", + "x86_64-apple-darwin": "6378dfd22f58bb553ddb02be28304d739cd730c1f95c15c74955c923a1bc3d6a", + "x86_64-pc-windows-msvc": "086f7fe9156b897bb401273db8359017104168ac36f60f3af4e31ac7acd6634e", + "x86_64-unknown-linux-gnu": "d995d032ca702afd2fc3a689c1f84a6c64972ecd82bba76a61d525f08eb0e195", + }, + "strip_prefix": "python", + }, + "3.10.14": { + "url": "20240415/cpython-{python_version}+20240415-{platform}-{build}.tar.gz", + "sha256": { + "aarch64-apple-darwin": "389da793b7666e9310908b4fe3ddcf0a20b55727fcb384c7c49b01bb21716f89", + "aarch64-unknown-linux-gnu": "2f9f26c430df19d6d2a25ac3f2a8e74106d32b9951b85f95218ceeb13d52e952", + "ppc64le-unknown-linux-gnu": "9f178c19850567391188c2f9de87ce3c9fce698a23f5f3470be03745a03d1daa", + "s390x-unknown-linux-gnu": "648aa520de74ee426231e4a5349598990abe42a97c347ce6240b166f23ee5903", + "x86_64-apple-darwin": "8e27ec6f27b3a27be892c7a9db1e278c858acd9d90c1114013fe5587cd6fc5e6", + "x86_64-pc-windows-msvc": "186b5632fb2fa5b5e6eee4110ce9bbb0349f52bb2163d2a1f5188b1d8eb1b5f3", + "x86_64-unknown-linux-gnu": "c83c5485659250ef4e4fedb8e7f7b97bc99cc8cf5a1b11d0d1a98d347a43411d", }, "strip_prefix": "python", }, @@ -382,6 +419,19 @@ TOOL_VERSIONS = { }, "strip_prefix": "python", }, + "3.11.9": { + "url": "20240415/cpython-{python_version}+20240415-{platform}-{build}.tar.gz", + "sha256": { + "aarch64-apple-darwin": "7af7058f7c268b4d87ed7e08c2c7844ef8460863b3e679db3afdce8bb1eedfae", + "aarch64-unknown-linux-gnu": "b3a7199ac2615d75fb906e5ba556432efcf24baf8651fc70370d9f052d4069ee", + "ppc64le-unknown-linux-gnu": "03f62d1e2d400c9662cdd12ae33a6f328c34ae8e2b872f8563a144834742bd6a", + "s390x-unknown-linux-gnu": "3f7a0dd64fa292977c4da09e865ee504a48e55dbc2dbfd9ff4b991af891e4446", + "x86_64-apple-darwin": "9afd734f63a23783cf0257bef25c9231ffc80e7747486dc54cf72f325213fd15", + "x86_64-pc-windows-msvc": "368474c69f476e7de4adaf50b61d9fcf6ec8b4db88cc43c5f71c860b3cd29c69", + "x86_64-unknown-linux-gnu": "78b1c16a9fd032997ba92a60f46a64f795cd18ff335659dfdf6096df277b24d5", + }, + "strip_prefix": "python", + }, "3.12.0": { "url": "20231002/cpython-{python_version}+20231002-{platform}-{build}.tar.gz", "sha256": { @@ -421,15 +471,28 @@ TOOL_VERSIONS = { }, "strip_prefix": "python", }, + "3.12.3": { + "url": "20240415/cpython-{python_version}+20240415-{platform}-{build}.tar.gz", + "sha256": { + "aarch64-apple-darwin": "ccc40e5af329ef2af81350db2a88bbd6c17b56676e82d62048c15d548401519e", + "aarch64-unknown-linux-gnu": "ec8126de97945e629cca9aedc80a29c4ae2992c9d69f2655e27ae73906ba187d", + "ppc64le-unknown-linux-gnu": "c5dcf08b8077e617d949bda23027c49712f583120b3ed744f9b143da1d580572", + "s390x-unknown-linux-gnu": "872fc321363b8cdd826fd2cb1adfd1ceb813bc1281f9d410c1c2c4e177e8df86", + "x86_64-apple-darwin": "c37a22fca8f57d4471e3708de6d13097668c5f160067f264bb2b18f524c890c8", + "x86_64-pc-windows-msvc": "f7cfa4ad072feb4578c8afca5ba9a54ad591d665a441dd0d63aa366edbe19279", + "x86_64-unknown-linux-gnu": "a73ba777b5d55ca89edef709e6b8521e3f3d4289581f174c8699adfb608d09d6", + }, + "strip_prefix": "python", + }, } # buildifier: disable=unsorted-dict-items MINOR_MAPPING = { - "3.8": "3.8.18", - "3.9": "3.9.18", - "3.10": "3.10.13", - "3.11": "3.11.8", - "3.12": "3.12.2", + "3.8": "3.8.19", + "3.9": "3.9.19", + "3.10": "3.10.14", + "3.11": "3.11.9", + "3.12": "3.12.3", } PLATFORMS = { From 407826adb4da6a62754e960c244e0f773602fe02 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 12 May 2024 18:55:37 -0700 Subject: [PATCH 024/345] chore: release notes for 0.32.0 (#1893) Updates release notes for 0.32.0 --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d727bb879e..daccaaa37a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,9 @@ A brief description of the categories of changes: * Particular sub-systems are identified using parentheses, e.g. `(bzlmod)` or `(docs)`. -## Unreleased +## [0.32.0] - 2024-05-12 + +[0.32.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.32.0 ### Changed @@ -95,7 +97,6 @@ A brief description of the categories of changes: depend on legacy labels instead of the hub repo aliases and you use the `experimental_requirement_cycles`, now is a good time to migrate. -[0.XX.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.XX.0 [python_default_visibility]: gazelle/README.md#directive-python_default_visibility [test_file_pattern_issue]: https://github.com/bazelbuild/rules_python/issues/1816 [test_file_pattern_docs]: gazelle/README.md#directive-python_test_file_pattern From 9fa38df4a18779f79280070a1728eb91a7b1512a Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 13 May 2024 11:53:59 +0900 Subject: [PATCH 025/345] fix(bcr): add mandatory gazelle bcr presubmit attrs (#1894) The same as in f1d1732b11929671110e6a1b845c8d1a1a67530f. Fixes that were needed in [bazel/bazel-central-registry#2019](https://github.com/bazelbuild/bazel-central-registry/pull/2019). --- .bcr/gazelle/presubmit.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.bcr/gazelle/presubmit.yml b/.bcr/gazelle/presubmit.yml index 037055d66d..659beab525 100644 --- a/.bcr/gazelle/presubmit.yml +++ b/.bcr/gazelle/presubmit.yml @@ -16,10 +16,12 @@ bcr_test_module: module_path: "../examples/bzlmod_build_file_generation" matrix: platform: ["debian11", "macos", "ubuntu2004", "windows"] + bazel: [6.x, 7.x] tasks: run_tests: name: "Run test module" platform: ${{ platform }} + bazel: ${{ bazel }} build_targets: - "//..." - ":modules_map" From 4320d7a0cbd648c45efb5834b74aec7d9f92901a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 17:58:09 +0900 Subject: [PATCH 026/345] build(deps): bump jinja2 from 3.1.3 to 3.1.4 in /examples/bzlmod (#1883) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.3 to 3.1.4.
Release notes

Sourced from jinja2's releases.

3.1.4

This is the Jinja 3.1.4 security release, which fixes security issues and bugs but does not otherwise change behavior and should not result in breaking changes.

PyPI: https://pypi.org/project/Jinja2/3.1.4/ Changes: https://jinja.palletsprojects.com/en/3.1.x/changes/#version-3-1-4

  • The xmlattr filter does not allow keys with / solidus, > greater-than sign, or = equals sign, in addition to disallowing spaces. Regardless of any validation done by Jinja, user input should never be used as keys to this filter, or must be separately validated first. GHSA-h75v-3vvj-5mfj
Changelog

Sourced from jinja2's changelog.

Version 3.1.4

Released 2024-05-05

  • The xmlattr filter does not allow keys with / solidus, > greater-than sign, or = equals sign, in addition to disallowing spaces. Regardless of any validation done by Jinja, user input should never be used as keys to this filter, or must be separately validated first. :ghsa:h75v-3vvj-5mfj
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=jinja2&package-manager=pip&previous-version=3.1.3&new-version=3.1.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/bazelbuild/rules_python/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/bzlmod/requirements_lock_3_10.txt | 6 +++--- examples/bzlmod/requirements_lock_3_9.txt | 6 +++--- examples/bzlmod/requirements_windows_3_10.txt | 6 +++--- examples/bzlmod/requirements_windows_3_9.txt | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/examples/bzlmod/requirements_lock_3_10.txt b/examples/bzlmod/requirements_lock_3_10.txt index eb66e3fcb8..ace879f38e 100644 --- a/examples/bzlmod/requirements_lock_3_10.txt +++ b/examples/bzlmod/requirements_lock_3_10.txt @@ -50,9 +50,9 @@ isort==5.12.0 \ --hash=sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504 \ --hash=sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6 # via pylint -jinja2==3.1.3 \ - --hash=sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa \ - --hash=sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90 +jinja2==3.1.4 \ + --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ + --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d # via sphinx lazy-object-proxy==1.9.0 \ --hash=sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382 \ diff --git a/examples/bzlmod/requirements_lock_3_9.txt b/examples/bzlmod/requirements_lock_3_9.txt index d5b36539b4..e6aaa992fb 100644 --- a/examples/bzlmod/requirements_lock_3_9.txt +++ b/examples/bzlmod/requirements_lock_3_9.txt @@ -54,9 +54,9 @@ isort==5.11.4 \ --hash=sha256:6db30c5ded9815d813932c04c2f85a360bcdd35fed496f4d8f35495ef0a261b6 \ --hash=sha256:c033fd0edb91000a7f09527fe5c75321878f98322a77ddcc81adbd83724afb7b # via pylint -jinja2==3.1.3 \ - --hash=sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa \ - --hash=sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90 +jinja2==3.1.4 \ + --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ + --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d # via sphinx lazy-object-proxy==1.10.0 \ --hash=sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56 \ diff --git a/examples/bzlmod/requirements_windows_3_10.txt b/examples/bzlmod/requirements_windows_3_10.txt index da37193459..e4373c1682 100644 --- a/examples/bzlmod/requirements_windows_3_10.txt +++ b/examples/bzlmod/requirements_windows_3_10.txt @@ -53,9 +53,9 @@ isort==5.12.0 \ --hash=sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504 \ --hash=sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6 # via pylint -jinja2==3.1.3 \ - --hash=sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa \ - --hash=sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90 +jinja2==3.1.4 \ + --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ + --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d # via sphinx lazy-object-proxy==1.9.0 \ --hash=sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382 \ diff --git a/examples/bzlmod/requirements_windows_3_9.txt b/examples/bzlmod/requirements_windows_3_9.txt index a67a574bfe..636b4dfc3e 100644 --- a/examples/bzlmod/requirements_windows_3_9.txt +++ b/examples/bzlmod/requirements_windows_3_9.txt @@ -57,9 +57,9 @@ isort==5.11.4 \ --hash=sha256:6db30c5ded9815d813932c04c2f85a360bcdd35fed496f4d8f35495ef0a261b6 \ --hash=sha256:c033fd0edb91000a7f09527fe5c75321878f98322a77ddcc81adbd83724afb7b # via pylint -jinja2==3.1.3 \ - --hash=sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa \ - --hash=sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90 +jinja2==3.1.4 \ + --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ + --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d # via sphinx lazy-object-proxy==1.10.0 \ --hash=sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56 \ From df55823a6922324ff0c838bf58ed4acf40154bb8 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Tue, 14 May 2024 11:14:11 +0900 Subject: [PATCH 027/345] fix(toolchain): delete 'share/terminfo' for recent linux python toolchains (#1898) This affects Linux toolchains that have the `terminfo` databases bundled with the toolchain. Our solution to this is to remove the `share/terminfo` altogether if we are downloading an affected `linux` toolchain. Tested with (on a Mac): ```console bazel build --platforms=//tests/support:linux_x86_64 @python_3_11//:files bazel build --platforms=//tests/support:windows_x86_64 @python_3_11//:files ``` Workaround https://github.com/indygreg/python-build-standalone/issues/231 Fixes #1800 --- CHANGELOG.md | 21 +++++++++++++++++++++ MODULE.bazel | 2 +- python/repositories.bzl | 29 +++++++++++++++++++++++++---- tests/support/BUILD.bazel | 26 ++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index daccaaa37a..0a3031c2a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,27 @@ A brief description of the categories of changes: * Particular sub-systems are identified using parentheses, e.g. `(bzlmod)` or `(docs)`. +## Unreleased + +[x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/x.x.x + +### Changed + +### Fixed + +### Added + +## [0.32.2] - 2024-05-14 + +[0.32.2]: https://github.com/bazelbuild/rules_python/releases/tag/0.32.2 + +### Fixed + +* Workaround existence of infinite symlink loops on case insensitive filesystems when targeting linux platforms with recent Python toolchains. Works around an upstream [issue][indygreg-231]. Fixes [#1800][rules_python_1800]. + +[indygreg-231]: https://github.com/indygreg/python-build-standalone/issues/231 +[rules_python_1800]: https://github.com/bazelbuild/rules_python/issues/1800 + ## [0.32.0] - 2024-05-12 [0.32.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.32.0 diff --git a/MODULE.bazel b/MODULE.bazel index 2c325a6ef8..3e62ab76ef 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -49,7 +49,7 @@ python.toolchain( is_default = True, python_version = "3.11", ) -use_repo(python, "python_versions", "pythons_hub") +use_repo(python, "python_3_11", "python_versions", "pythons_hub") # This call registers the Python toolchains. register_toolchains("@pythons_hub//:all") diff --git a/python/repositories.bzl b/python/repositories.bzl index f77d302ca6..eb122b6e7b 100644 --- a/python/repositories.bzl +++ b/python/repositories.bzl @@ -176,7 +176,7 @@ def _python_repository_impl(rctx): rctx.patch(patch, strip = 1) # Write distutils.cfg to the Python installation. - if "windows" in rctx.os.name: + if "windows" in platform: distutils_path = "Lib/distutils/distutils.cfg" else: distutils_path = "lib/python{}/distutils/distutils.cfg".format(python_short_version) @@ -187,7 +187,7 @@ def _python_repository_impl(rctx): # Make the Python installation read-only. if not rctx.attr.ignore_root_user_error: - if "windows" not in rctx.os.name: + if "windows" not in platform: lib_dir = "lib" if "windows" not in platform else "Lib" repo_utils.execute_checked( @@ -228,7 +228,28 @@ def _python_repository_impl(rctx): "**/__pycache__/*.pyc.*", # During pyc creation, temp files named *.pyc.NNN are created ] - if rctx.attr.ignore_root_user_error or "windows" in rctx.os.name: + if "linux" in platform: + # Workaround around https://github.com/indygreg/python-build-standalone/issues/231 + for url in urls: + head_and_release, _, _ = url.rpartition("/") + _, _, release = head_and_release.rpartition("/") + if not release.isdigit(): + # Maybe this is some custom toolchain, so skip this + break + + if int(release) >= 20240224: + # Starting with this release the Linux toolchains have infinite symlink loop + # on host platforms that are not Linux. Delete the files no + # matter the host platform so that the cross-built artifacts + # are the same irrespective of the host platform we are + # building on. + # + # Link to the first affected release: + # https://github.com/indygreg/python-build-standalone/releases/tag/20240224 + rctx.delete("share/terminfo") + break + + if rctx.attr.ignore_root_user_error or "windows" in platform: glob_exclude += [ # These pycache files are created on first use of the associated python files. # Exclude them from the glob because otherwise between the first time and second time a python toolchain is used," @@ -263,7 +284,7 @@ def _python_repository_impl(rctx): ] if rctx.attr.coverage_tool: - if "windows" in rctx.os.name: + if "windows" in platform: coverage_tool = None else: coverage_tool = '"{}"'.format(rctx.attr.coverage_tool) diff --git a/tests/support/BUILD.bazel b/tests/support/BUILD.bazel index 316e9abbf1..0a4c98ccce 100644 --- a/tests/support/BUILD.bazel +++ b/tests/support/BUILD.bazel @@ -37,3 +37,29 @@ platform( "@platforms//os:windows", ], ) + +# Used when testing downloading of toolchains for a different platform + +platform( + name = "linux_x86_64", + constraint_values = [ + "@platforms//cpu:x86_64", + "@platforms//os:linux", + ], +) + +platform( + name = "mac_x86_64", + constraint_values = [ + "@platforms//cpu:x86_64", + "@platforms//os:macos", + ], +) + +platform( + name = "windows_x86_64", + constraint_values = [ + "@platforms//cpu:x86_64", + "@platforms//os:windows", + ], +) From 781935fa3502a6e467276d8cc76c31dd10e88d7e Mon Sep 17 00:00:00 2001 From: hunshcn Date: Wed, 15 May 2024 16:25:30 +0800 Subject: [PATCH 028/345] fix(gazelle): delete invalid py_library and use correct NonEmptyAttrs for py_* (#1887) Before gazelle would leave generated py_library targets aroundeven when no files in a directory exist because X. With this change gazelle correctly handles this case. --- CHANGELOG.md | 6 +++++ gazelle/python/generate.go | 17 ++++++------- gazelle/python/kinds.go | 25 ++++++++----------- .../testdata/remove_invalid_library/BUILD.in | 16 ++++++++++++ .../testdata/remove_invalid_library/BUILD.out | 10 ++++++++ .../testdata/remove_invalid_library/README.md | 3 +++ .../testdata/remove_invalid_library/WORKSPACE | 1 + .../testdata/remove_invalid_library/test.yaml | 15 +++++++++++ 8 files changed, 70 insertions(+), 23 deletions(-) create mode 100644 gazelle/python/testdata/remove_invalid_library/BUILD.in create mode 100644 gazelle/python/testdata/remove_invalid_library/BUILD.out create mode 100644 gazelle/python/testdata/remove_invalid_library/README.md create mode 100644 gazelle/python/testdata/remove_invalid_library/WORKSPACE create mode 100644 gazelle/python/testdata/remove_invalid_library/test.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a3031c2a7..1e993a7db8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,12 @@ A brief description of the categories of changes: ### Fixed +* (gazelle) Remove `visibility` from `NonEmptyAttr`. + Now empty(have no `deps/main/srcs/imports` attr) `py_library/test/binary` rules will + be automatically deleted correctly. For example, if `python_generation_mode` + is set to package, when `__init__.py` is deleted, the `py_library` generated + for this package before will be deleted automatically. + ### Added ## [0.32.2] - 2024-05-14 diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index 8889438c05..74543395c8 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -270,11 +270,6 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes } } - // If we're doing per-file generation, srcs could be empty at this point, meaning we shouldn't make a py_library. - if srcs.Empty() { - return - } - // Check if a target with the same name we are generating already // exists, and if it is of a different kind from the one we are // generating. If so, we have to throw an error since Gazelle won't @@ -295,8 +290,12 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes generateImportsAttribute(). build() - result.Gen = append(result.Gen, pyLibrary) - result.Imports = append(result.Imports, pyLibrary.PrivateAttr(config.GazelleImportsKey)) + if pyLibrary.IsEmpty(py.Kinds()[pyLibrary.Kind()]) { + result.Empty = append(result.Gen, pyLibrary) + } else { + result.Gen = append(result.Gen, pyLibrary) + result.Imports = append(result.Imports, pyLibrary.PrivateAttr(config.GazelleImportsKey)) + } } if cfg.PerFileGeneration() { hasInit, nonEmptyInit := hasLibraryEntrypointFile(args.Dir) @@ -311,7 +310,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes } appendPyLibrary(srcs, pyLibraryTargetName) }) - } else if !pyLibraryFilenames.Empty() { + } else { appendPyLibrary(pyLibraryFilenames, cfg.RenderLibraryName(packageName)) } @@ -411,7 +410,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes // the file exists on disk. pyTestFilenames.Add(pyTestEntrypointFilename) } - if (hasPyTestEntryPointTarget || !pyTestFilenames.Empty()) { + if hasPyTestEntryPointTarget || !pyTestFilenames.Empty() { pyTestTargetName := cfg.RenderTestName(packageName) pyTestTarget := newPyTestTargetBuilder(pyTestFilenames, pyTestTargetName) diff --git a/gazelle/python/kinds.go b/gazelle/python/kinds.go index 941b45b5c6..a9483372e2 100644 --- a/gazelle/python/kinds.go +++ b/gazelle/python/kinds.go @@ -34,11 +34,10 @@ var pyKinds = map[string]rule.KindInfo{ pyBinaryKind: { MatchAny: true, NonEmptyAttrs: map[string]bool{ - "deps": true, - "main": true, - "srcs": true, - "imports": true, - "visibility": true, + "deps": true, + "main": true, + "srcs": true, + "imports": true, }, SubstituteAttrs: map[string]bool{}, MergeableAttrs: map[string]bool{ @@ -52,10 +51,9 @@ var pyKinds = map[string]rule.KindInfo{ MatchAny: false, MatchAttrs: []string{"srcs"}, NonEmptyAttrs: map[string]bool{ - "deps": true, - "srcs": true, - "imports": true, - "visibility": true, + "deps": true, + "srcs": true, + "imports": true, }, SubstituteAttrs: map[string]bool{}, MergeableAttrs: map[string]bool{ @@ -68,11 +66,10 @@ var pyKinds = map[string]rule.KindInfo{ pyTestKind: { MatchAny: false, NonEmptyAttrs: map[string]bool{ - "deps": true, - "main": true, - "srcs": true, - "imports": true, - "visibility": true, + "deps": true, + "main": true, + "srcs": true, + "imports": true, }, SubstituteAttrs: map[string]bool{}, MergeableAttrs: map[string]bool{ diff --git a/gazelle/python/testdata/remove_invalid_library/BUILD.in b/gazelle/python/testdata/remove_invalid_library/BUILD.in new file mode 100644 index 0000000000..3f24c8df35 --- /dev/null +++ b/gazelle/python/testdata/remove_invalid_library/BUILD.in @@ -0,0 +1,16 @@ +load("@rules_python//python:defs.bzl", "py_library") + +py_library( + name = "remove_invalid_library", + srcs = ["__init__.py"], + visibility = ["//:__subpackages__"], +) + +py_library( + name = "deps_with_no_srcs_library", + deps = [ + "//:remove_invalid_library", + "@pypi//bar", + "@pypi//foo", + ], +) diff --git a/gazelle/python/testdata/remove_invalid_library/BUILD.out b/gazelle/python/testdata/remove_invalid_library/BUILD.out new file mode 100644 index 0000000000..4a6fffa183 --- /dev/null +++ b/gazelle/python/testdata/remove_invalid_library/BUILD.out @@ -0,0 +1,10 @@ +load("@rules_python//python:defs.bzl", "py_library") + +py_library( + name = "deps_with_no_srcs_library", + deps = [ + "//:remove_invalid_library", + "@pypi//bar", + "@pypi//foo", + ], +) diff --git a/gazelle/python/testdata/remove_invalid_library/README.md b/gazelle/python/testdata/remove_invalid_library/README.md new file mode 100644 index 0000000000..7a35167857 --- /dev/null +++ b/gazelle/python/testdata/remove_invalid_library/README.md @@ -0,0 +1,3 @@ +# Remove invalid + +This test case asserts that `py_library` should be deleted if invalid. diff --git a/gazelle/python/testdata/remove_invalid_library/WORKSPACE b/gazelle/python/testdata/remove_invalid_library/WORKSPACE new file mode 100644 index 0000000000..faff6af87a --- /dev/null +++ b/gazelle/python/testdata/remove_invalid_library/WORKSPACE @@ -0,0 +1 @@ +# This is a Bazel workspace for the Gazelle test data. diff --git a/gazelle/python/testdata/remove_invalid_library/test.yaml b/gazelle/python/testdata/remove_invalid_library/test.yaml new file mode 100644 index 0000000000..fcea77710f --- /dev/null +++ b/gazelle/python/testdata/remove_invalid_library/test.yaml @@ -0,0 +1,15 @@ +# 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. + +--- From 3744e4dd746aaf30fb3777f008059a1789ca13ba Mon Sep 17 00:00:00 2001 From: hunshcn Date: Thu, 16 May 2024 22:52:18 +0800 Subject: [PATCH 029/345] fix(gazelle): generate empty py_library only when need (#1905) #1887 incorrectly generated an empty py_library for all dirs, although it will eventually be removed because it is empty, but it will easily conflict with other existing rules. Fix this error, and only generate an empty py_library for bazel packages with the same name py_library rule. --- gazelle/python/generate.go | 20 ++++++++++++++++++- .../remove_invalid_library/others/BUILD.in | 5 +++++ .../remove_invalid_library/others/BUILD.out | 5 +++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 gazelle/python/testdata/remove_invalid_library/others/BUILD.in create mode 100644 gazelle/python/testdata/remove_invalid_library/others/BUILD.out diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index 74543395c8..ef49dd74c4 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -27,11 +27,12 @@ import ( "github.com/bazelbuild/bazel-gazelle/label" "github.com/bazelbuild/bazel-gazelle/language" "github.com/bazelbuild/bazel-gazelle/rule" - "github.com/bazelbuild/rules_python/gazelle/pythonconfig" "github.com/bmatcuk/doublestar/v4" "github.com/emirpasic/gods/lists/singlylinkedlist" "github.com/emirpasic/gods/sets/treeset" godsutils "github.com/emirpasic/gods/utils" + + "github.com/bazelbuild/rules_python/gazelle/pythonconfig" ) const ( @@ -270,6 +271,23 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes } } + // If we're doing per-file generation, srcs could be empty at this point, meaning we shouldn't make a py_library. + // If there is already a package named py_library target before, we should generate an empty py_library. + if srcs.Empty() { + if args.File == nil { + return + } + generateEmptyLibrary := false + for _, r := range args.File.Rules { + if r.Kind() == actualPyLibraryKind && r.Name() == pyLibraryTargetName { + generateEmptyLibrary = true + } + } + if !generateEmptyLibrary { + return + } + } + // Check if a target with the same name we are generating already // exists, and if it is of a different kind from the one we are // generating. If so, we have to throw an error since Gazelle won't diff --git a/gazelle/python/testdata/remove_invalid_library/others/BUILD.in b/gazelle/python/testdata/remove_invalid_library/others/BUILD.in new file mode 100644 index 0000000000..557832772d --- /dev/null +++ b/gazelle/python/testdata/remove_invalid_library/others/BUILD.in @@ -0,0 +1,5 @@ +genrule( + name = "others", # same to directory name + outs = ["data.txt"], + cmd = "echo foo bar baz > $@", +) \ No newline at end of file diff --git a/gazelle/python/testdata/remove_invalid_library/others/BUILD.out b/gazelle/python/testdata/remove_invalid_library/others/BUILD.out new file mode 100644 index 0000000000..557832772d --- /dev/null +++ b/gazelle/python/testdata/remove_invalid_library/others/BUILD.out @@ -0,0 +1,5 @@ +genrule( + name = "others", # same to directory name + outs = ["data.txt"], + cmd = "echo foo bar baz > $@", +) \ No newline at end of file From 45363a124572c4954b84ba6c948012f0e9061aed Mon Sep 17 00:00:00 2001 From: Fabian Meumertzheim Date: Sat, 18 May 2024 04:22:34 +0200 Subject: [PATCH 030/345] refactor: Mark internal and `python` extension as reproducible (#1892) This avoids unnecessary lockfile entries for users of rules_python. --------- Co-authored-by: aignas <240938+aignas@users.noreply.github.com> --- CHANGELOG.md | 7 ++++++- MODULE.bazel | 3 +-- gazelle/MODULE.bazel | 2 +- python/extensions/BUILD.bazel | 1 + python/private/bzlmod/BUILD.bazel | 2 +- python/private/bzlmod/internal_deps.bzl | 13 +++++-------- python/private/bzlmod/python.bzl | 6 ++++++ 7 files changed, 21 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e993a7db8..3b0d526870 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,11 @@ A brief description of the categories of changes: ### Changed +* (deps): Bumped `bazel_skylib` to 1.6.1. +* (bzlmod): The `python` and internal `rules_python` extensions have been + marked as `reproducible` and will not include any lock file entries from now + on. + ### Fixed * (gazelle) Remove `visibility` from `NonEmptyAttr`. @@ -54,7 +59,7 @@ A brief description of the categories of changes: sorted in the attributes section. We are also removing values that are not default in order to reduce the size of the lock file. * (coverage) Bump `coverage.py` to [7.4.3](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst#version-743--2024-02-23). -* (deps): Bumped bazel_features to 1.9.1 to detect optional support +* (deps): Bumped `bazel_features` to 1.9.1 to detect optional support non-blocking downloads. * (deps): Updated `pip_tools` to >= 7.4.0 * (toolchains): Change some old toolchain versions to use [20240224] release to diff --git a/MODULE.bazel b/MODULE.bazel index 3e62ab76ef..8acde16c33 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -5,7 +5,7 @@ module( ) bazel_dep(name = "bazel_features", version = "1.9.1") -bazel_dep(name = "bazel_skylib", version = "1.3.0") +bazel_dep(name = "bazel_skylib", version = "1.6.1") bazel_dep(name = "rules_cc", version = "0.0.9") bazel_dep(name = "platforms", version = "0.0.4") @@ -14,7 +14,6 @@ bazel_dep(name = "rules_proto", version = "6.0.0-rc1") bazel_dep(name = "protobuf", version = "21.7", repo_name = "com_google_protobuf") internal_deps = use_extension("//python/private/bzlmod:internal_deps.bzl", "internal_deps") -internal_deps.install() use_repo( internal_deps, "rules_python_internal", diff --git a/gazelle/MODULE.bazel b/gazelle/MODULE.bazel index 1d01f49e1a..6ae7719d4b 100644 --- a/gazelle/MODULE.bazel +++ b/gazelle/MODULE.bazel @@ -4,7 +4,7 @@ module( compatibility_level = 1, ) -bazel_dep(name = "bazel_skylib", version = "1.5.0") +bazel_dep(name = "bazel_skylib", version = "1.6.1") 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") diff --git a/python/extensions/BUILD.bazel b/python/extensions/BUILD.bazel index a9dede44ec..eb095ab746 100644 --- a/python/extensions/BUILD.bazel +++ b/python/extensions/BUILD.bazel @@ -37,6 +37,7 @@ bzl_library( visibility = ["//:__subpackages__"], deps = [ "//python/private:util_bzl", + "//python/private/bzlmod:bazel_features_bzl", "//python/private/bzlmod:python_bzl", ], ) diff --git a/python/private/bzlmod/BUILD.bazel b/python/private/bzlmod/BUILD.bazel index 0ec95e4bed..9edd3380bb 100644 --- a/python/private/bzlmod/BUILD.bazel +++ b/python/private/bzlmod/BUILD.bazel @@ -45,7 +45,7 @@ bzl_library( bzl_library( name = "bazel_features_bzl", - srcs = ["@bazel_features//:bzl_files"], + deps = ["@bazel_features//:features"], ) bzl_library( diff --git a/python/private/bzlmod/internal_deps.bzl b/python/private/bzlmod/internal_deps.bzl index aadf2cc997..62ca71fecc 100644 --- a/python/private/bzlmod/internal_deps.bzl +++ b/python/private/bzlmod/internal_deps.bzl @@ -8,18 +8,15 @@ "Python toolchain module extension for internal rule use" +load("@bazel_skylib//lib:modules.bzl", "modules") load("//python/pip_install:repositories.bzl", "pip_install_dependencies") load("//python/private:internal_config_repo.bzl", "internal_config_repo") -# buildifier: disable=unused-variable -def _internal_deps_impl(module_ctx): +def _internal_deps(): internal_config_repo(name = "rules_python_internal") pip_install_dependencies() -internal_deps = module_extension( - doc = "This extension to register internal rules_python dependecies.", - implementation = _internal_deps_impl, - tag_classes = { - "install": tag_class(attrs = dict()), - }, +internal_deps = modules.as_extension( + _internal_deps, + doc = "This extension registers internal rules_python dependencies.", ) diff --git a/python/private/bzlmod/python.bzl b/python/private/bzlmod/python.bzl index 5862f00d7b..f8be271fd6 100644 --- a/python/private/bzlmod/python.bzl +++ b/python/private/bzlmod/python.bzl @@ -14,6 +14,7 @@ "Python toolchain module extensions for use with bzlmod" +load("@bazel_features//:features.bzl", "bazel_features") load("//python:repositories.bzl", "python_register_toolchains") load("//python/private:toolchains_repo.bzl", "multi_toolchain_aliases") load("//python/private:util.bzl", "IS_BAZEL_6_4_OR_HIGHER") @@ -230,6 +231,11 @@ def _python_impl(module_ctx): debug_info = json.encode_indent(debug_info), ) + if bazel_features.external_deps.extension_metadata_has_reproducible: + return module_ctx.extension_metadata(reproducible = True) + else: + return None + def _fail_duplicate_module_toolchain_version(version, module): fail(("Duplicate module toolchain version: module '{module}' attempted " + "to use version '{version}' multiple times in itself").format( From 3730803afa098274d538869e6aa7a63e1a424e5a Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sat, 18 May 2024 09:44:18 -0700 Subject: [PATCH 031/345] feat: compile source files at build time (#1902) This implements precompiling: performing Python source to byte code compilation at build time. This allows improved program startup time by allowing the byte code compilation step to be skipped at runtime. Precompiling is disabled by default, for now. A subsequent release will enable it by default. This allows the necessary flags and attributes to become available so users can opt-out prior to it being enabled by default. Similarly, `//python:features.bzl` is introduced to allow feature detection. This implementation is made to serve a variety of use cases, so there are several attributes and flags to control behavior. The main use cases being served are: * Large mono-repos that need to incrementally enable/disable precompiling. * Remote execution builds, where persistent workers aren't easily available. * Environments where toolchains are custom defined instead of using the ones created by rules_python. To that end, there are several attributes and flags to control behavior, and the toolchains allow customizing the tools used. Fixes https://github.com/bazelbuild/rules_python/issues/1761 --- .bazelignore | 1 + .bazelrc | 4 +- CHANGELOG.md | 25 ++ docs/sphinx/index.md | 1 + docs/sphinx/precompiling.md | 95 ++++++ python/BUILD.bazel | 10 + python/config_settings/BUILD.bazel | 40 +++ .../test_platforms.bzl => python/features.bzl | 12 +- python/private/BUILD.bazel | 32 ++ python/private/common/BUILD.bazel | 12 + python/private/common/attributes.bzl | 170 ++++++++++ python/private/common/common.bzl | 16 +- python/private/common/common_bazel.bzl | 159 ++++++++- python/private/common/providers.bzl | 79 +++-- python/private/common/py_executable.bzl | 97 ++++-- python/private/common/py_executable_bazel.bzl | 11 +- python/private/common/py_library.bzl | 39 ++- python/private/common/py_runtime_rule.bzl | 27 +- python/private/enum.bzl | 36 ++ python/private/flags.bzl | 93 ++++++ python/private/py_exec_tools_info.bzl | 77 +++++ python/private/py_exec_tools_toolchain.bzl | 47 +++ python/private/py_interpreter_program.bzl | 103 ++++++ python/private/py_toolchain_suite.bzl | 29 +- python/private/python_bootstrap_template.txt | 9 +- python/private/toolchain_types.bzl | 23 ++ python/repositories.bzl | 18 + tests/base_rules/precompile/BUILD.bazel | 3 + .../precompile/precompile_tests.bzl | 315 ++++++++++++++++++ tests/base_rules/py_executable_base_tests.bzl | 2 +- tests/base_rules/py_info_subject.bzl | 22 ++ tests/base_rules/py_test/py_test_tests.bzl | 2 +- tests/support/BUILD.bazel | 25 ++ tests/support/support.bzl | 34 ++ tests/toolchains/defs.bzl | 7 +- tools/BUILD.bazel | 2 + tools/launcher/BUILD.bazel | 33 ++ tools/precompiler/BUILD.bazel | 44 +++ tools/precompiler/precompiler.py | 296 ++++++++++++++++ 39 files changed, 1976 insertions(+), 74 deletions(-) create mode 100644 docs/sphinx/precompiling.md rename tests/support/test_platforms.bzl => python/features.bzl (61%) create mode 100644 python/private/enum.bzl create mode 100644 python/private/flags.bzl create mode 100644 python/private/py_exec_tools_info.bzl create mode 100644 python/private/py_exec_tools_toolchain.bzl create mode 100644 python/private/py_interpreter_program.bzl create mode 100644 python/private/toolchain_types.bzl create mode 100644 tests/base_rules/precompile/BUILD.bazel create mode 100644 tests/base_rules/precompile/precompile_tests.bzl create mode 100644 tests/support/support.bzl create mode 100644 tools/launcher/BUILD.bazel create mode 100644 tools/precompiler/BUILD.bazel create mode 100644 tools/precompiler/precompiler.py diff --git a/.bazelignore b/.bazelignore index 9bcb523a38..713903d832 100644 --- a/.bazelignore +++ b/.bazelignore @@ -25,4 +25,5 @@ examples/pip_parse_vendored/bazel-pip_parse_vendored examples/py_proto_library/bazel-py_proto_library 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/pip_repository_entry_points/bazel-pip_repository_entry_points diff --git a/.bazelrc b/.bazelrc index 61fd0e7601..94cfb93350 100644 --- a/.bazelrc +++ b/.bazelrc @@ -4,8 +4,8 @@ # (Note, we cannot use `common --deleted_packages` because the bazel version command doesn't support it) # To update these lines, execute # `bazel run @rules_bazel_integration_test//tools:update_deleted_packages` -build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/dupe_requirements,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/pip_repository_entry_points,tests/integration/py_cc_toolchain_registered -query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/dupe_requirements,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/pip_repository_entry_points,tests/integration/py_cc_toolchain_registered +build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/dupe_requirements,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/pip_repository_entry_points,tests/integration/py_cc_toolchain_registered +query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/dupe_requirements,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/pip_repository_entry_points,tests/integration/py_cc_toolchain_registered test --test_output=errors diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b0d526870..61e9d95cd2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,9 @@ A brief description of the categories of changes: [x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/x.x.x ### Changed +* (toolchains) Optional toolchain dependency: `py_binary`, `py_test`, and + `py_library` now depend on the `//python:exec_tools_toolchain_type` for build + tools. * (deps): Bumped `bazel_skylib` to 1.6.1. * (bzlmod): The `python` and internal `rules_python` extensions have been @@ -37,6 +40,28 @@ A brief description of the categories of changes: for this package before will be deleted automatically. ### Added +* (rules) Precompiling Python source at build time is available. but is + disabled by default, for now. Set + `@rules_python//python/config_settings:precompile=enabled` to enable it + by default. A subsequent release will enable it by default. See the + [Precompiling docs][precompile-docs] and API reference docs for more + information on precompiling. Note this requires Bazel 7+ and the Pystar rule + implementation enabled. + ([#1761](https://github.com/bazelbuild/rules_python/issues/1761)) +* (rules) Attributes and flags to control precompile behavior: `precompile`, + `precompile_optimize_level`, `precompile_source_retention`, + `precompile_invalidation_mode`, and `pyc_collection` +* (toolchains) The target runtime toolchain (`//python:toolchain_type`) has + two new optional attributes: `pyc_tag` (tells the pyc filename infix to use) and + `implementation_name` (tells the Python implementation name). +* (toolchains) A toolchain type for build tools has been added: + `//python:exec_tools_toolchain_type`. +* (providers) `PyInfo` has two new attributes: `direct_pyc_files` and + `transitive_pyc_files`, which tell the pyc files a target makes available + directly and transitively, respectively. +* `//python:features.bzl` added to allow easy feature-detection in the future. + +[precompile-docs]: /precompiling ## [0.32.2] - 2024-05-14 diff --git a/docs/sphinx/index.md b/docs/sphinx/index.md index eadd3ac11a..13cfa56aa4 100644 --- a/docs/sphinx/index.md +++ b/docs/sphinx/index.md @@ -60,6 +60,7 @@ pypi-dependencies toolchains pip coverage +precompiling gazelle Contributing support diff --git a/docs/sphinx/precompiling.md b/docs/sphinx/precompiling.md new file mode 100644 index 0000000000..791fc41145 --- /dev/null +++ b/docs/sphinx/precompiling.md @@ -0,0 +1,95 @@ +# Precompiling + +Precompiling is compiling Python source files (`.py` files) into byte code (`.pyc` +files) at build +time instead of runtime. Doing it at build time can improve performance by +skipping that work at runtime. + +Precompiling is enabled by default, so there typically isn't anything special +you must do to use it. + + +## Overhead of precompiling + +While precompiling helps runtime performance, it has two main costs: +1. Increasing the size (count and disk usage) of runfiles. It approximately + double the count of the runfiles because for every `.py` file, there is also + a `.pyc` file. Compiled files are generally around the same size as the + source files, so it approximately doubles the disk usage. +2. Precompiling requires running an extra action at build time. While + compiling itself isn't that expensive, the overhead can become noticable + as more files need to be compiled. + +## Binary-level opt-in + +Because of the costs of precompiling, it may not be feasible to globally enable it +for your repo for everything. For example, some binaries may be +particularly large, and doubling the number of runfiles isn't doable. + +If this is the case, there's an alternative way to more selectively and +incrementally control precompiling on a per-binry basis. + +To use this approach, the two basic steps are: +1. Disable pyc files from being automatically added to runfiles: + `--@rules_python//python/config_settings:precompile_add_to_runfiles=decided_elsewhere`, +2. Set the `pyc_collection` attribute on the binaries/tests that should or should + not use precompiling. + +The default for the `pyc_collection` attribute is controlled by a flag, so you +can use an opt-in or opt-out approach by setting the flag: +* targets must opt-out: `--@rules_python//python/config_settings:pyc_collection=include_pyc`, +* targets must opt-in: `--@rules_python//python/config_settings:pyc_collection=disabled`, + +## Advanced precompiler customization + +The default implementation of the precompiler is a persistent, multiplexed, +sandbox-aware, cancellation-enabled, json-protocol worker that uses the same +interpreter as the target toolchain. This works well for local builds, but may +not work as well for remote execution builds. To customize the precompiler, two +mechanisms are available: + +* The exec tools toolchain allows customizing the precompiler binary used with + the `precompiler` attribute. Arbitrary binaries are supported. +* The execution requirements can be customized using + `--@rules_python//tools/precompiler:execution_requirements`. This is a list + flag that can be repeated. Each entry is a key=value that is added to the + execution requirements of the `PyPrecompile` action. Note that this flag + is specific to the rules_python precompiler. If a custom binary is used, + this flag will have to be propagated from the custom binary using the + `testing.ExecutionInfo` provider; refer to the `py_interpreter_program` an + +The default precompiler implementation is an asynchronous/concurrent +implementation. If you find it has bugs or hangs, please report them. In the +meantime, the flag `--worker_extra_flag=PyPrecompile=--worker_impl=serial` can +be used to switch to a synchronous/serial implementation that may not perform +as well, but is less likely to have issues. + +The `execution_requirements` keys of most relevance are: +* `supports-workers`: 1 or 0, to indicate if a regular persistent worker is + desired. +* `supports-multiplex-workers`: 1 o 0, to indicate if a multiplexed persistent + worker is desired. +* `requires-worker-protocol`: json or proto; the rules_python precompiler + currently only supports json. +* `supports-multiplex-sandboxing`: 1 or 0, to indicate if sanboxing is of the + worker is supported. +* `supports-worker-cancellation`: 1 or 1, to indicate if requests to the worker + can be cancelled. + +Note that any execution requirements values can be specified in the flag. + +## Known issues, caveats, and idiosyncracies + +* Precompiling requires Bazel 7+ with the Pystar rule implementation enabled. +* 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 + 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 + runfiles directory comes before the repos source directory in `sys.path`). +* The pyc filename does not include the optimization level (e.g. + `foo.cpython-39.opt-2.pyc`). This works fine (it's all byte code), but also + means the interpreter `-O` argument can't be used -- doing so will cause the + interpreter to look for the non-existent `opt-N` named files. diff --git a/python/BUILD.bazel b/python/BUILD.bazel index d5863473d7..51404701a5 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -71,6 +71,11 @@ bzl_library( ], ) +bzl_library( + name = "features_bzl", + srcs = ["features.bzl"], +) + bzl_library( name = "packaging_bzl", srcs = ["packaging.bzl"], @@ -292,6 +297,11 @@ alias( actual = "@bazel_tools//tools/python:toolchain_type", ) +toolchain_type( + name = "exec_tools_toolchain_type", + visibility = ["//visibility:public"], +) + # Definitions for a Python toolchain that, at execution time, attempts to detect # a platform runtime having the appropriate major Python version. Consider this # a toolchain of last resort. diff --git a/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel index a017f9767e..a0e59f70c0 100644 --- a/python/config_settings/BUILD.bazel +++ b/python/config_settings/BUILD.bazel @@ -1,3 +1,11 @@ +load("@bazel_skylib//rules:common_settings.bzl", "string_flag") +load( + "//python/private:flags.bzl", + "PrecompileAddToRunfilesFlag", + "PrecompileFlag", + "PrecompileSourceRetentionFlag", + "PycCollectionFlag", +) load(":config_settings.bzl", "construct_config_settings") filegroup( @@ -12,3 +20,35 @@ filegroup( construct_config_settings( name = "construct_config_settings", ) + +string_flag( + name = "precompile", + build_setting_default = PrecompileFlag.AUTO, + values = sorted(PrecompileFlag.__members__.values()), + # NOTE: Only public because its an implicit dependency + visibility = ["//visibility:public"], +) + +string_flag( + name = "precompile_source_retention", + build_setting_default = PrecompileSourceRetentionFlag.KEEP_SOURCE, + values = sorted(PrecompileSourceRetentionFlag.__members__.values()), + # NOTE: Only public because its an implicit dependency + visibility = ["//visibility:public"], +) + +string_flag( + name = "precompile_add_to_runfiles", + build_setting_default = PrecompileAddToRunfilesFlag.ALWAYS, + values = sorted(PrecompileAddToRunfilesFlag.__members__.values()), + # NOTE: Only public because its an implicit dependency + visibility = ["//visibility:public"], +) + +string_flag( + name = "pyc_collection", + build_setting_default = PycCollectionFlag.DISABLED, + values = sorted(PycCollectionFlag.__members__.values()), + # NOTE: Only public because its an implicit dependency + visibility = ["//visibility:public"], +) diff --git a/tests/support/test_platforms.bzl b/python/features.bzl similarity index 61% rename from tests/support/test_platforms.bzl rename to python/features.bzl index 3ff3c507fc..3a10532c6e 100644 --- a/tests/support/test_platforms.bzl +++ b/python/features.bzl @@ -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. @@ -11,10 +11,8 @@ # 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. -"""Constants for referring to platforms.""" +"""Allows detecting of rules_python features that aren't easily detected.""" -# Explicit Label() calls are required so that it resolves in @rules_python -# context instead of e.g. the @rules_testing context. -MAC = Label("//tests/support:mac") -LINUX = Label("//tests/support:linux") -WINDOWS = Label("//tests/support:windows") +features = struct( + precompile = True, +) diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index fdbd20b896..181175679a 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -86,11 +86,25 @@ bzl_library( ], ) +bzl_library( + name = "enum_bzl", + srcs = ["enum.bzl"], +) + bzl_library( name = "envsubst_bzl", srcs = ["envsubst.bzl"], ) +bzl_library( + name = "flags_bzl", + srcs = ["flags.bzl"], + deps = [ + ":enum_bzl", + "@bazel_skylib//rules:common_settings", + ], +) + bzl_library( name = "full_version_bzl", srcs = ["full_version.bzl"], @@ -166,6 +180,18 @@ bzl_library( ], ) +bzl_library( + name = "py_exec_tools_toolchain_bzl", + srcs = ["py_exec_tools_toolchain.bzl"], + deps = ["//python/private/common:providers_bzl"], +) + +bzl_library( + name = "py_interpreter_program_bzl", + srcs = ["py_interpreter_program.bzl"], + deps = ["@bazel_skylib//rules:common_settings"], +) + bzl_library( name = "py_package_bzl", srcs = ["py_package.bzl"], @@ -192,6 +218,7 @@ bzl_library( name = "py_toolchain_suite_bzl", srcs = ["py_toolchain_suite.bzl"], deps = [ + ":toolchain_types_bzl", "@bazel_skylib//lib:selects", ], ) @@ -256,6 +283,11 @@ bzl_library( ], ) +bzl_library( + name = "toolchain_types_bzl", + srcs = ["toolchain_types.bzl"], +) + bzl_library( name = "util_bzl", srcs = ["util.bzl"], diff --git a/python/private/common/BUILD.bazel b/python/private/common/BUILD.bazel index 2f0683bf1b..e258f8a5eb 100644 --- a/python/private/common/BUILD.bazel +++ b/python/private/common/BUILD.bazel @@ -32,7 +32,10 @@ bzl_library( ":providers_bzl", ":py_internal_bzl", ":semantics_bzl", + "//python/private:enum_bzl", + "//python/private:flags_bzl", "//python/private:reexports_bzl", + "@bazel_skylib//rules:common_settings", ], ) @@ -46,9 +49,12 @@ bzl_library( name = "common_bazel_bzl", srcs = ["common_bazel.bzl"], deps = [ + ":attributes_bzl", ":common_bzl", ":providers_bzl", ":py_internal_bzl", + "//python/private:py_interpreter_program_bzl", + "//python/private:toolchain_types_bzl", "@bazel_skylib//lib:paths", ], ) @@ -124,8 +130,11 @@ bzl_library( ":common_bzl", ":providers_bzl", ":py_internal_bzl", + "//python/private:flags_bzl", "//python/private:rules_cc_srcs_bzl", + "//python/private:toolchain_types_bzl", "@bazel_skylib//lib:dicts", + "@bazel_skylib//rules:common_settings", ], ) @@ -143,7 +152,10 @@ bzl_library( ":common_bzl", ":providers_bzl", ":py_internal_bzl", + "//python/private:flags_bzl", + "//python/private:toolchain_types_bzl", "@bazel_skylib//lib:dicts", + "@bazel_skylib//rules:common_settings", ], ) diff --git a/python/private/common/attributes.bzl b/python/private/common/attributes.bzl index d4f853247f..eb70055787 100644 --- a/python/private/common/attributes.bzl +++ b/python/private/common/attributes.bzl @@ -13,7 +13,10 @@ # limitations under the License. """Attributes for Python rules.""" +load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("@rules_cc//cc:defs.bzl", "CcInfo") +load("//python/private:enum.bzl", "enum") +load("//python/private:flags.bzl", "PrecompileFlag") load("//python/private:reexports.bzl", "BuiltinPyInfo") load(":common.bzl", "union_attrs") load(":providers.bzl", "PyInfo") @@ -28,6 +31,97 @@ _PackageSpecificationInfo = getattr(py_internal, "PackageSpecificationInfo", Non _STAMP_VALUES = [-1, 0, 1] +def _precompile_attr_get_effective_value(ctx): + precompile_flag = PrecompileFlag.get_effective_value(ctx) + + if precompile_flag == PrecompileFlag.FORCE_ENABLED: + return PrecompileAttr.ENABLED + if precompile_flag == PrecompileFlag.FORCE_DISABLED: + return PrecompileAttr.DISABLED + + precompile_attr = ctx.attr.precompile + if precompile_attr == PrecompileAttr.INHERIT: + precompile = precompile_flag + else: + precompile = precompile_attr + + # Guard against bad final states because the two enums are similar with + # magic values. + if precompile not in ( + PrecompileAttr.ENABLED, + PrecompileAttr.DISABLED, + PrecompileAttr.IF_GENERATED_SOURCE, + ): + fail("Unexpected final precompile value: {}".format(repr(precompile))) + + return precompile + +# buildifier: disable=name-conventions +PrecompileAttr = enum( + # Determine the effective value from --precompile + INHERIT = "inherit", + # Compile Python source files at build time. Note that + # --precompile_add_to_runfiles affects how the compiled files are included + # into a downstream binary. + ENABLED = "enabled", + # Don't compile Python source files at build time. + DISABLED = "disabled", + # Compile Python source files, but only if they're a generated file. + IF_GENERATED_SOURCE = "if_generated_source", + get_effective_value = _precompile_attr_get_effective_value, +) + +# buildifier: disable=name-conventions +PrecompileInvalidationModeAttr = enum( + # Automatically pick a value based on build settings. + AUTO = "auto", + # Use the pyc file if the hash of the originating source file matches the + # hash recorded in the pyc file. + CHECKED_HASH = "checked_hash", + # Always use the pyc file, even if the originating source has changed. + UNCHECKED_HASH = "unchecked_hash", +) + +def _precompile_source_retention_get_effective_value(ctx): + attr_value = ctx.attr.precompile_source_retention + if attr_value == PrecompileSourceRetentionAttr.INHERIT: + attr_value = ctx.attr._precompile_source_retention_flag[BuildSettingInfo].value + + if attr_value not in ( + PrecompileSourceRetentionAttr.KEEP_SOURCE, + PrecompileSourceRetentionAttr.OMIT_SOURCE, + PrecompileSourceRetentionAttr.OMIT_IF_GENERATED_SOURCE, + ): + fail("Unexpected final precompile_source_retention value: {}".format(repr(attr_value))) + return attr_value + +# buildifier: disable=name-conventions +PrecompileSourceRetentionAttr = enum( + INHERIT = "inherit", + KEEP_SOURCE = "keep_source", + OMIT_SOURCE = "omit_source", + OMIT_IF_GENERATED_SOURCE = "omit_if_generated_source", + get_effective_value = _precompile_source_retention_get_effective_value, +) + +def _pyc_collection_attr_is_pyc_collection_enabled(ctx): + pyc_collection = ctx.attr.pyc_collection + if pyc_collection == PycCollectionAttr.INHERIT: + pyc_collection = ctx.attr._pyc_collection_flag[BuildSettingInfo].value + + if pyc_collection not in (PycCollectionAttr.INCLUDE_PYC, PycCollectionAttr.DISABLED): + fail("Unexpected final pyc_collection value: {}".format(repr(pyc_collection))) + + return pyc_collection == PycCollectionAttr.INCLUDE_PYC + +# buildifier: disable=name-conventions +PycCollectionAttr = enum( + INHERIT = "inherit", + INCLUDE_PYC = "include_pyc", + DISABLED = "disabled", + is_pyc_collection_enabled = _pyc_collection_attr_is_pyc_collection_enabled, +) + def create_stamp_attr(**kwargs): return { "stamp": attr.int( @@ -180,6 +274,70 @@ These are typically `py_library` rules. Targets that only provide data files used at runtime belong in the `data` attribute. +""", + ), + "precompile": attr.string( + doc = """ +Whether py source files should be precompiled. + +See also: `--precompile` flag, which can override this attribute in some cases. + +Values: + +* `inherit`: Determine the value from the --precompile flag. +* `enabled`: Compile Python source files at build time. Note that + --precompile_add_to_runfiles affects how the compiled files are included into + a downstream binary. +* `disabled`: Don't compile Python source files at build time. +* `if_generated_source`: Compile Python source files, but only if they're a + generated file. +""", + default = PrecompileAttr.INHERIT, + values = sorted(PrecompileAttr.__members__.values()), + ), + "precompile_invalidation_mode": attr.string( + doc = """ +How precompiled files should be verified to be up-to-date with their associated +source files. Possible values are: +* `auto`: The effective value will be automatically determined by other build + settings. +* `checked_hash`: Use the pyc file if the hash of the source file matches the hash + recorded in the pyc file. This is most useful when working with code that + you may modify. +* `unchecked_hash`: Always use the pyc file; don't check the pyc's hash against + the source file. This is most useful when the code won't be modified. + +For more information on pyc invalidation modes, see +https://docs.python.org/3/library/py_compile.html#py_compile.PycInvalidationMode +""", + default = PrecompileInvalidationModeAttr.AUTO, + values = sorted(PrecompileInvalidationModeAttr.__members__.values()), + ), + "precompile_optimize_level": attr.int( + doc = """ +The optimization level for precompiled files. + +For more information about optimization levels, see the `compile()` function's +`optimize` arg docs at https://docs.python.org/3/library/functions.html#compile + +NOTE: The value `-1` means "current interpreter", which will be the interpreter +used _at build time when pycs are generated_, not the interpreter used at +runtime when the code actually runs. +""", + default = 0, + ), + "precompile_source_retention": attr.string( + default = PrecompileSourceRetentionAttr.INHERIT, + values = sorted(PrecompileSourceRetentionAttr.__members__.values()), + doc = """ +Determines, when a source file is compiled, if the source file is kept +in the resulting output or not. Valid values are: + +* `inherit`: Inherit the value from the `--precompile_source_retention` flag. +* `keep_source`: Include the original Python source. +* `omit_source`: Don't include the orignal py source. +* `omit_if_generated_source`: Keep the original source if it's a regular source + file, but omit it if it's a generated file. """, ), # Required attribute, but details vary by rule. @@ -191,6 +349,18 @@ attribute. # Required attribute, but the details vary by rule. # Use create_srcs_version_attr to create one. "srcs_version": None, + "_precompile_add_to_runfiles_flag": attr.label( + default = "//python/config_settings:precompile_add_to_runfiles", + providers = [BuildSettingInfo], + ), + "_precompile_flag": attr.label( + default = "//python/config_settings:precompile", + providers = [BuildSettingInfo], + ), + "_precompile_source_retention_flag": attr.label( + default = "//python/config_settings:precompile_source_retention", + providers = [BuildSettingInfo], + ), }, allow_none = True, ) diff --git a/python/private/common/common.bzl b/python/private/common/common.bzl index 75c117f5cd..cfa7db7a2d 100644 --- a/python/private/common/common.bzl +++ b/python/private/common/common.bzl @@ -29,8 +29,6 @@ _coverage_common = coverage_common _py_builtins = py_internal PackageSpecificationInfo = getattr(py_internal, "PackageSpecificationInfo", None) -TOOLCHAIN_TYPE = "@bazel_tools//tools/python:toolchain_type" - # Extensions without the dot _PYTHON_SOURCE_EXTENSIONS = ["py"] @@ -338,7 +336,7 @@ def collect_runfiles(ctx, files): collect_default = True, ) -def create_py_info(ctx, *, direct_sources, imports): +def create_py_info(ctx, *, direct_sources, direct_pyc_files, imports): """Create PyInfo provider. Args: @@ -346,6 +344,7 @@ def create_py_info(ctx, *, direct_sources, imports): direct_sources: depset of Files; the direct, raw `.py` sources for the target. This should only be Python source files. It should not include pyc files. + direct_pyc_files: depset of Files; the direct `.pyc` sources for the target. imports: depset of strings; the import path values to propagate. Returns: @@ -358,6 +357,7 @@ def create_py_info(ctx, *, direct_sources, imports): has_py3_only_sources = ctx.attr.srcs_version in ("PY3", "PY3ONLY") transitive_sources_depsets = [] # list of depsets transitive_sources_files = [] # list of Files + transitive_pyc_depsets = [direct_pyc_files] # list of depsets for target in ctx.attr.deps: # PyInfo may not be present e.g. cc_library rules. if PyInfo in target or BuiltinPyInfo in target: @@ -366,6 +366,10 @@ def create_py_info(ctx, *, direct_sources, imports): uses_shared_libraries = uses_shared_libraries or info.uses_shared_libraries has_py2_only_sources = has_py2_only_sources or info.has_py2_only_sources has_py3_only_sources = has_py3_only_sources or info.has_py3_only_sources + + # BuiltinPyInfo doesn't have this field. + if hasattr(info, "transitive_pyc_files"): + transitive_pyc_depsets.append(info.transitive_pyc_files) else: # TODO(b/228692666): Remove this once non-PyInfo targets are no # longer supported in `deps`. @@ -412,11 +416,17 @@ def create_py_info(ctx, *, direct_sources, imports): has_py2_only_sources = has_py2_only_sources, has_py3_only_sources = has_py3_only_sources, uses_shared_libraries = uses_shared_libraries, + direct_pyc_files = direct_pyc_files, + transitive_pyc_files = depset(transitive = transitive_pyc_depsets), ) # TODO(b/203567235): Set `uses_shared_libraries` field, though the Bazel # docs indicate it's unused in Bazel and may be removed. py_info = PyInfo(**py_info_kwargs) + + # Remove args that BuiltinPyInfo doesn't support + py_info_kwargs.pop("direct_pyc_files") + py_info_kwargs.pop("transitive_pyc_files") builtin_py_info = BuiltinPyInfo(**py_info_kwargs) return py_info, deps_transitive_sources, builtin_py_info diff --git a/python/private/common/common_bazel.bzl b/python/private/common/common_bazel.bzl index a03721334d..8f86fb5796 100644 --- a/python/private/common/common_bazel.bzl +++ b/python/private/common/common_bazel.bzl @@ -15,6 +15,9 @@ load("@bazel_skylib//lib:paths.bzl", "paths") load("@rules_cc//cc:defs.bzl", "CcInfo", "cc_common") +load("//python/private:py_interpreter_program.bzl", "PyInterpreterProgramInfo") +load("//python/private:toolchain_types.bzl", "EXEC_TOOLS_TOOLCHAIN_TYPE", "TARGET_TOOLCHAIN_TYPE") +load(":attributes.bzl", "PrecompileAttr", "PrecompileInvalidationModeAttr", "PrecompileSourceRetentionAttr") load(":common.bzl", "is_bool") load(":providers.bzl", "PyCcLinkParamsProvider") load(":py_internal.bzl", "py_internal") @@ -55,12 +58,160 @@ def maybe_precompile(ctx, srcs): srcs: List of Files; the inputs to maybe precompile. Returns: - List of Files; the desired output files derived from the input sources. + Struct of precompiling results with fields: + * `keep_srcs`: list of File; the input sources that should be included + as default outputs and runfiles. + * `pyc_files`: list of File; the precompiled files. + * `py_to_pyc_map`: dict of src File input to pyc File output. If a source + file wasn't precompiled, it won't be in the dict. """ - _ = ctx # @unused - # Precompilation isn't implemented yet, so just return srcs as-is - return srcs + # The exec tools toolchain and precompiler are optional. Rather than + # fail, just skip precompiling, as its mostly just an optimization. + exec_tools_toolchain = ctx.toolchains[EXEC_TOOLS_TOOLCHAIN_TYPE] + if exec_tools_toolchain == None or exec_tools_toolchain.exec_tools.precompiler == None: + precompile = PrecompileAttr.DISABLED + else: + precompile = PrecompileAttr.get_effective_value(ctx) + + source_retention = PrecompileSourceRetentionAttr.get_effective_value(ctx) + + result = struct( + keep_srcs = [], + pyc_files = [], + py_to_pyc_map = {}, + ) + for src in srcs: + # The logic below is a bit convoluted. The gist is: + # * If precompiling isn't done, add the py source to default outputs. + # Otherwise, the source retention flag decides. + # * In order to determine `use_pycache`, we have to know if the source + # is being added to the default outputs. + is_generated_source = not src.is_source + should_precompile = ( + precompile == PrecompileAttr.ENABLED or + (precompile == PrecompileAttr.IF_GENERATED_SOURCE and is_generated_source) + ) + keep_source = ( + not should_precompile or + source_retention == PrecompileSourceRetentionAttr.KEEP_SOURCE or + (source_retention == PrecompileSourceRetentionAttr.OMIT_IF_GENERATED_SOURCE and not is_generated_source) + ) + if should_precompile: + pyc = _precompile(ctx, src, use_pycache = keep_source) + result.pyc_files.append(pyc) + result.py_to_pyc_map[src] = pyc + if keep_source: + result.keep_srcs.append(src) + + return result + +def _precompile(ctx, src, *, use_pycache): + """Compile a py file to pyc. + + Args: + ctx: rule context. + src: File object to compile + use_pycache: bool. True if the output should be within the `__pycache__` + sub-directory. False if it should be alongside the original source + file. + + Returns: + File of the generated pyc file. + """ + exec_tools_info = ctx.toolchains[EXEC_TOOLS_TOOLCHAIN_TYPE].exec_tools + target_toolchain = ctx.toolchains[TARGET_TOOLCHAIN_TYPE].py3_runtime + + # These args control starting the precompiler, e.g., when run as a worker, + # these args are only passed once. + precompiler_startup_args = ctx.actions.args() + + env = {} + tools = [] + + precompiler = exec_tools_info.precompiler + if PyInterpreterProgramInfo in precompiler: + precompiler_executable = exec_tools_info.exec_interpreter[DefaultInfo].files_to_run + program_info = precompiler[PyInterpreterProgramInfo] + env.update(program_info.env) + precompiler_startup_args.add_all(program_info.interpreter_args) + default_info = precompiler[DefaultInfo] + precompiler_startup_args.add(default_info.files_to_run.executable) + tools.append(default_info.files_to_run) + elif precompiler[DefaultInfo].files_to_run: + precompiler_executable = precompiler[DefaultInfo].files_to_run + else: + fail(("Unrecognized precompiler: target '{}' does not provide " + + "PyInterpreterProgramInfo nor appears to be executable").format( + precompiler, + )) + + stem = src.basename[:-(len(src.extension) + 1)] + if use_pycache: + if not target_toolchain.pyc_tag: + fail("Unable to create __pycache__ pyc: pyc_tag is empty") + pyc_path = "__pycache__/{stem}.{tag}.pyc".format( + stem = stem, + tag = target_toolchain.pyc_tag, + ) + else: + pyc_path = "{}.pyc".format(stem) + + pyc = ctx.actions.declare_file(pyc_path, sibling = src) + + invalidation_mode = ctx.attr.precompile_invalidation_mode + if invalidation_mode == PrecompileInvalidationModeAttr.AUTO: + if ctx.var["COMPILATION_MODE"] == "opt": + invalidation_mode = PrecompileInvalidationModeAttr.UNCHECKED_HASH + else: + invalidation_mode = PrecompileInvalidationModeAttr.CHECKED_HASH + + # Though --modify_execution_info exists, it can only set keys with + # empty values, which doesn't work for persistent worker settings. + execution_requirements = {} + if testing.ExecutionInfo in precompiler: + execution_requirements.update(precompiler[testing.ExecutionInfo].requirements) + + # These args are passed for every precompilation request, e.g. as part of + # a request to a worker process. + precompile_request_args = ctx.actions.args() + + # Always use param files so that it can be run as a persistent worker + precompile_request_args.use_param_file("@%s", use_always = True) + precompile_request_args.set_param_file_format("multiline") + + precompile_request_args.add("--invalidation_mode", invalidation_mode) + precompile_request_args.add("--src", src) + + # NOTE: src.short_path is used because src.path contains the platform and + # build-specific hash portions of the path, which we don't want in the + # pyc data. Note, however, for remote-remote files, short_path will + # have the repo name, which is likely to contain extraneous info. + precompile_request_args.add("--src_name", src.short_path) + precompile_request_args.add("--pyc", pyc) + precompile_request_args.add("--optimize", ctx.attr.precompile_optimize_level) + + version_info = target_toolchain.interpreter_version_info + python_version = "{}.{}".format(version_info.major, version_info.minor) + precompile_request_args.add("--python_version", python_version) + + ctx.actions.run( + executable = precompiler_executable, + arguments = [precompiler_startup_args, precompile_request_args], + inputs = [src], + outputs = [pyc], + mnemonic = "PyPrecompile", + progress_message = "Python precompiling %{input} into %{output}", + tools = tools, + env = env | { + "PYTHONHASHSEED": "0", # Helps avoid non-deterministic behavior + "PYTHONNOUSERSITE": "1", # Helps avoid non-deterministic behavior + "PYTHONSAFEPATH": "1", # Helps avoid incorrect import issues + }, + execution_requirements = execution_requirements, + toolchain = EXEC_TOOLS_TOOLCHAIN_TYPE, + ) + return pyc def get_imports(ctx): """Gets the imports from a rule's `imports` attribute. diff --git a/python/private/common/providers.bzl b/python/private/common/providers.bzl index 0b43413dc0..ab56fbef4d 100644 --- a/python/private/common/providers.bzl +++ b/python/private/common/providers.bzl @@ -34,13 +34,47 @@ def _define_provider(doc, fields, **kwargs): return provider("Stub, not used", fields = []), None return provider(doc = doc, fields = fields, **kwargs) +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 of versio 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) # 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, @@ -81,32 +115,16 @@ def _PyRuntimeInfo_init( if not stub_shebang: stub_shebang = DEFAULT_STUB_SHEBANG - if interpreter_version_info: - if not ("major" in interpreter_version_info and "minor" in interpreter_version_info): - fail("interpreter_version_info must have at least two keys, 'major' and 'minor'") - - _interpreter_version_info = dict(**interpreter_version_info) - interpreter_version_info = struct( - major = int(_interpreter_version_info.pop("major")), - minor = int(_interpreter_version_info.pop("minor")), - micro = int(_interpreter_version_info.pop("micro")) if "micro" in _interpreter_version_info else None, - releaselevel = str(_interpreter_version_info.pop("releaselevel")) if "releaselevel" in _interpreter_version_info else None, - serial = int(_interpreter_version_info.pop("serial")) if "serial" in _interpreter_version_info else None, - ) - - if len(_interpreter_version_info.keys()) > 0: - fail("unexpected keys {} in interpreter_version_info".format( - str(_interpreter_version_info.keys()), - )) - 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, + "interpreter_version_info": interpreter_version_info_struct_from_dict(interpreter_version_info), + "pyc_tag": pyc_tag, "python_version": python_version, "stub_shebang": stub_shebang, } @@ -143,6 +161,7 @@ the same conventions as the standard CPython 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": "Optional string; the Python implementation name (`sys.implementation.name`)", "interpreter": ( "If this is an in-build runtime, this field is a `File` representing " + "the interpreter. Otherwise, this is `None`. Note that an in-build " + @@ -166,6 +185,12 @@ the same conventions as the standard CPython interpreter. " * releaselevel: optional str, the release level\n" + " * serial: optional int, the serial number of the release" ), + "pyc_tag": """ +Optional string; 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 `implementation_name` and `interpreter_version_info`. If no pyc_tag is +available, then only source-less pyc generation will function correctly. +""", "python_version": ( "Indicates whether this runtime uses Python major version 2 or 3. " + "Valid values are (only) `\"PY2\"` and " + @@ -194,7 +219,9 @@ def _PyInfo_init( uses_shared_libraries = False, imports = depset(), has_py2_only_sources = False, - has_py3_only_sources = False): + has_py3_only_sources = False, + direct_pyc_files = depset(), + transitive_pyc_files = depset()): _check_arg_type("transitive_sources", "depset", transitive_sources) # Verify it's postorder compatible, but retain is original ordering. @@ -204,10 +231,14 @@ def _PyInfo_init( _check_arg_type("imports", "depset", imports) _check_arg_type("has_py2_only_sources", "bool", has_py2_only_sources) _check_arg_type("has_py3_only_sources", "bool", has_py3_only_sources) + _check_arg_type("direct_pyc_files", "depset", direct_pyc_files) + _check_arg_type("transitive_pyc_files", "depset", transitive_pyc_files) return { + "direct_pyc_files": direct_pyc_files, "has_py2_only_sources": has_py2_only_sources, "has_py3_only_sources": has_py2_only_sources, "imports": imports, + "transitive_pyc_files": transitive_pyc_files, "transitive_sources": transitive_sources, "uses_shared_libraries": uses_shared_libraries, } @@ -216,6 +247,10 @@ PyInfo, _unused_raw_py_info_ctor = _define_provider( doc = "Encapsulates information provided by the Python rules.", init = _PyInfo_init, fields = { + "direct_pyc_files": """ +depset[File] of precompiled Python files that are considered directly provided +by the target. +""", "has_py2_only_sources": "Whether any of this target's transitive sources requires a Python 2 runtime.", "has_py3_only_sources": "Whether any of this target's transitive sources requires a Python 3 runtime.", "imports": """\ @@ -223,6 +258,10 @@ A depset of import path strings to be added to the `PYTHONPATH` of executable Python targets. These are accumulated from the transitive `deps`. The order of the depset is not guaranteed and may be changed in the future. It is recommended to use `default` order (the default). +""", + "transitive_pyc_files": """ +depset[File] of direct and transitive precompiled Python files that are provied +by the target. """, "transitive_sources": """\ A (`postorder`-compatible) depset of `.py` files appearing in the target's diff --git a/python/private/common/py_executable.bzl b/python/private/common/py_executable.bzl index 03608930f0..cf7d6fad50 100644 --- a/python/private/common/py_executable.bzl +++ b/python/private/common/py_executable.bzl @@ -14,13 +14,21 @@ """Common functionality between test/binary executables.""" load("@bazel_skylib//lib:dicts.bzl", "dicts") +load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("@rules_cc//cc:defs.bzl", "cc_common") +load("//python/private:flags.bzl", "PrecompileAddToRunfilesFlag") load("//python/private:reexports.bzl", "BuiltinPyRuntimeInfo") +load( + "//python/private:toolchain_types.bzl", + "EXEC_TOOLS_TOOLCHAIN_TYPE", + TOOLCHAIN_TYPE = "TARGET_TOOLCHAIN_TYPE", +) load( ":attributes.bzl", "AGNOSTIC_EXECUTABLE_ATTRS", "COMMON_ATTRS", "PY_SRCS_ATTRS", + "PycCollectionAttr", "SRCS_VERSION_ALL_VALUES", "create_srcs_attr", "create_srcs_version_attr", @@ -28,7 +36,6 @@ load( load(":cc_helper.bzl", "cc_helper") load( ":common.bzl", - "TOOLCHAIN_TYPE", "check_native_allowed", "collect_imports", "collect_runfiles", @@ -43,6 +50,7 @@ load( load( ":providers.bzl", "PyCcLinkParamsProvider", + "PyInfo", "PyRuntimeInfo", ) load(":py_internal.bzl", "py_internal") @@ -80,6 +88,23 @@ Optional; the name of the source file that is the main entry point of the application. This file must also be listed in `srcs`. If left unspecified, `name`, with `.py` appended, is used instead. If `name` does not match any filename in `srcs`, `main` must be specified. +""", + ), + "pyc_collection": attr.string( + default = PycCollectionAttr.INHERIT, + values = sorted(PycCollectionAttr.__members__.values()), + doc = """ +Determines whether pyc files from dependencies should be manually included. + +NOTE: This setting is only useful with `--precompile_add_to_runfiles=decided_elsewhere`. + +Valid values are: +* `include_pyc`: Add pyc files from dependencies in the binary (from + `PyInfo.transitive_pyc_files`. +* `disabled`: Don't explicitly add pyc files from dependencies. Note that + pyc files may still come from dependencies if a target includes them as + part of their runfiles (such as when `--precompile_add_to_runfiles=always` + is used). """, ), # TODO(b/203567235): In Google, this attribute is deprecated, and can @@ -93,6 +118,10 @@ filename in `srcs`, `main` must be specified. values = ["PY2", "PY3"], doc = "Defunct, unused, does nothing.", ), + "_pyc_collection_flag": attr.label( + default = "//python/config_settings:pyc_collection", + providers = [BuildSettingInfo], + ), "_windows_constraints": attr.label_list( default = [ "@platforms//os:windows", @@ -125,9 +154,19 @@ def py_executable_base_impl(ctx, *, semantics, is_test, inherited_environment = main_py = determine_main(ctx) direct_sources = filter_to_py_srcs(ctx.files.srcs) - output_sources = semantics.maybe_precompile(ctx, direct_sources) + precompile_result = semantics.maybe_precompile(ctx, direct_sources) + + # Sourceless precompiled builds omit the main py file from outputs, so + # main has to be pointed to the precompiled main instead. + if main_py not in precompile_result.keep_srcs: + main_py = precompile_result.py_to_pyc_map[main_py] + direct_pyc_files = depset(precompile_result.pyc_files) + + default_outputs = precompile_result.keep_srcs + precompile_result.pyc_files + executable = _declare_executable_file(ctx) + default_outputs.append(executable) + imports = collect_imports(ctx, semantics) - executable, files_to_build = _compute_outputs(ctx, output_sources) runtime_details = _get_runtime_details(ctx, semantics) if ctx.configuration.coverage_enabled: @@ -151,7 +190,8 @@ def py_executable_base_impl(ctx, *, semantics, is_test, inherited_environment = ctx, executable = executable, extra_deps = extra_deps, - files_to_build = files_to_build, + main_py_files = depset([main_py] + precompile_result.keep_srcs), + direct_pyc_files = direct_pyc_files, extra_common_runfiles = [ runtime_details.runfiles, cc_details.extra_runfiles, @@ -171,11 +211,8 @@ def py_executable_base_impl(ctx, *, semantics, is_test, inherited_environment = native_deps_details = native_deps_details, runfiles_details = runfiles_details, ) - files_to_build = depset(transitive = [ - exec_result.extra_files_to_build, - files_to_build, - ]) - extra_exec_runfiles = ctx.runfiles(transitive_files = files_to_build) + + extra_exec_runfiles = ctx.runfiles(transitive_files = exec_result.extra_files_to_build) runfiles_details = struct( default_runfiles = runfiles_details.default_runfiles.merge(extra_exec_runfiles), data_runfiles = runfiles_details.data_runfiles.merge(extra_exec_runfiles), @@ -188,7 +225,8 @@ def py_executable_base_impl(ctx, *, semantics, is_test, inherited_environment = main_py = main_py, imports = imports, direct_sources = direct_sources, - files_to_build = files_to_build, + direct_pyc_files = direct_pyc_files, + default_outputs = depset(default_outputs, transitive = [exec_result.extra_files_to_build]), runtime_details = runtime_details, cc_info = cc_details.cc_info_for_propagating, inherited_environment = inherited_environment, @@ -208,15 +246,13 @@ def _validate_executable(ctx): fail("It is not allowed to use Python 2") check_native_allowed(ctx) -def _compute_outputs(ctx, output_sources): +def _declare_executable_file(ctx): if target_platform_has_any_constraint(ctx, ctx.attr._windows_constraints): executable = ctx.actions.declare_file(ctx.label.name + ".exe") else: executable = ctx.actions.declare_file(ctx.label.name) - # TODO(b/208657718): Remove output_sources from the default outputs - # once the depot is cleaned up. - return executable, depset([executable] + output_sources) + return executable def _get_runtime_details(ctx, semantics): """Gets various information about the Python runtime to use. @@ -347,7 +383,8 @@ def _get_base_runfiles_for_binary( *, executable, extra_deps, - files_to_build, + main_py_files, + direct_pyc_files, extra_common_runfiles, semantics): """Returns the set of runfiles necessary prior to executable creation. @@ -360,7 +397,8 @@ def _get_base_runfiles_for_binary( executable: The main executable output. extra_deps: List of Targets; additional targets whose runfiles will be added to the common runfiles. - files_to_build: depset of File of the default outputs to add into runfiles. + main_py_files: depset of File of the default outputs to add into runfiles. + direct_pyc_files: depset of File of pyc files directly from this target. extra_common_runfiles: List of runfiles; additional runfiles that will be added to the common runfiles. semantics: A `BinarySemantics` struct; see `create_binary_semantics_struct`. @@ -370,9 +408,20 @@ def _get_base_runfiles_for_binary( * default_runfiles: The default runfiles * data_runfiles: The data runfiles """ + common_runfiles_depsets = [main_py_files] + + if ctx.attr._precompile_add_to_runfiles_flag[BuildSettingInfo].value == PrecompileAddToRunfilesFlag.ALWAYS: + common_runfiles_depsets.append(direct_pyc_files) + elif PycCollectionAttr.is_pyc_collection_enabled(ctx): + common_runfiles_depsets.append(direct_pyc_files) + for dep in (ctx.attr.deps + extra_deps): + if PyInfo not in dep: + continue + common_runfiles_depsets.append(dep[PyInfo].transitive_pyc_files) + common_runfiles = collect_runfiles(ctx, depset( direct = [executable], - transitive = [files_to_build], + transitive = common_runfiles_depsets, )) if extra_deps: common_runfiles = common_runfiles.merge_all([ @@ -712,7 +761,8 @@ def _create_providers( executable, main_py, direct_sources, - files_to_build, + direct_pyc_files, + default_outputs, runfiles_details, imports, cc_info, @@ -729,7 +779,8 @@ def _create_providers( direct_sources: list of Files; the direct, raw `.py` sources for the target. This should only be Python source files. It should not include pyc files. - files_to_build: depset of Files; the files for DefaultInfo.files + direct_pyc_files: depset of File; the direct pyc files for the target. + default_outputs: depset of Files; the files for DefaultInfo.files runfiles_details: runfiles that will become the default and data runfiles. imports: depset of strings; the import paths to propagate cc_info: optional CcInfo; Linking information to propagate as @@ -748,7 +799,7 @@ def _create_providers( providers = [ DefaultInfo( executable = executable, - files = files_to_build, + files = default_outputs, default_runfiles = _py_builtins.make_runfiles_respect_legacy_external_runfiles( ctx, runfiles_details.default_runfiles, @@ -798,6 +849,7 @@ def _create_providers( py_info, deps_transitive_sources, builtin_py_info = create_py_info( ctx, direct_sources = depset(direct_sources), + direct_pyc_files = direct_pyc_files, imports = imports, ) @@ -852,7 +904,10 @@ def create_base_executable_rule(*, attrs, fragments = [], **kwargs): return rule( # TODO: add ability to remove attrs, i.e. for imports attr attrs = dicts.add(EXECUTABLE_ATTRS, attrs), - toolchains = [TOOLCHAIN_TYPE] + _CC_TOOLCHAINS, + toolchains = [ + TOOLCHAIN_TYPE, + config_common.toolchain_type(EXEC_TOOLS_TOOLCHAIN_TYPE, mandatory = False), + ] + _CC_TOOLCHAINS, fragments = fragments, **kwargs ) diff --git a/python/private/common/py_executable_bazel.bzl b/python/private/common/py_executable_bazel.bzl index ff4e3c1fb0..1c41fc15e5 100644 --- a/python/private/common/py_executable_bazel.bzl +++ b/python/private/common/py_executable_bazel.bzl @@ -59,8 +59,10 @@ the `srcs` of Python targets as required. ), "_launcher": attr.label( cfg = "target", - default = "@bazel_tools//tools/launcher:launcher", - executable = True, + # NOTE: This is an executable, but is only used for Windows. It + # can't have executable=True because the backing target is an + # empty target for other platforms. + default = "//tools/launcher:launcher", ), "_py_interpreter": attr.label( # The configuration_field args are validated when called; @@ -332,10 +334,11 @@ def _create_windows_exe_launcher( launch_info.add(python_binary_path, format = "python_bin_path=%s") launch_info.add("1" if use_zip_file else "0", format = "use_zip_file=%s") + launcher = ctx.attr._launcher[DefaultInfo].files_to_run.executable ctx.actions.run( executable = ctx.executable._windows_launcher_maker, - arguments = [ctx.executable._launcher.path, launch_info, output.path], - inputs = [ctx.executable._launcher], + arguments = [launcher.path, launch_info, output.path], + inputs = [launcher], outputs = [output], mnemonic = "PyBuildLauncher", progress_message = "Creating launcher for %{label}", diff --git a/python/private/common/py_library.bzl b/python/private/common/py_library.bzl index 28ee7bf4b6..b927a4fb9a 100644 --- a/python/private/common/py_library.bzl +++ b/python/private/common/py_library.bzl @@ -14,6 +14,13 @@ """Implementation of py_library rule.""" load("@bazel_skylib//lib:dicts.bzl", "dicts") +load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") +load("//python/private:flags.bzl", "PrecompileAddToRunfilesFlag") +load( + "//python/private:toolchain_types.bzl", + "EXEC_TOOLS_TOOLCHAIN_TYPE", + TOOLCHAIN_TYPE = "TARGET_TOOLCHAIN_TYPE", +) load( ":attributes.bzl", "COMMON_ATTRS", @@ -57,14 +64,25 @@ def py_library_impl(ctx, *, semantics): """ check_native_allowed(ctx) direct_sources = filter_to_py_srcs(ctx.files.srcs) - output_sources = depset(semantics.maybe_precompile(ctx, direct_sources)) - runfiles = collect_runfiles(ctx = ctx, files = output_sources) + precompile_result = semantics.maybe_precompile(ctx, direct_sources) + direct_pyc_files = depset(precompile_result.pyc_files) + default_outputs = depset(precompile_result.keep_srcs, transitive = [direct_pyc_files]) + + extra_runfiles_depsets = [depset(precompile_result.keep_srcs)] + if ctx.attr._precompile_add_to_runfiles_flag[BuildSettingInfo].value == PrecompileAddToRunfilesFlag.ALWAYS: + extra_runfiles_depsets.append(direct_pyc_files) + + runfiles = collect_runfiles( + ctx = ctx, + files = depset(transitive = extra_runfiles_depsets), + ) cc_info = semantics.get_cc_info_for_library(ctx) py_info, deps_transitive_sources, builtins_py_info = create_py_info( ctx, direct_sources = depset(direct_sources), imports = collect_imports(ctx, semantics), + direct_pyc_files = direct_pyc_files, ) # TODO(b/253059598): Remove support for extra actions; https://github.com/bazelbuild/bazel/issues/16455 @@ -76,7 +94,7 @@ def py_library_impl(ctx, *, semantics): ) return [ - DefaultInfo(files = output_sources, runfiles = runfiles), + DefaultInfo(files = default_outputs, runfiles = runfiles), py_info, builtins_py_info, create_instrumented_files_info(ctx), @@ -95,8 +113,23 @@ def create_py_library_rule(*, attrs = {}, **kwargs): """ return rule( attrs = dicts.add(LIBRARY_ATTRS, attrs), + toolchains = [ + config_common.toolchain_type(TOOLCHAIN_TYPE, mandatory = False), + config_common.toolchain_type(EXEC_TOOLS_TOOLCHAIN_TYPE, mandatory = False), + ], # TODO(b/253818097): fragments=py is only necessary so that # RequiredConfigFragmentsTest passes fragments = ["py"], + doc = """ +A library of Python code that can be depended upon. + +Default outputs: +* The input Python sources +* The precompiled artifacts from the sources. + +NOTE: Precompilation affects which of the default outputs are included in the +resulting runfiles. See the precompile-related attributes and flags for +more information. +""", **kwargs ) diff --git a/python/private/common/py_runtime_rule.bzl b/python/private/common/py_runtime_rule.bzl index 190158bed0..53d925cdba 100644 --- a/python/private/common/py_runtime_rule.bzl +++ b/python/private/common/py_runtime_rule.bzl @@ -86,21 +86,35 @@ def _py_runtime_impl(ctx): # fail("Using Python 2 is not supported and disabled; see " + # "https://github.com/bazelbuild/bazel/issues/15684") + pyc_tag = ctx.attr.pyc_tag + if not pyc_tag and (ctx.attr.implementation_name and + interpreter_version_info.get("major") and + interpreter_version_info.get("minor")): + pyc_tag = "{}-{}{}".format( + ctx.attr.implementation_name, + interpreter_version_info["major"], + interpreter_version_info["minor"], + ) + py_runtime_info_kwargs = dict( interpreter_path = interpreter_path or None, interpreter = interpreter, files = runtime_files if hermetic else None, coverage_tool = coverage_tool, coverage_files = coverage_files, + pyc_tag = pyc_tag, python_version = python_version, stub_shebang = ctx.attr.stub_shebang, bootstrap_template = ctx.file.bootstrap_template, interpreter_version_info = interpreter_version_info, + implementation_name = ctx.attr.implementation_name, ) builtin_py_runtime_info_kwargs = dict(py_runtime_info_kwargs) - # Pop this property as it does not exist on BuiltinPyRuntimeInfo + # Pop these because they don't exist on BuiltinPyRuntimeInfo builtin_py_runtime_info_kwargs.pop("interpreter_version_info") + builtin_py_runtime_info_kwargs.pop("pyc_tag") + builtin_py_runtime_info_kwargs.pop("implementation_name") if not IS_BAZEL_7_OR_HIGHER: builtin_py_runtime_info_kwargs.pop("bootstrap_template") @@ -211,6 +225,9 @@ These files will be added to the runfiles of Python binaries that use this runtime. For a platform runtime this attribute must not be set. """, ), + "implementation_name": attr.string( + doc = "The Python implementation name (`sys.implementation.name`)", + ), "interpreter": attr.label( # We set `allow_files = True` to allow specifying executable # targets from rules that have more than one default output, @@ -253,6 +270,14 @@ values are strings, most are converted to ints. The supported keys are: """, mandatory = False, ), + "pyc_tag": attr.string( + doc = """ +Optional string; 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 `implementation_name` and `interpreter_version_info`. If no pyc_tag is +available, then only source-less pyc generation will function correctly. +""", + ), "python_version": attr.string( default = "PY3", values = ["PY2", "PY3"], diff --git a/python/private/enum.bzl b/python/private/enum.bzl new file mode 100644 index 0000000000..011d9fbda1 --- /dev/null +++ b/python/private/enum.bzl @@ -0,0 +1,36 @@ +# 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. + +"""Enum-like object utilities + +This is a separate file to minimize transitive loads. +""" + +def enum(**kwargs): + """Creates a struct whose primary purpose is to be like an enum. + + Args: + **kwargs: The fields of the returned struct. All uppercase names will + be treated as enum values and added to `__members__`. + + Returns: + `struct` with the given values. It also has the field `__members__`, + which is a dict of the enum names and values. + """ + members = { + key: value + for key, value in kwargs.items() + if key.upper() == key + } + return struct(__members__ = members, **kwargs) diff --git a/python/private/flags.bzl b/python/private/flags.bzl new file mode 100644 index 0000000000..36d305da8a --- /dev/null +++ b/python/private/flags.bzl @@ -0,0 +1,93 @@ +# 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. + +"""Values and helpers for flags. + +NOTE: The transitive loads of this should be kept minimal. This avoids loading +unnecessary files when all that are needed are flag definitions. +""" + +load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") +load("//python/private:enum.bzl", "enum") + +def _precompile_flag_get_effective_value(ctx): + value = ctx.attr._precompile_flag[BuildSettingInfo].value + if value == PrecompileFlag.AUTO: + value = PrecompileFlag.DISABLED + return value + +# Determines if Python source files should be compiled at build time. +# +# NOTE: The flag value is overridden by the target-level attribute, except +# for the case of `force_enabled` and `forced_disabled`. +# buildifier: disable=name-conventions +PrecompileFlag = enum( + # Automatically decide the effective value based on environment, + # target platform, etc. + AUTO = "auto", + # Compile Python source files at build time. Note that + # --precompile_add_to_runfiles affects how the compiled files are included + # into a downstream binary. + ENABLED = "enabled", + # Don't compile Python source files at build time. + DISABLED = "disabled", + # Compile Python source files, but only if they're a generated file. + IF_GENERATED_SOURCE = "if_generated_source", + # Like `enabled`, except overrides target-level setting. This is mostly + # useful for development, testing enabling precompilation more broadly, or + # as an escape hatch if build-time compiling is not available. + FORCE_ENABLED = "force_enabled", + # Like `disabled`, except overrides target-level setting. This is useful + # useful for development, testing enabling precompilation more broadly, or + # as an escape hatch if build-time compiling is not available. + FORCE_DISABLED = "force_disabled", + get_effective_value = _precompile_flag_get_effective_value, +) + +# Determines if, when a source file is compiled, if the source file is kept +# in the resulting output or not. +# buildifier: disable=name-conventions +PrecompileSourceRetentionFlag = enum( + # Include the original py source in the output. + KEEP_SOURCE = "keep_source", + # Don't include the original py source. + OMIT_SOURCE = "omit_source", + # Keep the original py source if it's a regular source file, but omit it + # if it's a generated file. + OMIT_IF_GENERATED_SOURCE = "omit_if_generated_source", +) + +# Determines if a target adds its compiled files to its runfiles. When a target +# compiles its files, but doesn't add them to its own runfiles, it relies on +# a downstream target to retrieve them from `PyInfo.transitive_pyc_files` +# buildifier: disable=name-conventions +PrecompileAddToRunfilesFlag = enum( + # Always include the compiled files in the target's runfiles. + ALWAYS = "always", + # Don't include the compiled files in the target's runfiles; they are + # still added to `PyInfo.transitive_pyc_files`. See also: + # `py_binary.pyc_collection` attribute. This is useful for allowing + # incrementally enabling precompilation on a per-binary basis. + DECIDED_ELSEWHERE = "decided_elsewhere", +) + +# Determine if `py_binary` collects transitive pyc files. +# NOTE: This flag is only respect if `py_binary.pyc_collection` is `inherit`. +# buildifier: disable=name-conventions +PycCollectionFlag = enum( + # Include `PyInfo.transitive_pyc_files` as part of the binary. + INCLUDE_PYC = "include_pyc", + # Don't include `PyInfo.transitive_pyc_files` as part of the binary. + DISABLED = "disabled", +) diff --git a/python/private/py_exec_tools_info.bzl b/python/private/py_exec_tools_info.bzl new file mode 100644 index 0000000000..3011f531c8 --- /dev/null +++ b/python/private/py_exec_tools_info.bzl @@ -0,0 +1,77 @@ +# 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. +"""Implementation of the exec tools toolchain provider.""" + +PyExecToolsInfo = provider( + doc = "Build tools used as part of building Python programs.", + fields = { + "exec_interpreter": """ +Optional Target; an interpreter valid for running in the exec configuration. +When running it in an action, use `DefaultInfo.files_to_run` to ensure all its +files are appropriately available. An exec interpreter may not be available, +e.g. if all the exec tools are prebuilt binaries. + +NOTE: this interpreter is really only for use when a build tool cannot use +the Python toolchain itself. When possible, prefeer to define a `py_binary` +instead and use it via a `cfg=exec` attribute; this makes it much easier +to setup the runtime environment for the binary. See also: +`py_interpreter_program` rule. + +NOTE: What interpreter is used depends on the toolchain constraints. Ensure +the proper target constraints are being applied when obtaining this from +the toolchain. +""", + "exec_interpreter_version_info": """ +struct of interpreter version info for `exec_interpreter`. Note this +is for the exec interpreter, not the target interpreter. For version information +about the target Python runtime, use the `//python:toolchain_type` toolchain +information. +""", + "precompiler": """ +Optional Target. The tool to use for generating pyc files. If not available, +precompiling will not be available. + +Must provide one of the following: + * PyInterpreterProgramInfo + * DefaultInfo.files_to_run + +This target provides either the `PyInterpreterProgramInfo` provider or is a +regular executable binary (provides DefaultInfo.files_to_run). When the +`PyInterpreterProgramInfo` provider is present, it means the precompiler program +doesn't know how to find the interpreter itself, so the caller must provide it +when constructing the action invocation for running the precompiler program +(typically `exec_interpreter`). See the `PyInterpreterProgramInfo` provider docs +for details on how to construct an invocation. + +If `testing.ExecutionInfo` is provided, it will be used to set execution +requirements. This can be used to control persistent worker settings. + +The precompiler command line API is: +* `--invalidation_mode`: The type of pyc invalidation mode to use. Should be + one of `unchecked_hash` or `checked_hash`. +* `--optimize`: The optimization level as an integer. +* `--python_version`: The Python version, in `Major.Minor` format, e.g. `3.12` + +The following args are repeated and form a list of 3-tuples of their values. At +least one 3-tuple will be passed. +* `--src`: Path to the source `.py` file to precompile. +* `--src_name`: The human-friendly file name to record in the pyc output. +* `--pyc`: Path to where pyc output should be written. + +NOTE: These arguments _may_ be stored in a file instead, in which case, the +path to that file will be a positional arg starting with `@`, e.g. `@foo/bar`. +The format of the file is one arg per line. +""", + }, +) diff --git a/python/private/py_exec_tools_toolchain.bzl b/python/private/py_exec_tools_toolchain.bzl new file mode 100644 index 0000000000..6036db4e7c --- /dev/null +++ b/python/private/py_exec_tools_toolchain.bzl @@ -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. + +"""Rule that defines a toolchain for build tools.""" + +load("//python/private/common:providers.bzl", "interpreter_version_info_struct_from_dict") +load(":py_exec_tools_info.bzl", "PyExecToolsInfo") + +def _py_exec_tools_toolchain_impl(ctx): + return [platform_common.ToolchainInfo(exec_tools = PyExecToolsInfo( + exec_interpreter = ctx.attr.exec_interpreter, + exec_interpreter_version_info = interpreter_version_info_struct_from_dict( + ctx.attr.exec_interpreter_version_info, + ), + precompiler = ctx.attr.precompiler, + ))] + +py_exec_tools_toolchain = rule( + implementation = _py_exec_tools_toolchain_impl, + attrs = { + "exec_interpreter": attr.label( + cfg = "exec", + allow_files = True, + doc = "See PyExecToolsInfo.exec_interpreter", + executable = True, + ), + "exec_interpreter_version_info": attr.string_dict( + doc = "See PyExecToolsInfo.exec_interpreter_version_info", + ), + "precompiler": attr.label( + allow_files = True, + cfg = "exec", + doc = "See PyExecToolsInfo.precompiler", + ), + }, +) diff --git a/python/private/py_interpreter_program.bzl b/python/private/py_interpreter_program.bzl new file mode 100644 index 0000000000..833ea53b1c --- /dev/null +++ b/python/private/py_interpreter_program.bzl @@ -0,0 +1,103 @@ +# 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. + +"""Internal only bootstrap level binary-like rule.""" + +load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") + +PyInterpreterProgramInfo = provider( + doc = "Information about how to run a program with an external interpreter.", + fields = { + "env": "dict[str, str] of environment variables to set prior to execution.", + "interpreter_args": "List of strings; additional args to pass " + + "to the interpreter before the main program.", + "main": "File; the .py file that is the entry point.", + }, +) + +def _py_interpreter_program_impl(ctx): + # Bazel requires the executable file to be an output created by this target. + executable = ctx.actions.declare_file(ctx.label.name) + ctx.actions.symlink(output = executable, target_file = ctx.file.main) + execution_requirements = {} + execution_requirements.update([ + value.split("=", 1) + for value in ctx.attr.execution_requirements[BuildSettingInfo].value + if value.strip() + ]) + + return [ + DefaultInfo( + executable = executable, + files = depset([executable]), + runfiles = ctx.runfiles(files = [ + executable, + ]), + ), + PyInterpreterProgramInfo( + env = ctx.attr.env, + interpreter_args = ctx.attr.interpreter_args, + main = ctx.file.main, + ), + testing.ExecutionInfo( + requirements = execution_requirements, + ), + ] + +py_interpreter_program = rule( + doc = """ +Binary-like rule that doesn't require a toolchain becaues its part of +implementing build tools for the toolchain. This rule expects the Python +interprter to be externally provided. + +To run a `py_interpreter_program` as an action, pass it as a tool that is +used by the actual interpreter executable. This ensures its runfiles are +setup. Also pass along any interpreter args, environment, and requirements. + +```starlark +ctx.actions.run( + executable = , + args = ( + target[PyInterpreterProgramInfo].interpreter_args + + [target[DefaultInfo].files_to_run.executable] + ), + tools = target[DefaultInfo].files_to_run, + env = target[PyInterpreterProgramInfo].env, + execution_requirements = target[testing.ExecutionInfo].requirements, +) +``` + +""", + implementation = _py_interpreter_program_impl, + attrs = { + "env": attr.string_dict( + doc = "Environment variables that should set prior to running.", + ), + "execution_requirements": attr.label( + doc = "Execution requirements to set when running it as an action", + providers = [BuildSettingInfo], + ), + "interpreter_args": attr.string_list( + doc = "Args that should be passed to the interpreter.", + ), + "main": attr.label( + doc = "The entry point Python file.", + allow_single_file = True, + ), + }, + # This is set to False because this isn't a binary/executable in the usual + # Bazel sense (even though it sets DefaultInfo.files_to_run). It just holds + # information so that a caller can construct how to execute it correctly. + executable = False, +) diff --git a/python/private/py_toolchain_suite.bzl b/python/private/py_toolchain_suite.bzl index 5b4b6f8972..9971a8a4c3 100644 --- a/python/private/py_toolchain_suite.bzl +++ b/python/private/py_toolchain_suite.bzl @@ -15,9 +15,12 @@ """Create the toolchain defs in a BUILD.bazel file.""" load("@bazel_skylib//lib:selects.bzl", "selects") - -_py_toolchain_type = Label("@bazel_tools//tools/python:toolchain_type") -_py_cc_toolchain_type = Label("//python/cc:toolchain_type") +load( + ":toolchain_types.bzl", + "EXEC_TOOLS_TOOLCHAIN_TYPE", + "PY_CC_TOOLCHAIN_TYPE", + "TARGET_TOOLCHAIN_TYPE", +) def py_toolchain_suite(*, prefix, user_repository_name, python_version, set_python_version_constraint, **kwargs): """For internal use only. @@ -65,7 +68,7 @@ def py_toolchain_suite(*, prefix, user_repository_name, python_version, set_pyth toolchain = "@{user_repository_name}//:python_runtimes".format( user_repository_name = user_repository_name, ), - toolchain_type = _py_toolchain_type, + toolchain_type = TARGET_TOOLCHAIN_TYPE, target_settings = target_settings, **kwargs ) @@ -75,7 +78,23 @@ def py_toolchain_suite(*, prefix, user_repository_name, python_version, set_pyth toolchain = "@{user_repository_name}//:py_cc_toolchain".format( user_repository_name = user_repository_name, ), - toolchain_type = _py_cc_toolchain_type, + toolchain_type = PY_CC_TOOLCHAIN_TYPE, target_settings = target_settings, **kwargs ) + + native.toolchain( + name = "{prefix}_py_exec_tools_toolchain".format(prefix = prefix), + toolchain = "@{user_repository_name}//:py_exec_tools_toolchain".format( + user_repository_name = user_repository_name, + ), + toolchain_type = EXEC_TOOLS_TOOLCHAIN_TYPE, + # The target settings capture the Python version + target_settings = target_settings, + exec_compatible_with = kwargs.get("target_compatible_with"), + ) + + # NOTE: When adding a new toolchain, for WORKSPACE builds to see the + # toolchain, the name must be added to the native.register_toolchains() + # call in python/repositories.bzl. Bzlmod doesn't need anything; it will + # register `:all`. diff --git a/python/private/python_bootstrap_template.txt b/python/private/python_bootstrap_template.txt index 49f4cb5445..8eaedbc4dc 100644 --- a/python/private/python_bootstrap_template.txt +++ b/python/private/python_bootstrap_template.txt @@ -89,6 +89,10 @@ def FindPythonBinary(module_space): """Finds the real Python binary if it's not a normal absolute path.""" return FindBinary(module_space, PYTHON_BINARY) +def PrintVerbose(*args): + if os.environ.get("RULES_PYTHON_BOOTSTRAP_VERBOSE"): + print("bootstrap:", *args, file=sys.stderr) + def PrintVerboseCoverage(*args): """Print output if VERBOSE_COVERAGE is non-empty in the environment.""" if os.environ.get("VERBOSE_COVERAGE"): @@ -376,7 +380,10 @@ def _RunExecv(python_program, main_filename, args, env): # type: (str, str, list[str], dict[str, str]) -> ... """Executes the given Python file using the various environment settings.""" os.environ.update(env) - os.execv(python_program, [python_program, main_filename] + args) + PrintVerbose("RunExecv: environ:", os.environ) + argv = [python_program, main_filename] + args + PrintVerbose("RunExecv: argv:", python_program, argv) + os.execv(python_program, argv) def _RunForCoverage(python_program, main_filename, args, env, coverage_entrypoint, workspace): diff --git a/python/private/toolchain_types.bzl b/python/private/toolchain_types.bzl new file mode 100644 index 0000000000..ef81bf3bd4 --- /dev/null +++ b/python/private/toolchain_types.bzl @@ -0,0 +1,23 @@ +# 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. +"""Labels to identify toolchain types. + +This is a separate file because things needing the toolchain types (in +particular, toolchain() registrations) shouldn't need to load the entire +implementation of the toolchain. +""" + +TARGET_TOOLCHAIN_TYPE = Label("//python:toolchain_type") +EXEC_TOOLS_TOOLCHAIN_TYPE = Label("//python:exec_tools_toolchain_type") +PY_CC_TOOLCHAIN_TYPE = Label("//python/cc:toolchain_type") diff --git a/python/repositories.bzl b/python/repositories.bzl index eb122b6e7b..26081a6b48 100644 --- a/python/repositories.bzl +++ b/python/repositories.bzl @@ -304,6 +304,7 @@ def _python_repository_impl(rctx): 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") +load("@rules_python//python/private:py_exec_tools_toolchain.bzl", "py_exec_tools_toolchain") package(default_visibility = ["//visibility:public"]) @@ -373,6 +374,8 @@ py_runtime( "micro": "{interpreter_version_info_micro}", }}, python_version = "PY3", + implementation_name = 'cpython', + pyc_tag = "cpython-{interpreter_version_info_major}{interpreter_version_info_minor}", ) py_runtime_pair( @@ -387,6 +390,17 @@ py_cc_toolchain( libs = ":libpython", python_version = "{python_version}", ) + +py_exec_tools_toolchain( + name = "py_exec_tools_toolchain", + exec_interpreter = "{python_path}", + exec_interpreter_version_info = {{ + "major": "{interpreter_version_info_major}", + "minor": "{interpreter_version_info_minor}", + "micro": "{interpreter_version_info_micro}", + }}, + precompiler = "@rules_python//tools/precompiler:precompiler", +) """.format( glob_exclude = repr(glob_exclude), glob_include = repr(glob_include), @@ -631,6 +645,10 @@ def python_register_toolchains( toolchain_repo_name = toolchain_repo_name, platform = platform, )) + native.register_toolchains("@{toolchain_repo_name}//:{platform}_py_exec_tools_toolchain".format( + toolchain_repo_name = toolchain_repo_name, + platform = platform, + )) host_toolchain( name = name + "_host", diff --git a/tests/base_rules/precompile/BUILD.bazel b/tests/base_rules/precompile/BUILD.bazel new file mode 100644 index 0000000000..201adbadd6 --- /dev/null +++ b/tests/base_rules/precompile/BUILD.bazel @@ -0,0 +1,3 @@ +load(":precompile_tests.bzl", "precompile_test_suite") + +precompile_test_suite(name = "precompile_tests") diff --git a/tests/base_rules/precompile/precompile_tests.bzl b/tests/base_rules/precompile/precompile_tests.bzl new file mode 100644 index 0000000000..f88a438685 --- /dev/null +++ b/tests/base_rules/precompile/precompile_tests.bzl @@ -0,0 +1,315 @@ +# 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. + +"""Tests for precompiling behavior.""" + +load("@rules_python_internal//:rules_python_config.bzl", rp_config = "config") +load("@rules_testing//lib:analysis_test.bzl", "analysis_test") +load("@rules_testing//lib:test_suite.bzl", "test_suite") +load("@rules_testing//lib:truth.bzl", "matching") +load("@rules_testing//lib:util.bzl", rt_util = "util") +load("//python:py_binary.bzl", "py_binary") +load("//python:py_info.bzl", "PyInfo") +load("//python:py_library.bzl", "py_library") +load("//python:py_test.bzl", "py_test") +load("//tests/base_rules:py_info_subject.bzl", "py_info_subject") +load( + "//tests/support:support.bzl", + "CC_TOOLCHAIN", + "PLATFORM_TOOLCHAIN", + "PRECOMPILE", + "PRECOMPILE_ADD_TO_RUNFILES", + "PRECOMPILE_SOURCE_RETENTION", +) + +_TEST_TOOLCHAINS = [PLATFORM_TOOLCHAIN, CC_TOOLCHAIN] + +_tests = [] + +def _test_precompile_enabled_setup(name, py_rule, **kwargs): + if not rp_config.enable_pystar: + rt_util.skip_test(name = name) + return + rt_util.helper_target( + py_rule, + name = name + "_subject", + precompile = "enabled", + srcs = ["main.py"], + deps = [name + "_lib"], + **kwargs + ) + rt_util.helper_target( + py_library, + name = name + "_lib", + srcs = ["lib.py"], + precompile = "enabled", + ) + analysis_test( + name = name, + impl = _test_precompile_enabled_impl, + target = name + "_subject", + config_settings = { + "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, + }, + ) + +def _test_precompile_enabled_impl(env, target): + target = env.expect.that_target(target) + runfiles = target.runfiles() + runfiles.contains_predicate( + matching.str_matches("__pycache__/main.fakepy-45.pyc"), + ) + runfiles.contains_predicate( + matching.str_matches("/main.py"), + ) + target.default_outputs().contains_at_least_predicates([ + matching.file_path_matches("__pycache__/main.fakepy-45.pyc"), + matching.file_path_matches("/main.py"), + ]) + py_info = target.provider(PyInfo, factory = py_info_subject) + py_info.direct_pyc_files().contains_exactly([ + "{package}/__pycache__/main.fakepy-45.pyc", + ]) + py_info.transitive_pyc_files().contains_exactly([ + "{package}/__pycache__/main.fakepy-45.pyc", + "{package}/__pycache__/lib.fakepy-45.pyc", + ]) + +def _test_precompile_enabled_py_binary(name): + _test_precompile_enabled_setup(name = name, py_rule = py_binary, main = "main.py") + +_tests.append(_test_precompile_enabled_py_binary) + +def _test_precompile_enabled_py_test(name): + _test_precompile_enabled_setup(name = name, py_rule = py_test, main = "main.py") + +_tests.append(_test_precompile_enabled_py_test) + +def _test_precompile_enabled_py_library(name): + _test_precompile_enabled_setup(name = name, py_rule = py_library) + +_tests.append(_test_precompile_enabled_py_library) + +def _test_pyc_only(name): + if not rp_config.enable_pystar: + rt_util.skip_test(name = name) + return + rt_util.helper_target( + py_binary, + name = name + "_subject", + precompile = "enabled", + srcs = ["main.py"], + main = "main.py", + precompile_source_retention = "omit_source", + ) + analysis_test( + name = name, + impl = _test_pyc_only_impl, + config_settings = { + "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, + ##PRECOMPILE_SOURCE_RETENTION: "omit_source", + }, + target = name + "_subject", + ) + +_tests.append(_test_pyc_only) + +def _test_pyc_only_impl(env, target): + target = env.expect.that_target(target) + runfiles = target.runfiles() + runfiles.contains_predicate( + matching.str_matches("/main.pyc"), + ) + runfiles.not_contains_predicate( + matching.str_endswith("/main.py"), + ) + target.default_outputs().contains_at_least_predicates([ + matching.file_path_matches("/main.pyc"), + ]) + target.default_outputs().not_contains_predicate( + matching.file_basename_equals("main.py"), + ) + +def _test_precompile_if_generated(name): + if not rp_config.enable_pystar: + rt_util.skip_test(name = name) + return + rt_util.helper_target( + py_binary, + name = name + "_subject", + srcs = [ + "main.py", + rt_util.empty_file("generated1.py"), + ], + main = "main.py", + precompile = "if_generated_source", + ) + analysis_test( + name = name, + impl = _test_precompile_if_generated_impl, + target = name + "_subject", + config_settings = { + "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, + }, + ) + +_tests.append(_test_precompile_if_generated) + +def _test_precompile_if_generated_impl(env, target): + target = env.expect.that_target(target) + runfiles = target.runfiles() + runfiles.contains_predicate( + matching.str_matches("/__pycache__/generated1.fakepy-45.pyc"), + ) + runfiles.not_contains_predicate( + matching.str_matches("main.*pyc"), + ) + target.default_outputs().contains_at_least_predicates([ + matching.file_path_matches("/__pycache__/generated1.fakepy-45.pyc"), + ]) + target.default_outputs().not_contains_predicate( + matching.file_path_matches("main.*pyc"), + ) + +def _test_omit_source_if_generated_source(name): + if not rp_config.enable_pystar: + rt_util.skip_test(name = name) + return + rt_util.helper_target( + py_binary, + name = name + "_subject", + srcs = [ + "main.py", + rt_util.empty_file("generated2.py"), + ], + main = "main.py", + precompile = "enabled", + ) + analysis_test( + name = name, + impl = _test_omit_source_if_generated_source_impl, + target = name + "_subject", + config_settings = { + "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, + PRECOMPILE_SOURCE_RETENTION: "omit_if_generated_source", + }, + ) + +_tests.append(_test_omit_source_if_generated_source) + +def _test_omit_source_if_generated_source_impl(env, target): + target = env.expect.that_target(target) + runfiles = target.runfiles() + runfiles.contains_predicate( + matching.str_matches("/generated2.pyc"), + ) + runfiles.contains_predicate( + matching.str_matches("__pycache__/main.fakepy-45.pyc"), + ) + target.default_outputs().contains_at_least_predicates([ + matching.file_path_matches("generated2.pyc"), + ]) + target.default_outputs().contains_predicate( + matching.file_path_matches("__pycache__/main.fakepy-45.pyc"), + ) + +def _test_precompile_add_to_runfiles_decided_elsewhere(name): + if not rp_config.enable_pystar: + rt_util.skip_test(name = name) + return + rt_util.helper_target( + py_binary, + name = name + "_binary", + srcs = ["bin.py"], + main = "bin.py", + deps = [name + "_lib"], + pyc_collection = "include_pyc", + ) + rt_util.helper_target( + py_library, + name = name + "_lib", + srcs = ["lib.py"], + ) + analysis_test( + name = name, + impl = _test_precompile_add_to_runfiles_decided_elsewhere_impl, + targets = { + "binary": name + "_binary", + "library": name + "_lib", + }, + config_settings = { + "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, + PRECOMPILE_ADD_TO_RUNFILES: "decided_elsewhere", + PRECOMPILE: "enabled", + }, + ) + +_tests.append(_test_precompile_add_to_runfiles_decided_elsewhere) + +def _test_precompile_add_to_runfiles_decided_elsewhere_impl(env, targets): + env.expect.that_target(targets.binary).runfiles().contains_at_least([ + "{workspace}/tests/base_rules/precompile/__pycache__/bin.fakepy-45.pyc", + "{workspace}/tests/base_rules/precompile/__pycache__/lib.fakepy-45.pyc", + "{workspace}/tests/base_rules/precompile/bin.py", + "{workspace}/tests/base_rules/precompile/lib.py", + ]) + + env.expect.that_target(targets.library).runfiles().contains_exactly([ + "{workspace}/tests/base_rules/precompile/lib.py", + ]) + +def _test_precompiler_action(name): + if not rp_config.enable_pystar: + rt_util.skip_test(name = name) + return + rt_util.helper_target( + py_binary, + name = name + "_subject", + srcs = ["main2.py"], + main = "main2.py", + precompile = "enabled", + precompile_optimize_level = 2, + precompile_invalidation_mode = "unchecked_hash", + ) + analysis_test( + name = name, + impl = _test_precompiler_action_impl, + target = name + "_subject", + config_settings = { + "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, + }, + ) + +_tests.append(_test_precompiler_action) + +def _test_precompiler_action_impl(env, target): + #env.expect.that_target(target).runfiles().contains_exactly([]) + action = env.expect.that_target(target).action_named("PyPrecompile") + action.contains_flag_values([ + ("--optimize", "2"), + ("--python_version", "4.5"), + ("--invalidation_mode", "unchecked_hash"), + ]) + action.has_flags_specified(["--src", "--pyc", "--src_name"]) + action.env().contains_at_least({ + "PYTHONHASHSEED": "0", + "PYTHONNOUSERSITE": "1", + "PYTHONSAFEPATH": "1", + }) + +def precompile_test_suite(name): + test_suite( + name = name, + tests = _tests, + ) diff --git a/tests/base_rules/py_executable_base_tests.bzl b/tests/base_rules/py_executable_base_tests.bzl index ce86ecaf11..b6f28026db 100644 --- a/tests/base_rules/py_executable_base_tests.bzl +++ b/tests/base_rules/py_executable_base_tests.bzl @@ -20,7 +20,7 @@ load("@rules_testing//lib:truth.bzl", "matching") load("@rules_testing//lib:util.bzl", rt_util = "util") load("//tests/base_rules:base_tests.bzl", "create_base_tests") load("//tests/base_rules:util.bzl", "WINDOWS_ATTR", pt_util = "util") -load("//tests/support:test_platforms.bzl", "WINDOWS") +load("//tests/support:support.bzl", "WINDOWS") _BuiltinPyRuntimeInfo = PyRuntimeInfo diff --git a/tests/base_rules/py_info_subject.bzl b/tests/base_rules/py_info_subject.bzl index b23308c388..bfed0b335d 100644 --- a/tests/base_rules/py_info_subject.bzl +++ b/tests/base_rules/py_info_subject.bzl @@ -31,9 +31,11 @@ def py_info_subject(info, *, meta): # buildifier: disable=uninitialized public = struct( # go/keep-sorted start + direct_pyc_files = lambda *a, **k: _py_info_subject_direct_pyc_files(self, *a, **k), has_py2_only_sources = lambda *a, **k: _py_info_subject_has_py2_only_sources(self, *a, **k), has_py3_only_sources = lambda *a, **k: _py_info_subject_has_py3_only_sources(self, *a, **k), imports = lambda *a, **k: _py_info_subject_imports(self, *a, **k), + transitive_pyc_files = lambda *a, **k: _py_info_subject_transitive_pyc_files(self, *a, **k), transitive_sources = lambda *a, **k: _py_info_subject_transitive_sources(self, *a, **k), uses_shared_libraries = lambda *a, **k: _py_info_subject_uses_shared_libraries(self, *a, **k), # go/keep-sorted end @@ -44,6 +46,16 @@ def py_info_subject(info, *, meta): ) return public +def _py_info_subject_direct_pyc_files(self): + """Returns a `DepsetFileSubject` for the `direct_pyc_files` attribute. + + Method: PyInfoSubject.direct_pyc_files + """ + return subjects.depset_file( + self.actual.direct_pyc_files, + meta = self.meta.derive("direct_pyc_files()"), + ) + def _py_info_subject_has_py2_only_sources(self): """Returns a `BoolSubject` for the `has_py2_only_sources` attribute. @@ -74,6 +86,16 @@ def _py_info_subject_imports(self): meta = self.meta.derive("imports()"), ) +def _py_info_subject_transitive_pyc_files(self): + """Returns a `DepsetFileSubject` for the `transitive_pyc_files` attribute. + + Method: PyInfoSubject.transitive_pyc_files + """ + return subjects.depset_file( + self.actual.transitive_pyc_files, + meta = self.meta.derive("transitive_pyc_files()"), + ) + def _py_info_subject_transitive_sources(self): """Returns a `DepsetFileSubject` for the `transitive_sources` attribute. diff --git a/tests/base_rules/py_test/py_test_tests.bzl b/tests/base_rules/py_test/py_test_tests.bzl index f4b704e6ca..50c1db27cf 100644 --- a/tests/base_rules/py_test/py_test_tests.bzl +++ b/tests/base_rules/py_test/py_test_tests.bzl @@ -21,7 +21,7 @@ load( "create_executable_tests", ) load("//tests/base_rules:util.bzl", pt_util = "util") -load("//tests/support:test_platforms.bzl", "LINUX", "MAC") +load("//tests/support:support.bzl", "LINUX", "MAC") # Explicit Label() calls are required so that it resolves in @rules_python # context instead of @rules_testing context. diff --git a/tests/support/BUILD.bazel b/tests/support/BUILD.bazel index 0a4c98ccce..3b77cde0c5 100644 --- a/tests/support/BUILD.bazel +++ b/tests/support/BUILD.bazel @@ -17,6 +17,10 @@ # Otherwise, you'll probably have to manually call Label() on these targets # to force them to resolve in the proper context. # ==================== + +load("//python:py_runtime.bzl", "py_runtime") +load("//python:py_runtime_pair.bzl", "py_runtime_pair") + platform( name = "mac", constraint_values = [ @@ -63,3 +67,24 @@ platform( "@platforms//os:windows", ], ) + +py_runtime( + name = "platform_runtime", + implementation_name = "fakepy", + interpreter_path = "/fake/python3.9", + interpreter_version_info = { + "major": "4", + "minor": "5", + }, +) + +py_runtime_pair( + name = "platform_runtime_pair", + py3_runtime = ":platform_runtime", +) + +toolchain( + name = "platform_toolchain", + toolchain = ":platform_runtime_pair", + toolchain_type = "//python:toolchain_type", +) diff --git a/tests/support/support.bzl b/tests/support/support.bzl new file mode 100644 index 0000000000..14a743b8a2 --- /dev/null +++ b/tests/support/support.bzl @@ -0,0 +1,34 @@ +# 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. +"""Code that support testing of rules_python code.""" + +# NOTE: Explicit Label() calls are required so that it resolves in @rules_python +# context instead of e.g. the @rules_testing context. +# NOTE: Some labels require str() around Label() because they are passed onto +# rules_testing or as config_setting values, which don't support Label in some +# places. + +MAC = Label("//tests/support:mac") +LINUX = Label("//tests/support:linux") +WINDOWS = Label("//tests/support:windows") + +PLATFORM_TOOLCHAIN = str(Label("//tests/support:platform_toolchain")) +CC_TOOLCHAIN = str(Label("//tests/cc:all")) + +# str() around Label() is necessary because rules_testing's config_settings +# doesn't accept yet Label objects. +PRECOMPILE = str(Label("//python/config_settings:precompile")) +PYC_COLLECTION = str(Label("//python/config_settings:pyc_collection")) +PRECOMPILE_SOURCE_RETENTION = str(Label("//python/config_settings:precompile_source_retention")) +PRECOMPILE_ADD_TO_RUNFILES = str(Label("//python/config_settings:precompile_add_to_runfiles")) diff --git a/tests/toolchains/defs.bzl b/tests/toolchains/defs.bzl index 8776eba919..bfc55199d3 100644 --- a/tests/toolchains/defs.bzl +++ b/tests/toolchains/defs.bzl @@ -193,5 +193,10 @@ def acceptance_tests(): ), python_version = python_version, target_compatible_with = meta.compatible_with, - tags = ["acceptance-test"], + tags = [ + "acceptance-test", + # For some inexplicable reason, these fail locally with + # sandboxing enabled, but not on CI. + "no-sandbox", + ], ) diff --git a/tools/BUILD.bazel b/tools/BUILD.bazel index b2aca5cd87..4f42bcb02d 100644 --- a/tools/BUILD.bazel +++ b/tools/BUILD.bazel @@ -29,6 +29,8 @@ filegroup( srcs = [ "BUILD.bazel", "wheelmaker.py", + "//tools/launcher:distribution", + "//tools/precompiler:distribution", "//tools/publish:distribution", ], visibility = ["//:__pkg__"], diff --git a/tools/launcher/BUILD.bazel b/tools/launcher/BUILD.bazel new file mode 100644 index 0000000000..aa4610671b --- /dev/null +++ b/tools/launcher/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. + +filegroup( + name = "distribution", + srcs = glob(["**"]), + visibility = ["//:__subpackages__"], +) + +alias( + name = "launcher", + actual = select({ + "@platforms//os:windows": "@bazel_tools//tools/launcher:launcher", + # The alias.actual value must be non-None, so use an empty target. + "//conditions:default": ":_sentinel_no_launcher", + }), + visibility = ["//visibility:public"], +) + +filegroup( + name = "_sentinel_no_launcher", +) diff --git a/tools/precompiler/BUILD.bazel b/tools/precompiler/BUILD.bazel new file mode 100644 index 0000000000..268f41b032 --- /dev/null +++ b/tools/precompiler/BUILD.bazel @@ -0,0 +1,44 @@ +# Copyright 2017 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("@bazel_skylib//rules:common_settings.bzl", "string_list_flag") +load("//python/private:py_interpreter_program.bzl", "py_interpreter_program") # buildifier: disable=bzl-visibility + +filegroup( + name = "distribution", + srcs = glob(["**"]), + visibility = ["//:__subpackages__"], +) + +py_interpreter_program( + name = "precompiler", + execution_requirements = ":execution_requirements", + main = "precompiler.py", + visibility = [ + # Not actually public. Only public so rules_python-generated toolchains + # are able to reference it. + "//visibility:public", + ], +) + +string_list_flag( + name = "execution_requirements", + build_setting_default = [ + "supports-workers=1", + "requires-worker-protocol=json", + "supports-multiplex-sandboxing=1", + "supports-multiplex-workers=1", + "supports-worker-cancellation=1", + ], +) diff --git a/tools/precompiler/precompiler.py b/tools/precompiler/precompiler.py new file mode 100644 index 0000000000..d1b17132e7 --- /dev/null +++ b/tools/precompiler/precompiler.py @@ -0,0 +1,296 @@ +# 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 precompiler to generate deterministic pyc files for Bazel.""" + +# NOTE: Imports specific to the persistent worker should only be imported +# when a persistent worker is used. Avoiding the unnecessary imports +# saves significant startup time for non-worker invocations. +import argparse +import py_compile +import sys + + +def _create_parser() -> "argparse.Namespace": + parser = argparse.ArgumentParser(fromfile_prefix_chars="@") + parser.add_argument("--invalidation_mode") + parser.add_argument("--optimize", type=int) + parser.add_argument("--python_version") + + parser.add_argument("--src", action="append", dest="srcs") + parser.add_argument("--src_name", action="append", dest="src_names") + parser.add_argument("--pyc", action="append", dest="pycs") + + parser.add_argument("--persistent_worker", action="store_true") + parser.add_argument("--log_level", default="ERROR") + parser.add_argument("--worker_impl", default="async") + return parser + + +def _compile(options: "argparse.Namespace") -> None: + try: + invalidation_mode = getattr( + py_compile.PycInvalidationMode, options.invalidation_mode.upper() + ) + except AttributeError as e: + raise ValueError( + f"Unknown PycInvalidationMode: {options.invalidation_mode}" + ) from e + + if len(options.srcs) != len(options.src_names) != len(options.pycs): + raise AssertionError( + "Mismatched number of --src, --src_name, and/or --pyc args" + ) + + for src, src_name, pyc in zip(options.srcs, options.src_names, options.pycs): + py_compile.compile( + src, + pyc, + doraise=True, + dfile=src_name, + optimize=options.optimize, + invalidation_mode=invalidation_mode, + ) + return 0 + + +# A stub type alias for readability. +# See the Bazel WorkRequest object definition: +# https://github.com/bazelbuild/bazel/blob/master/src/main/protobuf/worker_protocol.proto +JsonWorkerRequest = object + +# A stub type alias for readability. +# See the Bazel WorkResponse object definition: +# https://github.com/bazelbuild/bazel/blob/master/src/main/protobuf/worker_protocol.proto +JsonWorkerResponse = object + + +class _SerialPersistentWorker: + """Simple, synchronous, serial persistent worker.""" + + def __init__(self, instream: "typing.TextIO", outstream: "typing.TextIO"): + self._instream = instream + self._outstream = outstream + self._parser = _create_parser() + + def run(self) -> None: + try: + while True: + request = None + try: + request = self._get_next_request() + if request is None: + _logger.info("Empty request: exiting") + break + response = self._process_request(request) + if response: # May be none for cancel request + self._send_response(response) + except Exception: + _logger.exception("Unhandled error: request=%s", request) + output = ( + f"Unhandled error:\nRequest: {request}\n" + + traceback.format_exc() + ) + request_id = 0 if not request else request.get("requestId", 0) + self._send_response( + { + "exitCode": 3, + "output": output, + "requestId": request_id, + } + ) + finally: + _logger.info("Worker shutting down") + + def _get_next_request(self) -> "object | None": + line = self._instream.readline() + if not line: + return None + return json.loads(line) + + def _process_request(self, request: "JsonWorkRequest") -> "JsonWorkResponse | None": + if request.get("cancel"): + return None + options = self._options_from_request(request) + _compile(options) + response = { + "requestId": request.get("requestId", 0), + "exitCode": 0, + } + return response + + def _options_from_request( + self, request: "JsonWorkResponse" + ) -> "argparse.Namespace": + options = self._parser.parse_args(request["arguments"]) + if request.get("sandboxDir"): + prefix = request["sandboxDir"] + options.srcs = [os.path.join(prefix, v) for v in options.srcs] + options.pycs = [os.path.join(prefix, v) for v in options.pycs] + return options + + def _send_response(self, response: "JsonWorkResponse") -> None: + self._outstream.write(json.dumps(response) + "\n") + self._outstream.flush() + + +class _AsyncPersistentWorker: + """Asynchronous, concurrent, persistent worker.""" + + def __init__(self, reader: "typing.TextIO", writer: "typing.TextIO"): + self._reader = reader + self._writer = writer + self._parser = _create_parser() + self._request_id_to_task = {} + self._task_to_request_id = {} + + @classmethod + async def main(cls, instream: "typing.TextIO", outstream: "typing.TextIO") -> None: + reader, writer = await cls._connect_streams(instream, outstream) + await cls(reader, writer).run() + + @classmethod + async def _connect_streams( + cls, instream: "typing.TextIO", outstream: "typing.TextIO" + ) -> "tuple[asyncio.StreamReader, asyncio.StreamWriter]": + loop = asyncio.get_event_loop() + reader = asyncio.StreamReader() + protocol = asyncio.StreamReaderProtocol(reader) + await loop.connect_read_pipe(lambda: protocol, instream) + + w_transport, w_protocol = await loop.connect_write_pipe( + asyncio.streams.FlowControlMixin, outstream + ) + writer = asyncio.StreamWriter(w_transport, w_protocol, reader, loop) + return reader, writer + + async def run(self) -> None: + while True: + _logger.info("pending requests: %s", len(self._request_id_to_task)) + request = await self._get_next_request() + request_id = request.get("requestId", 0) + task = asyncio.create_task( + self._process_request(request), name=f"request_{request_id}" + ) + self._request_id_to_task[request_id] = task + self._task_to_request_id[task] = request_id + task.add_done_callback(self._handle_task_done) + + async def _get_next_request(self) -> "JsonWorkRequest": + _logger.debug("awaiting line") + line = await self._reader.readline() + _logger.debug("recv line: %s", line) + return json.loads(line) + + def _handle_task_done(self, task: "asyncio.Task") -> None: + request_id = self._task_to_request_id[task] + _logger.info("task done: %s %s", request_id, task) + del self._task_to_request_id[task] + del self._request_id_to_task[request_id] + + async def _process_request(self, request: "JsonWorkRequest") -> None: + _logger.info("request %s: start: %s", request.get("requestId"), request) + try: + if request.get("cancel", False): + await self._process_cancel_request(request) + else: + await self._process_compile_request(request) + except asyncio.CancelledError: + _logger.info( + "request %s: cancel received, stopping processing", + request.get("requestId"), + ) + # We don't send a response because we assume the request that + # triggered cancelling sent the response + raise + except: + _logger.exception("Unhandled error: request=%s", request) + self._send_response( + { + "exitCode": 3, + "output": f"Unhandled error:\nRequest: {request}\n" + + traceback.format_exc(), + "requestId": 0 if not request else request.get("requestId", 0), + } + ) + + async def _process_cancel_request(self, request: "JsonWorkRequest") -> None: + request_id = request.get("requestId", 0) + task = self._request_id_to_task.get(request_id) + if not task: + # It must be already completed, so ignore the request, per spec + return + + task.cancel() + self._send_response({"requestId": request_id, "wasCancelled": True}) + + async def _process_compile_request(self, request: "JsonWorkRequest") -> None: + options = self._options_from_request(request) + # _compile performs a varity of blocking IO calls, so run it separately + await asyncio.to_thread(_compile, options) + self._send_response( + { + "requestId": request.get("requestId", 0), + "exitCode": 0, + } + ) + + def _options_from_request(self, request: "JsonWorkRequest") -> "argparse.Namespace": + options = self._parser.parse_args(request["arguments"]) + if request.get("sandboxDir"): + prefix = request["sandboxDir"] + options.srcs = [os.path.join(prefix, v) for v in options.srcs] + options.pycs = [os.path.join(prefix, v) for v in options.pycs] + return options + + def _send_response(self, response: "JsonWorkResponse") -> None: + _logger.info("request %s: respond: %s", response.get("requestId"), response) + self._writer.write(json.dumps(response).encode("utf8") + b"\n") + + +def main(args: "list[str]") -> int: + options = _create_parser().parse_args(args) + + # Persistent workers are started with the `--persistent_worker` flag. + # See the following docs for details on persistent workers: + # https://bazel.build/remote/persistent + # https://bazel.build/remote/multiplex + # https://bazel.build/remote/creating + if options.persistent_worker: + global asyncio, itertools, json, logging, os, traceback, _logger + import asyncio + import itertools + import json + import logging + import os.path + import traceback + + _logger = logging.getLogger("precompiler") + # Only configure logging for workers. This prevents non-worker + # invocations from spamming stderr with logging info + logging.basicConfig(level=getattr(logging, options.log_level)) + _logger.info("persistent worker: impl=%s", options.worker_impl) + if options.worker_impl == "serial": + _SerialPersistentWorker(sys.stdin, sys.stdout).run() + elif options.worker_impl == "async": + asyncio.run(_AsyncPersistentWorker.main(sys.stdin, sys.stdout)) + else: + raise ValueError(f"Unknown worker impl: {options.worker_impl}") + else: + _compile(options) + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) From 47ad4d921dea2bdb783f0e3a793e2dc5e78fdcfd Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sat, 18 May 2024 19:47:14 -0700 Subject: [PATCH 032/345] docs: doc that precompiling is disabled by default (#1908) The original PR accidentally said precompiling was enabledy by default. --- docs/sphinx/precompiling.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/docs/sphinx/precompiling.md b/docs/sphinx/precompiling.md index 791fc41145..05a6c4d17e 100644 --- a/docs/sphinx/precompiling.md +++ b/docs/sphinx/precompiling.md @@ -1,13 +1,11 @@ # Precompiling -Precompiling is compiling Python source files (`.py` files) into byte code (`.pyc` -files) at build -time instead of runtime. Doing it at build time can improve performance by -skipping that work at runtime. - -Precompiling is enabled by default, so there typically isn't anything special -you must do to use it. +Precompiling is compiling Python source files (`.py` files) into byte code +(`.pyc` files) at build time instead of runtime. Doing it at build time can +improve performance by skipping that work at runtime. +Precompiling is disabled by default, so you must enable it using flags or +attributes to use it. ## Overhead of precompiling From ede1163c1aaf65e510fa8a4c53d833f0a0d5f955 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 19 May 2024 11:50:50 +0900 Subject: [PATCH 033/345] fix(whl_library): fix the dependency generation for multi-python depenency closures (#1875) We start using the recently introduced `is_python_config_setting` to make it possible to have a working select statement when multiple python version selection needs to happen in a `whl_library`. This adds further fixes so that the correct dependencies are pulled in when the `python_version` string flag is unset thus making this implementation suitable for `bzlmod` use case where we would use a single `whl_library` instance for multiple python versions within the hub. Work towards #735. --- CHANGELOG.md | 4 + .../generate_whl_library_build_bazel.bzl | 89 +++++++------------ .../tools/wheel_installer/arguments_test.py | 1 - .../tools/wheel_installer/wheel.py | 39 +++++--- .../tools/wheel_installer/wheel_test.py | 59 +++++++++--- .../generate_build_bazel_tests.bzl | 68 +++++--------- 6 files changed, 133 insertions(+), 127 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61e9d95cd2..1040dedd0d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,10 @@ A brief description of the categories of changes: be automatically deleted correctly. For example, if `python_generation_mode` is set to package, when `__init__.py` is deleted, the `py_library` generated for this package before will be deleted automatically. +* (whl_library): Use `is_python_config_setting` to correctly handle multi-python + version dependency select statements when the `experimental_target_platforms` + includes the Python ABI. The default python version case within the select is + also now handled correctly, stabilizing the implementation. ### Added * (rules) Precompiling Python source at build time is available. but is diff --git a/python/pip_install/private/generate_whl_library_build_bazel.bzl b/python/pip_install/private/generate_whl_library_build_bazel.bzl index 8010ccbad8..f3ddd3bcab 100644 --- a/python/pip_install/private/generate_whl_library_build_bazel.bzl +++ b/python/pip_install/private/generate_whl_library_build_bazel.bzl @@ -92,12 +92,14 @@ py_library( """ 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 + 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)]) @@ -115,14 +117,7 @@ def _render_list_and_select(deps, deps_by_platform, tmpl): # 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 - # - # FIXME @aignas 2024-01-24: This currently works as expected only if the default - # value of the @rules_python//python/config_settings:python_version is set in - # the `.bazelrc`. If it is unset, then the we don't get the expected behaviour - # in cases where we are using a simple `py_binary` using the default toolchain - # without forcing any transitions. If the `python_version` config setting is set - # via .bazelrc, then everything works correctly. - deps_by_platform["//conditions:default"] = [] + deps_by_platform.setdefault("//conditions:default", []) deps_by_platform = render.select(deps_by_platform, value_repr = render.list) if deps == "[]": @@ -131,81 +126,63 @@ def _render_list_and_select(deps, deps_by_platform, tmpl): return "{} + {}".format(deps, deps_by_platform) def _render_config_settings(dependencies_by_platform): - py_version_by_os_arch = {} + 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("@"): + 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 - py_version_by_os_arch.setdefault((os, arch), []).append(abi) - - if not py_version_by_os_arch: - return None, None - - loads = [] - additional_content = [] - for (os, arch), abis in py_version_by_os_arch.items(): constraint_values = [] - if os: - constraint_values.append("@platforms//os:{}".format(os)) if arch: constraint_values.append("@platforms//cpu:{}".format(arch)) + if os: + constraint_values.append("@platforms//os:{}".format(os)) - os_arch = (os or "anyos") + "_" + (arch or "anyarch") - additional_content.append( - """\ -config_setting( + constraint_values_str = render.indent(render.list(constraint_values)).lstrip() + + if abi: + if not loads: + loads.append("""load("@rules_python//python/config_settings:config_settings.bzl", "is_python_config_setting")""") + + additional_content.append( + """\ +is_python_config_setting( name = "is_{name}", - constraint_values = {values}, + python_version = "3.{minor_version}", + constraint_values = {constraint_values}, visibility = ["//visibility:private"], )""".format( - name = os_arch, - values = render.indent(render.list(sorted([str(Label(c)) for c in constraint_values]))).strip(), - ), - ) - - if abis == [""]: - if not os or not arch: - fail("BUG: both os and arch should be set in this case") - continue - - for abi in abis: - if not loads: - loads.append("""load("@bazel_skylib//lib:selects.bzl", "selects")""") - minor_version = int(abi[len("cp3"):]) - setting = "@@{rules_python}//python/config_settings:is_python_3.{version}".format( - rules_python = str(Label("//:BUILD.bazel")).partition("//")[0].strip("@"), - version = minor_version, + name = p.replace("cp3", "python_3."), + minor_version = abi[len("cp3"):], + constraint_values = constraint_values_str, + ), ) - settings = [ - ":is_" + os_arch, - setting, - ] - - plat = "{}_{}".format(abi, os_arch) - + else: additional_content.append( """\ -selects.config_setting_group( - name = "{name}", - match_all = {values}, +config_setting( + name = "is_{name}", + constraint_values = {constraint_values}, visibility = ["//visibility:private"], )""".format( - name = _plat_label(plat).lstrip(":"), - values = render.indent(render.list(sorted(settings))).strip(), + name = p.replace("cp3", "python_3."), + constraint_values = constraint_values_str, ), ) @@ -379,7 +356,7 @@ def generate_whl_library_build_bazel( contents = "\n".join( [ _BUILD_TEMPLATE.format( - loads = "\n".join(loads), + 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(), diff --git a/python/pip_install/tools/wheel_installer/arguments_test.py b/python/pip_install/tools/wheel_installer/arguments_test.py index cafb85f8ed..fa018da40f 100644 --- a/python/pip_install/tools/wheel_installer/arguments_test.py +++ b/python/pip_install/tools/wheel_installer/arguments_test.py @@ -56,7 +56,6 @@ def test_platform_aggregation(self) -> None: parser = arguments.parser() args = parser.parse_args( args=[ - "--platform=host", "--platform=linux_*", "--platform=osx_*", "--platform=windows_*", diff --git a/python/pip_install/tools/wheel_installer/wheel.py b/python/pip_install/tools/wheel_installer/wheel.py index f7c686d9ba..d355bfe695 100644 --- a/python/pip_install/tools/wheel_installer/wheel.py +++ b/python/pip_install/tools/wheel_installer/wheel.py @@ -59,7 +59,7 @@ class Arch(Enum): ppc64le = ppc @classmethod - def interpreter(cls) -> "OS": + def interpreter(cls) -> "Arch": "Return the currently running interpreter architecture." # FIXME @aignas 2023-12-13: Hermetic toolchain on Windows 3.11.6 # is returning an empty string here, so lets default to x86_64 @@ -94,12 +94,6 @@ class Platform: arch: Optional[Arch] = None minor_version: Optional[int] = None - def __post_init__(self): - if not self.os and not self.arch and not self.minor_version: - raise ValueError( - "At least one of os, arch, minor_version must be specified" - ) - @classmethod def all( cls, @@ -125,7 +119,13 @@ def host(cls) -> List["Platform"]: A list of parsed values which makes the signature the same as `Platform.all` and `Platform.from_string`. """ - return [cls(os=OS.interpreter(), arch=Arch.interpreter())] + return [ + Platform( + os=OS.interpreter(), + arch=Arch.interpreter(), + minor_version=host_interpreter_minor_version(), + ) + ] def all_specializations(self) -> Iterator["Platform"]: """Return the platform itself and all its unambiguous specializations. @@ -160,9 +160,9 @@ def __lt__(self, other: Any) -> bool: def __str__(self) -> str: if self.minor_version is None: - assert ( - self.os is not None - ), f"if minor_version is None, OS must be specified, got {repr(self)}" + if self.os is None and self.arch is None: + return "//conditions:default" + if self.arch is None: return f"@platforms//os:{self.os}" else: @@ -207,6 +207,7 @@ def from_string(cls, platform: Union[str, List[str]]) -> List["Platform"]: minor_version=minor_version, ) ) + else: ret.update( cls.all( @@ -252,6 +253,8 @@ def platform_system(self) -> str: return "Darwin" elif self.os == OS.windows: return "Windows" + else: + return "" # derived from OS and Arch @property @@ -416,7 +419,9 @@ def _maybe_add_common_dep(self, dep): if len(self._target_versions) < 2: return - platforms = [Platform(minor_version=v) for v in self._target_versions] + platforms = [Platform()] + [ + Platform(minor_version=v) for v in self._target_versions + ] # If the dep is targeting all target python versions, lets add it to # the common dependency list to simplify the select statements. @@ -534,14 +539,22 @@ def _add_req(self, req: Requirement, extras: Set[str]) -> None: ): continue - if match_arch: + if match_arch and self._add_version_select: + self._add(req.name, plat) + if plat.minor_version == host_interpreter_minor_version(): + self._add(req.name, Platform(plat.os, plat.arch)) + elif match_arch: self._add(req.name, plat) elif match_os and self._add_version_select: self._add(req.name, Platform(plat.os, minor_version=plat.minor_version)) + if plat.minor_version == host_interpreter_minor_version(): + self._add(req.name, Platform(plat.os)) elif match_os: self._add(req.name, Platform(plat.os)) elif match_version and self._add_version_select: self._add(req.name, Platform(minor_version=plat.minor_version)) + if plat.minor_version == host_interpreter_minor_version(): + self._add(req.name, Platform()) elif match_version: self._add(req.name, None) diff --git a/python/pip_install/tools/wheel_installer/wheel_test.py b/python/pip_install/tools/wheel_installer/wheel_test.py index 20141e2867..acf2315ee9 100644 --- a/python/pip_install/tools/wheel_installer/wheel_test.py +++ b/python/pip_install/tools/wheel_installer/wheel_test.py @@ -1,5 +1,6 @@ import unittest from random import shuffle +from unittest import mock from python.pip_install.tools.wheel_installer import wheel @@ -216,22 +217,28 @@ def test_can_get_deps_based_on_specific_python_version(self): self.assertEqual(["bar"], py38_deps.deps) self.assertEqual({"@platforms//os:linux": ["posix_dep"]}, py38_deps.deps_select) - def test_can_get_version_select(self): + @mock.patch( + "python.pip_install.tools.wheel_installer.wheel.host_interpreter_minor_version" + ) + def test_can_get_version_select(self, mock_host_interpreter_version): requires_dist = [ "bar", "baz; python_version < '3.8'", + "baz_new; python_version >= '3.8'", "posix_dep; os_name=='posix'", "posix_dep_with_version; os_name=='posix' and python_version >= '3.8'", ] + mock_host_interpreter_version.return_value = 7 + + self.maxDiff = None deps = wheel.Deps( "foo", requires_dist=requires_dist, platforms=[ - wheel.Platform( - os=wheel.OS.linux, arch=wheel.Arch.x86_64, minor_version=minor - ) + wheel.Platform(os=os, arch=wheel.Arch.x86_64, minor_version=minor) for minor in [7, 8, 9] + for os in [wheel.OS.linux, wheel.OS.windows] ], ) got = deps.build() @@ -239,20 +246,38 @@ def test_can_get_version_select(self): self.assertEqual(["bar"], got.deps) self.assertEqual( { + "//conditions:default": ["baz"], "@//python/config_settings:is_python_3.7": ["baz"], + "@//python/config_settings:is_python_3.8": ["baz_new"], + "@//python/config_settings:is_python_3.9": ["baz_new"], + "@platforms//os:linux": ["baz", "posix_dep"], "cp37_linux_anyarch": ["baz", "posix_dep"], - "cp38_linux_anyarch": ["posix_dep", "posix_dep_with_version"], - "cp39_linux_anyarch": ["posix_dep", "posix_dep_with_version"], + "cp38_linux_anyarch": [ + "baz_new", + "posix_dep", + "posix_dep_with_version", + ], + "cp39_linux_anyarch": [ + "baz_new", + "posix_dep", + "posix_dep_with_version", + ], }, got.deps_select, ) - def test_deps_spanning_all_target_py_versions_are_added_to_common(self): + @mock.patch( + "python.pip_install.tools.wheel_installer.wheel.host_interpreter_minor_version" + ) + def test_deps_spanning_all_target_py_versions_are_added_to_common( + self, mock_host_version + ): requires_dist = [ "bar", "baz (<2,>=1.11) ; python_version < '3.8'", "baz (<2,>=1.14) ; python_version >= '3.8'", ] + mock_host_version.return_value = 8 deps = wheel.Deps( "foo", @@ -264,7 +289,12 @@ def test_deps_spanning_all_target_py_versions_are_added_to_common(self): self.assertEqual(["bar", "baz"], got.deps) self.assertEqual({}, got.deps_select) - def test_deps_are_not_duplicated(self): + @mock.patch( + "python.pip_install.tools.wheel_installer.wheel.host_interpreter_minor_version" + ) + def test_deps_are_not_duplicated(self, mock_host_version): + mock_host_version.return_value = 7 + # See an example in # https://files.pythonhosted.org/packages/76/9e/db1c2d56c04b97981c06663384f45f28950a73d9acf840c4006d60d0a1ff/opencv_python-4.9.0.80-cp37-abi3-win32.whl.metadata requires_dist = [ @@ -281,14 +311,21 @@ def test_deps_are_not_duplicated(self): deps = wheel.Deps( "foo", requires_dist=requires_dist, - platforms=wheel.Platform.from_string(["cp310_*"]), + platforms=wheel.Platform.from_string(["cp37_*", "cp310_*"]), ) got = deps.build() self.assertEqual(["bar"], got.deps) self.assertEqual({}, got.deps_select) - def test_deps_are_not_duplicated_when_encountering_platform_dep_first(self): + @mock.patch( + "python.pip_install.tools.wheel_installer.wheel.host_interpreter_minor_version" + ) + def test_deps_are_not_duplicated_when_encountering_platform_dep_first( + self, mock_host_version + ): + mock_host_version.return_value = 7 + # Note, that we are sorting the incoming `requires_dist` and we need to ensure that we are not getting any # issues even if the platform-specific line comes first. requires_dist = [ @@ -299,7 +336,7 @@ def test_deps_are_not_duplicated_when_encountering_platform_dep_first(self): deps = wheel.Deps( "foo", requires_dist=requires_dist, - platforms=wheel.Platform.from_string(["cp310_*"]), + platforms=wheel.Platform.from_string(["cp37_*", "cp310_*"]), ) got = deps.build() diff --git a/tests/pip_install/whl_library/generate_build_bazel_tests.bzl b/tests/pip_install/whl_library/generate_build_bazel_tests.bzl index 66126cf6fb..62858afc94 100644 --- a/tests/pip_install/whl_library/generate_build_bazel_tests.bzl +++ b/tests/pip_install/whl_library/generate_build_bazel_tests.bzl @@ -21,8 +21,8 @@ _tests = [] def _test_simple(env): want = """\ -load("@rules_python//python:defs.bzl", "py_library", "py_binary") load("@bazel_skylib//rules:copy_file.bzl", "copy_file") +load("@rules_python//python:defs.bzl", "py_library", "py_binary") package(default_visibility = ["//visibility:public"]) @@ -86,9 +86,9 @@ _tests.append(_test_simple) def _test_dep_selects(env): want = """\ -load("@rules_python//python:defs.bzl", "py_library", "py_binary") load("@bazel_skylib//rules:copy_file.bzl", "copy_file") -load("@bazel_skylib//lib:selects.bzl", "selects") +load("@rules_python//python/config_settings:config_settings.bzl", "is_python_config_setting") +load("@rules_python//python:defs.bzl", "py_library", "py_binary") package(default_visibility = ["//visibility:public"]) @@ -113,9 +113,9 @@ filegroup( "@//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_cp310_linux_ppc": ["@pypi_py310_linux_ppc_dep//:whl"], - ":is_cp39_anyos_aarch64": ["@pypi_py39_arm_dep//:whl"], - ":is_cp39_linux_anyarch": ["@pypi_py39_linux_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": [], }, @@ -147,9 +147,9 @@ py_library( "@//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_cp310_linux_ppc": ["@pypi_py310_linux_ppc_dep//:pkg"], - ":is_cp39_anyos_aarch64": ["@pypi_py39_arm_dep//:pkg"], - ":is_cp39_linux_anyarch": ["@pypi_py39_linux_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": [], }, @@ -158,8 +158,9 @@ py_library( visibility = ["//visibility:public"], ) -config_setting( - name = "is_linux_ppc", +is_python_config_setting( + name = "is_python_3.10_linux_ppc", + python_version = "3.10", constraint_values = [ "@platforms//cpu:ppc", "@platforms//os:linux", @@ -167,45 +168,20 @@ config_setting( visibility = ["//visibility:private"], ) -selects.config_setting_group( - name = "is_cp310_linux_ppc", - match_all = [ - ":is_linux_ppc", - "@//python/config_settings:is_python_3.10", - ], - visibility = ["//visibility:private"], -) - -config_setting( - name = "is_anyos_aarch64", +is_python_config_setting( + name = "is_python_3.9_anyos_aarch64", + python_version = "3.9", constraint_values = ["@platforms//cpu:aarch64"], visibility = ["//visibility:private"], ) -selects.config_setting_group( - name = "is_cp39_anyos_aarch64", - match_all = [ - ":is_anyos_aarch64", - "@//python/config_settings:is_python_3.9", - ], - visibility = ["//visibility:private"], -) - -config_setting( - name = "is_linux_anyarch", +is_python_config_setting( + name = "is_python_3.9_linux_anyarch", + python_version = "3.9", constraint_values = ["@platforms//os:linux"], visibility = ["//visibility:private"], ) -selects.config_setting_group( - name = "is_cp39_linux_anyarch", - match_all = [ - ":is_linux_anyarch", - "@//python/config_settings:is_python_3.9", - ], - visibility = ["//visibility:private"], -) - config_setting( name = "is_linux_x86_64", constraint_values = [ @@ -239,8 +215,8 @@ _tests.append(_test_dep_selects) def _test_with_annotation(env): want = """\ -load("@rules_python//python:defs.bzl", "py_library", "py_binary") load("@bazel_skylib//rules:copy_file.bzl", "copy_file") +load("@rules_python//python:defs.bzl", "py_library", "py_binary") package(default_visibility = ["//visibility:public"]) @@ -327,8 +303,8 @@ _tests.append(_test_with_annotation) def _test_with_entry_points(env): want = """\ -load("@rules_python//python:defs.bzl", "py_library", "py_binary") load("@bazel_skylib//rules:copy_file.bzl", "copy_file") +load("@rules_python//python:defs.bzl", "py_library", "py_binary") package(default_visibility = ["//visibility:public"]) @@ -401,8 +377,8 @@ _tests.append(_test_with_entry_points) def _test_group_member(env): want = """\ -load("@rules_python//python:defs.bzl", "py_library", "py_binary") load("@bazel_skylib//rules:copy_file.bzl", "copy_file") +load("@rules_python//python:defs.bzl", "py_library", "py_binary") package(default_visibility = ["//visibility:public"]) @@ -503,8 +479,8 @@ _tests.append(_test_group_member) def _test_group_member_deps_to_hub(env): want = """\ -load("@rules_python//python:defs.bzl", "py_library", "py_binary") load("@bazel_skylib//rules:copy_file.bzl", "copy_file") +load("@rules_python//python:defs.bzl", "py_library", "py_binary") package(default_visibility = ["//visibility:public"]) From 8d31c5f297412d0d28d0f28327aab570e3f8adcb Mon Sep 17 00:00:00 2001 From: Bartosz Popiela Date: Sun, 19 May 2024 05:11:54 +0200 Subject: [PATCH 034/345] fix: gazelle failing on Windows with "panic: runtime error: invalid memory address or nil pointer dereference" (#1872) This pull request fixes `bazel run gazelle` failing on Windows with "panic: runtime error: invalid memory address or nil pointer dereference" if there is a path with at least 2-levels deep directory. Fixes #1871 --------- Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> --- CHANGELOG.md | 2 ++ gazelle/pythonconfig/pythonconfig.go | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1040dedd0d..09b9aaf7ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,8 @@ A brief description of the categories of changes: version dependency select statements when the `experimental_target_platforms` includes the Python ABI. The default python version case within the select is also now handled correctly, stabilizing the implementation. +* (gazelle) Fix Gazelle failing on Windows with + "panic: runtime error: invalid memory address or nil pointer dereference" ### Added * (rules) Precompiling Python source at build time is available. but is diff --git a/gazelle/pythonconfig/pythonconfig.go b/gazelle/pythonconfig/pythonconfig.go index 726b145aaf..aa9255290c 100644 --- a/gazelle/pythonconfig/pythonconfig.go +++ b/gazelle/pythonconfig/pythonconfig.go @@ -16,7 +16,7 @@ package pythonconfig import ( "fmt" - "path/filepath" + "path" "strings" "github.com/emirpasic/gods/lists/singlylinkedlist" @@ -126,7 +126,7 @@ type Configs map[string]*Config // ParentForPackage returns the parent Config for the given Bazel package. func (c *Configs) ParentForPackage(pkg string) *Config { - dir := filepath.Dir(pkg) + dir := path.Dir(pkg) if dir == "." { dir = "" } From a6cb620f0c0c34082040b0560d4dd2e11e39715e Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 19 May 2024 12:38:03 +0900 Subject: [PATCH 035/345] feat(pip): support specifying requirements per (os, arch) (#1885) This PR implements a better way of specifying the requirements files for different (os, cpu) tuples. It allows for more granular specification than what is available today and allows for future extension to have all of the sources in the select statements in the hub repository. This is replacing the previous selection of the requirements and there are a few differences in behaviour that should not be visible to the external user. Instead of selecting the right file which we should then use to create `whl_library` instances we parse all of the provided requirements files and merge them based on the contents. The merging is done based on the blocks within the requirement file and this allows the starlark code to understand if we are working with different versions of the same package on different target platforms. Fixes #1868 Work towards #1643, #735 --- CHANGELOG.md | 9 +- MODULE.bazel | 8 +- docs/sphinx/pip.md | 74 +++- examples/bzlmod/MODULE.bazel | 24 +- .../tests/dupe_requirements/BUILD.bazel | 19 - .../dupe_requirements_test.py | 4 - .../tests/dupe_requirements/requirements.in | 2 - .../tests/dupe_requirements/requirements.txt | 97 ----- examples/pip_parse/MODULE.bazel | 1 + examples/pip_parse_vendored/requirements.bzl | 3 +- python/pip_install/BUILD.bazel | 2 +- python/pip_install/pip_repository.bzl | 78 ++-- .../pip_repository_requirements.bzl.tmpl | 3 +- python/private/BUILD.bazel | 16 + python/private/bzlmod/BUILD.bazel | 2 +- python/private/bzlmod/pip.bzl | 76 ++-- python/private/normalize_platform.bzl | 13 + python/private/parse_requirements.bzl | 374 ++++++++++++++++++ python/private/pypi_index.bzl | 60 +-- python/private/pypi_index_sources.bzl | 53 +++ python/private/whl_target_platforms.bzl | 43 +- tests/private/parse_requirements/BUILD.bazel | 3 + .../parse_requirements_tests.bzl | 374 ++++++++++++++++++ tests/private/pypi_index/pypi_index_tests.bzl | 34 +- tests/private/pypi_index_sources/BUILD.bazel | 3 + .../pypi_index_sources_tests.bzl | 60 +++ .../whl_target_platforms/select_whl_tests.bzl | 18 +- 27 files changed, 1071 insertions(+), 382 deletions(-) delete mode 100644 examples/bzlmod/tests/dupe_requirements/BUILD.bazel delete mode 100644 examples/bzlmod/tests/dupe_requirements/dupe_requirements_test.py delete mode 100644 examples/bzlmod/tests/dupe_requirements/requirements.in delete mode 100644 examples/bzlmod/tests/dupe_requirements/requirements.txt create mode 100644 python/private/normalize_platform.bzl create mode 100644 python/private/parse_requirements.bzl create mode 100644 python/private/pypi_index_sources.bzl create mode 100644 tests/private/parse_requirements/BUILD.bazel create mode 100644 tests/private/parse_requirements/parse_requirements_tests.bzl create mode 100644 tests/private/pypi_index_sources/BUILD.bazel create mode 100644 tests/private/pypi_index_sources/pypi_index_sources_tests.bzl diff --git a/CHANGELOG.md b/CHANGELOG.md index 09b9aaf7ee..430c5c84f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,14 +25,12 @@ A brief description of the categories of changes: * (toolchains) Optional toolchain dependency: `py_binary`, `py_test`, and `py_library` now depend on the `//python:exec_tools_toolchain_type` for build tools. - * (deps): Bumped `bazel_skylib` to 1.6.1. * (bzlmod): The `python` and internal `rules_python` extensions have been marked as `reproducible` and will not include any lock file entries from now on. ### Fixed - * (gazelle) Remove `visibility` from `NonEmptyAttr`. Now empty(have no `deps/main/srcs/imports` attr) `py_library/test/binary` rules will be automatically deleted correctly. For example, if `python_generation_mode` @@ -66,9 +64,16 @@ A brief description of the categories of changes: `transitive_pyc_files`, which tell the pyc files a target makes available directly and transitively, respectively. * `//python:features.bzl` added to allow easy feature-detection in the future. +* (pip) Allow specifying the requirements by (os, arch) and add extra + validations when parsing the inputs. This is a non-breaking change for most + users unless they have been passing multiple `requirements_*` files together + with `extra_pip_args = ["--platform=manylinux_2_4_x86_64"]`, that was an + invalid usage previously but we were not failing the build. From now on this + is explicitly disallowed. [precompile-docs]: /precompiling + ## [0.32.2] - 2024-05-14 [0.32.2]: https://github.com/bazelbuild/rules_python/releases/tag/0.32.2 diff --git a/MODULE.bazel b/MODULE.bazel index 8acde16c33..7064dfc84f 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -61,9 +61,11 @@ pip.parse( experimental_index_url = "https://pypi.org/simple", hub_name = "rules_python_publish_deps", python_version = "3.11", - requirements_darwin = "//tools/publish:requirements_darwin.txt", - requirements_lock = "//tools/publish:requirements.txt", - requirements_windows = "//tools/publish:requirements_windows.txt", + requirements_by_platform = { + "//tools/publish:requirements.txt": "linux_*", + "//tools/publish:requirements_darwin.txt": "osx_*", + "//tools/publish:requirements_windows.txt": "windows_*", + }, ) use_repo(pip, "rules_python_publish_deps") diff --git a/docs/sphinx/pip.md b/docs/sphinx/pip.md index e73c0c6a56..e1c8e343f0 100644 --- a/docs/sphinx/pip.md +++ b/docs/sphinx/pip.md @@ -19,11 +19,41 @@ load("@pip_deps//:requirements.bzl", "install_deps") install_deps() ``` +For `bzlmod` an equivalent `MODULE.bazel` would look like: +```starlark +pip = use_extension("//python/extensions:pip.bzl", "pip") +pip.parse( + hub_name = "pip_deps", + requirements_lock = ":requirements.txt", +) +use_repo(pip, "pip_deps") +``` + You can then reference installed dependencies from a `BUILD` file with: ```starlark load("@pip_deps//:requirements.bzl", "requirement") +py_library( + name = "bar", + ... + deps = [ + "//my/other:dep", + "@pip_deps//requests", + "@pip_deps//numpy", + ], +) +``` + +The rules also provide a convenience macro for translating the entries in the +`requirements.txt` file (e.g. `opencv-python`) to the right bazel label (e.g. +`@pip_deps//opencv_python`). The convention of bazel labels is lowercase +`snake_case`, but you can use the helper to avoid depending on this convention +as follows: + +```starlark +load("@pip_deps//:requirements.bzl", "requirement") + py_library( name = "bar", ... @@ -35,33 +65,39 @@ py_library( ) ``` -In addition to the `requirement` macro, which is used to access the generated `py_library` -target generated from a package's wheel, The generated `requirements.bzl` file contains -functionality for exposing [entry points][whl_ep] as `py_binary` targets as well. +If you would like to access [entry points][whl_ep], see the `py_console_script_binary` rule documentation. [whl_ep]: https://packaging.python.org/specifications/entry-points/ +(per-os-arch-requirements)= +## Requirements for a specific OS/Architecture + +In some cases you may need to use different requirements files for different OS, Arch combinations. This is enabled via the `requirements_by_platform` attribute in `pip.parse` extension and the `pip_parse` repository rule. The keys of the dictionary are labels to the file and the values are a list of comma separated target (os, arch) tuples. + +For example: ```starlark -load("@pip_deps//:requirements.bzl", "entry_point") - -alias( - name = "pip-compile", - actual = entry_point( - pkg = "pip-tools", - script = "pip-compile", - ), -) + # ... + requirements_by_platform = { + "requirements_linux_x86_64.txt": "linux_x86_64", + "requirements_osx.txt": "osx_*", + "requirements_linux_exotic.txt": "linux_exotic", + "requirements_some_platforms.txt": "linux_aarch64,windows_*", + }, + # For the list of standard platforms that the rules_python has toolchains for, default to + # the following requirements file. + requirements_lock = "requirements_lock.txt", ``` -Note that for packages whose name and script are the same, only the name of the package -is needed when calling the `entry_point` macro. +In case of duplicate platforms, `rules_python` will raise an error as there has +to be unambiguous mapping of the requirement files to the (os, arch) tuples. +An alternative way is to use per-OS requirement attributes. ```starlark -load("@pip_deps//:requirements.bzl", "entry_point") - -alias( - name = "flake8", - actual = entry_point("flake8"), + # ... + requirements_windows = "requirements_windows.txt", + requirements_darwin = "requirements_darwin.txt", + # For the remaining platforms (which is basically only linux OS), use this file. + requirements_lock = "requirements_lock.txt", ) ``` diff --git a/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel index 1134487145..0d30161147 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -128,8 +128,17 @@ pip.parse( ], hub_name = "pip", python_version = "3.9", - requirements_lock = "//:requirements_lock_3_9.txt", - requirements_windows = "//:requirements_windows_3_9.txt", + # The requirements files for each platform that we want to support. + requirements_by_platform = { + # Default requirements file for needs to explicitly provide the platforms + "//:requirements_lock_3_9.txt": "linux_*,osx_*", + # This API allows one to specify additional platforms that the users + # configure the toolchains for themselves. In this example we add + # `windows_aarch64` to illustrate that `rules_python` won't fail to + # process the value, but it does not mean that this example will work + # on Windows ARM. + "//:requirements_windows_3_9.txt": "windows_x86_64,windows_aarch64", + }, # These modifications were created above and we # are providing pip.parse with the label of the mod # and the name of the wheel. @@ -193,14 +202,3 @@ local_path_override( module_name = "other_module", path = "other_module", ) - -# ===== -# Config for testing duplicate packages in requirements -# ===== -# -pip.parse( - hub_name = "dupe_requirements", - python_version = "3.9", # Must match whatever is marked is_default=True - requirements_lock = "//tests/dupe_requirements:requirements.txt", -) -use_repo(pip, "dupe_requirements") diff --git a/examples/bzlmod/tests/dupe_requirements/BUILD.bazel b/examples/bzlmod/tests/dupe_requirements/BUILD.bazel deleted file mode 100644 index 47eb7ca0fb..0000000000 --- a/examples/bzlmod/tests/dupe_requirements/BUILD.bazel +++ /dev/null @@ -1,19 +0,0 @@ -load("@rules_python//python:pip.bzl", "compile_pip_requirements") -load("@rules_python//python:py_test.bzl", "py_test") - -py_test( - name = "dupe_requirements_test", - srcs = ["dupe_requirements_test.py"], - deps = [ - "@dupe_requirements//pyjwt", - ], -) - -compile_pip_requirements( - name = "requirements", - src = "requirements.in", - requirements_txt = "requirements.txt", - # This is to make the requirements diff test not run on CI. The content we - # need in requirements.txt isn't exactly what will be generated. - tags = ["manual"], -) diff --git a/examples/bzlmod/tests/dupe_requirements/dupe_requirements_test.py b/examples/bzlmod/tests/dupe_requirements/dupe_requirements_test.py deleted file mode 100644 index 1139dc5252..0000000000 --- a/examples/bzlmod/tests/dupe_requirements/dupe_requirements_test.py +++ /dev/null @@ -1,4 +0,0 @@ -# There's nothing to test at runtime. Building indicates success. -# Just import the relevant modules as a basic check. -import cryptography -import jwt diff --git a/examples/bzlmod/tests/dupe_requirements/requirements.in b/examples/bzlmod/tests/dupe_requirements/requirements.in deleted file mode 100644 index b1f623395a..0000000000 --- a/examples/bzlmod/tests/dupe_requirements/requirements.in +++ /dev/null @@ -1,2 +0,0 @@ -pyjwt -pyjwt[crypto] diff --git a/examples/bzlmod/tests/dupe_requirements/requirements.txt b/examples/bzlmod/tests/dupe_requirements/requirements.txt deleted file mode 100644 index 785f556624..0000000000 --- a/examples/bzlmod/tests/dupe_requirements/requirements.txt +++ /dev/null @@ -1,97 +0,0 @@ -# -# This file is manually tweaked output from the automatic generation. -# To generate: -# 1. bazel run //tests/dupe_requirements:requirements.update -# 2. Then copy/paste the pyjtw lines so there are duplicates -# -pyjwt==2.8.0 \ - --hash=sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de \ - --hash=sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320 - # via -r tests/dupe_requirements/requirements.in -pyjwt[crypto]==2.8.0 \ - --hash=sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de \ - --hash=sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320 - # via -r tests/dupe_requirements/requirements.in -cffi==1.16.0 \ - --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ - --hash=sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a \ - --hash=sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417 \ - --hash=sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab \ - --hash=sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520 \ - --hash=sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36 \ - --hash=sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743 \ - --hash=sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8 \ - --hash=sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed \ - --hash=sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684 \ - --hash=sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56 \ - --hash=sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324 \ - --hash=sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d \ - --hash=sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235 \ - --hash=sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e \ - --hash=sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088 \ - --hash=sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000 \ - --hash=sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7 \ - --hash=sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e \ - --hash=sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673 \ - --hash=sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c \ - --hash=sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe \ - --hash=sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2 \ - --hash=sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098 \ - --hash=sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8 \ - --hash=sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a \ - --hash=sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0 \ - --hash=sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b \ - --hash=sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896 \ - --hash=sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e \ - --hash=sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9 \ - --hash=sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2 \ - --hash=sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b \ - --hash=sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6 \ - --hash=sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404 \ - --hash=sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f \ - --hash=sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0 \ - --hash=sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4 \ - --hash=sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc \ - --hash=sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936 \ - --hash=sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba \ - --hash=sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872 \ - --hash=sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb \ - --hash=sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614 \ - --hash=sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1 \ - --hash=sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d \ - --hash=sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969 \ - --hash=sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b \ - --hash=sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4 \ - --hash=sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627 \ - --hash=sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956 \ - --hash=sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357 - # via cryptography -cryptography==41.0.7 \ - --hash=sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960 \ - --hash=sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a \ - --hash=sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc \ - --hash=sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a \ - --hash=sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf \ - --hash=sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1 \ - --hash=sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39 \ - --hash=sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406 \ - --hash=sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a \ - --hash=sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a \ - --hash=sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c \ - --hash=sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be \ - --hash=sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15 \ - --hash=sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2 \ - --hash=sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d \ - --hash=sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157 \ - --hash=sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003 \ - --hash=sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248 \ - --hash=sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a \ - --hash=sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec \ - --hash=sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309 \ - --hash=sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7 \ - --hash=sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d - # via pyjwt -pycparser==2.21 \ - --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ - --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 - # via cffi diff --git a/examples/pip_parse/MODULE.bazel b/examples/pip_parse/MODULE.bazel index b0e38f2218..f9ca90833f 100644 --- a/examples/pip_parse/MODULE.bazel +++ b/examples/pip_parse/MODULE.bazel @@ -21,6 +21,7 @@ use_repo( pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip") pip.parse( + download_only = True, experimental_requirement_cycles = { "sphinx": [ "sphinx", diff --git a/examples/pip_parse_vendored/requirements.bzl b/examples/pip_parse_vendored/requirements.bzl index de5d187262..5c2391bd4c 100644 --- a/examples/pip_parse_vendored/requirements.bzl +++ b/examples/pip_parse_vendored/requirements.bzl @@ -1,7 +1,6 @@ """Starlark representation of locked requirements. -@generated by rules_python pip_parse repository rule -from @//:requirements.txt +@generated by rules_python pip_parse repository rule. """ load("@rules_python//python:pip.bzl", "pip_utils") diff --git a/python/pip_install/BUILD.bazel b/python/pip_install/BUILD.bazel index e794075af0..91f2ec7b59 100644 --- a/python/pip_install/BUILD.bazel +++ b/python/pip_install/BUILD.bazel @@ -23,7 +23,6 @@ bzl_library( srcs = ["pip_repository.bzl"], deps = [ ":repositories_bzl", - ":requirements_parser_bzl", "//python:repositories_bzl", "//python:versions_bzl", "//python/pip_install/private:generate_group_library_build_bazel_bzl", @@ -32,6 +31,7 @@ bzl_library( "//python/private:bzlmod_enabled_bzl", "//python/private:envsubst_bzl", "//python/private:normalize_name_bzl", + "//python/private:parse_requirements_bzl", "//python/private:parse_whl_name_bzl", "//python/private:patch_whl_bzl", "//python/private:render_pkg_aliases_bzl", diff --git a/python/pip_install/pip_repository.bzl b/python/pip_install/pip_repository.bzl index db6736836f..17d80838e0 100644 --- a/python/pip_install/pip_repository.bzl +++ b/python/pip_install/pip_repository.bzl @@ -18,13 +18,13 @@ load("@bazel_skylib//lib:sets.bzl", "sets") load("//python:repositories.bzl", "is_standalone_interpreter") load("//python:versions.bzl", "WINDOWS_NAME") load("//python/pip_install:repositories.bzl", "all_requirements") -load("//python/pip_install:requirements_parser.bzl", parse_requirements = "parse") load("//python/pip_install/private:generate_group_library_build_bazel.bzl", "generate_group_library_build_bazel") load("//python/pip_install/private:generate_whl_library_build_bazel.bzl", "generate_whl_library_build_bazel") load("//python/pip_install/private:srcs.bzl", "PIP_INSTALL_PY_SRCS") load("//python/private:auth.bzl", "AUTH_ATTRS", "get_auth") load("//python/private:envsubst.bzl", "envsubst") load("//python/private:normalize_name.bzl", "normalize_name") +load("//python/private:parse_requirements.bzl", "host_platform", "parse_requirements", "select_requirement") load("//python/private:parse_whl_name.bzl", "parse_whl_name") load("//python/private:patch_whl.bzl", "patch_whl") load("//python/private:render_pkg_aliases.bzl", "render_pkg_aliases", "whl_alias") @@ -272,38 +272,30 @@ package(default_visibility = ["//visibility:public"]) exports_files(["requirements.bzl"]) """ -def locked_requirements_label(ctx, attr): - """Get the preferred label for a locked requirements file based on platform. - - Args: - ctx: repository or module context - attr: attributes for the repo rule or tag extension - - Returns: - Label - """ - os = ctx.os.name.lower() - requirements_txt = attr.requirements_lock - if os.startswith("mac os") and attr.requirements_darwin != None: - requirements_txt = attr.requirements_darwin - elif os.startswith("linux") and attr.requirements_linux != None: - requirements_txt = attr.requirements_linux - elif "win" in os and attr.requirements_windows != None: - requirements_txt = attr.requirements_windows - if not requirements_txt: - fail("""\ -A requirements_lock attribute must be specified, or a platform-specific lockfile using one of the requirements_* attributes. -""") - return requirements_txt - def _pip_repository_impl(rctx): - requirements_txt = locked_requirements_label(rctx, rctx.attr) - content = rctx.read(requirements_txt) - parsed_requirements_txt = parse_requirements(content) - - packages = [(normalize_name(name), requirement) for name, requirement in parsed_requirements_txt.requirements] + requirements_by_platform = parse_requirements( + rctx, + requirements_by_platform = rctx.attr.requirements_by_platform, + requirements_linux = rctx.attr.requirements_linux, + requirements_lock = rctx.attr.requirements_lock, + requirements_osx = rctx.attr.requirements_darwin, + requirements_windows = rctx.attr.requirements_windows, + extra_pip_args = rctx.attr.extra_pip_args, + ) + selected_requirements = {} + options = None + repository_platform = host_platform(rctx.os) + for name, requirements in requirements_by_platform.items(): + r = select_requirement( + requirements, + platform = repository_platform, + ) + if not r: + continue + options = options or r.extra_pip_args + selected_requirements[name] = r.requirement_line - bzl_packages = sorted([normalize_name(name) for name, _ in parsed_requirements_txt.requirements]) + bzl_packages = sorted(selected_requirements.keys()) # Normalize cycles first requirement_cycles = { @@ -347,13 +339,6 @@ def _pip_repository_impl(rctx): rctx.file(filename, json.encode_indent(json.decode(annotation))) annotations[pkg] = "@{name}//:{filename}".format(name = rctx.attr.name, filename = filename) - tokenized_options = [] - for opt in parsed_requirements_txt.options: - for p in opt.split(" "): - tokenized_options.append(p) - - options = tokenized_options + rctx.attr.extra_pip_args - config = { "download_only": rctx.attr.download_only, "enable_implicit_namespace_pkgs": rctx.attr.enable_implicit_namespace_pkgs, @@ -419,10 +404,9 @@ def _pip_repository_impl(rctx): "%%PACKAGES%%": _format_repr_list( [ ("{}_{}".format(rctx.attr.name, p), r) - for p, r in packages + for p, r in sorted(selected_requirements.items()) ], ), - "%%REQUIREMENTS_LOCK%%": str(requirements_txt), }) return @@ -625,6 +609,15 @@ pip_repository_attrs = { "annotations": attr.string_dict( doc = "Optional annotations to apply to packages", ), + "requirements_by_platform": attr.label_keyed_string_dict( + doc = """\ +The requirements files and the comma delimited list of target platforms as values. + +The keys are the requirement files and the values are comma-separated platform +identifiers. For now we only support `_` values that are present in +`@platforms//os` and `@platforms//cpu` packages respectively. +""", + ), "requirements_darwin": attr.label( allow_single_file = True, doc = "Override the requirements_lock attribute when the host platform is Mac OS", @@ -643,6 +636,11 @@ individual repositories for each of your dependencies so that wheels are fetched/built only for the targets specified by 'build/run/test'. Note that if your lockfile is platform-dependent, you can use the `requirements_[platform]` attributes. + +Note, that in general requirements files are compiled for a specific platform, +but sometimes they can work for multiple platforms. `rules_python` right now +supports requirements files that are created for a particular platform without +platform markers. """, ), "requirements_windows": attr.label( diff --git a/python/pip_install/pip_repository_requirements.bzl.tmpl b/python/pip_install/pip_repository_requirements.bzl.tmpl index 8e17720374..07b4b08148 100644 --- a/python/pip_install/pip_repository_requirements.bzl.tmpl +++ b/python/pip_install/pip_repository_requirements.bzl.tmpl @@ -1,7 +1,6 @@ """Starlark representation of locked requirements. -@generated by rules_python pip_parse repository rule -from %%REQUIREMENTS_LOCK%% +@generated by rules_python pip_parse repository rule. """ %%IMPORTS%% diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 181175679a..45f50effb0 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -128,6 +128,17 @@ bzl_library( deps = [":parse_whl_name_bzl"], ) +bzl_library( + name = "parse_requirements_bzl", + srcs = ["parse_requirements.bzl"], + deps = [ + ":normalize_name_bzl", + ":pypi_index_sources_bzl", + ":whl_target_platforms_bzl", + "//python/pip_install:requirements_parser_bzl", + ], +) + bzl_library( name = "parse_whl_name_bzl", srcs = ["parse_whl_name.bzl"], @@ -145,6 +156,11 @@ bzl_library( ], ) +bzl_library( + name = "pypi_index_sources_bzl", + srcs = ["pypi_index_sources.bzl"], +) + bzl_library( name = "py_cc_toolchain_bzl", srcs = [ diff --git a/python/private/bzlmod/BUILD.bazel b/python/private/bzlmod/BUILD.bazel index 9edd3380bb..2eab575726 100644 --- a/python/private/bzlmod/BUILD.bazel +++ b/python/private/bzlmod/BUILD.bazel @@ -31,10 +31,10 @@ bzl_library( deps = [ ":pip_repository_bzl", "//python/pip_install:pip_repository_bzl", - "//python/pip_install:requirements_parser_bzl", "//python/private:pypi_index_bzl", "//python/private:full_version_bzl", "//python/private:normalize_name_bzl", + "//python/private:parse_requirements_bzl", "//python/private:parse_whl_name_bzl", "//python/private:version_label_bzl", ":bazel_features_bzl", diff --git a/python/private/bzlmod/pip.bzl b/python/private/bzlmod/pip.bzl index ce681259ed..80ee852573 100644 --- a/python/private/bzlmod/pip.bzl +++ b/python/private/bzlmod/pip.bzl @@ -18,16 +18,15 @@ load("@bazel_features//:features.bzl", "bazel_features") load("@pythons_hub//:interpreters.bzl", "DEFAULT_PYTHON_VERSION", "INTERPRETER_LABELS") load( "//python/pip_install:pip_repository.bzl", - "locked_requirements_label", "pip_repository_attrs", "use_isolated", "whl_library", ) -load("//python/pip_install:requirements_parser.bzl", parse_requirements = "parse") load("//python/private:auth.bzl", "AUTH_ATTRS") load("//python/private:normalize_name.bzl", "normalize_name") +load("//python/private:parse_requirements.bzl", "host_platform", "parse_requirements", "select_requirement") load("//python/private:parse_whl_name.bzl", "parse_whl_name") -load("//python/private:pypi_index.bzl", "get_simpleapi_sources", "simpleapi_download") +load("//python/private:pypi_index.bzl", "simpleapi_download") load("//python/private:render_pkg_aliases.bzl", "whl_alias") load("//python/private:version_label.bzl", "version_label") load("//python/private:whl_target_platforms.bzl", "select_whl") @@ -130,27 +129,6 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s ) major_minor = _major_minor_version(pip_attr.python_version) - requirements_lock = locked_requirements_label(module_ctx, pip_attr) - - # Parse the requirements file directly in starlark to get the information - # needed for the whl_libary declarations below. - requirements_lock_content = module_ctx.read(requirements_lock) - parse_result = parse_requirements(requirements_lock_content) - - # Replicate a surprising behavior that WORKSPACE builds allowed: - # Defining a repo with the same name multiple times, but only the last - # definition is respected. - # The requirement lines might have duplicate names because lines for extras - # are returned as just the base package name. e.g., `foo[bar]` results - # in an entry like `("foo", "foo[bar] == 1.0 ...")`. - requirements = { - normalize_name(entry[0]): entry - # The WORKSPACE pip_parse sorted entries, so mimic that ordering. - for entry in sorted(parse_result.requirements) - }.values() - - extra_pip_args = pip_attr.extra_pip_args + parse_result.options - if hub_name not in whl_map: whl_map[hub_name] = {} @@ -180,6 +158,18 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s whl_group_mapping = {} requirement_cycles = {} + # Create a new wheel library for each of the different whls + + requirements_by_platform = parse_requirements( + module_ctx, + requirements_by_platform = pip_attr.requirements_by_platform, + requirements_linux = pip_attr.requirements_linux, + requirements_lock = pip_attr.requirements_lock, + requirements_osx = pip_attr.requirements_darwin, + requirements_windows = pip_attr.requirements_windows, + extra_pip_args = pip_attr.extra_pip_args, + ) + index_urls = {} if pip_attr.experimental_index_url: if pip_attr.download_only: @@ -191,7 +181,11 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s index_url = pip_attr.experimental_index_url, extra_index_urls = pip_attr.experimental_extra_index_urls or [], index_url_overrides = pip_attr.experimental_index_url_overrides or {}, - sources = [requirements_lock_content], + sources = list({ + req.distribution: None + for reqs in requirements_by_platform.values() + for req in reqs + }), envsubst = pip_attr.envsubst, # Auth related info netrc = pip_attr.netrc, @@ -201,8 +195,21 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s parallel_download = pip_attr.parallel_download, ) - # Create a new wheel library for each of the different whls - for whl_name, requirement_line in requirements: + repository_platform = host_platform(module_ctx.os) + for whl_name, requirements in requirements_by_platform.items(): + requirement = select_requirement( + requirements, + platform = 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 + # We are not using the "sanitized name" because the user # would need to guess what name we modified the whl name # to. @@ -218,7 +225,7 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s whl_library_args = dict( repo = pip_name, dep_template = "@{}//{{name}}:{{target}}".format(hub_name), - requirement = requirement_line, + requirement = requirement.requirement_line, ) maybe_args = dict( # The following values are safe to omit if they have false like values @@ -228,7 +235,7 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s environment = pip_attr.environment, envsubst = pip_attr.envsubst, experimental_target_platforms = pip_attr.experimental_target_platforms, - extra_pip_args = extra_pip_args, + extra_pip_args = requirement.extra_pip_args, group_deps = group_deps, group_name = group_name, pip_data_exclude = pip_attr.pip_data_exclude, @@ -249,11 +256,9 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s whl_library_args.update({k: v for k, (v, default) in maybe_args_with_default.items() if v == default}) if index_urls: - srcs = get_simpleapi_sources(requirement_line) - whls = [] sdist = None - for sha256 in srcs.shas: + for sha256 in requirement.srcs.shas: # For now if the artifact is marked as yanked we just ignore it. # # See https://packaging.python.org/en/latest/specifications/simple-repository-api/#adding-yank-support-to-the-simple-api @@ -279,12 +284,11 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s # Older python versions have wheels for the `*m` ABI. "cp" + major_minor.replace(".", "") + "m", ], - want_os = module_ctx.os.name, - want_cpu = module_ctx.os.arch, + want_platform = repository_platform, ) or sdist if distribution: - whl_library_args["requirement"] = srcs.requirement + 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 @@ -299,7 +303,7 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s # This is no-op because pip is not used to download the wheel. whl_library_args.pop("download_only", None) else: - print("WARNING: falling back to pip for installing the right file for {}".format(requirement_line)) # buildifier: disable=print + print("WARNING: falling back to pip for installing the right file for {}".format(requirement.requirement_line)) # buildifier: disable=print # 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. diff --git a/python/private/normalize_platform.bzl b/python/private/normalize_platform.bzl new file mode 100644 index 0000000000..633062f399 --- /dev/null +++ b/python/private/normalize_platform.bzl @@ -0,0 +1,13 @@ +# 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. diff --git a/python/private/parse_requirements.bzl b/python/private/parse_requirements.bzl new file mode 100644 index 0000000000..f9d7a05386 --- /dev/null +++ b/python/private/parse_requirements.bzl @@ -0,0 +1,374 @@ +# 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. + +"""Requirements parsing for whl_library creation. + +Use cases that the code needs to cover: +* A single requirements_lock file that is used for the host platform. +* Per-OS requirements_lock files that are used for the host platform. +* A target platform specific requirements_lock that is used with extra + pip arguments with --platform, etc and download_only = True. + +In the last case only a single `requirements_lock` file is allowed, in all +other cases we assume that there may be a desire to resolve the requirements +file for the host platform to be backwards compatible with the legacy +behavior. +""" + +load("//python/pip_install:requirements_parser.bzl", "parse") +load(":normalize_name.bzl", "normalize_name") +load(":pypi_index_sources.bzl", "get_simpleapi_sources") +load(":whl_target_platforms.bzl", "whl_target_platforms") + +# This includes the vendored _translate_cpu and _translate_os from +# @platforms//host:extension.bzl at version 0.0.9 so that we don't +# force the users to depend on it. + +def _translate_cpu(arch): + if arch in ["i386", "i486", "i586", "i686", "i786", "x86"]: + return "x86_32" + if arch in ["amd64", "x86_64", "x64"]: + return "x86_64" + if arch in ["ppc", "ppc64", "ppc64le"]: + return "ppc" + if arch in ["arm", "armv7l"]: + return "arm" + if arch in ["aarch64"]: + return "aarch64" + if arch in ["s390x", "s390"]: + return "s390x" + if arch in ["mips64el", "mips64"]: + return "mips64" + if arch in ["riscv64"]: + return "riscv64" + return arch + +def _translate_os(os): + if os.startswith("mac os"): + return "osx" + if os.startswith("freebsd"): + return "freebsd" + if os.startswith("openbsd"): + return "openbsd" + if os.startswith("linux"): + return "linux" + if os.startswith("windows"): + return "windows" + return os + +# TODO @aignas 2024-05-13: consider using the same platform tags as are used in +# the //python:versions.bzl +DEFAULT_PLATFORMS = [ + "linux_aarch64", + "linux_arm", + "linux_ppc", + "linux_s390x", + "linux_x86_64", + "osx_aarch64", + "osx_x86_64", + "windows_x86_64", +] + +def _default_platforms(*, filter): + if not filter: + fail("Must specific a filter string, got: {}".format(filter)) + + sanitized = filter.replace("*", "").replace("_", "") + if sanitized and not sanitized.isalnum(): + fail("The platform filter can only contain '*', '_' and alphanumerics") + + if "*" in filter: + prefix = filter.rstrip("*") + if "*" in prefix: + fail("The filter can only contain '*' at the end of it") + + if not prefix: + return DEFAULT_PLATFORMS + + return [p for p in DEFAULT_PLATFORMS if p.startswith(prefix)] + else: + return [p for p in DEFAULT_PLATFORMS if filter in p] + +def _platforms_from_args(extra_pip_args): + platform_values = [] + + for arg in extra_pip_args: + if platform_values and platform_values[-1] == "": + platform_values[-1] = arg + continue + + if arg == "--platform": + platform_values.append("") + continue + + if not arg.startswith("--platform"): + continue + + _, _, plat = arg.partition("=") + if not plat: + _, _, plat = arg.partition(" ") + if plat: + platform_values.append(plat) + else: + platform_values.append("") + + if not platform_values: + return [] + + platforms = { + p.target_platform: None + for arg in platform_values + for p in whl_target_platforms(arg) + } + return list(platforms.keys()) + +def parse_requirements( + ctx, + *, + requirements_by_platform = {}, + requirements_osx = None, + requirements_linux = None, + requirements_lock = None, + requirements_windows = None, + extra_pip_args = [], + fail_fn = fail): + """Get the requirements with platforms that the requirements apply to. + + Args: + ctx: A context that has .read function that would read contents from a label. + requirements_by_platform (label_keyed_string_dict): a way to have + different package versions (or different packages) for different + os, arch combinations. + requirements_osx (label): The requirements file for the osx OS. + requirements_linux (label): The requirements file for the linux OS. + requirements_lock (label): The requirements file for all OSes, or used as a fallback. + requirements_windows (label): The requirements file for windows OS. + extra_pip_args (string list): Extra pip arguments to perform extra validations and to + be joined with args fined in files. + fail_fn (Callable[[str], None]): A failure function used in testing failure cases. + + Returns: + A tuple where the first element a dict of dicts where the first key is + the normalized distribution name (with underscores) and the second key + is the requirement_line, then value and the keys are structs with the + following attributes: + * distribution: The non-normalized distribution name. + * srcs: The Simple API downloadable source list. + * requirement_line: The original requirement line. + * target_platforms: The list of target platforms that this package is for. + + The second element is extra_pip_args should be passed to `whl_library`. + """ + if not ( + requirements_lock or + requirements_linux or + requirements_osx or + requirements_windows or + requirements_by_platform + ): + fail_fn( + "A 'requirements_lock' attribute must be specified, a platform-specific lockfiles " + + "via 'requirements_by_platform' or an os-specific lockfiles must be specified " + + "via 'requirements_*' attributes", + ) + return None + + platforms = _platforms_from_args(extra_pip_args) + + if platforms: + lock_files = [ + f + for f in [ + requirements_lock, + requirements_linux, + requirements_osx, + requirements_windows, + ] + list(requirements_by_platform.keys()) + if f + ] + + if len(lock_files) > 1: + # If the --platform argument is used, check that we are using + # a single `requirements_lock` file instead of the OS specific ones as that is + # the only correct way to use the API. + fail_fn("only a single 'requirements_lock' file can be used when using '--platform' pip argument, consider specifying it via 'requirements_lock' attribute") + return None + + files_by_platform = [ + (lock_files[0], platforms), + ] + else: + files_by_platform = { + file: [ + platform + for filter_or_platform in specifier.split(",") + for platform in (_default_platforms(filter = filter_or_platform) if filter_or_platform.endswith("*") else [filter_or_platform]) + ] + for file, specifier in requirements_by_platform.items() + }.items() + + for f in [ + # If the users need a greater span of the platforms, they should consider + # using the 'requirements_by_platform' attribute. + (requirements_linux, _default_platforms(filter = "linux_*")), + (requirements_osx, _default_platforms(filter = "osx_*")), + (requirements_windows, _default_platforms(filter = "windows_*")), + (requirements_lock, None), + ]: + if f[0]: + files_by_platform.append(f) + + configured_platforms = {} + + options = {} + requirements = {} + for file, plats in files_by_platform: + if plats: + for p in plats: + if p in configured_platforms: + fail_fn( + "Expected the platform '{}' to be map only to a single requirements file, but got multiple: '{}', '{}'".format( + p, + configured_platforms[p], + file, + ), + ) + return None + configured_platforms[p] = file + else: + plats = [ + p + for p in DEFAULT_PLATFORMS + if p not in configured_platforms + ] + + contents = ctx.read(file) + + # Parse the requirements file directly in starlark to get the information + # needed for the whl_libary declarations later. + parse_result = parse(contents) + + # Replicate a surprising behavior that WORKSPACE builds allowed: + # Defining a repo with the same name multiple times, but only the last + # definition is respected. + # The requirement lines might have duplicate names because lines for extras + # 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 + for entry in sorted( + parse_result.requirements, + # Get the longest match and fallback to original WORKSPACE sorting, + # which should get us the entry with most extras. + # + # FIXME @aignas 2024-05-13: The correct behaviour might be to get an + # entry with all aggregated extras, but it is unclear if we + # should do this now. + key = lambda x: (len(x[1].partition("==")[0]), x), + ) + }.values() + + tokenized_options = [] + for opt in parse_result.options: + for p in opt.split(" "): + tokenized_options.append(p) + + pip_args = tokenized_options + extra_pip_args + for p in plats: + requirements[p] = requirements_dict + options[p] = pip_args + + requirements_by_platform = {} + for target_platform, reqs_ in requirements.items(): + extra_pip_args = options[target_platform] + + for distribution, requirement_line in reqs_: + for_whl = requirements_by_platform.setdefault( + normalize_name(distribution), + {}, + ) + + for_req = for_whl.setdefault( + (requirement_line, ",".join(extra_pip_args)), + struct( + distribution = distribution, + srcs = get_simpleapi_sources(requirement_line), + requirement_line = requirement_line, + target_platforms = [], + extra_pip_args = extra_pip_args, + download = len(platforms) > 0, + ), + ) + for_req.target_platforms.append(target_platform) + + return { + whl_name: [ + struct( + distribution = r.distribution, + srcs = r.srcs, + requirement_line = r.requirement_line, + target_platforms = sorted(r.target_platforms), + extra_pip_args = r.extra_pip_args, + download = r.download, + ) + for r in sorted(reqs.values(), key = lambda r: r.requirement_line) + ] + for whl_name, reqs in requirements_by_platform.items() + } + +def select_requirement(requirements, *, platform): + """A simple function to get a requirement for a particular platform. + + Args: + requirements (list[struct]): The list of requirements as returned by + the `parse_requirements` function above. + platform (str): The host platform. Usually an output of the + `host_platform` function. + + Returns: + None if not found or a struct returned as one of the values in the + parse_requirements function. The requirement that should be downloaded + by the host platform will be returned. + """ + maybe_requirement = [ + req + for req in requirements + if platform in req.target_platforms or req.download + ] + if not maybe_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. + return None + + return maybe_requirement[0] + +def host_platform(repository_os): + """Return a string representation of the repository OS. + + Args: + repository_os (struct): The `module_ctx.os` or `repository_ctx.os` attribute. + See https://bazel.build/rules/lib/builtins/repository_os.html + + Returns: + The string representation of the platform that we can later used in the `pip` + machinery. + """ + return "{}_{}".format( + _translate_os(repository_os.name.lower()), + _translate_cpu(repository_os.arch.lower()), + ) diff --git a/python/private/pypi_index.bzl b/python/private/pypi_index.bzl index 28f1007b48..64d908e32b 100644 --- a/python/private/pypi_index.bzl +++ b/python/private/pypi_index.bzl @@ -17,8 +17,6 @@ A file that houses private functions used in the `bzlmod` extension with the sam """ load("@bazel_features//:features.bzl", "bazel_features") -load("@bazel_skylib//lib:sets.bzl", "sets") -load("//python/pip_install:requirements_parser.bzl", parse_requirements = "parse") load(":auth.bzl", "get_auth") load(":envsubst.bzl", "envsubst") load(":normalize_name.bzl", "normalize_name") @@ -68,7 +66,7 @@ def simpleapi_download(ctx, *, attr, cache, parallel_download = True): async_downloads = {} contents = {} index_urls = [attr.index_url] + attr.extra_index_urls - for pkg in get_packages_from_requirements(attr.sources): + for pkg in attr.sources: pkg_normalized = normalize_name(pkg) success = False @@ -204,62 +202,6 @@ def _read_index_result(ctx, result, output, url, cache, cache_key): else: return struct(success = False) -def get_packages_from_requirements(requirements_files): - """Get Simple API sources from a list of requirements files and merge them. - - Args: - requirements_files(list[str]): A list of requirements files contents. - - Returns: - A list. - """ - want_packages = sets.make() - for contents in requirements_files: - parse_result = parse_requirements(contents) - for distribution, _ in parse_result.requirements: - # NOTE: we'll be querying the PyPI servers multiple times if the - # requirements contains non-normalized names, but this is what user - # is specifying to us. - sets.insert(want_packages, distribution) - - return sets.to_list(want_packages) - -def get_simpleapi_sources(line): - """Get PyPI sources from a requirements.txt line. - - We interpret the spec described in - https://pip.pypa.io/en/stable/reference/requirement-specifiers/#requirement-specifiers - - Args: - line(str): The requirements.txt entry. - - Returns: - A struct with shas attribute containing a list of shas to download from pypi_index. - """ - head, _, maybe_hashes = line.partition(";") - _, _, version = head.partition("==") - version = version.partition(" ")[0].strip() - - if "@" in head: - shas = [] - else: - maybe_hashes = maybe_hashes or line - shas = [ - sha.strip() - for sha in maybe_hashes.split("--hash=sha256:")[1:] - ] - - if head == line: - head = line.partition("--hash=")[0].strip() - else: - head = head + ";" + maybe_hashes.partition("--hash=")[0].strip() - - return struct( - requirement = line if not shas else head, - version = version, - shas = sorted(shas), - ) - def parse_simple_api_html(*, url, content): """Get the package URLs for given shas by parsing the Simple API HTML. diff --git a/python/private/pypi_index_sources.bzl b/python/private/pypi_index_sources.bzl new file mode 100644 index 0000000000..470a8c9f5a --- /dev/null +++ b/python/private/pypi_index_sources.bzl @@ -0,0 +1,53 @@ +# 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 file that houses private functions used in the `bzlmod` extension with the same name. +""" + +def get_simpleapi_sources(line): + """Get PyPI sources from a requirements.txt line. + + We interpret the spec described in + https://pip.pypa.io/en/stable/reference/requirement-specifiers/#requirement-specifiers + + Args: + line(str): The requirements.txt entry. + + Returns: + A struct with shas attribute containing a list of shas to download from pypi_index. + """ + head, _, maybe_hashes = line.partition(";") + _, _, version = head.partition("==") + version = version.partition(" ")[0].strip() + + if "@" in head: + shas = [] + else: + maybe_hashes = maybe_hashes or line + shas = [ + sha.strip() + for sha in maybe_hashes.split("--hash=sha256:")[1:] + ] + + if head == line: + head = line.partition("--hash=")[0].strip() + else: + head = head + ";" + maybe_hashes.partition("--hash=")[0].strip() + + return struct( + requirement = line if not shas else head, + version = version, + shas = sorted(shas), + ) diff --git a/python/private/whl_target_platforms.bzl b/python/private/whl_target_platforms.bzl index 4e17f2b4c7..14e178a66b 100644 --- a/python/private/whl_target_platforms.bzl +++ b/python/private/whl_target_platforms.bzl @@ -33,39 +33,6 @@ _LEGACY_ALIASES = { "manylinux2014_x86_64": "manylinux_2_17_x86_64", } -# _translate_cpu and _translate_os from @platforms//host:extension.bzl -def _translate_cpu(arch): - if arch in ["i386", "i486", "i586", "i686", "i786", "x86"]: - return "x86_32" - if arch in ["amd64", "x86_64", "x64"]: - return "x86_64" - if arch in ["ppc", "ppc64", "ppc64le"]: - return "ppc" - if arch in ["arm", "armv7l"]: - return "arm" - if arch in ["aarch64"]: - return "aarch64" - if arch in ["s390x", "s390"]: - return "s390x" - if arch in ["mips64el", "mips64"]: - return "mips64" - if arch in ["riscv64"]: - return "riscv64" - return None - -def _translate_os(os): - if os.startswith("mac os"): - return "osx" - if os.startswith("freebsd"): - return "freebsd" - if os.startswith("openbsd"): - return "openbsd" - if os.startswith("linux"): - return "linux" - if os.startswith("windows"): - return "windows" - return None - # The order of the dictionaries is to keep definitions with their aliases next to each # other _CPU_ALIASES = { @@ -151,14 +118,13 @@ def _whl_priority(value): # Windows does not have multiple wheels for the same target platform return (False, False, 0, 0) -def select_whl(*, whls, want_abis, want_os, want_cpu): +def select_whl(*, whls, want_abis, want_platform): """Select a suitable wheel from a list. Args: whls(list[struct]): A list of candidates. want_abis(list[str]): A list of ABIs that are supported. - want_os(str): The module_ctx.os.name. - want_cpu(str): The module_ctx.os.arch. + want_platform(str): The target platform. Returns: None or a struct with `url`, `sha256` and `filename` attributes for the @@ -209,10 +175,7 @@ def select_whl(*, whls, want_abis, want_os, want_cpu): target_plats[p] = sorted(platform_tags, key = _whl_priority) - want = target_plats.get("{}_{}".format( - _translate_os(want_os), - _translate_cpu(want_cpu), - )) + want = target_plats.get(want_platform) if not want: return want diff --git a/tests/private/parse_requirements/BUILD.bazel b/tests/private/parse_requirements/BUILD.bazel new file mode 100644 index 0000000000..3d7976e406 --- /dev/null +++ b/tests/private/parse_requirements/BUILD.bazel @@ -0,0 +1,3 @@ +load(":parse_requirements_tests.bzl", "parse_requirements_test_suite") + +parse_requirements_test_suite(name = "parse_requirements_tests") diff --git a/tests/private/parse_requirements/parse_requirements_tests.bzl b/tests/private/parse_requirements/parse_requirements_tests.bzl new file mode 100644 index 0000000000..0d6cd4e0e0 --- /dev/null +++ b/tests/private/parse_requirements/parse_requirements_tests.bzl @@ -0,0 +1,374 @@ +# 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:parse_requirements.bzl", "parse_requirements", "select_requirement") # buildifier: disable=bzl-visibility + +def _mock_ctx(): + testdata = { + "requirements_direct": """\ +foo[extra] @ https://some-url +""", + "requirements_linux": """\ +foo==0.0.3 --hash=sha256:deadbaaf +""", + "requirements_lock": """\ +foo[extra]==0.0.1 --hash=sha256:deadbeef +""", + "requirements_lock_dupe": """\ +foo[extra,extra_2]==0.0.1 --hash=sha256:deadbeef +foo==0.0.1 --hash=sha256:deadbeef +foo[extra]==0.0.1 --hash=sha256:deadbeef +""", + "requirements_osx": """\ +foo==0.0.3 --hash=sha256:deadbaaf +""", + "requirements_windows": """\ +foo[extra]==0.0.2 --hash=sha256:deadbeef +bar==0.0.1 --hash=sha256:deadb00f +""", + } + + return struct( + os = struct( + name = "linux", + arch = "x86_64", + ), + read = lambda x: testdata[x], + ) + +_tests = [] + +def _test_fail_no_requirements(env): + errors = [] + parse_requirements( + ctx = _mock_ctx(), + fail_fn = errors.append, + ) + env.expect.that_str(errors[0]).equals("""\ +A 'requirements_lock' attribute must be specified, a platform-specific lockfiles via 'requirements_by_platform' or an os-specific lockfiles must be specified via 'requirements_*' attributes""") + +_tests.append(_test_fail_no_requirements) + +def _test_simple(env): + got = parse_requirements( + ctx = _mock_ctx(), + requirements_lock = "requirements_lock", + ) + got_alternative = parse_requirements( + ctx = _mock_ctx(), + requirements_by_platform = { + "requirements_lock": "*", + }, + ) + env.expect.that_dict(got).contains_exactly({ + "foo": [ + struct( + distribution = "foo", + download = False, + extra_pip_args = [], + requirement_line = "foo[extra]==0.0.1 --hash=sha256:deadbeef", + srcs = struct( + requirement = "foo[extra]==0.0.1", + shas = ["deadbeef"], + version = "0.0.1", + ), + target_platforms = [ + "linux_aarch64", + "linux_arm", + "linux_ppc", + "linux_s390x", + "linux_x86_64", + "osx_aarch64", + "osx_x86_64", + "windows_x86_64", + ], + ), + ], + }) + env.expect.that_dict(got).contains_exactly(got_alternative) + env.expect.that_str( + select_requirement( + got["foo"], + platform = "linux_ppc", + ).srcs.version, + ).equals("0.0.1") + +_tests.append(_test_simple) + +def _test_dupe_requirements(env): + got = parse_requirements( + ctx = _mock_ctx(), + requirements_lock = "requirements_lock_dupe", + ) + env.expect.that_dict(got).contains_exactly({ + "foo": [ + struct( + distribution = "foo", + download = False, + extra_pip_args = [], + requirement_line = "foo[extra,extra_2]==0.0.1 --hash=sha256:deadbeef", + srcs = struct( + requirement = "foo[extra,extra_2]==0.0.1", + shas = ["deadbeef"], + version = "0.0.1", + ), + target_platforms = [ + "linux_aarch64", + "linux_arm", + "linux_ppc", + "linux_s390x", + "linux_x86_64", + "osx_aarch64", + "osx_x86_64", + "windows_x86_64", + ], + ), + ], + }) + +_tests.append(_test_dupe_requirements) + +def _test_multi_os(env): + got = parse_requirements( + ctx = _mock_ctx(), + requirements_linux = "requirements_linux", + requirements_osx = "requirements_osx", + requirements_windows = "requirements_windows", + ) + + # This is an alternative way to express the same intent + got_alternative = parse_requirements( + ctx = _mock_ctx(), + requirements_by_platform = { + "requirements_linux": "linux_*", + "requirements_osx": "osx_*", + "requirements_windows": "windows_*", + }, + ) + + env.expect.that_dict(got).contains_exactly({ + "bar": [ + struct( + distribution = "bar", + download = False, + extra_pip_args = [], + requirement_line = "bar==0.0.1 --hash=sha256:deadb00f", + srcs = struct( + requirement = "bar==0.0.1", + shas = ["deadb00f"], + version = "0.0.1", + ), + target_platforms = ["windows_x86_64"], + ), + ], + "foo": [ + struct( + distribution = "foo", + download = False, + extra_pip_args = [], + requirement_line = "foo==0.0.3 --hash=sha256:deadbaaf", + srcs = struct( + requirement = "foo==0.0.3", + shas = ["deadbaaf"], + version = "0.0.3", + ), + target_platforms = [ + "linux_aarch64", + "linux_arm", + "linux_ppc", + "linux_s390x", + "linux_x86_64", + "osx_aarch64", + "osx_x86_64", + ], + ), + struct( + distribution = "foo", + download = False, + extra_pip_args = [], + requirement_line = "foo[extra]==0.0.2 --hash=sha256:deadbeef", + srcs = struct( + requirement = "foo[extra]==0.0.2", + shas = ["deadbeef"], + version = "0.0.2", + ), + target_platforms = ["windows_x86_64"], + ), + ], + }) + env.expect.that_dict(got).contains_exactly(got_alternative) + env.expect.that_str( + select_requirement( + got["foo"], + platform = "windows_x86_64", + ).srcs.version, + ).equals("0.0.2") + +_tests.append(_test_multi_os) + +def _test_fail_duplicate_platforms(env): + errors = [] + parse_requirements( + ctx = _mock_ctx(), + requirements_by_platform = { + "requirements_linux": "linux_x86_64", + "requirements_lock": "*", + }, + fail_fn = errors.append, + ) + env.expect.that_collection(errors).has_size(1) + env.expect.that_str(",".join(errors)).equals("Expected the platform 'linux_x86_64' to be map only to a single requirements file, but got multiple: 'requirements_linux', 'requirements_lock'") + +_tests.append(_test_fail_duplicate_platforms) + +def _test_multi_os_download_only_platform(env): + got = parse_requirements( + ctx = _mock_ctx(), + requirements_lock = "requirements_linux", + extra_pip_args = [ + "--platform", + "manylinux_2_27_x86_64", + "--platform=manylinux_2_12_x86_64", + "--platform manylinux_2_5_x86_64", + ], + ) + env.expect.that_dict(got).contains_exactly({ + "foo": [ + struct( + distribution = "foo", + download = True, + extra_pip_args = [ + "--platform", + "manylinux_2_27_x86_64", + "--platform=manylinux_2_12_x86_64", + "--platform manylinux_2_5_x86_64", + ], + requirement_line = "foo==0.0.3 --hash=sha256:deadbaaf", + srcs = struct( + requirement = "foo==0.0.3", + shas = ["deadbaaf"], + version = "0.0.3", + ), + target_platforms = ["linux_x86_64"], + ), + ], + }) + env.expect.that_str( + select_requirement( + got["foo"], + platform = "windows_x86_64", + ).srcs.version, + ).equals("0.0.3") + +_tests.append(_test_multi_os_download_only_platform) + +def _test_fail_download_only_bad_attr(env): + errors = [] + parse_requirements( + ctx = _mock_ctx(), + requirements_linux = "requirements_linux", + requirements_osx = "requirements_osx", + extra_pip_args = [ + "--platform", + "manylinux_2_27_x86_64", + "--platform=manylinux_2_12_x86_64", + "--platform manylinux_2_5_x86_64", + ], + fail_fn = errors.append, + ) + env.expect.that_str(errors[0]).equals("only a single 'requirements_lock' file can be used when using '--platform' pip argument, consider specifying it via 'requirements_lock' attribute") + +_tests.append(_test_fail_download_only_bad_attr) + +def _test_os_arch_requirements_with_default(env): + got = parse_requirements( + ctx = _mock_ctx(), + requirements_by_platform = { + "requirements_direct": "linux_super_exotic", + "requirements_linux": "linux_x86_64,linux_aarch64", + }, + requirements_lock = "requirements_lock", + ) + env.expect.that_dict(got).contains_exactly({ + "foo": [ + struct( + distribution = "foo", + download = False, + extra_pip_args = [], + requirement_line = "foo==0.0.3 --hash=sha256:deadbaaf", + srcs = struct( + requirement = "foo==0.0.3", + shas = ["deadbaaf"], + version = "0.0.3", + ), + target_platforms = ["linux_aarch64", "linux_x86_64"], + ), + struct( + distribution = "foo", + download = False, + extra_pip_args = [], + requirement_line = "foo[extra] @ https://some-url", + srcs = struct( + requirement = "foo[extra] @ https://some-url", + shas = [], + version = "", + ), + target_platforms = ["linux_super_exotic"], + ), + struct( + distribution = "foo", + download = False, + extra_pip_args = [], + requirement_line = "foo[extra]==0.0.1 --hash=sha256:deadbeef", + srcs = struct( + requirement = "foo[extra]==0.0.1", + shas = ["deadbeef"], + version = "0.0.1", + ), + target_platforms = [ + "linux_arm", + "linux_ppc", + "linux_s390x", + "osx_aarch64", + "osx_x86_64", + "windows_x86_64", + ], + ), + ], + }) + env.expect.that_str( + select_requirement( + got["foo"], + platform = "windows_x86_64", + ).srcs.version, + ).equals("0.0.1") + env.expect.that_str( + select_requirement( + got["foo"], + platform = "linux_x86_64", + ).srcs.version, + ).equals("0.0.3") + +_tests.append(_test_os_arch_requirements_with_default) + +def parse_requirements_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/private/pypi_index/pypi_index_tests.bzl b/tests/private/pypi_index/pypi_index_tests.bzl index e2122b5eeb..fa381065b1 100644 --- a/tests/private/pypi_index/pypi_index_tests.bzl +++ b/tests/private/pypi_index/pypi_index_tests.bzl @@ -16,42 +16,10 @@ load("@rules_testing//lib:test_suite.bzl", "test_suite") load("@rules_testing//lib:truth.bzl", "subjects") -load("//python/private:pypi_index.bzl", "get_simpleapi_sources", "parse_simple_api_html") # buildifier: disable=bzl-visibility +load("//python/private:pypi_index.bzl", "parse_simple_api_html") # buildifier: disable=bzl-visibility _tests = [] -def _test_no_simple_api_sources(env): - inputs = [ - "foo==0.0.1", - "foo==0.0.1 @ https://someurl.org", - "foo==0.0.1 @ https://someurl.org --hash=sha256:deadbeef", - "foo==0.0.1 @ https://someurl.org; python_version < 2.7 --hash=sha256:deadbeef", - ] - for input in inputs: - got = get_simpleapi_sources(input) - env.expect.that_collection(got.shas).contains_exactly([]) - env.expect.that_str(got.version).equals("0.0.1") - -_tests.append(_test_no_simple_api_sources) - -def _test_simple_api_sources(env): - tests = { - "foo==0.0.2 --hash=sha256:deafbeef --hash=sha256:deadbeef": [ - "deadbeef", - "deafbeef", - ], - "foo[extra]==0.0.2; (python_version < 2.7 or something_else == \"@\") --hash=sha256:deafbeef --hash=sha256:deadbeef": [ - "deadbeef", - "deafbeef", - ], - } - for input, want_shas in tests.items(): - got = get_simpleapi_sources(input) - env.expect.that_collection(got.shas).contains_exactly(want_shas) - env.expect.that_str(got.version).equals("0.0.2") - -_tests.append(_test_simple_api_sources) - def _generate_html(*items): return """\ diff --git a/tests/private/pypi_index_sources/BUILD.bazel b/tests/private/pypi_index_sources/BUILD.bazel new file mode 100644 index 0000000000..212615f480 --- /dev/null +++ b/tests/private/pypi_index_sources/BUILD.bazel @@ -0,0 +1,3 @@ +load(":pypi_index_sources_tests.bzl", "pypi_index_sources_test_suite") + +pypi_index_sources_test_suite(name = "pypi_index_sources_tests") diff --git a/tests/private/pypi_index_sources/pypi_index_sources_tests.bzl b/tests/private/pypi_index_sources/pypi_index_sources_tests.bzl new file mode 100644 index 0000000000..48d790fc68 --- /dev/null +++ b/tests/private/pypi_index_sources/pypi_index_sources_tests.bzl @@ -0,0 +1,60 @@ +# 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. + +"" + +load("@rules_testing//lib:test_suite.bzl", "test_suite") +load("//python/private:pypi_index_sources.bzl", "get_simpleapi_sources") # buildifier: disable=bzl-visibility + +_tests = [] + +def _test_no_simple_api_sources(env): + inputs = [ + "foo==0.0.1", + "foo==0.0.1 @ https://someurl.org", + "foo==0.0.1 @ https://someurl.org --hash=sha256:deadbeef", + "foo==0.0.1 @ https://someurl.org; python_version < 2.7 --hash=sha256:deadbeef", + ] + for input in inputs: + got = get_simpleapi_sources(input) + env.expect.that_collection(got.shas).contains_exactly([]) + env.expect.that_str(got.version).equals("0.0.1") + +_tests.append(_test_no_simple_api_sources) + +def _test_simple_api_sources(env): + tests = { + "foo==0.0.2 --hash=sha256:deafbeef --hash=sha256:deadbeef": [ + "deadbeef", + "deafbeef", + ], + "foo[extra]==0.0.2; (python_version < 2.7 or something_else == \"@\") --hash=sha256:deafbeef --hash=sha256:deadbeef": [ + "deadbeef", + "deafbeef", + ], + } + for input, want_shas in tests.items(): + got = get_simpleapi_sources(input) + env.expect.that_collection(got.shas).contains_exactly(want_shas) + env.expect.that_str(got.version).equals("0.0.2") + +_tests.append(_test_simple_api_sources) + +def pypi_index_sources_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/private/whl_target_platforms/select_whl_tests.bzl b/tests/private/whl_target_platforms/select_whl_tests.bzl index 0d6f97d7a5..bed6d6633c 100644 --- a/tests/private/whl_target_platforms/select_whl_tests.bzl +++ b/tests/private/whl_target_platforms/select_whl_tests.bzl @@ -83,37 +83,37 @@ def _match(env, got, want_filename): _tests = [] def _test_selecting(env): - got = select_whl(whls = WHL_LIST, want_abis = ["none"], want_os = "ignored", want_cpu = "ignored") + got = select_whl(whls = WHL_LIST, want_abis = ["none"], want_platform = "ignored") _match(env, got, "pkg-0.0.1-py3-none-any.whl") - got = select_whl(whls = WHL_LIST, want_abis = ["abi3"], want_os = "ignored", want_cpu = "ignored") + got = select_whl(whls = WHL_LIST, want_abis = ["abi3"], want_platform = "ignored") _match(env, got, "pkg-0.0.1-py3-abi3-any.whl") # Check the selection failure - got = select_whl(whls = WHL_LIST, want_abis = ["cp39"], want_os = "fancy", want_cpu = "exotic") + got = select_whl(whls = WHL_LIST, want_abis = ["cp39"], want_platform = "fancy_exotic") _match(env, got, None) # Check we match the ABI and not the py version - got = select_whl(whls = WHL_LIST, want_abis = ["cp37m"], want_os = "linux", want_cpu = "amd64") + got = select_whl(whls = WHL_LIST, want_abis = ["cp37m"], want_platform = "linux_x86_64") _match(env, got, "pkg-0.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl") # Check we can select a filename with many platform tags - got = select_whl(whls = WHL_LIST, want_abis = ["cp39"], want_os = "linux", want_cpu = "i686") + got = select_whl(whls = WHL_LIST, want_abis = ["cp39"], want_platform = "linux_x86_32") _match(env, got, "pkg-0.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl") # Check that we prefer the specific wheel - got = select_whl(whls = WHL_LIST, want_abis = ["cp311"], want_os = "mac os", want_cpu = "x86_64") + got = select_whl(whls = WHL_LIST, want_abis = ["cp311"], want_platform = "osx_x86_64") _match(env, got, "pkg-0.0.1-cp311-cp311-macosx_10_9_x86_64.whl") - got = select_whl(whls = WHL_LIST, want_abis = ["cp311"], want_os = "mac os", want_cpu = "aarch64") + got = select_whl(whls = WHL_LIST, want_abis = ["cp311"], want_platform = "osx_aarch64") _match(env, got, "pkg-0.0.1-cp311-cp311-macosx_11_0_arm64.whl") # Check that we can use the universal2 if the arm wheel is not available - got = select_whl(whls = [w for w in WHL_LIST if "arm64" not in w.filename], want_abis = ["cp311"], want_os = "mac os", want_cpu = "aarch64") + got = select_whl(whls = [w for w in WHL_LIST if "arm64" not in w.filename], want_abis = ["cp311"], want_platform = "osx_aarch64") _match(env, got, "pkg-0.0.1-cp311-cp311-macosx_10_9_universal2.whl") # Check we prefer platform specific wheels - got = select_whl(whls = WHL_LIST, want_abis = ["none", "abi3", "cp39"], want_os = "linux", want_cpu = "x86_64") + got = select_whl(whls = WHL_LIST, want_abis = ["none", "abi3", "cp39"], want_platform = "linux_x86_64") _match(env, got, "pkg-0.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl") _tests.append(_test_selecting) From daf422472325a5ab3e56e8a4d1bd59699fb3280a Mon Sep 17 00:00:00 2001 From: JeffreyALaw Date: Sat, 18 May 2024 22:26:05 -0600 Subject: [PATCH 036/345] feat(toolchains): Add riscv64 linux platform to available toolchain platforms (#1907) This change adds support for the riscv64 linux platform to rules_python. It is one of two changes necessary to allow riscv64 linux platforms to bootstrap modern versions of bazel. Before this change an attempt to bootstrap bazel would fail with this error: ``` ERROR: An error occurred during the fetch of repository 'python': Traceback (most recent call last): File "/home/ubuntu/.cache/bazel/_bazel_ubuntu/c892bce6f2ccb80708b13f24cc8fb67e/external/rules_python/python/private/toolchains_repo.bzl", line 139, column 38, in _toolchain_aliases_impl host_platform = get_host_platform(os_name, arch) File "/home/ubuntu/.cache/bazel/_bazel_ubuntu/c892bce6f2ccb80708b13f24cc8fb67e/external/rules_python/python/private/toolchains_repo.bzl", line 298, column 13, in get_host_platform fail("No platform declared for host OS {} on arch {}".format(os_name, arch)) Error in fail: No platform declared for host OS linux on arch riscv64 ``` This change fixes that error. --------- Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> --- CHANGELOG.md | 2 +- python/versions.bzl | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 430c5c84f4..241dce4870 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -70,10 +70,10 @@ A brief description of the categories of changes: with `extra_pip_args = ["--platform=manylinux_2_4_x86_64"]`, that was an invalid usage previously but we were not failing the build. From now on this is explicitly disallowed. +* (toolchains) Added riscv64 platform definition for python toolchains. [precompile-docs]: /precompiling - ## [0.32.2] - 2024-05-14 [0.32.2]: https://github.com/bazelbuild/rules_python/releases/tag/0.32.2 diff --git a/python/versions.bzl b/python/versions.bzl index b4c837ee8f..08882d3ade 100644 --- a/python/versions.bzl +++ b/python/versions.bzl @@ -536,6 +536,14 @@ PLATFORMS = { # repository_ctx.execute(["uname", "-m"]).stdout.strip() arch = "ppc64le", ), + "riscv64-unknown-linux-gnu": struct( + compatible_with = [ + "@platforms//os:linux", + "@platforms//cpu:riscv64", + ], + os_name = LINUX_NAME, + arch = "riscv64", + ), "s390x-unknown-linux-gnu": struct( compatible_with = [ "@platforms//os:linux", From 1036a4d02bc7864da98e9caa96238e70695c9d1e Mon Sep 17 00:00:00 2001 From: Jason Bedard Date: Sat, 18 May 2024 21:30:23 -0700 Subject: [PATCH 037/345] fix: remove bzlmod pip.parse() annotations attribute (#1808) This change removes unused attributes from the `bzlmod` APIs cleaning up the docs and src code. --------- Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> --- CHANGELOG.md | 2 ++ python/private/bzlmod/pip.bzl | 3 +++ 2 files changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 241dce4870..af97798a2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,8 @@ A brief description of the categories of changes: also now handled correctly, stabilizing the implementation. * (gazelle) Fix Gazelle failing on Windows with "panic: runtime error: invalid memory address or nil pointer dereference" +* (bzlmod) remove `pip.parse(annotations)` attribute as it is unused and has been + replaced by whl_modifications. ### Added * (rules) Precompiling Python source at build time is available. but is diff --git a/python/private/bzlmod/pip.bzl b/python/private/bzlmod/pip.bzl index 80ee852573..aa70810549 100644 --- a/python/private/bzlmod/pip.bzl +++ b/python/private/bzlmod/pip.bzl @@ -585,6 +585,9 @@ The labels are JSON config files describing the modifications. # don't allow users to override it. attrs.pop("repo_prefix") + # annotations has been replaced with whl_modifications in bzlmod + attrs.pop("annotations") + return attrs def _whl_mod_attrs(): From 7fc79626b82d0ff3bb57584de2de9d03ddbbb3c4 Mon Sep 17 00:00:00 2001 From: hunshcn Date: Mon, 20 May 2024 12:21:52 +0800 Subject: [PATCH 038/345] feat(gazelle): pure golang helper (#1895) Remove gazelle plugin's python deps and make it hermetic. No more relying on the system interpreter. Use TreeSitter to parse Python code and use https://github.com/pypi/stdlib-list to determine whether a module is in std lib. Fixes #1825 Fixes #1599 Related #1315 --- CHANGELOG.md | 4 + gazelle/BUILD.bazel | 10 +- gazelle/MODULE.bazel | 18 ++ gazelle/WORKSPACE | 9 +- gazelle/deps.bzl | 144 ++++++++++++--- gazelle/go.mod | 8 +- gazelle/go.sum | 22 ++- gazelle/python/BUILD.bazel | 69 +++---- gazelle/python/__main__.py | 32 ---- gazelle/python/extensions.bzl | 5 + gazelle/python/file_parser.go | 201 ++++++++++++++++++++ gazelle/python/file_parser_test.go | 256 ++++++++++++++++++++++++++ gazelle/python/language.go | 1 - gazelle/python/lifecycle.go | 63 ------- gazelle/python/parse.py | 147 --------------- gazelle/python/parse_test.py | 41 ----- gazelle/python/parser.go | 114 +++--------- gazelle/python/private/BUILD.bazel | 0 gazelle/python/private/extensions.bzl | 9 + gazelle/python/python_test.go | 14 +- gazelle/python/resolve.go | 6 +- gazelle/python/std_modules.go | 89 ++------- gazelle/python/std_modules.py | 51 ----- gazelle/python/std_modules_test.go | 27 +++ 24 files changed, 748 insertions(+), 592 deletions(-) delete mode 100644 gazelle/python/__main__.py create mode 100644 gazelle/python/extensions.bzl create mode 100644 gazelle/python/file_parser.go create mode 100644 gazelle/python/file_parser_test.go delete mode 100644 gazelle/python/lifecycle.go delete mode 100644 gazelle/python/parse.py delete mode 100644 gazelle/python/parse_test.py create mode 100644 gazelle/python/private/BUILD.bazel create mode 100644 gazelle/python/private/extensions.bzl delete mode 100644 gazelle/python/std_modules.py create mode 100644 gazelle/python/std_modules_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index af97798a2b..63ece30cb1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,10 @@ A brief description of the categories of changes: marked as `reproducible` and will not include any lock file entries from now on. +* (gazelle): Remove gazelle plugin's python deps and make it hermetic. + Introduced a new Go-based helper leveraging tree-sitter for syntax analysis. + Implemented the use of `pypi/stdlib-list` for standard library module verification. + ### Fixed * (gazelle) Remove `visibility` from `NonEmptyAttr`. Now empty(have no `deps/main/srcs/imports` attr) `py_library/test/binary` rules will diff --git a/gazelle/BUILD.bazel b/gazelle/BUILD.bazel index e00c74a444..f74338d4b5 100644 --- a/gazelle/BUILD.bazel +++ b/gazelle/BUILD.bazel @@ -1,4 +1,4 @@ -load("@bazel_gazelle//:def.bzl", "DEFAULT_LANGUAGES", "gazelle", "gazelle_binary") +load("@bazel_gazelle//:def.bzl", "gazelle") # Gazelle configuration options. # See https://github.com/bazelbuild/bazel-gazelle#running-gazelle-with-bazel @@ -6,19 +6,13 @@ load("@bazel_gazelle//:def.bzl", "DEFAULT_LANGUAGES", "gazelle", "gazelle_binary # gazelle:exclude bazel-out gazelle( name = "gazelle", - gazelle = ":gazelle_binary", -) - -gazelle_binary( - name = "gazelle_binary", - languages = DEFAULT_LANGUAGES + ["//python"], ) gazelle( name = "gazelle_update_repos", args = [ "-from_file=go.mod", - "-to_macro=deps.bzl%gazelle_deps", + "-to_macro=deps.bzl%go_deps", "-prune", ], command = "update-repos", diff --git a/gazelle/MODULE.bazel b/gazelle/MODULE.bazel index 6ae7719d4b..1829d248b2 100644 --- a/gazelle/MODULE.bazel +++ b/gazelle/MODULE.bazel @@ -9,6 +9,11 @@ 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") +local_path_override( + module_name = "rules_python", + path = "..", +) + go_deps = use_extension("@bazel_gazelle//:extensions.bzl", "go_deps") go_deps.from_file(go_mod = "//:go.mod") use_repo( @@ -17,5 +22,18 @@ use_repo( "com_github_bmatcuk_doublestar_v4", "com_github_emirpasic_gods", "com_github_ghodss_yaml", + "com_github_smacker_go_tree_sitter", + "com_github_stretchr_testify", "in_gopkg_yaml_v2", + "org_golang_x_sync", +) + +python_stdlib_list = use_extension("//python:extensions.bzl", "python_stdlib_list") +use_repo( + python_stdlib_list, + "python_stdlib_list_3_10", + "python_stdlib_list_3_11", + "python_stdlib_list_3_12", + "python_stdlib_list_3_8", + "python_stdlib_list_3_9", ) diff --git a/gazelle/WORKSPACE b/gazelle/WORKSPACE index df2883fd08..d9f0645071 100644 --- a/gazelle/WORKSPACE +++ b/gazelle/WORKSPACE @@ -34,16 +34,11 @@ local_repository( path = "..", ) -load("@rules_python//python:repositories.bzl", "py_repositories", "python_register_toolchains") +load("@rules_python//python:repositories.bzl", "py_repositories") py_repositories() -python_register_toolchains( - name = "python_3_11", - python_version = "3.11", -) - load("//:deps.bzl", _py_gazelle_deps = "gazelle_deps") -# gazelle:repository_macro deps.bzl%gazelle_deps +# gazelle:repository_macro deps.bzl%go_deps _py_gazelle_deps() diff --git a/gazelle/deps.bzl b/gazelle/deps.bzl index d9d38810be..f4f4c24fc7 100644 --- a/gazelle/deps.bzl +++ b/gazelle/deps.bzl @@ -14,13 +14,54 @@ "This file managed by `bazel run //:gazelle_update_repos`" -load("@bazel_gazelle//:deps.bzl", _go_repository = "go_repository") +load( + "@bazel_gazelle//:deps.bzl", + _go_repository = "go_repository", +) +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") def go_repository(name, **kwargs): if name not in native.existing_rules(): _go_repository(name = name, **kwargs) +def python_stdlib_list_deps(): + "Fetch python stdlib list dependencies" + http_file( + name = "python_stdlib_list_3_8", + sha256 = "ee6dc367011ff298b906dbaab408940aa57086d5f8f47278f4b7523b9aa13ae3", + url = "https://raw.githubusercontent.com/pypi/stdlib-list/8cbc2067a4a0f9eee57fb541e4cd7727724b7db4/stdlib_list/lists/3.8.txt", + downloaded_file_path = "3.8.txt", + ) + http_file( + name = "python_stdlib_list_3_9", + sha256 = "a4340e5ffe2e75bb18f548028cef6e6ac15384c44ae0a776e04dd869da1d1fd7", + url = "https://raw.githubusercontent.com/pypi/stdlib-list/8cbc2067a4a0f9eee57fb541e4cd7727724b7db4/stdlib_list/lists/3.9.txt", + downloaded_file_path = "3.9.txt", + ) + http_file( + name = "python_stdlib_list_3_10", + sha256 = "0b867738b78ac98944237de2600093a1c6ef259d1810017e46f01a29f3d199e7", + url = "https://raw.githubusercontent.com/pypi/stdlib-list/8cbc2067a4a0f9eee57fb541e4cd7727724b7db4/stdlib_list/lists/3.10.txt", + downloaded_file_path = "3.10.txt", + ) + http_file( + name = "python_stdlib_list_3_11", + sha256 = "3c1dbf991b17178d6ed3772f4fa8f64302feaf9c3385fef328a0c7ab736a79b1", + url = "https://raw.githubusercontent.com/pypi/stdlib-list/8cbc2067a4a0f9eee57fb541e4cd7727724b7db4/stdlib_list/lists/3.11.txt", + downloaded_file_path = "3.11.txt", + ) + http_file( + name = "python_stdlib_list_3_12", + sha256 = "6d3d53194218b43ee1d04bf9a4f0b6a9309bb59cdcaddede7d9cfe8b6835d34a", + url = "https://raw.githubusercontent.com/pypi/stdlib-list/8cbc2067a4a0f9eee57fb541e4cd7727724b7db4/stdlib_list/lists/3.12.txt", + downloaded_file_path = "3.12.txt", + ) + def gazelle_deps(): + go_deps() + python_stdlib_list_deps() + +def go_deps(): "Fetch go dependencies" go_repository( name = "co_honnef_go_tools", @@ -28,13 +69,25 @@ def gazelle_deps(): sum = "h1:/hemPrYIhOhy8zYrNj+069zDB68us2sMGsfkFJO0iZs=", version = "v0.0.0-20190523083050-ea95bdfd59fc", ) + go_repository( + name = "com_github_bazelbuild_bazel_gazelle", + importpath = "github.com/bazelbuild/bazel-gazelle", + sum = "h1:ROyUyUHzoEdvoOs1e0haxJx1l5EjZX6AOqiKdVlaBbg=", + version = "v0.31.1", + ) go_repository( name = "com_github_bazelbuild_buildtools", build_naming_convention = "go_default_library", importpath = "github.com/bazelbuild/buildtools", - sum = "h1:jhiMzJ+8unnLRtV8rpbWBFE9pFNzIqgUTyZU5aA++w8=", - version = "v0.0.0-20221004120235-7186f635531b", + sum = "h1:HTepWP/jhtWTC1gvK0RnvKCgjh4gLqiwaOwGozAXcbw=", + version = "v0.0.0-20231103205921-433ea8554e82", + ) + go_repository( + name = "com_github_bazelbuild_rules_go", + importpath = "github.com/bazelbuild/rules_go", + sum = "h1:JzlRxsFNhlX+g4drDRPhIaU5H5LnI978wdMJ0vK4I+k=", + version = "v0.41.0", ) go_repository( @@ -80,6 +133,13 @@ def gazelle_deps(): sum = "h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI=", version = "v0.3.4", ) + go_repository( + name = "com_github_davecgh_go_spew", + importpath = "github.com/davecgh/go-spew", + sum = "h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=", + version = "v1.1.1", + ) + go_repository( name = "com_github_emirpasic_gods", importpath = "github.com/emirpasic/gods", @@ -98,6 +158,12 @@ def gazelle_deps(): sum = "h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A=", version = "v0.1.0", ) + go_repository( + name = "com_github_fsnotify_fsnotify", + importpath = "github.com/fsnotify/fsnotify", + sum = "h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=", + version = "v1.6.0", + ) go_repository( name = "com_github_ghodss_yaml", @@ -114,14 +180,14 @@ def gazelle_deps(): go_repository( name = "com_github_golang_mock", importpath = "github.com/golang/mock", - sum = "h1:G5FRp8JnTd7RQH5kemVNlMeyXQAztQ3mOWV95KxsXH8=", - version = "v1.1.1", + sum = "h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=", + version = "v1.6.0", ) go_repository( name = "com_github_golang_protobuf", importpath = "github.com/golang/protobuf", - sum = "h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM=", - version = "v1.4.3", + sum = "h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=", + version = "v1.5.2", ) go_repository( name = "com_github_google_go_cmp", @@ -129,6 +195,12 @@ def gazelle_deps(): sum = "h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=", version = "v0.5.9", ) + go_repository( + name = "com_github_pmezard_go_difflib", + importpath = "github.com/pmezard/go-difflib", + sum = "h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=", + version = "v1.0.0", + ) go_repository( name = "com_github_prometheus_client_model", @@ -136,6 +208,25 @@ def gazelle_deps(): sum = "h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM=", version = "v0.0.0-20190812154241-14fe0d1b01d4", ) + go_repository( + name = "com_github_smacker_go_tree_sitter", + importpath = "github.com/smacker/go-tree-sitter", + sum = "h1:7QZKUmQfnxncZIJGyvX8M8YeMfn8kM10j3J/2KwVTN4=", + version = "v0.0.0-20240422154435-0628b34cbf9c", + ) + go_repository( + name = "com_github_stretchr_objx", + importpath = "github.com/stretchr/objx", + sum = "h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=", + version = "v0.5.2", + ) + go_repository( + name = "com_github_stretchr_testify", + importpath = "github.com/stretchr/testify", + sum = "h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=", + version = "v1.9.0", + ) + go_repository( name = "com_github_yuin_goldmark", importpath = "github.com/yuin/goldmark", @@ -160,6 +251,13 @@ def gazelle_deps(): sum = "h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=", version = "v2.4.0", ) + go_repository( + name = "in_gopkg_yaml_v3", + importpath = "gopkg.in/yaml.v3", + sum = "h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=", + version = "v3.0.1", + ) + go_repository( name = "net_starlark_go", importpath = "go.starlark.net", @@ -181,14 +279,14 @@ def gazelle_deps(): go_repository( name = "org_golang_google_grpc", importpath = "google.golang.org/grpc", - sum = "h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg=", - version = "v1.27.0", + sum = "h1:fPVVDxY9w++VjTZsYvXWqEf9Rqar/e+9zYfxKK+W+YU=", + version = "v1.50.0", ) go_repository( name = "org_golang_google_protobuf", importpath = "google.golang.org/protobuf", - sum = "h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c=", - version = "v1.25.0", + sum = "h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=", + version = "v1.28.0", ) go_repository( name = "org_golang_x_crypto", @@ -211,14 +309,14 @@ def gazelle_deps(): go_repository( name = "org_golang_x_mod", importpath = "golang.org/x/mod", - sum = "h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=", - version = "v0.6.0-dev.0.20220419223038-86c51ed26bb4", + sum = "h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=", + version = "v0.10.0", ) go_repository( name = "org_golang_x_net", importpath = "golang.org/x/net", - sum = "h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=", - version = "v0.0.0-20220722155237-a158d28d115b", + sum = "h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=", + version = "v0.10.0", ) go_repository( name = "org_golang_x_oauth2", @@ -229,20 +327,20 @@ def gazelle_deps(): go_repository( name = "org_golang_x_sync", importpath = "golang.org/x/sync", - sum = "h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=", - version = "v0.0.0-20220722155255-886fb9371eb4", + sum = "h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=", + version = "v0.2.0", ) go_repository( name = "org_golang_x_sys", importpath = "golang.org/x/sys", - sum = "h1:k5II8e6QD8mITdi+okbbmR/cIyEbeXLBhy5Ha4nevyc=", - version = "v0.0.0-20221010170243-090e33056c14", + sum = "h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=", + version = "v0.8.0", ) go_repository( name = "org_golang_x_text", importpath = "golang.org/x/text", - sum = "h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=", - version = "v0.3.7", + sum = "h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=", + version = "v0.3.3", ) go_repository( name = "org_golang_x_tools", @@ -250,8 +348,8 @@ def gazelle_deps(): "gazelle:exclude **/testdata/**/*", ], importpath = "golang.org/x/tools", - sum = "h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=", - version = "v0.1.12", + sum = "h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo=", + version = "v0.9.1", ) go_repository( name = "org_golang_x_xerrors", diff --git a/gazelle/go.mod b/gazelle/go.mod index b9b79ac7a2..4b65e71d67 100644 --- a/gazelle/go.mod +++ b/gazelle/go.mod @@ -4,17 +4,23 @@ go 1.19 require ( github.com/bazelbuild/bazel-gazelle v0.31.1 - github.com/bazelbuild/buildtools v0.0.0-20230510134650-37bd1811516d + github.com/bazelbuild/buildtools v0.0.0-20231103205921-433ea8554e82 github.com/bazelbuild/rules_go v0.41.0 github.com/bmatcuk/doublestar/v4 v4.6.1 github.com/emirpasic/gods v1.18.1 github.com/ghodss/yaml v1.0.0 + github.com/smacker/go-tree-sitter v0.0.0-20240422154435-0628b34cbf9c + github.com/stretchr/testify v1.9.0 + golang.org/x/sync v0.2.0 gopkg.in/yaml.v2 v2.4.0 ) require ( + github.com/davecgh/go-spew v1.1.1 // indirect github.com/google/go-cmp v0.5.9 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect golang.org/x/mod v0.10.0 // indirect golang.org/x/sys v0.8.0 // indirect golang.org/x/tools v0.9.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/gazelle/go.sum b/gazelle/go.sum index fcfcb283ec..46e0127e8f 100644 --- a/gazelle/go.sum +++ b/gazelle/go.sum @@ -2,8 +2,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/bazelbuild/bazel-gazelle v0.31.1 h1:ROyUyUHzoEdvoOs1e0haxJx1l5EjZX6AOqiKdVlaBbg= github.com/bazelbuild/bazel-gazelle v0.31.1/go.mod h1:Ul0pqz50f5wxz0QNzsZ+mrEu4AVAVJZEB5xLnHgIG9c= -github.com/bazelbuild/buildtools v0.0.0-20230510134650-37bd1811516d h1:Fl1FfItZp34QIQmmDTbZXHB5XA6JfbNNfH7tRRGWvQo= -github.com/bazelbuild/buildtools v0.0.0-20230510134650-37bd1811516d/go.mod h1:689QdV3hBP7Vo9dJMmzhoYIyo/9iMhEmHkJcnaPRCbo= +github.com/bazelbuild/buildtools v0.0.0-20231103205921-433ea8554e82 h1:HTepWP/jhtWTC1gvK0RnvKCgjh4gLqiwaOwGozAXcbw= +github.com/bazelbuild/buildtools v0.0.0-20231103205921-433ea8554e82/go.mod h1:689QdV3hBP7Vo9dJMmzhoYIyo/9iMhEmHkJcnaPRCbo= github.com/bazelbuild/rules_go v0.41.0 h1:JzlRxsFNhlX+g4drDRPhIaU5H5LnI978wdMJ0vK4I+k= github.com/bazelbuild/rules_go v0.41.0/go.mod h1:TMHmtfpvyfsxaqfL9WnahCsXMWDMICTw7XeK9yVb+YU= github.com/bmatcuk/doublestar/v4 v4.6.1 h1:FH9SifrbvJhnlQpztAx++wlkk70QBf0iBWDwNy7PA4I= @@ -13,6 +13,9 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -38,7 +41,17 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/smacker/go-tree-sitter v0.0.0-20240422154435-0628b34cbf9c h1:7QZKUmQfnxncZIJGyvX8M8YeMfn8kM10j3J/2KwVTN4= +github.com/smacker/go-tree-sitter v0.0.0-20240422154435-0628b34cbf9c/go.mod h1:q99oHDsbP0xRwmn7Vmob8gbSMNyvJ83OauXPSuHQuKE= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.4/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= go.starlark.net v0.0.0-20210223155950-e043a3d3c984/go.mod h1:t3mmBBPzAVvK0L0n1drDmrQsJ8FoIx4INCqVMTr/Zo0= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -55,6 +68,8 @@ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAG golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -90,5 +105,8 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/gazelle/python/BUILD.bazel b/gazelle/python/BUILD.bazel index 4cca8b31dc..195c77623d 100644 --- a/gazelle/python/BUILD.bazel +++ b/gazelle/python/BUILD.bazel @@ -1,31 +1,31 @@ load("@bazel_gazelle//:def.bzl", "gazelle_binary") -load("@io_bazel_rules_go//go:def.bzl", "go_library") -load("@rules_python//python:defs.bzl", "py_binary", "py_test") +load("@bazel_skylib//rules:copy_file.bzl", "copy_file") +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") load(":gazelle_test.bzl", "gazelle_test") go_library( name = "python", srcs = [ "configure.go", + "file_parser.go", "fix.go", "generate.go", "kinds.go", "language.go", - "lifecycle.go", "parser.go", "resolve.go", "std_modules.go", "target.go", ], # NOTE @aignas 2023-12-03: currently gazelle does not support embedding - # generated files, but helper.zip is generated by a build rule. + # generated files, but 3.11.txt is generated by a build rule. # # You will get a benign error like when running gazelle locally: - # > 8 gazelle: .../rules_python/gazelle/python/lifecycle.go:26:3: pattern helper.zip: matched no files + # > 8 gazelle: .../rules_python/gazelle/python/std_modules.go:24:3: pattern 3.11.txt: matched no files # # See following for more info: # https://github.com/bazelbuild/bazel-gazelle/issues/1513 - embedsrcs = [":helper.zip"], # keep + embedsrcs = ["stdlib_list.txt"], # keep # TODO: use user-defined version? importpath = "github.com/bazelbuild/rules_python/gazelle/python", visibility = ["//visibility:public"], deps = [ @@ -42,35 +42,27 @@ go_library( "@com_github_emirpasic_gods//lists/singlylinkedlist", "@com_github_emirpasic_gods//sets/treeset", "@com_github_emirpasic_gods//utils", + "@com_github_smacker_go_tree_sitter//:go-tree-sitter", + "@com_github_smacker_go_tree_sitter//python", + "@org_golang_x_sync//errgroup", ], ) -py_binary( - name = "helper", - srcs = [ - "__main__.py", - "parse.py", - "std_modules.py", - ], - # This is to make sure that the current directory is added to PYTHONPATH - imports = ["."], - main = "__main__.py", - visibility = ["//visibility:public"], -) - -py_test( - name = "parse_test", - srcs = [ - "parse.py", - "parse_test.py", - ], - imports = ["."], -) - -filegroup( - name = "helper.zip", - srcs = [":helper"], - output_group = "python_zip_file", +copy_file( + name = "stdlib_list", + src = select( + { + "@rules_python//python/config_settings:is_python_3.10": "@python_stdlib_list_3_10//file", + "@rules_python//python/config_settings:is_python_3.11": "@python_stdlib_list_3_11//file", + "@rules_python//python/config_settings:is_python_3.12": "@python_stdlib_list_3_12//file", + "@rules_python//python/config_settings:is_python_3.8": "@python_stdlib_list_3_8//file", + "@rules_python//python/config_settings:is_python_3.9": "@python_stdlib_list_3_9//file", + # This is the same behaviour as previously + "//conditions:default": "@python_stdlib_list_3_11//file", + }, + ), + out = "stdlib_list.txt", + allow_symlink = True, ) # gazelle:exclude testdata/ @@ -80,7 +72,6 @@ gazelle_test( srcs = ["python_test.go"], data = [ ":gazelle_binary", - ":helper", ], test_dirs = glob( # Use this so that we don't need to manually maintain the list. @@ -109,3 +100,15 @@ filegroup( srcs = glob(["**"]), visibility = ["//:__pkg__"], ) + +go_test( + name = "default_test", + srcs = [ + "file_parser_test.go", + "std_modules_test.go", + ], + embed = [":python"], + deps = [ + "@com_github_stretchr_testify//assert", + ], +) diff --git a/gazelle/python/__main__.py b/gazelle/python/__main__.py deleted file mode 100644 index 9974c66d13..0000000000 --- a/gazelle/python/__main__.py +++ /dev/null @@ -1,32 +0,0 @@ -# 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. - -# parse.py is a long-living program that communicates over STDIN and STDOUT. -# STDIN receives parse requests, one per line. It outputs the parsed modules and -# comments from all the files from each request. - -import sys - -import parse -import std_modules - -if __name__ == "__main__": - if len(sys.argv) < 2: - sys.exit("Please provide subcommand, either parse or std_modules") - if sys.argv[1] == "parse": - sys.exit(parse.main(sys.stdin, sys.stdout)) - elif sys.argv[1] == "std_modules": - sys.exit(std_modules.main(sys.stdin, sys.stdout)) - else: - sys.exit("Unknown subcommand: " + sys.argv[1]) diff --git a/gazelle/python/extensions.bzl b/gazelle/python/extensions.bzl new file mode 100644 index 0000000000..8d339c0c7b --- /dev/null +++ b/gazelle/python/extensions.bzl @@ -0,0 +1,5 @@ +"python_stdlib_list module extension for use with bzlmod" + +load("//python/private:extensions.bzl", _python_stdlib_list = "python_stdlib_list") + +python_stdlib_list = _python_stdlib_list diff --git a/gazelle/python/file_parser.go b/gazelle/python/file_parser.go new file mode 100644 index 0000000000..a2b22c2b8f --- /dev/null +++ b/gazelle/python/file_parser.go @@ -0,0 +1,201 @@ +// 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. + +package python + +import ( + "context" + "fmt" + "os" + "path/filepath" + "strings" + + sitter "github.com/smacker/go-tree-sitter" + "github.com/smacker/go-tree-sitter/python" +) + +const ( + sitterNodeTypeString = "string" + sitterNodeTypeComment = "comment" + sitterNodeTypeIdentifier = "identifier" + sitterNodeTypeDottedName = "dotted_name" + sitterNodeTypeIfStatement = "if_statement" + sitterNodeTypeAliasedImport = "aliased_import" + sitterNodeTypeWildcardImport = "wildcard_import" + sitterNodeTypeImportStatement = "import_statement" + sitterNodeTypeComparisonOperator = "comparison_operator" + sitterNodeTypeImportFromStatement = "import_from_statement" +) + +type ParserOutput struct { + FileName string + Modules []module + Comments []comment + HasMain bool +} + +type FileParser struct { + code []byte + relFilepath string + output ParserOutput +} + +func NewFileParser() *FileParser { + return &FileParser{} +} + +func ParseCode(code []byte) (*sitter.Node, error) { + parser := sitter.NewParser() + parser.SetLanguage(python.GetLanguage()) + + tree, err := parser.ParseCtx(context.Background(), nil, code) + if err != nil { + return nil, err + } + + return tree.RootNode(), nil +} + +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 { + return false + } + child := node.Child(i) + if child.Type() == sitterNodeTypeIfStatement && + child.Child(1).Type() == sitterNodeTypeComparisonOperator && child.Child(1).Child(1).Type() == "==" { + statement := child.Child(1) + a, b := statement.Child(0), statement.Child(2) + // convert "'__main__' == __name__" to "__name__ == '__main__'" + if b.Type() == sitterNodeTypeIdentifier { + a, b = b, a + } + if a.Type() == sitterNodeTypeIdentifier && a.Content(p.code) == "__name__" && + // at github.com/smacker/go-tree-sitter@latest (after v0.0.0-20240422154435-0628b34cbf9c we used) + // "__main__" is the second child of b. But now, it isn't. + // we cannot use the latest go-tree-sitter because of the top level reference in scanner.c. + // https://github.com/smacker/go-tree-sitter/blob/04d6b33fe138a98075210f5b770482ded024dc0f/python/scanner.c#L1 + b.Type() == sitterNodeTypeString && string(p.code[b.StartByte()+1:b.EndByte()-1]) == "__main__" { + return true + } + } + } + return false +} + +func parseImportStatement(node *sitter.Node, code []byte) (module, bool) { + switch node.Type() { + case sitterNodeTypeDottedName: + return module{ + Name: node.Content(code), + LineNumber: node.StartPoint().Row + 1, + }, true + case sitterNodeTypeAliasedImport: + return parseImportStatement(node.Child(0), code) + case sitterNodeTypeWildcardImport: + return module{ + Name: "*", + LineNumber: node.StartPoint().Row + 1, + }, true + } + return module{}, false +} + +func (p *FileParser) parseImportStatements(node *sitter.Node) bool { + if node.Type() == sitterNodeTypeImportStatement { + for j := 1; j < int(node.ChildCount()); j++ { + m, ok := parseImportStatement(node.Child(j), p.code) + if !ok { + continue + } + m.Filepath = p.relFilepath + if strings.HasPrefix(m.Name, ".") { + continue + } + p.output.Modules = append(p.output.Modules, m) + } + } else if node.Type() == sitterNodeTypeImportFromStatement { + from := node.Child(1).Content(p.code) + if strings.HasPrefix(from, ".") { + return true + } + for j := 3; j < int(node.ChildCount()); j++ { + m, ok := parseImportStatement(node.Child(j), p.code) + if !ok { + continue + } + m.Filepath = p.relFilepath + m.From = from + m.Name = fmt.Sprintf("%s.%s", from, m.Name) + p.output.Modules = append(p.output.Modules, m) + } + } else { + return false + } + return true +} + +func (p *FileParser) parseComments(node *sitter.Node) bool { + if node.Type() == sitterNodeTypeComment { + p.output.Comments = append(p.output.Comments, comment(node.Content(p.code))) + return true + } + return false +} + +func (p *FileParser) SetCodeAndFile(code []byte, relPackagePath, filename string) { + p.code = code + p.relFilepath = filepath.Join(relPackagePath, filename) + p.output.FileName = filename +} + +func (p *FileParser) parse(ctx context.Context, node *sitter.Node) { + if node == nil { + return + } + for i := 0; i < int(node.ChildCount()); i++ { + if err := ctx.Err(); err != nil { + return + } + child := node.Child(i) + if p.parseImportStatements(child) { + continue + } + if p.parseComments(child) { + continue + } + p.parse(ctx, child) + } +} + +func (p *FileParser) Parse(ctx context.Context) (*ParserOutput, error) { + rootNode, err := ParseCode(p.code) + if err != nil { + return nil, err + } + + p.output.HasMain = p.parseMain(ctx, rootNode) + + p.parse(ctx, rootNode) + return &p.output, nil +} + +func (p *FileParser) ParseFile(ctx context.Context, repoRoot, relPackagePath, filename string) (*ParserOutput, error) { + code, err := os.ReadFile(filepath.Join(repoRoot, relPackagePath, filename)) + if err != nil { + return nil, err + } + p.SetCodeAndFile(code, relPackagePath, filename) + return p.Parse(ctx) +} diff --git a/gazelle/python/file_parser_test.go b/gazelle/python/file_parser_test.go new file mode 100644 index 0000000000..3682cff753 --- /dev/null +++ b/gazelle/python/file_parser_test.go @@ -0,0 +1,256 @@ +// 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. + +package python + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestParseImportStatements(t *testing.T) { + t.Parallel() + units := []struct { + name string + code string + filepath string + result []module + }{ + { + name: "not has import", + code: "a = 1\nb = 2", + filepath: "", + result: nil, + }, + { + name: "has import", + code: "import unittest\nimport os.path\nfrom foo.bar import abc.xyz", + filepath: "abc.py", + result: []module{ + { + Name: "unittest", + LineNumber: 1, + Filepath: "abc.py", + From: "", + }, + { + Name: "os.path", + LineNumber: 2, + Filepath: "abc.py", + From: "", + }, + { + Name: "foo.bar.abc.xyz", + LineNumber: 3, + Filepath: "abc.py", + From: "foo.bar", + }, + }, + }, + { + name: "has import in def", + code: `def foo(): + import unittest +`, + filepath: "abc.py", + result: []module{ + { + Name: "unittest", + LineNumber: 2, + Filepath: "abc.py", + From: "", + }, + }, + }, + { + name: "invalid syntax", + code: "import os\nimport", + filepath: "abc.py", + result: []module{ + { + Name: "os", + LineNumber: 1, + Filepath: "abc.py", + From: "", + }, + }, + }, + { + name: "import as", + code: "import os as b\nfrom foo import bar as c# 123", + filepath: "abc.py", + result: []module{ + { + Name: "os", + LineNumber: 1, + Filepath: "abc.py", + From: "", + }, + { + Name: "foo.bar", + LineNumber: 2, + Filepath: "abc.py", + From: "foo", + }, + }, + }, + // align to https://docs.python.org/3/reference/simple_stmts.html#index-34 + { + name: "complex import", + code: "from unittest import *\nfrom foo import (bar as c, baz, qux as d)\nfrom . import abc", + result: []module{ + { + Name: "unittest.*", + LineNumber: 1, + From: "unittest", + }, + { + Name: "foo.bar", + LineNumber: 2, + From: "foo", + }, + { + Name: "foo.baz", + LineNumber: 2, + From: "foo", + }, + { + Name: "foo.qux", + LineNumber: 2, + From: "foo", + }, + }, + }, + } + for _, u := range units { + t.Run(u.name, func(t *testing.T) { + p := NewFileParser() + code := []byte(u.code) + p.SetCodeAndFile(code, "", u.filepath) + output, err := p.Parse(context.Background()) + assert.NoError(t, err) + assert.Equal(t, u.result, output.Modules) + }) + } +} + +func TestParseComments(t *testing.T) { + t.Parallel() + units := []struct { + name string + code string + result []comment + }{ + { + name: "not has comment", + code: "a = 1\nb = 2", + result: nil, + }, + { + name: "has comment", + code: "# a = 1\n# b = 2", + result: []comment{"# a = 1", "# b = 2"}, + }, + { + name: "has comment in if", + code: "if True:\n # a = 1\n # b = 2", + result: []comment{"# a = 1", "# b = 2"}, + }, + { + name: "has comment inline", + code: "import os# 123\nfrom pathlib import Path as b#456", + result: []comment{"# 123", "#456"}, + }, + } + for _, u := range units { + t.Run(u.name, func(t *testing.T) { + p := NewFileParser() + code := []byte(u.code) + p.SetCodeAndFile(code, "", "") + output, err := p.Parse(context.Background()) + assert.NoError(t, err) + assert.Equal(t, u.result, output.Comments) + }) + } +} + +func TestParseMain(t *testing.T) { + t.Parallel() + units := []struct { + name string + code string + result bool + }{ + { + name: "not has main", + code: "a = 1\nb = 2", + result: false, + }, + { + name: "has main in function", + code: `def foo(): + if __name__ == "__main__": + a = 3 +`, + result: false, + }, + { + name: "has main", + code: ` +import unittest + +from lib import main + + +class ExampleTest(unittest.TestCase): + def test_main(self): + self.assertEqual( + "", + main([["A", 1], ["B", 2]]), + ) + + +if __name__ == "__main__": + unittest.main() +`, + result: true, + }, + } + for _, u := range units { + t.Run(u.name, func(t *testing.T) { + p := NewFileParser() + code := []byte(u.code) + p.SetCodeAndFile(code, "", "") + output, err := p.Parse(context.Background()) + assert.NoError(t, err) + assert.Equal(t, u.result, output.HasMain) + }) + } +} + +func TestParseFull(t *testing.T) { + p := NewFileParser() + code := []byte(`from bar import abc`) + p.SetCodeAndFile(code, "foo", "a.py") + output, err := p.Parse(context.Background()) + assert.NoError(t, err) + assert.Equal(t, ParserOutput{ + Modules: []module{{Name: "bar.abc", LineNumber: 1, Filepath: "foo/a.py", From: "bar"}}, + Comments: nil, + HasMain: false, + FileName: "a.py", + }, *output) +} diff --git a/gazelle/python/language.go b/gazelle/python/language.go index 568ac9225c..56eb97b043 100644 --- a/gazelle/python/language.go +++ b/gazelle/python/language.go @@ -23,7 +23,6 @@ import ( type Python struct { Configurer Resolver - LifeCycleManager } // NewLanguage initializes a new Python that satisfies the language.Language diff --git a/gazelle/python/lifecycle.go b/gazelle/python/lifecycle.go deleted file mode 100644 index 6d628e9137..0000000000 --- a/gazelle/python/lifecycle.go +++ /dev/null @@ -1,63 +0,0 @@ -// 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. - -package python - -import ( - "context" - _ "embed" - "github.com/bazelbuild/bazel-gazelle/language" - "log" - "os" -) - -var ( - //go:embed helper.zip - helperZip []byte - helperPath string -) - -type LifeCycleManager struct { - language.BaseLifecycleManager - pyzFilePath string -} - -func (l *LifeCycleManager) Before(ctx context.Context) { - helperPath = os.Getenv("GAZELLE_PYTHON_HELPER") - if helperPath == "" { - pyzFile, err := os.CreateTemp("", "python_zip_") - if err != nil { - log.Fatalf("failed to write parser zip: %v", err) - } - defer pyzFile.Close() - helperPath = pyzFile.Name() - l.pyzFilePath = helperPath - if _, err := pyzFile.Write(helperZip); err != nil { - log.Fatalf("cannot write %q: %v", helperPath, err) - } - } - startParserProcess(ctx) - startStdModuleProcess(ctx) -} - -func (l *LifeCycleManager) DoneGeneratingRules() { - shutdownParserProcess() -} - -func (l *LifeCycleManager) AfterResolvingDeps(ctx context.Context) { - shutdownStdModuleProcess() - if l.pyzFilePath != "" { - os.Remove(l.pyzFilePath) - } -} diff --git a/gazelle/python/parse.py b/gazelle/python/parse.py deleted file mode 100644 index ea331bc23a..0000000000 --- a/gazelle/python/parse.py +++ /dev/null @@ -1,147 +0,0 @@ -# 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. - -# parse.py is a long-living program that communicates over STDIN and STDOUT. -# STDIN receives parse requests, one per line. It outputs the parsed modules and -# comments from all the files from each request. - -import ast -import concurrent.futures -import json -import os -import platform -import sys -from io import BytesIO -from tokenize import COMMENT, NAME, OP, STRING, tokenize - - -def parse_import_statements(content, filepath): - modules = list() - tree = ast.parse(content, filename=filepath) - for node in ast.walk(tree): - if isinstance(node, ast.Import): - for subnode in node.names: - module = { - "name": subnode.name, - "lineno": node.lineno, - "filepath": filepath, - "from": "", - } - modules.append(module) - elif isinstance(node, ast.ImportFrom) and node.level == 0: - for subnode in node.names: - module = { - "name": f"{node.module}.{subnode.name}", - "lineno": node.lineno, - "filepath": filepath, - "from": node.module, - } - modules.append(module) - return modules - - -def parse_comments(content): - comments = list() - g = tokenize(BytesIO(content.encode("utf-8")).readline) - for toknum, tokval, _, _, _ in g: - if toknum == COMMENT: - comments.append(tokval) - return comments - - -def parse_main(content): - g = tokenize(BytesIO(content.encode("utf-8")).readline) - for token_type, token_val, start, _, _ in g: - if token_type != NAME or token_val != "if" or start[1] != 0: - continue - try: - token_type, token_val, start, _, _ = next(g) - if token_type != NAME or token_val != "__name__": - continue - token_type, token_val, start, _, _ = next(g) - if token_type != OP or token_val != "==": - continue - token_type, token_val, start, _, _ = next(g) - if token_type != STRING or token_val.strip("\"'") != "__main__": - continue - token_type, token_val, start, _, _ = next(g) - if token_type != OP or token_val != ":": - continue - return True - except StopIteration: - break - return False - - -def parse(repo_root, rel_package_path, filename): - rel_filepath = os.path.join(rel_package_path, filename) - abs_filepath = os.path.join(repo_root, rel_filepath) - with open(abs_filepath, "r") as file: - content = file.read() - # From simple benchmarks, 2 workers gave the best performance here. - with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor: - modules_future = executor.submit( - parse_import_statements, content, rel_filepath - ) - comments_future = executor.submit(parse_comments, content) - main_future = executor.submit(parse_main, content) - modules = modules_future.result() - comments = comments_future.result() - has_main = main_future.result() - - output = { - "filename": filename, - "modules": modules, - "comments": comments, - "has_main": has_main, - } - return output - - -def create_main_executor(): - # We cannot use ProcessPoolExecutor on macOS, because the fork start method should be considered unsafe as it can - # lead to crashes of the subprocess as macOS system libraries may start threads. Meanwhile, the 'spawn' and - # 'forkserver' start methods generally cannot be used with “frozen” executables (i.e., Python zip file) on POSIX - # systems. Therefore, there is no good way to use ProcessPoolExecutor on macOS when we distribute this program with - # a zip file. - # Ref: https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods - if platform.system() == "Darwin": - return concurrent.futures.ThreadPoolExecutor() - return concurrent.futures.ProcessPoolExecutor() - -def main(stdin, stdout): - with create_main_executor() as executor: - for parse_request in stdin: - parse_request = json.loads(parse_request) - repo_root = parse_request["repo_root"] - rel_package_path = parse_request["rel_package_path"] - filenames = parse_request["filenames"] - outputs = list() - if len(filenames) == 1: - outputs.append(parse(repo_root, rel_package_path, filenames[0])) - else: - futures = [ - executor.submit(parse, repo_root, rel_package_path, filename) - for filename in filenames - if filename != "" - ] - for future in concurrent.futures.as_completed(futures): - outputs.append(future.result()) - print(json.dumps(outputs), end="", file=stdout, flush=True) - stdout.buffer.write(bytes([0])) - stdout.flush() - - -if __name__ == "__main__": - exit(main(sys.stdin, sys.stdout)) diff --git a/gazelle/python/parse_test.py b/gazelle/python/parse_test.py deleted file mode 100644 index 6d1fa49547..0000000000 --- a/gazelle/python/parse_test.py +++ /dev/null @@ -1,41 +0,0 @@ -import unittest - -import parse - - -class TestParse(unittest.TestCase): - def test_not_has_main(self): - content = "a = 1\nb = 2" - self.assertFalse(parse.parse_main(content)) - - def test_has_main_in_function(self): - content = """ -def foo(): - if __name__ == "__main__": - a = 3 -""" - self.assertFalse(parse.parse_main(content)) - - def test_has_main(self): - content = """ -import unittest - -from lib import main - - -class ExampleTest(unittest.TestCase): - def test_main(self): - self.assertEqual( - "", - main([["A", 1], ["B", 2]]), - ) - - -if __name__ == "__main__": - unittest.main() -""" - self.assertTrue(parse.parse_main(content)) - - -if __name__ == "__main__": - unittest.main() diff --git a/gazelle/python/parser.go b/gazelle/python/parser.go index 184fad7c14..1b2a90dddf 100644 --- a/gazelle/python/parser.go +++ b/gazelle/python/parser.go @@ -15,65 +15,16 @@ package python import ( - "bufio" "context" _ "embed" - "encoding/json" "fmt" - "io" - "log" - "os" - "os/exec" "strings" - "sync" "github.com/emirpasic/gods/sets/treeset" godsutils "github.com/emirpasic/gods/utils" + "golang.org/x/sync/errgroup" ) -var ( - parserCmd *exec.Cmd - parserStdin io.WriteCloser - parserStdout io.Reader - parserMutex sync.Mutex -) - -func startParserProcess(ctx context.Context) { - // due to #691, we need a system interpreter to boostrap, part of which is - // to locate the hermetic interpreter. - parserCmd = exec.CommandContext(ctx, "python3", helperPath, "parse") - parserCmd.Stderr = os.Stderr - - stdin, err := parserCmd.StdinPipe() - if err != nil { - log.Printf("failed to initialize parser: %v\n", err) - os.Exit(1) - } - parserStdin = stdin - - stdout, err := parserCmd.StdoutPipe() - if err != nil { - log.Printf("failed to initialize parser: %v\n", err) - os.Exit(1) - } - parserStdout = stdout - - if err := parserCmd.Start(); err != nil { - log.Printf("failed to initialize parser: %v\n", err) - os.Exit(1) - } -} - -func shutdownParserProcess() { - if err := parserStdin.Close(); err != nil { - fmt.Fprintf(os.Stderr, "error closing parser: %v", err) - } - - if err := parserCmd.Wait(); err != nil { - log.Printf("failed to wait for parser: %v\n", err) - } -} - // python3Parser implements a parser for Python files that extracts the modules // as seen in the import statements. type python3Parser struct { @@ -110,36 +61,36 @@ func (p *python3Parser) parseSingle(pyFilename string) (*treeset.Set, map[string // parse parses multiple Python files and returns the extracted modules from // the import statements as well as the parsed comments. func (p *python3Parser) parse(pyFilenames *treeset.Set) (*treeset.Set, map[string]*treeset.Set, *annotations, error) { - parserMutex.Lock() - defer parserMutex.Unlock() - modules := treeset.NewWith(moduleComparator) - req := map[string]interface{}{ - "repo_root": p.repoRoot, - "rel_package_path": p.relPackagePath, - "filenames": pyFilenames.Values(), - } - encoder := json.NewEncoder(parserStdin) - if err := encoder.Encode(&req); err != nil { - return nil, nil, nil, fmt.Errorf("failed to parse: %w", err) - } - - reader := bufio.NewReader(parserStdout) - data, err := reader.ReadBytes(0) - if err != nil { - return nil, nil, nil, fmt.Errorf("failed to parse: %w", err) + g, ctx := errgroup.WithContext(context.Background()) + ch := make(chan struct{}, 6) // Limit the number of concurrent parses. + chRes := make(chan *ParserOutput, len(pyFilenames.Values())) + for _, v := range pyFilenames.Values() { + ch <- struct{}{} + g.Go(func(filename string) func() error { + return func() error { + defer func() { + <-ch + }() + res, err := NewFileParser().ParseFile(ctx, p.repoRoot, p.relPackagePath, filename) + if err != nil { + return err + } + chRes <- res + return nil + } + }(v.(string))) } - data = data[:len(data)-1] - var allRes []parserResponse - if err := json.Unmarshal(data, &allRes); err != nil { - return nil, nil, nil, fmt.Errorf("failed to parse: %w", err) + if err := g.Wait(); err != nil { + return nil, nil, nil, err } - - mainModules := make(map[string]*treeset.Set, len(allRes)) + close(ch) + close(chRes) + mainModules := make(map[string]*treeset.Set, len(chRes)) allAnnotations := new(annotations) allAnnotations.ignore = make(map[string]struct{}) - for _, res := range allRes { + for res := range chRes { if res.HasMain { mainModules[res.FileName] = treeset.NewWith(moduleComparator) } @@ -194,21 +145,6 @@ func removeDupesFromStringTreeSetSlice(array []string) []string { return dedupe } -// parserResponse represents a response returned by the parser.py for a given -// parsed Python module. -type parserResponse struct { - // FileName of the parsed module - FileName string - // The modules depended by the parsed module. - Modules []module `json:"modules"` - // The comments contained in the parsed module. This contains the - // annotations as they are comments in the Python module. - Comments []comment `json:"comments"` - // HasMain indicates whether the Python module has `if __name == "__main__"` - // at the top level - HasMain bool `json:"has_main"` -} - // module represents a fully-qualified, dot-separated, Python module as seen on // the import statement, alongside the line number where it happened. type module struct { diff --git a/gazelle/python/private/BUILD.bazel b/gazelle/python/private/BUILD.bazel new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/private/extensions.bzl b/gazelle/python/private/extensions.bzl new file mode 100644 index 0000000000..5de071361c --- /dev/null +++ b/gazelle/python/private/extensions.bzl @@ -0,0 +1,9 @@ +"python_stdlib_list module extension for use with bzlmod" + +load("@bazel_skylib//lib:modules.bzl", "modules") +load("//:deps.bzl", "python_stdlib_list_deps") + +python_stdlib_list = modules.as_extension( + python_stdlib_list_deps, + doc = "This extension registers python stdlib list dependencies.", +) diff --git a/gazelle/python/python_test.go b/gazelle/python/python_test.go index 617b3f858e..dd8c2411f1 100644 --- a/gazelle/python/python_test.go +++ b/gazelle/python/python_test.go @@ -31,7 +31,6 @@ import ( "time" "github.com/bazelbuild/bazel-gazelle/testtools" - "github.com/bazelbuild/rules_go/go/runfiles" "github.com/bazelbuild/rules_go/go/tools/bazel" "github.com/ghodss/yaml" ) @@ -42,9 +41,8 @@ const ( gazelleBinaryName = "gazelle_binary" ) -var gazellePath = mustFindGazelle() - func TestGazelleBinary(t *testing.T) { + gazellePath := mustFindGazelle() tests := map[string][]bazel.RunfileEntry{} runfiles, err := bazel.ListRunfiles() @@ -67,13 +65,12 @@ func TestGazelleBinary(t *testing.T) { if len(tests) == 0 { t.Fatal("no tests found") } - for testName, files := range tests { - testPath(t, testName, files) + testPath(t, gazellePath, testName, files) } } -func testPath(t *testing.T, name string, files []bazel.RunfileEntry) { +func testPath(t *testing.T, gazellePath, name string, files []bazel.RunfileEntry) { t.Run(name, func(t *testing.T) { t.Parallel() var inputs, goldens []testtools.FileSpec @@ -160,11 +157,6 @@ func testPath(t *testing.T, name string, files []bazel.RunfileEntry) { cmd.Stdout = &stdout cmd.Stderr = &stderr cmd.Dir = workspaceRoot - helperScript, err := runfiles.Rlocation("rules_python_gazelle_plugin/python/helper") - if err != nil { - t.Fatalf("failed to initialize Python helper: %v", err) - } - cmd.Env = append(os.Environ(), "GAZELLE_PYTHON_HELPER="+helperScript) if err := cmd.Run(); err != nil { var e *exec.ExitError if !errors.As(err, &e) { diff --git a/gazelle/python/resolve.go b/gazelle/python/resolve.go index f019a64c1a..ca306c3db8 100644 --- a/gazelle/python/resolve.go +++ b/gazelle/python/resolve.go @@ -202,11 +202,7 @@ func (py *Resolver) Resolve( matches := ix.FindRulesByImportWithConfig(c, imp, languageName) if len(matches) == 0 { // Check if the imported module is part of the standard library. - if isStd, err := isStdModule(module{Name: moduleName}); err != nil { - log.Println("Error checking if standard module: ", err) - hasFatalError = true - continue POSSIBLE_MODULE_LOOP - } else if isStd { + if isStdModule(module{Name: moduleName}) { continue MODULES_LOOP } else if cfg.ValidateImportStatements() { err := fmt.Errorf( diff --git a/gazelle/python/std_modules.go b/gazelle/python/std_modules.go index 8a016afed6..e10f87b6ea 100644 --- a/gazelle/python/std_modules.go +++ b/gazelle/python/std_modules.go @@ -16,92 +16,25 @@ package python import ( "bufio" - "context" _ "embed" - "fmt" - "io" - "log" - "os" - "os/exec" - "strconv" "strings" - "sync" ) var ( - stdModulesCmd *exec.Cmd - stdModulesStdin io.WriteCloser - stdModulesStdout io.Reader - stdModulesMutex sync.Mutex - stdModulesSeen map[string]struct{} + //go:embed stdlib_list.txt + stdlibList string + stdModules map[string]struct{} ) -func startStdModuleProcess(ctx context.Context) { - stdModulesSeen = make(map[string]struct{}) - - // due to #691, we need a system interpreter to boostrap, part of which is - // to locate the hermetic interpreter. - stdModulesCmd = exec.CommandContext(ctx, "python3", helperPath, "std_modules") - stdModulesCmd.Stderr = os.Stderr - // All userland site-packages should be ignored. - stdModulesCmd.Env = []string{"PYTHONNOUSERSITE=1"} - - stdin, err := stdModulesCmd.StdinPipe() - if err != nil { - log.Printf("failed to initialize std_modules: %v\n", err) - os.Exit(1) - } - stdModulesStdin = stdin - - stdout, err := stdModulesCmd.StdoutPipe() - if err != nil { - log.Printf("failed to initialize std_modules: %v\n", err) - os.Exit(1) - } - stdModulesStdout = stdout - - if err := stdModulesCmd.Start(); err != nil { - log.Printf("failed to initialize std_modules: %v\n", err) - os.Exit(1) - } -} - -func shutdownStdModuleProcess() { - if err := stdModulesStdin.Close(); err != nil { - fmt.Fprintf(os.Stderr, "error closing std module: %v", err) - } - - if err := stdModulesCmd.Wait(); err != nil { - log.Printf("failed to wait for std_modules: %v\n", err) +func init() { + stdModules = make(map[string]struct{}) + scanner := bufio.NewScanner(strings.NewReader(stdlibList)) + for scanner.Scan() { + stdModules[scanner.Text()] = struct{}{} } } -func isStdModule(m module) (bool, error) { - if _, seen := stdModulesSeen[m.Name]; seen { - return true, nil - } - stdModulesMutex.Lock() - defer stdModulesMutex.Unlock() - - fmt.Fprintf(stdModulesStdin, "%s\n", m.Name) - - stdoutReader := bufio.NewReader(stdModulesStdout) - line, err := stdoutReader.ReadString('\n') - if err != nil { - return false, err - } - if len(line) == 0 { - return false, fmt.Errorf("unexpected empty output from std_modules") - } - - isStd, err := strconv.ParseBool(strings.TrimSpace(line)) - if err != nil { - return false, err - } - - if isStd { - stdModulesSeen[m.Name] = struct{}{} - return true, nil - } - return false, nil +func isStdModule(m module) bool { + _, ok := stdModules[m.Name] + return ok } diff --git a/gazelle/python/std_modules.py b/gazelle/python/std_modules.py deleted file mode 100644 index 779a325508..0000000000 --- a/gazelle/python/std_modules.py +++ /dev/null @@ -1,51 +0,0 @@ -# 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. - -# std_modules.py is a long-living program that communicates over STDIN and -# STDOUT. STDIN receives module names, one per line. For each module statement -# it evaluates, it outputs true/false for whether the module is part of the -# standard library or not. - -import os -import sys -from contextlib import redirect_stdout - - -def is_std_modules(module): - # If for some reason a module (such as pygame, see https://github.com/pygame/pygame/issues/542) - # prints to stdout upon import, - # the output of this script should still be parseable by golang. - # Therefore, redirect stdout while running the import. - with redirect_stdout(os.devnull): - try: - __import__(module, globals(), locals(), [], 0) - return True - except Exception: - return False - - -def main(stdin, stdout): - for module in stdin: - module = module.strip() - # Don't print the boolean directly as it is capitalized in Python. - print( - "true" if is_std_modules(module) else "false", - end="\n", - file=stdout, - ) - stdout.flush() - - -if __name__ == "__main__": - exit(main(sys.stdin, sys.stdout)) diff --git a/gazelle/python/std_modules_test.go b/gazelle/python/std_modules_test.go new file mode 100644 index 0000000000..bc22638e69 --- /dev/null +++ b/gazelle/python/std_modules_test.go @@ -0,0 +1,27 @@ +// 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. + +package python + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestIsStdModule(t *testing.T) { + assert.True(t, isStdModule(module{Name: "unittest"})) + assert.True(t, isStdModule(module{Name: "os.path"})) + assert.False(t, isStdModule(module{Name: "foo"})) +} From 8791cbbaa2336e24555a6b577ed6e19df24d7d88 Mon Sep 17 00:00:00 2001 From: Tim Nielens <11885535+tnielens@users.noreply.github.com> Date: Mon, 20 May 2024 08:13:18 +0200 Subject: [PATCH 039/345] doc: fix doc typo in py_wheel.bzl (#1899) Fix typo in the py_wheel.bzl docs. --- python/private/py_wheel.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/private/py_wheel.bzl b/python/private/py_wheel.bzl index 2aed9b9d9b..ef9e6f24ae 100644 --- a/python/private/py_wheel.bzl +++ b/python/private/py_wheel.bzl @@ -39,7 +39,7 @@ _distribution_attrs = { doc = """\ Name of the distribution. -This should match the project name onm PyPI. It's also the name that is used to +This should match the project name on PyPI. It's also the name that is used to refer to the package in other packages' dependencies. Workspace status keys are expanded using `{NAME}` format, for example: From 730a2e39bd2702910f28629d4583b3ec49f4ee5e Mon Sep 17 00:00:00 2001 From: Laurenz Date: Tue, 21 May 2024 01:10:12 +0200 Subject: [PATCH 040/345] feat: add whl_filegroup (#1904) This adds a `whl_filegroup` rule which can take a wheel as input and extract it, making the output available to consumers. A pattern is allowed to better control what files are extracted. This is handy to, e.g. get the numpy headers from the numpy wheel so they can be used in a cc_library. e.g., Closes #1903 Fixes #1311 --- CHANGELOG.md | 3 + python/BUILD.bazel | 1 + python/pip.bzl | 2 + .../tools/wheel_installer/wheel.py | 2 +- python/private/BUILD.bazel | 1 + python/private/whl_filegroup/BUILD.bazel | 20 ++++++ .../whl_filegroup/extract_wheel_files.py | 62 +++++++++++++++++ .../private/whl_filegroup/whl_filegroup.bzl | 57 +++++++++++++++ tests/whl_filegroup/BUILD.bazel | 69 +++++++++++++++++++ .../whl_filegroup/extract_wheel_files_test.py | 63 +++++++++++++++++ tests/whl_filegroup/whl_filegroup_tests.bzl | 34 +++++++++ tests/whl_filegroup/whl_headers_test.c | 5 ++ 12 files changed, 318 insertions(+), 1 deletion(-) create mode 100644 python/private/whl_filegroup/BUILD.bazel create mode 100644 python/private/whl_filegroup/extract_wheel_files.py create mode 100644 python/private/whl_filegroup/whl_filegroup.bzl create mode 100644 tests/whl_filegroup/BUILD.bazel create mode 100644 tests/whl_filegroup/extract_wheel_files_test.py create mode 100644 tests/whl_filegroup/whl_filegroup_tests.bzl create mode 100644 tests/whl_filegroup/whl_headers_test.c diff --git a/CHANGELOG.md b/CHANGELOG.md index 63ece30cb1..cc5ba4d3b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -80,6 +80,9 @@ A brief description of the categories of changes: [precompile-docs]: /precompiling +* (whl_filegroup) Added a new `whl_filegroup` rule to extract files from a wheel file. + This is useful to extract headers for use in a `cc_library`. + ## [0.32.2] - 2024-05-14 [0.32.2]: https://github.com/bazelbuild/rules_python/releases/tag/0.32.2 diff --git a/python/BUILD.bazel b/python/BUILD.bazel index 51404701a5..3ab390df8a 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -101,6 +101,7 @@ bzl_library( "//python/private:bzlmod_enabled_bzl", "//python/private:full_version_bzl", "//python/private:render_pkg_aliases_bzl", + "//python/private/whl_filegroup:whl_filegroup_bzl", ], ) diff --git a/python/pip.bzl b/python/pip.bzl index aeedf57553..c7cdbb2cc5 100644 --- a/python/pip.bzl +++ b/python/pip.bzl @@ -25,10 +25,12 @@ load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") load("//python/private:full_version.bzl", "full_version") load("//python/private:normalize_name.bzl", "normalize_name") load("//python/private:render_pkg_aliases.bzl", "NO_MATCH_ERROR_MESSAGE_TEMPLATE") +load("//python/private/whl_filegroup:whl_filegroup.bzl", _whl_filegroup = "whl_filegroup") compile_pip_requirements = _compile_pip_requirements package_annotation = _package_annotation pip_parse = pip_repository +whl_filegroup = _whl_filegroup def _multi_pip_parse_impl(rctx): rules_python = rctx.attr._rules_python_workspace.workspace_name diff --git a/python/pip_install/tools/wheel_installer/wheel.py b/python/pip_install/tools/wheel_installer/wheel.py index d355bfe695..b84c214018 100644 --- a/python/pip_install/tools/wheel_installer/wheel.py +++ b/python/pip_install/tools/wheel_installer/wheel.py @@ -575,7 +575,7 @@ def __init__(self, path: Path): self._path = path @property - def path(self) -> str: + def path(self) -> Path: return self._path @property diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 45f50effb0..3e56208859 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -30,6 +30,7 @@ filegroup( "//python/private/bzlmod:distribution", "//python/private/common:distribution", "//python/private/proto:distribution", + "//python/private/whl_filegroup:distribution", "//tools/build_defs/python/private:distribution", ], visibility = ["//python:__pkg__"], diff --git a/python/private/whl_filegroup/BUILD.bazel b/python/private/whl_filegroup/BUILD.bazel new file mode 100644 index 0000000000..398b9af0d8 --- /dev/null +++ b/python/private/whl_filegroup/BUILD.bazel @@ -0,0 +1,20 @@ +load("@bazel_skylib//:bzl_library.bzl", "bzl_library") +load("//python:defs.bzl", "py_binary") + +filegroup( + name = "distribution", + srcs = glob(["**"]), + visibility = ["//python/private:__pkg__"], +) + +bzl_library( + name = "whl_filegroup_bzl", + srcs = ["whl_filegroup.bzl"], + visibility = ["//:__subpackages__"], +) + +py_binary( + name = "extract_wheel_files", + srcs = ["extract_wheel_files.py"], + visibility = ["//visibility:public"], +) diff --git a/python/private/whl_filegroup/extract_wheel_files.py b/python/private/whl_filegroup/extract_wheel_files.py new file mode 100644 index 0000000000..e81e6a32ff --- /dev/null +++ b/python/private/whl_filegroup/extract_wheel_files.py @@ -0,0 +1,62 @@ +"""Extract files from a wheel's RECORD.""" + +import re +import sys +import zipfile +from collections.abc import Iterable +from pathlib import Path + +WhlRecord = dict[str, tuple[str, int]] + + +def get_record(whl_path: Path) -> WhlRecord: + try: + zipf = zipfile.ZipFile(whl_path) + except zipfile.BadZipFile as ex: + raise RuntimeError(f"{whl_path} is not a valid zip file") from ex + files = zipf.namelist() + try: + (record_file,) = [name for name in files if name.endswith(".dist-info/RECORD")] + except ValueError: + raise RuntimeError(f"{whl_path} doesn't contain exactly one .dist-info/RECORD") + record_lines = zipf.read(record_file).decode().splitlines() + return { + file: (filehash, int(filelen)) + for line in record_lines + for file, filehash, filelen in [line.split(",")] + if filehash # Skip RECORD itself, which has no hash or length + } + + +def get_files(whl_record: WhlRecord, regex_pattern: str) -> list[str]: + """Get files in a wheel that match a regex pattern.""" + p = re.compile(regex_pattern) + return [filepath for filepath in whl_record.keys() if re.match(p, filepath)] + + +def extract_files(whl_path: Path, files: Iterable[str], outdir: Path) -> None: + """Extract files from whl_path to outdir.""" + zipf = zipfile.ZipFile(whl_path) + for file in files: + zipf.extract(file, outdir) + + +def main() -> None: + if len(sys.argv) not in {3, 4}: + print( + f"Usage: {sys.argv[0]} [regex_pattern]", + file=sys.stderr, + ) + sys.exit(1) + + whl_path = Path(sys.argv[1]).resolve() + outdir = Path(sys.argv[2]) + regex_pattern = sys.argv[3] if len(sys.argv) == 4 else "" + + whl_record = get_record(whl_path) + files = get_files(whl_record, regex_pattern) + extract_files(whl_path, files, outdir) + + +if __name__ == "__main__": + main() diff --git a/python/private/whl_filegroup/whl_filegroup.bzl b/python/private/whl_filegroup/whl_filegroup.bzl new file mode 100644 index 0000000000..c5f97e697b --- /dev/null +++ b/python/private/whl_filegroup/whl_filegroup.bzl @@ -0,0 +1,57 @@ +"""Implementation of whl_filegroup rule.""" + +def _whl_filegroup_impl(ctx): + out_dir = ctx.actions.declare_directory(ctx.attr.name) + ctx.actions.run( + outputs = [out_dir], + inputs = [ctx.file.whl], + arguments = [ + ctx.file.whl.path, + out_dir.path, + ctx.attr.pattern, + ], + executable = ctx.executable._extract_wheel_files_tool, + mnemonic = "PyExtractWheelFiles", + progress_message = "Extracting %s files from %s" % (ctx.attr.pattern, ctx.file.whl.short_path), + ) + return [DefaultInfo( + files = depset([out_dir]), + runfiles = ctx.runfiles(files = [out_dir] if ctx.attr.runfiles else []), + )] + +whl_filegroup = rule( + _whl_filegroup_impl, + doc = """Extract files matching a regular expression from a wheel file. + +An empty pattern will match all files. + +Example usage: +```starlark +load("@rules_cc//cc:defs.bzl", "cc_library") +load("@rules_python//python:pip.bzl", "whl_filegroup") + +whl_filegroup( + name = "numpy_includes", + pattern = "numpy/core/include/numpy", + whl = "@pypi//numpy:whl", +) + +cc_library( + name = "numpy_headers", + hdrs = [":numpy_includes"], + includes = ["numpy_includes/numpy/core/include"], + deps = ["@rules_python//python/cc:current_py_cc_headers"], +) +``` +""", + attrs = { + "pattern": attr.string(default = "", doc = "Only file paths matching this regex pattern will be extracted."), + "runfiles": attr.bool(default = False, doc = "Whether to include the output TreeArtifact in this target's runfiles."), + "whl": attr.label(mandatory = True, allow_single_file = True, doc = "The wheel to extract files from."), + "_extract_wheel_files_tool": attr.label( + default = Label("//python/private/whl_filegroup:extract_wheel_files"), + cfg = "exec", + executable = True, + ), + }, +) diff --git a/tests/whl_filegroup/BUILD.bazel b/tests/whl_filegroup/BUILD.bazel new file mode 100644 index 0000000000..d8b711d120 --- /dev/null +++ b/tests/whl_filegroup/BUILD.bazel @@ -0,0 +1,69 @@ +load("@bazel_skylib//rules:write_file.bzl", "write_file") +load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") +load("//python:defs.bzl", "py_library", "py_test") +load("//python:packaging.bzl", "py_package", "py_wheel") +load("//python:pip.bzl", "whl_filegroup") +load(":whl_filegroup_tests.bzl", "whl_filegroup_test_suite") + +whl_filegroup_test_suite(name = "whl_filegroup_tests") + +py_test( + name = "extract_wheel_files_test", + size = "small", + srcs = ["extract_wheel_files_test.py"], + data = ["//examples/wheel:minimal_with_py_package"], + deps = ["//python/private/whl_filegroup:extract_wheel_files"], +) + +write_file( + name = "header", + out = "include/whl_headers/header.h", + content = [ + "#pragma once", + "#include ", + "#define CUSTOM_ZERO ((Py_ssize_t) 0)", + ], +) + +write_file( + name = "lib_py", + out = "lib.py", +) + +py_library( + name = "lib", + srcs = ["lib.py"], + data = [":header"], +) + +py_package( + name = "pkg", + deps = [":lib"], +) + +py_wheel( + name = "wheel", + distribution = "wheel", + python_tag = "py3", + version = "0.0.1", + deps = [":pkg"], +) + +whl_filegroup( + name = "filegroup", + pattern = "tests/whl_filegroup/include/.*\\.h", + whl = ":wheel", +) + +cc_library( + name = "whl_headers", + hdrs = [":filegroup"], + includes = ["filegroup/tests/whl_filegroup/include"], + deps = ["@rules_python//python/cc:current_py_cc_headers"], +) + +cc_test( + name = "whl_headers_test", + srcs = ["whl_headers_test.c"], + deps = [":whl_headers"], +) diff --git a/tests/whl_filegroup/extract_wheel_files_test.py b/tests/whl_filegroup/extract_wheel_files_test.py new file mode 100644 index 0000000000..2ea175b79a --- /dev/null +++ b/tests/whl_filegroup/extract_wheel_files_test.py @@ -0,0 +1,63 @@ +import tempfile +import unittest +from pathlib import Path + +from python.private.whl_filegroup import extract_wheel_files + +_WHEEL = Path("examples/wheel/example_minimal_package-0.0.1-py3-none-any.whl") + + +class WheelRecordTest(unittest.TestCase): + def test_get_wheel_record(self) -> None: + record = extract_wheel_files.get_record(_WHEEL) + expected = { + "examples/wheel/lib/data.txt": ( + "sha256=9vJKEdfLu8bZRArKLroPZJh1XKkK3qFMXiM79MBL2Sg", + 12, + ), + "examples/wheel/lib/module_with_data.py": ( + "sha256=8s0Khhcqz3yVsBKv2IB5u4l4TMKh7-c_V6p65WVHPms", + 637, + ), + "examples/wheel/lib/simple_module.py": ( + "sha256=z2hwciab_XPNIBNH8B1Q5fYgnJvQTeYf0ZQJpY8yLLY", + 637, + ), + "examples/wheel/main.py": ( + "sha256=sgg5iWN_9inYBjm6_Zw27hYdmo-l24fA-2rfphT-IlY", + 909, + ), + "example_minimal_package-0.0.1.dist-info/WHEEL": ( + "sha256=sobxWSyDDkdg_rinUth-jxhXHqoNqlmNMJY3aTZn2Us", + 91, + ), + "example_minimal_package-0.0.1.dist-info/METADATA": ( + "sha256=cfiQ2hFJhCKCUgbwtAwWG0fhW6NTzw4cr1uKOBcV_IM", + 76, + ), + } + self.maxDiff = None + self.assertDictEqual(record, expected) + + def test_get_files(self) -> None: + pattern = "(examples/wheel/lib/.*\.txt$|.*main)" + record = extract_wheel_files.get_record(_WHEEL) + files = extract_wheel_files.get_files(record, pattern) + expected = ["examples/wheel/lib/data.txt", "examples/wheel/main.py"] + self.assertEqual(files, expected) + + def test_extract(self) -> None: + files = {"examples/wheel/lib/data.txt", "examples/wheel/main.py"} + with tempfile.TemporaryDirectory() as tmpdir: + outdir = Path(tmpdir) + extract_wheel_files.extract_files(_WHEEL, files, outdir) + extracted_files = { + f.relative_to(outdir).as_posix() + for f in outdir.glob("**/*") + if f.is_file() + } + self.assertEqual(extracted_files, files) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/whl_filegroup/whl_filegroup_tests.bzl b/tests/whl_filegroup/whl_filegroup_tests.bzl new file mode 100644 index 0000000000..acb93415e5 --- /dev/null +++ b/tests/whl_filegroup/whl_filegroup_tests.bzl @@ -0,0 +1,34 @@ +"""Test for py_wheel.""" + +load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite") +load("@rules_testing//lib:util.bzl", "util") +load("//python:pip.bzl", "whl_filegroup") + +def _test_runfiles(name): + for runfiles in [True, False]: + util.helper_target( + whl_filegroup, + name = name + "_subject_runfiles_{}".format(runfiles), + whl = ":wheel", + runfiles = runfiles, + ) + analysis_test( + name = name, + impl = _test_runfiles_impl, + targets = { + "no_runfiles": name + "_subject_runfiles_False", + "with_runfiles": name + "_subject_runfiles_True", + }, + ) + +def _test_runfiles_impl(env, targets): + env.expect.that_target(targets.with_runfiles).runfiles().contains_exactly([env.ctx.workspace_name + "/{package}/{name}"]) + env.expect.that_target(targets.no_runfiles).runfiles().contains_exactly([]) + +def whl_filegroup_test_suite(name): + """Create the test suite. + + Args: + name: the name of the test suite + """ + test_suite(name = name, tests = [_test_runfiles]) diff --git a/tests/whl_filegroup/whl_headers_test.c b/tests/whl_filegroup/whl_headers_test.c new file mode 100644 index 0000000000..786395a60b --- /dev/null +++ b/tests/whl_filegroup/whl_headers_test.c @@ -0,0 +1,5 @@ +#include + +int main(int argc, char**argv) { + return CUSTOM_ZERO; +} From 66550eca4ae9d94be3a32da86e60a54cba13cf74 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 22 May 2024 07:28:20 -0700 Subject: [PATCH 041/345] chore(precompiling): use `PyCompile` as mnemonic to match Google mnemonic (#1911) This is just to make the two implementations a bit closer; the mnemonic is a psuedo-public API as it shows up in flags, actions, queries, etc. --- docs/sphinx/precompiling.md | 4 ++-- python/private/common/common_bazel.bzl | 2 +- tests/base_rules/precompile/precompile_tests.bzl | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/sphinx/precompiling.md b/docs/sphinx/precompiling.md index 05a6c4d17e..e30fc947ad 100644 --- a/docs/sphinx/precompiling.md +++ b/docs/sphinx/precompiling.md @@ -51,14 +51,14 @@ mechanisms are available: * The execution requirements can be customized using `--@rules_python//tools/precompiler:execution_requirements`. This is a list flag that can be repeated. Each entry is a key=value that is added to the - execution requirements of the `PyPrecompile` action. Note that this flag + execution requirements of the `PyCompile` action. Note that this flag is specific to the rules_python precompiler. If a custom binary is used, this flag will have to be propagated from the custom binary using the `testing.ExecutionInfo` provider; refer to the `py_interpreter_program` an The default precompiler implementation is an asynchronous/concurrent implementation. If you find it has bugs or hangs, please report them. In the -meantime, the flag `--worker_extra_flag=PyPrecompile=--worker_impl=serial` can +meantime, the flag `--worker_extra_flag=PyCompile=--worker_impl=serial` can be used to switch to a synchronous/serial implementation that may not perform as well, but is less likely to have issues. diff --git a/python/private/common/common_bazel.bzl b/python/private/common/common_bazel.bzl index 8f86fb5796..c86abd27f0 100644 --- a/python/private/common/common_bazel.bzl +++ b/python/private/common/common_bazel.bzl @@ -200,7 +200,7 @@ def _precompile(ctx, src, *, use_pycache): arguments = [precompiler_startup_args, precompile_request_args], inputs = [src], outputs = [pyc], - mnemonic = "PyPrecompile", + mnemonic = "PyCompile", progress_message = "Python precompiling %{input} into %{output}", tools = tools, env = env | { diff --git a/tests/base_rules/precompile/precompile_tests.bzl b/tests/base_rules/precompile/precompile_tests.bzl index f88a438685..02ab4ab19c 100644 --- a/tests/base_rules/precompile/precompile_tests.bzl +++ b/tests/base_rules/precompile/precompile_tests.bzl @@ -295,7 +295,7 @@ _tests.append(_test_precompiler_action) def _test_precompiler_action_impl(env, target): #env.expect.that_target(target).runfiles().contains_exactly([]) - action = env.expect.that_target(target).action_named("PyPrecompile") + action = env.expect.that_target(target).action_named("PyCompile") action.contains_flag_values([ ("--optimize", "2"), ("--python_version", "4.5"), From c7defbcd1181d30762632deb3b21e8a3a58f28a1 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 22 May 2024 18:44:25 -0700 Subject: [PATCH 042/345] docs: implement Starlark domain plugin for Sphinx (#1909) This implements a Sphinx plugin to support Starlark as a first-class domain in Sphinx. A Starlark domain allows writing object descriptions directly using Sphinx's object markup language, which allows better integration with cross references, understanding and distinguishing types, rendering information about things, and referencing types from other projects. Note that this doesn't affect the docs today because the proto_to_markdown tool is still generating regular markdown; updating that to generate Sphinx domain markdown will be done separately. Summary of features: * Types and arguments can be documented using Python syntax, e.g. `list[str]` This includes unions, generics, and custom types. Each component of the type expression is linked and cross referenced appropriately. Each object can have its approprate pieces documented and defined (e.g. a rule can have attributes, attributes can have their defaults etc documented, etc) * An index of Starlark objects is generated automatically. This makes it easy, for example, to find the rules that have a particular attribute. * The following objects can be documented: functions, methods, rules, repository rules, providers, aspects, bzlmod extensions, tag classes, targets, flags, and attributes/fields of the aforementioned objects. * Arbitary docs can cross reference to Starlark types. e.g., a manually written "Getting Started" doc can write `{bzl:obj}PyInfo.some_field` and it will automatically link to the appropriate API docs. * Resolution of cross-references is much smarter and customizable. Instead of relying Markdown's link resolution rules, the Sphinx's crossreference resolution hooks are used. This allows more concise references (e.g., just a rule's base name), distinguishing a particular object type (e.g. a function vs rule), or referring to an absolute object. --- docs/sphinx/BUILD.bazel | 1 + docs/sphinx/bazel_inventory.txt | 27 +- docs/sphinx/pyproject.toml | 1 + docs/sphinx/requirements.txt | 4 + sphinxdocs/BUILD.bazel | 10 + sphinxdocs/private/sphinx.bzl | 7 +- sphinxdocs/src/sphinx_stardoc/BUILD.bazel | 14 + sphinxdocs/src/sphinx_stardoc/__init__.py | 0 sphinxdocs/src/sphinx_stardoc/stardoc.py | 1568 +++++++++++++++++ sphinxdocs/tests/sphinx_stardoc/BUILD.bazel | 37 + sphinxdocs/tests/sphinx_stardoc/aspect.md | 22 + sphinxdocs/tests/sphinx_stardoc/conf.py | 33 + sphinxdocs/tests/sphinx_stardoc/envvars.md | 9 + sphinxdocs/tests/sphinx_stardoc/function.md | 41 + sphinxdocs/tests/sphinx_stardoc/glossary.md | 8 + sphinxdocs/tests/sphinx_stardoc/index.md | 26 + .../tests/sphinx_stardoc/module_extension.md | 20 + sphinxdocs/tests/sphinx_stardoc/provider.md | 34 + sphinxdocs/tests/sphinx_stardoc/repo_rule.md | 19 + sphinxdocs/tests/sphinx_stardoc/rule.md | 34 + sphinxdocs/tests/sphinx_stardoc/target.md | 23 + sphinxdocs/tests/sphinx_stardoc/xrefs.md | 50 + 22 files changed, 1977 insertions(+), 11 deletions(-) create mode 100644 sphinxdocs/src/sphinx_stardoc/BUILD.bazel create mode 100644 sphinxdocs/src/sphinx_stardoc/__init__.py create mode 100644 sphinxdocs/src/sphinx_stardoc/stardoc.py create mode 100644 sphinxdocs/tests/sphinx_stardoc/BUILD.bazel create mode 100644 sphinxdocs/tests/sphinx_stardoc/aspect.md create mode 100644 sphinxdocs/tests/sphinx_stardoc/conf.py create mode 100644 sphinxdocs/tests/sphinx_stardoc/envvars.md create mode 100644 sphinxdocs/tests/sphinx_stardoc/function.md create mode 100644 sphinxdocs/tests/sphinx_stardoc/glossary.md create mode 100644 sphinxdocs/tests/sphinx_stardoc/index.md create mode 100644 sphinxdocs/tests/sphinx_stardoc/module_extension.md create mode 100644 sphinxdocs/tests/sphinx_stardoc/provider.md create mode 100644 sphinxdocs/tests/sphinx_stardoc/repo_rule.md create mode 100644 sphinxdocs/tests/sphinx_stardoc/rule.md create mode 100644 sphinxdocs/tests/sphinx_stardoc/target.md create mode 100644 sphinxdocs/tests/sphinx_stardoc/xrefs.md diff --git a/docs/sphinx/BUILD.bazel b/docs/sphinx/BUILD.bazel index 8912f2cfb6..e3b9ad3f96 100644 --- a/docs/sphinx/BUILD.bazel +++ b/docs/sphinx/BUILD.bazel @@ -70,6 +70,7 @@ sphinx_docs( sphinx_inventory( name = "bazel_inventory", src = "bazel_inventory.txt", + visibility = ["//:__subpackages__"], ) sphinx_stardocs( diff --git a/docs/sphinx/bazel_inventory.txt b/docs/sphinx/bazel_inventory.txt index 869e66a538..b099f42704 100644 --- a/docs/sphinx/bazel_inventory.txt +++ b/docs/sphinx/bazel_inventory.txt @@ -2,16 +2,23 @@ # Project: Bazel # Version: 7.0.0 # The remainder of this file is compressed using zlib -Action bzl:obj 1 rules/lib/Action - -File bzl:obj 1 rules/lib/File - -Label bzl:obj 1 rules/lib/Label - -Target bzl:obj 1 rules/lib/builtins/Target - -bool bzl:obj 1 rules/lib/bool - -depset bzl:obj 1 rules/lib/depset - -dict bzl:obj 1 rules/lib/dict - +Action bzl:type 1 rules/lib/Action - +File bzl:type 1 rules/lib/File - +Label bzl:type 1 rules/lib/Label - +Target bzl:type 1 rules/lib/builtins/Target - +bool bzl:type 1 rules/lib/bool - +int bzl:type 1 rules/lib/int - +depset bzl:type 1 rules/lib/depset - +dict bzl:type 1 rules/lib/dict - label bzl:doc 1 concepts/labels - -list bzl:obj: 1 rules/lib/list - +attr.bool bzl:type 1 rules/lib/toplevel/attr#bool - +attr.int bzl:type 1 rules/lib/toplevel/attr#int - +attr.label bzl:type 1 rules/lib/toplevel/attr#label - +attr.label_list bzl:type 1 rules/lib/toplevel/attr#label_list - +attr.string bzl:type 1 rules/lib/toplevel/attr#string - +attr.string_list bzl:type 1 rules/lib/toplevel/attr#string_list - +list bzl:type 1 rules/lib/list - python bzl:doc 1 reference/be/python - -str bzl:obj 1 rules/lib/string - -struct bzl:obj 1 rules/lib/builtins/struct - +str bzl:type 1 rules/lib/string - +struct bzl:type 1 rules/lib/builtins/struct - target-name bzl:doc 1 concepts/labels#target-names - diff --git a/docs/sphinx/pyproject.toml b/docs/sphinx/pyproject.toml index d36c9f269c..03279c56e3 100644 --- a/docs/sphinx/pyproject.toml +++ b/docs/sphinx/pyproject.toml @@ -10,4 +10,5 @@ dependencies = [ "sphinx_rtd_theme", "readthedocs-sphinx-ext", "absl-py", + "typing-extensions" ] diff --git a/docs/sphinx/requirements.txt b/docs/sphinx/requirements.txt index ed74550e83..a3c7c9a5f7 100644 --- a/docs/sphinx/requirements.txt +++ b/docs/sphinx/requirements.txt @@ -335,6 +335,10 @@ sphinxcontrib-serializinghtml==1.1.9 \ --hash=sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54 \ --hash=sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1 # via sphinx +typing-extensions==4.9.0 \ + --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ + --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd + # via rules-python-docs (docs/sphinx/pyproject.toml) urllib3==2.1.0 \ --hash=sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3 \ --hash=sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54 diff --git a/sphinxdocs/BUILD.bazel b/sphinxdocs/BUILD.bazel index cd1a1fbf6d..6cb69ba881 100644 --- a/sphinxdocs/BUILD.bazel +++ b/sphinxdocs/BUILD.bazel @@ -13,6 +13,7 @@ # limitations under the License. load("@bazel_skylib//:bzl_library.bzl", "bzl_library") +load("@bazel_skylib//rules:common_settings.bzl", "bool_flag") load("//sphinxdocs/private:sphinx.bzl", "repeated_string_list_flag") package( @@ -31,6 +32,15 @@ repeated_string_list_flag( build_setting_default = [], ) +# Whether to add the `-q` arg to Sphinx invocations, which determines if +# stdout has any output or not (logging INFO messages and progress messages). +# If true, add `-q`. If false, don't add `-q`. This is mostly useful for +# debugging invocations or developing extensions. +bool_flag( + name = "quiet", + build_setting_default = True, +) + bzl_library( name = "sphinx_bzl", srcs = ["sphinx.bzl"], diff --git a/sphinxdocs/private/sphinx.bzl b/sphinxdocs/private/sphinx.bzl index 4226391aac..a5ac83152e 100644 --- a/sphinxdocs/private/sphinx.bzl +++ b/sphinxdocs/private/sphinx.bzl @@ -15,6 +15,7 @@ """Implementation of sphinx rules.""" load("@bazel_skylib//lib:paths.bzl", "paths") +load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("//python:py_binary.bzl", "py_binary") load("//python/private:util.bzl", "add_tag", "copy_propagating_kwargs") # buildifier: disable=bzl-visibility @@ -119,6 +120,7 @@ def sphinx_docs( output_group = "html", **common_kwargs ) + py_binary( name = name + ".serve", srcs = [_SPHINX_SERVE_MAIN_SRC], @@ -187,6 +189,7 @@ _sphinx_docs = rule( ), "_extra_defines_flag": attr.label(default = "//sphinxdocs:extra_defines"), "_extra_env_flag": attr.label(default = "//sphinxdocs:extra_env"), + "_quiet_flag": attr.label(default = "//sphinxdocs:quiet"), }, ) @@ -245,7 +248,9 @@ def _run_sphinx(ctx, format, source_path, inputs, output_prefix): args = ctx.actions.args() args.add("-T") # Full tracebacks on error args.add("-b", format) - args.add("-q") # Suppress stdout informational text + + if ctx.attr._quiet_flag[BuildSettingInfo].value: + args.add("-q") # Suppress stdout informational text args.add("-j", "auto") # Build in parallel, if possible args.add("-E") # Don't try to use cache files. Bazel can't make use of them. args.add("-a") # Write all files; don't try to detect "changed" files diff --git a/sphinxdocs/src/sphinx_stardoc/BUILD.bazel b/sphinxdocs/src/sphinx_stardoc/BUILD.bazel new file mode 100644 index 0000000000..b788b09c24 --- /dev/null +++ b/sphinxdocs/src/sphinx_stardoc/BUILD.bazel @@ -0,0 +1,14 @@ +load("//python:py_library.bzl", "py_library") + +package( + default_visibility = ["//:__subpackages__"], +) + +# NOTE: This provides the library on its own, not its dependencies. +py_library( + name = "sphinx_stardoc", + srcs = glob(["*.py"]), + imports = [".."], + # Allow depending on it in sphinx_binary targets + visibility = ["//visibility:public"], +) diff --git a/sphinxdocs/src/sphinx_stardoc/__init__.py b/sphinxdocs/src/sphinx_stardoc/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sphinxdocs/src/sphinx_stardoc/stardoc.py b/sphinxdocs/src/sphinx_stardoc/stardoc.py new file mode 100644 index 0000000000..283fb67d77 --- /dev/null +++ b/sphinxdocs/src/sphinx_stardoc/stardoc.py @@ -0,0 +1,1568 @@ +"""Sphinx extension for documenting Bazel/Starlark objects.""" + +import ast +import collections +import enum +import os +import typing +from collections.abc import Collection +from typing import Callable, Iterable, TypeVar + +from docutils import nodes as docutils_nodes +from docutils.parsers.rst import directives as docutils_directives +from docutils.parsers.rst import states +from sphinx import addnodes, builders +from sphinx import directives as sphinx_directives +from sphinx import domains, environment, roles +from sphinx.highlighting import lexer_classes +from sphinx.locale import _ +from sphinx.util import docfields +from sphinx.util import docutils as sphinx_docutils +from sphinx.util import inspect, logging +from sphinx.util import nodes as sphinx_nodes +from sphinx.util import typing as sphinx_typing +from typing_extensions import override + +_logger = logging.getLogger(__name__) +_LOG_PREFIX = f"[{_logger.name}] " + +_INDEX_SUBTYPE_NORMAL = 0 +_INDEX_SUBTYPE_ENTRY_WITH_SUB_ENTRIES = 1 +_INDEX_SUBTYPE_SUB_ENTRY = 2 + +_T = TypeVar("_T") + +# See https://www.sphinx-doc.org/en/master/extdev/domainapi.html#sphinx.domains.Domain.get_objects +_GetObjectsTuple: typing.TypeAlias = tuple[str, str, str, str, str, int] + +# See SphinxRole.run definition; the docs for role classes are pretty sparse. +_RoleRunResult: typing.TypeAlias = tuple[ + list[docutils_nodes.Node], list[docutils_nodes.system_message] +] + + +def _log_debug(message, *args): + # NOTE: Non-warning log messages go to stdout and are only + # visible when -q isn't passed to Sphinx. Note that the sphinx_docs build + # rule passes -q by default; use --//sphinxdocs:quiet=false to disable it. + _logger.debug("%s" + message, _LOG_PREFIX, *args) + + +def _position_iter(values: Collection[_T]) -> tuple[bool, bool, _T]: + last_i = len(values) - 1 + for i, value in enumerate(values): + yield i == 0, i == last_i, value + + +# TODO: Remove this. Use @repo//pkg:file.bzl%symbol to identify things instead +# of dots. This more directly reflects the bzl concept and avoids issues with +# e.g. repos, directories, or files containing dots themselves. +def _label_to_dotted_name(label: str) -> str: + """Convert an absolute label to a dotted name. + + Args: + label: Absolute label with optional repo prefix, e.g. `@a//b:c.bzl` + or `//b:c.bzl` + + Returns: + Label converted to a dotted notation for easier writing of object + references. + """ + if label.endswith(".bzl"): + label = label[: -len(".bzl")] + elif ":BUILD" in label: + label = label[: label.find(":BUILD")] + else: + raise InvalidValueError( + f"Malformed label: Label must end with .bzl or :BUILD*, got {label}" + ) + + # Make a //foo:bar.bzl convert to foo.bar, not .foo.bar + if label.startswith("//"): + label = label.lstrip("/") + return label.replace("@", "").replace("//", "/").replace(":", "/").replace("/", ".") + + +class InvalidValueError(Exception): + """Generic error for an invalid value instead of ValueError. + + Sphinx treats regular ValueError to mean abort parsing the current + chunk and continue on as best it can. Their error means a more + fundamental problem that should cause a failure. + """ + + +class _ObjectEntry: + """Metadata about a known object.""" + + def __init__( + self, + full_id: str, + display_name: str, + object_type: str, + search_priority: int, + index_entry: domains.IndexEntry, + ): + """Creates an instance. + + Args: + full_id: The fully qualified id of the object. Should be + globally unique, even between projects. + display_name: What to display the object as in casual context. + object_type: The type of object, typically one of the values + known to the domain. + search_priority: The search priority, see + https://www.sphinx-doc.org/en/master/extdev/domainapi.html#sphinx.domains.Domain.get_objects + for valid values. + index_entry: Metadata about the object for the domain index. + """ + self.full_id = full_id + self.display_name = display_name + self.object_type = object_type + self.search_priority = search_priority + self.index_entry = index_entry + + def to_get_objects_tuple(self) -> _GetObjectsTuple: + # For the tuple definition + return ( + self.full_id, + self.display_name, + self.object_type, + self.index_entry.docname, + self.index_entry.anchor, + self.search_priority, + ) + + +# A simple helper just to document what the index tuple nodes are. +def _index_node_tuple( + entry_type: str, + entry_name: str, + target: str, + main: str | None = None, + category_key: str | None = None, +) -> tuple[str, str, str, str | None, str | None]: + # For this tuple definition, see: + # https://www.sphinx-doc.org/en/master/extdev/nodes.html#sphinx.addnodes.index + # For the definition of entry_type, see: + # And https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-index + return (entry_type, entry_name, target, main, category_key) + + +class _BzlObjectId: + def __init__( + self, + *, + repo: str, + bzl_file: str = None, + namespace: str = None, + symbol: str = None, + target: str = None, + ): + """Creates an instance. + + Args: + repo: repository name, including leading "@". + bzl_file: label of file containing the object, e.g. //foo:bar.bzl + namespace: dotted name of the namespace the symbol is within. + symbol: dotted name, relative to `namespace` of the symbol. + """ + if not repo: + raise InvalidValueError("repo cannot be empty") + if not bzl_file: + raise InvalidValueError("bzl_file cannot be empty") + if not symbol: + raise InvalidvalueError("symbol cannot be empty") + + self.repo = repo + self.bzl_file = bzl_file + self.namespace = namespace + self.symbol = symbol # Relative to namespace + + clean_repo = repo.replace("@", "") + package = _label_to_dotted_name(bzl_file) + self.full_id = ".".join(filter(None, [clean_repo, package, namespace, symbol])) + + @classmethod + def from_env( + cls, env: environment.BuildEnvironment, symbol: str = None, target: str = None + ) -> "_BzlObjectId": + if target: + symbol = target.lstrip("/:").replace(":", ".") + return cls( + repo=env.ref_context["bzl:repo"], + bzl_file=env.ref_context["bzl:file"], + namespace=".".join(env.ref_context["bzl:doc_id_stack"]), + symbol=symbol, + ) + + +class _TypeExprParser(ast.NodeVisitor): + """Parsers a string description of types to doc nodes.""" + + def __init__(self, make_xref: Callable[[str], docutils_nodes.Node]): + self.root_node = addnodes.desc_inline("bzl", classes=["type-expr"]) + self.make_xref = make_xref + self._doc_node_stack = [self.root_node] + + @classmethod + def xrefs_from_type_expr( + cls, + type_expr_str: str, + make_xref: Callable[[str], docutils_nodes.Node], + ) -> docutils_nodes.Node: + module = ast.parse(type_expr_str) + visitor = cls(make_xref) + visitor.visit(module.body[0]) + return visitor.root_node + + def _append(self, node: docutils_nodes.Node): + self._doc_node_stack[-1] += node + + def _append_and_push(self, node: docutils_nodes.Node): + self._append(node) + self._doc_node_stack.append(node) + + def visit_Attribute(self, node: ast.Attribute): + current = node + parts = [] + while current: + if isinstance(current, ast.Attribute): + parts.append(current.attr) + current = current.value + elif isinstance(current, ast.Name): + parts.append(current.id) + break + else: + raise InvalidValueError(f"Unexpected Attribute.value node: {current}") + dotted_name = ".".join(reversed(parts)) + self._append(self.make_xref(dotted_name)) + + def visit_Constant(self, node: ast.Constant): + if node.value is None: + self._append(self.make_xref("None")) + else: + raise InvalidValueError(f"Unexpected Constant node value: {node.value}") + + def visit_Name(self, node: ast.Name): + xref_node = self.make_xref(node.id) + self._append(xref_node) + + def visit_BinOp(self, node: ast.BinOp): + self.visit(node.left) + self._append(addnodes.desc_sig_space()) + if isinstance(node.op, ast.BitOr): + self._append(addnodes.desc_sig_punctuation("", "|")) + else: + raise InvalidValueError(f"Unexpected BinOp: {node}") + self._append(addnodes.desc_sig_space()) + self.visit(node.right) + + def visit_Expr(self, node: ast.Expr): + self.visit(node.value) + + def visit_Subscript(self, node: ast.Subscript): + self.visit(node.value) + self._append_and_push(addnodes.desc_type_parameter_list()) + self.visit(node.slice) + self._doc_node_stack.pop() + + def visit_Tuple(self, node: ast.Tuple): + for element in node.elts: + self._append_and_push(addnodes.desc_type_parameter()) + self.visit(element) + self._doc_node_stack.pop() + + def visit_List(self, node: ast.List): + self._append_and_push(addnodes.desc_type_parameter_list()) + for element in node.elts: + self._append_and_push(addnodes.desc_type_parameter()) + self.visit(element) + self._doc_node_stack.pop() + + @override + def generic_visit(self, node): + raise InvalidValueError(f"Unexpected ast node: {type(node)} {node}") + + +class _BzlXrefField(docfields.Field): + """Abstract base class to create cross references for fields.""" + + @override + def make_xrefs( + self, + rolename: str, + domain: str, + target: str, + innernode: type[sphinx_typing.TextlikeNode] = addnodes.literal_emphasis, + contnode: docutils_nodes.Node | None = None, + env: environment.BuildEnvironment | None = None, + inliner: states.Inliner | None = None, + location: docutils_nodes.Element | None = None, + ) -> list[docutils_nodes.Node]: + if rolename in ("arg", "attr"): + return self._make_xrefs_for_arg_attr( + rolename, domain, target, innernode, contnode, env, inliner, location + ) + else: + return super().make_xrefs( + rolename, domain, target, innernode, contnode, env, inliner, location + ) + + def _make_xrefs_for_arg_attr( + self, + rolename: str, + domain: str, + arg_name: str, + innernode: type[sphinx_typing.TextlikeNode] = addnodes.literal_emphasis, + contnode: docutils_nodes.Node | None = None, + env: environment.BuildEnvironment | None = None, + inliner: states.Inliner | None = None, + location: docutils_nodes.Element | None = None, + ) -> list[docutils_nodes.Node]: + bzl_file = env.ref_context["bzl:file"] + anchor_prefix = ".".join(env.ref_context["bzl:doc_id_stack"]) + if not anchor_prefix: + raise InvalidValueError( + f"doc_id_stack empty when processing arg {arg_name}" + ) + index_description = f"{arg_name} ({self.name} in {bzl_file}%{anchor_prefix})" + anchor_id = f"{anchor_prefix}.{arg_name}" + full_id = ".".join(env.ref_context["bzl:object_id_stack"] + [arg_name]) + + env.get_domain(domain).add_object( + _ObjectEntry( + full_id=full_id, + display_name=arg_name, + object_type=self.name, + search_priority=1, + index_entry=domains.IndexEntry( + name=arg_name, + subtype=_INDEX_SUBTYPE_NORMAL, + docname=env.docname, + anchor=anchor_id, + extra="", + qualifier="", + descr=index_description, + ), + ), + # This allows referencing an arg as e.g `funcname.argname` + alt_names=[anchor_id], + ) + + # Two changes to how arg xrefs are created: + # 2. Use the full id instead of base name. This makes it unambiguous + # as to what it's referencing. + pending_xref = super().make_xref( + # The full_id is used as the target so its unambiguious. + rolename, + domain, + f"{arg_name} <{full_id}>", + innernode, + contnode, + env, + inliner, + location, + ) + + wrapper = docutils_nodes.inline(ids=[anchor_id]) + + index_node = addnodes.index( + entries=[ + _index_node_tuple( + "single", f"{self.name}; {index_description}", anchor_id + ), + _index_node_tuple("single", index_description, anchor_id), + ] + ) + wrapper += index_node + wrapper += pending_xref + return [wrapper] + + +class _BzlField(_BzlXrefField, docfields.Field): + """A non-repeated field with xref support.""" + + +class _BzlGroupedField(_BzlXrefField, docfields.GroupedField): + """A repeated fieled grouped as a list with xref support.""" + + +class _BzlCsvField(_BzlXrefField): + """Field with a CSV list of values.""" + + def __init__(self, *args, body_domain: str = "", **kwargs): + super().__init__(*args, **kwargs) + self._body_domain = body_domain + + def make_field( + self, + types: dict[str, list[docutils_nodes.Node]], + domain: str, + item: tuple, + env: environment.BuildEnvironment = None, + inliner: states.Inliner | None = None, + location: docutils_nodes.Element | None = None, + ) -> docutils_nodes.field: + field_text = item[1][0].astext() + parts = [p.strip() for p in field_text.split(",")] + field_body = docutils_nodes.field_body() + for _, is_last, part in _position_iter(parts): + node = self.make_xref( + self.bodyrolename, + self._body_domain or domain, + part, + env=env, + inliner=inliner, + location=location, + ) + field_body += node + if not is_last: + field_body += docutils_nodes.Text(", ") + + field_name = docutils_nodes.field_name("", self.label) + return docutils_nodes.field("", field_name, field_body) + + +class _BzlCurrentFile(sphinx_docutils.SphinxDirective): + """Sets what bzl file following directives are defined in. + + The directive's argument is an absolute Bazel label, e.g. `//foo:bar.bzl` + or `@repo//foo:bar.bzl`. The repository portion is optional; if specified, + it will override the `bzl_default_repository_name` configuration setting. + + Example MyST usage + + ``` + :::{bzl:currentfile} //my:file.bzl + ::: + ``` + """ + + has_content = False + required_arguments = 1 + final_argument_whitespace = False + + @override + def run(self) -> list[docutils_nodes.Node]: + label = self.arguments[0].strip() + repo, slashes, file_label = label.partition("//") + file_label = slashes + file_label + if not repo: + repo = self.env.config.bzl_default_repository_name + self.env.ref_context["bzl:repo"] = repo + self.env.ref_context["bzl:file"] = file_label + self.env.ref_context["bzl:object_id_stack"] = [ + _label_to_dotted_name(repo + file_label) + ] + self.env.ref_context["bzl:doc_id_stack"] = [] + return [] + + +class _BzlAttrInfo(sphinx_docutils.SphinxDirective): + has_content = False + required_arguments = 1 + optional_arguments = 0 + option_spec = { + "executable": docutils_directives.flag, + "mandatory": docutils_directives.flag, + } + + def run(self): + content_node = docutils_nodes.paragraph("", "") + if "mandatory" in self.options: + content_node += docutils_nodes.paragraph("", "mandatory (must be non-None)") + if "executable" in self.options: + content_node += docutils_nodes.paragraph("", "Must be an executable") + + return [content_node] + + +class _BzlObject(sphinx_directives.ObjectDescription[_BzlObjectId]): + """Base class for describing a Bazel/Starlark object. + + This directive takes a single argument: a string name with optional + function signature. + + * The name can be a dotted name, e.g. `a.b.foo` + * The signature is in Python signature syntax, e.g. `foo(a=x) -> R` + * The signature supports default values. + * Arg type annotations are not supported; use `{bzl:type}` instead as + part of arg/attr documentation. + + Example signatures: + * `foo` + * `foo(arg1, arg2)` + * `foo(arg1, arg2=default) -> returntype` + """ + + @override + def before_content(self) -> None: + symbol_name = self.names[-1].symbol + self.env.ref_context["bzl:object_id_stack"].append(symbol_name) + self.env.ref_context["bzl:doc_id_stack"].append(symbol_name) + + @override + def transform_content(self, content_node: addnodes.desc_content) -> None: + def first_child_with_class_name(root, class_name) -> "None | Element": + matches = root.findall( + lambda node: isinstance(node, docutils_nodes.Element) + and class_name in node["classes"] + ) + found = next(matches, None) + return found + + def match_arg_field_name(node): + # fmt: off + return ( + isinstance(node, docutils_nodes.field_name) + and node.astext().startswith(("arg ", "attr ")) + ) + # fmt: on + + # Move the spans for the arg type and default value to be first. + arg_name_fields = list(content_node.findall(match_arg_field_name)) + for arg_name_field in arg_name_fields: + arg_body_field = arg_name_field.next_node(descend=False, siblings=True) + # arg_type_node = first_child_with_class_name(arg_body_field, "arg-type-span") + arg_type_node = first_child_with_class_name(arg_body_field, "type-expr") + arg_default_node = first_child_with_class_name( + arg_body_field, "default-value-span" + ) + + # Inserting into the body field itself causes the elements + # to be grouped into the paragraph node containing the arg + # name (as opposed to the paragraph node containing the + # doc text) + + if arg_default_node: + arg_default_node.parent.remove(arg_default_node) + arg_body_field.insert(0, arg_default_node) + + if arg_type_node: + arg_type_node.parent.remove(arg_type_node) + decorated_arg_type_node = docutils_nodes.inline( + "", + "", + docutils_nodes.Text("("), + arg_type_node, + docutils_nodes.Text(") "), + classes=["arg-type-span"], + ) + # arg_body_field.insert(0, arg_type_node) + arg_body_field.insert(0, decorated_arg_type_node) + + @override + def after_content(self) -> None: + self.env.ref_context["bzl:object_id_stack"].pop() + self.env.ref_context["bzl:doc_id_stack"].pop() + + # docs on how to build signatures: + # https://www.sphinx-doc.org/en/master/extdev/nodes.html#sphinx.addnodes.desc_signature + @override + def handle_signature( + self, sig_text: str, sig_node: addnodes.desc_signature + ) -> _BzlObjectId: + self._signature_add_object_type(sig_node) + + relative_name, lparen, params_text = sig_text.partition("(") + if lparen: + params_text = lparen + params_text + + relative_name = relative_name.strip() + + name_prefix, _, base_symbol_name = relative_name.rpartition(".") + if name_prefix: + # Respect whatever the signature wanted + display_prefix = name_prefix + else: + # Otherwise, show the outermost name. This makes ctrl+f finding + # for a symbol a bit easier. + display_prefix = ".".join(self.env.ref_context["bzl:doc_id_stack"]) + _, _, display_prefix = display_prefix.rpartition(".") + + if display_prefix: + display_prefix = display_prefix + "." + sig_node += addnodes.desc_addname(display_prefix, display_prefix) + sig_node += addnodes.desc_name(base_symbol_name, base_symbol_name) + + if type_expr := self.options.get("type"): + + def make_xref(name): + content_node = addnodes.desc_type(name, name) + return addnodes.pending_xref( + "", + content_node, + refdomain="bzl", + reftype="type", + reftarget=name, + ) + + attr_annotation_node = addnodes.desc_annotation( + type_expr, + "", + addnodes.desc_sig_punctuation("", ":"), + addnodes.desc_sig_space(), + _TypeExprParser.xrefs_from_type_expr(type_expr, make_xref), + ) + sig_node += attr_annotation_node + + if params_text: + signature = inspect.signature_from_str(params_text) + + paramlist_node = addnodes.desc_parameterlist() + for param in signature.parameters.values(): + node = addnodes.desc_parameter() + node += addnodes.desc_sig_name(rawsource="", text=param.name) + if param.default is not param.empty: + node += addnodes.desc_sig_operator("", "=") + node += docutils_nodes.inline( + "", + param.default, + classes=["default_value"], + support_smartquotes=False, + ) + paramlist_node += node + sig_node += paramlist_node + + if signature.return_annotation is not signature.empty: + sig_node += addnodes.desc_returns("", signature.return_annotation) + + obj_id = _BzlObjectId.from_env(self.env, relative_name) + + sig_node["bzl:object_id"] = obj_id.full_id + return obj_id + + def _signature_add_object_type(self, sig_node: addnodes.desc_signature): + if sig_object_type := self._get_signature_object_type(): + sig_node += addnodes.desc_annotation("", self._get_signature_object_type()) + sig_node += addnodes.desc_sig_space() + + @override + def add_target_and_index( + self, obj_desc: _BzlObjectId, sig: str, sig_node: addnodes.desc_signature + ) -> None: + super().add_target_and_index(obj_desc, sig, sig_node) + symbol_name = obj_desc.symbol + display_name = sig_node.get("bzl:index_display_name", symbol_name) + + anchor_prefix = ".".join(self.env.ref_context["bzl:doc_id_stack"]) + if anchor_prefix: + anchor_id = f"{anchor_prefix}.{symbol_name}" + file_location = "%" + anchor_prefix + else: + anchor_id = symbol_name + file_location = "" + + sig_node["ids"].append(anchor_id) + + object_type_display = self._get_object_type_display_name() + index_description = ( + f"{display_name} ({object_type_display} in " + f"{obj_desc.bzl_file}{file_location})" + ) + self.indexnode["entries"].extend( + _index_node_tuple("single", f"{index_type}; {index_description}", anchor_id) + for index_type in [object_type_display] + self._get_additional_index_types() + ) + self.indexnode["entries"].append( + _index_node_tuple("single", index_description, anchor_id), + ) + + object_entry = _ObjectEntry( + full_id=obj_desc.full_id, + display_name=display_name, + object_type=self.objtype, + search_priority=1, + index_entry=domains.IndexEntry( + name=symbol_name, + subtype=_INDEX_SUBTYPE_NORMAL, + docname=self.env.docname, + anchor=anchor_id, + extra="", + qualifier="", + descr=index_description, + ), + ) + + self.env.get_domain(self.domain).add_object( + object_entry, alt_names=self._get_alt_names(object_entry) + ) + + def _get_additional_index_types(self): + return [] + + @override + def _object_hierarchy_parts( + self, sig_node: addnodes.desc_signature + ) -> tuple[str, ...]: + return tuple(sig_node["bzl:object_id"].split(".")) + + @override + def _toc_entry_name(self, sig_node: addnodes.desc_signature) -> str: + return sig_node["_toc_parts"][-1] + + def _get_object_type_display_name(self) -> str: + return self.env.get_domain(self.domain).object_types[self.objtype].lname + + def _get_signature_object_type(self) -> str: + return self._get_object_type_display_name() + + def _get_alt_names(self, object_entry): + return [object_entry.full_id.split(".")[-1]] + + +class _BzlCallable(_BzlObject): + """Abstract base class for objects that are callable.""" + + @override + def _get_alt_names(self, object_entry): + return [object_entry.full_id.split(".")[-1]] + + +class _BzlProvider(_BzlObject): + """Documents a provider type. + + Example MyST usage + + ``` + ::::{bzl:provider} MyInfo + + Docs about MyInfo + + :::{bzl:provider-field} some_field + :type: depset[str] + ::: + :::: + ``` + """ + + @override + def _get_alt_names(self, object_entry): + return [object_entry.full_id.split(".")[-1]] + + +class _BzlProviderField(_BzlObject): + """Documents a field of a provider. + + Fields can optionally have a type specified using the `:type:` option. + + The type can be any type expression understood by the `{bzl:type}` role. + + ``` + :::{bzl:provider-field} foo + :type: str + ::: + ``` + """ + + option_spec = _BzlObject.option_spec.copy() + option_spec.update( + { + "type": docutils_directives.unchanged, + } + ) + + @override + def _get_signature_object_type(self) -> str: + return "" + + @override + def _get_alt_names(self, object_entry): + return [".".join(object_entry.full_id.split(".")[-2:])] + + +class _BzlRepositoryRule(_BzlCallable): + """Documents a repository rule. + + Doc fields: + * attr: Documents attributes of the rule. Takes a single arg, the + attribute name. Can be repeated. The special roles `{default-value}` + and `{arg-type}` can be used to indicate the default value and + type of attribute, respectively. + * environment-variables: a CSV list of environment variable names. + They will be cross referenced with matching environment variables. + + Example MyST usage + + ``` + :::{bzl:repo-rule} myrule(foo) + + :attr foo: {default-value}`"foo"` {arg-type}`attr.string` foo doc string + + :environment-variables: FOO, BAR + ::: + ``` + """ + + doc_field_types = [ + _BzlGroupedField( + "attr", + label=_("Attributes"), + names=["attr"], + rolename="attr", + can_collapse=False, + ), + _BzlCsvField( + "environment-variables", + label=_("Environment Variables"), + names=["environment-variables"], + body_domain="std", + bodyrolename="envvar", + has_arg=False, + ), + ] + + @override + def _get_signature_object_type(self) -> str: + return "repo rule" + + +class _BzlRule(_BzlCallable): + """Documents a rule. + + Doc fields: + * attr: Documents attributes of the rule. Takes a single arg, the + attribute name. Can be repeated. The special roles `{default-value}` + and `{arg-type}` can be used to indicate the default value and + type of attribute, respectively. + * provides: A type expression of the provider types the rule provides. + To indicate different groupings, use `|` and `[]`. For example, + `FooInfo | [BarInfo, BazInfo]` means it provides either `FooInfo` + or both of `BarInfo` and `BazInfo`. + + Example MyST usage + + ``` + :::{bzl:repo-rule} myrule(foo) + + :attr foo: {default-value}`"foo"` {arg-type}`attr.string` foo doc string + + :provides: FooInfo | BarInfo + ::: + ``` + """ + + doc_field_types = [ + _BzlGroupedField( + "attr", + label=_("Attributes"), + names=["attr"], + rolename="attr", + can_collapse=False, + ), + _BzlField( + "provides", + label="Provides", + has_arg=False, + names=["provides"], + bodyrolename="type", + ), + ] + + +class _BzlAspect(_BzlObject): + """Documents an aspect. + + Doc fields: + * attr: Documents attributes of the aspect. Takes a single arg, the + attribute name. Can be repeated. The special roles `{default-value}` + and `{arg-type}` can be used to indicate the default value and + type of attribute, respectively. + * aspect-attributes: A CSV list of attribute names the aspect + propagates along. + + Example MyST usage + + ``` + :::{bzl:repo-rule} myaspect + + :attr foo: {default-value}`"foo"` {arg-type}`attr.string` foo doc string + + :aspect-attributes: srcs, deps + ::: + ``` + """ + + doc_field_types = [ + _BzlGroupedField( + "attr", + label=_("Attributes"), + names=["attr"], + rolename="attr", + can_collapse=False, + ), + _BzlCsvField( + "aspect-attributes", + label=_("Aspect Attributes"), + names=["aspect-attributes"], + has_arg=False, + ), + ] + + +class _BzlFunction(_BzlCallable): + """Documents a general purpose function. + + Doc fields: + * arg: Documents the arguments of the function. Takes a single arg, the + arg name. Can be repeated. The special roles `{default-value}` + and `{arg-type}` can be used to indicate the default value and + type of attribute, respectively. + * returns: Documents what the function returns. The special role + `{return-type}` can be used to indicate the return type of the function. + + Example MyST usage + + ``` + :::{bzl:function} myfunc(a, b=None) -> bool + + :arg a: {arg-type}`str` some arg doc + :arg b: {arg-type}`int | None` {default-value}`42` more arg doc + :returns: {return-type}`bool` doc about return value. + ::: + ``` + """ + + doc_field_types = [ + _BzlGroupedField( + "arg", + label=_("Args"), + names=["arg"], + rolename="arg", + can_collapse=False, + ), + docfields.Field( + "returns", + label=_("Returns"), + has_arg=False, + names=["returns"], + ), + ] + + @override + def _get_signature_object_type(self) -> str: + return "" + + +class _BzlModuleExtension(_BzlObject): + """Documents a module_extension. + + Doc fields: + * os-dependent: Documents if the module extension depends on the host + architecture. + * arch-dependent: Documents if the module extension depends on the host + architecture. + * environment-variables: a CSV list of environment variable names. + They will be cross referenced with matching environment variables. + + Tag classes are documented using the bzl:tag-class directives within + this directive. + + Example MyST usage: + + ``` + ::::{bzl:module-extension} myext + + :os-dependent: True + :arch-dependent: False + + :::{bzl:tag-class} mytag(myattr) + + :attr myattr: + {arg-type}`attr.string_list` + doc for attribute + ::: + :::: + ``` + """ + + doc_field_types = [ + _BzlField( + "os-dependent", + label="OS Dependent", + has_arg=False, + names=["os-dependent"], + ), + _BzlField( + "arch-dependent", + label="Arch Dependent", + has_arg=False, + names=["arch-dependent"], + ), + _BzlCsvField( + "environment-variables", + label=_("Environment Variables"), + names=["environment-variables"], + body_domain="std", + bodyrolename="envvar", + has_arg=False, + ), + ] + + @override + def _get_signature_object_type(self) -> str: + return "module ext" + + +class _BzlTagClass(_BzlCallable): + """Documents a tag class for a module extension. + + Doc fields: + * attr: Documents attributes of the tag class. Takes a single arg, the + attribute name. Can be repeated. The special roles `{default-value}` + and `{arg-type}` can be used to indicate the default value and + type of attribute, respectively. + + Example MyST usage, note that this directive should be nested with + a `bzl:module-extension` directive. + + ``` + :::{bzl:tag-class} mytag(myattr) + + :attr myattr: + {arg-type}`attr.string_list` + doc for attribute + ::: + ``` + """ + + doc_field_types = [ + _BzlGroupedField( + "arg", + label=_("Attributes"), + names=["attr"], + rolename="arg", + can_collapse=False, + ), + ] + + @override + def _get_signature_object_type(self) -> str: + return "" + + +class _TargetType(enum.Enum): + TARGET = "target" + FLAG = "flag" + + +class _BzlTarget(_BzlObject): + """Documents an arbitrary target.""" + + _TARGET_TYPE = _TargetType.TARGET + + def handle_signature(self, sig_text, sig_node): + self._signature_add_object_type(sig_node) + if ":" in sig_text: + package, target_name = sig_text.split(":", 1) + else: + target_name = sig_text + package = self.env.ref_context["bzl:file"] + package = package[: package.find(":BUILD")] + + package = package + ":" + if self._TARGET_TYPE == _TargetType.FLAG: + sig_node += addnodes.desc_addname("--", "--") + sig_node += addnodes.desc_addname(package, package) + sig_node += addnodes.desc_name(target_name, target_name) + + obj_id = _BzlObjectId.from_env(self.env, target=sig_text) + sig_node["bzl:object_id"] = obj_id.full_id + sig_node["bzl:index_display_name"] = f"{package}{target_name}" + return obj_id + + @override + def _get_signature_object_type(self) -> str: + # We purposely return empty here because having "target" in front + # of every label isn't very helpful + return "" + + +class _BzlFlag(_BzlTarget): + """Documents a flag""" + + _TARGET_TYPE = _TargetType.FLAG + + @override + def _get_signature_object_type(self) -> str: + return "flag" + + def _get_additional_index_types(self): + return ["target"] + + +class _DefaultValueRole(sphinx_docutils.SphinxRole): + """Documents the default value for an arg or attribute. + + This is a special role used within `:arg:` and `:attr:` doc fields to + indicate the default value. The rendering process looks for this role + and reformats and moves its content for better display. + + Styling can be customized by matching the `.default_value` class. + """ + + def run(self) -> _RoleRunResult: + node = docutils_nodes.emphasis( + "", + "(default ", + docutils_nodes.inline("", self.text, classes=["sig", "default_value"]), + docutils_nodes.Text(") "), + classes=["default-value-span"], + ) + return ([node], []) + + +class _TypeRole(sphinx_docutils.SphinxRole): + """Documents a type (or type expression) with crossreferencing. + + This is an inline role used to create cross references to other types. + + The content is interpreted as a reference to a type or an expression + of types. The syntax uses Python-style sytax with `|` and `[]`, e.g. + `foo.MyType | str | list[str] | dict[str, int]`. Each symbolic name + will be turned into a cross reference; see the domain's documentation + for how to reference objects. + + Example MyST usage: + + ``` + This function accepts {bzl:type}`str | list[str]` for usernames + ``` + """ + + def __init__(self): + super().__init__() + self._xref = roles.XRefRole() + + def run(self) -> _RoleRunResult: + outer_messages = [] + + def make_xref(name): + nodes, msgs = self._xref( + "bzl:type", + name, + name, + self.lineno, + self.inliner, + self.options, + self.content, + ) + outer_messages.extend(msgs) + if len(nodes) == 1: + return nodes[0] + else: + return docutils_nodes.inline("", "", nodes) + + root = _TypeExprParser.xrefs_from_type_expr(self.text, make_xref) + return ([root], outer_messages) + + +class _ReturnTypeRole(_TypeRole): + """Documents the return type for function. + + This is a special role used within `:returns:` doc fields to + indicate the return type of the function. The rendering process looks for + this role and reformats and moves its content for better display. + + Example MyST Usage + + ``` + :::{bzl:function} foo() + + :returns: {return-type}`list[str]` + ::: + ``` + """ + + def run(self) -> _RoleRunResult: + nodes, messages = super().run() + nodes.append(docutils_nodes.Text(" -- ")) + return nodes, messages + + +class _RequiredProvidersRole(_TypeRole): + """Documents the providers an attribute requires. + + This is a special role used within `:arg:` or `:attr:` doc fields to + indicate the types of providers that are required. The rendering process + looks for this role and reformats its content for better display, but its + position is left as-is; typically it would be its own paragraph near the + end of the doc. + + The syntax is a pipe (`|`) delimited list of types or groups of types, + where groups are indicated using `[...]`. e.g, to express that FooInfo OR + (both of BarInfo and BazInfo) are supported, write `FooInfo | [BarInfo, + BazInfo]` + + Example MyST Usage + + ``` + :::{bzl:rule} foo(bar) + + :attr bar: My attribute doc + + {required-providers}`CcInfo | [PyInfo, JavaInfo]` + ::: + ``` + """ + + def run(self) -> _RoleRunResult: + xref_nodes, messages = super().run() + nodes = [ + docutils_nodes.emphasis("", "Required providers: "), + ] + xref_nodes + return nodes, messages + + +class _BzlIndex(domains.Index): + """An index of a bzl file's objects. + + NOTE: This generates the entries for the *domain specific* index + (bzl-index.html), not the general index (genindex.html). To affect + the general index, index nodes and directives must be used (grep + for `self.indexnode`). + """ + + name = "index" + localname = "Bazel/Starlark Object Index" + shortname = "Bzl" + + def generate( + self, docnames: Iterable[str] = None + ) -> tuple[list[tuple[str, list[domains.IndexEntry]]], bool]: + content = collections.defaultdict(list) + + # sort the list of objects in alphabetical order + objects = self.domain.data["objects"].values() + objects = sorted(objects, key=lambda obj: obj.index_entry.name) + + # Group by first letter + for entry in objects: + index_entry = entry.index_entry + content[index_entry.name[0].lower()].append(index_entry) + + # convert the dict to the sorted list of tuples expected + content = sorted(content.items()) + + return content, True + + +class _BzlDomain(domains.Domain): + """Domain for Bazel/Starlark objects. + + Directives + + There are directives for defining Bazel objects and their functionality. + See the respective directive classes for details. + + Public Crossreferencing Roles + + These are roles that can be used in docs to create cross references. + + Objects are fully identified using dotted notation converted from the Bazel + label and symbol name within a `.bzl` file. The `@`, `/` and `:` characters + are converted to dots (with runs removed), and `.bzl` is removed from file + names. The dotted path of a symbol in the bzl file is appended. For example, + the `paths.join` function in `@bazel_skylib//lib:paths.bzl` would be + identified as `bazel_skylib.lib.paths.paths.join`. + + Shorter identifiers can be used. Within a project, the repo name portion + can be omitted. Within a file, file-relative names can be used. + + * obj: Used to reference a single object without concern for its type. + This roles searches all object types for a name that matches the given + value. Example usage in MyST: + ``` + {bzl:obj}`repo.pkg.file.my_function` + ``` + + * type: Transforms a type expression into cross references for objects + with object type "type". For example, it parses `int | list[str]` into + three links for each component part. + + Public Typography Roles + + These are roles used for special purposes to aid documentation. + + * default-value: The default value for an argument or attribute. Only valid + to use within arg or attribute documentation. See `_DefaultValueRole` for + details. + * required-providers: The providers an attribute requires. Only + valud to use within an attribute documentation. See + `_RequiredProvidersRole` for details. + * return-type: The type of value a function returns. Only valid + within a function's return doc field. See `_ReturnTypeRole` for details. + + Object Types + + These are the types of objects that this domain keeps in its index. + + * arg: An argument to a function or macro. + * aspect: A Bazel `aspect`. + * attribute: An input to a rule (regular, repository, aspect, or module + extension). + * method: A function bound to an instance of a struct acting as a type. + * module-extension: A Bazel `module_extension`. + * provider: A Bazel `provider`. + * provider-field: A field of a provider. + * repo-rule: A Bazel `repository_rule`. + * rule: A regular Bazel `rule`. + * tag-class: A Bazel `tag_class` of a `module_extension`. + * target: A Bazel target. + * type: A builtin Bazel type or user-defined structural type. User defined + structual types are typically instances `struct` created using a function + that acts as a constructor with implicit state bound using closures. + """ + + name = "bzl" + label = "Bzl" + + # NOTE: Most every object type has "obj" as one of the roles because + # an object type's role determine what reftypes can refer to it. By having + # "obj" for all of them, it allows writing :bzl:obj`foo` to restrict + # object searching to the bzl domain. Under the hood, this domain translates + # requests for the :any: role as lookups for :obj: + # NOTE: We also use these object types for categorizing things in the + # generated index page. + object_types = { + "arg": domains.ObjType("arg", "arg", "obj"), # macro/function arg + "aspect": domains.ObjType("aspect", "aspect", "obj"), + "attribute": domains.ObjType("attribute", "attribute", "obj"), # rule attribute + "function": domains.ObjType("function", "func", "obj"), + "method": domains.ObjType("method", "method", "obj"), + "module-extension": domains.ObjType( + "module extension", "module_extension", "obj" + ), + "provider": domains.ObjType("provider", "provider", "obj"), + "provider-field": domains.ObjType( + "provider field", "field", "obj" + ), # provider field + "repo-rule": domains.ObjType("repository rule", "repo_rule", "obj"), + "rule": domains.ObjType("rule", "rule", "obj"), + "tag-class": domains.ObjType("tag class", "tag_class", "obj"), + "target": domains.ObjType("target", "target", "obj"), # target in a build file + "flag": domains.ObjType( + "flag", "flag", "target", "obj" + ), # flag-target in a build file + # types are objects that have a constructor and methods/attrs + "type": domains.ObjType("type", "type", "obj"), + } + # This controls: + # * What is recognized when parsing, e.g. ":bzl:ref:`foo`" requires + # "ref" to be in the role dict below. + roles = { + "arg": roles.XRefRole(), + "attr": roles.XRefRole(), + "default-value": _DefaultValueRole(), + "obj": roles.XRefRole(), + "required-providers": _RequiredProvidersRole(), + "return-type": _ReturnTypeRole(), + "target": roles.XRefRole(), + "type": _TypeRole(), + } + # NOTE: Directives that have a corresponding object type should use + # the same key for both directive and object type. Some directives + # look up their corresponding object type. + directives = { + "aspect": _BzlAspect, + "currentfile": _BzlCurrentFile, + "function": _BzlFunction, + "module-extension": _BzlModuleExtension, + "provider": _BzlProvider, + "provider-field": _BzlProviderField, + "repo-rule": _BzlRepositoryRule, + "rule": _BzlRule, + "tag-class": _BzlTagClass, + "target": _BzlTarget, + "flag": _BzlFlag, + "attr-info": _BzlAttrInfo, + } + indices = { + _BzlIndex, + } + + # NOTE: When adding additional data keys, make sure to update + # merge_domaindata + initial_data = { + # All objects; keyed by full id + # dict[str, _ObjectEntry] + "objects": {}, + # dict[str, dict[str, _ObjectEntry]] + "objects_by_type": {}, + # Objects within each doc + # dict[str, dict[str, _ObjectEntry]] + "doc_names": {}, + # Objects by a shorter name + # dict[str, _ObjectEntry] + "alt_names": {}, + } + + @override + def get_full_qualified_name(self, node: docutils_nodes.Element) -> str | None: + bzl_file = node.get("bzl:file") + symbol_name = node.get("bzl:symbol") + ref_target = node.get("reftarget") + return ".".join(filter(None, [bzl_file, symbol_name, ref_target])) + + @override + def get_objects(self) -> Iterable[_GetObjectsTuple]: + for entry in self.data["objects"].values(): + yield entry.to_get_objects_tuple() + + @override + def resolve_any_xref( + self, + env: environment.BuildEnvironment, + fromdocname: str, + builder: builders.Builder, + target: str, + node: addnodes.pending_xref, + contnode: docutils_nodes.Element, + ) -> list[tuple[str, docutils_nodes.Element]]: + ref_node = self.resolve_xref( + env, fromdocname, builder, "obj", target, node, contnode + ) + matches = [(f"bzl:{entry.object_type}", ref_node)] + return matches + + @override + def resolve_xref( + self, + env: environment.BuildEnvironment, + fromdocname: str, + builder: builders.Builder, + typ: str, + target: str, + node: addnodes.pending_xref, + contnode: docutils_nodes.Element, + ) -> docutils_nodes.Element | None: + _log_debug( + "resolve_xref: fromdocname=%s, typ=%s, target=%s", fromdocname, typ, target + ) + del env, node # Unused + entry = self._find_entry_for_xref(fromdocname, typ, target) + if not entry: + return None + + to_docname = entry.index_entry.docname + to_anchor = entry.index_entry.anchor + return sphinx_nodes.make_refnode( + builder, fromdocname, to_docname, to_anchor, contnode, title=to_anchor + ) + + def _find_entry_for_xref( + self, fromdocname: str, object_type: str, target: str + ) -> _ObjectEntry | None: + # Normalize labels to dotted notation + target = ( + target.lstrip("@/:") + .replace("//", "/") + .replace(".bzl%", ".") + .replace("/", ".") + .replace(":", ".") + ) + if target in self.data["doc_names"].get(fromdocname, {}): + return self.data["doc_names"][fromdocname][target] + + if object_type == "obj": + search_space = self.data["objects"] + else: + search_space = self.data["objects_by_type"].get(object_type, {}) + if target in search_space: + return search_space[target] + + _log_debug("find_entry: alt_names=%s", sorted(self.data["alt_names"].keys())) + if target in self.data["alt_names"]: + return self.data["alt_names"][target] + + return None + + def add_object(self, entry: _ObjectEntry, alt_names=None) -> None: + _log_debug( + "add_object: full_id=%s, object_type=%s, alt_names=%s", + entry.full_id, + entry.object_type, + alt_names, + ) + if entry.full_id in self.data["objects"]: + raise Exception(f"Object {entry.full_id} already registered") + self.data["objects"][entry.full_id] = entry + self.data["objects_by_type"].setdefault(entry.object_type, {}) + self.data["objects_by_type"][entry.object_type][entry.full_id] = entry + + base_name = entry.full_id.split(".")[-1] + + without_repo = entry.full_id.split(".", 1)[1] + + if alt_names is not None: + alt_names = list(alt_names) + alt_names.append(without_repo) + + for alt_name in alt_names: + if alt_name in self.data["alt_names"]: + existing = self.data["alt_names"][alt_name] + # This situation usually occurs for the constructor function + # of a provider, but could occur for e.g. an exported struct + # with an attribute the same name as the struct. For lack + # of a better option, take the shorter entry, on the assumption + # it refers to some container of the longer entry. + if len(entry.full_id) < len(existing.full_id): + self.data["alt_names"][alt_name] = entry + else: + self.data["alt_names"][alt_name] = entry + + docname = entry.index_entry.docname + self.data["doc_names"].setdefault(docname, {}) + self.data["doc_names"][docname][base_name] = entry + + def merge_domaindata( + self, docnames: list[str], otherdata: dict[str, typing.Any] + ) -> None: + # Merge in simple dict[key, value] data + for top_key in ("objects", "alt_names"): + self.data[top_key].update(otherdata.get(top_key, {})) + + # Merge in two-level dict[top_key, dict[sub_key, value]] data + for top_key in ("objects_by_type", "doc_names"): + existing_top_map = self.data[top_key] + for sub_key, sub_values in otherdata.get(top_key, {}).items(): + if sub_key not in existing_top_map: + existing_top_map[sub_key] = sub_values + else: + existing_top_map[sub_key].update(sub_values) + + +def _on_missing_reference(app, env: environment.BuildEnvironment, node, contnode): + if node["refdomain"] != "bzl": + return None + if node["reftype"] != "type": + return None + + # There's no Bazel docs for None, so prevent missing xrefs warning + if node["reftarget"] == "None": + return contnode + return None + + +def setup(app): + app.add_domain(_BzlDomain) + + app.add_config_value( + "bzl_default_repository_name", + default=os.environ.get("SPHINX_BZL_DEFAULT_REPOSITORY_NAME", "@_main"), + rebuild="env", + types=[str], + ) + app.connect("missing-reference", _on_missing_reference) + + # Pygments says it supports starlark, but it doesn't seem to actually + # recognize `starlark` as a name. So just manually map it to python. + app.add_lexer("starlark", lexer_classes["python"]) + app.add_lexer("bzl", lexer_classes["python"]) + + return { + "version": "1.0.0", + "parallel_read_safe": True, + "parallel_write_safe": True, + } diff --git a/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel b/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel new file mode 100644 index 0000000000..5cf5736afa --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel @@ -0,0 +1,37 @@ +load("//sphinxdocs:sphinx.bzl", "sphinx_build_binary", "sphinx_docs") + +sphinx_docs( + name = "docs", + srcs = glob( + include = [ + "*.md", + ], + ), + config = "conf.py", + formats = [ + "html", + ], + renamed_srcs = { + "//docs/sphinx:bazel_inventory": "bazel_inventory.inv", + }, + sphinx = ":sphinx-build", + strip_prefix = package_name() + "/", + # We only develop the docs using Linux/Mac, and there are deps that + # don't work for Windows, so just skip Windows. + target_compatible_with = select({ + "@platforms//os:linux": [], + "@platforms//os:macos": [], + "//conditions:default": ["@platforms//:incompatible"], + }), +) + +sphinx_build_binary( + name = "sphinx-build", + tags = ["manual"], # Only needed as part of sphinx doc building + deps = [ + "//sphinxdocs/src/sphinx_stardoc", + "@dev_pip//myst_parser", + "@dev_pip//sphinx", + "@dev_pip//typing_extensions", # Needed by sphinx_stardoc + ], +) diff --git a/sphinxdocs/tests/sphinx_stardoc/aspect.md b/sphinxdocs/tests/sphinx_stardoc/aspect.md new file mode 100644 index 0000000000..3c49903b03 --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/aspect.md @@ -0,0 +1,22 @@ +:::{default-domain} bzl +::: + +:::{bzl:currentfile} //lang:aspect.bzl +::: + + +# Aspect + +:::{bzl:aspect} myaspect + +:attr aa1: + {bzl:default-value}`True` + {type}`bool` + aa1 doc +:attr aa2: + {type}`str` + aa2 doc + +:aspect-attributes: edge1, edge2, deps, ra1 +::: + diff --git a/sphinxdocs/tests/sphinx_stardoc/conf.py b/sphinxdocs/tests/sphinx_stardoc/conf.py new file mode 100644 index 0000000000..b1dae97759 --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/conf.py @@ -0,0 +1,33 @@ +# 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 Stardoc Test" + +extensions = [ + "sphinx_stardoc.stardoc", + "myst_parser", + "sphinx.ext.intersphinx", +] + +myst_enable_extensions = [ + "fieldlist", + "attrs_block", + "attrs_inline", + "colon_fence", + "deflist", + "substitution", +] + +# --- Stardoc configuration + +bzl_default_repository_name = "@testrepo" + +# --- Intersphinx configuration + +intersphinx_mapping = { + "bazel": ("https://bazel.build/", "bazel_inventory.inv"), +} diff --git a/sphinxdocs/tests/sphinx_stardoc/envvars.md b/sphinxdocs/tests/sphinx_stardoc/envvars.md new file mode 100644 index 0000000000..d6bcc1bc7a --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/envvars.md @@ -0,0 +1,9 @@ +# Environment Variables + +These are just defined so the repo rules have a xref target. + +.. envvar:: FOO + The foo environment variable + +.. envvar:: BAR + The bar environment variable diff --git a/sphinxdocs/tests/sphinx_stardoc/function.md b/sphinxdocs/tests/sphinx_stardoc/function.md new file mode 100644 index 0000000000..b8cbd3727e --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/function.md @@ -0,0 +1,41 @@ +:::{default-domain} bzl +::: + +:::{bzl:currentfile} //lang:function.bzl +::: + + +# Function + +Module documentation + +:::{bzl:function} myfunc(foo, bar=False, baz=[]) -> FooObj + +This is a bazel function. + +:arg arg1: + {default-value}`99` + {type}`bool | int` + arg1 doc + +:arg arg2: + {default-value}`True` + {type}`dict[str, str]` my arg2 doc + + and a second paragraph of text here +:arg arg3: + {default-value}`"arg3default"` + {type}`list[int]` + my arg3 doc +:arg arg4: + my arg4 doc + +:returns: + {bzl:return-type}`list | int` + description + +::: + +:::{bzl:function} mylongfunc(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) + +::: diff --git a/sphinxdocs/tests/sphinx_stardoc/glossary.md b/sphinxdocs/tests/sphinx_stardoc/glossary.md new file mode 100644 index 0000000000..b3c07217f4 --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/glossary.md @@ -0,0 +1,8 @@ +# Glossary + +:::{glossary} + +customterm +: A custom term definition + +::: diff --git a/sphinxdocs/tests/sphinx_stardoc/index.md b/sphinxdocs/tests/sphinx_stardoc/index.md new file mode 100644 index 0000000000..4f70482e19 --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/index.md @@ -0,0 +1,26 @@ +# Sphinx Stardoc Test + +This is a set of documents to test the sphinx_stardoc extension. + +To build and view these docs, run: + +``` +bazel run //sphinxdocs/tests/sphinx_stardoc:docs.serve +``` + +This will build the docs and start an HTTP server where they can be viewed. + +To aid the edit/debug cycle, `ibazel` can be used to automatically rebuild +the HTML: + +``` +ibazel build //sphinxdocs/tests/sphinx_stardoc:docs +``` + +:::{toctree} +:hidden: +:glob: + +* +genindex +::: diff --git a/sphinxdocs/tests/sphinx_stardoc/module_extension.md b/sphinxdocs/tests/sphinx_stardoc/module_extension.md new file mode 100644 index 0000000000..033538654a --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/module_extension.md @@ -0,0 +1,20 @@ +:::{default-domain} bzl +::: + +:::{bzl:currentfile} //lang:extension.bzl +::: + + +# Module extension +::::{bzl:module-extension} myext + +:::{bzl:tag-class} mytag(ta1, ta2) + +:attr ta1: + {type}`attr.string_list` + ta1 doc +:attr ta2: + {type}`attr.label_list` + ta2 doc +::: +:::: diff --git a/sphinxdocs/tests/sphinx_stardoc/provider.md b/sphinxdocs/tests/sphinx_stardoc/provider.md new file mode 100644 index 0000000000..dac16f0d2c --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/provider.md @@ -0,0 +1,34 @@ +:::{default-domain} bzl +::: + +:::{bzl:currentfile} //lang:provider.bzl +::: + + +# Provider + +below is a provider + +::::{bzl:provider} LangInfo + +my provider doc + +:::{bzl:function} LangInfo(mi1, mi2=None) + +:arg ami1: + {type}`depset[str]` + mi1 doc +:arg ami2: ami2 doc + {type}`None | depset[File]` +::: + +:::{bzl:provider-field} mi1 +:type: depset[str] + +The doc for mi1 +::: + +:::{bzl:provider-field} mi2 +:type: str +::: +:::: diff --git a/sphinxdocs/tests/sphinx_stardoc/repo_rule.md b/sphinxdocs/tests/sphinx_stardoc/repo_rule.md new file mode 100644 index 0000000000..0a909d6e60 --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/repo_rule.md @@ -0,0 +1,19 @@ +:::{default-domain} bzl +::: + +:::{bzl:currentfile} //lang:repo_rule.bzl +::: + + +# Repo rule + +below is a repository rule + +:::{bzl:repo-rule} myreporule(rra1, rra2) + +:attr rra1: rra1 doc +:attr rra2: rra2 doc + +:envvars: FOO, BAR + +::: diff --git a/sphinxdocs/tests/sphinx_stardoc/rule.md b/sphinxdocs/tests/sphinx_stardoc/rule.md new file mode 100644 index 0000000000..a6f3a56b98 --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/rule.md @@ -0,0 +1,34 @@ +:::{default-domain} bzl +::: + +:::{bzl:currentfile} //lang:rule.bzl +::: + + +# Rule + +Here is some module documentation + +Next, we're going to document some rules. + +::::{bzl:rule} my_rule(ra1, ra2=3) + +:attr ra1: + {bzl:default-value}`//foo:bar` + {type}`attr.label` + Docs for attribute ra1. + + :::{bzl:attr-info} Info + :executable: true + :mandatory: true + ::: + + {required-providers}`LangInfo | [OtherLangInfo, AnotherLangInfo]` + +:attr ra2: + {type}`attr.label` + Docs for attribute ra2 + +:provides: LangInfo + +:::: diff --git a/sphinxdocs/tests/sphinx_stardoc/target.md b/sphinxdocs/tests/sphinx_stardoc/target.md new file mode 100644 index 0000000000..447a5ac375 --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/target.md @@ -0,0 +1,23 @@ +:::{default-domain} bzl +::: + +:::{bzl:currentfile} //lang:BUILD.bazel +::: + +# Target + +Here is some package documentation + +:::{bzl:target} relativetarget + +Some doc about relativetarget + +::: + +:::{bzl:target} //absolute:abstarget + +::: + +:::{bzl:flag} myflag + +::: diff --git a/sphinxdocs/tests/sphinx_stardoc/xrefs.md b/sphinxdocs/tests/sphinx_stardoc/xrefs.md new file mode 100644 index 0000000000..f0ea038b3d --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/xrefs.md @@ -0,0 +1,50 @@ +:::{default-domain} bzl +::: + +# Xrefs + +Various tests of cross referencing support + +## Short name + +* function: {obj}`myfunc` +* function arg: {obj}`myfunc.arg1` +* rule: {obj}`my_rule` +* rule attr: {obj}`my_rule.ra1` +* provider: {obj}`LangInfo` + +## Fully qualified label without repo + +* function: {obj}`//lang:function.bzl%myfunc` +* function arg: {obj}`//lang:function.bzl%myfunc.arg1` +* rule: {obj}`//lang:rule.bzl%my_rule` +* function: {obj}`//lang:rule.bzl%my_rule.ra1` +* provider: {obj}`//lang:provider.bzl%LangInfo` +* aspect: {obj}`//lang:aspect.bzl%myaspect` +* target: {obj}`//lang:relativetarget` + +## Fully qualified label with repo + +* function: {obj}`@testrepo//lang:function.bzl%myfunc` +* function arg: {obj}`@testrepo//lang:function.bzl%myfunc.arg1` +* rule: {obj}`@testrepo//lang:rule.bzl%my_rule` +* function: {obj}`@testrepo//lang:rule.bzl%my_rule.ra1` +* provider: {obj}`@testrepo//lang:provider.bzl%LangInfo` +* aspect: {obj}`@testrepo//lang:aspect.bzl%myaspect` +* target: {obj}`@testrepo//lang:relativetarget` + +## Fully qualified dotted name with repo + +* function: {obj}`testrepo.lang.function.myfunc` +* function arg: {obj}`testrepo.lang.function.myfunc.arg1` +* rule: {obj}`testrepo.lang.rule.my_rule` +* function: {obj}`testrepo.lang.rule.my_rule.ra1` +* provider: {obj}`testrepo.lang.provider.LangInfo` + +## Fully qualified dotted name without repo + +* function: {obj}`lang.function.myfunc` +* function arg: {obj}`lang.function.myfunc.arg1` +* rule: {obj}`lang.rule.my_rule` +* rule attr: {obj}`lang.rule.my_rule.ra1` +* provider: {obj}`lang.provider.LangInfo` From 6ca2f58bedca519f5ea6431ad7e11aaac84415c0 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 23 May 2024 20:44:47 -0700 Subject: [PATCH 043/345] docs: generate Starlark domain markup instead of regular markdown (#1919) This switches our doc generation over to using the Starlark domain markup from the sphinx_stardoc plugin instead of using regular markdown. This allows the docs generated from code to better integrate with each other and other parts of the doc site. Overview of changes: * Makes the doc paths under the API directory more directly mirror their actual location. e.g. moves "defs.md" -> "python/defs.md". This is so the //tools doc entries have a more natural location, but can also be used for our other top-level directories. * Adds API docs for some of the well known targets we have. These aren't automatically generated, but use the Starlark domain markup, so integrate nicely with everything. * Ensures default values are parsable as Python expressions. Stardoc returns values like "" or 'Label(*, "//bar")' in some cases for the default value of args/attrs. * Ensures function signatures don't crash doc rendering. Stardoc gives bad/incomplete information, so reconstructing the original signature of a function is tricky. * Allows references flags using leading slashes and a value, e.g. `--foo=bar`. This makes it more natural to write while cross referencing to the flag. * Implements `{any}` xref resolution. It was just totally broken before. * Adds some additional bzl files that get documented. * Adds some more Bazel external references. * Fixes some missing bzl_library dependencies. * A few minor QoL improvements to the docs dev server: * Print the serving directory when CTRL+C is received. This makes it easier to find the raw files that are being generated. * Fix an error during shutdown about an unterminated generator. * The `sphinx_stardocs.footer` arg is removed. This was always just a hack to get extra link targets into the generated bzl docs. It's no longer needed when the bzl domain is used. * Using `@repo//pkg:file.bzl%Name` syntax is supported in type expressions (e.g. `:type:` option or `{type}` role) by quoting the label. The quoting is necessary because, under the hood, the expressions are parsed as Python. * Objects directives support an `:origin-key` directive. This records the label identity that Bazel sees for an object (as from the Stardoc origin_key field). The markdown generate doesn't generate this for everything yet because some things are documented twice (e.g. py_binary in defs.bzl and py_binary.bzl), which would cause a crash (type things trying to define the same id). * Add `*` and `**` to var-args and var-kwargs in signatures. * Allow providers to be refered to using the `type` role. This allows providers to be referenced in `:type:` directives (e.g. in a provider field). --- docs/sphinx/BUILD.bazel | 32 +- .../api/python/config_settings/index.md | 68 +++ docs/sphinx/api/python/index.md | 23 + docs/sphinx/api/tools/precompiler/index.md | 15 + docs/sphinx/bazel_inventory.txt | 2 + docs/sphinx/conf.py | 5 + docs/sphinx/precompiling.md | 11 +- python/BUILD.bazel | 5 + python/private/common/providers.bzl | 166 ++++--- python/private/py_cc_toolchain_info.bzl | 14 +- python/private/py_runtime_pair_rule.bzl | 13 +- sphinxdocs/private/proto_to_markdown.py | 470 +++++++++--------- sphinxdocs/private/sphinx_server.py | 40 +- sphinxdocs/private/sphinx_stardoc.bzl | 11 +- sphinxdocs/src/sphinx_stardoc/stardoc.py | 159 ++++-- .../tests/proto_to_markdown/BUILD.bazel | 2 + .../proto_to_markdown_test.py | 49 +- sphinxdocs/tests/sphinx_stardoc/BUILD.bazel | 31 +- .../tests/sphinx_stardoc/bzl_function.bzl | 34 ++ .../tests/sphinx_stardoc/bzl_providers.bzl | 4 + sphinxdocs/tests/sphinx_stardoc/bzl_rule.bzl | 24 + sphinxdocs/tests/sphinx_stardoc/function.md | 7 +- sphinxdocs/tests/sphinx_stardoc/rule.md | 2 +- sphinxdocs/tests/sphinx_stardoc/xrefs.md | 8 + 24 files changed, 792 insertions(+), 403 deletions(-) create mode 100644 docs/sphinx/api/python/config_settings/index.md create mode 100644 docs/sphinx/api/python/index.md create mode 100644 docs/sphinx/api/tools/precompiler/index.md create mode 100644 sphinxdocs/tests/sphinx_stardoc/bzl_function.bzl create mode 100644 sphinxdocs/tests/sphinx_stardoc/bzl_providers.bzl create mode 100644 sphinxdocs/tests/sphinx_stardoc/bzl_rule.bzl diff --git a/docs/sphinx/BUILD.bazel b/docs/sphinx/BUILD.bazel index e3b9ad3f96..c2a1690ff3 100644 --- a/docs/sphinx/BUILD.bazel +++ b/docs/sphinx/BUILD.bazel @@ -30,7 +30,7 @@ _TARGET_COMPATIBLE_WITH = select({ "@platforms//os:linux": [], "@platforms//os:macos": [], "//conditions:default": ["@platforms//:incompatible"], -}) +}) if IS_BAZEL_7_OR_HIGHER else ["@platforms//:incompatible"] # See README.md for instructions. Short version: # * `bazel run //docs/sphinx:docs.serve` in a separate terminal @@ -76,24 +76,34 @@ sphinx_inventory( sphinx_stardocs( name = "bzl_api_docs", docs = { - "api/cc/py_cc_toolchain.md": dict( + "api/python/cc/py_cc_toolchain.md": dict( dep = "//python/private:py_cc_toolchain_bzl", input = "//python/private:py_cc_toolchain_rule.bzl", public_load_path = "//python/cc:py_cc_toolchain.bzl", ), - "api/cc/py_cc_toolchain_info.md": "//python/cc:py_cc_toolchain_info_bzl", - "api/defs.md": "//python:defs_bzl", - "api/entry_points/py_console_script_binary.md": "//python/entry_points:py_console_script_binary_bzl", - "api/packaging.md": "//python:packaging_bzl", - "api/pip.md": "//python:pip_bzl", + "api/python/cc/py_cc_toolchain_info.md": "//python/cc:py_cc_toolchain_info_bzl", + "api/python/defs.md": "//python:defs_bzl", + "api/python/entry_points/py_console_script_binary.md": "//python/entry_points:py_console_script_binary_bzl", + "api/python/packaging.md": "//python:packaging_bzl", + "api/python/pip.md": "//python:pip_bzl", + "api/python/py_binary.md": "//python:py_binary_bzl", + "api/python/py_cc_link_params_info.md": "//python:py_cc_link_params_info_bzl", + "api/python/py_library.md": "//python:py_library_bzl", + "api/python/py_runtime.md": "//python:py_runtime_bzl", + "api/python/py_runtime_info.md": "//python:py_runtime_info_bzl", + "api/python/py_runtime_pair.md": dict( + dep = "//python/private:py_runtime_pair_rule_bzl", + input = "//python/private:py_runtime_pair_rule.bzl", + public_load_path = "//python:py_runtime_pair.bzl", + ), + "api/python/py_test.md": "//python:py_test_bzl", } | ({ # Bazel 6 + Stardoc isn't able to parse something about the python bzlmod extension - "api/extensions/python.md": "//python/extensions:python_bzl", + "api/python/extensions/python.md": "//python/extensions:python_bzl", } if IS_BAZEL_7_OR_HIGHER else {}) | ({ # This depends on @pythons_hub, which is only created under bzlmod, - "api/extensions/pip.md": "//python/extensions:pip_bzl", + "api/python/extensions/pip.md": "//python/extensions:pip_bzl", } if IS_BAZEL_7_OR_HIGHER and BZLMOD_ENABLED else {}), - footer = "_stardoc_footer.md", tags = ["docs"], target_compatible_with = _TARGET_COMPATIBLE_WITH, ) @@ -112,6 +122,8 @@ sphinx_build_binary( requirement("sphinx_rtd_theme"), requirement("myst_parser"), requirement("readthedocs_sphinx_ext"), + requirement("typing_extensions"), + "//sphinxdocs/src/sphinx_stardoc", ], ) diff --git a/docs/sphinx/api/python/config_settings/index.md b/docs/sphinx/api/python/config_settings/index.md new file mode 100644 index 0000000000..82a5b2a520 --- /dev/null +++ b/docs/sphinx/api/python/config_settings/index.md @@ -0,0 +1,68 @@ +:::{bzl:currentfile} //python/config_settings:BUILD.bazel +::: + +# //python/config_settings + +:::{bzl:flag} precompile +Determines if Python source files should be compiled at build time. + +NOTE: The flag value is overridden by the target level `precompile` attribute, +except for the case of `force_enabled` and `forced_disabled`. + +Values: + +* `auto`: Automatically decide the effective value based on environment, + target platform, etc. +* `enabled`: Compile Python source files at build time. Note that + {bzl:obj}`--precompile_add_to_runfiles` affects how the compiled files are included into + a downstream binary. +* `disabled`: Don't compile Python source files at build time. +* `if_generated_source`: Compile Python source files, but only if they're a + generated file. +* `force_enabled`: Like `enabled`, except overrides target-level setting. This + is mostly useful for development, testing enabling precompilation more + broadly, or as an escape hatch if build-time compiling is not available. +* `force_disabled`: Like `disabled`, except overrides target-level setting. This + is useful useful for development, testing enabling precompilation more + broadly, or as an escape hatch if build-time compiling is not available. +::: + +:::{bzl:flag} precompile_source_retention +Determines, when a source file is compiled, if the source file is kept +in the resulting output or not. + +NOTE: This flag is overridden by the target level `precompile_source_retention` +attribute. + +Values: + +* `keep_source`: Include the original Python source. +* `omit_source`: Don't include the orignal py source. +* `omit_if_generated_source`: Keep the original source if it's a regular source + file, but omit it if it's a generated file. +::: + +:::{bzl:flag} precompile_add_to_runfiles +Determines if a target adds its compiled files to its runfiles. + +When a target compiles its files, but doesn't add them to its own runfiles, it +relies on a downstream target to retrieve them from +{bzl:obj}`PyInfo.transitive_pyc_files` + +Values: +* `always`: Always include the compiled files in the target's runfiles. +* `decided_elsewhere`: Don't include the compiled files in the target's + runfiles; they are still added to {bzl:obj}`PyInfo.transitive_pyc_files`. See + also: {bzl:obj}`py_binary.pyc_collection` attribute. This is useful for allowing + incrementally enabling precompilation on a per-binary basis. +::: + +:::{bzl:flag} pyc_collection +Determine if `py_binary` collects transitive pyc files. + +NOTE: This flag is overridden by the target level `pyc_collection` attribute. + +Values: +* `include_pyc`: Include `PyInfo.transitive_pyc_files` as part of the binary. +* `disabled`: Don't include `PyInfo.transitive_pyc_files` as part of the binary. +::: diff --git a/docs/sphinx/api/python/index.md b/docs/sphinx/api/python/index.md new file mode 100644 index 0000000000..8026a7f145 --- /dev/null +++ b/docs/sphinx/api/python/index.md @@ -0,0 +1,23 @@ +:::{bzl:currentfile} //python:BUILD.bazel +::: + +# //python + +:::{bzl:target} toolchain_type + +Identifier for the toolchain type for the target platform. +::: + +:::{bzl:target} exec_tools_toolchain_type + +Identifier for the toolchain type for exec tools used to build Python targets. +::: + +:::{bzl:target} current_py_toolchain + +Helper target to resolve to the consumer's current Python toolchain. This target +provides: + +* `PyRuntimeInfo`: The consuming target's target toolchain information + +::: diff --git a/docs/sphinx/api/tools/precompiler/index.md b/docs/sphinx/api/tools/precompiler/index.md new file mode 100644 index 0000000000..1a47651592 --- /dev/null +++ b/docs/sphinx/api/tools/precompiler/index.md @@ -0,0 +1,15 @@ +:::{bzl:currentfile} //tools/precompiler:BUILD.bazel +::: + +# //tools/precompiler + +:::{bzl:flag} execution_requirements +Determines the execution requirements `//tools/precompiler:precompiler` uses. + +This is a repeatable string_list flag. The values are `key=value` entries, each +of which are added to the execution requirements for the `PyCompile` action to +generate pyc files. + +Customizing this flag mostly allows controlling whether Bazel runs the +precompiler as a regular worker, persistent worker, or regular action. +::: diff --git a/docs/sphinx/bazel_inventory.txt b/docs/sphinx/bazel_inventory.txt index b099f42704..62cbdf8926 100644 --- a/docs/sphinx/bazel_inventory.txt +++ b/docs/sphinx/bazel_inventory.txt @@ -22,3 +22,5 @@ python bzl:doc 1 reference/be/python - str bzl:type 1 rules/lib/string - struct bzl:type 1 rules/lib/builtins/struct - target-name bzl:doc 1 concepts/labels#target-names - +CcInfo bzl:provider 1 rules/lib/providers/CcInfo - +CcInfo.linking_context bzl:provider-field 1 rules/lib/providers/CcInfo#linking_context - diff --git a/docs/sphinx/conf.py b/docs/sphinx/conf.py index e9af97aa6e..fef083cb53 100644 --- a/docs/sphinx/conf.py +++ b/docs/sphinx/conf.py @@ -27,6 +27,7 @@ "sphinx.ext.intersphinx", "myst_parser", "sphinx_rtd_theme", # Necessary to get jquery to make flyout work + "sphinx_stardoc.stardoc", ] # Adapted from the template code: @@ -89,6 +90,10 @@ myst_substitutions = {} +# --- sphinx_stardoc configuration + +bzl_default_repository_name = "@rules_python" + # -- Options for HTML output # See https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output # For additional html settings diff --git a/docs/sphinx/precompiling.md b/docs/sphinx/precompiling.md index e30fc947ad..52678e63ea 100644 --- a/docs/sphinx/precompiling.md +++ b/docs/sphinx/precompiling.md @@ -29,14 +29,15 @@ incrementally control precompiling on a per-binry basis. To use this approach, the two basic steps are: 1. Disable pyc files from being automatically added to runfiles: - `--@rules_python//python/config_settings:precompile_add_to_runfiles=decided_elsewhere`, + {bzl:obj}`--@rules_python//python/config_settings:precompile_add_to_runfiles=decided_elsewhere`, 2. Set the `pyc_collection` attribute on the binaries/tests that should or should not use precompiling. -The default for the `pyc_collection` attribute is controlled by a flag, so you -can use an opt-in or opt-out approach by setting the flag: -* targets must opt-out: `--@rules_python//python/config_settings:pyc_collection=include_pyc`, -* targets must opt-in: `--@rules_python//python/config_settings:pyc_collection=disabled`, +The default for the `pyc_collection` attribute is controlled by the flag +{bzl:obj}`--@rules_python//python/config_settings:pyc_collection`, so you +can use an opt-in or opt-out approach by setting its value: +* targets must opt-out: `--@rules_python//python/config_settings:pyc_collection=include_pyc` +* targets must opt-in: `--@rules_python//python/config_settings:pyc_collection=disabled` ## Advanced precompiler customization diff --git a/python/BUILD.bazel b/python/BUILD.bazel index 3ab390df8a..5d31df5e9a 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -130,6 +130,10 @@ bzl_library( bzl_library( name = "py_cc_link_params_info_bzl", srcs = ["py_cc_link_params_info.bzl"], + deps = [ + "//python/private/common:providers_bzl", + "@rules_python_internal//:rules_python_config_bzl", + ], ) bzl_library( @@ -185,6 +189,7 @@ bzl_library( "//python/private:reexports_bzl", "//python/private:util_bzl", "//python/private/common:providers_bzl", + "@rules_python_internal//:rules_python_config_bzl", ], ) diff --git a/python/private/common/providers.bzl b/python/private/common/providers.bzl index ab56fbef4d..5b84549185 100644 --- a/python/private/common/providers.bzl +++ b/python/private/common/providers.bzl @@ -144,63 +144,86 @@ the same conventions as the standard CPython interpreter. """, init = _PyRuntimeInfo_init, fields = { - "bootstrap_template": ( - "See py_runtime_rule.bzl%py_runtime.bootstrap_template for docs." - ), - "coverage_files": ( - "The files required at runtime for using `coverage_tool`. " + - "Will be `None` if no `coverage_tool` was provided." - ), - "coverage_tool": ( - "If set, this field is a `File` representing tool used for collecting code coverage information from python tests. Otherwise, this is `None`." - ), - "files": ( - "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": "Optional string; the Python implementation name (`sys.implementation.name`)", - "interpreter": ( - "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": ( - "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": ( - "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:\n" + - " * major: int, the major version number\n" + - " * minor: int, the minor version number\n" + - " * micro: optional int, the micro version number\n" + - " * releaselevel: optional str, the release level\n" + - " * serial: optional int, the serial number of the release" - ), + "bootstrap_template": """ +:type: File + +See py_runtime_rule.bzl%py_runtime.bootstrap_template for docs. +""", + "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": """ -Optional string; the tag portion of a pyc filename, e.g. the `cpython-39` infix +: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 `implementation_name` and `interpreter_version_info`. If no pyc_tag is -available, then only source-less pyc generation will function correctly. +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"`. +""", + "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. """, - "python_version": ( - "Indicates whether this runtime uses Python major version 2 or 3. " + - "Valid values are (only) `\"PY2\"` and " + - "`\"PY3\"`." - ), - "stub_shebang": ( - "\"Shebang\" expression prepended to the bootstrapping Python stub " + - "script used when executing `py_binary` targets. Does not " + - "apply to Windows." - ), }, ) @@ -248,26 +271,43 @@ PyInfo, _unused_raw_py_info_ctor = _define_provider( init = _PyInfo_init, fields = { "direct_pyc_files": """ -depset[File] of precompiled Python files that are considered directly provided +:type: depset[File] + +Precompiled Python files that are considered directly provided by the target. """, - "has_py2_only_sources": "Whether any of this target's transitive sources requires a Python 2 runtime.", - "has_py3_only_sources": "Whether any of this target's transitive sources requires a Python 3 runtime.", + "has_py2_only_sources": """ +:type: bool + +Whether any of this target's transitive sources requires a Python 2 runtime. +""", + "has_py3_only_sources": """ +:type: bool + +Whether any of this target's transitive sources requires a Python 3 runtime. +""", "imports": """\ +:type: depset[str] + A depset of import path strings to be added to the `PYTHONPATH` of executable Python targets. These are accumulated from the transitive `deps`. The order of the depset is not guaranteed and may be changed in the future. It is recommended to use `default` order (the default). """, "transitive_pyc_files": """ -depset[File] of direct and transitive precompiled Python files that are provied -by the target. +:type: depset[File] + +Direct and transitive precompiled Python files that are provided by the target. """, "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`. """, "uses_shared_libraries": """ +:type: bool + Whether any of this target's transitive `deps` has a shared library file (such as a `.so` file). @@ -283,11 +323,15 @@ def _PyCcLinkParamsProvider_init(cc_info): # buildifier: disable=name-conventions PyCcLinkParamsProvider, _unused_raw_py_cc_link_params_provider_ctor = _define_provider( - doc = ("Python-wrapper to forward CcInfo.linking_context. This is to " + + doc = ("Python-wrapper to forward {obj}`CcInfo.linking_context`. This is to " + "allow Python targets to propagate C++ linking information, but " + "without the Python target appearing to be a valid C++ rule dependency"), init = _PyCcLinkParamsProvider_init, fields = { - "cc_info": "A CcInfo instance; it has only linking_context set", + "cc_info": """ +:type: CcInfo + +Linking information; it has only {obj}`CcInfo.linking_context` set. +""", }, ) diff --git a/python/private/py_cc_toolchain_info.bzl b/python/private/py_cc_toolchain_info.bzl index a47a6a560d..ae46bf4d4d 100644 --- a/python/private/py_cc_toolchain_info.bzl +++ b/python/private/py_cc_toolchain_info.bzl @@ -18,7 +18,9 @@ PyCcToolchainInfo = provider( doc = "C/C++ information about the Python runtime.", fields = { "headers": """\ -(struct) Information about the header files, with fields: +:type: struct + +Information about the header files, struct with fields: * providers_map: a dict of string to provider instances. The key should be a fully qualified name (e.g. `@rules_foo//bar:baz.bzl#MyInfo`) of the provider to uniquely identify its type. @@ -39,7 +41,9 @@ PyCcToolchainInfo = provider( represents). """, "libs": """\ -(struct) Information about C libraries, with fields: +:type: struct + +Information about C libraries, struct with fields: * providers_map: A dict of string to provider instances. The key should be a fully qualified name (e.g. `@rules_foo//bar:baz.bzl#MyInfo`) of the provider to uniquely identify its type. @@ -59,6 +63,10 @@ PyCcToolchainInfo = provider( e.g. `:current_py_cc_headers` to act as the underlying headers target it represents). """, - "python_version": "(str) The Python Major.Minor version.", + "python_version": """ +:type: str + +The Python Major.Minor version. +""", }, ) diff --git a/python/private/py_runtime_pair_rule.bzl b/python/private/py_runtime_pair_rule.bzl index d17b008676..02f9a5ba89 100644 --- a/python/private/py_runtime_pair_rule.bzl +++ b/python/private/py_runtime_pair_rule.bzl @@ -98,15 +98,12 @@ unusable for building Python code using that version. Usually the wrapped runtimes are declared using the `py_runtime` rule, but any rule returning a `PyRuntimeInfo` provider may be used. -This rule returns a `platform_common.ToolchainInfo` provider with the following -schema: +This rule returns a {obj}`ToolchainInfo` provider with fields: -```python -platform_common.ToolchainInfo( - py2_runtime = , - py3_runtime = , -) -``` +* `py2_runtime`: {type}`PyRuntimeInfo | None`, runtime information for a + Python 2 runtime. +* `py3_runtime`: {type}`PyRuntimeInfo | None`. runtime information for a + Python 3 runtime. Example usage: diff --git a/sphinxdocs/private/proto_to_markdown.py b/sphinxdocs/private/proto_to_markdown.py index 18d4e1e045..d667eeca00 100644 --- a/sphinxdocs/private/proto_to_markdown.py +++ b/sphinxdocs/private/proto_to_markdown.py @@ -80,6 +80,12 @@ def _position_iter(values: list[_T]) -> tuple[bool, bool, _T]: yield i == 0, i == len(values) - 1, value +def _sort_attributes_inplace(attributes): + # Sort attributes so the iteration order results in a Python-syntax + # valid signature. Keep name first because that's convention. + attributes.sort(key=lambda a: (a.name != "name", bool(a.default_value), a.name)) + + class _MySTRenderer: def __init__( self, @@ -99,6 +105,9 @@ def _render_module(self, module: stardoc_output_pb2.ModuleInfo): bzl_path = self._public_load_path else: bzl_path = "//" + self._module.file.split("//")[1] + + self._write(":::{default-domain} bzl\n:::\n") + self._write(":::{bzl:currentfile} ", bzl_path, "\n:::\n\n") self._write( f"# {bzl_path}\n", "\n", @@ -129,320 +138,344 @@ def _render_module(self, module: stardoc_output_pb2.ModuleInfo): self._write("\n") def _render_aspect(self, aspect: stardoc_output_pb2.AspectInfo): - aspect_anchor = _anchor_id(aspect.aspect_name) - self._write( - _block_attrs(".starlark-object"), - f"## {aspect.aspect_name}\n\n", - "_Propagates on attributes:_ ", # todo add link here - ", ".join(sorted(f"`{attr}`" for attr in aspect.aspect_attribute)), - "\n\n", - aspect.doc_string.strip(), - "\n\n", - ) + _sort_attributes_inplace(aspect.attribute) + self._write("::::::{bzl:aspect} ", aspect.aspect_name, "\n\n") + edges = ", ".join(sorted(f"`{attr}`" for attr in aspect.aspect_attribute)) + self._write(":aspect-attributes: ", edges, "\n\n") + self._write(aspect.doc_string.strip(), "\n\n") if aspect.attribute: - self._render_attributes(aspect_anchor, aspect.attribute) - self._write("\n") + self._render_attributes(aspect.attribute) + self._write("\n") + self._write("::::::\n") def _render_module_extension(self, mod_ext: stardoc_output_pb2.ModuleExtensionInfo): - self._write( - _block_attrs(".starlark-object"), - f"## {mod_ext.extension_name}\n\n", - ) - + self._write("::::::{bzl:module-extension} ", mod_ext.extension_name, "\n\n") self._write(mod_ext.doc_string.strip(), "\n\n") - mod_ext_anchor = _anchor_id(mod_ext.extension_name) for tag in mod_ext.tag_class: tag_name = f"{mod_ext.extension_name}.{tag.tag_name}" - tag_anchor = f"{mod_ext_anchor}_{tag.tag_name}" - self._write( - _block_attrs(".starlark-module-extension-tag-class"), - f"### {tag_name}\n\n", - ) + tag_name = f"{tag.tag_name}" + self._write(":::::{bzl:tag-class} ", tag_name, "\n\n") + + _sort_attributes_inplace(tag.attribute) self._render_signature( tag_name, - tag_anchor, tag.attribute, get_name=lambda a: a.name, get_default=lambda a: a.default_value, ) self._write(tag.doc_string.strip(), "\n\n") - self._render_attributes(tag_anchor, tag.attribute) - self._write("\n") + self._render_attributes(tag.attribute) + self._write(":::::\n") + self._write("::::::\n") def _render_repository_rule(self, repo_rule: stardoc_output_pb2.RepositoryRuleInfo): - self._write( - _block_attrs(".starlark-object"), - f"## {repo_rule.rule_name}\n\n", - ) - repo_anchor = _anchor_id(repo_rule.rule_name) + self._write("::::::{bzl:repo-rule} ") + _sort_attributes_inplace(repo_rule.attribute) self._render_signature( repo_rule.rule_name, - repo_anchor, repo_rule.attribute, get_name=lambda a: a.name, get_default=lambda a: a.default_value, ) self._write(repo_rule.doc_string.strip(), "\n\n") if repo_rule.attribute: - self._render_attributes(repo_anchor, repo_rule.attribute) + self._render_attributes(repo_rule.attribute) if repo_rule.environ: - self._write( - "**ENVIRONMENT VARIABLES** ", - _link_here_icon(repo_anchor + "_env"), - "\n", - ) - for name in sorted(repo_rule.environ): - self._write(f"* `{name}`\n") + self._write(":envvars: ", ", ".join(sorted(repo_rule.environ))) self._write("\n") def _render_rule(self, rule: stardoc_output_pb2.RuleInfo): rule_name = rule.rule_name - rule_anchor = _anchor_id(rule_name) - self._write( - _block_attrs(".starlark-object"), - f"## {rule_name}\n\n", - ) - + _sort_attributes_inplace(rule.attribute) + self._write("::::{bzl:rule} ") self._render_signature( rule_name, - rule_anchor, rule.attribute, get_name=lambda r: r.name, get_default=lambda r: r.default_value, ) - self._write(rule.doc_string.strip(), "\n\n") - if len(rule.advertised_providers.provider_name) == 0: - self._write("_Provides_: no providers advertised.") - else: - self._write( - "_Provides_: ", - ", ".join(rule.advertised_providers.provider_name), - ) - self._write("\n\n") + if rule.advertised_providers.provider_name: + self._write(":provides: ") + self._write(" | ".join(rule.advertised_providers.provider_name)) + self._write("\n") + self._write("\n") if rule.attribute: - self._render_attributes(rule_anchor, rule.attribute) + self._render_attributes(rule.attribute) + self._write("\n") + self._write("::::\n") def _rule_attr_type_string(self, attr: stardoc_output_pb2.AttributeInfo) -> str: if attr.type == _AttributeType.NAME: - return _link("Name", ref="target-name") + return "Name" elif attr.type == _AttributeType.INT: - return _link("int", ref="int") + return "int" elif attr.type == _AttributeType.LABEL: - return _link("label", ref="attr-label") + return "label" elif attr.type == _AttributeType.STRING: - return _link("string", ref="str") + return "str" elif attr.type == _AttributeType.STRING_LIST: - return "list of " + _link("string", ref="str") + return "list[str]" elif attr.type == _AttributeType.INT_LIST: - return "list of " + _link("int", ref="int") + return "list[int]" elif attr.type == _AttributeType.LABEL_LIST: - return "list of " + _link("label", ref="attr-label") + "s" + return "list[label]" elif attr.type == _AttributeType.BOOLEAN: - return _link("bool", ref="bool") + return "bool" elif attr.type == _AttributeType.LABEL_STRING_DICT: - return "dict of {key} to {value}".format( - key=_link("label", ref="attr-label"), value=_link("string", ref="str") - ) + return "dict[label, str]" elif attr.type == _AttributeType.STRING_DICT: - return "dict of {key} to {value}".format( - key=_link("string", ref="str"), value=_link("string", ref="str") - ) + return "dict[str, str]" elif attr.type == _AttributeType.STRING_LIST_DICT: - return "dict of {key} to list of {value}".format( - key=_link("string", ref="str"), value=_link("string", ref="str") - ) + return "dict[str, list[str]]" elif attr.type == _AttributeType.OUTPUT: - return _link("label", ref="attr-label") + return "label" elif attr.type == _AttributeType.OUTPUT_LIST: - return "list of " + _link("label", ref="attr-label") + return "list[label]" else: # If we get here, it means the value was unknown for some reason. # Rather than error, give some somewhat understandable value. return _AttributeType.Name(attr.type) def _render_func(self, func: stardoc_output_pb2.StarlarkFunctionInfo): - func_name = func.function_name - func_anchor = _anchor_id(func_name) - self._write( - _block_attrs(".starlark-object"), - f"## {func_name}\n\n", - ) + self._write("::::::{bzl:function} ") - parameters = [param for param in func.parameter if param.name != "self"] - - self._render_signature( - func_name, - func_anchor, - parameters, - get_name=lambda p: p.name, - get_default=lambda p: p.default_value, - ) + parameters = self._render_func_signature(func) self._write(func.doc_string.strip(), "\n\n") if parameters: - self._write( - _block_attrs(f"{func_anchor}_parameters"), - "**PARAMETERS** ", - _link_here_icon(f"{func_anchor}_parameters"), - "\n\n", - ) - entries = [] for param in parameters: - entries.append( - [ - f"{func_anchor}_{param.name}", - param.name, - f"(_default `{param.default_value}`_) " - if param.default_value - else "", - param.doc_string if param.doc_string else "_undocumented_", - ] - ) - self._render_field_list(entries) - - if getattr(func, "return").doc_string: - return_doc = _indent_block_text(getattr(func, "return").doc_string) - self._write( - _block_attrs(f"{func_anchor}_returns"), - "RETURNS", - _link_here_icon(func_anchor + "_returns"), - "\n", - ": ", - return_doc, - "\n", - ) + self._write(f":arg {param.name}:\n") + if param.default_value: + default_value = self._format_default_value(param.default_value) + self._write(" {default-value}`", default_value, "`\n") + if param.doc_string: + self._write(" ", _indent_block_text(param.doc_string), "\n") + else: + self._write(" _undocumented_\n") + self._write("\n") + + if return_doc := getattr(func, "return").doc_string: + self._write(":returns:\n") + self._write(" ", _indent_block_text(return_doc), "\n") if func.deprecated.doc_string: - self._write( - "\n\n**DEPRECATED**\n\n", func.deprecated.doc_string.strip(), "\n" - ) + self._write(":::::{deprecated}: unknown\n") + self._write(" ", _indent_block_text(func.deprecated.doc_string), "\n") + self._write(":::::\n") + self._write("::::::\n") + + def _render_func_signature(self, func): + self._write(f"{func.function_name}(") + # TODO: Have an "is method" directive in the docstring to decide if + # the self parameter should be removed. + parameters = [param for param in func.parameter if param.name != "self"] + + # Unfortunately, the stardoc info is incomplete and inaccurate: + # * The position of the `*args` param is wrong; it'll always + # be last (or second to last, if kwargs is present). + # * Stardoc doesn't explicitly tell us if an arg is `*args` or + # `**kwargs`. Hence f(*args) or f(**kwargs) is ambigiguous. + # See these issues: + # https://github.com/bazelbuild/stardoc/issues/226 + # https://github.com/bazelbuild/stardoc/issues/225 + # + # Below, we try to take what info we have and infer what the original + # signature was. In short: + # * A default=empty, mandatory=false arg is either *args or **kwargs + # * If two of those are seen, the first is *args and the second is + # **kwargs. Recall, however, the position of *args is mis-represented. + # * If a single default=empty, mandatory=false arg is found, then + # it's ambiguous as to whether its *args or **kwargs. To figure + # that out, we: + # * If it's not the last arg, then it must be *args. In practice, + # this never occurs due to #226 above. + # * If we saw a mandatory arg after an optional arg, then *args + # was supposed to be between them (otherwise it wouldn't be + # valid syntax). + # * Otherwise, it's ambiguous. We just guess by looking at the + # parameter name. + var_args = None + var_kwargs = None + saw_mandatory_after_optional = False + first_mandatory_after_optional_index = None + optionals_started = False + for i, p in enumerate(parameters): + optionals_started = optionals_started or not p.mandatory + if p.mandatory and optionals_started: + saw_mandatory_after_optional = True + if first_mandatory_after_optional_index is None: + first_mandatory_after_optional_index = i + + if not p.default_value and not p.mandatory: + if var_args is None: + var_args = (i, p) + else: + var_kwargs = p + + if var_args and not var_kwargs: + if var_args[0] != len(parameters) - 1: + pass + elif saw_mandatory_after_optional: + var_kwargs = var_args[1] + var_args = None + elif var_args[1].name in ("kwargs", "attrs"): + var_kwargs = var_args[1] + var_args = None + + # Partial workaround for + # https://github.com/bazelbuild/stardoc/issues/226: `*args` renders last + if var_args and var_kwargs and first_mandatory_after_optional_index is not None: + parameters.pop(var_args[0]) + parameters.insert(first_mandatory_after_optional_index, var_args[1]) + + # The only way a mandatory-after-optional can occur is + # if there was `*args` before it. But if we didn't see it, + # it must have been the unbound `*` symbol, which stardoc doesn't + # tell us exists. + if saw_mandatory_after_optional and not var_args: + self._write("*, ") + for _, is_last, p in _position_iter(parameters): + if var_args and p.name == var_args[1].name: + self._write("*") + elif var_kwargs and p.name == var_kwargs.name: + self._write("**") + self._write(p.name) + if p.default_value: + self._write("=", self._format_default_value(p.default_value)) + if not is_last: + self._write(", ") + self._write(")\n") + return parameters def _render_provider(self, provider: stardoc_output_pb2.ProviderInfo): - self._write( - _block_attrs(".starlark-object"), - f"## {provider.provider_name}\n\n", - ) + self._write("::::::{bzl:provider} ", provider.provider_name, "\n") + if provider.origin_key: + self._render_origin_key_option(provider.origin_key) + self._write("\n") - provider_anchor = _anchor_id(provider.provider_name) + self._write(provider.doc_string.strip(), "\n\n") + + self._write(":::::{bzl:function} ") + provider.field_info.sort(key=lambda f: f.name) self._render_signature( - provider.provider_name, - provider_anchor, + "", provider.field_info, get_name=lambda f: f.name, ) + # TODO: Add support for provider.init once our Bazel version supports + # that field + self._write(":::::\n") - self._write(provider.doc_string.strip(), "\n\n") + for field in provider.field_info: + self._write(":::::{bzl:provider-field} ", field.name, "\n") + self._write(field.doc_string.strip()) + self._write("\n") + self._write(":::::\n") + self._write("::::::\n") - if provider.field_info: - self._write( - _block_attrs(provider_anchor), - "**FIELDS** ", - _link_here_icon(provider_anchor + "_fields"), - "\n", - "\n", - ) - entries = [] - for field in provider.field_info: - entries.append( - [ - f"{provider_anchor}_{field.name}", - field.name, - field.doc_string, - ] - ) - self._render_field_list(entries) - - def _render_attributes( - self, base_anchor: str, attributes: list[stardoc_output_pb2.AttributeInfo] - ): - self._write( - _block_attrs(f"{base_anchor}_attributes"), - "**ATTRIBUTES** ", - _link_here_icon(f"{base_anchor}_attributes"), - "\n", - ) - entries = [] + def _render_attributes(self, attributes: list[stardoc_output_pb2.AttributeInfo]): for attr in attributes: - anchor = f"{base_anchor}_{attr.name}" - required = "required" if attr.mandatory else "optional" attr_type = self._rule_attr_type_string(attr) - default = f", default `{attr.default_value}`" if attr.default_value else "" - providers_parts = [] + self._write(f":attr {attr.name}:\n") + if attr.default_value: + self._write(" {bzl:default-value}`%s`\n" % attr.default_value) + self._write(" {type}`%s`\n" % attr_type) + self._write(" ", _indent_block_text(attr.doc_string), "\n") + self._write(" :::{bzl:attr-info} Info\n") + if attr.mandatory: + self._write(" :mandatory:\n") + self._write(" :::\n") + self._write("\n") + if attr.provider_name_group: - providers_parts.append("\n\n_Required providers_: ") - if len(attr.provider_name_group) == 1: - provider_group = attr.provider_name_group[0] - if len(provider_group.provider_name) == 1: - providers_parts.append(provider_group.provider_name[0]) - else: - providers_parts.extend( - ["all of ", _join_csv_and(provider_group.provider_name)] + self._write(" {required-providers}`") + for _, outer_is_last, provider_group in _position_iter( + attr.provider_name_group + ): + pairs = list( + zip( + provider_group.origin_key, + provider_group.provider_name, + strict=True, + ) ) - elif len(attr.provider_name_group) > 1: - providers_parts.append("any of \n") - for group in attr.provider_name_group: - providers_parts.extend(["* ", _join_csv_and(group.provider_name)]) - if providers_parts: - providers_parts.append("\n") - - entries.append( - [ - anchor, - attr.name, - f"_({required} {attr_type}{default})_\n", - attr.doc_string, - *providers_parts, - ] - ) - self._render_field_list(entries) + if len(pairs) > 1: + self._write("[") + for _, inner_is_last, (origin_key, name) in _position_iter(pairs): + if origin_key.file == "": + origin = origin_key.name + else: + origin = f"{origin_key.file}%{origin_key.name}" + # We have to use "title " syntax because the same + # name might map to different origins. Stardoc gives us + # the provider's actual name, not the name of the symbol + # used in the source. + self._write(f"'{name} <{origin}>'") + if not inner_is_last: + self._write(", ") + + if len(pairs) > 1: + self._write("]") + + if not outer_is_last: + self._write(" | ") + self._write("`\n") + + self._write("\n") def _render_signature( self, name: str, - base_anchor: str, parameters: list[_T], *, get_name: Callable[_T, str], get_default: Callable[_T, str] = lambda v: None, ): - self._write(_block_attrs(".starlark-signature"), name, "(") + self._write(name, "(") for _, is_last, param in _position_iter(parameters): param_name = get_name(param) - self._write(_link(param_name, f"{base_anchor}_{param_name}")) + self._write(f"{param_name}") default_value = get_default(param) if default_value: + default_value = self._format_default_value(default_value) self._write(f"={default_value}") if not is_last: - self._write(",\n") + self._write(", ") self._write(")\n\n") - def _render_field_list(self, entries: list[list[str]]): - """Render a list of field lists. - - Args: - entries: list of field list entries. Each element is 3 - pieces: an anchor, field description, and one or more - text strings for the body of the field list entry. - """ - for anchor, description, *body_pieces in entries: - body_pieces = [_block_attrs(anchor), *body_pieces] - self._write( - ":", - _span(description + _link_here_icon(anchor)), - ":\n ", - # The text has to be indented to be associated with the block correctly. - "".join(body_pieces).strip().replace("\n", "\n "), - "\n", - ) - # Ensure there is an empty line after the field list, otherwise - # the next line of content will fold into the field list - self._write("\n") + def _render_origin_key_option(self, origin_key, indent=""): + self._write( + indent, + ":origin-key: ", + self._format_option_value(f"{origin_key.file}%{origin_key.name}"), + "\n", + ) + + def _format_default_value(self, default_value): + # Handle + # For now, just use quotes for lack of a better option + if default_value.startswith("<"): + return f"'{default_value}'" + elif default_value.startswith("Label("): + # Handle Label(*, "@some//label:target") + start_quote = default_value.find('"') + end_quote = default_value.rfind('"') + return default_value[start_quote : end_quote + 1] + else: + return default_value + + def _format_option_value(self, value): + # Leading @ symbols are special markup; escape them. + if value.startswith("@"): + return "\\" + value + else: + return value def _write(self, *lines: str): self._out_stream.writelines(lines) @@ -452,21 +485,15 @@ def _convert( *, proto: pathlib.Path, output: pathlib.Path, - footer: pathlib.Path, public_load_path: str, ): - if footer: - footer_content = footer.read_text() - module = stardoc_output_pb2.ModuleInfo.FromString(proto.read_bytes()) with output.open("wt", encoding="utf8") as out_stream: _MySTRenderer(module, out_stream, public_load_path).render() - out_stream.write(footer_content) def _create_parser(): parser = argparse.ArgumentParser(fromfile_prefix_chars="@") - parser.add_argument("--footer", dest="footer", type=pathlib.Path) parser.add_argument("--proto", dest="proto", type=pathlib.Path) parser.add_argument("--output", dest="output", type=pathlib.Path) parser.add_argument("--public-load-path", dest="public_load_path") @@ -478,7 +505,6 @@ def main(args): _convert( proto=options.proto, output=options.output, - footer=options.footer, public_load_path=options.public_load_path, ) return 0 diff --git a/sphinxdocs/private/sphinx_server.py b/sphinxdocs/private/sphinx_server.py index e71889a6d3..1f4fae86de 100644 --- a/sphinxdocs/private/sphinx_server.py +++ b/sphinxdocs/private/sphinx_server.py @@ -2,6 +2,7 @@ import errno import os import sys +import time from http import server @@ -17,17 +18,33 @@ def __init__(self, *args, **kwargs): address = ("0.0.0.0", 8000) # with server.ThreadingHTTPServer(address, DirectoryHandler) as (ip, port, httpd): with _start_server(DirectoryHandler, "0.0.0.0", 8000) as (ip, port, httpd): - print(f"Serving...") - print(f" Address: http://{ip}:{port}") - print(f" Serving directory: {serve_directory}") - print(f" CWD: {os.getcwd()}") - print() - print("*** You do not need to restart this server to see changes ***") - print() - try: - httpd.serve_forever() - except KeyboardInterrupt: - pass + + def _print_server_info(): + print(f"Serving...") + print(f" Address: http://{ip}:{port}") + print(f" Serving directory: {serve_directory}") + print(f" url: file://{serve_directory}") + print(f" Server CWD: {os.getcwd()}") + print() + print("*** You do not need to restart this server to see changes ***") + print("*** CTRL+C once to reprint this info ***") + print("*** CTRL+C twice to exit ***") + print() + + while True: + _print_server_info() + try: + httpd.serve_forever() + except KeyboardInterrupt: + _print_server_info() + print( + "*** KeyboardInterrupt received: CTRL+C again to terminate server ***" + ) + try: + time.sleep(1) + print("Restarting serving ...") + except KeyboardInterrupt: + break return 0 @@ -37,6 +54,7 @@ def _start_server(handler, ip, start_port): try: with server.ThreadingHTTPServer((ip, port), handler) as httpd: yield ip, port, httpd + return except OSError as e: if e.errno == errno.EADDRINUSE: pass diff --git a/sphinxdocs/private/sphinx_stardoc.bzl b/sphinxdocs/private/sphinx_stardoc.bzl index 810dca3524..e2b1756e12 100644 --- a/sphinxdocs/private/sphinx_stardoc.bzl +++ b/sphinxdocs/private/sphinx_stardoc.bzl @@ -19,7 +19,7 @@ load("@bazel_skylib//rules:build_test.bzl", "build_test") load("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc") load("//python/private:util.bzl", "add_tag", "copy_propagating_kwargs") # buildifier: disable=bzl-visibility -def sphinx_stardocs(name, docs, footer = None, **kwargs): +def sphinx_stardocs(name, docs, **kwargs): """Generate Sphinx-friendly Markdown docs using Stardoc for bzl libraries. A `build_test` for the docs is also generated to ensure Stardoc is able @@ -39,7 +39,6 @@ def sphinx_stardocs(name, docs, footer = None, **kwargs): * A `dict` with keys `input` and `dep`. The `input` key is a string label to the bzl file to generate docs for. The `dep` key is a string label to a `bzl_library` providing the necessary dependencies. - footer: optional [`label`] File to append to generated docs. **kwargs: Additional kwargs to pass onto each `sphinx_stardoc` target """ add_tag(kwargs, "@rules_python//sphinxdocs:sphinx_stardocs") @@ -60,7 +59,6 @@ def sphinx_stardocs(name, docs, footer = None, **kwargs): doc_name = "_{}_{}".format(name.lstrip("_"), out_name.replace("/", "_")) _sphinx_stardoc( name = doc_name, - footer = footer, out = out_name, **stardoc_kwargs ) @@ -77,7 +75,7 @@ def sphinx_stardocs(name, docs, footer = None, **kwargs): **common_kwargs ) -def _sphinx_stardoc(*, name, out, footer = None, public_load_path = None, **kwargs): +def _sphinx_stardoc(*, name, out, public_load_path = None, **kwargs): stardoc_name = "_{}_stardoc".format(name.lstrip("_")) stardoc_pb = stardoc_name + ".binaryproto" @@ -95,7 +93,6 @@ def _sphinx_stardoc(*, name, out, footer = None, public_load_path = None, **kwar name = name, src = stardoc_pb, output = out, - footer = footer, public_load_path = public_load_path, ) @@ -108,9 +105,6 @@ def _stardoc_proto_to_markdown_impl(ctx): args.add("--proto", ctx.file.src) args.add("--output", ctx.outputs.output) - if ctx.file.footer: - args.add("--footer", ctx.file.footer) - inputs.append(ctx.file.footer) if ctx.attr.public_load_path: args.add("--public-load-path={}".format(ctx.attr.public_load_path)) @@ -126,7 +120,6 @@ def _stardoc_proto_to_markdown_impl(ctx): _stardoc_proto_to_markdown = rule( implementation = _stardoc_proto_to_markdown_impl, attrs = { - "footer": attr.label(allow_single_file = True), "output": attr.output(mandatory = True), "public_load_path": attr.string(), "src": attr.label(allow_single_file = True, mandatory = True), diff --git a/sphinxdocs/src/sphinx_stardoc/stardoc.py b/sphinxdocs/src/sphinx_stardoc/stardoc.py index 283fb67d77..be38d8a7ca 100644 --- a/sphinxdocs/src/sphinx_stardoc/stardoc.py +++ b/sphinxdocs/src/sphinx_stardoc/stardoc.py @@ -133,6 +133,9 @@ def to_get_objects_tuple(self) -> _GetObjectsTuple: self.search_priority, ) + def __repr__(self): + return f"ObjectEntry({self.full_id=}, {self.object_type=}, {self.display_name=}, {self.index_entry.docname=})" + # A simple helper just to document what the index tuple nodes are. def _index_node_tuple( @@ -241,8 +244,12 @@ def visit_Attribute(self, node: ast.Attribute): def visit_Constant(self, node: ast.Constant): if node.value is None: self._append(self.make_xref("None")) + elif isinstance(node.value, str): + self._append(self.make_xref(node.value)) else: - raise InvalidValueError(f"Unexpected Constant node value: {node.value}") + raise InvalidValueError( + f"Unexpected Constant node value: ({type(node.value)}) {node.value=}" + ) def visit_Name(self, node: ast.Name): xref_node = self.make_xref(node.id) @@ -470,8 +477,9 @@ class _BzlAttrInfo(sphinx_docutils.SphinxDirective): def run(self): content_node = docutils_nodes.paragraph("", "") - if "mandatory" in self.options: - content_node += docutils_nodes.paragraph("", "mandatory (must be non-None)") + content_node += docutils_nodes.paragraph( + "", "mandatory" if "mandatory" in self.options else "optional" + ) if "executable" in self.options: content_node += docutils_nodes.paragraph("", "Must be an executable") @@ -496,6 +504,10 @@ class _BzlObject(sphinx_directives.ObjectDescription[_BzlObjectId]): * `foo(arg1, arg2=default) -> returntype` """ + option_spec = sphinx_directives.ObjectDescription.option_spec | { + "origin-key": docutils_directives.unchanged, + } + @override def before_content(self) -> None: symbol_name = self.names[-1].symbol @@ -588,7 +600,7 @@ def handle_signature( if type_expr := self.options.get("type"): - def make_xref(name): + def make_xref(name, title=None): content_node = addnodes.desc_type(name, name) return addnodes.pending_xref( "", @@ -608,25 +620,53 @@ def make_xref(name): sig_node += attr_annotation_node if params_text: - signature = inspect.signature_from_str(params_text) - - paramlist_node = addnodes.desc_parameterlist() - for param in signature.parameters.values(): - node = addnodes.desc_parameter() - node += addnodes.desc_sig_name(rawsource="", text=param.name) - if param.default is not param.empty: - node += addnodes.desc_sig_operator("", "=") - node += docutils_nodes.inline( - "", - param.default, - classes=["default_value"], - support_smartquotes=False, - ) - paramlist_node += node - sig_node += paramlist_node - - if signature.return_annotation is not signature.empty: - sig_node += addnodes.desc_returns("", signature.return_annotation) + try: + signature = inspect.signature_from_str(params_text) + except SyntaxError: + # Stardoc doesn't provide accurate info, so the reconstructed + # signature might not be valid syntax. Rather than fail, just + # provide a plain-text description of the approximate signature. + # See https://github.com/bazelbuild/stardoc/issues/225 + sig_node += addnodes.desc_parameterlist( + # Offset by 1 to remove the surrounding parentheses + params_text[1:-1], + params_text[1:-1], + ) + else: + last_kind = None + paramlist_node = addnodes.desc_parameterlist() + for param in signature.parameters.values(): + if param.kind == param.KEYWORD_ONLY and last_kind in ( + param.POSITIONAL_OR_KEYWORD, + param.POSITIONAL_ONLY, + None, + ): + # Add separator for keyword only parameter: * + paramlist_node += addnodes.desc_parameter( + "", "", addnodes.desc_sig_operator("", "*") + ) + + last_kind = param.kind + node = addnodes.desc_parameter() + if param.kind == param.VAR_POSITIONAL: + node += addnodes.desc_sig_operator("", "*") + elif param.kind == param.VAR_KEYWORD: + node += addnodes.desc_sig_operator("", "**") + + node += addnodes.desc_sig_name(rawsource="", text=param.name) + if param.default is not param.empty: + node += addnodes.desc_sig_operator("", "=") + node += docutils_nodes.inline( + "", + param.default, + classes=["default_value"], + support_smartquotes=False, + ) + paramlist_node += node + sig_node += paramlist_node + + if signature.return_annotation is not signature.empty: + sig_node += addnodes.desc_returns("", signature.return_annotation) obj_id = _BzlObjectId.from_env(self.env, relative_name) @@ -685,9 +725,22 @@ def add_target_and_index( ), ) - self.env.get_domain(self.domain).add_object( - object_entry, alt_names=self._get_alt_names(object_entry) - ) + alt_names = [] + if origin_key := self.options.get("origin-key"): + alt_names.append( + origin_key + # Options require \@ for leading @, but don't + # remove the escaping slash, so we have to do it manually + .lstrip("\\") + .lstrip("@") + .replace("//", "/") + .replace(".bzl%", ".") + .replace("/", ".") + .replace(":", ".") + ) + alt_names.extend(self._get_alt_names(object_entry)) + + self.env.get_domain(self.domain).add_object(object_entry, alt_names=alt_names) def _get_additional_index_types(self): return [] @@ -1079,6 +1132,8 @@ def _get_signature_object_type(self) -> str: return "" +# TODO: Integrate with the option directive, since flags are options, afterall. +# https://www.sphinx-doc.org/en/master/usage/domains/standard.html#directive-option class _BzlFlag(_BzlTarget): """Documents a flag""" @@ -1319,10 +1374,11 @@ class _BzlDomain(domains.Domain): label = "Bzl" # NOTE: Most every object type has "obj" as one of the roles because - # an object type's role determine what reftypes can refer to it. By having - # "obj" for all of them, it allows writing :bzl:obj`foo` to restrict - # object searching to the bzl domain. Under the hood, this domain translates - # requests for the :any: role as lookups for :obj: + # an object type's role determine what reftypes (cross referencing) can + # refer to it. By having "obj" for all of them, it allows writing + # :bzl:obj`foo` to restrict object searching to the bzl domain. Under the + # hood, this domain translates requests for the :any: role as lookups for + # :obj:. # NOTE: We also use these object types for categorizing things in the # generated index page. object_types = { @@ -1334,17 +1390,16 @@ class _BzlDomain(domains.Domain): "module-extension": domains.ObjType( "module extension", "module_extension", "obj" ), - "provider": domains.ObjType("provider", "provider", "obj"), - "provider-field": domains.ObjType( - "provider field", "field", "obj" - ), # provider field + # Providers are close enough to types that we include "type". This + # also makes :type: Foo work in directive options. + "provider": domains.ObjType("provider", "provider", "type", "obj"), + "provider-field": domains.ObjType("provider field", "field", "obj"), "repo-rule": domains.ObjType("repository rule", "repo_rule", "obj"), "rule": domains.ObjType("rule", "rule", "obj"), "tag-class": domains.ObjType("tag class", "tag_class", "obj"), "target": domains.ObjType("target", "target", "obj"), # target in a build file - "flag": domains.ObjType( - "flag", "flag", "target", "obj" - ), # flag-target in a build file + # Flags are also targets, so include "target" for xref'ing + "flag": domains.ObjType("flag", "flag", "target", "obj"), # types are objects that have a constructor and methods/attrs "type": domains.ObjType("type", "type", "obj"), } @@ -1393,7 +1448,7 @@ class _BzlDomain(domains.Domain): # Objects within each doc # dict[str, dict[str, _ObjectEntry]] "doc_names": {}, - # Objects by a shorter name + # Objects by a shorter or alternative name # dict[str, _ObjectEntry] "alt_names": {}, } @@ -1420,9 +1475,16 @@ def resolve_any_xref( node: addnodes.pending_xref, contnode: docutils_nodes.Element, ) -> list[tuple[str, docutils_nodes.Element]]: - ref_node = self.resolve_xref( - env, fromdocname, builder, "obj", target, node, contnode + del env, node # Unused + entry = self._find_entry_for_xref(fromdocname, "obj", target) + if not entry: + return [] + to_docname = entry.index_entry.docname + to_anchor = entry.index_entry.anchor + ref_node = sphinx_nodes.make_refnode( + builder, fromdocname, to_docname, to_anchor, contnode, title=to_anchor ) + matches = [(f"bzl:{entry.object_type}", ref_node)] return matches @@ -1454,14 +1516,21 @@ def resolve_xref( def _find_entry_for_xref( self, fromdocname: str, object_type: str, target: str ) -> _ObjectEntry | None: - # Normalize labels to dotted notation + # Normalize a variety of formats to the dotted format used internally. + # --@foo//:bar flags + # --@foo//:bar=value labels + # //foo:bar.bzl labels target = ( - target.lstrip("@/:") + target.lstrip("@/:-") .replace("//", "/") .replace(".bzl%", ".") .replace("/", ".") .replace(":", ".") ) + # Elide the value part of --foo=bar flags + # Note that the flag value could contain `=` + if "=" in target: + target = target[: target.find("=")] if target in self.data["doc_names"].get(fromdocname, {}): return self.data["doc_names"][fromdocname][target] @@ -1486,7 +1555,11 @@ def add_object(self, entry: _ObjectEntry, alt_names=None) -> None: alt_names, ) if entry.full_id in self.data["objects"]: - raise Exception(f"Object {entry.full_id} already registered") + existing = self.data["objects"][entry.full_id] + raise Exception( + f"Object {entry.full_id} already registered: " + + f"existing={existing}, incoming={entry}" + ) self.data["objects"][entry.full_id] = entry self.data["objects_by_type"].setdefault(entry.object_type, {}) self.data["objects_by_type"][entry.object_type][entry.full_id] = entry diff --git a/sphinxdocs/tests/proto_to_markdown/BUILD.bazel b/sphinxdocs/tests/proto_to_markdown/BUILD.bazel index 2964785eed..09f537472c 100644 --- a/sphinxdocs/tests/proto_to_markdown/BUILD.bazel +++ b/sphinxdocs/tests/proto_to_markdown/BUILD.bazel @@ -13,10 +13,12 @@ # limitations under the License. load("//python:py_test.bzl", "py_test") +load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility py_test( name = "proto_to_markdown_test", srcs = ["proto_to_markdown_test.py"], + target_compatible_with = [] if IS_BAZEL_7_OR_HIGHER else ["@platforms//:incompatible"], deps = [ "//sphinxdocs/private:proto_to_markdown_lib", "@dev_pip//absl_py", diff --git a/sphinxdocs/tests/proto_to_markdown/proto_to_markdown_test.py b/sphinxdocs/tests/proto_to_markdown/proto_to_markdown_test.py index 2f5b22e60b..3b664a5335 100644 --- a/sphinxdocs/tests/proto_to_markdown/proto_to_markdown_test.py +++ b/sphinxdocs/tests/proto_to_markdown/proto_to_markdown_test.py @@ -114,21 +114,22 @@ def _render(self, module_text): def test_basic_rendering_everything(self): actual = self._render(_EVERYTHING_MODULE) + self.assertIn("{bzl:currentfile} //pkg:foo.bzl", actual) self.assertRegex(actual, "# //pkg:foo.bzl") self.assertRegex(actual, "MODULE_DOC_STRING") - self.assertRegex(actual, "## rule_1.*") + self.assertRegex(actual, "{bzl:rule} rule_1.*") self.assertRegex(actual, "RULE_1_DOC_STRING") self.assertRegex(actual, "rule_1_attr_1") self.assertRegex(actual, "RULE_1_ATTR_1_DOC_STRING") self.assertRegex(actual, "RULE_1_ATTR_1_DEFAULT_VALUE") - self.assertRegex(actual, "## ProviderAlpha") + self.assertRegex(actual, "{bzl:provider} ProviderAlpha") self.assertRegex(actual, "PROVIDER_ALPHA_DOC_STRING") self.assertRegex(actual, "ProviderAlpha_field_a") self.assertRegex(actual, "PROVIDER_ALPHA_FIELD_A_DOC_STRING") - self.assertRegex(actual, "## function_1") + self.assertRegex(actual, "{bzl:function} function_1") self.assertRegex(actual, "FUNCTION_1_DOC_STRING") self.assertRegex(actual, "function_1_param_a") self.assertRegex(actual, "FUNCTION_1_PARAM_A_DOC_STRING") @@ -136,22 +137,22 @@ def test_basic_rendering_everything(self): self.assertRegex(actual, "FUNCTION_1_RETURN_DOC_STRING") self.assertRegex(actual, "FUNCTION_1_DEPRECATED_DOC_STRING") - self.assertRegex(actual, "## aspect_1") + self.assertRegex(actual, "{bzl:aspect} aspect_1") self.assertRegex(actual, "ASPECT_1_DOC_STRING") self.assertRegex(actual, "aspect_1_aspect_attribute_a") self.assertRegex(actual, "aspect_1_attribute_a") self.assertRegex(actual, "ASPECT_1_ATTRIBUTE_A_DOC_STRING") self.assertRegex(actual, "694638") - self.assertRegex(actual, "## bzlmod_ext") + self.assertRegex(actual, "{bzl:module-extension} bzlmod_ext") self.assertRegex(actual, "BZLMOD_EXT_DOC_STRING") - self.assertRegex(actual, "### bzlmod_ext.bzlmod_ext_tag_a") + self.assertRegex(actual, "{bzl:tag-class} bzlmod_ext_tag_a") self.assertRegex(actual, "BZLMOD_EXT_TAG_A_DOC_STRING") self.assertRegex(actual, "bzlmod_ext_tag_a_attribute_1") self.assertRegex(actual, "BZLMOD_EXT_TAG_A_ATTRIBUTE_1_DOC_STRING") self.assertRegex(actual, "BZLMOD_EXT_TAG_A_ATTRIBUTE_1_DEFAULT_VALUE") - self.assertRegex(actual, "## repository_rule") + self.assertRegex(actual, "{bzl:repo-rule} repository_rule") self.assertRegex(actual, "REPOSITORY_RULE_DOC_STRING") self.assertRegex(actual, "repository_rule_attribute_a") self.assertRegex(actual, "REPOSITORY_RULE_ATTRIBUTE_A_DOC_STRING") @@ -172,31 +173,25 @@ def test_render_signature(self): name: "param_without_default" } parameter: { - name: "last_param" + name: "param_with_function_default", + default_value: "" } -} - """ - ) - self.assertIn("[param_with_default](#func_param_with_default)=DEFAULT,", actual) - self.assertIn("[param_without_default](#func_param_without_default),", actual) - - def test_render_field_list(self): - actual = self._render( - """\ -file: "@repo//pkg:foo.bzl" -func_info: { - function_name: "func" parameter: { - name: "param" - default_value: "DEFAULT" + name: "param_with_label_default", + default_value: 'Label(*, "@repo//pkg:file.bzl")' + } + parameter: { + name: "last_param" } } -""" - ) - self.assertRegex( - actual, re.compile("^:.*param.*¶.*headerlink.*:\n", re.MULTILINE) + """ ) - self.assertRegex(actual, re.compile("^ .*#func_param", re.MULTILINE)) + self.assertIn("param_with_default=DEFAULT,", actual) + self.assertIn("{default-value}`DEFAULT`", actual) + self.assertIn(":arg param_with_default:", actual) + self.assertIn("param_without_default,", actual) + self.assertIn('{default-value}`"@repo//pkg:file.bzl"`', actual) + self.assertIn("{default-value}`''", actual) if __name__ == "__main__": diff --git a/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel b/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel index 5cf5736afa..63e34fba3c 100644 --- a/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel +++ b/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel @@ -1,4 +1,7 @@ +load("@bazel_skylib//:bzl_library.bzl", "bzl_library") +load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility load("//sphinxdocs:sphinx.bzl", "sphinx_build_binary", "sphinx_docs") +load("//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardocs") sphinx_docs( name = "docs", @@ -6,7 +9,7 @@ sphinx_docs( include = [ "*.md", ], - ), + ) + [":bzl_docs"], config = "conf.py", formats = [ "html", @@ -22,7 +25,31 @@ sphinx_docs( "@platforms//os:linux": [], "@platforms//os:macos": [], "//conditions:default": ["@platforms//:incompatible"], - }), + }) if IS_BAZEL_7_OR_HIGHER else ["@platforms//:incompatible"], +) + +sphinx_stardocs( + name = "bzl_docs", + docs = { + "bzl_function.md": dict( + dep = ":all_bzl", + input = "//sphinxdocs/tests/sphinx_stardoc:bzl_function.bzl", + ), + "bzl_providers.md": dict( + dep = ":all_bzl", + input = "//sphinxdocs/tests/sphinx_stardoc:bzl_providers.bzl", + ), + "bzl_rule.md": dict( + dep = ":all_bzl", + input = "//sphinxdocs/tests/sphinx_stardoc:bzl_rule.bzl", + ), + }, + target_compatible_with = [] if IS_BAZEL_7_OR_HIGHER else ["@platforms//:incompatible"], +) + +bzl_library( + name = "all_bzl", + srcs = glob(["*.bzl"]), ) sphinx_build_binary( diff --git a/sphinxdocs/tests/sphinx_stardoc/bzl_function.bzl b/sphinxdocs/tests/sphinx_stardoc/bzl_function.bzl new file mode 100644 index 0000000000..822ff26673 --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/bzl_function.bzl @@ -0,0 +1,34 @@ +"""Tests for plain functions.""" + +def middle_varargs(a, *args, b): + """Expect: `middle_varargs(a, *args, b)` + + NOTE: https://github.com/bazelbuild/stardoc/issues/226: `*args` renders last + + Args: + a: {type}`str` doc for a + *args: {type}`varags` doc for *args + b: {type}`list[str]` doc for c + + """ + _ = a, args, b # @unused + +def mixture(a, b = 1, *args, c, d = 2, **kwargs): + """Expect: `mixture(a, b=1, *args, c, d=2, **kwargs)`""" + _ = a, b, args, c, d, kwargs # @unused + +def only_varargs(*args): + """Expect: `only_varargs(*args)`""" + _ = args # @unused + +def only_varkwargs(**kwargs): + """Expect: `only_varkwargs(**kwargs)`""" + _ = kwargs # @unused + +def unnamed_varargs(*, a = 1, b): + """Expect: unnamed_varargs(*, a=1, b)""" + _ = a, b # @unused + +def varargs_and_varkwargs(*args, **kwargs): + """Expect: `varargs_and_varkwargs(*args, **kwargs)`""" + _ = args, kwargs # @unused diff --git a/sphinxdocs/tests/sphinx_stardoc/bzl_providers.bzl b/sphinxdocs/tests/sphinx_stardoc/bzl_providers.bzl new file mode 100644 index 0000000000..189d975d02 --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/bzl_providers.bzl @@ -0,0 +1,4 @@ +"""Providers""" + +# buildifier: disable=provider-params +GenericInfo = provider() diff --git a/sphinxdocs/tests/sphinx_stardoc/bzl_rule.bzl b/sphinxdocs/tests/sphinx_stardoc/bzl_rule.bzl new file mode 100644 index 0000000000..d17c8bc087 --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/bzl_rule.bzl @@ -0,0 +1,24 @@ +"""Tests for rules.""" + +load(":bzl_providers.bzl", OtherGenericInfo = "GenericInfo") + +# buildifier: disable=provider-params +GenericInfo = provider() + +# buildifier: disable=provider-params +P1 = provider() + +# buildifier: disable=provider-params +P2 = provider() + +def _impl(ctx): + _ = ctx # @unused + +my_rule = rule( + implementation = _impl, + attrs = { + "srcs": attr.label( + providers = [[GenericInfo], [OtherGenericInfo], [P1, P2], [platform_common.ToolchainInfo]], + ), + }, +) diff --git a/sphinxdocs/tests/sphinx_stardoc/function.md b/sphinxdocs/tests/sphinx_stardoc/function.md index b8cbd3727e..de7d16aa4a 100644 --- a/sphinxdocs/tests/sphinx_stardoc/function.md +++ b/sphinxdocs/tests/sphinx_stardoc/function.md @@ -9,7 +9,7 @@ Module documentation -:::{bzl:function} myfunc(foo, bar=False, baz=[]) -> FooObj +::::::{bzl:function} myfunc(foo, bar=False, baz=[]) -> FooObj This is a bazel function. @@ -34,8 +34,13 @@ This is a bazel function. {bzl:return-type}`list | int` description +:::{deprecated} unspecified + +Some doc about the deprecation ::: +:::::: + :::{bzl:function} mylongfunc(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) ::: diff --git a/sphinxdocs/tests/sphinx_stardoc/rule.md b/sphinxdocs/tests/sphinx_stardoc/rule.md index a6f3a56b98..0f90ed32dc 100644 --- a/sphinxdocs/tests/sphinx_stardoc/rule.md +++ b/sphinxdocs/tests/sphinx_stardoc/rule.md @@ -23,7 +23,7 @@ Next, we're going to document some rules. :mandatory: true ::: - {required-providers}`LangInfo | [OtherLangInfo, AnotherLangInfo]` + {required-providers}`"Display "` :attr ra2: {type}`attr.label` diff --git a/sphinxdocs/tests/sphinx_stardoc/xrefs.md b/sphinxdocs/tests/sphinx_stardoc/xrefs.md index f0ea038b3d..9eb7b8178b 100644 --- a/sphinxdocs/tests/sphinx_stardoc/xrefs.md +++ b/sphinxdocs/tests/sphinx_stardoc/xrefs.md @@ -48,3 +48,11 @@ Various tests of cross referencing support * rule: {obj}`lang.rule.my_rule` * rule attr: {obj}`lang.rule.my_rule.ra1` * provider: {obj}`lang.provider.LangInfo` + +## Using origin keys + +* provider using `{type}`: {type}`"@rules_python//sphinxdocs/tests/sphinx_stardoc:bzl_rule.bzl%GenericInfo"` + +## Any xref + +* {any}`LangInfo` From 975edfe87c447c602a5a4467237a72a3e286ac60 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Fri, 24 May 2024 21:52:43 -0700 Subject: [PATCH 044/345] docs: rename sphinx plugin to sphinx_bzl (#1922) This is to better reflect its Sphinx domain name and the scope of what it covers. It is able to document general Bazel concepts and isn't actually tied to Stardoc itself. --- docs/sphinx/BUILD.bazel | 2 +- docs/sphinx/conf.py | 2 +- sphinxdocs/src/{sphinx_stardoc => sphinx_bzl}/BUILD.bazel | 2 +- sphinxdocs/src/{sphinx_stardoc => sphinx_bzl}/__init__.py | 0 sphinxdocs/src/{sphinx_stardoc/stardoc.py => sphinx_bzl/bzl.py} | 0 sphinxdocs/tests/sphinx_stardoc/BUILD.bazel | 2 +- sphinxdocs/tests/sphinx_stardoc/conf.py | 2 +- 7 files changed, 5 insertions(+), 5 deletions(-) rename sphinxdocs/src/{sphinx_stardoc => sphinx_bzl}/BUILD.bazel (92%) rename sphinxdocs/src/{sphinx_stardoc => sphinx_bzl}/__init__.py (100%) rename sphinxdocs/src/{sphinx_stardoc/stardoc.py => sphinx_bzl/bzl.py} (100%) diff --git a/docs/sphinx/BUILD.bazel b/docs/sphinx/BUILD.bazel index c2a1690ff3..f82d43a45a 100644 --- a/docs/sphinx/BUILD.bazel +++ b/docs/sphinx/BUILD.bazel @@ -123,7 +123,7 @@ sphinx_build_binary( requirement("myst_parser"), requirement("readthedocs_sphinx_ext"), requirement("typing_extensions"), - "//sphinxdocs/src/sphinx_stardoc", + "//sphinxdocs/src/sphinx_bzl", ], ) diff --git a/docs/sphinx/conf.py b/docs/sphinx/conf.py index fef083cb53..b3155778e6 100644 --- a/docs/sphinx/conf.py +++ b/docs/sphinx/conf.py @@ -27,7 +27,7 @@ "sphinx.ext.intersphinx", "myst_parser", "sphinx_rtd_theme", # Necessary to get jquery to make flyout work - "sphinx_stardoc.stardoc", + "sphinx_bzl.bzl", ] # Adapted from the template code: diff --git a/sphinxdocs/src/sphinx_stardoc/BUILD.bazel b/sphinxdocs/src/sphinx_bzl/BUILD.bazel similarity index 92% rename from sphinxdocs/src/sphinx_stardoc/BUILD.bazel rename to sphinxdocs/src/sphinx_bzl/BUILD.bazel index b788b09c24..8830315bc3 100644 --- a/sphinxdocs/src/sphinx_stardoc/BUILD.bazel +++ b/sphinxdocs/src/sphinx_bzl/BUILD.bazel @@ -6,7 +6,7 @@ package( # NOTE: This provides the library on its own, not its dependencies. py_library( - name = "sphinx_stardoc", + name = "sphinx_bzl", srcs = glob(["*.py"]), imports = [".."], # Allow depending on it in sphinx_binary targets diff --git a/sphinxdocs/src/sphinx_stardoc/__init__.py b/sphinxdocs/src/sphinx_bzl/__init__.py similarity index 100% rename from sphinxdocs/src/sphinx_stardoc/__init__.py rename to sphinxdocs/src/sphinx_bzl/__init__.py diff --git a/sphinxdocs/src/sphinx_stardoc/stardoc.py b/sphinxdocs/src/sphinx_bzl/bzl.py similarity index 100% rename from sphinxdocs/src/sphinx_stardoc/stardoc.py rename to sphinxdocs/src/sphinx_bzl/bzl.py diff --git a/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel b/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel index 63e34fba3c..b03561b9ba 100644 --- a/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel +++ b/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel @@ -56,7 +56,7 @@ sphinx_build_binary( name = "sphinx-build", tags = ["manual"], # Only needed as part of sphinx doc building deps = [ - "//sphinxdocs/src/sphinx_stardoc", + "//sphinxdocs/src/sphinx_bzl", "@dev_pip//myst_parser", "@dev_pip//sphinx", "@dev_pip//typing_extensions", # Needed by sphinx_stardoc diff --git a/sphinxdocs/tests/sphinx_stardoc/conf.py b/sphinxdocs/tests/sphinx_stardoc/conf.py index b1dae97759..bc288b09e6 100644 --- a/sphinxdocs/tests/sphinx_stardoc/conf.py +++ b/sphinxdocs/tests/sphinx_stardoc/conf.py @@ -8,7 +8,7 @@ project = "Sphinx Stardoc Test" extensions = [ - "sphinx_stardoc.stardoc", + "sphinx_bzl.bzl", "myst_parser", "sphinx.ext.intersphinx", ] From b3bf99c76121bf66dd04091bc366da343e79df6c Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 28 May 2024 19:24:33 -0700 Subject: [PATCH 045/345] docs: document the current_py_cc_headers and libraries targets (#1927) This come from the recent slack thread where someone was trying to figure out how to get at the runtime's headers. --- docs/sphinx/api/python/cc/index.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 docs/sphinx/api/python/cc/index.md diff --git a/docs/sphinx/api/python/cc/index.md b/docs/sphinx/api/python/cc/index.md new file mode 100644 index 0000000000..acaaf4f687 --- /dev/null +++ b/docs/sphinx/api/python/cc/index.md @@ -0,0 +1,27 @@ +:::{bzl:currentfile} //python/cc:BUILD.bazel +::: +# //python/cc + +:::{bzl:target} current_py_cc_headers + +A convenience target that provides the Python headers. It uses toolchain +resolution to find the headers for the Python runtime matching the interpreter +that will be used. This basically forwards the underlying +`cc_library(name="python_headers")` target defined in the `@python_X_Y` repo. + +This target provides: + +* `CcInfo`: The C++ information about the Python headers. +::: + +:::{bzl:target} current_py_cc_libs + +A convenience target that provides the Python libraries. It uses toolchain +resolution to find the libraries for the Python runtime matching the interpreter +that will be used. This basically forwards the underlying +`cc_library(name="libpython")` target defined in the `@python_X_Y` repo. + +This target provides: + +* `CcInfo`: The C++ information about the Python libraries. +::: From f51d104c278c2e83014926f63aabd5d9f292ec6c Mon Sep 17 00:00:00 2001 From: JulesD Date: Wed, 29 May 2024 09:20:42 -0400 Subject: [PATCH 046/345] build(deps): Update the pip_install dependencies (#1914) Bumps: * importlib_metadata: 6.8.0 -> 7.1.0 * more_itertools: 10.1.0 -> 10.2.0 * packaging: 23.1 -> 24.0 * pep517: 0.13.0 -> 0.13.1 * pip: 23.2.1 -> 24.0 * pyproject_hooks: 1.0.0 -> 1.1.0 * setuptools: 68.1.2 -> 70.0.0 * wheel: 0.41.2 -> 0.43.0 * zipp: 3.16.2 -> 3.18.2 Fixes #1821 --- CHANGELOG.md | 1 + docs/sphinx/requirements.txt | 12 +++++----- python/pip_install/repositories.bzl | 36 ++++++++++++++--------------- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc5ba4d3b0..e15be3bbcc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ A brief description of the categories of changes: [x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/x.x.x ### Changed +* (deps) Upgrade the `pip_install` dependencies to pick up a new version of pip. * (toolchains) Optional toolchain dependency: `py_binary`, `py_test`, and `py_library` now depend on the `//python:exec_tools_toolchain_type` for build tools. diff --git a/docs/sphinx/requirements.txt b/docs/sphinx/requirements.txt index a3c7c9a5f7..d7c90573af 100644 --- a/docs/sphinx/requirements.txt +++ b/docs/sphinx/requirements.txt @@ -7,7 +7,7 @@ absl-py==2.0.0 \ --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3 \ --hash=sha256:d9690211c5fcfefcdd1a45470ac2b5c5acd45241c3af71eed96bc5441746c0d5 - # via rules-python-docs (docs/sphinx/pyproject.toml) + # via rules_python_docs (docs/sphinx/pyproject.toml) alabaster==0.7.13 \ --hash=sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3 \ --hash=sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2 @@ -213,7 +213,7 @@ mdurl==0.1.2 \ myst-parser==2.0.0 \ --hash=sha256:7c36344ae39c8e740dad7fdabf5aa6fc4897a813083c6cc9990044eb93656b14 \ --hash=sha256:ea929a67a6a0b1683cdbe19b8d2e724cd7643f8aa3e7bb18dd65beac3483bead - # via rules-python-docs (docs/sphinx/pyproject.toml) + # via rules_python_docs (docs/sphinx/pyproject.toml) packaging==23.2 \ --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 \ --hash=sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 @@ -279,7 +279,7 @@ pyyaml==6.0.1 \ readthedocs-sphinx-ext==2.2.3 \ --hash=sha256:6583c26791a5853ee9e57ce9db864e2fb06808ba470f805d74d53fc50811e012 \ --hash=sha256:e9d911792789b88ae12e2be94d88c619f89a4fa1fe9e42c1505c9930a07163d8 - # via rules-python-docs (docs/sphinx/pyproject.toml) + # via rules_python_docs (docs/sphinx/pyproject.toml) requests==2.31.0 \ --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 @@ -295,7 +295,7 @@ sphinx==7.2.6 \ --hash=sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5 # via # myst-parser - # rules-python-docs (docs/sphinx/pyproject.toml) + # rules_python_docs (docs/sphinx/pyproject.toml) # sphinx-rtd-theme # sphinxcontrib-applehelp # sphinxcontrib-devhelp @@ -306,7 +306,7 @@ sphinx==7.2.6 \ sphinx-rtd-theme==2.0.0 \ --hash=sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b \ --hash=sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586 - # via rules-python-docs (docs/sphinx/pyproject.toml) + # via rules_python_docs (docs/sphinx/pyproject.toml) sphinxcontrib-applehelp==1.0.7 \ --hash=sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d \ --hash=sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa @@ -338,7 +338,7 @@ sphinxcontrib-serializinghtml==1.1.9 \ typing-extensions==4.9.0 \ --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd - # via rules-python-docs (docs/sphinx/pyproject.toml) + # via rules_python_docs (docs/sphinx/pyproject.toml) urllib3==2.1.0 \ --hash=sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3 \ --hash=sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54 diff --git a/python/pip_install/repositories.bzl b/python/pip_install/repositories.bzl index 2bd52b9fd5..3f91860b8b 100644 --- a/python/pip_install/repositories.bzl +++ b/python/pip_install/repositories.bzl @@ -36,8 +36,8 @@ _RULE_DEPS = [ ), ( "pypi__importlib_metadata", - "https://files.pythonhosted.org/packages/cc/37/db7ba97e676af155f5fcb1a35466f446eadc9104e25b83366e8088c9c926/importlib_metadata-6.8.0-py3-none-any.whl", - "3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb", + "https://files.pythonhosted.org/packages/2d/0a/679461c511447ffaf176567d5c496d1de27cbe34a87df6677d7171b2fbd4/importlib_metadata-7.1.0-py3-none-any.whl", + "30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570", ), ( "pypi__installer", @@ -46,23 +46,23 @@ _RULE_DEPS = [ ), ( "pypi__more_itertools", - "https://files.pythonhosted.org/packages/5a/cb/6dce742ea14e47d6f565589e859ad225f2a5de576d7696e0623b784e226b/more_itertools-10.1.0-py3-none-any.whl", - "64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6", + "https://files.pythonhosted.org/packages/50/e2/8e10e465ee3987bb7c9ab69efb91d867d93959095f4807db102d07995d94/more_itertools-10.2.0-py3-none-any.whl", + "686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684", ), ( "pypi__packaging", - "https://files.pythonhosted.org/packages/ab/c3/57f0601a2d4fe15de7a553c00adbc901425661bf048f2a22dfc500caf121/packaging-23.1-py3-none-any.whl", - "994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", + "https://files.pythonhosted.org/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl", + "2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", ), ( "pypi__pep517", - "https://files.pythonhosted.org/packages/ee/2f/ef63e64e9429111e73d3d6cbee80591672d16f2725e648ebc52096f3d323/pep517-0.13.0-py3-none-any.whl", - "4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b", + "https://files.pythonhosted.org/packages/25/6e/ca4a5434eb0e502210f591b97537d322546e4833dcb4d470a48c375c5540/pep517-0.13.1-py3-none-any.whl", + "31b206f67165b3536dd577c5c3f1518e8fbaf38cbc57efff8369a392feff1721", ), ( "pypi__pip", - "https://files.pythonhosted.org/packages/50/c2/e06851e8cc28dcad7c155f4753da8833ac06a5c704c109313b8d5a62968a/pip-23.2.1-py3-none-any.whl", - "7ccf472345f20d35bdc9d1841ff5f313260c2c33fe417f48c30ac46cccabf5be", + "https://files.pythonhosted.org/packages/8a/6a/19e9fe04fca059ccf770861c7d5721ab4c2aebc539889e97c7977528a53b/pip-24.0-py3-none-any.whl", + "ba0d021a166865d2265246961bec0152ff124de910c5cc39f1156ce3fa7c69dc", ), ( "pypi__pip_tools", @@ -71,13 +71,13 @@ _RULE_DEPS = [ ), ( "pypi__pyproject_hooks", - "https://files.pythonhosted.org/packages/d5/ea/9ae603de7fbb3df820b23a70f6aff92bf8c7770043254ad8d2dc9d6bcba4/pyproject_hooks-1.0.0-py3-none-any.whl", - "283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8", + "https://files.pythonhosted.org/packages/ae/f3/431b9d5fe7d14af7a32340792ef43b8a714e7726f1d7b69cc4e8e7a3f1d7/pyproject_hooks-1.1.0-py3-none-any.whl", + "7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2", ), ( "pypi__setuptools", - "https://files.pythonhosted.org/packages/4f/ab/0bcfebdfc3bfa8554b2b2c97a555569c4c1ebc74ea288741ea8326c51906/setuptools-68.1.2-py3-none-any.whl", - "3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b", + "https://files.pythonhosted.org/packages/de/88/70c5767a0e43eb4451c2200f07d042a4bcd7639276003a9c54a68cfcc1f8/setuptools-70.0.0-py3-none-any.whl", + "54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4", ), ( "pypi__tomli", @@ -86,13 +86,13 @@ _RULE_DEPS = [ ), ( "pypi__wheel", - "https://files.pythonhosted.org/packages/b8/8b/31273bf66016be6ad22bb7345c37ff350276cfd46e389a0c2ac5da9d9073/wheel-0.41.2-py3-none-any.whl", - "75909db2664838d015e3d9139004ee16711748a52c8f336b52882266540215d8", + "https://files.pythonhosted.org/packages/7d/cd/d7460c9a869b16c3dd4e1e403cce337df165368c71d6af229a74699622ce/wheel-0.43.0-py3-none-any.whl", + "55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81", ), ( "pypi__zipp", - "https://files.pythonhosted.org/packages/8c/08/d3006317aefe25ea79d3b76c9650afabaf6d63d1c8443b236e7405447503/zipp-3.16.2-py3-none-any.whl", - "679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0", + "https://files.pythonhosted.org/packages/da/55/a03fd7240714916507e1fcf7ae355bd9d9ed2e6db492595f1a67f61681be/zipp-3.18.2-py3-none-any.whl", + "dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e", ), # END: maintained by 'bazel run //tools/private/update_deps:update_pip_deps' ] From c84cdf5379aa286e904a9ae9519c53a7ac0f147d Mon Sep 17 00:00:00 2001 From: xinnjie Date: Wed, 29 May 2024 21:24:51 +0800 Subject: [PATCH 047/345] doc: fix `toolchains.md` mistake (#1928) Fixes #1921 --------- Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> --- docs/sphinx/toolchains.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/sphinx/toolchains.md b/docs/sphinx/toolchains.md index 6e0203a4fb..bac89660bb 100644 --- a/docs/sphinx/toolchains.md +++ b/docs/sphinx/toolchains.md @@ -38,7 +38,7 @@ you should read the dev-only library module section. ``` bazel_dep(name="rules_python", version=...) -python = use_extension("@rules_python//extensions:python.bzl", "python") +python = use_extension("@rules_python//python/extensions:python.bzl", "python") python.toolchain(python_version = "3.12", is_default = True) ``` @@ -63,7 +63,7 @@ specify `dev_dependency = True` to the bzlmod APIs: bazel_dep(name = "rules_python", version=..., dev_dependency = True) python = use_extension( - "@rules_python//extensions:python.bzl", + "@rules_python//python/extensions:python.bzl", "python", dev_dependency = True ) @@ -109,7 +109,7 @@ the version-aware rules for `py_binary`. # MODULE.bazel bazel_dep(name = "rules_python", version=...) -python = use_extension("@rules_python//extensions:python.bzl", "python") +python = use_extension("@rules_python//python/extensions:python.bzl", "python") python.toolchain(python_version = "3.12") # BUILD.bazel From b4b52fc89a58e6b7d5d0675b0661a09f932ec37e Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 1 Jun 2024 13:36:48 +0900 Subject: [PATCH 048/345] refactor/fix: store dists in parse_requirements output (#1917) This moves some of the code out of the `pip.bzl` extension and changes the layout of the code to prepare for multi-platform whl support. Summary: * parse_requirements: add whls and sdists attribute, so that we can use a function to populate the lists. Not sure if there is a better way to do this. * parse_requirements: add an extra code to ensure that we are handling the target platform filtering correctly. * select_whl: split the `select_whl` into `select_whls`, which filters the whls (this can be used later in multi-platform selects) and select_whl , which just is used get the most appropriate whl for the host platform. * Additionally fix the logic in `select_whl`, which would result in Python 3.12 wheels being selected on Python 3.11 interpreters because we were not taking into account the interpreter tag when doing the filtering. Fixes #1930 --- CHANGELOG.md | 2 + python/pip_install/pip_repository.bzl | 12 +- python/private/bzlmod/pip.bzl | 82 ++--- python/private/parse_requirements.bzl | 123 ++++++- python/private/parse_whl_name.bzl | 26 +- python/private/repo_utils.bzl | 38 +++ python/private/whl_target_platforms.bzl | 172 +++++++--- .../parse_requirements_tests.bzl | 71 ++++ .../whl_target_platforms/select_whl_tests.bzl | 323 ++++++++++++++---- 9 files changed, 655 insertions(+), 194 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e15be3bbcc..3fdd039a5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,8 @@ A brief description of the categories of changes: "panic: runtime error: invalid memory address or nil pointer dereference" * (bzlmod) remove `pip.parse(annotations)` attribute as it is unused and has been replaced by whl_modifications. +* (pip) Correctly select wheels when the python tag includes minor versions. + See ([#1930](https://github.com/bazelbuild/rules_python/issues/1930)) ### Added * (rules) Precompiling Python source at build time is available. but is diff --git a/python/pip_install/pip_repository.bzl b/python/pip_install/pip_repository.bzl index 17d80838e0..d6c8d9149c 100644 --- a/python/pip_install/pip_repository.bzl +++ b/python/pip_install/pip_repository.bzl @@ -584,7 +584,17 @@ python_interpreter. An example value: "@python3_x86_64-unknown-linux-gnu//:pytho ), "quiet": attr.bool( default = True, - doc = "If True, suppress printing stdout and stderr output to the terminal.", + doc = """\ +If True, suppress printing stdout and stderr output to the terminal. + +If you would like to get more diagnostic output, please use: + + RULES_PYTHON_REPO_DEBUG=1 + +or + + RULES_PYTHON_REPO_DEBUG_VERBOSITY= +""", ), "repo_prefix": attr.string( doc = """ diff --git a/python/private/bzlmod/pip.bzl b/python/private/bzlmod/pip.bzl index aa70810549..9e29877b42 100644 --- a/python/private/bzlmod/pip.bzl +++ b/python/private/bzlmod/pip.bzl @@ -28,6 +28,7 @@ load("//python/private:parse_requirements.bzl", "host_platform", "parse_requirem load("//python/private:parse_whl_name.bzl", "parse_whl_name") load("//python/private:pypi_index.bzl", "simpleapi_download") load("//python/private:render_pkg_aliases.bzl", "whl_alias") +load("//python/private:repo_utils.bzl", "repo_utils") load("//python/private:version_label.bzl", "version_label") load("//python/private:whl_target_platforms.bzl", "select_whl") load(":pip_repository.bzl", "pip_repository") @@ -100,6 +101,7 @@ You cannot use both the additive_build_content and additive_build_content_file a ) def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, simpleapi_cache): + logger = repo_utils.logger(module_ctx) python_interpreter_target = pip_attr.python_interpreter_target # if we do not have the python_interpreter set in the attributes @@ -160,32 +162,18 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s # Create a new wheel library for each of the different whls - requirements_by_platform = parse_requirements( - module_ctx, - requirements_by_platform = pip_attr.requirements_by_platform, - requirements_linux = pip_attr.requirements_linux, - requirements_lock = pip_attr.requirements_lock, - requirements_osx = pip_attr.requirements_darwin, - requirements_windows = pip_attr.requirements_windows, - extra_pip_args = pip_attr.extra_pip_args, - ) - - index_urls = {} + get_index_urls = None if pip_attr.experimental_index_url: if pip_attr.download_only: fail("Currently unsupported to use `download_only` and `experimental_index_url`") - index_urls = simpleapi_download( - module_ctx, + get_index_urls = lambda ctx, distributions: simpleapi_download( + ctx, attr = struct( index_url = pip_attr.experimental_index_url, extra_index_urls = pip_attr.experimental_extra_index_urls or [], index_url_overrides = pip_attr.experimental_index_url_overrides or {}, - sources = list({ - req.distribution: None - for reqs in requirements_by_platform.values() - for req in reqs - }), + sources = distributions, envsubst = pip_attr.envsubst, # Auth related info netrc = pip_attr.netrc, @@ -195,6 +183,19 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s parallel_download = pip_attr.parallel_download, ) + requirements_by_platform = parse_requirements( + module_ctx, + requirements_by_platform = pip_attr.requirements_by_platform, + requirements_linux = pip_attr.requirements_linux, + requirements_lock = pip_attr.requirements_lock, + requirements_osx = pip_attr.requirements_darwin, + requirements_windows = pip_attr.requirements_windows, + extra_pip_args = pip_attr.extra_pip_args, + get_index_urls = get_index_urls, + python_version = major_minor, + logger = logger, + ) + repository_platform = host_platform(module_ctx.os) for whl_name, requirements in requirements_by_platform.items(): requirement = select_requirement( @@ -255,37 +256,22 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s ) whl_library_args.update({k: v for k, (v, default) in maybe_args_with_default.items() if v == default}) - if index_urls: - whls = [] - sdist = None - for sha256 in requirement.srcs.shas: - # For now if the artifact is marked as yanked we just ignore it. - # - # See https://packaging.python.org/en/latest/specifications/simple-repository-api/#adding-yank-support-to-the-simple-api - - maybe_whl = index_urls[whl_name].whls.get(sha256) - if maybe_whl and not maybe_whl.yanked: - whls.append(maybe_whl) - continue - - maybe_sdist = index_urls[whl_name].sdists.get(sha256) - if maybe_sdist and not maybe_sdist.yanked: - sdist = maybe_sdist - continue - - print("WARNING: Could not find a whl or an sdist with sha256={}".format(sha256)) # buildifier: disable=print - + if requirement.whls or requirement.sdist: + logger.debug(lambda: "Selecting a compatible dist for {} from dists:\n{}".format( + repository_platform, + json.encode( + struct( + whls = requirement.whls, + sdist = requirement.sdist, + ), + ), + )) distribution = select_whl( - whls = whls, - want_abis = [ - "none", - "abi3", - "cp" + major_minor.replace(".", ""), - # Older python versions have wheels for the `*m` ABI. - "cp" + major_minor.replace(".", "") + "m", - ], + whls = requirement.whls, want_platform = repository_platform, - ) or sdist + ) or requirement.sdist + + logger.debug(lambda: "Selected: {}".format(distribution)) if distribution: whl_library_args["requirement"] = requirement.srcs.requirement @@ -303,7 +289,7 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s # This is no-op because pip is not used to download the wheel. whl_library_args.pop("download_only", None) else: - print("WARNING: falling back to pip for installing the right file for {}".format(requirement.requirement_line)) # buildifier: disable=print + logger.warn("falling back to pip for installing the right file for {}".format(requirement.requirement_line)) # 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. diff --git a/python/private/parse_requirements.bzl b/python/private/parse_requirements.bzl index f9d7a05386..c6a498539f 100644 --- a/python/private/parse_requirements.bzl +++ b/python/private/parse_requirements.bzl @@ -29,7 +29,7 @@ behavior. load("//python/pip_install:requirements_parser.bzl", "parse") load(":normalize_name.bzl", "normalize_name") load(":pypi_index_sources.bzl", "get_simpleapi_sources") -load(":whl_target_platforms.bzl", "whl_target_platforms") +load(":whl_target_platforms.bzl", "select_whls", "whl_target_platforms") # This includes the vendored _translate_cpu and _translate_os from # @platforms//host:extension.bzl at version 0.0.9 so that we don't @@ -84,6 +84,11 @@ def _default_platforms(*, filter): if not filter: fail("Must specific a filter string, got: {}".format(filter)) + if filter.startswith("cp3"): + # TODO @aignas 2024-05-23: properly handle python versions in the filter. + # For now we are just dropping it to ensure that we don't fail. + _, _, filter = filter.partition("_") + sanitized = filter.replace("*", "").replace("_", "") if sanitized and not sanitized.isalnum(): fail("The platform filter can only contain '*', '_' and alphanumerics") @@ -142,6 +147,9 @@ def parse_requirements( requirements_lock = None, requirements_windows = None, extra_pip_args = [], + get_index_urls = None, + python_version = None, + logger = None, fail_fn = fail): """Get the requirements with platforms that the requirements apply to. @@ -156,6 +164,12 @@ def parse_requirements( requirements_windows (label): The requirements file for windows OS. extra_pip_args (string list): Extra pip arguments to perform extra validations and to be joined with args fined in files. + get_index_urls: Callable[[ctx, list[str]], dict], a callable to get all + of the distribution URLs from a PyPI index. Accepts ctx and + distribution names to query. + python_version: str or None. This is needed when the get_index_urls is + specified. It should be of the form "3.x.x", + logger: repo_utils.logger or None, a simple struct to log diagnostic messages. fail_fn (Callable[[str], None]): A failure function used in testing failure cases. Returns: @@ -312,20 +326,46 @@ def parse_requirements( ) for_req.target_platforms.append(target_platform) - return { - whl_name: [ - struct( - distribution = r.distribution, - srcs = r.srcs, - requirement_line = r.requirement_line, - target_platforms = sorted(r.target_platforms), - extra_pip_args = r.extra_pip_args, - download = r.download, + index_urls = {} + if get_index_urls: + if not python_version: + fail_fn("'python_version' must be provided") + return None + + index_urls = get_index_urls( + ctx, + # Use list({}) as a way to have a set + list({ + req.distribution: None + for reqs in requirements_by_platform.values() + for req in reqs.values() + }), + ) + + ret = {} + for whl_name, reqs in requirements_by_platform.items(): + for r in sorted(reqs.values(), key = lambda r: r.requirement_line): + whls, sdist = _add_dists( + r, + index_urls.get(whl_name), + python_version = python_version, + logger = logger, ) - for r in sorted(reqs.values(), key = lambda r: r.requirement_line) - ] - for whl_name, reqs in requirements_by_platform.items() - } + + ret.setdefault(whl_name, []).append( + struct( + distribution = r.distribution, + srcs = r.srcs, + requirement_line = r.requirement_line, + target_platforms = sorted(r.target_platforms), + extra_pip_args = r.extra_pip_args, + download = r.download, + whls = whls, + sdist = sdist, + ), + ) + + return ret def select_requirement(requirements, *, platform): """A simple function to get a requirement for a particular platform. @@ -372,3 +412,58 @@ def host_platform(repository_os): _translate_os(repository_os.name.lower()), _translate_cpu(repository_os.arch.lower()), ) + +def _add_dists(requirement, index_urls, python_version, logger = None): + """Populate dists based on the information from the PyPI index. + + This function will modify the given requirements_by_platform data structure. + + Args: + requirement: The result of parse_requirements function. + index_urls: The result of simpleapi_download. + python_version: The version of the python interpreter. + logger: A logger for printing diagnostic info. + """ + if not index_urls: + return [], None + + whls = [] + sdist = None + + # TODO @aignas 2024-05-22: it is in theory possible to add all + # requirements by version instead of by sha256. This may be useful + # for some projects. + for sha256 in requirement.srcs.shas: + # For now if the artifact is marked as yanked we just ignore it. + # + # See https://packaging.python.org/en/latest/specifications/simple-repository-api/#adding-yank-support-to-the-simple-api + + maybe_whl = index_urls.whls.get(sha256) + if maybe_whl and not maybe_whl.yanked: + whls.append(maybe_whl) + continue + + maybe_sdist = index_urls.sdists.get(sha256) + if maybe_sdist and not maybe_sdist.yanked: + sdist = maybe_sdist + continue + + if logger: + logger.warn("Could not find a whl or an sdist with sha256={}".format(sha256)) + + # Filter out the wheels that are incompatible with the target_platforms. + whls = select_whls( + whls = whls, + want_abis = [ + "none", + "abi3", + "cp" + python_version.replace(".", ""), + # Older python versions have wheels for the `*m` ABI. + "cp" + python_version.replace(".", "") + "m", + ], + want_platforms = requirement.target_platforms, + want_python_version = python_version, + logger = logger, + ) + + return whls, sdist diff --git a/python/private/parse_whl_name.bzl b/python/private/parse_whl_name.bzl index 9c7866eb9e..063ac84a92 100644 --- a/python/private/parse_whl_name.bzl +++ b/python/private/parse_whl_name.bzl @@ -16,6 +16,30 @@ A starlark implementation of a Wheel filename parsing. """ +# Taken from https://peps.python.org/pep-0600/ +_LEGACY_ALIASES = { + "manylinux1_i686": "manylinux_2_5_i686", + "manylinux1_x86_64": "manylinux_2_5_x86_64", + "manylinux2010_i686": "manylinux_2_12_i686", + "manylinux2010_x86_64": "manylinux_2_12_x86_64", + "manylinux2014_aarch64": "manylinux_2_17_aarch64", + "manylinux2014_armv7l": "manylinux_2_17_armv7l", + "manylinux2014_i686": "manylinux_2_17_i686", + "manylinux2014_ppc64": "manylinux_2_17_ppc64", + "manylinux2014_ppc64le": "manylinux_2_17_ppc64le", + "manylinux2014_s390x": "manylinux_2_17_s390x", + "manylinux2014_x86_64": "manylinux_2_17_x86_64", +} + +def normalize_platform_tag(tag): + """Resolve legacy aliases to modern equivalents for easier parsing elsewhere.""" + return ".".join(list({ + # The `list({})` usage here is to use it as a string set, where we will + # deduplicate, but otherwise retain the order of the tags. + _LEGACY_ALIASES.get(p, p): None + for p in tag.split(".") + })) + def parse_whl_name(file): """Parse whl file name into a struct of constituents. @@ -68,5 +92,5 @@ def parse_whl_name(file): build_tag = build_tag, python_tag = python_tag, abi_tag = abi_tag, - platform_tag = platform_tag, + platform_tag = normalize_platform_tag(platform_tag), ) diff --git a/python/private/repo_utils.bzl b/python/private/repo_utils.bzl index 7a5921781d..52677584e4 100644 --- a/python/private/repo_utils.bzl +++ b/python/private/repo_utils.bzl @@ -18,6 +18,7 @@ This code should only be loaded and used during the repository phase. """ REPO_DEBUG_ENV_VAR = "RULES_PYTHON_REPO_DEBUG" +REPO_VERBOSITY_ENV_VAR = "RULES_PYTHON_REPO_DEBUG_VERBOSITY" def _is_repo_debug_enabled(rctx): """Tells if debbugging output is requested during repo operatiosn. @@ -41,6 +42,42 @@ def _debug_print(rctx, message_cb): if _is_repo_debug_enabled(rctx): print(message_cb()) # buildifier: disable=print +def _logger(rctx): + """Creates a logger instance for printing messages. + + Args: + rctx: repository_ctx object. + + Returns: + A struct with attributes logging: trace, debug, info, warn, fail. + """ + if _is_repo_debug_enabled(rctx): + verbosity_level = "DEBUG" + else: + verbosity_level = "WARN" + + env_var_verbosity = rctx.os.environ.get(REPO_VERBOSITY_ENV_VAR) + verbosity_level = env_var_verbosity or verbosity_level + + verbosity = { + "DEBUG": 2, + "INFO": 1, + "TRACE": 3, + }.get(verbosity_level, 0) + + def _log(enabled_on_verbosity, level, message_cb): + if verbosity < enabled_on_verbosity: + return + + print("\nrules_python: {}: ".format(level.upper()), message_cb()) # buildifier: disable=print + + return struct( + trace = lambda message_cb: _log(3, "TRACE", message_cb), + debug = lambda message_cb: _log(2, "DEBUG", message_cb), + info = lambda message_cb: _log(1, "INFO", message_cb), + warn = lambda message_cb: _log(0, "WARNING", message_cb), + ) + def _execute_internal( rctx, *, @@ -232,4 +269,5 @@ repo_utils = struct( is_repo_debug_enabled = _is_repo_debug_enabled, debug_print = _debug_print, which_checked = _which_checked, + logger = _logger, ) diff --git a/python/private/whl_target_platforms.bzl b/python/private/whl_target_platforms.bzl index 14e178a66b..678c841feb 100644 --- a/python/private/whl_target_platforms.bzl +++ b/python/private/whl_target_platforms.bzl @@ -18,21 +18,6 @@ A starlark implementation of the wheel platform tag parsing to get the target pl load(":parse_whl_name.bzl", "parse_whl_name") -# Taken from https://peps.python.org/pep-0600/ -_LEGACY_ALIASES = { - "manylinux1_i686": "manylinux_2_5_i686", - "manylinux1_x86_64": "manylinux_2_5_x86_64", - "manylinux2010_i686": "manylinux_2_12_i686", - "manylinux2010_x86_64": "manylinux_2_12_x86_64", - "manylinux2014_aarch64": "manylinux_2_17_aarch64", - "manylinux2014_armv7l": "manylinux_2_17_armv7l", - "manylinux2014_i686": "manylinux_2_17_i686", - "manylinux2014_ppc64": "manylinux_2_17_ppc64", - "manylinux2014_ppc64le": "manylinux_2_17_ppc64le", - "manylinux2014_s390x": "manylinux_2_17_s390x", - "manylinux2014_x86_64": "manylinux_2_17_x86_64", -} - # The order of the dictionaries is to keep definitions with their aliases next to each # other _CPU_ALIASES = { @@ -48,6 +33,7 @@ _CPU_ALIASES = { "ppc64": "ppc", "ppc64le": "ppc", "s390x": "s390x", + "arm": "arm", "armv6l": "arm", "armv7l": "arm", } # buildifier: disable=unsorted-dict-items @@ -90,7 +76,6 @@ def _whl_priority(value): value, _, _ = value.partition(".") if "any" == value: - # This is just a big value that should be larger than any other value returned by this function return (True, False, 0, 0) if "linux" in value: @@ -118,68 +103,145 @@ def _whl_priority(value): # Windows does not have multiple wheels for the same target platform return (False, False, 0, 0) -def select_whl(*, whls, want_abis, want_platform): - """Select a suitable wheel from a list. +def select_whls(*, whls, want_python_version = "3.0", want_abis = [], want_platforms = [], logger = None): + """Select a subset of wheels suitable for target platforms from a list. Args: - whls(list[struct]): A list of candidates. + whls(list[struct]): A list of candidates which have a `filename` + attribute containing the `whl` filename. + want_python_version(str): An optional parameter to filter whls by python version. Defaults to '3.0'. want_abis(list[str]): A list of ABIs that are supported. - want_platform(str): The target platform. + want_platforms(str): The platforms + logger: A logger for printing diagnostic messages. Returns: - None or a struct with `url`, `sha256` and `filename` attributes for the - selected whl. If no match is found, None is returned. + A filtered list of items from the `whls` arg where `filename` matches + the selected criteria. If no match is found, an empty list is returned. """ if not whls: - return None + return [] + + version_limit = -1 + if want_python_version: + version_limit = int(want_python_version.split(".")[1]) candidates = {} for whl in whls: parsed = parse_whl_name(whl.filename) - if parsed.abi_tag not in want_abis: - # Filter out incompatible ABIs - continue - platform_tags = list({_LEGACY_ALIASES.get(p, p): True for p in parsed.platform_tag.split(".")}) + if logger: + logger.trace(lambda: "Deciding whether to use '{}'".format(whl.filename)) + + supported_implementations = {} + whl_version_min = 0 + for tag in parsed.python_tag.split("."): + supported_implementations[tag[:2]] = None - for tag in platform_tags: - candidates[tag] = whl + if tag.startswith("cp3") or tag.startswith("py3"): + version = int(tag[len("..3"):] or 0) + else: + # In this case it should be eithor "cp2" or "py2" and we will default + # to `whl_version_min` = 0 + continue - # For most packages - if they supply 'any' wheel and there are no other - # compatible wheels with the selected abis, we can just return the value. - if len(candidates) == 1 and "any" in candidates: - return struct( - url = candidates["any"].url, - sha256 = candidates["any"].sha256, - filename = candidates["any"].filename, - ) + if whl_version_min == 0 or version < whl_version_min: + whl_version_min = version - target_plats = {} - has_any = "any" in candidates - for platform_tag, whl in candidates.items(): - if platform_tag == "any": + if not ("cp" in supported_implementations or "py" in supported_implementations): + if logger: + logger.trace(lambda: "Discarding the whl because the whl does not support CPython, whl supported implementations are: {}".format(supported_implementations)) continue - if "musl" in platform_tag: - # Ignore musl wheels for now + if want_abis and parsed.abi_tag not in want_abis: + # Filter out incompatible ABIs + if logger: + logger.trace(lambda: "Discarding the whl because the whl abi did not match") continue - platform_tag = ".".join({_LEGACY_ALIASES.get(p, p): True for p in platform_tag.split(".")}) - platforms = whl_target_platforms(platform_tag) - for p in platforms: - target_plats.setdefault("{}_{}".format(p.os, p.cpu), []).append(platform_tag) + if version_limit != -1 and whl_version_min > version_limit: + if logger: + logger.trace(lambda: "Discarding the whl because the whl supported python version is too high") + continue - for p, platform_tags in target_plats.items(): - if has_any: - platform_tags.append("any") + compatible = False + if parsed.platform_tag == "any": + compatible = True + else: + for p in whl_target_platforms(parsed.platform_tag): + if p.target_platform in want_platforms: + compatible = True + break + + if not compatible: + if logger: + logger.trace(lambda: "Discarding the whl because the whl does not support the desired platforms: {}".format(want_platforms)) + continue - target_plats[p] = sorted(platform_tags, key = _whl_priority) + for implementation in supported_implementations: + candidates.setdefault( + ( + parsed.abi_tag, + parsed.platform_tag, + ), + {}, + ).setdefault( + ( + # prefer cp implementation + implementation == "cp", + # prefer higher versions + whl_version_min, + # prefer abi3 over none + parsed.abi_tag != "none", + # prefer cpx abi over abi3 + parsed.abi_tag != "abi3", + ), + [], + ).append(whl) + + return [ + candidates[key][sorted(v)[-1]][-1] + for key, v in candidates.items() + ] + +def select_whl(*, whls, want_platform): + """Select a suitable wheel from a list. + + Args: + whls(list[struct]): A list of candidates. + want_platform(str): The target platform. - want = target_plats.get(want_platform) - if not want: - return want + Returns: + None or a struct with `url`, `sha256` and `filename` attributes for the + selected whl. If no match is found, None is returned. + """ + if not whls: + return None + + # TODO @aignas 2024-05-23: once we do the selection in the hub repo using + # an actual select, then this function will be the one that is used within + # the repository context instead of `select_whl`. + whls = select_whls( + whls = whls, + want_python_version = "", + want_platforms = [want_platform], + ) + + candidates = { + parse_whl_name(w.filename).platform_tag: w + for w in whls + # TODO @aignas 2024-06-01: to be addressed in #1837, where we add the necessary + # config settings. + if "musllinux_" not in w.filename + } + + target_whl_platform = sorted( + candidates.keys(), + key = _whl_priority, + ) + if not target_whl_platform: + return None - return candidates[want[0]] + return candidates[target_whl_platform[0]] def whl_target_platforms(platform_tag, abi_tag = ""): """Parse the wheel abi and platform tags and return (os, cpu) tuples. diff --git a/tests/private/parse_requirements/parse_requirements_tests.bzl b/tests/private/parse_requirements/parse_requirements_tests.bzl index 0d6cd4e0e0..81cf523460 100644 --- a/tests/private/parse_requirements/parse_requirements_tests.bzl +++ b/tests/private/parse_requirements/parse_requirements_tests.bzl @@ -96,6 +96,8 @@ def _test_simple(env): "osx_x86_64", "windows_x86_64", ], + whls = [], + sdist = None, ), ], }) @@ -109,6 +111,47 @@ def _test_simple(env): _tests.append(_test_simple) +def _test_platform_markers_with_python_version(env): + got = parse_requirements( + ctx = _mock_ctx(), + requirements_by_platform = { + "requirements_lock": "cp39_linux_*", + }, + ) + got_alternative = parse_requirements( + ctx = _mock_ctx(), + requirements_by_platform = { + "requirements_lock": "linux_*", + }, + ) + env.expect.that_dict(got).contains_exactly({ + "foo": [ + struct( + distribution = "foo", + download = False, + extra_pip_args = [], + requirement_line = "foo[extra]==0.0.1 --hash=sha256:deadbeef", + srcs = struct( + requirement = "foo[extra]==0.0.1", + shas = ["deadbeef"], + version = "0.0.1", + ), + target_platforms = [ + "linux_aarch64", + "linux_arm", + "linux_ppc", + "linux_s390x", + "linux_x86_64", + ], + whls = [], + sdist = None, + ), + ], + }) + env.expect.that_dict(got).contains_exactly(got_alternative) + +_tests.append(_test_platform_markers_with_python_version) + def _test_dupe_requirements(env): got = parse_requirements( ctx = _mock_ctx(), @@ -136,6 +179,8 @@ def _test_dupe_requirements(env): "osx_x86_64", "windows_x86_64", ], + whls = [], + sdist = None, ), ], }) @@ -173,6 +218,8 @@ def _test_multi_os(env): version = "0.0.1", ), target_platforms = ["windows_x86_64"], + whls = [], + sdist = None, ), ], "foo": [ @@ -195,6 +242,8 @@ def _test_multi_os(env): "osx_aarch64", "osx_x86_64", ], + whls = [], + sdist = None, ), struct( distribution = "foo", @@ -207,6 +256,8 @@ def _test_multi_os(env): version = "0.0.2", ), target_platforms = ["windows_x86_64"], + whls = [], + sdist = None, ), ], }) @@ -264,6 +315,8 @@ def _test_multi_os_download_only_platform(env): version = "0.0.3", ), target_platforms = ["linux_x86_64"], + whls = [], + sdist = None, ), ], }) @@ -316,6 +369,8 @@ def _test_os_arch_requirements_with_default(env): version = "0.0.3", ), target_platforms = ["linux_aarch64", "linux_x86_64"], + whls = [], + sdist = None, ), struct( distribution = "foo", @@ -328,6 +383,8 @@ def _test_os_arch_requirements_with_default(env): version = "", ), target_platforms = ["linux_super_exotic"], + whls = [], + sdist = None, ), struct( distribution = "foo", @@ -347,6 +404,8 @@ def _test_os_arch_requirements_with_default(env): "osx_x86_64", "windows_x86_64", ], + whls = [], + sdist = None, ), ], }) @@ -365,6 +424,18 @@ def _test_os_arch_requirements_with_default(env): _tests.append(_test_os_arch_requirements_with_default) +def _test_fail_no_python_version(env): + errors = [] + parse_requirements( + ctx = _mock_ctx(), + requirements_lock = "requirements_lock", + get_index_urls = lambda _, __: {}, + fail_fn = errors.append, + ) + env.expect.that_str(errors[0]).equals("'python_version' must be provided") + +_tests.append(_test_fail_no_python_version) + def parse_requirements_test_suite(name): """Create the test suite. diff --git a/tests/private/whl_target_platforms/select_whl_tests.bzl b/tests/private/whl_target_platforms/select_whl_tests.bzl index bed6d6633c..ebd2b263f1 100644 --- a/tests/private/whl_target_platforms/select_whl_tests.bzl +++ b/tests/private/whl_target_platforms/select_whl_tests.bzl @@ -15,108 +15,281 @@ "" load("@rules_testing//lib:test_suite.bzl", "test_suite") -load("//python/private:whl_target_platforms.bzl", "select_whl") # buildifier: disable=bzl-visibility +load("//python/private:whl_target_platforms.bzl", "select_whl", "select_whls") # buildifier: disable=bzl-visibility WHL_LIST = [ - struct( - filename = f, - url = "https://" + f, - sha256 = "sha256://" + f, - ) - for f in [ - "pkg-0.0.1-cp311-cp311-macosx_10_9_universal2.whl", - "pkg-0.0.1-cp311-cp311-macosx_10_9_x86_64.whl", - "pkg-0.0.1-cp311-cp311-macosx_11_0_arm64.whl", - "pkg-0.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", - "pkg-0.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", - "pkg-0.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", - "pkg-0.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "pkg-0.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", - "pkg-0.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", - "pkg-0.0.1-cp311-cp311-musllinux_1_1_i686.whl", - "pkg-0.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl", - "pkg-0.0.1-cp311-cp311-musllinux_1_1_s390x.whl", - "pkg-0.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", - "pkg-0.0.1-cp311-cp311-win32.whl", - "pkg-0.0.1-cp311-cp311-win_amd64.whl", - "pkg-0.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", - "pkg-0.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", - "pkg-0.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", - "pkg-0.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", - "pkg-0.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "pkg-0.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", - "pkg-0.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", - "pkg-0.0.1-cp37-cp37m-musllinux_1_1_i686.whl", - "pkg-0.0.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", - "pkg-0.0.1-cp37-cp37m-musllinux_1_1_s390x.whl", - "pkg-0.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", - "pkg-0.0.1-cp37-cp37m-win32.whl", - "pkg-0.0.1-cp37-cp37m-win_amd64.whl", - "pkg-0.0.1-cp39-cp39-macosx_10_9_universal2.whl", - "pkg-0.0.1-cp39-cp39-macosx_10_9_x86_64.whl", - "pkg-0.0.1-cp39-cp39-macosx_11_0_arm64.whl", - "pkg-0.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", - "pkg-0.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", - "pkg-0.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", - "pkg-0.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "pkg-0.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", - "pkg-0.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", - "pkg-0.0.1-cp39-cp39-musllinux_1_1_i686.whl", - "pkg-0.0.1-cp39-cp39-musllinux_1_1_ppc64le.whl", - "pkg-0.0.1-cp39-cp39-musllinux_1_1_s390x.whl", - "pkg-0.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", - "pkg-0.0.1-cp39-cp39-win32.whl", - "pkg-0.0.1-cp39-cp39-win_amd64.whl", - "pkg-0.0.1-py3-abi3-any.whl", - "pkg-0.0.1-py3-none-any.whl", - ] + "pkg-0.0.1-cp311-cp311-macosx_10_9_universal2.whl", + "pkg-0.0.1-cp311-cp311-macosx_10_9_x86_64.whl", + "pkg-0.0.1-cp311-cp311-macosx_11_0_arm64.whl", + "pkg-0.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "pkg-0.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", + "pkg-0.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", + "pkg-0.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "pkg-0.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", + "pkg-0.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", + "pkg-0.0.1-cp311-cp311-musllinux_1_1_i686.whl", + "pkg-0.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl", + "pkg-0.0.1-cp311-cp311-musllinux_1_1_s390x.whl", + "pkg-0.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", + "pkg-0.0.1-cp311-cp311-win32.whl", + "pkg-0.0.1-cp311-cp311-win_amd64.whl", + "pkg-0.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", + "pkg-0.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "pkg-0.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", + "pkg-0.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", + "pkg-0.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "pkg-0.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", + "pkg-0.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", + "pkg-0.0.1-cp37-cp37m-musllinux_1_1_i686.whl", + "pkg-0.0.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", + "pkg-0.0.1-cp37-cp37m-musllinux_1_1_s390x.whl", + "pkg-0.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", + "pkg-0.0.1-cp37-cp37m-win32.whl", + "pkg-0.0.1-cp37-cp37m-win_amd64.whl", + "pkg-0.0.1-cp39-cp39-macosx_10_9_universal2.whl", + "pkg-0.0.1-cp39-cp39-macosx_10_9_x86_64.whl", + "pkg-0.0.1-cp39-cp39-macosx_11_0_arm64.whl", + "pkg-0.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "pkg-0.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", + "pkg-0.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", + "pkg-0.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "pkg-0.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", + "pkg-0.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", + "pkg-0.0.1-cp39-cp39-musllinux_1_1_i686.whl", + "pkg-0.0.1-cp39-cp39-musllinux_1_1_ppc64le.whl", + "pkg-0.0.1-cp39-cp39-musllinux_1_1_s390x.whl", + "pkg-0.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", + "pkg-0.0.1-cp39-cp39-win32.whl", + "pkg-0.0.1-cp39-cp39-win_amd64.whl", + "pkg-0.0.1-cp39-abi3-any.whl", + "pkg-0.0.1-py310-abi3-any.whl", + "pkg-0.0.1-py3-abi3-any.whl", + "pkg-0.0.1-py3-none-any.whl", ] -def _match(env, got, want_filename): - if want_filename: - env.expect.that_str(got.filename).equals(want_filename) - env.expect.that_str(got.sha256).equals("sha256://" + want_filename) - env.expect.that_str(got.url).equals("https://" + want_filename) - else: - env.expect.that_int(got).equals(None) +def _match(env, got, *want_filenames): + if not want_filenames: + env.expect.that_collection(got).has_size(len(want_filenames)) + return + + got_filenames = [g.filename for g in got] + env.expect.that_collection(got_filenames).contains_exactly(want_filenames) + + if got: + # Check that we pass the original structs + env.expect.that_str(got[0].other).equals("dummy") + +def _select_whl(**kwargs): + """A small wrapper to make the tests more DRY.""" + got_single = select_whl(**kwargs) + return [got_single] if got_single else [] + +def _select_whls(whls, **kwargs): + return select_whls( + whls = [ + struct( + filename = f, + other = "dummy", + ) + for f in whls + ], + **kwargs + ) _tests = [] -def _test_selecting(env): - got = select_whl(whls = WHL_LIST, want_abis = ["none"], want_platform = "ignored") - _match(env, got, "pkg-0.0.1-py3-none-any.whl") +def _test_simplest(env): + got = _select_whls( + whls = [ + "pkg-0.0.1-py2.py3-abi3-any.whl", + "pkg-0.0.1-py3-abi3-any.whl", + "pkg-0.0.1-py3-none-any.whl", + ], + want_abis = ["none"], + want_platforms = ["ignored"], + ) + _match( + env, + got, + "pkg-0.0.1-py3-none-any.whl", + ) + +_tests.append(_test_simplest) + +def _test_select_abi3(env): + got = _select_whls( + whls = [ + "pkg-0.0.1-py2.py3-abi3-any.whl", + "pkg-0.0.1-py3-abi3-any.whl", + "pkg-0.0.1-py3-none-any.whl", + ], + want_abis = ["abi3"], + want_platforms = ["ignored"], + ) + _match( + env, + got, + "pkg-0.0.1-py3-abi3-any.whl", + ) + +_tests.append(_test_select_abi3) + +def _test_select_by_supported_py_version(env): + for want_python_version, match in { + "3.11": "pkg-0.0.1-py311-abi3-any.whl", + "3.8": "pkg-0.0.1-py3-abi3-any.whl", + }.items(): + got = _select_whls( + whls = [ + "pkg-0.0.1-py2.py3-abi3-any.whl", + "pkg-0.0.1-py3-abi3-any.whl", + "pkg-0.0.1-py311-abi3-any.whl", + ], + want_abis = ["abi3"], + want_platforms = ["ignored"], + want_python_version = want_python_version, + ) + _match(env, got, match) + +_tests.append(_test_select_by_supported_py_version) - got = select_whl(whls = WHL_LIST, want_abis = ["abi3"], want_platform = "ignored") - _match(env, got, "pkg-0.0.1-py3-abi3-any.whl") +def _test_select_by_supported_cp_version(env): + for want_python_version, match in { + "3.11": "pkg-0.0.1-cp311-abi3-any.whl", + "3.8": "pkg-0.0.1-py3-abi3-any.whl", + }.items(): + got = _select_whls( + whls = [ + "pkg-0.0.1-py2.py3-abi3-any.whl", + "pkg-0.0.1-py3-abi3-any.whl", + "pkg-0.0.1-py311-abi3-any.whl", + "pkg-0.0.1-cp311-abi3-any.whl", + ], + want_abis = ["abi3"], + want_platforms = ["ignored"], + want_python_version = want_python_version, + ) + _match(env, got, match) - # Check the selection failure - got = select_whl(whls = WHL_LIST, want_abis = ["cp39"], want_platform = "fancy_exotic") - _match(env, got, None) +_tests.append(_test_select_by_supported_cp_version) +def _test_supported_cp_version_manylinux(env): + for want_python_version, match in { + "3.11": "pkg-0.0.1-cp311-none-manylinux_x86_64.whl", + "3.8": "pkg-0.0.1-py3-none-manylinux_x86_64.whl", + }.items(): + got = _select_whls( + whls = [ + "pkg-0.0.1-py2.py3-none-manylinux_x86_64.whl", + "pkg-0.0.1-py3-none-manylinux_x86_64.whl", + "pkg-0.0.1-py311-none-manylinux_x86_64.whl", + "pkg-0.0.1-cp311-none-manylinux_x86_64.whl", + ], + want_abis = ["none"], + want_platforms = ["linux_x86_64"], + want_python_version = want_python_version, + ) + _match(env, got, match) + +_tests.append(_test_supported_cp_version_manylinux) + +def _test_ignore_unsupported(env): + got = _select_whls( + whls = [ + "pkg-0.0.1-xx3-abi3-any.whl", + ], + want_abis = ["abi3"], + want_platforms = ["ignored"], + ) + _match(env, got) + +_tests.append(_test_ignore_unsupported) + +def _test_match_abi_and_not_py_version(env): # Check we match the ABI and not the py version - got = select_whl(whls = WHL_LIST, want_abis = ["cp37m"], want_platform = "linux_x86_64") + got = _select_whls(whls = WHL_LIST, want_abis = ["cp37m"], want_platforms = ["linux_x86_64"], want_python_version = "3.7") + _match( + env, + got, + "pkg-0.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "pkg-0.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", + ) + got = _select_whl(whls = got, want_platform = "linux_x86_64") _match(env, got, "pkg-0.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl") +_tests.append(_test_match_abi_and_not_py_version) + +def _test_select_filename_with_many_tags(env): # Check we can select a filename with many platform tags - got = select_whl(whls = WHL_LIST, want_abis = ["cp39"], want_platform = "linux_x86_32") + got = _select_whls(whls = WHL_LIST, want_abis = ["cp39"], want_platforms = ["linux_x86_32"], want_python_version = "3.9") + _match( + env, + got, + "pkg-0.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", + "pkg-0.0.1-cp39-cp39-musllinux_1_1_i686.whl", + ) + got = _select_whl(whls = got, want_platform = "linux_x86_32") _match(env, got, "pkg-0.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl") +_tests.append(_test_select_filename_with_many_tags) + +def _test_osx_prefer_arch_specific(env): # Check that we prefer the specific wheel - got = select_whl(whls = WHL_LIST, want_abis = ["cp311"], want_platform = "osx_x86_64") + got = _select_whls( + whls = WHL_LIST, + want_abis = ["cp311"], + want_platforms = ["osx_x86_64", "osx_x86_32"], + want_python_version = "3.11", + ) + _match( + env, + got, + "pkg-0.0.1-cp311-cp311-macosx_10_9_universal2.whl", + "pkg-0.0.1-cp311-cp311-macosx_10_9_x86_64.whl", + ) + got = _select_whl(whls = got, want_platform = "osx_x86_64") _match(env, got, "pkg-0.0.1-cp311-cp311-macosx_10_9_x86_64.whl") - got = select_whl(whls = WHL_LIST, want_abis = ["cp311"], want_platform = "osx_aarch64") + got = _select_whls(whls = WHL_LIST, want_abis = ["cp311"], want_platforms = ["osx_aarch64"], want_python_version = "3.11") + _match( + env, + got, + "pkg-0.0.1-cp311-cp311-macosx_10_9_universal2.whl", + "pkg-0.0.1-cp311-cp311-macosx_11_0_arm64.whl", + ) + got = _select_whl(whls = got, want_platform = "osx_aarch64") _match(env, got, "pkg-0.0.1-cp311-cp311-macosx_11_0_arm64.whl") +_tests.append(_test_osx_prefer_arch_specific) + +def _test_osx_fallback_to_universal2(env): # Check that we can use the universal2 if the arm wheel is not available - got = select_whl(whls = [w for w in WHL_LIST if "arm64" not in w.filename], want_abis = ["cp311"], want_platform = "osx_aarch64") + got = _select_whls(whls = [w for w in WHL_LIST if "arm64" not in w], want_abis = ["cp311"], want_platforms = ["osx_aarch64"], want_python_version = "3.11") + _match( + env, + got, + "pkg-0.0.1-cp311-cp311-macosx_10_9_universal2.whl", + ) + got = _select_whl(whls = got, want_platform = "osx_aarch64") _match(env, got, "pkg-0.0.1-cp311-cp311-macosx_10_9_universal2.whl") +_tests.append(_test_osx_fallback_to_universal2) + +def _test_prefer_manylinux_wheels(env): # Check we prefer platform specific wheels - got = select_whl(whls = WHL_LIST, want_abis = ["none", "abi3", "cp39"], want_platform = "linux_x86_64") + got = _select_whls(whls = WHL_LIST, want_abis = ["none", "abi3", "cp39"], want_platforms = ["linux_x86_64"], want_python_version = "3.9") + _match( + env, + got, + "pkg-0.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "pkg-0.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", + "pkg-0.0.1-cp39-abi3-any.whl", + "pkg-0.0.1-py3-none-any.whl", + ) + got = _select_whl(whls = got, want_platform = "linux_x86_64") _match(env, got, "pkg-0.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl") -_tests.append(_test_selecting) +_tests.append(_test_prefer_manylinux_wheels) def select_whl_test_suite(name): """Create the test suite. From f5b19dce7bc0837396ac03a425cdb9b64643cf61 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 2 Jun 2024 07:32:33 -0700 Subject: [PATCH 049/345] fix: don't require system Python to perform bootstrapping (#1929) This is a pretty major, but surprisingly not that invasive, overhaul of how binaries are started. It fixes several issues and lays ground work for future improvements. In brief: * A system Python is no longer needed to perform bootstrapping. * Errors due to `PYTHONPATH` exceeding environment variable size limits is no longer an issue. * Coverage integration is now cleaner and more direct. * The zipapp `__main__.py` entry point generation is separate from the Bazel binary bootstrap generation. * Self-executable zips now have actual bootstrap logic. The way all of this is accomplished is using a two stage bootstrap process. The first stage is responsible for locating the interpreter, and the second stage is responsible for configuring the runtime environment (e.g. import paths). This allows the first stage to be relatively simple (basically find a file in runfiles), so implementing it in cross-platform shell is feasible. The second stage, because it's running under the desired interpreter, can then do things like setting up import paths, and use the `runpy` module to call the program's real main. This also fixes the issue of long `PYTHONPATH` environment variables causing an error. Instead of passing the import paths using an environment variable, they are embedded into the second stage bootstrap, which can then add them to sys.path. This also switches from running coverage as a subprocess to using its APIs directly. This is possible because of the second stage bootstrap, which can rely on `import coverage` occurring in the correct environment. This new bootstrap method is disabled by default. It can be enabled by setting `--@rules_python//python/config_settings:bootstrap_impl=two_stage`. Once the new APIs are released, a subsequent release will make it the default. This is to allow easier upgrades for people defining their own toolchains. The two-stage bootstrap ignores errors during lcov report generation, which partially addresses https://github.com/bazelbuild/rules_python/issues/1434 Fixes https://github.com/bazelbuild/rules_python/issues/691 * Also fixes some doc cross references. * Also fixes the autodetecting toolchain and directs our alias to it --- CHANGELOG.md | 15 +- CONTRIBUTING.md | 1 + .../api/python/config_settings/index.md | 31 ++ docs/sphinx/api/python/index.md | 20 + docs/sphinx/bazel_inventory.txt | 5 +- docs/sphinx/pip.md | 2 +- docs/sphinx/support.md | 3 +- docs/sphinx/toolchains.md | 23 +- examples/bzlmod/test.py | 44 +- python/BUILD.bazel | 8 +- python/config_settings/BUILD.bazel | 9 + python/private/BUILD.bazel | 45 ++ python/private/autodetecting_toolchain.bzl | 2 +- python/private/common/common.bzl | 4 +- python/private/common/providers.bzl | 93 +++- python/private/common/py_executable.bzl | 8 +- python/private/common/py_executable_bazel.bzl | 201 +++++-- python/private/common/py_runtime_rule.bzl | 39 +- python/private/flags.bzl | 10 + python/private/python_bootstrap_template.txt | 2 +- python/private/stage1_bootstrap_template.sh | 118 ++++ python/private/stage2_bootstrap_template.py | 510 ++++++++++++++++++ python/private/zip_main_template.py | 292 ++++++++++ python/repositories.bzl | 8 +- tests/base_rules/py_executable_base_tests.bzl | 4 +- tests/base_rules/py_test/py_test_tests.bzl | 21 +- tests/support/support.bzl | 3 + 27 files changed, 1440 insertions(+), 81 deletions(-) create mode 100644 python/private/stage1_bootstrap_template.sh create mode 100644 python/private/stage2_bootstrap_template.py create mode 100644 python/private/zip_main_template.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fdd039a5d..e331a8613d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +:::{default-domain} bzl +::: + # rules_python Changelog This is a human-friendly changelog in a keepachangelog.com style format. @@ -31,7 +34,7 @@ A brief description of the categories of changes: marked as `reproducible` and will not include any lock file entries from now on. -* (gazelle): Remove gazelle plugin's python deps and make it hermetic. +* (gazelle): Remove gazelle plugin's python deps and make it hermetic. Introduced a new Go-based helper leveraging tree-sitter for syntax analysis. Implemented the use of `pypi/stdlib-list` for standard library module verification. @@ -80,6 +83,16 @@ A brief description of the categories of changes: invalid usage previously but we were not failing the build. From now on this is explicitly disallowed. * (toolchains) Added riscv64 platform definition for python toolchains. +* (rules) A new bootstrap implementation that doesn't require a system Python + is available. It can be enabled by setting + {obj}`--@rules_python//python:config_settings:bootstrap_impl=two_phase`. It + will become the default in a subsequent release. + ([#691](https://github.com/bazelbuild/rules_python/issues/691)) +* (providers) `PyRuntimeInfo` has two new attributes: + {obj}`PyRuntimeInfo.stage2_bootstrap_template` and + {obj}`PyRuntimeInfo.zip_main_template`. +* (toolchains) A replacement for the Bazel-builtn autodetecting toolchain is + available. The `//python:autodetecting_toolchain` alias now uses it. [precompile-docs]: /precompiling diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 10d1149cc7..cb123bfee0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -175,6 +175,7 @@ Issues should be triaged as follows: functionality, should also be filed in this repository but without the `core-rules` label. +(breaking-changes)= ## Breaking Changes Breaking changes are generally permitted, but we follow a 3-step process for diff --git a/docs/sphinx/api/python/config_settings/index.md b/docs/sphinx/api/python/config_settings/index.md index 82a5b2a520..29779fd813 100644 --- a/docs/sphinx/api/python/config_settings/index.md +++ b/docs/sphinx/api/python/config_settings/index.md @@ -1,3 +1,5 @@ +:::{default-domain} bzl +::: :::{bzl:currentfile} //python/config_settings:BUILD.bazel ::: @@ -66,3 +68,32 @@ Values: * `include_pyc`: Include `PyInfo.transitive_pyc_files` as part of the binary. * `disabled`: Don't include `PyInfo.transitive_pyc_files` as part of the binary. ::: + +::::{bzl:flag} bootstrap_impl +Determine how programs implement their startup process. + +Values: +* `system_python`: Use a bootstrap that requires a system Python available + in order to start programs. This requires + {obj}`PyRuntimeInfo.bootstrap_template` to be a Python program. +* `script`: Use a bootstrap that uses an arbitrary executable script (usually a + shell script) instead of requiring it be a Python program. + +:::{note} +The `script` bootstrap requires the toolchain to provide the `PyRuntimeInfo` +provider from `rules_python`. This loosely translates to using Bazel 7+ with a +toolchain created by rules_python. Most notably, WORKSPACE builds default to +using a legacy toolchain built into Bazel itself which doesn't support the +script bootstrap. If not available, the `system_python` bootstrap will be used +instead. +::: + +:::{seealso} +{obj}`PyRuntimeInfo.bootstrap_template` and +{obj}`PyRuntimeInfo.stage2_bootstrap_template` +::: + +:::{versionadded} 0.33.0 +::: + +:::: diff --git a/docs/sphinx/api/python/index.md b/docs/sphinx/api/python/index.md index 8026a7f145..494e7b4a02 100644 --- a/docs/sphinx/api/python/index.md +++ b/docs/sphinx/api/python/index.md @@ -1,3 +1,5 @@ +:::{default-domain} bzl +::: :::{bzl:currentfile} //python:BUILD.bazel ::: @@ -21,3 +23,21 @@ provides: * `PyRuntimeInfo`: The consuming target's target toolchain information ::: + +::::{target} autodetecting_toolchain + +A simple toolchain that simply uses `python3` from the runtime environment. + +Note that this toolchain provides no build-time information, which makes it of +limited utility. + +This is only provided to aid migration off the builtin Bazel toolchain +(`@bazel_tools//python:autodetecting_toolchain`), and is largely only applicable +to WORKSPACE builds. + +:::{deprecated} unspecified + +Switch to using a hermetic toolchain or manual toolchain configuration instead. +::: + +:::: diff --git a/docs/sphinx/bazel_inventory.txt b/docs/sphinx/bazel_inventory.txt index 62cbdf8926..c4aaabc074 100644 --- a/docs/sphinx/bazel_inventory.txt +++ b/docs/sphinx/bazel_inventory.txt @@ -10,7 +10,7 @@ bool bzl:type 1 rules/lib/bool - int bzl:type 1 rules/lib/int - depset bzl:type 1 rules/lib/depset - dict bzl:type 1 rules/lib/dict - -label bzl:doc 1 concepts/labels - +label bzl:type 1 concepts/labels - attr.bool bzl:type 1 rules/lib/toplevel/attr#bool - attr.int bzl:type 1 rules/lib/toplevel/attr#int - attr.label bzl:type 1 rules/lib/toplevel/attr#label - @@ -21,6 +21,7 @@ list bzl:type 1 rules/lib/list - python bzl:doc 1 reference/be/python - str bzl:type 1 rules/lib/string - struct bzl:type 1 rules/lib/builtins/struct - -target-name bzl:doc 1 concepts/labels#target-names - +Name bzl:type 1 concepts/labels#target-names - CcInfo bzl:provider 1 rules/lib/providers/CcInfo - CcInfo.linking_context bzl:provider-field 1 rules/lib/providers/CcInfo#linking_context - +ToolchainInfo bzl:type 1 rules/lib/providers/ToolchainInfo.html - diff --git a/docs/sphinx/pip.md b/docs/sphinx/pip.md index e1c8e343f0..fc29e41b5e 100644 --- a/docs/sphinx/pip.md +++ b/docs/sphinx/pip.md @@ -150,7 +150,7 @@ ARG=$1 # but we don't do anything with it as it's always "get" # formatting is optional echo '{' echo ' "headers": {' -echo ' "Authorization": ["Basic dGVzdDoxMjPCow=="] +echo ' "Authorization": ["Basic dGVzdDoxMjPCow=="]' echo ' }' echo '}' ``` diff --git a/docs/sphinx/support.md b/docs/sphinx/support.md index a2b8e3ae20..ea099650bd 100644 --- a/docs/sphinx/support.md +++ b/docs/sphinx/support.md @@ -46,7 +46,8 @@ incremental fashion. Breaking changes are allowed, but follow a process to introduce them over a series of releases to so users can still incrementally upgrade. See the -[Breaking Changes](contributing#breaking-changes) doc for the process. +[Breaking Changes](#breaking-changes) doc for the process. + ## Experimental Features diff --git a/docs/sphinx/toolchains.md b/docs/sphinx/toolchains.md index bac89660bb..e3be22f97b 100644 --- a/docs/sphinx/toolchains.md +++ b/docs/sphinx/toolchains.md @@ -1,3 +1,6 @@ +:::{default-domain} bzl +::: + # Configuring Python toolchains and runtimes This documents how to configure the Python toolchain and runtimes for different @@ -193,7 +196,7 @@ load("@rules_python//python:repositories.bzl", "py_repositories") py_repositories() ``` -#### Workspace toolchain registration +### Workspace toolchain registration To register a hermetic Python toolchain rather than rely on a system-installed interpreter for runtime execution, you can add to the `WORKSPACE` file: @@ -221,3 +224,21 @@ pip_parse( After registration, your Python targets will use the toolchain's interpreter during execution, but a system-installed interpreter is still used to 'bootstrap' Python targets (see https://github.com/bazelbuild/rules_python/issues/691). You may also find some quirks while using this toolchain. Please refer to [python-build-standalone documentation's _Quirks_ section](https://gregoryszorc.com/docs/python-build-standalone/main/quirks.html). + +## Autodetecting toolchain + +The autodetecting toolchain is a deprecated toolchain that is built into Bazel. +It's name is a bit misleading: it doesn't autodetect anything. All it does is +use `python3` from the environment a binary runs within. This provides extremely +limited functionality to the rules (at build time, nothing is knowable about +the Python runtime). + +Bazel itself automatically registers `@bazel_tools//python:autodetecting_toolchain` +as the lowest priority toolchain. For WORKSPACE builds, if no other toolchain +is registered, that toolchain will be used. For bzlmod builds, rules_python +automatically registers a higher-priority toolchain; it won't be used unless +there is a toolchain misconfiguration somewhere. + +To aid migration off the Bazel-builtin toolchain, rules_python provides +{obj}`@rules_python//python:autodetecting_toolchain`. This is an equivalent +toolchain, but is implemented using rules_python's objects. diff --git a/examples/bzlmod/test.py b/examples/bzlmod/test.py index 533187557d..950c002919 100644 --- a/examples/bzlmod/test.py +++ b/examples/bzlmod/test.py @@ -14,6 +14,7 @@ import os import pathlib +import re import sys import unittest @@ -63,16 +64,47 @@ def test_coverage_sys_path(self): first_item.endswith("coverage"), f"Expected the first item in sys.path '{first_item}' to not be related to coverage", ) + + # We're trying to make sure that the coverage library added by the + # toolchain is _after_ any user-provided dependencies. This lets users + # override what coverage version they're using. + first_coverage_index = None + last_user_dep_index = None + for i, path in enumerate(sys.path): + if re.search("rules_python.*~pip~", path): + last_user_dep_index = i + if first_coverage_index is None and re.search( + ".*rules_python.*~python~.*coverage.*", path + ): + first_coverage_index = i + if os.environ.get("COVERAGE_MANIFEST"): + self.assertIsNotNone( + first_coverage_index, + "Expected to find toolchain coverage, but " + + f"it was not found.\nsys.path:\n{all_paths}", + ) + self.assertIsNotNone( + first_coverage_index, + "Expected to find at least one uiser dep, " + + "but none were found.\nsys.path:\n{all_paths}", + ) # we are running under the 'bazel coverage :test' - self.assertTrue( - "_coverage" in last_item, - f"Expected {last_item} to be related to coverage", + self.assertGreater( + first_coverage_index, + last_user_dep_index, + "Expected coverage provided by the toolchain to be after " + + "user provided dependencies.\n" + + f"Found coverage at index: {first_coverage_index}\n" + + f"Last user dep at index: {last_user_dep_index}\n" + + f"Full sys.path:\n{all_paths}", ) - self.assertEqual(pathlib.Path(last_item).name, "coverage") else: - self.assertFalse( - "coverage" in last_item, f"Expected coverage tooling to not be present" + self.assertIsNone( + first_coverage_index, + "Expected toolchain coverage to not be present\n" + + f"Found coverage at index: {first_coverage_index}\n" + + f"Full sys.path:\n{all_paths}", ) def test_main(self): diff --git a/python/BUILD.bazel b/python/BUILD.bazel index 5d31df5e9a..cbf29964fb 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -24,6 +24,7 @@ that @rules_python//python is only concerned with the core rules. """ load("@bazel_skylib//:bzl_library.bzl", "bzl_library") +load("//python/private:autodetecting_toolchain.bzl", "define_autodetecting_toolchain") load(":current_py_toolchain.bzl", "current_py_toolchain") package(default_visibility = ["//visibility:public"]) @@ -318,14 +319,11 @@ toolchain_type( # safe if you know for a fact that your build is completely compatible with the # version of the `python` command installed on the target platform. -alias( - name = "autodetecting_toolchain", - actual = "@bazel_tools//tools/python:autodetecting_toolchain", -) +define_autodetecting_toolchain(name = "autodetecting_toolchain") alias( name = "autodetecting_toolchain_nonstrict", - actual = "@bazel_tools//tools/python:autodetecting_toolchain_nonstrict", + actual = ":autodetecting_toolchain", ) # ========= Packaging rules ========= diff --git a/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel index a0e59f70c0..9dab53c039 100644 --- a/python/config_settings/BUILD.bazel +++ b/python/config_settings/BUILD.bazel @@ -1,6 +1,7 @@ load("@bazel_skylib//rules:common_settings.bzl", "string_flag") load( "//python/private:flags.bzl", + "BootstrapImplFlag", "PrecompileAddToRunfilesFlag", "PrecompileFlag", "PrecompileSourceRetentionFlag", @@ -52,3 +53,11 @@ string_flag( # NOTE: Only public because its an implicit dependency visibility = ["//visibility:public"], ) + +string_flag( + name = "bootstrap_impl", + build_setting_default = BootstrapImplFlag.SYSTEM_PYTHON, + values = sorted(BootstrapImplFlag.__members__.values()), + # NOTE: Only public because its an implicit dependency + visibility = ["//visibility:public"], +) diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 3e56208859..1dc6c88ae8 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -376,9 +376,54 @@ exports_files( visibility = ["//visibility:public"], ) +filegroup( + name = "stage1_bootstrap_template", + srcs = ["stage1_bootstrap_template.sh"], + # Not actually public. Only public because it's an implicit dependency of + # py_runtime. + visibility = ["//visibility:public"], +) + +filegroup( + name = "stage2_bootstrap_template", + srcs = ["stage2_bootstrap_template.py"], + # Not actually public. Only public because it's an implicit dependency of + # py_runtime. + visibility = ["//visibility:public"], +) + +filegroup( + name = "zip_main_template", + srcs = ["zip_main_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. +alias( + name = "bootstrap_template", + actual = select({ + ":is_script_bootstrap_enabled": "stage1_bootstrap_template.sh", + "//conditions:default": "python_bootstrap_template.txt", + }), + # Not actually public. Only public because it's an implicit dependency of + # py_runtime. + visibility = ["//visibility:public"], +) + # Used to determine the use of `--stamp` in Starlark rules stamp_build_setting(name = "stamp") +config_setting( + name = "is_script_bootstrap_enabled", + flag_values = { + "//python/config_settings:bootstrap_impl": "script", + }, +) + print_toolchains_checksums(name = "print_toolchains_checksums") # Used for py_console_script_gen rule diff --git a/python/private/autodetecting_toolchain.bzl b/python/private/autodetecting_toolchain.bzl index 3caa5aa8ca..55c95699c9 100644 --- a/python/private/autodetecting_toolchain.bzl +++ b/python/private/autodetecting_toolchain.bzl @@ -32,7 +32,7 @@ def define_autodetecting_toolchain(name): # buildifier: disable=native-py py_runtime( name = "_autodetecting_py3_runtime", - interpreter = ":py3wrapper.sh", + interpreter = "//python/private:autodetecting_toolchain_interpreter.sh", python_version = "PY3", stub_shebang = "#!/usr/bin/env python3", visibility = ["//visibility:private"], diff --git a/python/private/common/common.bzl b/python/private/common/common.bzl index cfa7db7a2d..0ac9187b79 100644 --- a/python/private/common/common.bzl +++ b/python/private/common/common.bzl @@ -182,7 +182,7 @@ def create_cc_details_struct( cc_toolchain = cc_toolchain, ) -def create_executable_result_struct(*, extra_files_to_build, output_groups): +def create_executable_result_struct(*, extra_files_to_build, output_groups, extra_runfiles = None): """Creates a `CreateExecutableResult` struct. This is the return value type of the semantics create_executable function. @@ -192,6 +192,7 @@ def create_executable_result_struct(*, extra_files_to_build, output_groups): included as default outputs. output_groups: dict[str, depset[File]]; additional output groups that should be returned. + extra_runfiles: A runfiles object of additional runfiles to include. Returns: A `CreateExecutableResult` struct. @@ -199,6 +200,7 @@ def create_executable_result_struct(*, extra_files_to_build, output_groups): return struct( extra_files_to_build = extra_files_to_build, output_groups = output_groups, + extra_runfiles = extra_runfiles, ) def union_attrs(*attr_dicts, allow_none = False): diff --git a/python/private/common/providers.bzl b/python/private/common/providers.bzl index 5b84549185..e1876ff9d3 100644 --- a/python/private/common/providers.bzl +++ b/python/private/common/providers.bzl @@ -18,7 +18,7 @@ load("//python/private:util.bzl", "IS_BAZEL_6_OR_HIGHER") DEFAULT_STUB_SHEBANG = "#!/usr/bin/env python3" -DEFAULT_BOOTSTRAP_TEMPLATE = Label("//python/private:python_bootstrap_template.txt") +DEFAULT_BOOTSTRAP_TEMPLATE = Label("//python/private:bootstrap_template") _PYTHON_VERSION_VALUES = ["PY2", "PY3"] @@ -78,7 +78,9 @@ def _PyRuntimeInfo_init( python_version, stub_shebang = None, bootstrap_template = None, - interpreter_version_info = 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") @@ -126,7 +128,9 @@ def _PyRuntimeInfo_init( "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, } # TODO(#15897): Rename this to PyRuntimeInfo when we're ready to replace the Java @@ -147,7 +151,45 @@ the same conventions as the standard CPython interpreter. "bootstrap_template": """ :type: File -See py_runtime_rule.bzl%py_runtime.bootstrap_template for docs. +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 @@ -216,6 +258,30 @@ correctly. 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 @@ -223,6 +289,27 @@ are (only) `"PY2"` and `"PY3"`. "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 +::: """, }, ) diff --git a/python/private/common/py_executable.bzl b/python/private/common/py_executable.bzl index cf7d6fad50..ff1f74de99 100644 --- a/python/private/common/py_executable.bzl +++ b/python/private/common/py_executable.bzl @@ -118,6 +118,10 @@ Valid values are: values = ["PY2", "PY3"], doc = "Defunct, unused, does nothing.", ), + "_bootstrap_impl_flag": attr.label( + default = "//python/config_settings:bootstrap_impl", + providers = [BuildSettingInfo], + ), "_pyc_collection_flag": attr.label( default = "//python/config_settings:pyc_collection", providers = [BuildSettingInfo], @@ -212,7 +216,9 @@ def py_executable_base_impl(ctx, *, semantics, is_test, inherited_environment = runfiles_details = runfiles_details, ) - extra_exec_runfiles = ctx.runfiles(transitive_files = exec_result.extra_files_to_build) + extra_exec_runfiles = exec_result.extra_runfiles.merge( + ctx.runfiles(transitive_files = exec_result.extra_files_to_build), + ) runfiles_details = struct( default_runfiles = runfiles_details.default_runfiles.merge(extra_exec_runfiles), data_runfiles = runfiles_details.data_runfiles.merge(extra_exec_runfiles), diff --git a/python/private/common/py_executable_bazel.bzl b/python/private/common/py_executable_bazel.bzl index 1c41fc15e5..53d70f00b9 100644 --- a/python/private/common/py_executable_bazel.bzl +++ b/python/private/common/py_executable_bazel.bzl @@ -15,6 +15,7 @@ load("@bazel_skylib//lib:dicts.bzl", "dicts") load("@bazel_skylib//lib:paths.bzl", "paths") +load("//python/private:flags.bzl", "BootstrapImplFlag") load(":attributes_bazel.bzl", "IMPORTS_ATTRS") load( ":common.bzl", @@ -166,12 +167,6 @@ def _create_executable( runfiles_details): _ = is_test, cc_details, native_deps_details # @unused - common_bootstrap_template_kwargs = dict( - main_py = main_py, - imports = imports, - runtime_details = runtime_details, - ) - is_windows = target_platform_has_any_constraint(ctx, ctx.attr._windows_constraints) if is_windows: @@ -181,21 +176,47 @@ def _create_executable( else: base_executable_name = executable.basename - zip_bootstrap = ctx.actions.declare_file(base_executable_name + ".temp", sibling = executable) - zip_file = ctx.actions.declare_file(base_executable_name + ".zip", sibling = executable) + # 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 + # for workspace builds when no rules_python toolchain is configured. + if (BootstrapImplFlag.get_value(ctx) == BootstrapImplFlag.SCRIPT and + runtime_details.effective_runtime and + hasattr(runtime_details.effective_runtime, "stage2_bootstrap_template")): + stage2_bootstrap = _create_stage2_bootstrap( + ctx, + output_prefix = base_executable_name, + output_sibling = executable, + main_py = main_py, + imports = imports, + runtime_details = runtime_details, + ) + extra_runfiles = ctx.runfiles([stage2_bootstrap]) + zip_main = _create_zip_main( + ctx, + stage2_bootstrap = stage2_bootstrap, + runtime_details = runtime_details, + ) + else: + stage2_bootstrap = None + extra_runfiles = ctx.runfiles() + zip_main = ctx.actions.declare_file(base_executable_name + ".temp", sibling = executable) + _create_stage1_bootstrap( + ctx, + output = zip_main, + main_py = main_py, + imports = imports, + is_for_zip = True, + runtime_details = runtime_details, + ) - _expand_bootstrap_template( - ctx, - output = zip_bootstrap, - is_for_zip = True, - **common_bootstrap_template_kwargs - ) + zip_file = ctx.actions.declare_file(base_executable_name + ".zip", sibling = executable) _create_zip_file( ctx, output = zip_file, original_nonzip_executable = executable, - executable_for_zip_file = zip_bootstrap, - runfiles = runfiles_details.default_runfiles, + zip_main = zip_main, + runfiles = runfiles_details.default_runfiles.merge(extra_runfiles), ) extra_files_to_build = [] @@ -244,13 +265,23 @@ def _create_executable( if bootstrap_output != None: fail("Should not occur: bootstrap_output should not be used " + "when creating an executable zip") - _create_executable_zip_file(ctx, output = executable, zip_file = zip_file) + _create_executable_zip_file( + ctx, + output = executable, + zip_file = zip_file, + python_binary_path = runtime_details.executable_interpreter_path, + stage2_bootstrap = stage2_bootstrap, + runtime_details = runtime_details, + ) elif bootstrap_output: - _expand_bootstrap_template( + _create_stage1_bootstrap( ctx, output = bootstrap_output, - is_for_zip = build_zip_enabled, - **common_bootstrap_template_kwargs + stage2_bootstrap = stage2_bootstrap, + runtime_details = runtime_details, + is_for_zip = False, + imports = imports, + main_py = main_py, ) else: # Otherwise, this should be the Windows case of launcher + zip. @@ -268,16 +299,40 @@ def _create_executable( 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): + # 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. + output = ctx.actions.declare_file(ctx.label.name + "_zip__main__.py") + ctx.actions.expand_template( + template = runtime_details.effective_runtime.zip_main_template, + output = output, + substitutions = { + "%python_binary%": runtime_details.executable_interpreter_path, + "%stage2_bootstrap%": "{}/{}".format( + ctx.workspace_name, + stage2_bootstrap.short_path, + ), + "%workspace_name%": ctx.workspace_name, + }, ) + return output -def _expand_bootstrap_template( +def _create_stage2_bootstrap( ctx, *, - output, + output_prefix, + output_sibling, main_py, imports, - is_for_zip, runtime_details): + output = ctx.actions.declare_file( + "{}_stage2_bootstrap.py".format(output_prefix), + sibling = output_sibling, + ) runtime = runtime_details.effective_runtime if (ctx.configuration.coverage_enabled and runtime and @@ -289,12 +344,7 @@ def _expand_bootstrap_template( else: coverage_tool_runfiles_path = "" - if runtime: - shebang = runtime.stub_shebang - template = runtime.bootstrap_template - else: - shebang = DEFAULT_STUB_SHEBANG - template = ctx.file._bootstrap_template + template = runtime.stage2_bootstrap_template ctx.actions.expand_template( template = template, @@ -303,18 +353,66 @@ def _expand_bootstrap_template( "%coverage_tool%": coverage_tool_runfiles_path, "%import_all%": "True" if ctx.fragments.bazel_py.python_import_all_repositories else "False", "%imports%": ":".join(imports.to_list()), - "%is_zipfile%": "True" if is_for_zip else "False", - "%main%": "{}/{}".format( - ctx.workspace_name, - main_py.short_path, - ), - "%python_binary%": runtime_details.executable_interpreter_path, - "%shebang%": shebang, + "%main%": "{}/{}".format(ctx.workspace_name, main_py.short_path), "%target%": str(ctx.label), "%workspace_name%": ctx.workspace_name, }, is_executable = True, ) + return output + +def _create_stage1_bootstrap( + ctx, + *, + output, + main_py = None, + stage2_bootstrap = None, + imports = None, + is_for_zip, + runtime_details): + runtime = runtime_details.effective_runtime + + subs = { + "%is_zipfile%": "1" if is_for_zip else "0", + "%python_binary%": runtime_details.executable_interpreter_path, + "%target%": str(ctx.label), + "%workspace_name%": ctx.workspace_name, + } + + if stage2_bootstrap: + subs["%stage2_bootstrap%"] = "{}/{}".format( + ctx.workspace_name, + stage2_bootstrap.short_path, + ) + template = runtime.bootstrap_template + subs["%shebang%"] = runtime.stub_shebang + else: + if (ctx.configuration.coverage_enabled and + runtime and + runtime.coverage_tool): + coverage_tool_runfiles_path = "{}/{}".format( + ctx.workspace_name, + runtime.coverage_tool.short_path, + ) + else: + coverage_tool_runfiles_path = "" + if runtime: + subs["%shebang%"] = runtime.stub_shebang + template = runtime.bootstrap_template + else: + subs["%shebang%"] = DEFAULT_STUB_SHEBANG + template = ctx.file._bootstrap_template + + subs["%coverage_tool%"] = coverage_tool_runfiles_path + subs["%import_all%"] = ("True" if ctx.fragments.bazel_py.python_import_all_repositories else "False") + subs["%imports%"] = ":".join(imports.to_list()) + subs["%main%"] = "{}/{}".format(ctx.workspace_name, main_py.short_path) + + ctx.actions.expand_template( + template = template, + output = output, + substitutions = subs, + ) def _create_windows_exe_launcher( ctx, @@ -346,7 +444,7 @@ def _create_windows_exe_launcher( use_default_shell_env = True, ) -def _create_zip_file(ctx, *, output, original_nonzip_executable, executable_for_zip_file, runfiles): +def _create_zip_file(ctx, *, output, original_nonzip_executable, zip_main, runfiles): workspace_name = ctx.workspace_name legacy_external_runfiles = _py_builtins.get_legacy_external_runfiles(ctx) @@ -354,7 +452,7 @@ def _create_zip_file(ctx, *, output, original_nonzip_executable, executable_for_ manifest.use_param_file("@%s", use_always = True) manifest.set_param_file_format("multiline") - manifest.add("__main__.py={}".format(executable_for_zip_file.path)) + manifest.add("__main__.py={}".format(zip_main.path)) manifest.add("__init__.py=") manifest.add( "{}=".format( @@ -375,7 +473,7 @@ def _create_zip_file(ctx, *, output, original_nonzip_executable, executable_for_ manifest.add_all(runfiles.files, map_each = map_zip_runfiles, allow_closure = True) - inputs = [executable_for_zip_file] + inputs = [zip_main] if _py_builtins.is_bzlmod_enabled(ctx): zip_repo_mapping_manifest = ctx.actions.declare_file( output.basename + ".repo_mapping", @@ -424,17 +522,32 @@ def _get_zip_runfiles_path(path, workspace_name, legacy_external_runfiles): 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): +def _create_executable_zip_file(ctx, *, output, zip_file, stage2_bootstrap, runtime_details): + prelude = ctx.actions.declare_file( + "{}_zip_prelude.sh".format(output.basename), + sibling = output, + ) + if stage2_bootstrap: + _create_stage1_bootstrap( + ctx, + output = prelude, + stage2_bootstrap = stage2_bootstrap, + runtime_details = runtime_details, + is_for_zip = True, + ) + else: + ctx.actions.write(prelude, "#!/usr/bin/env python3\n") + ctx.actions.run_shell( - command = "echo '{shebang}' | cat - {zip} > {output}".format( - shebang = "#!/usr/bin/env python3", + command = "cat {prelude} {zip} > {output}".format( + prelude = prelude.path, zip = zip_file.path, output = output.path, ), - inputs = [zip_file], + inputs = [prelude, zip_file], outputs = [output], use_default_shell_env = True, - mnemonic = "BuildBinary", + mnemonic = "PyBuildExecutableZip", progress_message = "Build Python zip executable: %{label}", ) diff --git a/python/private/common/py_runtime_rule.bzl b/python/private/common/py_runtime_rule.bzl index 53d925cdba..a7eeb7e3ec 100644 --- a/python/private/common/py_runtime_rule.bzl +++ b/python/private/common/py_runtime_rule.bzl @@ -102,19 +102,20 @@ def _py_runtime_impl(ctx): files = runtime_files if hermetic else None, coverage_tool = coverage_tool, coverage_files = coverage_files, - pyc_tag = pyc_tag, python_version = python_version, stub_shebang = ctx.attr.stub_shebang, bootstrap_template = ctx.file.bootstrap_template, - interpreter_version_info = interpreter_version_info, - implementation_name = ctx.attr.implementation_name, ) builtin_py_runtime_info_kwargs = dict(py_runtime_info_kwargs) - # Pop these because they don't exist on BuiltinPyRuntimeInfo - builtin_py_runtime_info_kwargs.pop("interpreter_version_info") - builtin_py_runtime_info_kwargs.pop("pyc_tag") - builtin_py_runtime_info_kwargs.pop("implementation_name") + # There are all args that BuiltinPyRuntimeInfo doesn't support + py_runtime_info_kwargs.update(dict( + implementation_name = ctx.attr.implementation_name, + interpreter_version_info = interpreter_version_info, + pyc_tag = pyc_tag, + stage2_bootstrap_template = ctx.file.stage2_bootstrap_template, + zip_main_template = ctx.file.zip_main_template, + )) if not IS_BAZEL_7_OR_HIGHER: builtin_py_runtime_info_kwargs.pop("bootstrap_template") @@ -290,6 +291,17 @@ However, in the future this attribute will be mandatory and have no default value. """, ), + "stage2_bootstrap_template": attr.label( + default = "//python/private:stage2_bootstrap_template", + allow_single_file = True, + doc = """ +The template to use when two stage bootstrapping is enabled + +:::{seealso} +{obj}`PyRuntimeInfo.stage2_bootstrap_template` and {obj}`--bootstrap_impl` +::: +""", + ), "stub_shebang": attr.string( default = DEFAULT_STUB_SHEBANG, doc = """ @@ -300,6 +312,19 @@ See https://github.com/bazelbuild/bazel/issues/8685 for motivation. Does not apply to Windows. +""", + ), + "zip_main_template": attr.label( + default = "//python/private:zip_main_template", + allow_single_file = True, + doc = """ +The template to use for a zip's top-level `__main__.py` file. + +This becomes the entry point executed when `python foo.zip` is run. + +:::{seealso} +The {obj}`PyRuntimeInfo.zip_main_template` field. +::: """, ), }), diff --git a/python/private/flags.bzl b/python/private/flags.bzl index 36d305da8a..d141f72eee 100644 --- a/python/private/flags.bzl +++ b/python/private/flags.bzl @@ -21,6 +21,16 @@ unnecessary files when all that are needed are flag definitions. load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("//python/private:enum.bzl", "enum") +def _bootstrap_impl_flag_get_value(ctx): + return ctx.attr._bootstrap_impl_flag[BuildSettingInfo].value + +# buildifier: disable=name-conventions +BootstrapImplFlag = enum( + SYSTEM_PYTHON = "system_python", + SCRIPT = "script", + get_value = _bootstrap_impl_flag_get_value, +) + def _precompile_flag_get_effective_value(ctx): value = ctx.attr._precompile_flag[BuildSettingInfo].value if value == PrecompileFlag.AUTO: diff --git a/python/private/python_bootstrap_template.txt b/python/private/python_bootstrap_template.txt index 8eaedbc4dc..0f9c90b3b3 100644 --- a/python/private/python_bootstrap_template.txt +++ b/python/private/python_bootstrap_template.txt @@ -91,7 +91,7 @@ def FindPythonBinary(module_space): def PrintVerbose(*args): if os.environ.get("RULES_PYTHON_BOOTSTRAP_VERBOSE"): - print("bootstrap:", *args, file=sys.stderr) + print("bootstrap:", *args, file=sys.stderr, flush=True) def PrintVerboseCoverage(*args): """Print output if VERBOSE_COVERAGE is non-empty in the environment.""" diff --git a/python/private/stage1_bootstrap_template.sh b/python/private/stage1_bootstrap_template.sh new file mode 100644 index 0000000000..fb46cc696c --- /dev/null +++ b/python/private/stage1_bootstrap_template.sh @@ -0,0 +1,118 @@ +#!/bin/bash + +set -e + +if [[ -n "${RULES_PYTHON_BOOTSTRAP_VERBOSE:-}" ]]; then + set -x +fi + +# runfiles-relative path +STAGE2_BOOTSTRAP="%stage2_bootstrap%" + +# runfiles-relative path, absolute path, or single word +PYTHON_BINARY='%python_binary%' + +# 0 or 1 +IS_ZIPFILE="%is_zipfile%" + +if [[ "$IS_ZIPFILE" == "1" ]]; then + zip_dir=$(mktemp -d --suffix Bazel.runfiles_) + + if [[ -n "$zip_dir" && -z "${RULES_PYTHON_BOOTSTRAP_VERBOSE:-}" ]]; then + trap 'rm -fr "$zip_dir"' EXIT + fi + # unzip emits a warning and exits with code 1 when there is extraneous data, + # like this bootstrap prelude code, but otherwise successfully extracts, so + # we have to ignore its exit code and suppress stderr. + # The alternative requires having to copy ourselves elsewhere with the prelude + # stripped (because zip can't extract from a stream). We avoid that because + # it's wasteful. + ( unzip -q -d "$zip_dir" "$0" 2>/dev/null || /bin/true ) + + RUNFILES_DIR="$zip_dir/runfiles" + if [[ ! -d "$RUNFILES_DIR" ]]; then + echo "Runfiles dir not found: zip extraction likely failed" + echo "Run with RULES_PYTHON_BOOTSTRAP_VERBOSE=1 to aid debugging" + exit 1 + fi + +else + function find_runfiles_root() { + if [[ -n "${RUNFILES_DIR:-}" ]]; then + echo "$RUNFILES_DIR" + return 0 + elif [[ "${RUNFILES_MANIFEST_FILE:-}" = *".runfiles_manifest" ]]; then + echo "${RUNFILES_MANIFEST_FILE%%.runfiles_manifest}" + return 0 + elif [[ "${RUNFILES_MANIFEST_FILE:-}" = *".runfiles/MANIFEST" ]]; then + echo "${RUNFILES_MANIFEST_FILE%%.runfiles/MANIFEST}" + return 0 + fi + + stub_filename="$1" + # A relative path to our executable, as happens with + # a build action or bazel-bin/ invocation + if [[ "$stub_filename" != /* ]]; then + stub_filename="$PWD/$stub_filename" + fi + + while true; do + module_space="${stub_filename}.runfiles" + if [[ -d "$module_space" ]]; then + echo "$module_space" + return 0 + fi + if [[ "$stub_filename" == *.runfiles/* ]]; then + echo "${stub_filename%.runfiles*}.runfiles" + return 0 + fi + if [[ ! -L "$stub_filename" ]]; then + break + fi + target=$(realpath $maybe_runfiles_root) + stub_filename="$target" + done + echo >&2 "Unable to find runfiles directory for $1" + exit 1 + } + RUNFILES_DIR=$(find_runfiles_root $0) +fi + + +function find_python_interpreter() { + runfiles_root="$1" + interpreter_path="$2" + if [[ "$interpreter_path" == /* ]]; then + # An absolute path, i.e. platform runtime + echo "$interpreter_path" + elif [[ "$interpreter_path" == */* ]]; then + # A runfiles-relative path + echo "$runfiles_root/$interpreter_path" + else + # A plain word, e.g. "python3". Rely on searching PATH + echo "$interpreter_path" + fi +} + +python_exe=$(find_python_interpreter $RUNFILES_DIR $PYTHON_BINARY) +stage2_bootstrap="$RUNFILES_DIR/$STAGE2_BOOTSTRAP" + +declare -a interpreter_env +declare -a interpreter_args + +# Don't prepend a potentially unsafe path to sys.path +# See: https://docs.python.org/3.11/using/cmdline.html#envvar-PYTHONSAFEPATH +# NOTE: Only works for 3.11+ +interpreter_env+=("PYTHONSAFEPATH=1") + +export RUNFILES_DIR +# NOTE: We use <(...) to pass the Python program as a file so that stdin can +# still be passed along as normal. +env \ + "${interpreter_env[@]}" \ + "$python_exe" \ + "${interpreter_args[@]}" \ + "$stage2_bootstrap" \ + "$@" + +exit $? diff --git a/python/private/stage2_bootstrap_template.py b/python/private/stage2_bootstrap_template.py new file mode 100644 index 0000000000..69c0dec0e5 --- /dev/null +++ b/python/private/stage2_bootstrap_template.py @@ -0,0 +1,510 @@ +# This is a "stage 2" bootstrap. We can assume we've running under the desired +# interpreter, with some of the basic interpreter options/envvars set. +# However, more setup is required to make the app's real main file runnable. + +import sys + +# The Python interpreter unconditionally 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] + +import contextlib +import os +import re +import runpy +import subprocess +import uuid + +# ===== Template substitutions start ===== +# We just put them in one place so its easy to tell which are used. + +# 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 ===== + + +# Return True if running on Windows +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 + 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 is_verbose(): + return bool(os.environ.get("RULES_PYTHON_BOOTSTRAP_VERBOSE")) + + +def print_verbose(*args, mapping=None, values=None): + if is_verbose(): + if mapping is not None: + for key, value in sorted((mapping or {}).items()): + print( + "bootstrap: stage 2:", + *args, + f"{key}={value!r}", + file=sys.stderr, + flush=True, + ) + elif values is not None: + for i, v in enumerate(values): + print( + "bootstrap: stage 2:", + *args, + f"[{i}] {v!r}", + file=sys.stderr, + flush=True, + ) + else: + print("bootstrap: stage 2:", *args, file=sys.stderr, flush=True) + + +def print_verbose_coverage(*args): + """Print output if VERBOSE_COVERAGE is non-empty in the environment.""" + if os.environ.get("VERBOSE_COVERAGE"): + print(*args, file=sys.stderr, flush=True) + + +def is_verbose_coverage(): + """Returns True if VERBOSE_COVERAGE is non-empty in the environment.""" + 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 + # location of this stub script, the path may be expanded. This means + # argv[0] may no longer point to a location inside the runfiles + # directory. We should therefore respect RUNFILES_DIR and + # RUNFILES_MANIFEST_FILE set by the caller. + 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 our main entry point. If + # it doesn't, then it must not be our runfiles directory. + if runfiles_dir and os.path.exists(os.path.join(runfiles_dir, main_rel_path)): + return runfiles_dir + + stub_filename = sys.argv[0] + if not os.path.isabs(stub_filename): + stub_filename = os.path.join(os.getcwd(), stub_filename) + + while True: + module_space = stub_filename + (".exe" if is_windows() else "") + ".runfiles" + if os.path.isdir(module_space): + return module_space + + runfiles_pattern = r"(.*\.runfiles)" + (r"\\" if is_windows() else "/") + ".*" + matchobj = re.match(runfiles_pattern, stub_filename) + if matchobj: + return matchobj.group(1) + + if not os.path.islink(stub_filename): + break + target = os.readlink(stub_filename) + if os.path.isabs(target): + stub_filename = target + else: + stub_filename = os.path.join(os.path.dirname(stub_filename), target) + + 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. + + Returns: + A tuple of (var_name, var_value) where var_name is either 'RUNFILES_DIR' or + 'RUNFILES_MANIFEST_FILE' and var_value is the path to that directory or + file, or (None, None) if runfiles couldn't be found. + """ + # If this binary is the data-dependency of another one, the other sets + # RUNFILES_MANIFEST_FILE or RUNFILES_DIR for our sake. + runfiles = os.environ.get("RUNFILES_MANIFEST_FILE", None) + if runfiles: + return ("RUNFILES_MANIFEST_FILE", runfiles) + + runfiles = os.environ.get("RUNFILES_DIR", None) + if runfiles: + return ("RUNFILES_DIR", runfiles) + + # Look for the runfiles "output" manifest, argv[0] + ".runfiles_manifest" + runfiles = module_space + "_manifest" + if os.path.exists(runfiles): + return ("RUNFILES_MANIFEST_FILE", runfiles) + + # Look for the runfiles "input" manifest, argv[0] + ".runfiles/MANIFEST" + # Normally .runfiles_manifest and MANIFEST are both present, but the + # former will be missing for zip-based builds or if someone copies the + # runfiles tree elsewhere. + runfiles = os.path.join(module_space, "MANIFEST") + if os.path.exists(runfiles): + return ("RUNFILES_MANIFEST_FILE", runfiles) + + # If running in a sandbox and no environment variables are set, then + # Look for the runfiles next to the binary. + if module_space.endswith(".runfiles") and os.path.isdir(module_space): + return ("RUNFILES_DIR", module_space) + + 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") + if not manifest_filename: + return + with open(manifest_filename, "r") as manifest: + for line in manifest: + filename = line.strip() + if not filename: + continue + try: + realpath = os.path.realpath(filename) + except OSError: + print( + "Could not find instrumented file {}".format(filename), + file=sys.stderr, + flush=True, + ) + continue + if realpath != filename: + print_verbose_coverage("Fixing up {} -> {}".format(realpath, filename)) + yield (realpath, filename) + + +def unresolve_symlinks(output_filename): + # type: (str) -> None + """Replace realpath of instrumented files with the relative path in the lcov output. + + Though we are asking coveragepy to use relative file names, currently + ignore that for purposes of generating the lcov report (and other reports + which are not the XML report), so we need to go and fix up the report. + + This function is a workaround for that issue. Once that issue is fixed + upstream and the updated version is widely in use, this should be removed. + + See https://github.com/nedbat/coveragepy/issues/963. + """ + substitutions = list(instrumented_file_paths()) + if substitutions: + unfixed_file = output_filename + ".tmp" + os.rename(output_filename, unfixed_file) + with open(unfixed_file, "r") as unfixed: + with open(output_filename, "w") as output_file: + for line in unfixed: + if line.startswith("SF:"): + for realpath, filename in substitutions: + line = line.replace(realpath, filename) + output_file.write(line) + os.unlink(unfixed_file) + + +def _run_py(main_filename, *, args, cwd=None): + # type: (str, str, list[str], dict[str, str]) -> ... + """Executes the given Python file using the various environment settings.""" + + orig_argv = sys.argv + orig_cwd = os.getcwd() + try: + sys.argv = [main_filename] + args + if cwd: + os.chdir(cwd) + print_verbose("run_py: cwd:", os.getcwd()) + print_verbose("run_py: sys.argv: ", values=sys.argv) + print_verbose("run_py: os.environ:", mapping=os.environ) + print_verbose("run_py: sys.path:", values=sys.path) + runpy.run_path(main_filename, run_name="__main__") + finally: + os.chdir(orig_cwd) + sys.argv = orig_argv + + +@contextlib.contextmanager +def _maybe_collect_coverage(enable): + if not enable: + yield + return + + import uuid + + import coverage + + coverage_dir = os.environ["COVERAGE_DIR"] + unique_id = uuid.uuid4() + + # We need for coveragepy to use relative paths. This can only be configured + rcfile_name = os.path.join(coverage_dir, ".coveragerc_{}".format(unique_id)) + with open(rcfile_name, "w") as rcfile: + rcfile.write( + """[run] +relative_files = True +""" + ) + try: + cov = coverage.Coverage( + config_file=rcfile_name, + branch=True, + # NOTE: The messages arg controls what coverage prints to stdout/stderr, + # which can interfere with the Bazel coverage command. Enabling message + # output is only useful for debugging coverage support. + messages=is_verbose_coverage(), + omit=[ + # Pipes can't be read back later, which can cause coverage to + # throw an error when trying to get its source code. + "/dev/fd/*", + ], + ) + cov.start() + try: + yield + finally: + cov.stop() + lcov_path = os.path.join(coverage_dir, "pylcov.dat") + cov.lcov_report( + outfile=lcov_path, + # Ignore errors because sometimes instrumented files aren't + # readable afterwards. e.g. if they come from /dev/fd or if + # they were transient code-under-test in /tmp + ignore_errors=True, + ) + if os.path.isfile(lcov_path): + unresolve_symlinks(lcov_path) + finally: + try: + os.unlink(rcfile_name) + except OSError as err: + # It's possible that the profiled program might execute another Python + # binary through a wrapper that would then delete the rcfile. Not much + # we can do about that, besides ignore the failure here. + print_verbose_coverage("Error removing temporary coverage rc file:", err) + + +def main(): + print_verbose("initial argv:", values=sys.argv) + print_verbose("initial cwd:", os.getcwd()) + print_verbose("initial environ:", mapping=os.environ) + print_verbose("initial sys.path:", values=sys.path) + + main_rel_path = MAIN + if is_windows(): + main_rel_path = main_rel_path.replace("/", os.sep) + + module_space = find_runfiles_root(main_rel_path) + print_verbose("runfiles root:", module_space) + + # Recreate the "add main's dir to sys.path[0]" behavior to match the + # system-python bootstrap / typical Python behavior. + # + # Without safe path enabled, when `python foo/bar.py` is run, python will + # resolve the foo/bar.py symlink to its real path, then add the directory + # of that path to sys.path. But, the resolved directory for the symlink + # depends on if the file is generated or not. + # + # When foo/bar.py is a source file, then it's a symlink pointing + # back to the client source directory. This means anything from that source + # directory becomes importable, i.e. most code is importable. + # + # When foo/bar.py is a generated file, then it's a symlink pointing to + # somewhere under bazel-out/.../bin, i.e. where generated files are. This + # means only other generated files are importable (not source files). + # + # To replicate this behavior, we add main's directory within the runfiles + # when safe path isn't enabled. + if not getattr(sys.flags, "safe_path", False): + prepend_path_entries = [ + os.path.join(module_space, os.path.dirname(main_rel_path)) + ] + 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 + + main_filename = os.path.join(module_space, main_rel_path) + main_filename = get_windows_path_with_unc_prefix(main_filename) + assert os.path.exists(main_filename), ( + "Cannot exec() %r: file not found." % main_filename + ) + assert os.access(main_filename, os.R_OK), ( + "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() + # NOTE: The sys.path must be modified before coverage is imported/activated + sys.path[0:0] = prepend_path_entries + sys.path.extend(python_path_entries) + with _maybe_collect_coverage(enable=cov_tool is not None): + # The first arg is this bootstrap, so drop that for the re-invocation. + _run_py(main_filename, args=sys.argv[1:]) + sys.exit(0) + + +main() diff --git a/python/private/zip_main_template.py b/python/private/zip_main_template.py new file mode 100644 index 0000000000..18eaed9630 --- /dev/null +++ b/python/private/zip_main_template.py @@ -0,0 +1,292 @@ +# Template for the __main__.py file inserted into zip files +# +# NOTE: This file is a "stage 1" bootstrap, so it's responsible for locating the +# desired runtime and having it run the stage 2 bootstrap. This means it can't +# assume much about the current runtime and environment. e.g, the current +# runtime may not be the correct one, the zip may not have been extract, the +# runfiles env vars may not be set, etc. +# +# NOTE: This program must retain compatibility with a wide variety of Python +# versions since it is run by an unknown Python interpreter. + +import sys + +# The Python interpreter unconditionally 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. +del sys.path[0] + +import os +import shutil +import subprocess +import tempfile +import zipfile + +_STAGE2_BOOTSTRAP = "%stage2_bootstrap%" +_PYTHON_BINARY = "%python_binary%" +_WORKSPACE_NAME = "%workspace_name%" + + +# Return True if running on Windows +def is_windows(): + return os.name == "nt" + + +def get_windows_path_with_unc_prefix(path): + """Adds UNC prefix after getting a normalized absolute Windows path. + + No-op for non-Windows platforms or if running under python2. + """ + path = path.strip() + + # No need to add prefix for non-Windows platforms. + # And \\?\ doesn't work in python 2 or on mingw + 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 has_windows_executable_extension(path): + return path.endswith(".exe") or path.endswith(".com") or path.endswith(".bat") + + +if is_windows() and not has_windows_executable_extension(_PYTHON_BINARY): + _PYTHON_BINARY = _PYTHON_BINARY + ".exe" + + +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 find_python_binary(module_space): + """Finds the real Python binary if it's not a normal absolute path.""" + return find_binary(module_space, _PYTHON_BINARY) + + +def print_verbose(*args, mapping=None, values=None): + if bool(os.environ.get("RULES_PYTHON_BOOTSTRAP_VERBOSE")): + if mapping is not None: + for key, value in sorted((mapping or {}).items()): + print( + "bootstrap: stage 1:", + *args, + f"{key}={value!r}", + file=sys.stderr, + flush=True, + ) + elif values is not None: + for i, v in enumerate(values): + print( + "bootstrap: stage 1:", + *args, + f"[{i}] {v!r}", + file=sys.stderr, + flush=True, + ) + else: + print("bootstrap: stage 1:", *args, file=sys.stderr, flush=True) + + +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 extract_zip(zip_path, dest_dir): + """Extracts the contents of a zip file, preserving the unix file mode bits. + + These include the permission bits, and in particular, the executable bit. + + Ideally the zipfile module should set these bits, but it doesn't. See: + https://bugs.python.org/issue15795. + + Args: + zip_path: The path to the zip file to extract + dest_dir: The path to the destination directory + """ + zip_path = get_windows_path_with_unc_prefix(zip_path) + dest_dir = get_windows_path_with_unc_prefix(dest_dir) + with zipfile.ZipFile(zip_path) as zf: + for info in zf.infolist(): + zf.extract(info, dest_dir) + # UNC-prefixed paths must be absolute/normalized. See + # https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file#maximum-path-length-limitation + file_path = os.path.abspath(os.path.join(dest_dir, info.filename)) + # The Unix st_mode bits (see "man 7 inode") are stored in the upper 16 + # bits of external_attr. Of those, we set the lower 12 bits, which are the + # file mode bits (since the file type bits can't be set by chmod anyway). + attrs = info.external_attr >> 16 + if attrs != 0: # Rumor has it these can be 0 for zips created on Windows. + os.chmod(file_path, attrs & 0o7777) + + +# Create the runfiles tree by extracting the zip file +def create_module_space(): + temp_dir = tempfile.mkdtemp("", "Bazel.runfiles_") + extract_zip(os.path.dirname(__file__), temp_dir) + # IMPORTANT: Later code does `rm -fr` on dirname(module_space) -- it's + # important that deletion code be in sync with this directory structure + return os.path.join(temp_dir, "runfiles") + + +def execute_file( + python_program, + main_filename, + args, + env, + module_space, + workspace, +): + # type: (str, str, list[str], dict[str, str], str, str|None, str|None) -> ... + """Executes the given Python file using the various environment settings. + + This will not return, and acts much like os.execv, except is much + more restricted, and handles Bazel-related edge cases. + + Args: + python_program: (str) Path to the Python binary to use for execution + main_filename: (str) The Python file to execute + args: (list[str]) Additional args to pass to the Python file + env: (dict[str, str]) A dict of environment variables to set for the execution + module_space: (str) Path to the module space/runfiles tree directory + workspace: (str|None) Name of the workspace to execute in. This is expected to be a + directory under the runfiles tree. + """ + # We want to use os.execv instead of subprocess.call, which causes + # problems with signal passing (making it difficult to kill + # Bazel). However, these conditions force us to run via + # subprocess.call instead: + # + # - On Windows, os.execv doesn't handle arguments with spaces + # correctly, and it actually starts a subprocess just like + # subprocess.call. + # - When running in a workspace or zip file, we need to clean up the + # workspace after the process finishes so control must return here. + try: + subprocess_argv = [python_program, main_filename] + args + print_verbose("subprocess argv:", values=subprocess_argv) + print_verbose("subprocess env:", mapping=env) + print_verbose("subprocess cwd:", workspace) + ret_code = subprocess.call(subprocess_argv, env=env, cwd=workspace) + sys.exit(ret_code) + finally: + # NOTE: dirname() is called because create_module_space() creates a + # sub-directory within a temporary directory, and we want to remove the + # whole temporary directory. + shutil.rmtree(os.path.dirname(module_space), True) + + +def main(): + print_verbose("running zip main bootstrap") + print_verbose("initial argv:", values=sys.argv) + print_verbose("initial environ:", mapping=os.environ) + print_verbose("initial sys.executable", sys.executable) + print_verbose("initial sys.version", sys.version) + + args = sys.argv[1:] + + new_env = {} + + # The main Python source file. + # The magic string percent-main-percent is replaced with the runfiles-relative + # filename of the main file of the Python binary in BazelPythonSemantics.java. + main_rel_path = _STAGE2_BOOTSTRAP + if is_windows(): + main_rel_path = main_rel_path.replace("/", os.sep) + + module_space = create_module_space() + print_verbose("extracted runfiles to:", module_space) + + new_env["RUNFILES_DIR"] = module_space + + # Don't prepend a potentially unsafe path to sys.path + # See: https://docs.python.org/3.11/using/cmdline.html#envvar-PYTHONSAFEPATH + new_env["PYTHONSAFEPATH"] = "1" + + main_filename = os.path.join(module_space, main_rel_path) + main_filename = get_windows_path_with_unc_prefix(main_filename) + assert os.path.exists(main_filename), ( + "Cannot exec() %r: file not found." % main_filename + ) + assert os.access(main_filename, os.R_OK), ( + "Cannot exec() %r: file not readable." % main_filename + ) + + program = python_program = find_python_binary(module_space) + if python_program is None: + raise AssertionError("Could not find python binary: " + _PYTHON_BINARY) + + # 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, + # which subsequently causes failure to launch on Python 3.11 and later. + if "__PYVENV_LAUNCHER__" in os.environ: + del os.environ["__PYVENV_LAUNCHER__"] + + new_env.update((key, val) for key, val in os.environ.items() if key not in new_env) + + workspace = None + # If RUN_UNDER_RUNFILES equals 1, it means we need to + # change directory to the right runfiles directory. + # (So that the data files are accessible) + if os.environ.get("RUN_UNDER_RUNFILES") == "1": + workspace = os.path.join(module_space, _WORKSPACE_NAME) + + sys.stdout.flush() + execute_file( + python_program, + main_filename, + args, + new_env, + module_space, + workspace, + ) + + +if __name__ == "__main__": + main() diff --git a/python/repositories.bzl b/python/repositories.bzl index 26081a6b48..4ffadd050a 100644 --- a/python/repositories.bzl +++ b/python/repositories.bzl @@ -185,7 +185,10 @@ def _python_repository_impl(rctx): elif rctx.attr.distutils_content: rctx.file(distutils_path, rctx.attr.distutils_content) - # Make the Python installation read-only. + # Make the Python installation read-only. This is to prevent issues due to + # pycs being generated at runtime: + # * The pycs are not deterministic (they contain timestamps) + # * Multiple processes trying to write the same pycs can result in errors. if not rctx.attr.ignore_root_user_error: if "windows" not in platform: lib_dir = "lib" if "windows" not in platform else "Lib" @@ -200,6 +203,9 @@ def _python_repository_impl(rctx): op = "python_repository.TestReadOnly", arguments = [repo_utils.which_checked(rctx, "touch"), "{}/.test".format(lib_dir)], ) + + # The issue with running as root is the installation is no longer + # read-only, so the problems due to pyc can resurface. if exec_result.return_code == 0: stdout = repo_utils.execute_checked_stdout( rctx, diff --git a/tests/base_rules/py_executable_base_tests.bzl b/tests/base_rules/py_executable_base_tests.bzl index b6f28026db..43e800a99f 100644 --- a/tests/base_rules/py_executable_base_tests.bzl +++ b/tests/base_rules/py_executable_base_tests.bzl @@ -20,7 +20,7 @@ load("@rules_testing//lib:truth.bzl", "matching") load("@rules_testing//lib:util.bzl", rt_util = "util") load("//tests/base_rules:base_tests.bzl", "create_base_tests") load("//tests/base_rules:util.bzl", "WINDOWS_ATTR", pt_util = "util") -load("//tests/support:support.bzl", "WINDOWS") +load("//tests/support:support.bzl", "WINDOWS_X86_64") _BuiltinPyRuntimeInfo = PyRuntimeInfo @@ -50,7 +50,7 @@ def _test_basic_windows(name, config): "//command_line_option:cpu": "windows_x86_64", "//command_line_option:crosstool_top": Label("//tests/cc:cc_toolchain_suite"), "//command_line_option:extra_toolchains": [str(Label("//tests/cc:all"))], - "//command_line_option:platforms": [WINDOWS], + "//command_line_option:platforms": [WINDOWS_X86_64], }, attr_values = {"target_compatible_with": target_compatible_with}, ) diff --git a/tests/base_rules/py_test/py_test_tests.bzl b/tests/base_rules/py_test/py_test_tests.bzl index 50c1db27cf..c77bd7eb04 100644 --- a/tests/base_rules/py_test/py_test_tests.bzl +++ b/tests/base_rules/py_test/py_test_tests.bzl @@ -21,13 +21,26 @@ load( "create_executable_tests", ) load("//tests/base_rules:util.bzl", pt_util = "util") -load("//tests/support:support.bzl", "LINUX", "MAC") +load("//tests/support:support.bzl", "LINUX_X86_64", "MAC_X86_64") # Explicit Label() calls are required so that it resolves in @rules_python # context instead of @rules_testing context. _FAKE_CC_TOOLCHAIN = Label("//tests/cc:cc_toolchain_suite") _FAKE_CC_TOOLCHAINS = [str(Label("//tests/cc:all"))] +# The Windows CI currently runs as root, which breaks when +# the analysis tests try to install (but not use, because +# these are analysis tests) a runtime for another platform. +# This is because the toolchain install has an assert to +# verify the runtime install is read-only, which it can't +# be when running as root. +_SKIP_WINDOWS = { + "target_compatible_with": select({ + "@platforms//os:windows": ["@platforms//:incompatible"], + "//conditions:default": [], + }), +} + _tests = [] def _test_mac_requires_darwin_for_execution(name, config): @@ -52,8 +65,9 @@ def _test_mac_requires_darwin_for_execution(name, config): "//command_line_option:cpu": "darwin_x86_64", "//command_line_option:crosstool_top": _FAKE_CC_TOOLCHAIN, "//command_line_option:extra_toolchains": _FAKE_CC_TOOLCHAINS, - "//command_line_option:platforms": [MAC], + "//command_line_option:platforms": [MAC_X86_64], }, + attr_values = _SKIP_WINDOWS, ) def _test_mac_requires_darwin_for_execution_impl(env, target): @@ -84,8 +98,9 @@ def _test_non_mac_doesnt_require_darwin_for_execution(name, config): "//command_line_option:cpu": "k8", "//command_line_option:crosstool_top": _FAKE_CC_TOOLCHAIN, "//command_line_option:extra_toolchains": _FAKE_CC_TOOLCHAINS, - "//command_line_option:platforms": [LINUX], + "//command_line_option:platforms": [LINUX_X86_64], }, + attr_values = _SKIP_WINDOWS, ) def _test_non_mac_doesnt_require_darwin_for_execution_impl(env, target): diff --git a/tests/support/support.bzl b/tests/support/support.bzl index 14a743b8a2..4bcc554854 100644 --- a/tests/support/support.bzl +++ b/tests/support/support.bzl @@ -20,8 +20,11 @@ # places. MAC = Label("//tests/support:mac") +MAC_X86_64 = Label("//tests/support:mac_x86_64") LINUX = Label("//tests/support:linux") +LINUX_X86_64 = Label("//tests/support:linux_x86_64") WINDOWS = Label("//tests/support:windows") +WINDOWS_X86_64 = Label("//tests/support:windows_x86_64") PLATFORM_TOOLCHAIN = str(Label("//tests/support:platform_toolchain")) CC_TOOLCHAIN = str(Label("//tests/cc:all")) From ae1e1a014d88a9862c232daafcb6b1025b2928ae Mon Sep 17 00:00:00 2001 From: Douglas Thor Date: Sun, 2 Jun 2024 15:38:50 -0700 Subject: [PATCH 050/345] feat(gazelle): Support "$python_root$" placeholder in the "gazelle:python_visibility" directive (#1936) Add support for the `$python_root$` placeholder in the `# gazelle:python_visibility` directive. Fixes #1932. --- CHANGELOG.md | 2 ++ gazelle/README.md | 13 ++++++++++ gazelle/python/configure.go | 3 ++- .../subdir_python_root/BUILD.in | 1 + .../subdir_python_root/BUILD.out | 1 + .../subdir_python_root/subdir/BUILD.in | 6 +++++ .../subdir_python_root/subdir/BUILD.out | 24 +++++++++++++++++++ .../subdir_python_root/subdir/__init__.py | 0 .../subdir_python_root/subdir/baz.py | 0 9 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 gazelle/python/testdata/directive_python_visibility/subdir_python_root/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_visibility/subdir_python_root/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_visibility/subdir_python_root/subdir/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_visibility/subdir_python_root/subdir/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_visibility/subdir_python_root/subdir/__init__.py create mode 100644 gazelle/python/testdata/directive_python_visibility/subdir_python_root/subdir/baz.py diff --git a/CHANGELOG.md b/CHANGELOG.md index e331a8613d..7a9e4e6fd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -83,6 +83,8 @@ A brief description of the categories of changes: invalid usage previously but we were not failing the build. From now on this is explicitly disallowed. * (toolchains) Added riscv64 platform definition for python toolchains. +* (gazelle) The `python_visibility` directive now supports the `$python_root$` + placeholder, just like the `python_default_visibility` directive does. * (rules) A new bootstrap implementation that doesn't require a system Python is available. It can be enabled by setting {obj}`--@rules_python//python:config_settings:bootstrap_impl=two_phase`. It diff --git a/gazelle/README.md b/gazelle/README.md index e7b17669aa..bb688b961a 100644 --- a/gazelle/README.md +++ b/gazelle/README.md @@ -360,6 +360,19 @@ py_library( ``` +This directive also supports the `$python_root$` placeholder that +`# gazelle:python_default_visibility` supports. + +```starlark +# gazlle:python_visibility //$python_root$/foo:bar + +py_library( + ... + visibility = ["//this_is_my_python_root/foo:bar"], + ... +) +``` + #### Directive: `python_test_file_pattern`: diff --git a/gazelle/python/configure.go b/gazelle/python/configure.go index ed6e2e102c..c35a261366 100644 --- a/gazelle/python/configure.go +++ b/gazelle/python/configure.go @@ -182,7 +182,8 @@ func (py *Configurer) Configure(c *config.Config, rel string, f *rule.File) { config.SetDefaultVisibility(strings.Split(labels, ",")) } case pythonconfig.Visibility: - config.AppendVisibility(strings.TrimSpace(d.Value)) + labels := strings.ReplaceAll(strings.TrimSpace(d.Value), "$python_root$", config.PythonProjectRoot()) + config.AppendVisibility(labels) case pythonconfig.TestFilePattern: value := strings.TrimSpace(d.Value) if value == "" { diff --git a/gazelle/python/testdata/directive_python_visibility/subdir_python_root/BUILD.in b/gazelle/python/testdata/directive_python_visibility/subdir_python_root/BUILD.in new file mode 100644 index 0000000000..6948b47b10 --- /dev/null +++ b/gazelle/python/testdata/directive_python_visibility/subdir_python_root/BUILD.in @@ -0,0 +1 @@ +# gazelle:python_root diff --git a/gazelle/python/testdata/directive_python_visibility/subdir_python_root/BUILD.out b/gazelle/python/testdata/directive_python_visibility/subdir_python_root/BUILD.out new file mode 100644 index 0000000000..6948b47b10 --- /dev/null +++ b/gazelle/python/testdata/directive_python_visibility/subdir_python_root/BUILD.out @@ -0,0 +1 @@ +# gazelle:python_root diff --git a/gazelle/python/testdata/directive_python_visibility/subdir_python_root/subdir/BUILD.in b/gazelle/python/testdata/directive_python_visibility/subdir_python_root/subdir/BUILD.in new file mode 100644 index 0000000000..41ff6311a0 --- /dev/null +++ b/gazelle/python/testdata/directive_python_visibility/subdir_python_root/subdir/BUILD.in @@ -0,0 +1,6 @@ +# The default visibility is "//$python_root$:__subpackages" so the generated +# target will also have "//subdir_python_root:__subpackages__" in the visibility +# attribute. +# +# gazelle:python_visibility //$python_root$/anywhere:__pkg__ +# gazelle:python_visibility //$python_root$/and/also:here diff --git a/gazelle/python/testdata/directive_python_visibility/subdir_python_root/subdir/BUILD.out b/gazelle/python/testdata/directive_python_visibility/subdir_python_root/subdir/BUILD.out new file mode 100644 index 0000000000..25ec8de7b3 --- /dev/null +++ b/gazelle/python/testdata/directive_python_visibility/subdir_python_root/subdir/BUILD.out @@ -0,0 +1,24 @@ +load("@rules_python//python:defs.bzl", "py_library") + +# The default visibility is "//$python_root$:__subpackages" so the generated +# target will also have "//subdir_python_root:__subpackages__" in the visibility +# attribute. +# +# gazelle:python_visibility //$python_root$/anywhere:__pkg__ +# gazelle:python_visibility //$python_root$/and/also:here + +py_library( + name = "subdir", + srcs = [ + "__init__.py", + "baz.py", + ], + imports = [".."], + visibility = [ + "//bar:baz", + "//subdir_python_root:__subpackages__", + "//subdir_python_root/and/also:here", + "//subdir_python_root/anywhere:__pkg__", + "//tests:__pkg__", + ], +) diff --git a/gazelle/python/testdata/directive_python_visibility/subdir_python_root/subdir/__init__.py b/gazelle/python/testdata/directive_python_visibility/subdir_python_root/subdir/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_visibility/subdir_python_root/subdir/baz.py b/gazelle/python/testdata/directive_python_visibility/subdir_python_root/subdir/baz.py new file mode 100644 index 0000000000..e69de29bb2 From d0e25cfb41446e481da6e85f04ad0ac5bcf7ea80 Mon Sep 17 00:00:00 2001 From: Ivo List Date: Wed, 5 Jun 2024 12:40:12 +0200 Subject: [PATCH 051/345] feat: Upgrade to protobuf 27.0 and remove py_proto_library (#1933) Protobuf team is taking ownership of `py_proto_library` and the implementation was moved to protobuf repository. Remove py_proto_library from rules_python, to prevent divergent implementations. Make a redirect with a deprecation warning, so that this doesn't break any users. Expected side effect of this change is also that the protobuf version is sufficiently updated that there is no more use of legacy struct providers. Closes #1935 Closes #1924 Closes #1925 Closes #1703 Closes #1707 Closes #1597 Closes #1293 Closes #1080 Fixes #1438 --- .bazelci/presubmit.yml | 53 ++++- CHANGELOG.md | 3 + MODULE.bazel | 6 +- WORKSPACE | 6 - WORKSPACE.bzlmod | 5 - examples/bzlmod/MODULE.bazel | 5 +- .../example.com/another_proto/BUILD.bazel | 4 +- .../example.com/proto/BUILD.bazel | 4 +- examples/py_proto_library/WORKSPACE | 19 +- .../example.com/another_proto/BUILD.bazel | 4 +- .../example.com/proto/BUILD.bazel | 4 +- internal_deps.bzl | 14 +- internal_setup.bzl | 4 - python/BUILD.bazel | 2 +- python/private/BUILD.bazel | 1 - python/private/proto/BUILD.bazel | 46 ---- python/private/proto/py_proto_library.bzl | 223 ------------------ python/proto.bzl | 6 +- 18 files changed, 77 insertions(+), 332 deletions(-) delete mode 100644 python/private/proto/BUILD.bazel delete mode 100644 python/private/proto/py_proto_library.bzl diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 30138d3be6..c2d172d7e1 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -147,6 +147,14 @@ tasks: <<: *reusable_config name: "Default: Debian" platform: debian11 + build_flags: + # For protobuf compilation + - '--host_copt=-Wno-deprecated-declarations' + - '--copt=-Wno-deprecated-declarations' + test_flags: + # For protobuf compilation + - '--host_copt=-Wno-deprecated-declarations' + - '--copt=-Wno-deprecated-declarations' macos: <<: *reusable_config name: "Default: MacOS" @@ -169,6 +177,10 @@ tasks: # build kite cc toolchain. - "--extra_toolchains=@buildkite_config//config:cc-toolchain" - "--build_tag_filters=-docs" + build_targets: + - "--" + - "..." + - '-//sphinxdocs/...' # protobuf compilation fails test_flags: - "--test_tag_filters=-integration-test,-acceptance-test,-docs" # BazelCI sets --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1, @@ -176,12 +188,28 @@ tasks: # on Bazel 5.4 and earlier. To workaround this, manually specify the # build kite cc toolchain. - "--extra_toolchains=@buildkite_config//config:cc-toolchain" + test_targets: + - "--" + - "..." + - '-//sphinxdocs/...' # protobuf compilation fails rbe: <<: *reusable_config name: "RBE: Ubuntu" platform: rbe_ubuntu1604 + build_flags: + - "--build_tag_filters=-docs" + build_targets: + - "--" + - "..." + - '-//sphinxdocs/...' # protobuf compilation fails + - '-//docs/...' test_flags: - - "--test_tag_filters=-integration-test,-acceptance-test" + - "--test_tag_filters=-integration-test,-acceptance-test,-docs" + test_targets: + - "--" + - "..." + - '-//sphinxdocs/...' # protobuf compilation fails + - '-//docs/...' integration_test_build_file_generation_ubuntu_minimum_supported_workspace: <<: *minimum_supported_version @@ -234,6 +262,21 @@ tasks: name: "examples/bzlmod: Debian" working_directory: examples/bzlmod platform: debian11 + build_targets: + # For protobuf compilation + - "--" + - "..." + - "-//py_proto_library/..." + test_targets: + # For protobuf compilation + - "--" + - "..." + - "-//py_proto_library/..." + coverage_targets: + # For protobuf compilation + - "--" + - "..." + - "-//py_proto_library/..." integration_test_bzlmod_macos: <<: *reusable_build_test_all <<: *coverage_targets_example_bzlmod @@ -395,6 +438,14 @@ tasks: name: "examples/py_proto_library: Debian, workspace" working_directory: examples/py_proto_library platform: debian11 + build_flags: + # For protobuf compilation + - '--host_copt=-Wno-deprecated-declarations' + - '--copt=-Wno-deprecated-declarations' + test_flags: + # For protobuf compilation + - '--host_copt=-Wno-deprecated-declarations' + - '--copt=-Wno-deprecated-declarations' integration_test_py_proto_library_macos_workspace: <<: *reusable_build_test_all <<: *common_workspace_flags diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a9e4e6fd8..ca62e386dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,9 @@ A brief description of the categories of changes: [x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/x.x.x ### Changed +* (rules) `py_proto_library` is deprecated in favour of the + implementation in https://github.com/protocolbuffers/protobuf. It will be + removed in the future release. * (deps) Upgrade the `pip_install` dependencies to pick up a new version of pip. * (toolchains) Optional toolchain dependency: `py_binary`, `py_test`, and `py_library` now depend on the `//python:exec_tools_toolchain_type` for build diff --git a/MODULE.bazel b/MODULE.bazel index 7064dfc84f..04d8fb211e 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -9,9 +9,9 @@ bazel_dep(name = "bazel_skylib", version = "1.6.1") bazel_dep(name = "rules_cc", version = "0.0.9") 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 = "21.7", repo_name = "com_google_protobuf") +# For backwards compatibility, those are loaded only when using py_proto_library +# Use py_proto_library directly from protobuf repository +bazel_dep(name = "protobuf", version = "27.0", repo_name = "com_google_protobuf") internal_deps = use_extension("//python/private/bzlmod:internal_deps.bzl", "internal_deps") use_repo( diff --git a/WORKSPACE b/WORKSPACE index 90e9305684..d30ccb02fd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -148,9 +148,3 @@ http_file( "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/WORKSPACE.bzlmod b/WORKSPACE.bzlmod index ca89afe8af..7829af6f21 100644 --- a/WORKSPACE.bzlmod +++ b/WORKSPACE.bzlmod @@ -55,8 +55,3 @@ http_file( ], ) -# 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/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel index 0d30161147..2e28bd6270 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -11,11 +11,8 @@ local_path_override( path = "../..", ) -# (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") - # (py_proto_library specific) Add the protobuf library for well-known types (e.g. `Any`, `Timestamp`, etc) -bazel_dep(name = "protobuf", version = "21.7", repo_name = "com_google_protobuf") +bazel_dep(name = "protobuf", version = "27.0", repo_name = "com_google_protobuf") # We next initialize the python toolchain using the extension. # You can set different Python versions in this block. diff --git a/examples/bzlmod/py_proto_library/example.com/another_proto/BUILD.bazel b/examples/bzlmod/py_proto_library/example.com/another_proto/BUILD.bazel index 806fcb9dcc..80f0470741 100644 --- a/examples/bzlmod/py_proto_library/example.com/another_proto/BUILD.bazel +++ b/examples/bzlmod/py_proto_library/example.com/another_proto/BUILD.bazel @@ -1,5 +1,5 @@ -load("@rules_proto//proto:defs.bzl", "proto_library") -load("@rules_python//python:proto.bzl", "py_proto_library") +load("@com_google_protobuf//bazel:proto_library.bzl", "proto_library") +load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library") py_proto_library( name = "message_proto_py_pb2", diff --git a/examples/bzlmod/py_proto_library/example.com/proto/BUILD.bazel b/examples/bzlmod/py_proto_library/example.com/proto/BUILD.bazel index fa20f2ce94..3bc9d1b739 100644 --- a/examples/bzlmod/py_proto_library/example.com/proto/BUILD.bazel +++ b/examples/bzlmod/py_proto_library/example.com/proto/BUILD.bazel @@ -1,5 +1,5 @@ -load("@rules_proto//proto:defs.bzl", "proto_library") -load("@rules_python//python:proto.bzl", "py_proto_library") +load("@com_google_protobuf//bazel:proto_library.bzl", "proto_library") +load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library") py_proto_library( name = "pricetag_proto_py_pb2", diff --git a/examples/py_proto_library/WORKSPACE b/examples/py_proto_library/WORKSPACE index 81f189dbbf..7892c69c4d 100644 --- a/examples/py_proto_library/WORKSPACE +++ b/examples/py_proto_library/WORKSPACE @@ -24,24 +24,11 @@ python_register_toolchains( # Then we need to setup dependencies in order to use py_proto_library load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -http_archive( - name = "rules_proto", - sha256 = "904a8097fae42a690c8e08d805210e40cccb069f5f9a0f6727cf4faa7bed2c9c", - strip_prefix = "rules_proto-6.0.0-rc1", - url = "https://github.com/bazelbuild/rules_proto/releases/download/6.0.0-rc1/rules_proto-6.0.0-rc1.tar.gz", -) - -load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") - -rules_proto_dependencies() - -rules_proto_toolchains() - http_archive( name = "com_google_protobuf", - sha256 = "4fc5ff1b2c339fb86cd3a25f0b5311478ab081e65ad258c6789359cd84d421f8", - strip_prefix = "protobuf-26.1", - urls = ["https://github.com/protocolbuffers/protobuf/archive/v26.1.tar.gz"], + sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", + strip_prefix = "protobuf-27.0", + urls = ["https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protobuf-27.0.tar.gz"], ) load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") diff --git a/examples/py_proto_library/example.com/another_proto/BUILD.bazel b/examples/py_proto_library/example.com/another_proto/BUILD.bazel index dd58265bc9..126dd9b46d 100644 --- a/examples/py_proto_library/example.com/another_proto/BUILD.bazel +++ b/examples/py_proto_library/example.com/another_proto/BUILD.bazel @@ -1,5 +1,5 @@ -load("@rules_proto//proto:defs.bzl", "proto_library") -load("@rules_python//python:proto.bzl", "py_proto_library") +load("@com_google_protobuf//bazel:proto_library.bzl", "proto_library") +load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library") py_proto_library( name = "message_proto_py_pb2", diff --git a/examples/py_proto_library/example.com/proto/BUILD.bazel b/examples/py_proto_library/example.com/proto/BUILD.bazel index dc91162aa6..0084a61794 100644 --- a/examples/py_proto_library/example.com/proto/BUILD.bazel +++ b/examples/py_proto_library/example.com/proto/BUILD.bazel @@ -1,5 +1,5 @@ -load("@rules_proto//proto:defs.bzl", "proto_library") -load("@rules_python//python:proto.bzl", "py_proto_library") +load("@com_google_protobuf//bazel:proto_library.bzl", "proto_library") +load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library") py_proto_library( name = "pricetag_proto_py_pb2", diff --git a/internal_deps.bzl b/internal_deps.bzl index 8818751644..8c604c4032 100644 --- a/internal_deps.bzl +++ b/internal_deps.bzl @@ -164,20 +164,12 @@ def rules_python_internal_deps(): ], ) - http_archive( - name = "rules_proto", - sha256 = "904a8097fae42a690c8e08d805210e40cccb069f5f9a0f6727cf4faa7bed2c9c", - strip_prefix = "rules_proto-6.0.0-rc1", - url = "https://github.com/bazelbuild/rules_proto/releases/download/6.0.0-rc1/rules_proto-6.0.0-rc1.tar.gz", - ) - http_archive( name = "com_google_protobuf", - sha256 = "75be42bd736f4df6d702a0e4e4d30de9ee40eac024c4b845d17ae4cc831fe4ae", - strip_prefix = "protobuf-21.7", + sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", + strip_prefix = "protobuf-27.0", urls = [ - "https://mirror.bazel.build/github.com/protocolbuffers/protobuf/archive/v21.7.tar.gz", - "https://github.com/protocolbuffers/protobuf/archive/v21.7.tar.gz", + "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protobuf-27.0.tar.gz", ], ) diff --git a/internal_setup.bzl b/internal_setup.bzl index bb62611213..6614ad355e 100644 --- a/internal_setup.bzl +++ b/internal_setup.bzl @@ -20,7 +20,6 @@ load("@cgrindel_bazel_starlib//:deps.bzl", "bazel_starlib_dependencies") 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_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") load("//:version.bzl", "SUPPORTED_BAZEL_VERSIONS") load("//python/pip_install:repositories.bzl", "pip_install_dependencies") load("//python/private:internal_config_repo.bzl", "internal_config_repo") # buildifier: disable=bzl-visibility @@ -35,9 +34,6 @@ def rules_python_internal_setup(): bazel_skylib_workspace() - rules_proto_dependencies() - rules_proto_toolchains() - protobuf_deps() bazel_integration_test_rules_dependencies() diff --git a/python/BUILD.bazel b/python/BUILD.bazel index cbf29964fb..100a8c04a5 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -113,7 +113,7 @@ bzl_library( ], visibility = ["//visibility:public"], deps = [ - "//python/private/proto:py_proto_library_bzl", + "@com_google_protobuf//bazel:py_proto_library_bzl", ], ) diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 1dc6c88ae8..ab077c6f59 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -29,7 +29,6 @@ filegroup( srcs = glob(["**"]) + [ "//python/private/bzlmod:distribution", "//python/private/common:distribution", - "//python/private/proto:distribution", "//python/private/whl_filegroup:distribution", "//tools/build_defs/python/private:distribution", ], diff --git a/python/private/proto/BUILD.bazel b/python/private/proto/BUILD.bazel deleted file mode 100644 index 65c09444f7..0000000000 --- a/python/private/proto/BUILD.bazel +++ /dev/null @@ -1,46 +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. - -load("@bazel_skylib//:bzl_library.bzl", "bzl_library") -load("@rules_proto//proto:defs.bzl", "proto_lang_toolchain") - -package(default_visibility = ["//visibility:private"]) - -licenses(["notice"]) - -filegroup( - name = "distribution", - srcs = glob(["**"]), - visibility = ["//python/private:__pkg__"], -) - -bzl_library( - name = "py_proto_library_bzl", - srcs = ["py_proto_library.bzl"], - visibility = ["//python:__pkg__"], - deps = [ - "//python:defs_bzl", - "@rules_proto//proto:defs", - ], -) - -proto_lang_toolchain( - name = "python_toolchain", - command_line = "--python_out=%s", - progress_message = "Generating Python proto_library %{label}", - runtime = "@com_google_protobuf//:protobuf_python", - # NOTE: This isn't *actually* public. It's an implicit dependency of py_proto_library, - # so must be public so user usages of the rule can reference it. - visibility = ["//visibility:public"], -) diff --git a/python/private/proto/py_proto_library.bzl b/python/private/proto/py_proto_library.bzl deleted file mode 100644 index e123ff8476..0000000000 --- a/python/private/proto/py_proto_library.bzl +++ /dev/null @@ -1,223 +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. - -"""The implementation of the `py_proto_library` rule and its aspect.""" - -load("@rules_proto//proto:defs.bzl", "ProtoInfo", "proto_common") -load("//python:defs.bzl", "PyInfo") - -PY_PROTO_TOOLCHAIN = "@rules_python//python/proto:toolchain_type" - -_PyProtoInfo = provider( - doc = "Encapsulates information needed by the Python proto rules.", - fields = { - "imports": """ - (depset[str]) The field forwarding PyInfo.imports coming from - the proto language runtime dependency.""", - "runfiles_from_proto_deps": """ - (depset[File]) Files from the transitive closure implicit proto - dependencies""", - "transitive_sources": """(depset[File]) The Python sources.""", - }, -) - -def _filter_provider(provider, *attrs): - return [dep[provider] for attr in attrs for dep in attr if provider in dep] - -def _incompatible_toolchains_enabled(): - return getattr(proto_common, "INCOMPATIBLE_ENABLE_PROTO_TOOLCHAIN_RESOLUTION", False) - -def _py_proto_aspect_impl(target, ctx): - """Generates and compiles Python code for a proto_library. - - The function runs protobuf compiler on the `proto_library` target generating - a .py file for each .proto file. - - Args: - target: (Target) A target providing `ProtoInfo`. Usually this means a - `proto_library` target, but not always; you must expect to visit - non-`proto_library` targets, too. - ctx: (RuleContext) The rule context. - - Returns: - ([_PyProtoInfo]) Providers collecting transitive information about - generated files. - """ - _proto_library = ctx.rule.attr - - # Check Proto file names - for proto in target[ProtoInfo].direct_sources: - if proto.is_source and "-" in proto.dirname: - fail("Cannot generate Python code for a .proto whose path contains '-' ({}).".format( - proto.path, - )) - - if _incompatible_toolchains_enabled(): - toolchain = ctx.toolchains[PY_PROTO_TOOLCHAIN] - if not toolchain: - fail("No toolchains registered for '%s'." % PY_PROTO_TOOLCHAIN) - proto_lang_toolchain_info = toolchain.proto - else: - proto_lang_toolchain_info = getattr(ctx.attr, "_aspect_proto_toolchain")[proto_common.ProtoLangToolchainInfo] - - api_deps = [proto_lang_toolchain_info.runtime] - - generated_sources = [] - proto_info = target[ProtoInfo] - proto_root = proto_info.proto_source_root - if proto_info.direct_sources: - # Generate py files - generated_sources = proto_common.declare_generated_files( - actions = ctx.actions, - proto_info = proto_info, - extension = "_pb2.py", - name_mapper = lambda name: name.replace("-", "_").replace(".", "/"), - ) - - # Handles multiple repository and virtual import cases - if proto_root.startswith(ctx.bin_dir.path): - proto_root = proto_root[len(ctx.bin_dir.path) + 1:] - - plugin_output = ctx.bin_dir.path + "/" + proto_root - proto_root = ctx.workspace_name + "/" + proto_root - - proto_common.compile( - actions = ctx.actions, - proto_info = proto_info, - proto_lang_toolchain_info = proto_lang_toolchain_info, - generated_files = generated_sources, - plugin_output = plugin_output, - ) - - # Generated sources == Python sources - python_sources = generated_sources - - deps = _filter_provider(_PyProtoInfo, getattr(_proto_library, "deps", [])) - runfiles_from_proto_deps = depset( - transitive = [dep[DefaultInfo].default_runfiles.files for dep in api_deps] + - [dep.runfiles_from_proto_deps for dep in deps], - ) - transitive_sources = depset( - direct = python_sources, - transitive = [dep.transitive_sources for dep in deps], - ) - - return [ - _PyProtoInfo( - imports = depset( - # Adding to PYTHONPATH so the generated modules can be - # imported. This is necessary when there is - # strip_import_prefix, the Python modules are generated under - # _virtual_imports. But it's undesirable otherwise, because it - # will put the repo root at the top of the PYTHONPATH, ahead of - # directories added through `imports` attributes. - [proto_root] if "_virtual_imports" in proto_root else [], - transitive = [dep[PyInfo].imports for dep in api_deps] + [dep.imports for dep in deps], - ), - runfiles_from_proto_deps = runfiles_from_proto_deps, - transitive_sources = transitive_sources, - ), - ] - -_py_proto_aspect = aspect( - implementation = _py_proto_aspect_impl, - attrs = {} if _incompatible_toolchains_enabled() else { - "_aspect_proto_toolchain": attr.label( - default = ":python_toolchain", - ), - }, - attr_aspects = ["deps"], - required_providers = [ProtoInfo], - provides = [_PyProtoInfo], - toolchains = [PY_PROTO_TOOLCHAIN] if _incompatible_toolchains_enabled() else [], -) - -def _py_proto_library_rule(ctx): - """Merges results of `py_proto_aspect` in `deps`. - - Args: - ctx: (RuleContext) The rule context. - Returns: - ([PyInfo, DefaultInfo, OutputGroupInfo]) - """ - if not ctx.attr.deps: - fail("'deps' attribute mustn't be empty.") - - pyproto_infos = _filter_provider(_PyProtoInfo, ctx.attr.deps) - default_outputs = depset( - transitive = [info.transitive_sources for info in pyproto_infos], - ) - - return [ - DefaultInfo( - files = default_outputs, - default_runfiles = ctx.runfiles(transitive_files = depset( - transitive = - [default_outputs] + - [info.runfiles_from_proto_deps for info in pyproto_infos], - )), - ), - OutputGroupInfo( - default = depset(), - ), - PyInfo( - transitive_sources = default_outputs, - imports = depset(transitive = [info.imports for info in pyproto_infos]), - # Proto always produces 2- and 3- compatible source files - has_py2_only_sources = False, - has_py3_only_sources = False, - ), - ] - -py_proto_library = rule( - implementation = _py_proto_library_rule, - doc = """ - Use `py_proto_library` to generate Python libraries from `.proto` files. - - The convention is to name the `py_proto_library` rule `foo_py_pb2`, - when it is wrapping `proto_library` rule `foo_proto`. - - `deps` must point to a `proto_library` rule. - - Example: - -```starlark -py_library( - name = "lib", - deps = [":foo_py_pb2"], -) - -py_proto_library( - name = "foo_py_pb2", - deps = [":foo_proto"], -) - -proto_library( - name = "foo_proto", - srcs = ["foo.proto"], -) -```""", - attrs = { - "deps": attr.label_list( - doc = """ - The list of `proto_library` rules to generate Python libraries for. - - Usually this is just the one target: the proto library of interest. - It can be any target providing `ProtoInfo`.""", - providers = [ProtoInfo], - aspects = [_py_proto_aspect], - ), - }, - provides = [PyInfo], -) diff --git a/python/proto.bzl b/python/proto.bzl index 3f455aee58..2ea9bdb153 100644 --- a/python/proto.bzl +++ b/python/proto.bzl @@ -11,11 +11,11 @@ # 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. - """ Python proto library. """ -load("//python/private/proto:py_proto_library.bzl", _py_proto_library = "py_proto_library") +load("@com_google_protobuf//bazel:py_proto_library.bzl", _py_proto_library = "py_proto_library") -py_proto_library = _py_proto_library +def py_proto_library(*, deprecation = "Use py_proto_library from protobuf repository", **kwargs): + _py_proto_library(deprecation = deprecation, **kwargs) From e42f8f4811e57b8c3d19aeaab8f02f9d6a3fd13b Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Thu, 6 Jun 2024 16:34:00 +0900 Subject: [PATCH 052/345] fix(pip.parse): make the pip extension reproducible if PyPI is not called (#1937) With this PR we can finally have fewer lock file entries in setups which do not use the `experimental_index_url` feature yet. This is fully backwards compatible change as it relies on `bazel` doing the right thing and regenerating the lock file. Fixes #1643. --- CHANGELOG.md | 6 ++ MODULE.bazel | 11 +--- python/private/bzlmod/pip.bzl | 100 +++++++++++++++++++++++++++++----- 3 files changed, 95 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca62e386dd..0720a36a59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,12 @@ A brief description of the categories of changes: replaced by whl_modifications. * (pip) Correctly select wheels when the python tag includes minor versions. See ([#1930](https://github.com/bazelbuild/rules_python/issues/1930)) +* (pip.parse): The lock file is now reproducible on any host platform if the + `experimental_index_url` is not used by any of the modules in the dependency + chain. To make the lock file identical on each `os` and `arch`, please use + the `experimental_index_url` feature which will fetch metadata from PyPI or a + different private index and write the contents to the lock file. Fixes + [#1643](https://github.com/bazelbuild/rules_python/issues/1643). ### Added * (rules) Precompiling Python source at build time is available. but is diff --git a/MODULE.bazel b/MODULE.bazel index 04d8fb211e..38ee678015 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -56,9 +56,8 @@ register_toolchains("@pythons_hub//:all") ##################### # Install twine for our own runfiles wheel publishing and allow bzlmod users to use it. -pip = use_extension("//python/extensions:pip.bzl", "pip") +pip = use_extension("//python/private/bzlmod:pip.bzl", "pip_internal") pip.parse( - experimental_index_url = "https://pypi.org/simple", hub_name = "rules_python_publish_deps", python_version = "3.11", requirements_by_platform = { @@ -80,13 +79,11 @@ bazel_dep(name = "rules_go", version = "0.41.0", dev_dependency = True, repo_nam bazel_dep(name = "gazelle", version = "0.33.0", dev_dependency = True, repo_name = "bazel_gazelle") dev_pip = use_extension( - "//python/extensions:pip.bzl", - "pip", + "//python/private/bzlmod:pip.bzl", + "pip_internal", dev_dependency = True, ) dev_pip.parse( - envsubst = ["PIP_INDEX_URL"], - experimental_index_url = "${PIP_INDEX_URL:-https://pypi.org/simple}", experimental_requirement_cycles = { "sphinx": [ "sphinx", @@ -102,8 +99,6 @@ dev_pip.parse( requirements_lock = "//docs/sphinx:requirements.txt", ) dev_pip.parse( - envsubst = ["PIP_INDEX_URL"], - experimental_index_url = "${PIP_INDEX_URL:-https://pypi.org/simple}", hub_name = "pypiserver", python_version = "3.11", requirements_lock = "//examples/wheel:requirements_server.txt", diff --git a/python/private/bzlmod/pip.bzl b/python/private/bzlmod/pip.bzl index 9e29877b42..8702f1fbe7 100644 --- a/python/private/bzlmod/pip.bzl +++ b/python/private/bzlmod/pip.bzl @@ -103,6 +103,7 @@ You cannot use both the additive_build_content and additive_build_content_file a def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, simpleapi_cache): logger = repo_utils.logger(module_ctx) python_interpreter_target = pip_attr.python_interpreter_target + is_hub_reproducible = True # if we do not have the python_interpreter set in the attributes # we programmatically find it. @@ -274,6 +275,7 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s logger.debug(lambda: "Selected: {}".format(distribution)) if distribution: + is_hub_reproducible = False whl_library_args["requirement"] = requirement.srcs.requirement whl_library_args["urls"] = [distribution.url] whl_library_args["sha256"] = distribution.sha256 @@ -303,6 +305,8 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s ), ) + return is_hub_reproducible + def _pip_impl(module_ctx): """Implementation of a class tag that creates the pip hub and corresponding pip spoke whl repositories. @@ -412,6 +416,7 @@ def _pip_impl(module_ctx): hub_group_map = {} simpleapi_cache = {} + is_extension_reproducible = True for mod in module_ctx.modules: for pip_attr in mod.tags.parse: @@ -448,7 +453,8 @@ def _pip_impl(module_ctx): else: pip_hub_map[pip_attr.hub_name].python_versions.append(pip_attr.python_version) - _create_whl_repos(module_ctx, pip_attr, hub_whl_map, whl_overrides, hub_group_map, simpleapi_cache) + is_hub_reproducible = _create_whl_repos(module_ctx, pip_attr, hub_whl_map, whl_overrides, hub_group_map, simpleapi_cache) + is_extension_reproducible = is_extension_reproducible and is_hub_reproducible for hub_name, whl_map in hub_whl_map.items(): pip_repository( @@ -462,7 +468,34 @@ def _pip_impl(module_ctx): groups = hub_group_map.get(hub_name), ) -def _pip_parse_ext_attrs(): + if bazel_features.external_deps.extension_metadata_has_reproducible: + # If we are not using the `experimental_index_url feature, the extension is fully + # deterministic and we don't need to create a lock entry for it. + # + # 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) + 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. + + Args: + **kwargs: A kwarg for setting defaults for the specific attributes. The + key is expected to be the same as the attribute key. + + Returns: + A dict of attributes. + """ attrs = dict({ "experimental_extra_index_urls": attr.string_list( doc = """\ @@ -477,6 +510,7 @@ This is equivalent to `--extra-index-urls` `pip` option. default = [], ), "experimental_index_url": attr.string( + default = kwargs.get("experimental_index_url", ""), doc = """\ The index URL to use for downloading wheels using bazel downloader. This value is going to be subject to `envsubst` substitutions if necessary. @@ -661,17 +695,6 @@ Apply any overrides (e.g. patches) to a given Python distribution defined by other tags in this extension.""", ) -def _extension_extra_args(): - args = {} - - if bazel_features.external_deps.module_extension_has_os_arch_dependent: - args = args | { - "arch_dependent": True, - "os_dependent": True, - } - - return args - pip = module_extension( doc = """\ This extension is used to make dependencies from pip available. @@ -714,7 +737,56 @@ extension. """, ), }, - **_extension_extra_args() +) + +pip_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. +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. +""", + ), + }, ) def _whl_mods_repo_impl(rctx): From 7de43d1ea6d03e1c21e864a8249c40aaeb9aaf93 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Thu, 6 Jun 2024 17:20:01 +0900 Subject: [PATCH 053/345] feat(bzlmod): support cross-platform whl setups within the main hub repo (#1837) With this change we add support for platform-specific wheel registration and doing the selection of which wheel is used at build time. This supports: - Different package versions for different platforms. - Use string_flags to configure what to fetch/select: - only whls, only sdist or auto mode. - libc version and `musl` vs `glibc` selection. - universal2 vs arch wheels for mac. - target osx version selection. Summary of changes: - The `uv pip install` would only warn the user of yanked packages but would not refuse to install them. Update our implementation to better match the same behaviour. - A previous PR has added the support for passing it in the `requirements_by_platform` and this just add the necessary code to make sure that we can also do the dependency management when parsing the `whl` `METADATA` files. - Only configure `dev_pip` deps for `linux` and `osx` platforms to not raise issues later. - Add a function for generating a `whl_library` name from a `filename`. - Add a macro for generating all config settings for a particular set of parameters. - Update `render_pkg_aliases` to also use those config settings. - Update the toolchain selection `target_settings` to use the `py_linux_libc` config setting. With this the user can register a `musl` linux toolchain if needed. We can also use similar `flag_values` to resolve #1876. - Integrate everything in the `pip` extension and setup cross-platform select statements. Work towards #1357, #260 Stacked on #1937 --- CHANGELOG.md | 27 +- MODULE.bazel | 4 +- .../api/python/config_settings/index.md | 90 ++- docs/sphinx/pip.md | 166 +---- docs/sphinx/pypi-dependencies.md | 278 +++++++-- examples/bzlmod/libs/my_lib/__init__.py | 8 +- python/config_settings/BUILD.bazel | 67 ++ python/config_settings/transition.bzl | 19 +- .../tools/wheel_installer/wheel.py | 1 + .../tools/wheel_installer/wheel_test.py | 8 +- python/private/BUILD.bazel | 19 + python/private/bzlmod/BUILD.bazel | 1 + python/private/bzlmod/pip.bzl | 124 ++-- python/private/bzlmod/pip_repository.bzl | 9 +- python/private/config_settings.bzl | 8 +- python/private/parse_requirements.bzl | 12 + python/private/pip_config_settings.bzl | 366 +++++++++++ python/private/pip_flags.bzl | 69 +++ python/private/pip_repo_name.bzl | 52 ++ python/private/py_toolchain_suite.bzl | 43 +- python/private/render_pkg_aliases.bzl | 410 ++++++++++++- python/private/toolchains_repo.bzl | 8 +- python/private/whl_target_platforms.bzl | 11 + python/versions.bzl | 21 + .../transition/multi_version_tests.bzl | 13 +- .../render_pkg_aliases_test.bzl | 578 +++++++++++++++++- tests/private/pip_config_settings/BUILD.bazel | 5 + .../pip_config_settings_tests.bzl | 544 +++++++++++++++++ tests/private/pip_repo_name/BUILD.bazel | 3 + .../pip_repo_name/pip_repo_name_tests.bzl | 52 ++ .../whl_target_platforms_tests.bzl | 28 +- tests/support/BUILD.bazel | 16 + 32 files changed, 2682 insertions(+), 378 deletions(-) create mode 100644 python/private/pip_config_settings.bzl create mode 100644 python/private/pip_flags.bzl create mode 100644 python/private/pip_repo_name.bzl create mode 100644 tests/private/pip_config_settings/BUILD.bazel create mode 100644 tests/private/pip_config_settings/pip_config_settings_tests.bzl create mode 100644 tests/private/pip_repo_name/BUILD.bazel create mode 100644 tests/private/pip_repo_name/pip_repo_name_tests.bzl diff --git a/CHANGELOG.md b/CHANGELOG.md index 0720a36a59..81340160a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,10 +36,20 @@ A brief description of the categories of changes: * (bzlmod): The `python` and internal `rules_python` extensions have been marked as `reproducible` and will not include any lock file entries from now on. - * (gazelle): Remove gazelle plugin's python deps and make it hermetic. Introduced a new Go-based helper leveraging tree-sitter for syntax analysis. Implemented the use of `pypi/stdlib-list` for standard library module verification. +* (pip.parse): Do not ignore yanked packages when using `experimental_index_url`. + This is to mimic what `uv` is doing. We will print a warning instead. +* (pip.parse): Add references to all supported wheels when using `experimental_index_url` + to allowing to correctly fetch the wheels for the right platform. See the + updated docs on how to use the feature. This is work towards addressing + [#735](https://github.com/bazelbuild/rules_python/issues/735) and + [#260](https://github.com/bazelbuild/rules_python/issues/260). The spoke + repository names when using this flag will have a structure of + `{pip_hub_prefix}_{wheel_name}_{py_tag}_{abi_tag}_{platform_tag}_{sha256}`, + which is an implementation detail which should not be relied on and is there + purely for better debugging experience. ### Fixed * (gazelle) Remove `visibility` from `NonEmptyAttr`. @@ -63,6 +73,13 @@ A brief description of the categories of changes: the `experimental_index_url` feature which will fetch metadata from PyPI or a different private index and write the contents to the lock file. Fixes [#1643](https://github.com/bazelbuild/rules_python/issues/1643). +* (pip.parse): Install `yanked` packages and print a warning instead of + ignoring them. This better matches the behaviour of `uv pip install`. +* (toolchains): Now matching of the default hermetic toolchain is more robust + and explicit and should fix rare edge-cases where the host toolchain + autodetection would match a different toolchain than expected. This may yield + to toolchain selection failures when the python toolchain is not registered, + but is requested via `//python/config_settings:python_version` flag setting. ### Added * (rules) Precompiling Python source at build time is available. but is @@ -104,6 +121,14 @@ A brief description of the categories of changes: {obj}`PyRuntimeInfo.zip_main_template`. * (toolchains) A replacement for the Bazel-builtn autodetecting toolchain is available. The `//python:autodetecting_toolchain` alias now uses it. +* (pip): Support fetching and using the wheels for other platforms. This + supports customizing whether the linux wheels are pulled for `musl` or + `glibc`, whether `universal2` or arch-specific MacOS wheels are preferred and + it also allows to select a particular `libc` version. All of this is done via + the `string_flags` in `@rules_python//python/config_settings`. If there are + no wheels that are supported for the target platform, `rules_python` will + fallback onto building the `sdist` from source. This behaviour can be + disabled if desired using one of the available string flags as well. [precompile-docs]: /precompiling diff --git a/MODULE.bazel b/MODULE.bazel index 38ee678015..7e86bda9b8 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -96,7 +96,9 @@ dev_pip.parse( }, hub_name = "dev_pip", python_version = "3.11", - requirements_lock = "//docs/sphinx:requirements.txt", + requirements_by_platform = { + "//docs/sphinx:requirements.txt": "linux_*,osx_*", + }, ) dev_pip.parse( hub_name = "pypiserver", diff --git a/docs/sphinx/api/python/config_settings/index.md b/docs/sphinx/api/python/config_settings/index.md index 29779fd813..8c23bf6855 100644 --- a/docs/sphinx/api/python/config_settings/index.md +++ b/docs/sphinx/api/python/config_settings/index.md @@ -5,11 +5,18 @@ # //python/config_settings -:::{bzl:flag} precompile +:::{bzl:flag} python_version +Determines the default hermetic Python toolchain version. This can be set to +one of the values that `rules_python` maintains. +::: + +::::{bzl:flag} precompile Determines if Python source files should be compiled at build time. -NOTE: The flag value is overridden by the target level `precompile` attribute, +:::{note} +The flag value is overridden by the target level `precompile` attribute, except for the case of `force_enabled` and `forced_disabled`. +::: Values: @@ -27,14 +34,16 @@ Values: * `force_disabled`: Like `disabled`, except overrides target-level setting. This is useful useful for development, testing enabling precompilation more broadly, or as an escape hatch if build-time compiling is not available. -::: +:::: -:::{bzl:flag} precompile_source_retention +::::{bzl:flag} precompile_source_retention Determines, when a source file is compiled, if the source file is kept in the resulting output or not. -NOTE: This flag is overridden by the target level `precompile_source_retention` +:::{note} +This flag is overridden by the target level `precompile_source_retention` attribute. +::: Values: @@ -42,7 +51,7 @@ Values: * `omit_source`: Don't include the orignal py source. * `omit_if_generated_source`: Keep the original source if it's a regular source file, but omit it if it's a generated file. -::: +:::: :::{bzl:flag} precompile_add_to_runfiles Determines if a target adds its compiled files to its runfiles. @@ -59,15 +68,80 @@ Values: incrementally enabling precompilation on a per-binary basis. ::: -:::{bzl:flag} pyc_collection +::::{bzl:flag} pyc_collection Determine if `py_binary` collects transitive pyc files. -NOTE: This flag is overridden by the target level `pyc_collection` attribute. +:::{note} +This flag is overridden by the target level `pyc_collection` attribute. +::: Values: * `include_pyc`: Include `PyInfo.transitive_pyc_files` as part of the binary. * `disabled`: Don't include `PyInfo.transitive_pyc_files` as part of the binary. +:::: + +::::{bzl:flag} py_linux_libc +Set what libc is used for the target platform. This will affect which whl binaries will be pulled and what toolchain will be auto-detected. Currently `rules_python` only supplies toolchains compatible with `glibc`. + +Values: +* `glibc`: Use `glibc`, default. +* `muslc`: Use `muslc`. +:::{versionadded} 0.33.0 +::: +:::: + +::::{bzl:flag} pip_whl +Set what distributions are used in the `pip` integration. + +Values: +* `auto`: Prefer `whl` distributions if they are compatible with a target + platform, but fallback to `sdist`. This is the default. +* `only`: Only use `whl` distributions and error out if it is not available. +* `no`: Only use `sdist` distributions. The wheels will be built non-hermetically in the `whl_library` repository rule. +:::{versionadded} 0.33.0 ::: +:::: + +::::{bzl:flag} pip_whl_osx_arch +Set what wheel types we should prefer when building on the OSX platform. + +Values: +* `arch`: Prefer architecture specific wheels. +* `universal`: Prefer universal wheels that usually are bigger and contain binaries for both, Intel and ARM architectures in the same wheel. +:::{versionadded} 0.33.0 +::: +:::: + +::::{bzl:flag} pip_whl_glibc_version +Set the minimum `glibc` version that the `py_binary` using `whl` distributions from a PyPI index should support. + +Values: +* `""`: Select the lowest available version of each wheel giving you the maximum compatibility. This is the default. +* `X.Y`: The string representation of a `glibc` version. The allowed values depend on the `requirements.txt` lock file contents. +:::{versionadded} 0.33.0 +::: +:::: + +::::{bzl:flag} pip_whl_muslc_version +Set the minimum `muslc` version that the `py_binary` using `whl` distributions from a PyPI index should support. + +Values: +* `""`: Select the lowest available version of each wheel giving you the maximum compatibility. This is the default. +* `X.Y`: The string representation of a `muslc` version. The allowed values depend on the `requirements.txt` lock file contents. +:::{versionadded} 0.33.0 +::: +:::: + +::::{bzl:flag} pip_whl_osx_version +Set the minimum `osx` version that the `py_binary` using `whl` distributions from a PyPI index should support. + +Values: +* `""`: Select the lowest available version of each wheel giving you the maximum compatibility. This is the default. +* `X.Y`: The string representation of the MacOS version. The allowed values depend on the `requirements.txt` lock file contents. + +:::{versionadded} 0.33.0 +::: +:::: ::::{bzl:flag} bootstrap_impl Determine how programs implement their startup process. diff --git a/docs/sphinx/pip.md b/docs/sphinx/pip.md index fc29e41b5e..43d8fc4978 100644 --- a/docs/sphinx/pip.md +++ b/docs/sphinx/pip.md @@ -1,168 +1,4 @@ (pip-integration)= # Pip Integration -To pull in dependencies from PyPI, the `pip_parse` function is used, which -invokes `pip` to download and install dependencies from PyPI. - -In your WORKSPACE file: - -```starlark -load("@rules_python//python:pip.bzl", "pip_parse") - -pip_parse( - name = "pip_deps", - requirements_lock = ":requirements.txt", -) - -load("@pip_deps//:requirements.bzl", "install_deps") - -install_deps() -``` - -For `bzlmod` an equivalent `MODULE.bazel` would look like: -```starlark -pip = use_extension("//python/extensions:pip.bzl", "pip") -pip.parse( - hub_name = "pip_deps", - requirements_lock = ":requirements.txt", -) -use_repo(pip, "pip_deps") -``` - -You can then reference installed dependencies from a `BUILD` file with: - -```starlark -load("@pip_deps//:requirements.bzl", "requirement") - -py_library( - name = "bar", - ... - deps = [ - "//my/other:dep", - "@pip_deps//requests", - "@pip_deps//numpy", - ], -) -``` - -The rules also provide a convenience macro for translating the entries in the -`requirements.txt` file (e.g. `opencv-python`) to the right bazel label (e.g. -`@pip_deps//opencv_python`). The convention of bazel labels is lowercase -`snake_case`, but you can use the helper to avoid depending on this convention -as follows: - -```starlark -load("@pip_deps//:requirements.bzl", "requirement") - -py_library( - name = "bar", - ... - deps = [ - "//my/other:dep", - requirement("requests"), - requirement("numpy"), - ], -) -``` - -If you would like to access [entry points][whl_ep], see the `py_console_script_binary` rule documentation. - -[whl_ep]: https://packaging.python.org/specifications/entry-points/ - -(per-os-arch-requirements)= -## Requirements for a specific OS/Architecture - -In some cases you may need to use different requirements files for different OS, Arch combinations. This is enabled via the `requirements_by_platform` attribute in `pip.parse` extension and the `pip_parse` repository rule. The keys of the dictionary are labels to the file and the values are a list of comma separated target (os, arch) tuples. - -For example: -```starlark - # ... - requirements_by_platform = { - "requirements_linux_x86_64.txt": "linux_x86_64", - "requirements_osx.txt": "osx_*", - "requirements_linux_exotic.txt": "linux_exotic", - "requirements_some_platforms.txt": "linux_aarch64,windows_*", - }, - # For the list of standard platforms that the rules_python has toolchains for, default to - # the following requirements file. - requirements_lock = "requirements_lock.txt", -``` - -In case of duplicate platforms, `rules_python` will raise an error as there has -to be unambiguous mapping of the requirement files to the (os, arch) tuples. - -An alternative way is to use per-OS requirement attributes. -```starlark - # ... - requirements_windows = "requirements_windows.txt", - requirements_darwin = "requirements_darwin.txt", - # For the remaining platforms (which is basically only linux OS), use this file. - requirements_lock = "requirements_lock.txt", -) -``` - -(vendoring-requirements)= -## Vendoring the requirements.bzl file - -In some cases you may not want to generate the requirements.bzl file as a repository rule -while Bazel is fetching dependencies. For example, if you produce a reusable Bazel module -such as a ruleset, you may want to include the requirements.bzl file rather than make your users -install the WORKSPACE setup to generate it. -See https://github.com/bazelbuild/rules_python/issues/608 - -This is the same workflow as Gazelle, which creates `go_repository` rules with -[`update-repos`](https://github.com/bazelbuild/bazel-gazelle#update-repos) - -To do this, use the "write to source file" pattern documented in -https://blog.aspect.dev/bazel-can-write-to-the-source-folder -to put a copy of the generated requirements.bzl into your project. -Then load the requirements.bzl file directly rather than from the generated repository. -See the example in rules_python/examples/pip_parse_vendored. - - -(credential-helper)= -## Credential Helper - -The "use Bazel downloader for python wheels" experimental feature includes support for the Bazel -[Credential Helper][cred-helper-design]. - -Your python artifact registry may provide a credential helper for you. Refer to your index's docs -to see if one is provided. - -See the [Credential Helper Spec][cred-helper-spec] for details. - -[cred-helper-design]: https://github.com/bazelbuild/proposals/blob/main/designs/2022-06-07-bazel-credential-helpers.md -[cred-helper-spec]: https://github.com/EngFlow/credential-helper-spec/blob/main/spec.md - - -### Basic Example: - -The simplest form of a credential helper is a bash script that accepts an arg and spits out JSON to -stdout. For a service like Google Artifact Registry that uses ['Basic' HTTP Auth][rfc7617] and does -not provide a credential helper that conforms to the [spec][cred-helper-spec], the script might -look like: - -```bash -#!/bin/bash -# cred_helper.sh -ARG=$1 # but we don't do anything with it as it's always "get" - -# formatting is optional -echo '{' -echo ' "headers": {' -echo ' "Authorization": ["Basic dGVzdDoxMjPCow=="]' -echo ' }' -echo '}' -``` - -Configure Bazel to use this credential helper for your python index `example.com`: - -``` -# .bazelrc -build --credential_helper=example.com=/full/path/to/cred_helper.sh -``` - -Bazel will call this file like `cred_helper.sh get` and use the returned JSON to inject headers -into whatever HTTP(S) request it performs against `example.com`. - -[rfc7617]: https://datatracker.ietf.org/doc/html/rfc7617 +See [PyPI dependencies](./pypi-dependencies). diff --git a/docs/sphinx/pypi-dependencies.md b/docs/sphinx/pypi-dependencies.md index f08f7fb7a7..db017d249f 100644 --- a/docs/sphinx/pypi-dependencies.md +++ b/docs/sphinx/pypi-dependencies.md @@ -1,3 +1,6 @@ +:::{default-domain} bzl +::: + # Using dependencies from PyPI Using PyPI packages (aka "pip install") involves two main steps. @@ -25,19 +28,21 @@ pip.parse( use_repo(pip, "my_deps") ``` For more documentation, including how the rules can update/create a requirements -file, see the bzlmod examples under the {gh-path}`examples` folder. +file, see the bzlmod examples under the {gh-path}`examples` folder or the documentation +for the {obj}`@rules_python//python/extensions:pip.bzl` extension. +```{note} We are using a host-platform compatible toolchain by default to setup pip dependencies. During the setup phase, we create some symlinks, which may be inefficient on Windows by default. In that case use the following `.bazelrc` options to improve performance if you have admin privileges: -``` -startup --windows_enable_symlinks -``` + + startup --windows_enable_symlinks This will enable symlinks on Windows and help with bootstrap performance of setting up the hermetic host python interpreter on this platform. Linux and OSX users should see no difference. +``` ### Using a WORKSPACE file @@ -59,16 +64,67 @@ load("@my_deps//:requirements.bzl", "install_deps") install_deps() ``` +(vendoring-requirements)= +#### Vendoring the requirements.bzl file + +In some cases you may not want to generate the requirements.bzl file as a repository rule +while Bazel is fetching dependencies. For example, if you produce a reusable Bazel module +such as a ruleset, you may want to include the requirements.bzl file rather than make your users +install the WORKSPACE setup to generate it. +See https://github.com/bazelbuild/rules_python/issues/608 + +This is the same workflow as Gazelle, which creates `go_repository` rules with +[`update-repos`](https://github.com/bazelbuild/bazel-gazelle#update-repos) + +To do this, use the "write to source file" pattern documented in +https://blog.aspect.dev/bazel-can-write-to-the-source-folder +to put a copy of the generated requirements.bzl into your project. +Then load the requirements.bzl file directly rather than from the generated repository. +See the example in rules_python/examples/pip_parse_vendored. + +(per-os-arch-requirements)= +### Requirements for a specific OS/Architecture + +In some cases you may need to use different requirements files for different OS, Arch combinations. This is enabled via the `requirements_by_platform` attribute in `pip.parse` extension and the `pip_parse` repository rule. The keys of the dictionary are labels to the file and the values are a list of comma separated target (os, arch) tuples. + +For example: +```starlark + # ... + requirements_by_platform = { + "requirements_linux_x86_64.txt": "linux_x86_64", + "requirements_osx.txt": "osx_*", + "requirements_linux_exotic.txt": "linux_exotic", + "requirements_some_platforms.txt": "linux_aarch64,windows_*", + }, + # For the list of standard platforms that the rules_python has toolchains for, default to + # the following requirements file. + requirements_lock = "requirements_lock.txt", +``` + +In case of duplicate platforms, `rules_python` will raise an error as there has +to be unambiguous mapping of the requirement files to the (os, arch) tuples. + +An alternative way is to use per-OS requirement attributes. +```starlark + # ... + requirements_windows = "requirements_windows.txt", + requirements_darwin = "requirements_darwin.txt", + # For the remaining platforms (which is basically only linux OS), use this file. + requirements_lock = "requirements_lock.txt", +) +``` + ### pip rules -Note that since `pip_parse` is a repository rule and therefore executes pip at -WORKSPACE-evaluation time, Bazel has no information about the Python toolchain -and cannot enforce that the interpreter used to invoke pip matches the -interpreter used to run `py_binary` targets. By default, `pip_parse` uses the -system command `"python3"`. To override this, pass in the `python_interpreter` -attribute or `python_interpreter_target` attribute to `pip_parse`. +Note that since `pip_parse` and `pip.parse` are executed at evaluation time, +Bazel has no information about the Python toolchain and cannot enforce that the +interpreter used to invoke `pip` matches the interpreter used to run +`py_binary` targets. By default, `pip_parse` uses the system command +`"python3"`. To override this, pass in the `python_interpreter` attribute or +`python_interpreter_target` attribute to `pip_parse`. The `pip.parse` `bzlmod` extension +by default uses the hermetic python toolchain for the host platform. -You can have multiple `pip_parse`s in the same workspace. Or use the pip +You can have multiple `pip_parse`s in the same workspace, or use the pip extension multiple times when using bzlmod. This configuration will create multiple external repos that have no relation to one another and may result in downloading the same wheels numerous times. @@ -111,7 +167,7 @@ want to use `requirement()`, you can use the library labels directly instead. For `pip_parse`, the labels are of the following form: ```starlark -@{name}_{package}//:pkg +@{name}//{package} ``` Here `name` is the `name` attribute that was passed to `pip_parse` and @@ -121,30 +177,67 @@ update `name` from "old" to "new", then you can run the following buildozer command: ```shell -buildozer 'substitute deps @old_([^/]+)//:pkg @new_${1}//:pkg' //...:* +buildozer 'substitute deps @old//([^/]+) @new//${1}' //...:* ``` [requirements-drawbacks]: https://github.com/bazelbuild/rules_python/issues/414 +### Entry points + +If you would like to access [entry points][whl_ep], see the `py_console_script_binary` rule documentation, +which can help you create a `py_binary` target for a particular console script exposed by a package. + +[whl_ep]: https://packaging.python.org/specifications/entry-points/ + ### 'Extras' dependencies Any 'extras' specified in the requirements lock file will be automatically added as transitive dependencies of the package. In the example above, you'd just put -`requirement("useful_dep")`. +`requirement("useful_dep")` or `@pypi//useful_dep`. -### Packaging cycles +### Consuming Wheel Dists Directly -Sometimes PyPi packages contain dependency cycles -- for instance `sphinx` -depends on `sphinxcontrib-serializinghtml`. When using them as `requirement()`s, -ala +If you need to depend on the wheel dists themselves, for instance, to pass them +to some other packaging tool, you can get a handle to them with the +`whl_requirement` macro. For example: + +```starlark +load("@pypi//:requirements.bzl", "whl_requirement") + +filegroup( + name = "whl_files", + data = [ + # This is equivalent to "@pypi//boto3:whl" + whl_requirement("boto3"), + ] +) +``` + +### Creating a filegroup of files within a whl + +The rule {obj}`whl_filegroup` exists as an easy way to extract the necessary files +from a whl file without the need to modify the `BUILD.bazel` contents of the +whl repositories generated via `pip_repository`. Use it similarly to the `filegroup` +above. See the API docs for more information. + +(advance-topics)= +## Advanced topics + +(circular-deps)= +### Circular dependencies + +Sometimes PyPi packages contain dependency cycles -- for instance a particular +version `sphinx` (this is no longer the case in the latest version as of +2024-06-02) depends on `sphinxcontrib-serializinghtml`. When using them as +`requirement()`s, ala ``` py_binary( - name = "doctool", - ... - deps = [ - requirement("sphinx"), - ] + name = "doctool", + ... + deps = [ + requirement("sphinx"), + ], ) ``` @@ -166,15 +259,15 @@ issues by specifying groups of packages which form cycles. `pip_parse` will transparently fix the cycles for you and provide the cyclic dependencies simultaneously. -``` +```starlark pip_parse( - ... - experimental_requirement_cycles = { - "sphinx": [ - "sphinx", - "sphinxcontrib-serializinghtml", - ] - }, + ... + experimental_requirement_cycles = { + "sphinx": [ + "sphinx", + "sphinxcontrib-serializinghtml", + ] + }, ) ``` @@ -183,17 +276,17 @@ be distinct. `apache-airflow` for instance has dependency cycles with a number of its optional dependencies, which means those optional dependencies must all be a part of the `airflow` cycle. For instance -- -``` +```starlark pip_parse( - ... - experimental_requirement_cycles = { - "airflow": [ - "apache-airflow", - "apache-airflow-providers-common-sql", - "apache-airflow-providers-postgres", - "apache-airflow-providers-sqlite", - ] - } + ... + experimental_requirement_cycles = { + "airflow": [ + "apache-airflow", + "apache-airflow-providers-common-sql", + "apache-airflow-providers-postgres", + "apache-airflow-providers-sqlite", + ] + } ) ``` @@ -213,17 +306,98 @@ leg of the dependency manually. For instance by making `apache-airflow-providers-postgres` not explicitly depend on `apache-airflow` or perhaps `apache-airflow-providers-common-sql`. -## Consuming Wheel Dists Directly -If you need to depend on the wheel dists themselves, for instance, to pass them -to some other packaging tool, you can get a handle to them with the -`whl_requirement` macro. For example: +(bazel-downloader)= +### Bazel downloader and multi-platform wheel hub repository. -```starlark -filegroup( - name = "whl_files", - data = [ - whl_requirement("boto3"), - ] -) +The `bzlmod` `pip.parse` call supports pulling information from `PyPI` (or a +compatible mirror) and it will ensure that the [bazel +downloader][bazel_downloader] is used for downloading the wheels. This allows +the users to use the [credential helper](#credential-helper) to authenticate +with the mirror and it also ensures that the distribution downloads are cached. +It also avoids using `pip` altogether and results in much faster dependency +fetching. + +This can be enabled by `experimental_index_url` and related flags as shown in +the {gh-path}`examples/bzlmod/MODULE.bazel` example. + +When using this feature during the `pip` extension evaluation you will see the accessed indexes similar to below: +```console +Loading: 0 packages loaded + currently loading: docs/sphinx + Fetching module extension pip in @@//python/extensions:pip.bzl; starting + Fetching https://pypi.org/simple/twine/ ``` + +This does not mean that `rules_python` is fetching the wheels eagerly, but it +rather means that it is calling the PyPI server to get the Simple API response +to get the list of all available source and wheel distributions. Once it has +got all of the available distributions, it will select the right ones depending +on the `sha256` values in your `requirements_lock.txt` file. The compatible +distribution URLs will be then written to the `MODULE.bazel.lock` file. Currently +users wishing to use the lock file with `rules_python` with this feature have +to set an environment variable `RULES_PYTHON_OS_ARCH_LOCK_FILE=0` which will +become default in the next release. + +Fetching the distribution information from the PyPI allows `rules_python` to +know which `whl` should be used on which target platform and it will determine +that by parsing the `whl` filename based on [PEP600], [PEP656] standards. This +allows the user to configure the behaviour by using the following publicly +available flags: +* {obj}`--@rules_python//python/config_settings:py_linux_libc` for selecting the Linux libc variant. +* {obj}`--@rules_python//python/config_settings:pip_whl` for selecting `whl` distribution preference. +* {obj}`--@rules_python//python/config_settings:pip_whl_osx_arch` for selecting MacOS wheel preference. +* {obj}`--@rules_python//python/config_settings:pip_whl_glibc_version` for selecting the GLIBC version compatibility. +* {obj}`--@rules_python//python/config_settings:pip_whl_muslc_version` for selecting the musl version compatibility. +* {obj}`--@rules_python//python/config_settings:pip_whl_osx_version` for selecting MacOS version compatibility. + +[bazel_downloader]: https://bazel.build/rules/lib/builtins/repository_ctx#download +[pep600]: https://peps.python.org/pep-0600/ +[pep656]: https://peps.python.org/pep-0656/ + +(credential-helper)= +### Credential Helper + +The "use Bazel downloader for python wheels" experimental feature includes support for the Bazel +[Credential Helper][cred-helper-design]. + +Your python artifact registry may provide a credential helper for you. Refer to your index's docs +to see if one is provided. + +See the [Credential Helper Spec][cred-helper-spec] for details. + +[cred-helper-design]: https://github.com/bazelbuild/proposals/blob/main/designs/2022-06-07-bazel-credential-helpers.md +[cred-helper-spec]: https://github.com/EngFlow/credential-helper-spec/blob/main/spec.md + + +#### Basic Example: + +The simplest form of a credential helper is a bash script that accepts an arg and spits out JSON to +stdout. For a service like Google Artifact Registry that uses ['Basic' HTTP Auth][rfc7617] and does +not provide a credential helper that conforms to the [spec][cred-helper-spec], the script might +look like: + +```bash +#!/bin/bash +# cred_helper.sh +ARG=$1 # but we don't do anything with it as it's always "get" + +# formatting is optional +echo '{' +echo ' "headers": {' +echo ' "Authorization": ["Basic dGVzdDoxMjPCow=="]' +echo ' }' +echo '}' +``` + +Configure Bazel to use this credential helper for your python index `example.com`: + +``` +# .bazelrc +build --credential_helper=example.com=/full/path/to/cred_helper.sh +``` + +Bazel will call this file like `cred_helper.sh get` and use the returned JSON to inject headers +into whatever HTTP(S) request it performs against `example.com`. + +[rfc7617]: https://datatracker.ietf.org/doc/html/rfc7617 diff --git a/examples/bzlmod/libs/my_lib/__init__.py b/examples/bzlmod/libs/my_lib/__init__.py index 8ce96ea207..271e933417 100644 --- a/examples/bzlmod/libs/my_lib/__init__.py +++ b/examples/bzlmod/libs/my_lib/__init__.py @@ -19,4 +19,10 @@ def websockets_is_for_python_version(sanitized_version_check): # We are checking that the name of the repository folders # match the expected generated names. If we update the folder # structure or naming we will need to modify this test. - return f"_{sanitized_version_check}_websockets" in websockets.__file__ + want = f"_{sanitized_version_check}_websockets" + got_full = websockets.__file__ + if want not in got_full: + print(f"Failed, expected '{want}' to be a substring of '{got_full}'.") + return False + + return True diff --git a/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel index 9dab53c039..e2d2608c7c 100644 --- a/python/config_settings/BUILD.bazel +++ b/python/config_settings/BUILD.bazel @@ -7,6 +7,13 @@ load( "PrecompileSourceRetentionFlag", "PycCollectionFlag", ) +load( + "//python/private:pip_flags.bzl", + "INTERNAL_FLAGS", + "UniversalWhlFlag", + "UseWhlFlag", + "WhlLibcFlag", +) load(":config_settings.bzl", "construct_config_settings") filegroup( @@ -61,3 +68,63 @@ string_flag( # NOTE: Only public because its an implicit dependency visibility = ["//visibility:public"], ) + +# 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()), + # NOTE: Only public because it is used in pip hub and toolchain repos. + visibility = ["//visibility:public"], +) + +# pip.parse related flags + +string_flag( + name = "pip_whl", + build_setting_default = UseWhlFlag.AUTO, + values = sorted(UseWhlFlag.__members__.values()), + # NOTE: Only public because it is used in pip hub repos. + visibility = ["//visibility:public"], +) + +string_flag( + name = "pip_whl_osx_arch", + build_setting_default = UniversalWhlFlag.ARCH, + values = sorted(UniversalWhlFlag.__members__.values()), + # NOTE: Only public because it is used in pip hub repos. + visibility = ["//visibility:public"], +) + +string_flag( + name = "pip_whl_glibc_version", + build_setting_default = "", + # NOTE: Only public because it is used in pip hub repos. + visibility = ["//visibility:public"], +) + +string_flag( + name = "pip_whl_muslc_version", + build_setting_default = "", + # NOTE: Only public because it is used in pip hub repos. + visibility = ["//visibility:public"], +) + +string_flag( + name = "pip_whl_osx_version", + build_setting_default = "", + # NOTE: Only public because it is used in pip hub repos. + visibility = ["//visibility:public"], +) + +# private pip whl related flags. Their values cannot be changed and they +# are an implementation detail of how `pip_config_settings` work. +[ + string_flag( + name = "_internal_pip_" + flag, + build_setting_default = "", + values = [""], + visibility = ["//visibility:public"], + ) + for flag in INTERNAL_FLAGS +] diff --git a/python/config_settings/transition.bzl b/python/config_settings/transition.bzl index cd54b21956..48b0447ede 100644 --- a/python/config_settings/transition.bzl +++ b/python/config_settings/transition.bzl @@ -53,12 +53,14 @@ def _transition_py_impl(ctx): for file in target[DefaultInfo].default_runfiles.files.to_list(): if file.short_path == expected_target_path: zipfile = file - zipfile_symlink = ctx.actions.declare_file(ctx.attr.name + ".zip") - ctx.actions.symlink( - is_executable = True, - output = zipfile_symlink, - target_file = zipfile, - ) + + if zipfile: + zipfile_symlink = ctx.actions.declare_file(ctx.attr.name + ".zip") + ctx.actions.symlink( + is_executable = True, + output = zipfile_symlink, + target_file = zipfile, + ) env = {} for k, v in ctx.attr.env.items(): env[k] = ctx.expand_location(v) @@ -75,7 +77,10 @@ def _transition_py_impl(ctx): elif BuiltinPyRuntimeInfo in target: py_runtime_info = target[BuiltinPyRuntimeInfo] else: - fail("target {} does not have rules_python PyRuntimeInfo or builtin PyRuntimeInfo".format(target)) + fail( + "target {} does not have rules_python PyRuntimeInfo or builtin PyRuntimeInfo. ".format(target) + + "There is likely no toolchain being matched to your configuration, use --toolchain_resolution_debug parameter to get more information", + ) providers = [ DefaultInfo( diff --git a/python/pip_install/tools/wheel_installer/wheel.py b/python/pip_install/tools/wheel_installer/wheel.py index b84c214018..3d6780de9a 100644 --- a/python/pip_install/tools/wheel_installer/wheel.py +++ b/python/pip_install/tools/wheel_installer/wheel.py @@ -51,6 +51,7 @@ class Arch(Enum): aarch64 = 3 ppc = 4 s390x = 5 + arm = 6 amd64 = x86_64 arm64 = aarch64 i386 = x86_32 diff --git a/python/pip_install/tools/wheel_installer/wheel_test.py b/python/pip_install/tools/wheel_installer/wheel_test.py index acf2315ee9..3ddfaf7f2e 100644 --- a/python/pip_install/tools/wheel_installer/wheel_test.py +++ b/python/pip_install/tools/wheel_installer/wheel_test.py @@ -371,17 +371,17 @@ def test_can_get_specific_from_string(self): def test_can_get_all_for_py_version(self): cp39 = wheel.Platform.all(minor_version=9) - self.assertEqual(15, len(cp39), f"Got {cp39}") + self.assertEqual(18, len(cp39), f"Got {cp39}") self.assertEqual(cp39, wheel.Platform.from_string("cp39_*")) def test_can_get_all_for_os(self): linuxes = wheel.Platform.all(wheel.OS.linux, minor_version=9) - self.assertEqual(5, len(linuxes)) + self.assertEqual(6, len(linuxes)) self.assertEqual(linuxes, wheel.Platform.from_string("cp39_linux_*")) def test_can_get_all_for_os_for_host_python(self): linuxes = wheel.Platform.all(wheel.OS.linux) - self.assertEqual(5, len(linuxes)) + self.assertEqual(6, len(linuxes)) self.assertEqual(linuxes, wheel.Platform.from_string("linux_*")) def test_specific_version_specializations(self): @@ -425,6 +425,7 @@ def test_linux_specializations(self): wheel.Platform(os=wheel.OS.linux, arch=wheel.Arch.aarch64), wheel.Platform(os=wheel.OS.linux, arch=wheel.Arch.ppc), wheel.Platform(os=wheel.OS.linux, arch=wheel.Arch.s390x), + wheel.Platform(os=wheel.OS.linux, arch=wheel.Arch.arm), ] self.assertEqual(want, all_specializations) @@ -441,6 +442,7 @@ def test_osx_specializations(self): wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.aarch64), wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.ppc), wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.s390x), + wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.arm), ] self.assertEqual(want, all_specializations) diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index ab077c6f59..d73cee8ae4 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -144,6 +144,23 @@ bzl_library( srcs = ["parse_whl_name.bzl"], ) +bzl_library( + name = "pip_flags_bzl", + srcs = ["pip_flags.bzl"], + deps = [ + ":enum_bzl", + ], +) + +bzl_library( + name = "pip_repo_name_bzl", + srcs = ["pip_repo_name.bzl"], + deps = [ + ":normalize_name_bzl", + ":parse_whl_name_bzl", + ], +) + bzl_library( name = "pypi_index_bzl", srcs = ["pypi_index.bzl"], @@ -234,6 +251,8 @@ bzl_library( name = "py_toolchain_suite_bzl", srcs = ["py_toolchain_suite.bzl"], deps = [ + ":config_settings_bzl", + ":text_util_bzl", ":toolchain_types_bzl", "@bazel_skylib//lib:selects", ], diff --git a/python/private/bzlmod/BUILD.bazel b/python/private/bzlmod/BUILD.bazel index 2eab575726..3362f34ffd 100644 --- a/python/private/bzlmod/BUILD.bazel +++ b/python/private/bzlmod/BUILD.bazel @@ -36,6 +36,7 @@ bzl_library( "//python/private:normalize_name_bzl", "//python/private:parse_requirements_bzl", "//python/private:parse_whl_name_bzl", + "//python/private:pip_repo_name_bzl", "//python/private:version_label_bzl", ":bazel_features_bzl", ] + [ diff --git a/python/private/bzlmod/pip.bzl b/python/private/bzlmod/pip.bzl index 8702f1fbe7..122debd2a2 100644 --- a/python/private/bzlmod/pip.bzl +++ b/python/private/bzlmod/pip.bzl @@ -26,11 +26,11 @@ load("//python/private:auth.bzl", "AUTH_ATTRS") load("//python/private:normalize_name.bzl", "normalize_name") load("//python/private:parse_requirements.bzl", "host_platform", "parse_requirements", "select_requirement") load("//python/private:parse_whl_name.bzl", "parse_whl_name") +load("//python/private:pip_repo_name.bzl", "pip_repo_name") load("//python/private:pypi_index.bzl", "simpleapi_download") load("//python/private:render_pkg_aliases.bzl", "whl_alias") load("//python/private:repo_utils.bzl", "repo_utils") load("//python/private:version_label.bzl", "version_label") -load("//python/private:whl_target_platforms.bzl", "select_whl") load(":pip_repository.bzl", "pip_repository") def _parse_version(version): @@ -199,19 +199,6 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s repository_platform = host_platform(module_ctx.os) for whl_name, requirements in requirements_by_platform.items(): - requirement = select_requirement( - requirements, - platform = 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 - # We are not using the "sanitized name" because the user # would need to guess what name we modified the whl name # to. @@ -223,11 +210,9 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s # Construct args separately so that the lock file can be smaller and does not include unused # attrs. - repo_name = "{}_{}".format(pip_name, whl_name) whl_library_args = dict( repo = pip_name, dep_template = "@{}//{{name}}:{{target}}".format(hub_name), - requirement = requirement.requirement_line, ) maybe_args = dict( # The following values are safe to omit if they have false like values @@ -237,7 +222,6 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s environment = pip_attr.environment, envsubst = pip_attr.envsubst, experimental_target_platforms = pip_attr.experimental_target_platforms, - extra_pip_args = requirement.extra_pip_args, group_deps = group_deps, group_name = group_name, pip_data_exclude = pip_attr.pip_data_exclude, @@ -257,51 +241,83 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s ) whl_library_args.update({k: v for k, (v, default) in maybe_args_with_default.items() if v == default}) - if requirement.whls or requirement.sdist: - logger.debug(lambda: "Selecting a compatible dist for {} from dists:\n{}".format( - repository_platform, - json.encode( - struct( - whls = requirement.whls, - sdist = requirement.sdist, - ), - ), - )) - distribution = select_whl( - whls = requirement.whls, - want_platform = repository_platform, - ) or requirement.sdist - - logger.debug(lambda: "Selected: {}".format(distribution)) - - if distribution: - is_hub_reproducible = False - 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 - if pip_attr.netrc: - whl_library_args["netrc"] = pip_attr.netrc - if pip_attr.auth_patterns: - whl_library_args["auth_patterns"] = pip_attr.auth_patterns - - # 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) - - # This is no-op because pip is not used to download the wheel. - whl_library_args.pop("download_only", None) - else: - logger.warn("falling back to pip for installing the right file for {}".format(requirement.requirement_line)) + if get_index_urls: + # TODO @aignas 2024-05-26: move to a separate function + found_something = False + for requirement in requirements: + for distribution in requirement.whls + [requirement.sdist]: + if not distribution: + # sdist may be None + continue + + found_something = True + is_hub_reproducible = False + + if pip_attr.netrc: + whl_library_args["netrc"] = pip_attr.netrc + if pip_attr.auth_patterns: + whl_library_args["auth_patterns"] = pip_attr.auth_patterns + + # 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) + + # This is no-op because pip is not used to download the wheel. + whl_library_args.pop("download_only", None) + + repo_name = pip_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 + + # Pure python wheels or sdists may need to have a platform here + target_platforms = None + if distribution.filename.endswith("-any.whl") or not distribution.filename.endswith(".whl"): + if len(requirements) > 1: + target_platforms = requirement.target_platforms + + 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, + filename = distribution.filename, + target_platforms = target_platforms, + ), + ) + + if found_something: + continue + + requirement = select_requirement( + requirements, + platform = 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)) + + whl_library_args["requirement"] = requirement.requirement_line + if requirement.extra_pip_args: + whl_library_args["extra_pip_args"] = requirement.extra_pip_args # 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, - # Call Label() to canonicalize because its used in a different context - config_setting = Label("//python/config_settings:is_python_" + major_minor), ), ) diff --git a/python/private/bzlmod/pip_repository.bzl b/python/private/bzlmod/pip_repository.bzl index 3a09766f65..0f962031d6 100644 --- a/python/private/bzlmod/pip_repository.bzl +++ b/python/private/bzlmod/pip_repository.bzl @@ -14,7 +14,11 @@ "" -load("//python/private:render_pkg_aliases.bzl", "render_pkg_aliases", "whl_alias") +load( + "//python/private:render_pkg_aliases.bzl", + "render_multiplatform_pkg_aliases", + "whl_alias", +) load("//python/private:text_util.bzl", "render") _BUILD_FILE_CONTENTS = """\ @@ -26,12 +30,13 @@ exports_files(["requirements.bzl"]) def _pip_repository_impl(rctx): bzl_packages = rctx.attr.whl_map.keys() - aliases = render_pkg_aliases( + aliases = render_multiplatform_pkg_aliases( aliases = { key: [whl_alias(**v) for v in json.decode(values)] for key, values in rctx.attr.whl_map.items() }, default_version = rctx.attr.default_version, + default_config_setting = "//_config:is_python_" + rctx.attr.default_version, requirement_cycles = rctx.attr.groups, ) for path, contents in aliases.items(): diff --git a/python/private/config_settings.bzl b/python/private/config_settings.bzl index 75f88de4ac..92b96b3264 100644 --- a/python/private/config_settings.bzl +++ b/python/private/config_settings.bzl @@ -103,12 +103,16 @@ def is_python_config_setting(name, *, python_version, reuse_conditions = None, * fail("The 'python_version' must be known to 'rules_python', choose from the values: {}".format(VERSION_FLAG_VALUES.keys())) python_versions = VERSION_FLAG_VALUES[python_version] + extra_flag_values = kwargs.pop("flag_values", {}) + if _PYTHON_VERSION_FLAG in extra_flag_values: + fail("Cannot set '{}' in the flag values".format(_PYTHON_VERSION_FLAG)) + if len(python_versions) == 1: native.config_setting( name = name, flag_values = { _PYTHON_VERSION_FLAG: python_version, - }, + } | extra_flag_values, **kwargs ) return @@ -138,7 +142,7 @@ def is_python_config_setting(name, *, python_version, reuse_conditions = None, * for name_, flag_values_ in create_config_settings.items(): native.config_setting( name = name_, - flag_values = flag_values_, + flag_values = flag_values_ | extra_flag_values, **kwargs ) diff --git a/python/private/parse_requirements.bzl b/python/private/parse_requirements.bzl index c6a498539f..cb5024c841 100644 --- a/python/private/parse_requirements.bzl +++ b/python/private/parse_requirements.bzl @@ -451,6 +451,18 @@ def _add_dists(requirement, index_urls, python_version, logger = None): if logger: logger.warn("Could not find a whl or an sdist with sha256={}".format(sha256)) + yanked = {} + for dist in whls + [sdist]: + if dist and dist.yanked: + yanked.setdefault(dist.yanked, []).append(dist.filename) + if yanked: + logger.warn(lambda: "\n".join([ + "the following distributions got yanked:", + ] + [ + "reason: {}\n {}".format(reason, "\n".join(sorted(dists))) + for reason, dists in yanked.items() + ])) + # Filter out the wheels that are incompatible with the target_platforms. whls = select_whls( whls = whls, diff --git a/python/private/pip_config_settings.bzl b/python/private/pip_config_settings.bzl new file mode 100644 index 0000000000..2fe3c87a10 --- /dev/null +++ b/python/private/pip_config_settings.bzl @@ -0,0 +1,366 @@ +# 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 module is used to construct the config settings for selecting which distribution is used in the pip hub repository. + +Bazel's selects work by selecting the most-specialized configuration setting +that matches the target platform. We can leverage this fact to ensure that the +most specialized wheels are used by default with the users being able to +configure string_flag values to select the less specialized ones. + +The list of specialization of the dists goes like follows: +* sdist +* py*-none-any.whl +* py*-abi3-any.whl +* py*-cpxy-any.whl +* cp*-none-any.whl +* cp*-abi3-any.whl +* cp*-cpxy-plat.whl +* py*-none-plat.whl +* py*-abi3-plat.whl +* py*-cpxy-plat.whl +* cp*-none-plat.whl +* cp*-abi3-plat.whl +* cp*-cpxy-plat.whl + +Note, that here the specialization of musl vs manylinux wheels is the same in +order to ensure that the matching fails if the user requests for `musl` and we don't have it or vice versa. +""" + +load(":config_settings.bzl", "is_python_config_setting") +load( + ":pip_flags.bzl", + "INTERNAL_FLAGS", + "UniversalWhlFlag", + "UseWhlFlag", + "WhlLibcFlag", +) + +FLAGS = struct( + **{ + f: str(Label("//python/config_settings:" + f)) + for f in [ + "python_version", + "pip_whl", + "pip_whl_glibc_version", + "pip_whl_muslc_version", + "pip_whl_osx_arch", + "pip_whl_osx_version", + "py_linux_libc", + ] + } +) + +# Here we create extra string flags that are just to work with the select +# selecting the most specialized match. We don't allow the user to change +# them. +_flags = struct( + **{ + f: str(Label("//python/config_settings:_internal_pip_" + f)) + for f in INTERNAL_FLAGS + } +) + +def pip_config_settings( + *, + python_versions = [], + glibc_versions = [], + muslc_versions = [], + osx_versions = [], + target_platforms = [], + name = None, + visibility = None, + alias_rule = None, + config_setting_rule = None): + """Generate all of the pip config settings. + + Args: + name (str): Currently unused. + python_versions (list[str]): The list of python versions to configure + config settings for. + glibc_versions (list[str]): The list of glibc version of the wheels to + configure config settings for. + muslc_versions (list[str]): The list of musl version of the wheels to + configure config settings for. + osx_versions (list[str]): The list of OSX OS versions to configure + config settings for. + target_platforms (list[str]): The list of "{os}_{cpu}" for deriving + constraint values for each condition. + visibility (list[str], optional): The visibility to be passed to the + exposed labels. All other labels will be private. + alias_rule (rule): The alias rule to use for creating the + objects. Can be overridden for unit tests reasons. + config_setting_rule (rule): The config setting rule to use for creating the + objects. Can be overridden for unit tests reasons. + """ + + glibc_versions = [""] + glibc_versions + muslc_versions = [""] + muslc_versions + osx_versions = [""] + osx_versions + target_platforms = [("", "")] + [ + t.split("_", 1) + for t in target_platforms + ] + + alias_rule = alias_rule or native.alias + + for version in python_versions: + is_python = "is_python_{}".format(version) + alias_rule( + name = is_python, + actual = Label("//python/config_settings:" + is_python), + visibility = visibility, + ) + + for os, cpu in target_platforms: + constraint_values = [] + suffix = "" + if os: + constraint_values.append("@platforms//os:" + os) + suffix += "_" + os + if cpu: + constraint_values.append("@platforms//cpu:" + cpu) + suffix += "_" + cpu + + _sdist_config_setting( + name = "sdist" + suffix, + constraint_values = constraint_values, + visibility = visibility, + config_setting_rule = config_setting_rule, + ) + for python_version in python_versions: + _sdist_config_setting( + name = "cp{}_sdist{}".format(python_version, suffix), + python_version = python_version, + constraint_values = constraint_values, + visibility = visibility, + config_setting_rule = config_setting_rule, + ) + + for python_version in [""] + python_versions: + _whl_config_settings( + suffix = suffix, + plat_flag_values = _plat_flag_values( + os = os, + cpu = cpu, + osx_versions = osx_versions, + glibc_versions = glibc_versions, + muslc_versions = muslc_versions, + ), + constraint_values = constraint_values, + python_version = python_version, + visibility = visibility, + config_setting_rule = config_setting_rule, + ) + +def _whl_config_settings(*, suffix, plat_flag_values, **kwargs): + # With the following three we cover different per-version wheels + python_version = kwargs.get("python_version") + py = "cp{}_py".format(python_version) if python_version else "py" + pycp = "cp{}_cp3x".format(python_version) if python_version else "cp3x" + + flag_values = {} + + for n, f in { + "{}_none_any{}".format(py, suffix): None, + "{}3_none_any{}".format(py, suffix): _flags.whl_py3, + "{}3_abi3_any{}".format(py, suffix): _flags.whl_py3_abi3, + "{}_none_any{}".format(pycp, suffix): _flags.whl_pycp3x, + "{}_abi3_any{}".format(pycp, suffix): _flags.whl_pycp3x_abi3, + "{}_cp_any{}".format(pycp, suffix): _flags.whl_pycp3x_abicp, + }.items(): + if f and f in flag_values: + fail("BUG") + elif f: + flag_values[f] = "" + + _whl_config_setting( + name = n, + flag_values = flag_values, + **kwargs + ) + + generic_flag_values = flag_values + + for (suffix, flag_values) in plat_flag_values: + flag_values = flag_values | generic_flag_values + + for n, f in { + "{}_none_{}".format(py, suffix): _flags.whl_plat, + "{}3_none_{}".format(py, suffix): _flags.whl_plat_py3, + "{}3_abi3_{}".format(py, suffix): _flags.whl_plat_py3_abi3, + "{}_none_{}".format(pycp, suffix): _flags.whl_plat_pycp3x, + "{}_abi3_{}".format(pycp, suffix): _flags.whl_plat_pycp3x_abi3, + "{}_cp_{}".format(pycp, suffix): _flags.whl_plat_pycp3x_abicp, + }.items(): + if f and f in flag_values: + fail("BUG") + elif f: + flag_values[f] = "" + + _whl_config_setting( + name = n, + flag_values = flag_values, + **kwargs + ) + +def _to_version_string(version, sep = "."): + if not version: + return "" + + return "{}{}{}".format(version[0], sep, version[1]) + +def _plat_flag_values(os, cpu, osx_versions, glibc_versions, muslc_versions): + ret = [] + if os == "": + return [] + elif os == "windows": + ret.append(("{}_{}".format(os, cpu), {})) + elif os == "osx": + for cpu_, arch in { + cpu: UniversalWhlFlag.ARCH, + cpu + "_universal2": UniversalWhlFlag.UNIVERSAL, + }.items(): + for osx_version in osx_versions: + flags = { + FLAGS.pip_whl_osx_version: _to_version_string(osx_version), + } + if arch == UniversalWhlFlag.ARCH: + flags[FLAGS.pip_whl_osx_arch] = arch + + if not osx_version: + suffix = "{}_{}".format(os, cpu_) + else: + suffix = "{}_{}_{}".format(os, _to_version_string(osx_version, "_"), cpu_) + + ret.append((suffix, flags)) + + elif os == "linux": + for os_prefix, linux_libc in { + os: WhlLibcFlag.GLIBC, + "many" + os: WhlLibcFlag.GLIBC, + "musl" + os: WhlLibcFlag.MUSL, + }.items(): + if linux_libc == WhlLibcFlag.GLIBC: + libc_versions = glibc_versions + libc_flag = FLAGS.pip_whl_glibc_version + elif linux_libc == WhlLibcFlag.MUSL: + libc_versions = muslc_versions + libc_flag = FLAGS.pip_whl_muslc_version + else: + fail("Unsupported libc type: {}".format(linux_libc)) + + for libc_version in libc_versions: + if libc_version and os_prefix == os: + continue + elif libc_version: + suffix = "{}_{}_{}".format(os_prefix, _to_version_string(libc_version, "_"), cpu) + else: + suffix = "{}_{}".format(os_prefix, cpu) + + ret.append(( + suffix, + { + FLAGS.py_linux_libc: linux_libc, + libc_flag: _to_version_string(libc_version), + }, + )) + else: + fail("Unsupported os: {}".format(os)) + + return ret + +def _whl_config_setting(*, name, flag_values, visibility, config_setting_rule = None, **kwargs): + config_setting_rule = config_setting_rule or _config_setting_or + config_setting_rule( + name = "is_" + name, + flag_values = flag_values | { + FLAGS.pip_whl: UseWhlFlag.ONLY, + }, + default = flag_values | { + _flags.whl_py2_py3: "", + FLAGS.pip_whl: UseWhlFlag.AUTO, + }, + visibility = visibility, + **kwargs + ) + +def _sdist_config_setting(*, name, visibility, config_setting_rule = None, **kwargs): + config_setting_rule = config_setting_rule or _config_setting_or + config_setting_rule( + name = "is_" + name, + flag_values = {FLAGS.pip_whl: UseWhlFlag.NO}, + default = {FLAGS.pip_whl: UseWhlFlag.AUTO}, + visibility = visibility, + **kwargs + ) + +def _config_setting_or(*, name, flag_values, default, visibility, **kwargs): + match_name = "_{}".format(name) + default_name = "_{}_default".format(name) + + native.alias( + name = name, + actual = select({ + "//conditions:default": default_name, + match_name: match_name, + }), + visibility = visibility, + ) + + _config_setting( + name = match_name, + flag_values = flag_values, + visibility = visibility, + **kwargs + ) + _config_setting( + name = default_name, + flag_values = default, + visibility = visibility, + **kwargs + ) + +def _config_setting(python_version = "", **kwargs): + if python_version: + # NOTE @aignas 2024-05-26: with this we are getting about 24k internal + # config_setting targets in our unit tests. Whilst the number of the + # external dependencies does not dictate this number, it does mean that + # bazel will take longer to parse stuff. This would be especially + # noticeable in repos, which use multiple hub repos within a single + # workspace. + # + # A way to reduce the number of targets would be: + # * put them to a central location and teach this code to just alias them, + # maybe we should create a pip_config_settings repo within the pip + # extension, which would collect config settings for all hub_repos. + # * put them in rules_python - this has the drawback of exposing things like + # is_cp3.10_linux and users may start depending upon the naming + # convention and this API is very unstable. + is_python_config_setting( + python_version = python_version, + **kwargs + ) + else: + # We need this to ensure that there are no ambiguous matches when python_version + # is unset, which usually happens when we are not using the python version aware + # rules. + flag_values = kwargs.pop("flag_values", {}) | { + FLAGS.python_version: "", + } + native.config_setting( + flag_values = flag_values, + **kwargs + ) diff --git a/python/private/pip_flags.bzl b/python/private/pip_flags.bzl new file mode 100644 index 0000000000..c8154ff383 --- /dev/null +++ b/python/private/pip_flags.bzl @@ -0,0 +1,69 @@ +# 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. + +"""Values and helpers for pip_repository related flags. + +NOTE: The transitive loads of this should be kept minimal. This avoids loading +unnecessary files when all that are needed are flag definitions. +""" + +load(":enum.bzl", "enum") + +# Determines if we should use whls for third party +# +# buildifier: disable=name-conventions +UseWhlFlag = enum( + # Automatically decide the effective value based on environment, target + # platform and the presence of distributions for a particular package. + AUTO = "auto", + # Do not use `sdist` and fail if there are no available whls suitable for the target platform. + ONLY = "only", + # Do not use whl distributions and instead build the whls from `sdist`. + NO = "no", +) + +# Determines whether universal wheels should be preferred over arch platform specific ones. +# +# buildifier: disable=name-conventions +UniversalWhlFlag = enum( + # Prefer platform-specific wheels over universal wheels. + ARCH = "arch", + # Prefer universal wheels over platform-specific wheels. + 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 = [ + "whl_plat", + "whl_plat_py3", + "whl_plat_py3_abi3", + "whl_plat_pycp3x", + "whl_plat_pycp3x_abi3", + "whl_plat_pycp3x_abicp", + "whl_py2_py3", + "whl_py3", + "whl_py3_abi3", + "whl_pycp3x", + "whl_pycp3x_abi3", + "whl_pycp3x_abicp", +] diff --git a/python/private/pip_repo_name.bzl b/python/private/pip_repo_name.bzl new file mode 100644 index 0000000000..bef4304e15 --- /dev/null +++ b/python/private/pip_repo_name.bzl @@ -0,0 +1,52 @@ +# 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 function to convert a dist name to a valid bazel repo name. +""" + +load(":normalize_name.bzl", "normalize_name") +load(":parse_whl_name.bzl", "parse_whl_name") + +def pip_repo_name(prefix, filename, sha256): + """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. + + Returns: + a string that can be used in `whl_library`. + """ + parts = [prefix] + + if not filename.endswith(".whl"): + # Then the filename is basically foo-3.2.1. + parts.append(normalize_name(filename.rpartition("-")[0])) + parts.append("sdist") + else: + parsed = parse_whl_name(filename) + name = normalize_name(parsed.distribution) + python_tag, _, _ = parsed.python_tag.partition(".") + abi_tag, _, _ = parsed.abi_tag.partition(".") + platform_tag, _, _ = parsed.platform_tag.partition(".") + + parts.append(name) + parts.append(python_tag) + parts.append(abi_tag) + parts.append(platform_tag) + + parts.append(sha256[:8]) + + return "_".join(parts) diff --git a/python/private/py_toolchain_suite.bzl b/python/private/py_toolchain_suite.bzl index 9971a8a4c3..174c36f782 100644 --- a/python/private/py_toolchain_suite.bzl +++ b/python/private/py_toolchain_suite.bzl @@ -22,7 +22,7 @@ load( "TARGET_TOOLCHAIN_TYPE", ) -def py_toolchain_suite(*, prefix, user_repository_name, python_version, set_python_version_constraint, **kwargs): +def py_toolchain_suite(*, prefix, user_repository_name, python_version, set_python_version_constraint, flag_values, **kwargs): """For internal use only. Args: @@ -30,6 +30,7 @@ def py_toolchain_suite(*, prefix, user_repository_name, python_version, set_pyth user_repository_name: The name of the user repository. python_version: The full (X.Y.Z) version of the interpreter. set_python_version_constraint: True or False as a string. + flag_values: Extra flag values to match for this toolchain. **kwargs: extra args passed to the `toolchain` calls. """ @@ -38,23 +39,39 @@ def py_toolchain_suite(*, prefix, user_repository_name, python_version, set_pyth # string as we cannot have list of bools in build rule attribues. # This if statement does not appear to work unless it is in the # toolchain file. - if set_python_version_constraint == "True": + if set_python_version_constraint in ["True", "False"]: major_minor, _, _ = python_version.rpartition(".") + python_versions = [major_minor, python_version] + if set_python_version_constraint == "False": + python_versions.append("") + match_any = [] + for i, v in enumerate(python_versions): + name = "{prefix}_{python_version}_{i}".format( + prefix = prefix, + python_version = python_version, + i = i, + ) + match_any.append(name) + native.config_setting( + name = name, + flag_values = flag_values | { + Label("@rules_python//python/config_settings:python_version"): v, + }, + visibility = ["//visibility:private"], + ) + + name = "{prefix}_version_setting_{python_version}".format( + prefix = prefix, + python_version = python_version, + visibility = ["//visibility:private"], + ) selects.config_setting_group( - name = prefix + "_version_setting", - match_any = [ - Label("//python/config_settings:is_python_%s" % v) - for v in [ - major_minor, - python_version, - ] - ], + name = name, + match_any = match_any, visibility = ["//visibility:private"], ) - target_settings = [prefix + "_version_setting"] - elif set_python_version_constraint == "False": - target_settings = [] + target_settings = [name] else: fail(("Invalid set_python_version_constraint value: got {} {}, wanted " + "either the string 'True' or the string 'False'; " + diff --git a/python/private/render_pkg_aliases.bzl b/python/private/render_pkg_aliases.bzl index bc1bab2049..a37c32882e 100644 --- a/python/private/render_pkg_aliases.bzl +++ b/python/private/render_pkg_aliases.bzl @@ -30,7 +30,9 @@ load( "WHEEL_FILE_PUBLIC_LABEL", ) load(":normalize_name.bzl", "normalize_name") +load(":parse_whl_name.bzl", "parse_whl_name") load(":text_util.bzl", "render") +load(":whl_target_platforms.bzl", "whl_target_platforms") NO_MATCH_ERROR_MESSAGE_TEMPLATE = """\ No matching wheel for current configuration's Python version. @@ -51,10 +53,27 @@ 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. """ +NO_MATCH_ERROR_MESSAGE_TEMPLATE_V2 = """\ +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_settings} + +To determine the current configuration's Python version, run: + `bazel config ` (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, - default_version, + default_config_setting, aliases, target_name, **kwargs): @@ -78,7 +97,7 @@ def _render_whl_library_alias( 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) - if alias.version == default_version: + if alias.config_setting == default_config_setting: selects[actual].append("//conditions:default") no_match_error = None @@ -102,21 +121,23 @@ def _render_whl_library_alias( **kwargs ) -def _render_common_aliases(*, name, aliases, default_version = None, group_name = None): +def _render_common_aliases(*, name, aliases, default_config_setting = None, group_name = None): lines = [ """load("@bazel_skylib//lib:selects.bzl", "selects")""", """package(default_visibility = ["//visibility:public"])""", ] - versions = None + config_settings = None if aliases: - versions = sorted([v.version for v in aliases if v.version]) + config_settings = sorted([v.config_setting for v in aliases if v.config_setting]) - if not versions or default_version in versions: + if not config_settings or default_config_setting in config_settings: pass else: - error_msg = NO_MATCH_ERROR_MESSAGE_TEMPLATE.format( - supported_versions = ", ".join(versions), + error_msg = NO_MATCH_ERROR_MESSAGE_TEMPLATE_V2.format( + config_settings = render.indent( + "\n".join(config_settings), + ).lstrip(), rules_python = "rules_python", ) @@ -126,7 +147,7 @@ def _render_common_aliases(*, name, aliases, default_version = None, group_name # This is to simplify the code in _render_whl_library_alias and to ensure # that we don't pass a 'default_version' that is not in 'versions'. - default_version = None + default_config_setting = None lines.append( render.alias( @@ -138,7 +159,7 @@ def _render_common_aliases(*, name, aliases, default_version = None, group_name [ _render_whl_library_alias( name = name, - default_version = default_version, + default_config_setting = default_config_setting, aliases = aliases, target_name = target_name, visibility = ["//_groups:__subpackages__"] if name.startswith("_") else None, @@ -167,7 +188,7 @@ def _render_common_aliases(*, name, aliases, default_version = None, group_name return "\n\n".join(lines) -def render_pkg_aliases(*, aliases, default_version = None, requirement_cycles = None): +def render_pkg_aliases(*, aliases, default_config_setting = None, requirement_cycles = None): """Create alias declarations for each PyPI package. The aliases should be appended to the pip_repository BUILD.bazel file. These aliases @@ -177,7 +198,7 @@ def render_pkg_aliases(*, aliases, default_version = None, requirement_cycles = Args: aliases: dict, the keys are normalized distribution names and values are the whl_alias instances. - default_version: the default version to be used for the aliases. + default_config_setting: the default to be used for the aliases. requirement_cycles: any package groups to also add. Returns: @@ -206,16 +227,17 @@ def render_pkg_aliases(*, aliases, default_version = None, requirement_cycles = "{}/BUILD.bazel".format(normalize_name(name)): _render_common_aliases( name = normalize_name(name), aliases = pkg_aliases, - default_version = default_version, + default_config_setting = default_config_setting, group_name = whl_group_mapping.get(normalize_name(name)), ).strip() for name, pkg_aliases in aliases.items() } + if requirement_cycles: files["_groups/BUILD.bazel"] = generate_group_library_build_bazel("", requirement_cycles) return files -def whl_alias(*, repo, version = None, config_setting = None, extra_targets = None): +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 @@ -228,9 +250,10 @@ def whl_alias(*, repo, version = None, config_setting = None, extra_targets = No 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 "@rules_python//python/config_settings:is_python_{version}". - extra_targets: optional(list[str]), the extra targets that we need to create - aliases for. + 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. @@ -239,12 +262,361 @@ def whl_alias(*, repo, version = None, config_setting = None, extra_targets = No fail("'repo' must be specified") if version: - config_setting = config_setting or Label("//python/config_settings:is_python_" + version) + config_setting = config_setting or ("//_config:is_python_" + version) config_setting = str(config_setting) return struct( repo = repo, version = version, config_setting = config_setting, - extra_targets = extra_targets or [], + filename = filename, + target_platforms = target_platforms, + ) + +def render_multiplatform_pkg_aliases(*, aliases, default_version = None, **kwargs): + """Render the multi-platform pkg aliases. + + Args: + aliases: dict[str, list(whl_alias)] A list of aliases that will be + transformed from ones having `filename` to ones having `config_setting`. + default_version: str, the default python version. Defaults to None. + **kwargs: extra arguments passed to render_pkg_aliases. + + Returns: + A dict of file paths and their contents. + """ + + flag_versions = get_whl_flag_versions( + aliases = [ + a + for bunch in aliases.values() + for a in bunch + ], + ) + + config_setting_aliases = { + pkg: multiplatform_whl_aliases( + aliases = pkg_aliases, + default_version = default_version, + 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, + **kwargs ) + contents["_config/BUILD.bazel"] = _render_pip_config_settings(**flag_versions) + return contents + +def multiplatform_whl_aliases(*, aliases, default_version = None, **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. + default_version: string | None, the default python version to use. + **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, + python_default = default_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_pip_config_settings(python_versions = [], target_platforms = [], osx_versions = [], glibc_versions = [], muslc_versions = []): + return """\ +load("@rules_python//python/private:pip_config_settings.bzl", "pip_config_settings") + +pip_config_settings( + name = "pip_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(), + ) + +def get_whl_flag_versions(aliases): + """Return all of the flag versions that is used by the aliases + + Args: + aliases: list[whl_alias] + + Returns: + dict, which may have keys: + * python_versions + """ + python_versions = {} + glibc_versions = {} + target_platforms = {} + muslc_versions = {} + osx_versions = {} + + for a in aliases: + if not a.version and not a.filename: + continue + + if a.version: + python_versions[a.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) + else: + for plat in a.target_platforms or []: + target_platforms[plat] = None + continue + + for platform_tag in parsed.platform_tag.split("."): + parsed = whl_target_platforms(platform_tag) + + for p in parsed: + target_platforms[p.target_platform] = None + + if platform_tag.startswith("win") or platform_tag.startswith("linux"): + continue + + head, _, tail = platform_tag.partition("_") + major, _, tail = tail.partition("_") + minor, _, tail = tail.partition("_") + if tail: + version = (int(major), int(minor)) + if "many" in head: + glibc_versions[version] = None + elif "musl" in head: + muslc_versions[version] = None + elif "mac" in head: + osx_versions[version] = None + else: + fail(platform_tag) + + return { + k: sorted(v) + for k, v in { + "glibc_versions": glibc_versions, + "muslc_versions": muslc_versions, + "osx_versions": osx_versions, + "python_versions": python_versions, + "target_platforms": target_platforms, + }.items() + if v + } + +def get_filename_config_settings( + *, + filename, + target_platforms, + glibc_versions, + muslc_versions, + osx_versions, + python_version = "", + python_default = True): + """Get the filename config settings. + + Args: + filename: the distribution filename (can be a whl or an sdist). + target_platforms: list[str], target platforms in "{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. + python_default: if we should include the setting when python_version is not set. + + 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 = target_platforms + else: + prefixes = ["{}_{}".format(py, abi)] + suffixes = _whl_config_setting_sufixes( + 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 = target_platforms + + if python_default and python_version: + prefixes += ["cp{}_{}".format(python_version, p) for p in prefixes] + elif python_version: + prefixes = ["cp{}_{}".format(python_version, p) for p in prefixes] + elif python_default: + pass + else: + fail("BUG: got no python_version and it is not default") + + versioned = { + ":is_{}_{}".format(p, suffix): { + version: ":is_{}_{}".format(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_{}_{}".format(p, s) for p in prefixes for s in suffixes], versioned + else: + return [":is_{}".format(p) for p in prefixes], setting_supported_versions + +def _whl_config_setting_sufixes( + 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/toolchains_repo.bzl b/python/private/toolchains_repo.bzl index 018c4433ed..dd59e477d8 100644 --- a/python/private/toolchains_repo.bzl +++ b/python/private/toolchains_repo.bzl @@ -31,6 +31,7 @@ load( "WINDOWS_NAME", ) load("//python/private:repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") +load("//python/private:text_util.bzl", "render") def get_repository_name(repository_workspace): dummy_label = "//:_" @@ -64,10 +65,15 @@ py_toolchain_suite( user_repository_name = "{user_repository_name}_{platform}", prefix = "{prefix}{platform}", target_compatible_with = {compatible_with}, + flag_values = {flag_values}, python_version = "{python_version}", set_python_version_constraint = "{set_python_version_constraint}", )""".format( - compatible_with = meta.compatible_with, + compatible_with = render.indent(render.list(meta.compatible_with)).lstrip(), + flag_values = render.indent(render.dict( + meta.flag_values, + key_repr = lambda x: repr(str(x)), # this is to correctly display labels + )).lstrip(), platform = platform, set_python_version_constraint = set_python_version_constraint, user_repository_name = user_repository_name, diff --git a/python/private/whl_target_platforms.bzl b/python/private/whl_target_platforms.bzl index 678c841feb..08177ca1b3 100644 --- a/python/private/whl_target_platforms.bzl +++ b/python/private/whl_target_platforms.bzl @@ -265,6 +265,16 @@ def whl_target_platforms(platform_tag, abi_tag = ""): if abi_tag not in ["", "none", "abi3"]: abi = abi_tag + # TODO @aignas 2024-05-29: this code is present in many places, I think + _, _, tail = platform_tag.partition("_") + maybe_arch = tail + major, _, tail = tail.partition("_") + minor, _, tail = tail.partition("_") + if not tail or not major.isdigit() or not minor.isdigit(): + tail = maybe_arch + major = 0 + minor = 0 + for prefix, os in _OS_PREFIXES.items(): if platform_tag.startswith(prefix): return [ @@ -272,6 +282,7 @@ def whl_target_platforms(platform_tag, abi_tag = ""): os = os, cpu = cpu, abi = abi, + version = (int(major), int(minor)), target_platform = "_".join([abi, os, cpu] if abi else [os, cpu]), ) for cpu in cpus diff --git a/python/versions.bzl b/python/versions.bzl index 08882d3ade..26b975d068 100644 --- a/python/versions.bzl +++ b/python/versions.bzl @@ -501,6 +501,7 @@ PLATFORMS = { "@platforms//os:macos", "@platforms//cpu:aarch64", ], + flag_values = {}, os_name = MACOS_NAME, # Matches the value returned from: # repository_ctx.execute(["uname", "-m"]).stdout.strip() @@ -511,6 +512,9 @@ PLATFORMS = { "@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: @@ -522,6 +526,9 @@ PLATFORMS = { "@platforms//os:linux", "@platforms//cpu:armv7", ], + flag_values = { + Label("//python/config_settings:py_linux_libc"): "glibc", + }, os_name = LINUX_NAME, arch = "armv7", ), @@ -530,6 +537,9 @@ PLATFORMS = { "@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: @@ -541,6 +551,9 @@ PLATFORMS = { "@platforms//os:linux", "@platforms//cpu:riscv64", ], + flag_values = { + Label("//python/config_settings:py_linux_libc"): "glibc", + }, os_name = LINUX_NAME, arch = "riscv64", ), @@ -549,6 +562,9 @@ PLATFORMS = { "@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: @@ -560,6 +576,7 @@ PLATFORMS = { "@platforms//os:macos", "@platforms//cpu:x86_64", ], + flag_values = {}, os_name = MACOS_NAME, arch = "x86_64", ), @@ -568,6 +585,7 @@ PLATFORMS = { "@platforms//os:windows", "@platforms//cpu:x86_64", ], + flag_values = {}, os_name = WINDOWS_NAME, arch = "x86_64", ), @@ -576,6 +594,9 @@ PLATFORMS = { "@platforms//os:linux", "@platforms//cpu:x86_64", ], + flag_values = { + Label("//python/config_settings:py_linux_libc"): "glibc", + }, os_name = LINUX_NAME, arch = "x86_64", ), diff --git a/tests/config_settings/transition/multi_version_tests.bzl b/tests/config_settings/transition/multi_version_tests.bzl index 32f7209c9f..f3707dba20 100644 --- a/tests/config_settings/transition/multi_version_tests.bzl +++ b/tests/config_settings/transition/multi_version_tests.bzl @@ -16,9 +16,16 @@ load("@rules_testing//lib:analysis_test.bzl", "analysis_test") load("@rules_testing//lib:test_suite.bzl", "test_suite") load("@rules_testing//lib:util.bzl", rt_util = "util") -load("//python:versions.bzl", "TOOL_VERSIONS") load("//python/config_settings:transition.bzl", py_binary_transitioned = "py_binary", py_test_transitioned = "py_test") +# NOTE @aignas 2024-06-04: we are using here something that is registered in the MODULE.Bazel +# and if you find tests failing, it could be because of the toolchain resolution issues here. +# +# If the toolchain is not resolved then you will have a weird message telling +# you that your transition target does not have a PyRuntime provider, which is +# caused by there not being a toolchain detected for the target. +_PYTHON_VERSION = "3.11" + _tests = [] def _test_py_test_with_transition(name): @@ -26,7 +33,7 @@ def _test_py_test_with_transition(name): py_test_transitioned, name = name + "_subject", srcs = [name + "_subject.py"], - python_version = TOOL_VERSIONS.keys()[0], + python_version = _PYTHON_VERSION, ) analysis_test( @@ -46,7 +53,7 @@ def _test_py_binary_with_transition(name): py_binary_transitioned, name = name + "_subject", srcs = [name + "_subject.py"], - python_version = TOOL_VERSIONS.keys()[0], + python_version = _PYTHON_VERSION, ) analysis_test( diff --git a/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl b/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl index a38d657962..a0689f70b9 100644 --- a/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl +++ b/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl @@ -16,7 +16,19 @@ load("@rules_testing//lib:test_suite.bzl", "test_suite") load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility -load("//python/private:render_pkg_aliases.bzl", "render_pkg_aliases", "whl_alias") # buildifier: disable=bzl-visibility +load( + "//python/private:pip_config_settings.bzl", + "pip_config_settings", +) # buildifier: disable=bzl-visibility +load( + "//python/private: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. @@ -99,8 +111,9 @@ alias( _tests.append(_test_legacy_aliases) def _test_bzlmod_aliases(env): - actual = render_pkg_aliases( - default_version = "3.2", + # Use this function as it is used in pip_repository + actual = render_multiplatform_pkg_aliases( + default_config_setting = "//:my_config_setting", aliases = { "bar-baz": [ whl_alias(version = "3.2", repo = "pypi_32_bar_baz", config_setting = "//:my_config_setting"), @@ -167,14 +180,28 @@ alias( ), )""" + env.expect.that_str(actual.pop("_config/BUILD.bazel")).equals( + """\ +load("@rules_python//python/private:pip_config_settings.bzl", "pip_config_settings") + +pip_config_settings( + name = "pip_config_settings", + glibc_versions = [], + muslc_versions = [], + osx_versions = [], + python_versions = ["3.2"], + target_platforms = [], + visibility = ["//:__subpackages__"], +)""", + ) env.expect.that_collection(actual.keys()).contains_exactly([want_key]) env.expect.that_str(actual[want_key]).equals(want_content) _tests.append(_test_bzlmod_aliases) def _test_bzlmod_aliases_with_no_default_version(env): - actual = render_pkg_aliases( - default_version = None, + actual = render_multiplatform_pkg_aliases( + default_config_setting = None, aliases = { "bar-baz": [ whl_alias( @@ -198,11 +225,10 @@ _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 -versions available for this wheel. This wheel supports the following Python versions: - 3.1, 3.2 - -As matched by the `@rules_python//python/config_settings:is_python_` -configuration settings. +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 ` (shown further below) @@ -222,7 +248,7 @@ alias( name = "pkg", actual = selects.with_or( { - "@@//python/config_settings:is_python_3.1": "@pypi_31_bar_baz//:pkg", + "//_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, @@ -233,7 +259,7 @@ alias( name = "whl", actual = selects.with_or( { - "@@//python/config_settings:is_python_3.1": "@pypi_31_bar_baz//:whl", + "//_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, @@ -244,7 +270,7 @@ alias( name = "data", actual = selects.with_or( { - "@@//python/config_settings:is_python_3.1": "@pypi_31_bar_baz//:data", + "//_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, @@ -255,13 +281,14 @@ alias( name = "dist_info", actual = selects.with_or( { - "@@//python/config_settings:is_python_3.1": "@pypi_31_bar_baz//:dist_info", + "//_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)) @@ -274,9 +301,10 @@ def _test_bzlmod_aliases_for_non_root_modules(env): # as _test_bzlmod_aliases. # # However, if the root module uses a different default version than the - # non-root module, then we will have a no-match-error because the default_version - # is not in the list of the versions in the whl_map. - default_version = "3.3", + # non-root module, then we will have a no-match-error because the + # default_config_setting is not in the list of the versions in the + # whl_map. + default_config_setting = "//_config:is_python_3.3", aliases = { "bar-baz": [ whl_alias(version = "3.2", repo = "pypi_32_bar_baz"), @@ -295,11 +323,10 @@ _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 -versions available for this wheel. This wheel supports the following Python versions: - 3.1, 3.2 - -As matched by the `@rules_python//python/config_settings:is_python_` -configuration settings. +wheels available for this wheel. This wheel supports the following Python +configuration settings: + //_config:is_python_3.1 + //_config:is_python_3.2 To determine the current configuration's Python version, run: `bazel config ` (shown further below) @@ -319,8 +346,8 @@ alias( name = "pkg", actual = selects.with_or( { - "@@//python/config_settings:is_python_3.1": "@pypi_31_bar_baz//:pkg", - "@@//python/config_settings:is_python_3.2": "@pypi_32_bar_baz//:pkg", + "//_config:is_python_3.1": "@pypi_31_bar_baz//:pkg", + "//_config:is_python_3.2": "@pypi_32_bar_baz//:pkg", }, no_match_error = _NO_MATCH_ERROR, ), @@ -330,8 +357,8 @@ alias( name = "whl", actual = selects.with_or( { - "@@//python/config_settings:is_python_3.1": "@pypi_31_bar_baz//:whl", - "@@//python/config_settings:is_python_3.2": "@pypi_32_bar_baz//:whl", + "//_config:is_python_3.1": "@pypi_31_bar_baz//:whl", + "//_config:is_python_3.2": "@pypi_32_bar_baz//:whl", }, no_match_error = _NO_MATCH_ERROR, ), @@ -341,8 +368,8 @@ alias( name = "data", actual = selects.with_or( { - "@@//python/config_settings:is_python_3.1": "@pypi_31_bar_baz//:data", - "@@//python/config_settings:is_python_3.2": "@pypi_32_bar_baz//:data", + "//_config:is_python_3.1": "@pypi_31_bar_baz//:data", + "//_config:is_python_3.2": "@pypi_32_bar_baz//:data", }, no_match_error = _NO_MATCH_ERROR, ), @@ -352,21 +379,21 @@ alias( name = "dist_info", actual = selects.with_or( { - "@@//python/config_settings:is_python_3.1": "@pypi_31_bar_baz//:dist_info", - "@@//python/config_settings:is_python_3.2": "@pypi_32_bar_baz//:dist_info", + "//_config:is_python_3.1": "@pypi_31_bar_baz//:dist_info", + "//_config:is_python_3.2": "@pypi_32_bar_baz//:dist_info", }, no_match_error = _NO_MATCH_ERROR, ), )""" env.expect.that_collection(actual.keys()).contains_exactly([want_key]) - env.expect.that_str(actual[want_key]).equals(_normalize_label_strings(want_content)) + env.expect.that_str(actual[want_key]).equals(want_content) _tests.append(_test_bzlmod_aliases_for_non_root_modules) def _test_aliases_are_created_for_all_wheels(env): actual = render_pkg_aliases( - default_version = "3.2", + default_config_setting = "//_config:is_python_3.2", aliases = { "bar": [ whl_alias(version = "3.1", repo = "pypi_31_bar"), @@ -390,7 +417,7 @@ _tests.append(_test_aliases_are_created_for_all_wheels) def _test_aliases_with_groups(env): actual = render_pkg_aliases( - default_version = "3.2", + default_config_setting = "//_config:is_python_3.2", aliases = { "bar": [ whl_alias(version = "3.1", repo = "pypi_31_bar"), @@ -432,6 +459,491 @@ def _test_aliases_with_groups(env): _tests.append(_test_aliases_with_groups) +def _test_empty_flag_versions(env): + got = get_whl_flag_versions( + aliases = [], + ) + want = {} + env.expect.that_dict(got).contains_exactly(want) + +_tests.append(_test_empty_flag_versions) + +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"), + ], + ) + want = { + "python_versions": ["3.2", "3.3"], + } + env.expect.that_dict(got).contains_exactly(want) + +_tests.append(_test_get_python_versions) + +def _test_get_python_versions_from_filenames(env): + got = get_whl_flag_versions( + aliases = [ + whl_alias( + repo = "foo", + version = "3.3", + filename = "foo-0.0.0-py3-none-" + plat + ".whl", + ) + for plat in [ + "linux_x86_64", + "manylinux_2_17_x86_64", + "manylinux_2_14_aarch64.musllinux_1_1_aarch64", + "musllinux_1_0_x86_64", + "manylinux2014_x86_64.manylinux_2_17_x86_64", + "macosx_11_0_arm64", + "macosx_10_9_x86_64", + "macosx_10_9_universal2", + "windows_x86_64", + ] + ], + ) + want = { + "glibc_versions": [(2, 14), (2, 17)], + "muslc_versions": [(1, 0), (1, 1)], + "osx_versions": [(10, 9), (11, 0)], + "python_versions": ["3.3"], + "target_platforms": [ + "linux_aarch64", + "linux_x86_64", + "osx_aarch64", + "osx_x86_64", + "windows_x86_64", + ], + } + env.expect.that_dict(got).contains_exactly(want) + +_tests.append(_test_get_python_versions_from_filenames) + +def _test_target_platforms_from_alias_target_platforms(env): + got = get_whl_flag_versions( + aliases = [ + whl_alias( + repo = "foo", + version = "3.3", + filename = "foo-0.0.0-py3-none-" + plat + ".whl", + ) + for plat in [ + "windows_x86_64", + ] + ] + [ + whl_alias( + repo = "foo", + version = "3.3", + filename = "foo-0.0.0-py3-none-any.whl", + target_platforms = [ + "linux_x86_64", + ], + ), + ], + ) + want = { + "python_versions": ["3.3"], + "target_platforms": [ + "linux_x86_64", + "windows_x86_64", + ], + } + env.expect.that_dict(got).contains_exactly(want) + +_tests.append(_test_target_platforms_from_alias_target_platforms) + +def _test_config_settings( + env, + *, + filename, + want, + want_versions = {}, + target_platforms = [], + glibc_versions = [], + muslc_versions = [], + osx_versions = [], + python_version = "", + python_default = True): + got, got_default_version_settings = get_filename_config_settings( + filename = filename, + target_platforms = target_platforms, + glibc_versions = glibc_versions, + muslc_versions = muslc_versions, + osx_versions = osx_versions, + python_version = python_version, + python_default = python_default, + ) + env.expect.that_collection(got).contains_exactly(want) + env.expect.that_dict(got_default_version_settings).contains_exactly(want_versions) + +def _test_sdist(env): + # Do the first test for multiple extensions + for ext in [".tar.gz", ".zip"]: + _test_config_settings( + env, + filename = "foo-0.0.1" + ext, + want = [":is_sdist"], + ) + + ext = ".zip" + _test_config_settings( + env, + filename = "foo-0.0.1" + ext, + target_platforms = [ + "linux_aarch64", + ], + want = [":is_sdist_linux_aarch64"], + ) + + _test_config_settings( + env, + filename = "foo-0.0.1" + ext, + python_version = "3.2", + want = [ + ":is_sdist", + ":is_cp3.2_sdist", + ], + ) + + _test_config_settings( + env, + filename = "foo-0.0.1" + ext, + python_version = "3.2", + python_default = True, + target_platforms = [ + "linux_aarch64", + "linux_x86_64", + ], + want = [ + ":is_sdist_linux_aarch64", + ":is_cp3.2_sdist_linux_aarch64", + ":is_sdist_linux_x86_64", + ":is_cp3.2_sdist_linux_x86_64", + ], + ) + +_tests.append(_test_sdist) + +def _test_py2_py3_none_any(env): + _test_config_settings( + env, + filename = "foo-0.0.1-py2.py3-none-any.whl", + want = [":is_py_none_any"], + ) + + _test_config_settings( + env, + filename = "foo-0.0.1-py2.py3-none-any.whl", + target_platforms = [ + "linux_aarch64", + ], + want = [":is_py_none_any_linux_aarch64"], + ) + + _test_config_settings( + env, + filename = "foo-0.0.1-py2.py3-none-any.whl", + python_version = "3.2", + python_default = True, + want = [ + ":is_py_none_any", + ":is_cp3.2_py_none_any", + ], + ) + + _test_config_settings( + env, + filename = "foo-0.0.1-py2.py3-none-any.whl", + python_version = "3.2", + python_default = False, + target_platforms = [ + "osx_x86_64", + ], + want = [ + ":is_cp3.2_py_none_any_osx_x86_64", + ], + ) + +_tests.append(_test_py2_py3_none_any) + +def _test_py3_none_any(env): + _test_config_settings( + env, + filename = "foo-0.0.1-py3-none-any.whl", + want = [":is_py3_none_any"], + ) + + _test_config_settings( + env, + filename = "foo-0.0.1-py3-none-any.whl", + target_platforms = ["linux_x86_64"], + want = [":is_py3_none_any_linux_x86_64"], + ) + +_tests.append(_test_py3_none_any) + +def _test_py3_none_macosx_10_9_universal2(env): + _test_config_settings( + env, + filename = "foo-0.0.1-py3-none-macosx_10_9_universal2.whl", + osx_versions = [ + (10, 9), + (11, 0), + ], + want = [], + want_versions = { + ":is_py3_none_osx_aarch64_universal2": { + (10, 9): ":is_py3_none_osx_10_9_aarch64_universal2", + (11, 0): ":is_py3_none_osx_11_0_aarch64_universal2", + }, + ":is_py3_none_osx_x86_64_universal2": { + (10, 9): ":is_py3_none_osx_10_9_x86_64_universal2", + (11, 0): ":is_py3_none_osx_11_0_x86_64_universal2", + }, + }, + ) + +_tests.append(_test_py3_none_macosx_10_9_universal2) + +def _test_cp37_abi3_linux_x86_64(env): + _test_config_settings( + env, + filename = "foo-0.0.1-cp37-abi3-linux_x86_64.whl", + want = [ + ":is_cp3x_abi3_linux_x86_64", + ], + ) + + _test_config_settings( + env, + filename = "foo-0.0.1-cp37-abi3-linux_x86_64.whl", + python_version = "3.2", + python_default = True, + want = [ + ":is_cp3x_abi3_linux_x86_64", + # TODO @aignas 2024-05-29: update the pip_config_settings to generate this + ":is_cp3.2_cp3x_abi3_linux_x86_64", + ], + ) + +_tests.append(_test_cp37_abi3_linux_x86_64) + +def _test_cp37_abi3_windows_x86_64(env): + _test_config_settings( + env, + filename = "foo-0.0.1-cp37-abi3-windows_x86_64.whl", + want = [ + ":is_cp3x_abi3_windows_x86_64", + ], + ) + +_tests.append(_test_cp37_abi3_windows_x86_64) + +def _test_cp37_abi3_manylinux_2_17_x86_64(env): + _test_config_settings( + env, + filename = "foo-0.0.1-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", + glibc_versions = [ + (2, 16), + (2, 17), + (2, 18), + ], + want = [], + want_versions = { + ":is_cp3x_abi3_manylinux_x86_64": { + (2, 17): ":is_cp3x_abi3_manylinux_2_17_x86_64", + (2, 18): ":is_cp3x_abi3_manylinux_2_18_x86_64", + }, + }, + ) + +_tests.append(_test_cp37_abi3_manylinux_2_17_x86_64) + +def _test_cp37_abi3_manylinux_2_17_musllinux_1_1_aarch64(env): + # I've seen such a wheel being built for `uv` + _test_config_settings( + env, + filename = "foo-0.0.1-cp37-cp37-manylinux_2_17_arm64.musllinux_1_1_arm64.whl", + glibc_versions = [ + (2, 16), + (2, 17), + (2, 18), + ], + muslc_versions = [ + (1, 1), + ], + want = [], + want_versions = { + ":is_cp3x_cp_manylinux_aarch64": { + (2, 17): ":is_cp3x_cp_manylinux_2_17_aarch64", + (2, 18): ":is_cp3x_cp_manylinux_2_18_aarch64", + }, + ":is_cp3x_cp_musllinux_aarch64": { + (1, 1): ":is_cp3x_cp_musllinux_1_1_aarch64", + }, + }, + ) + +_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 = [], default_version = None) + 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, default_version = None) + 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 = [ + "linux_x86_64", + "linux_aarch64", + ], + ), + ] + got = multiplatform_whl_aliases( + aliases = aliases, + default_version = "3.1", + 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"), + whl_alias(config_setting = "//_config:is_py3_none_any", repo = "foo-py3-0.0.1", version = "3.1"), + whl_alias(config_setting = "//_config:is_py3_none_any_linux_aarch64", repo = "foo-0.0.2", version = "3.1"), + whl_alias(config_setting = "//_config:is_py3_none_any_linux_x86_64", repo = "foo-0.0.2", version = "3.1"), + ] + 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, + default_version = None, + 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) + pip_config_settings( + python_versions = ["3.11"], + alias_rule = mock_rule, + config_setting_rule = mock_rule, + **kwargs + ) + + got_aliases = multiplatform_whl_aliases( + aliases = aliases, + default_version = None, + 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/private/pip_config_settings/BUILD.bazel b/tests/private/pip_config_settings/BUILD.bazel new file mode 100644 index 0000000000..c3752e0ac3 --- /dev/null +++ b/tests/private/pip_config_settings/BUILD.bazel @@ -0,0 +1,5 @@ +load(":pip_config_settings_tests.bzl", "pip_config_settings_test_suite") + +pip_config_settings_test_suite( + name = "pip_config_settings", +) diff --git a/tests/private/pip_config_settings/pip_config_settings_tests.bzl b/tests/private/pip_config_settings/pip_config_settings_tests.bzl new file mode 100644 index 0000000000..a66e7f47d5 --- /dev/null +++ b/tests/private/pip_config_settings/pip_config_settings_tests.bzl @@ -0,0 +1,544 @@ +# 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. +"""Tests for construction of Python version matching config settings.""" + +load("@rules_testing//lib:analysis_test.bzl", "analysis_test") +load("@rules_testing//lib:test_suite.bzl", "test_suite") +load("@rules_testing//lib:truth.bzl", "subjects") +load("@rules_testing//lib:util.bzl", test_util = "util") +load("//python/private:pip_config_settings.bzl", "pip_config_settings") # buildifier: disable=bzl-visibility + +def _subject_impl(ctx): + _ = ctx # @unused + return [DefaultInfo()] + +_subject = rule( + implementation = _subject_impl, + attrs = { + "dist": attr.string(), + }, +) + +_flag = struct( + platform = lambda x: ("//command_line_option:platforms", str(Label("//tests/support:" + x))), + pip_whl = lambda x: (str(Label("//python/config_settings:pip_whl")), str(x)), + pip_whl_glibc_version = lambda x: (str(Label("//python/config_settings:pip_whl_glibc_version")), str(x)), + pip_whl_muslc_version = lambda x: (str(Label("//python/config_settings:pip_whl_muslc_version")), str(x)), + pip_whl_osx_version = lambda x: (str(Label("//python/config_settings:pip_whl_osx_version")), str(x)), + pip_whl_osx_arch = lambda x: (str(Label("//python/config_settings:pip_whl_osx_arch")), str(x)), + py_linux_libc = lambda x: (str(Label("//python/config_settings:py_linux_libc")), str(x)), + python_version = lambda x: (str(Label("//python/config_settings:python_version")), str(x)), +) + +def _analysis_test(*, name, dist, want, config_settings = [_flag.platform("linux_aarch64")]): + subject_name = name + "_subject" + test_util.helper_target( + _subject, + name = subject_name, + dist = select( + dist | { + "//conditions:default": "no_match", + }, + ), + ) + config_settings = dict(config_settings) + if not config_settings: + fail("For reproducibility on different platforms, the config setting must be specified") + + analysis_test( + name = name, + target = subject_name, + impl = lambda env, target: _match(env, target, want), + config_settings = config_settings, + ) + +def _match(env, target, want): + target = env.expect.that_target(target) + target.attr("dist", factory = subjects.str).equals(want) + +_tests = [] + +# Tests when we only have an `sdist` present. + +def _test_sdist_default(name): + _analysis_test( + name = name, + dist = { + "is_sdist": "sdist", + }, + want = "sdist", + ) + +_tests.append(_test_sdist_default) + +def _test_sdist_no_whl(name): + _analysis_test( + name = name, + dist = { + "is_sdist": "sdist", + }, + config_settings = [ + _flag.platform("linux_aarch64"), + _flag.pip_whl("no"), + ], + want = "sdist", + ) + +_tests.append(_test_sdist_no_whl) + +def _test_sdist_no_sdist(name): + _analysis_test( + name = name, + dist = { + "is_sdist": "sdist", + }, + config_settings = [ + _flag.platform("linux_aarch64"), + _flag.pip_whl("only"), + ], + # We will use `no_match_error` in the real case to indicate that `sdist` is not + # allowed to be used. + want = "no_match", + ) + +_tests.append(_test_sdist_no_sdist) + +def _test_basic_whl_default(name): + _analysis_test( + name = name, + dist = { + "is_py_none_any": "whl", + "is_sdist": "sdist", + }, + want = "whl", + ) + +_tests.append(_test_basic_whl_default) + +def _test_basic_whl_nowhl(name): + _analysis_test( + name = name, + dist = { + "is_py_none_any": "whl", + "is_sdist": "sdist", + }, + config_settings = [ + _flag.platform("linux_aarch64"), + _flag.pip_whl("no"), + ], + want = "sdist", + ) + +_tests.append(_test_basic_whl_nowhl) + +def _test_basic_whl_nosdist(name): + _analysis_test( + name = name, + dist = { + "is_py_none_any": "whl", + "is_sdist": "sdist", + }, + config_settings = [ + _flag.platform("linux_aarch64"), + _flag.pip_whl("only"), + ], + want = "whl", + ) + +_tests.append(_test_basic_whl_nosdist) + +def _test_whl_default(name): + _analysis_test( + name = name, + dist = { + "is_py3_none_any": "whl", + "is_py_none_any": "basic_whl", + }, + want = "whl", + ) + +_tests.append(_test_whl_default) + +def _test_whl_nowhl(name): + _analysis_test( + name = name, + dist = { + "is_py3_none_any": "whl", + "is_py_none_any": "basic_whl", + }, + config_settings = [ + _flag.platform("linux_aarch64"), + _flag.pip_whl("no"), + ], + want = "no_match", + ) + +_tests.append(_test_whl_nowhl) + +def _test_whl_nosdist(name): + _analysis_test( + name = name, + dist = { + "is_py3_none_any": "whl", + }, + config_settings = [ + _flag.platform("linux_aarch64"), + _flag.pip_whl("only"), + ], + want = "whl", + ) + +_tests.append(_test_whl_nosdist) + +def _test_abi_whl_is_prefered(name): + _analysis_test( + name = name, + dist = { + "is_py3_abi3_any": "abi_whl", + "is_py3_none_any": "whl", + }, + want = "abi_whl", + ) + +_tests.append(_test_abi_whl_is_prefered) + +def _test_whl_with_constraints_is_prefered(name): + _analysis_test( + name = name, + dist = { + "is_py3_none_any": "default_whl", + "is_py3_none_any_linux_aarch64": "whl", + "is_py3_none_any_linux_x86_64": "amd64_whl", + }, + want = "whl", + ) + +_tests.append(_test_whl_with_constraints_is_prefered) + +def _test_cp_whl_is_prefered_over_py3(name): + _analysis_test( + name = name, + dist = { + "is_cp3x_none_any": "cp", + "is_py3_abi3_any": "py3_abi3", + "is_py3_none_any": "py3", + }, + want = "cp", + ) + +_tests.append(_test_cp_whl_is_prefered_over_py3) + +def _test_cp_abi_whl_is_prefered_over_py3(name): + _analysis_test( + name = name, + dist = { + "is_cp3x_abi3_any": "cp", + "is_py3_abi3_any": "py3", + }, + want = "cp", + ) + +_tests.append(_test_cp_abi_whl_is_prefered_over_py3) + +def _test_cp_version_is_selected_when_python_version_is_specified(name): + _analysis_test( + name = name, + dist = { + "is_cp3.10_cp3x_none_any": "cp310", + "is_cp3.8_cp3x_none_any": "cp38", + "is_cp3.9_cp3x_none_any": "cp39", + "is_cp3x_none_any": "cp_default", + }, + want = "cp310", + config_settings = [ + _flag.python_version("3.10.9"), + _flag.platform("linux_aarch64"), + ], + ) + +_tests.append(_test_cp_version_is_selected_when_python_version_is_specified) + +def _test_py_none_any_versioned(name): + _analysis_test( + name = name, + dist = { + "is_cp3.10_py_none_any": "whl", + "is_cp3.9_py_none_any": "too-low", + }, + want = "whl", + config_settings = [ + _flag.python_version("3.10.9"), + _flag.platform("linux_aarch64"), + ], + ) + +_tests.append(_test_py_none_any_versioned) + +def _test_cp_cp_whl(name): + _analysis_test( + name = name, + dist = { + "is_cp3.10_cp3x_cp_linux_aarch64": "whl", + }, + want = "whl", + config_settings = [ + _flag.python_version("3.10.9"), + _flag.platform("linux_aarch64"), + ], + ) + +_tests.append(_test_cp_cp_whl) + +def _test_cp_version_sdist_is_selected(name): + _analysis_test( + name = name, + dist = { + "is_cp3.10_sdist": "sdist", + }, + want = "sdist", + config_settings = [ + _flag.python_version("3.10.9"), + _flag.platform("linux_aarch64"), + ], + ) + +_tests.append(_test_cp_version_sdist_is_selected) + +def _test_platform_whl_is_prefered_over_any_whl_with_constraints(name): + _analysis_test( + name = name, + dist = { + "is_py3_abi3_any": "better_default_whl", + "is_py3_abi3_any_linux_aarch64": "better_default_any_whl", + "is_py3_none_any": "default_whl", + "is_py3_none_any_linux_aarch64": "whl", + "is_py3_none_linux_aarch64": "platform_whl", + }, + want = "platform_whl", + ) + +_tests.append(_test_platform_whl_is_prefered_over_any_whl_with_constraints) + +def _test_abi3_platform_whl_preference(name): + _analysis_test( + name = name, + dist = { + "is_py3_abi3_linux_aarch64": "abi3_platform", + "is_py3_none_linux_aarch64": "platform", + }, + want = "abi3_platform", + ) + +_tests.append(_test_abi3_platform_whl_preference) + +def _test_glibc(name): + _analysis_test( + name = name, + dist = { + "is_cp3x_cp_manylinux_aarch64": "glibc", + "is_py3_abi3_linux_aarch64": "abi3_platform", + }, + want = "glibc", + ) + +_tests.append(_test_glibc) + +def _test_glibc_versioned(name): + _analysis_test( + name = name, + dist = { + "is_cp3x_cp_manylinux_2_14_aarch64": "glibc", + "is_cp3x_cp_manylinux_2_17_aarch64": "glibc", + "is_py3_abi3_linux_aarch64": "abi3_platform", + }, + want = "glibc", + config_settings = [ + _flag.py_linux_libc("glibc"), + _flag.pip_whl_glibc_version("2.17"), + _flag.platform("linux_aarch64"), + ], + ) + +_tests.append(_test_glibc_versioned) + +def _test_glibc_compatible_exists(name): + _analysis_test( + name = name, + dist = { + # Code using the conditions will need to construct selects, which + # do the version matching correctly. + "is_cp3x_cp_manylinux_2_14_aarch64": "2_14_whl_via_2_14_branch", + "is_cp3x_cp_manylinux_2_17_aarch64": "2_14_whl_via_2_17_branch", + }, + want = "2_14_whl_via_2_17_branch", + config_settings = [ + _flag.py_linux_libc("glibc"), + _flag.pip_whl_glibc_version("2.17"), + _flag.platform("linux_aarch64"), + ], + ) + +_tests.append(_test_glibc_compatible_exists) + +def _test_musl(name): + _analysis_test( + name = name, + dist = { + "is_cp3x_cp_musllinux_aarch64": "musl", + }, + want = "musl", + config_settings = [ + _flag.py_linux_libc("musl"), + _flag.platform("linux_aarch64"), + ], + ) + +_tests.append(_test_musl) + +def _test_windows(name): + _analysis_test( + name = name, + dist = { + "is_cp3x_cp_windows_x86_64": "whl", + }, + want = "whl", + config_settings = [ + _flag.platform("windows_x86_64"), + ], + ) + +_tests.append(_test_windows) + +def _test_osx(name): + _analysis_test( + name = name, + dist = { + # We prefer arch specific whls over universal + "is_cp3x_cp_osx_x86_64": "whl", + "is_cp3x_cp_osx_x86_64_universal2": "universal_whl", + }, + want = "whl", + config_settings = [ + _flag.platform("mac_x86_64"), + ], + ) + +_tests.append(_test_osx) + +def _test_osx_universal_default(name): + _analysis_test( + name = name, + dist = { + # We default to universal if only that exists + "is_cp3x_cp_osx_x86_64_universal2": "whl", + }, + want = "whl", + config_settings = [ + _flag.platform("mac_x86_64"), + ], + ) + +_tests.append(_test_osx_universal_default) + +def _test_osx_universal_only(name): + _analysis_test( + name = name, + dist = { + # If we prefer universal, then we use that + "is_cp3x_cp_osx_x86_64": "whl", + "is_cp3x_cp_osx_x86_64_universal2": "universal", + }, + want = "universal", + config_settings = [ + _flag.pip_whl_osx_arch("universal"), + _flag.platform("mac_x86_64"), + ], + ) + +_tests.append(_test_osx_universal_only) + +def _test_osx_os_version(name): + _analysis_test( + name = name, + dist = { + # Similarly to the libc version, the user of the config settings will have to + # construct the select so that the version selection is correct. + "is_cp3x_cp_osx_10_9_x86_64": "whl", + }, + want = "whl", + config_settings = [ + _flag.pip_whl_osx_version("10.9"), + _flag.platform("mac_x86_64"), + ], + ) + +_tests.append(_test_osx_os_version) + +def _test_all(name): + _analysis_test( + name = name, + dist = { + "is_" + f: f + for f in [ + "{py}_{abi}_{plat}".format(py = valid_py, abi = valid_abi, plat = valid_plat) + # we have py2.py3, py3, cp3x + for valid_py in ["py", "py3", "cp3x"] + # cp abi usually comes with a version and we only need one + # config setting variant for all of them because the python + # version will discriminate between different versions. + for valid_abi in ["none", "abi3", "cp"] + for valid_plat in [ + "any", + "manylinux_2_17_x86_64", + "manylinux_2_17_aarch64", + "osx_x86_64", + "windows_x86_64", + ] + if not ( + valid_abi == "abi3" and valid_py == "py" or + valid_abi == "cp" and valid_py != "cp3x" + ) + ] + }, + want = "cp3x_cp_manylinux_2_17_x86_64", + config_settings = [ + _flag.pip_whl_glibc_version("2.17"), + _flag.platform("linux_x86_64"), + ], + ) + +_tests.append(_test_all) + +def pip_config_settings_test_suite(name): # buildifier: disable=function-docstring + test_suite( + name = name, + tests = _tests, + ) + + pip_config_settings( + name = "dummy", + python_versions = ["3.8", "3.9", "3.10"], + glibc_versions = [(2, 14), (2, 17)], + muslc_versions = [(1, 1)], + osx_versions = [(10, 9), (11, 0)], + target_platforms = [ + "windows_x86_64", + "windows_aarch64", + "linux_x86_64", + "linux_ppc", + "linux_aarch64", + "osx_x86_64", + "osx_aarch64", + ], + ) diff --git a/tests/private/pip_repo_name/BUILD.bazel b/tests/private/pip_repo_name/BUILD.bazel new file mode 100644 index 0000000000..7c6782daaf --- /dev/null +++ b/tests/private/pip_repo_name/BUILD.bazel @@ -0,0 +1,3 @@ +load(":pip_repo_name_tests.bzl", "pip_repo_name_test_suite") + +pip_repo_name_test_suite(name = "pip_repo_name_tests") diff --git a/tests/private/pip_repo_name/pip_repo_name_tests.bzl b/tests/private/pip_repo_name/pip_repo_name_tests.bzl new file mode 100644 index 0000000000..574d558277 --- /dev/null +++ b/tests/private/pip_repo_name/pip_repo_name_tests.bzl @@ -0,0 +1,52 @@ +# 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. + +"" + +load("@rules_testing//lib:test_suite.bzl", "test_suite") +load("//python/private:pip_repo_name.bzl", "pip_repo_name") # buildifier: disable=bzl-visibility + +_tests = [] + +def _test_simple(env): + got = pip_repo_name("prefix", "foo-1.2.3-py3-none-any.whl", "deadbeef") + env.expect.that_str(got).equals("prefix_foo_py3_none_any_deadbeef") + +_tests.append(_test_simple) + +def _test_sdist(env): + got = pip_repo_name("prefix", "foo-1.2.3.tar.gz", "deadbeef000deadbeef") + env.expect.that_str(got).equals("prefix_foo_sdist_deadbeef") + +_tests.append(_test_sdist) + +def _test_platform_whl(env): + got = pip_repo_name( + "prefix", + "foo-1.2.3-cp39.cp310-abi3-manylinux1_x86_64.manylinux_2_17_x86_64.whl", + "deadbeef000deadbeef", + ) + + # We only need the first segment of each + env.expect.that_str(got).equals("prefix_foo_cp39_abi3_manylinux_2_5_x86_64_deadbeef") + +_tests.append(_test_platform_whl) + +def pip_repo_name_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/private/whl_target_platforms/whl_target_platforms_tests.bzl b/tests/private/whl_target_platforms/whl_target_platforms_tests.bzl index a06147b946..07f3158b31 100644 --- a/tests/private/whl_target_platforms/whl_target_platforms_tests.bzl +++ b/tests/private/whl_target_platforms/whl_target_platforms_tests.bzl @@ -22,20 +22,20 @@ _tests = [] def _test_simple(env): tests = { "macosx_10_9_arm64": [ - struct(os = "osx", cpu = "aarch64", abi = None, target_platform = "osx_aarch64"), + struct(os = "osx", cpu = "aarch64", abi = None, target_platform = "osx_aarch64", version = (10, 9)), ], "macosx_10_9_universal2": [ - struct(os = "osx", cpu = "x86_64", abi = None, target_platform = "osx_x86_64"), - struct(os = "osx", cpu = "aarch64", abi = None, target_platform = "osx_aarch64"), + struct(os = "osx", cpu = "x86_64", abi = None, target_platform = "osx_x86_64", version = (10, 9)), + struct(os = "osx", cpu = "aarch64", abi = None, target_platform = "osx_aarch64", version = (10, 9)), ], - "manylinux1_i686.manylinux_2_17_i686": [ - struct(os = "linux", cpu = "x86_32", abi = None, target_platform = "linux_x86_32"), + "manylinux_2_17_i686": [ + struct(os = "linux", cpu = "x86_32", abi = None, target_platform = "linux_x86_32", version = (2, 17)), ], "musllinux_1_1_ppc64le": [ - struct(os = "linux", cpu = "ppc", abi = None, target_platform = "linux_ppc"), + struct(os = "linux", cpu = "ppc", abi = None, target_platform = "linux_ppc", version = (1, 1)), ], "win_amd64": [ - struct(os = "windows", cpu = "x86_64", abi = None, target_platform = "windows_x86_64"), + struct(os = "windows", cpu = "x86_64", abi = None, target_platform = "windows_x86_64", version = (0, 0)), ], } @@ -49,20 +49,22 @@ _tests.append(_test_simple) def _test_with_abi(env): tests = { "macosx_10_9_arm64": [ - struct(os = "osx", cpu = "aarch64", abi = "cp39", target_platform = "cp39_osx_aarch64"), + struct(os = "osx", cpu = "aarch64", abi = "cp39", target_platform = "cp39_osx_aarch64", version = (10, 9)), ], "macosx_10_9_universal2": [ - struct(os = "osx", cpu = "x86_64", abi = "cp310", target_platform = "cp310_osx_x86_64"), - struct(os = "osx", cpu = "aarch64", abi = "cp310", target_platform = "cp310_osx_aarch64"), + struct(os = "osx", cpu = "x86_64", abi = "cp310", target_platform = "cp310_osx_x86_64", version = (10, 9)), + struct(os = "osx", cpu = "aarch64", abi = "cp310", target_platform = "cp310_osx_aarch64", version = (10, 9)), ], + # This should use version 0 because there are two platform_tags. This is + # just to ensure that the code is robust "manylinux1_i686.manylinux_2_17_i686": [ - struct(os = "linux", cpu = "x86_32", abi = "cp38", target_platform = "cp38_linux_x86_32"), + struct(os = "linux", cpu = "x86_32", abi = "cp38", target_platform = "cp38_linux_x86_32", version = (0, 0)), ], "musllinux_1_1_ppc64le": [ - struct(os = "linux", cpu = "ppc", abi = "cp311", target_platform = "cp311_linux_ppc"), + struct(os = "linux", cpu = "ppc", abi = "cp311", target_platform = "cp311_linux_ppc", version = (1, 1)), ], "win_amd64": [ - struct(os = "windows", cpu = "x86_64", abi = "cp311", target_platform = "cp311_windows_x86_64"), + struct(os = "windows", cpu = "x86_64", abi = "cp311", target_platform = "cp311_windows_x86_64", version = (0, 0)), ], } diff --git a/tests/support/BUILD.bazel b/tests/support/BUILD.bazel index 3b77cde0c5..e5d5189a3b 100644 --- a/tests/support/BUILD.bazel +++ b/tests/support/BUILD.bazel @@ -52,6 +52,14 @@ platform( ], ) +platform( + name = "linux_aarch64", + constraint_values = [ + "@platforms//cpu:aarch64", + "@platforms//os:linux", + ], +) + platform( name = "mac_x86_64", constraint_values = [ @@ -68,6 +76,14 @@ platform( ], ) +platform( + name = "win_aarch64", + constraint_values = [ + "@platforms//os:windows", + "@platforms//cpu:aarch64", + ], +) + py_runtime( name = "platform_runtime", implementation_name = "fakepy", From f82e3dcd199a0c7960607bf6fcc8c683af917db3 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 10 Jun 2024 12:05:30 +0900 Subject: [PATCH 054/345] doc(pip_parse_vendored): fix the example (#1942) With this change we are now again generating a working `requirements.bzl` file which broke during our switch to using the `hub` repo. Fixes #1918. --- CHANGELOG.md | 2 + examples/pip_parse_vendored/BUILD.bazel | 45 +++++++++++++++++-- examples/pip_parse_vendored/WORKSPACE | 5 ++- examples/pip_parse_vendored/requirements.bzl | 26 +++++------ .../test_dependency_usage.py | 12 +++++ 5 files changed, 72 insertions(+), 18 deletions(-) create mode 100644 examples/pip_parse_vendored/test_dependency_usage.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 81340160a5..d9c502a252 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -80,6 +80,8 @@ A brief description of the categories of changes: autodetection would match a different toolchain than expected. This may yield to toolchain selection failures when the python toolchain is not registered, but is requested via `//python/config_settings:python_version` flag setting. +* (doc) Fix the `WORKSPACE` requirement vendoring example. Fixes + [#1918](https://github.com/bazelbuild/rules_python/issues/1918). ### Added * (rules) Precompiling Python source at build time is available. but is diff --git a/examples/pip_parse_vendored/BUILD.bazel b/examples/pip_parse_vendored/BUILD.bazel index b856c94525..e2b1f5d49b 100644 --- a/examples/pip_parse_vendored/BUILD.bazel +++ b/examples/pip_parse_vendored/BUILD.bazel @@ -1,6 +1,9 @@ +load("@bazel_skylib//rules:build_test.bzl", "build_test") load("@bazel_skylib//rules:diff_test.bzl", "diff_test") load("@bazel_skylib//rules:write_file.bzl", "write_file") +load("@rules_python//python:defs.bzl", "py_test") load("@rules_python//python:pip.bzl", "compile_pip_requirements") +load("//:requirements.bzl", "all_data_requirements", "all_requirements", "all_whl_requirements", "requirement") # This rule adds a convenient way to update the requirements.txt # lockfile based on the requirements.in. @@ -9,6 +12,29 @@ compile_pip_requirements( src = "requirements.in", ) +# The requirements.bzl file is using the hub repo to access packages via the +# `requirement` macro and when the requirements.bzl is vendored, the hub +# repo won't be present. As a result, we have to adjust the label scheme in +# the requirements.bzl to make sure that they continue to work. +genrule( + name = "requirement_bzl", + srcs = ["@pip_deps_to_be_vendored//:requirements.bzl"], + outs = ["requirements.clean.bzl"], + cmd = " | ".join([ + "cat $<", + # Substitute the name of the hub to ensure that the dependencies do + # not require the hub repo initialized in the WORKSPACE. + "sed -e 's/pip_deps_to_be_vendored/my_project_pip_deps_vendored/g'", + # Change the labels from using the hub repo to using the spoke repos + # directly. + "sed -e 's|//\\([^:]*\\):pkg|_\\1//:pkg|g'", + "sed -e 's|//\\([^:]*\\):whl|_\\1//:whl|g'", + "sed -e 's|//\\([^:]*\\):data|_\\1//:data|g'", + # Change the convenience macros to use the same naming. + "sed -e 's|//{}:{}|_{}//:{}|g' >$@", + ]), +) + write_file( name = "gen_update", out = "update.sh", @@ -17,14 +43,14 @@ write_file( "#!/usr/bin/env bash", # Bazel gives us a way to access the source folder! "cd $BUILD_WORKSPACE_DIRECTORY", - "cp -fv bazel-pip_parse_vendored/external/pip/requirements.bzl requirements.bzl", + "cp -fv bazel-bin/requirements.clean.bzl requirements.bzl", ], ) sh_binary( name = "vendor_requirements", srcs = ["update.sh"], - data = ["@pip//:requirements.bzl"], + data = [":requirement_bzl"], ) # Similarly ensures that the requirements.bzl file is updated @@ -33,5 +59,18 @@ diff_test( name = "test_vendored", failure_message = "Please run: bazel run //:vendor_requirements", file1 = "requirements.bzl", - file2 = "@pip//:requirements.bzl", + file2 = "requirement_bzl", +) + +py_test( + name = "test_dependency_usage", + srcs = ["test_dependency_usage.py"], + deps = [ + requirement("requests"), + ], +) + +build_test( + name = "test_requirement_lists", + targets = all_requirements + all_whl_requirements + all_data_requirements, ) diff --git a/examples/pip_parse_vendored/WORKSPACE b/examples/pip_parse_vendored/WORKSPACE index 7904724d9e..d7a11ea596 100644 --- a/examples/pip_parse_vendored/WORKSPACE +++ b/examples/pip_parse_vendored/WORKSPACE @@ -1,4 +1,4 @@ -workspace(name = "pip_repository_annotations_example") +workspace(name = "pip_parse_vendored_example") local_repository( name = "rules_python", @@ -23,7 +23,8 @@ load("@rules_python//python:pip.bzl", "pip_parse") # verify by inspection; the environment variables at a later time, when we download the # packages, will be the ones that take effect. pip_parse( - name = "pip", + # We choose a unique name here to make sure we can do some cleanup on it. + name = "pip_deps_to_be_vendored", envsubst = ["PIP_RETRIES"], extra_pip_args = ["--retries=${PIP_RETRIES:-5}"], python_interpreter_target = "@python39_host//:python", diff --git a/examples/pip_parse_vendored/requirements.bzl b/examples/pip_parse_vendored/requirements.bzl index 5c2391bd4c..c6465955ba 100644 --- a/examples/pip_parse_vendored/requirements.bzl +++ b/examples/pip_parse_vendored/requirements.bzl @@ -6,34 +6,34 @@ load("@rules_python//python:pip.bzl", "pip_utils") load("@rules_python//python/pip_install:pip_repository.bzl", "group_library", "whl_library") -all_requirements = ["@pip//certifi:pkg", "@pip//charset_normalizer:pkg", "@pip//idna:pkg", "@pip//requests:pkg", "@pip//urllib3:pkg"] +all_requirements = ["@my_project_pip_deps_vendored_certifi//:pkg", "@my_project_pip_deps_vendored_charset_normalizer//:pkg", "@my_project_pip_deps_vendored_idna//:pkg", "@my_project_pip_deps_vendored_requests//:pkg", "@my_project_pip_deps_vendored_urllib3//:pkg"] -all_whl_requirements_by_package = {"certifi": "@pip//certifi:whl", "charset_normalizer": "@pip//charset_normalizer:whl", "idna": "@pip//idna:whl", "requests": "@pip//requests:whl", "urllib3": "@pip//urllib3:whl"} +all_whl_requirements_by_package = {"certifi": "@my_project_pip_deps_vendored_certifi//:whl", "charset_normalizer": "@my_project_pip_deps_vendored_charset_normalizer//:whl", "idna": "@my_project_pip_deps_vendored_idna//:whl", "requests": "@my_project_pip_deps_vendored_requests//:whl", "urllib3": "@my_project_pip_deps_vendored_urllib3//:whl"} all_whl_requirements = all_whl_requirements_by_package.values() -all_data_requirements = ["@pip//certifi:data", "@pip//charset_normalizer:data", "@pip//idna:data", "@pip//requests:data", "@pip//urllib3:data"] +all_data_requirements = ["@my_project_pip_deps_vendored_certifi//:data", "@my_project_pip_deps_vendored_charset_normalizer//:data", "@my_project_pip_deps_vendored_idna//:data", "@my_project_pip_deps_vendored_requests//:data", "@my_project_pip_deps_vendored_urllib3//:data"] -_packages = [("pip_certifi", "certifi==2023.7.22 --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"), ("pip_charset_normalizer", "charset-normalizer==2.1.1 --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"), ("pip_idna", "idna==3.4 --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"), ("pip_requests", "requests==2.28.1 --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 --hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"), ("pip_urllib3", "urllib3==1.26.13 --hash=sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc --hash=sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8")] -_config = {"download_only": False, "enable_implicit_namespace_pkgs": False, "environment": {}, "envsubst": ["PIP_RETRIES"], "extra_pip_args": ["--retries=${PIP_RETRIES:-5}"], "isolated": True, "pip_data_exclude": [], "python_interpreter": "python3", "python_interpreter_target": "@python39_host//:python", "quiet": True, "repo": "pip", "repo_prefix": "pip_", "timeout": 600} +_packages = [("my_project_pip_deps_vendored_certifi", "certifi==2023.7.22 --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"), ("my_project_pip_deps_vendored_charset_normalizer", "charset-normalizer==2.1.1 --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"), ("my_project_pip_deps_vendored_idna", "idna==3.4 --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"), ("my_project_pip_deps_vendored_requests", "requests==2.28.1 --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 --hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"), ("my_project_pip_deps_vendored_urllib3", "urllib3==1.26.13 --hash=sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc --hash=sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8")] +_config = {"download_only": False, "enable_implicit_namespace_pkgs": False, "environment": {}, "envsubst": ["PIP_RETRIES"], "extra_pip_args": ["--retries=${PIP_RETRIES:-5}"], "isolated": True, "pip_data_exclude": [], "python_interpreter": "python3", "python_interpreter_target": "@python39_host//:python", "quiet": True, "repo": "my_project_pip_deps_vendored", "repo_prefix": "my_project_pip_deps_vendored_", "timeout": 600} _annotations = {} def requirement(name): - return "@pip//{}:{}".format(pip_utils.normalize_name(name), "pkg") + return "@my_project_pip_deps_vendored_{}//:{}".format(pip_utils.normalize_name(name), "pkg") def whl_requirement(name): - return "@pip//{}:{}".format(pip_utils.normalize_name(name), "whl") + return "@my_project_pip_deps_vendored_{}//:{}".format(pip_utils.normalize_name(name), "whl") def data_requirement(name): - return "@pip//{}:{}".format(pip_utils.normalize_name(name), "data") + return "@my_project_pip_deps_vendored_{}//:{}".format(pip_utils.normalize_name(name), "data") def dist_info_requirement(name): - return "@pip//{}:{}".format(pip_utils.normalize_name(name), "dist_info") + return "@my_project_pip_deps_vendored_{}//:{}".format(pip_utils.normalize_name(name), "dist_info") def entry_point(pkg, script = None): if not script: script = pkg - return "@pip_" + pip_utils.normalize_name(pkg) + "//:rules_python_wheel_entry_point_" + script + return "@my_project_pip_deps_vendored_" + pip_utils.normalize_name(pkg) + "//:rules_python_wheel_entry_point_" + script def _get_annotation(requirement): # This expects to parse `setuptools==58.2.0 --hash=sha256:2551203ae6955b9876741a26ab3e767bb3242dafe86a32a749ea0d78b6792f11` @@ -58,10 +58,10 @@ def install_deps(**whl_library_kwargs): for requirement in group_requirements } - group_repo = "pip__groups" + group_repo = "my_project_pip_deps_vendored__groups" group_library( name = group_repo, - repo_prefix = "pip_", + repo_prefix = "my_project_pip_deps_vendored_", groups = all_requirement_groups, ) @@ -70,7 +70,7 @@ def install_deps(**whl_library_kwargs): whl_config.update(whl_library_kwargs) for name, requirement in _packages: - group_name = requirement_group_mapping.get(name.replace("pip_", "")) + group_name = requirement_group_mapping.get(name.replace("my_project_pip_deps_vendored_", "")) group_deps = all_requirement_groups.get(group_name, []) whl_library( diff --git a/examples/pip_parse_vendored/test_dependency_usage.py b/examples/pip_parse_vendored/test_dependency_usage.py new file mode 100644 index 0000000000..e2cf970d9d --- /dev/null +++ b/examples/pip_parse_vendored/test_dependency_usage.py @@ -0,0 +1,12 @@ +import unittest + +import requests + + +class TestDependencies(unittest.TestCase): + def test_import(self): + self.assertIsNotNone(requests.get) + + +if __name__ == "__main__": + unittest.main() From 49cdf7d3fe000076d6432a34238e5d25f5b598d0 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 10 Jun 2024 19:31:09 +0900 Subject: [PATCH 055/345] fix: make the pythons_hub platform independent (#1946) With this change we can finally have platform independent bzlmod lock files in rules_python. This cleans up code paths that were not being used in the `pip` extension for a while and the replacement is noted in the CHANGELOG. Fixes #1643 --- CHANGELOG.md | 4 ++++ python/private/bzlmod/pythons_hub.bzl | 24 ++---------------------- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9c502a252..7d0e16f020 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,10 @@ A brief description of the categories of changes: `{pip_hub_prefix}_{wheel_name}_{py_tag}_{abi_tag}_{platform_tag}_{sha256}`, which is an implementation detail which should not be relied on and is there purely for better debugging experience. +* (bzlmod) The `pythons_hub//:interpreters.bzl` no longer has platform-specific + labels which where left there for compatibility reasons. Move to + `python_{version}_host` keys if you would like to have access to a Python + interpreter that can be used in a repository rule context. ### Fixed * (gazelle) Remove `visibility` from `NonEmptyAttr`. diff --git a/python/private/bzlmod/pythons_hub.bzl b/python/private/bzlmod/pythons_hub.bzl index b002956bd9..7a8c874ed8 100644 --- a/python/private/bzlmod/pythons_hub.bzl +++ b/python/private/bzlmod/pythons_hub.bzl @@ -14,12 +14,9 @@ "Repo rule used by bzlmod extension to create a repo that has a map of Python interpreters and their labels" -load("//python:versions.bzl", "WINDOWS_NAME") load("//python/private:full_version.bzl", "full_version") load( "//python/private:toolchains_repo.bzl", - "get_host_os_arch", - "get_host_platform", "python_toolchain_build_file_content", ) @@ -83,7 +80,7 @@ DEFAULT_PYTHON_VERSION = "{default_python_version}" """ _line_for_hub_template = """\ - "{key}": Label("@{name}_{platform}//:{path}"), + "{name}_host": Label("@{name}_host//:python"), """ def _hub_repo_impl(rctx): @@ -101,28 +98,11 @@ def _hub_repo_impl(rctx): executable = False, ) - (os, arch) = get_host_os_arch(rctx) - platform = get_host_platform(os, arch) - is_windows = (os == WINDOWS_NAME) - path = "python.exe" if is_windows else "bin/python3" - # Create a dict that is later used to create # a symlink to a interpreter. interpreter_labels = "".join([ - _line_for_hub_template.format( - key = name + ("" if platform_str != "host" else "_host"), - name = name, - platform = platform_str, - path = p, - ) + _line_for_hub_template.format(name = name) for name in rctx.attr.toolchain_user_repository_names - for platform_str, p in { - # NOTE @aignas 2023-12-21: maintaining the `platform` specific key - # here may be unneeded in the long term, but I am not sure if there - # are other users that depend on it. - platform: path, - "host": "python", - }.items() ]) rctx.file( From 8b0eaed84198a52972c3624a968339588d0d97f6 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Tue, 11 Jun 2024 14:35:48 +0900 Subject: [PATCH 056/345] revert: upgrade to protobuf 27.0 and remove py_proto_library (#1933) (#1948) This reverts commit d0e25cfb41446e481da6e85f04ad0ac5bcf7ea80. We have the following concerns with the associated change: - `sphinxdocs` is excluded entirely. Because protobuf fails to compile? But why? Protos are needed as part of our docgen, but it is unclear how the docgen is still working. Maybe we can get some clarification here? - The `py_proto_library` tests in the `bzlmod` example are excluded from CI. Because protos also fail to compile? But why? It's an example and should Just Work. - Adding the `copts` needs to be done by all downstream users now. But fixing that in protobuf blocks removing legacy struct providers? I don't understand the connection. Also @alexeagle noted extra [regression](https://github.com/bazelbuild/rules_python/pull/1933#issuecomment-2155523751) being caused by the associated PR. Reverting in order to unblock a new release of `rules_python` and then we can work together with @comius on reverting the revert. Reverts https://github.com/bazelbuild/rules_python/pull/1933 --- .bazelci/presubmit.yml | 53 +---- CHANGELOG.md | 3 - MODULE.bazel | 6 +- WORKSPACE | 6 + WORKSPACE.bzlmod | 5 + examples/bzlmod/MODULE.bazel | 5 +- .../example.com/another_proto/BUILD.bazel | 4 +- .../example.com/proto/BUILD.bazel | 4 +- examples/py_proto_library/WORKSPACE | 19 +- .../example.com/another_proto/BUILD.bazel | 4 +- .../example.com/proto/BUILD.bazel | 4 +- internal_deps.bzl | 14 +- internal_setup.bzl | 4 + python/BUILD.bazel | 2 +- python/private/BUILD.bazel | 1 + python/private/proto/BUILD.bazel | 46 ++++ python/private/proto/py_proto_library.bzl | 223 ++++++++++++++++++ python/proto.bzl | 6 +- 18 files changed, 332 insertions(+), 77 deletions(-) create mode 100644 python/private/proto/BUILD.bazel create mode 100644 python/private/proto/py_proto_library.bzl diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index c2d172d7e1..30138d3be6 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -147,14 +147,6 @@ tasks: <<: *reusable_config name: "Default: Debian" platform: debian11 - build_flags: - # For protobuf compilation - - '--host_copt=-Wno-deprecated-declarations' - - '--copt=-Wno-deprecated-declarations' - test_flags: - # For protobuf compilation - - '--host_copt=-Wno-deprecated-declarations' - - '--copt=-Wno-deprecated-declarations' macos: <<: *reusable_config name: "Default: MacOS" @@ -177,10 +169,6 @@ tasks: # build kite cc toolchain. - "--extra_toolchains=@buildkite_config//config:cc-toolchain" - "--build_tag_filters=-docs" - build_targets: - - "--" - - "..." - - '-//sphinxdocs/...' # protobuf compilation fails test_flags: - "--test_tag_filters=-integration-test,-acceptance-test,-docs" # BazelCI sets --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1, @@ -188,28 +176,12 @@ tasks: # on Bazel 5.4 and earlier. To workaround this, manually specify the # build kite cc toolchain. - "--extra_toolchains=@buildkite_config//config:cc-toolchain" - test_targets: - - "--" - - "..." - - '-//sphinxdocs/...' # protobuf compilation fails rbe: <<: *reusable_config name: "RBE: Ubuntu" platform: rbe_ubuntu1604 - build_flags: - - "--build_tag_filters=-docs" - build_targets: - - "--" - - "..." - - '-//sphinxdocs/...' # protobuf compilation fails - - '-//docs/...' test_flags: - - "--test_tag_filters=-integration-test,-acceptance-test,-docs" - test_targets: - - "--" - - "..." - - '-//sphinxdocs/...' # protobuf compilation fails - - '-//docs/...' + - "--test_tag_filters=-integration-test,-acceptance-test" integration_test_build_file_generation_ubuntu_minimum_supported_workspace: <<: *minimum_supported_version @@ -262,21 +234,6 @@ tasks: name: "examples/bzlmod: Debian" working_directory: examples/bzlmod platform: debian11 - build_targets: - # For protobuf compilation - - "--" - - "..." - - "-//py_proto_library/..." - test_targets: - # For protobuf compilation - - "--" - - "..." - - "-//py_proto_library/..." - coverage_targets: - # For protobuf compilation - - "--" - - "..." - - "-//py_proto_library/..." integration_test_bzlmod_macos: <<: *reusable_build_test_all <<: *coverage_targets_example_bzlmod @@ -438,14 +395,6 @@ tasks: name: "examples/py_proto_library: Debian, workspace" working_directory: examples/py_proto_library platform: debian11 - build_flags: - # For protobuf compilation - - '--host_copt=-Wno-deprecated-declarations' - - '--copt=-Wno-deprecated-declarations' - test_flags: - # For protobuf compilation - - '--host_copt=-Wno-deprecated-declarations' - - '--copt=-Wno-deprecated-declarations' integration_test_py_proto_library_macos_workspace: <<: *reusable_build_test_all <<: *common_workspace_flags diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d0e16f020..a2ba32fd76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,9 +25,6 @@ A brief description of the categories of changes: [x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/x.x.x ### Changed -* (rules) `py_proto_library` is deprecated in favour of the - implementation in https://github.com/protocolbuffers/protobuf. It will be - removed in the future release. * (deps) Upgrade the `pip_install` dependencies to pick up a new version of pip. * (toolchains) Optional toolchain dependency: `py_binary`, `py_test`, and `py_library` now depend on the `//python:exec_tools_toolchain_type` for build diff --git a/MODULE.bazel b/MODULE.bazel index 7e86bda9b8..53d845ed88 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -9,9 +9,9 @@ bazel_dep(name = "bazel_skylib", version = "1.6.1") bazel_dep(name = "rules_cc", version = "0.0.9") bazel_dep(name = "platforms", version = "0.0.4") -# For backwards compatibility, those are loaded only when using py_proto_library -# Use py_proto_library directly from protobuf repository -bazel_dep(name = "protobuf", version = "27.0", repo_name = "com_google_protobuf") +# Those are loaded only when using py_proto_library +bazel_dep(name = "rules_proto", version = "6.0.0-rc1") +bazel_dep(name = "protobuf", version = "21.7", repo_name = "com_google_protobuf") internal_deps = use_extension("//python/private/bzlmod:internal_deps.bzl", "internal_deps") use_repo( diff --git a/WORKSPACE b/WORKSPACE index d30ccb02fd..90e9305684 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -148,3 +148,9 @@ http_file( "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/WORKSPACE.bzlmod b/WORKSPACE.bzlmod index 7829af6f21..ca89afe8af 100644 --- a/WORKSPACE.bzlmod +++ b/WORKSPACE.bzlmod @@ -55,3 +55,8 @@ http_file( ], ) +# 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/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel index 2e28bd6270..0d30161147 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -11,8 +11,11 @@ local_path_override( path = "../..", ) +# (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") + # (py_proto_library specific) Add the protobuf library for well-known types (e.g. `Any`, `Timestamp`, etc) -bazel_dep(name = "protobuf", version = "27.0", repo_name = "com_google_protobuf") +bazel_dep(name = "protobuf", version = "21.7", repo_name = "com_google_protobuf") # We next initialize the python toolchain using the extension. # You can set different Python versions in this block. diff --git a/examples/bzlmod/py_proto_library/example.com/another_proto/BUILD.bazel b/examples/bzlmod/py_proto_library/example.com/another_proto/BUILD.bazel index 80f0470741..806fcb9dcc 100644 --- a/examples/bzlmod/py_proto_library/example.com/another_proto/BUILD.bazel +++ b/examples/bzlmod/py_proto_library/example.com/another_proto/BUILD.bazel @@ -1,5 +1,5 @@ -load("@com_google_protobuf//bazel:proto_library.bzl", "proto_library") -load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library") +load("@rules_proto//proto:defs.bzl", "proto_library") +load("@rules_python//python:proto.bzl", "py_proto_library") py_proto_library( name = "message_proto_py_pb2", diff --git a/examples/bzlmod/py_proto_library/example.com/proto/BUILD.bazel b/examples/bzlmod/py_proto_library/example.com/proto/BUILD.bazel index 3bc9d1b739..fa20f2ce94 100644 --- a/examples/bzlmod/py_proto_library/example.com/proto/BUILD.bazel +++ b/examples/bzlmod/py_proto_library/example.com/proto/BUILD.bazel @@ -1,5 +1,5 @@ -load("@com_google_protobuf//bazel:proto_library.bzl", "proto_library") -load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library") +load("@rules_proto//proto:defs.bzl", "proto_library") +load("@rules_python//python:proto.bzl", "py_proto_library") py_proto_library( name = "pricetag_proto_py_pb2", diff --git a/examples/py_proto_library/WORKSPACE b/examples/py_proto_library/WORKSPACE index 7892c69c4d..81f189dbbf 100644 --- a/examples/py_proto_library/WORKSPACE +++ b/examples/py_proto_library/WORKSPACE @@ -24,11 +24,24 @@ python_register_toolchains( # Then we need to setup dependencies in order to use py_proto_library load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +http_archive( + name = "rules_proto", + sha256 = "904a8097fae42a690c8e08d805210e40cccb069f5f9a0f6727cf4faa7bed2c9c", + strip_prefix = "rules_proto-6.0.0-rc1", + url = "https://github.com/bazelbuild/rules_proto/releases/download/6.0.0-rc1/rules_proto-6.0.0-rc1.tar.gz", +) + +load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") + +rules_proto_dependencies() + +rules_proto_toolchains() + http_archive( name = "com_google_protobuf", - sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", - strip_prefix = "protobuf-27.0", - urls = ["https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protobuf-27.0.tar.gz"], + sha256 = "4fc5ff1b2c339fb86cd3a25f0b5311478ab081e65ad258c6789359cd84d421f8", + strip_prefix = "protobuf-26.1", + urls = ["https://github.com/protocolbuffers/protobuf/archive/v26.1.tar.gz"], ) load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") diff --git a/examples/py_proto_library/example.com/another_proto/BUILD.bazel b/examples/py_proto_library/example.com/another_proto/BUILD.bazel index 126dd9b46d..dd58265bc9 100644 --- a/examples/py_proto_library/example.com/another_proto/BUILD.bazel +++ b/examples/py_proto_library/example.com/another_proto/BUILD.bazel @@ -1,5 +1,5 @@ -load("@com_google_protobuf//bazel:proto_library.bzl", "proto_library") -load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library") +load("@rules_proto//proto:defs.bzl", "proto_library") +load("@rules_python//python:proto.bzl", "py_proto_library") py_proto_library( name = "message_proto_py_pb2", diff --git a/examples/py_proto_library/example.com/proto/BUILD.bazel b/examples/py_proto_library/example.com/proto/BUILD.bazel index 0084a61794..dc91162aa6 100644 --- a/examples/py_proto_library/example.com/proto/BUILD.bazel +++ b/examples/py_proto_library/example.com/proto/BUILD.bazel @@ -1,5 +1,5 @@ -load("@com_google_protobuf//bazel:proto_library.bzl", "proto_library") -load("@com_google_protobuf//bazel:py_proto_library.bzl", "py_proto_library") +load("@rules_proto//proto:defs.bzl", "proto_library") +load("@rules_python//python:proto.bzl", "py_proto_library") py_proto_library( name = "pricetag_proto_py_pb2", diff --git a/internal_deps.bzl b/internal_deps.bzl index 8c604c4032..8818751644 100644 --- a/internal_deps.bzl +++ b/internal_deps.bzl @@ -164,12 +164,20 @@ def rules_python_internal_deps(): ], ) + http_archive( + name = "rules_proto", + sha256 = "904a8097fae42a690c8e08d805210e40cccb069f5f9a0f6727cf4faa7bed2c9c", + strip_prefix = "rules_proto-6.0.0-rc1", + url = "https://github.com/bazelbuild/rules_proto/releases/download/6.0.0-rc1/rules_proto-6.0.0-rc1.tar.gz", + ) + http_archive( name = "com_google_protobuf", - sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", - strip_prefix = "protobuf-27.0", + sha256 = "75be42bd736f4df6d702a0e4e4d30de9ee40eac024c4b845d17ae4cc831fe4ae", + strip_prefix = "protobuf-21.7", urls = [ - "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protobuf-27.0.tar.gz", + "https://mirror.bazel.build/github.com/protocolbuffers/protobuf/archive/v21.7.tar.gz", + "https://github.com/protocolbuffers/protobuf/archive/v21.7.tar.gz", ], ) diff --git a/internal_setup.bzl b/internal_setup.bzl index 6614ad355e..bb62611213 100644 --- a/internal_setup.bzl +++ b/internal_setup.bzl @@ -20,6 +20,7 @@ load("@cgrindel_bazel_starlib//:deps.bzl", "bazel_starlib_dependencies") 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_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") load("//:version.bzl", "SUPPORTED_BAZEL_VERSIONS") load("//python/pip_install:repositories.bzl", "pip_install_dependencies") load("//python/private:internal_config_repo.bzl", "internal_config_repo") # buildifier: disable=bzl-visibility @@ -34,6 +35,9 @@ def rules_python_internal_setup(): bazel_skylib_workspace() + rules_proto_dependencies() + rules_proto_toolchains() + protobuf_deps() bazel_integration_test_rules_dependencies() diff --git a/python/BUILD.bazel b/python/BUILD.bazel index 100a8c04a5..cbf29964fb 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -113,7 +113,7 @@ bzl_library( ], visibility = ["//visibility:public"], deps = [ - "@com_google_protobuf//bazel:py_proto_library_bzl", + "//python/private/proto:py_proto_library_bzl", ], ) diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index d73cee8ae4..422ed9c7c2 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -29,6 +29,7 @@ filegroup( srcs = glob(["**"]) + [ "//python/private/bzlmod:distribution", "//python/private/common:distribution", + "//python/private/proto:distribution", "//python/private/whl_filegroup:distribution", "//tools/build_defs/python/private:distribution", ], diff --git a/python/private/proto/BUILD.bazel b/python/private/proto/BUILD.bazel new file mode 100644 index 0000000000..65c09444f7 --- /dev/null +++ b/python/private/proto/BUILD.bazel @@ -0,0 +1,46 @@ +# 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. + +load("@bazel_skylib//:bzl_library.bzl", "bzl_library") +load("@rules_proto//proto:defs.bzl", "proto_lang_toolchain") + +package(default_visibility = ["//visibility:private"]) + +licenses(["notice"]) + +filegroup( + name = "distribution", + srcs = glob(["**"]), + visibility = ["//python/private:__pkg__"], +) + +bzl_library( + name = "py_proto_library_bzl", + srcs = ["py_proto_library.bzl"], + visibility = ["//python:__pkg__"], + deps = [ + "//python:defs_bzl", + "@rules_proto//proto:defs", + ], +) + +proto_lang_toolchain( + name = "python_toolchain", + command_line = "--python_out=%s", + progress_message = "Generating Python proto_library %{label}", + runtime = "@com_google_protobuf//:protobuf_python", + # NOTE: This isn't *actually* public. It's an implicit dependency of py_proto_library, + # so must be public so user usages of the rule can reference it. + visibility = ["//visibility:public"], +) diff --git a/python/private/proto/py_proto_library.bzl b/python/private/proto/py_proto_library.bzl new file mode 100644 index 0000000000..e123ff8476 --- /dev/null +++ b/python/private/proto/py_proto_library.bzl @@ -0,0 +1,223 @@ +# 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. + +"""The implementation of the `py_proto_library` rule and its aspect.""" + +load("@rules_proto//proto:defs.bzl", "ProtoInfo", "proto_common") +load("//python:defs.bzl", "PyInfo") + +PY_PROTO_TOOLCHAIN = "@rules_python//python/proto:toolchain_type" + +_PyProtoInfo = provider( + doc = "Encapsulates information needed by the Python proto rules.", + fields = { + "imports": """ + (depset[str]) The field forwarding PyInfo.imports coming from + the proto language runtime dependency.""", + "runfiles_from_proto_deps": """ + (depset[File]) Files from the transitive closure implicit proto + dependencies""", + "transitive_sources": """(depset[File]) The Python sources.""", + }, +) + +def _filter_provider(provider, *attrs): + return [dep[provider] for attr in attrs for dep in attr if provider in dep] + +def _incompatible_toolchains_enabled(): + return getattr(proto_common, "INCOMPATIBLE_ENABLE_PROTO_TOOLCHAIN_RESOLUTION", False) + +def _py_proto_aspect_impl(target, ctx): + """Generates and compiles Python code for a proto_library. + + The function runs protobuf compiler on the `proto_library` target generating + a .py file for each .proto file. + + Args: + target: (Target) A target providing `ProtoInfo`. Usually this means a + `proto_library` target, but not always; you must expect to visit + non-`proto_library` targets, too. + ctx: (RuleContext) The rule context. + + Returns: + ([_PyProtoInfo]) Providers collecting transitive information about + generated files. + """ + _proto_library = ctx.rule.attr + + # Check Proto file names + for proto in target[ProtoInfo].direct_sources: + if proto.is_source and "-" in proto.dirname: + fail("Cannot generate Python code for a .proto whose path contains '-' ({}).".format( + proto.path, + )) + + if _incompatible_toolchains_enabled(): + toolchain = ctx.toolchains[PY_PROTO_TOOLCHAIN] + if not toolchain: + fail("No toolchains registered for '%s'." % PY_PROTO_TOOLCHAIN) + proto_lang_toolchain_info = toolchain.proto + else: + proto_lang_toolchain_info = getattr(ctx.attr, "_aspect_proto_toolchain")[proto_common.ProtoLangToolchainInfo] + + api_deps = [proto_lang_toolchain_info.runtime] + + generated_sources = [] + proto_info = target[ProtoInfo] + proto_root = proto_info.proto_source_root + if proto_info.direct_sources: + # Generate py files + generated_sources = proto_common.declare_generated_files( + actions = ctx.actions, + proto_info = proto_info, + extension = "_pb2.py", + name_mapper = lambda name: name.replace("-", "_").replace(".", "/"), + ) + + # Handles multiple repository and virtual import cases + if proto_root.startswith(ctx.bin_dir.path): + proto_root = proto_root[len(ctx.bin_dir.path) + 1:] + + plugin_output = ctx.bin_dir.path + "/" + proto_root + proto_root = ctx.workspace_name + "/" + proto_root + + proto_common.compile( + actions = ctx.actions, + proto_info = proto_info, + proto_lang_toolchain_info = proto_lang_toolchain_info, + generated_files = generated_sources, + plugin_output = plugin_output, + ) + + # Generated sources == Python sources + python_sources = generated_sources + + deps = _filter_provider(_PyProtoInfo, getattr(_proto_library, "deps", [])) + runfiles_from_proto_deps = depset( + transitive = [dep[DefaultInfo].default_runfiles.files for dep in api_deps] + + [dep.runfiles_from_proto_deps for dep in deps], + ) + transitive_sources = depset( + direct = python_sources, + transitive = [dep.transitive_sources for dep in deps], + ) + + return [ + _PyProtoInfo( + imports = depset( + # Adding to PYTHONPATH so the generated modules can be + # imported. This is necessary when there is + # strip_import_prefix, the Python modules are generated under + # _virtual_imports. But it's undesirable otherwise, because it + # will put the repo root at the top of the PYTHONPATH, ahead of + # directories added through `imports` attributes. + [proto_root] if "_virtual_imports" in proto_root else [], + transitive = [dep[PyInfo].imports for dep in api_deps] + [dep.imports for dep in deps], + ), + runfiles_from_proto_deps = runfiles_from_proto_deps, + transitive_sources = transitive_sources, + ), + ] + +_py_proto_aspect = aspect( + implementation = _py_proto_aspect_impl, + attrs = {} if _incompatible_toolchains_enabled() else { + "_aspect_proto_toolchain": attr.label( + default = ":python_toolchain", + ), + }, + attr_aspects = ["deps"], + required_providers = [ProtoInfo], + provides = [_PyProtoInfo], + toolchains = [PY_PROTO_TOOLCHAIN] if _incompatible_toolchains_enabled() else [], +) + +def _py_proto_library_rule(ctx): + """Merges results of `py_proto_aspect` in `deps`. + + Args: + ctx: (RuleContext) The rule context. + Returns: + ([PyInfo, DefaultInfo, OutputGroupInfo]) + """ + if not ctx.attr.deps: + fail("'deps' attribute mustn't be empty.") + + pyproto_infos = _filter_provider(_PyProtoInfo, ctx.attr.deps) + default_outputs = depset( + transitive = [info.transitive_sources for info in pyproto_infos], + ) + + return [ + DefaultInfo( + files = default_outputs, + default_runfiles = ctx.runfiles(transitive_files = depset( + transitive = + [default_outputs] + + [info.runfiles_from_proto_deps for info in pyproto_infos], + )), + ), + OutputGroupInfo( + default = depset(), + ), + PyInfo( + transitive_sources = default_outputs, + imports = depset(transitive = [info.imports for info in pyproto_infos]), + # Proto always produces 2- and 3- compatible source files + has_py2_only_sources = False, + has_py3_only_sources = False, + ), + ] + +py_proto_library = rule( + implementation = _py_proto_library_rule, + doc = """ + Use `py_proto_library` to generate Python libraries from `.proto` files. + + The convention is to name the `py_proto_library` rule `foo_py_pb2`, + when it is wrapping `proto_library` rule `foo_proto`. + + `deps` must point to a `proto_library` rule. + + Example: + +```starlark +py_library( + name = "lib", + deps = [":foo_py_pb2"], +) + +py_proto_library( + name = "foo_py_pb2", + deps = [":foo_proto"], +) + +proto_library( + name = "foo_proto", + srcs = ["foo.proto"], +) +```""", + attrs = { + "deps": attr.label_list( + doc = """ + The list of `proto_library` rules to generate Python libraries for. + + Usually this is just the one target: the proto library of interest. + It can be any target providing `ProtoInfo`.""", + providers = [ProtoInfo], + aspects = [_py_proto_aspect], + ), + }, + provides = [PyInfo], +) diff --git a/python/proto.bzl b/python/proto.bzl index 2ea9bdb153..3f455aee58 100644 --- a/python/proto.bzl +++ b/python/proto.bzl @@ -11,11 +11,11 @@ # 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. + """ Python proto library. """ -load("@com_google_protobuf//bazel:py_proto_library.bzl", _py_proto_library = "py_proto_library") +load("//python/private/proto:py_proto_library.bzl", _py_proto_library = "py_proto_library") -def py_proto_library(*, deprecation = "Use py_proto_library from protobuf repository", **kwargs): - _py_proto_library(deprecation = deprecation, **kwargs) +py_proto_library = _py_proto_library From 134e64dc7a48584666c33f10387004d5060c6e8c Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 11 Jun 2024 16:46:36 -0700 Subject: [PATCH 057/345] chore: refer to rules_python toolchain type target instead of bazel_tools (#1949) The `@rules_python//python:toolchain_type` target is just an alias to the bazel tools one, so this should be a no-op change. It's less confusing to use a consistent label than to have a mix of them. --- examples/pip_parse/BUILD.bazel | 2 +- python/current_py_toolchain.bzl | 6 ++++-- python/private/common/py_executable_bazel.bzl | 3 ++- tests/toolchains/defs.bzl | 5 +++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/examples/pip_parse/BUILD.bazel b/examples/pip_parse/BUILD.bazel index 367a795728..fd744a2836 100644 --- a/examples/pip_parse/BUILD.bazel +++ b/examples/pip_parse/BUILD.bazel @@ -24,7 +24,7 @@ load("@rules_python//python/entry_points:py_console_script_binary.bzl", "py_cons #toolchain( # name = "my_py_toolchain", # toolchain = ":my_py_runtime_pair", -# toolchain_type = "@bazel_tools//tools/python:toolchain_type", +# toolchain_type = "@rules_python//python:toolchain_type", #) # End of toolchain setup. diff --git a/python/current_py_toolchain.bzl b/python/current_py_toolchain.bzl index e3345cb646..f3ff2ace07 100644 --- a/python/current_py_toolchain.bzl +++ b/python/current_py_toolchain.bzl @@ -14,6 +14,8 @@ """Public entry point for current_py_toolchain rule.""" +load("//python/private:toolchain_types.bzl", "TARGET_TOOLCHAIN_TYPE") + def _current_py_toolchain_impl(ctx): toolchain = ctx.toolchains[ctx.attr._toolchain] @@ -50,9 +52,9 @@ current_py_toolchain = rule( """, implementation = _current_py_toolchain_impl, attrs = { - "_toolchain": attr.string(default = str(Label("@bazel_tools//tools/python:toolchain_type"))), + "_toolchain": attr.string(default = str(TARGET_TOOLCHAIN_TYPE)), }, toolchains = [ - str(Label("@bazel_tools//tools/python:toolchain_type")), + str(TARGET_TOOLCHAIN_TYPE), ], ) diff --git a/python/private/common/py_executable_bazel.bzl b/python/private/common/py_executable_bazel.bzl index 53d70f00b9..bc7f66b2db 100644 --- a/python/private/common/py_executable_bazel.bzl +++ b/python/private/common/py_executable_bazel.bzl @@ -16,6 +16,7 @@ load("@bazel_skylib//lib:dicts.bzl", "dicts") load("@bazel_skylib//lib:paths.bzl", "paths") load("//python/private:flags.bzl", "BootstrapImplFlag") +load("//python/private:toolchain_types.bzl", "TARGET_TOOLCHAIN_TYPE") load(":attributes_bazel.bzl", "IMPORTS_ATTRS") load( ":common.bzl", @@ -78,7 +79,7 @@ the `srcs` of Python targets as required. # GraphlessQueryTest.testLabelsOperator relies on it to test for # query behavior of implicit dependencies. "_py_toolchain_type": attr.label( - default = "@bazel_tools//tools/python:toolchain_type", + default = TARGET_TOOLCHAIN_TYPE, ), "_windows_launcher_maker": attr.label( default = "@bazel_tools//tools/launcher:launcher_maker", diff --git a/tests/toolchains/defs.bzl b/tests/toolchains/defs.bzl index bfc55199d3..723272d212 100644 --- a/tests/toolchains/defs.bzl +++ b/tests/toolchains/defs.bzl @@ -17,6 +17,7 @@ load("//python:versions.bzl", "PLATFORMS", "TOOL_VERSIONS") load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility +load("//python/private:toolchain_types.bzl", "TARGET_TOOLCHAIN_TYPE") # buildifier: disable=bzl-visibility _WINDOWS_RUNNER_TEMPLATE = """\ @ECHO OFF @@ -76,7 +77,7 @@ def _acceptance_test_impl(ctx): ) files.append(run_acceptance_test_py) - toolchain = ctx.toolchains["@bazel_tools//tools/python:toolchain_type"] + toolchain = ctx.toolchains[TARGET_TOOLCHAIN_TYPE] py3_runtime = toolchain.py3_runtime interpreter_path = py3_runtime.interpreter_path if not interpreter_path: @@ -164,7 +165,7 @@ _acceptance_test = rule( ), }, test = True, - toolchains = ["@bazel_tools//tools/python:toolchain_type"], + toolchains = [TARGET_TOOLCHAIN_TYPE], ) def acceptance_test(python_version, **kwargs): From 2a19374804a1794cf9ef03eed794b0a629ca8449 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Wed, 12 Jun 2024 10:28:09 +0900 Subject: [PATCH 058/345] chore: changelog changes for release 0.33.0 (#1950) --- CHANGELOG.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2ba32fd76..fd17633917 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,19 @@ A brief description of the categories of changes: [x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/x.x.x +### Changed +* Nothing yet + +### Fixed +* Nothing yet + +### Removed +* Nothing yet + +## [0.33.0] - 2024-06-12 + +[0.33.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.33.0 + ### Changed * (deps) Upgrade the `pip_install` dependencies to pick up a new version of pip. * (toolchains) Optional toolchain dependency: `py_binary`, `py_test`, and @@ -132,12 +145,11 @@ A brief description of the categories of changes: no wheels that are supported for the target platform, `rules_python` will fallback onto building the `sdist` from source. This behaviour can be disabled if desired using one of the available string flags as well. - -[precompile-docs]: /precompiling - * (whl_filegroup) Added a new `whl_filegroup` rule to extract files from a wheel file. This is useful to extract headers for use in a `cc_library`. +[precompile-docs]: /precompiling + ## [0.32.2] - 2024-05-14 [0.32.2]: https://github.com/bazelbuild/rules_python/releases/tag/0.32.2 From b07525cbb15352caefbe2f23697250cecd984430 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Thu, 13 Jun 2024 00:40:58 +0900 Subject: [PATCH 059/345] fix(rules): drop the unused argument (#1953) It seems that there is an extra argument that is there but I am not sure about the reason, it is most likely a leftover. As part of this change we add an analysis test for non-windows zip building. I could reproduce the failure and now the newly added test passes. Fixes #1954 --- CHANGELOG.md | 8 ++++ python/private/common/py_executable_bazel.bzl | 1 - tests/base_rules/py_executable_base_tests.bzl | 46 ++++++++++++++++++- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd17633917..9abbd44de0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,14 @@ A brief description of the categories of changes: ### Removed * Nothing yet +## [0.33.1] - 2024-06-13 + +[0.33.1]: https://github.com/bazelbuild/rules_python/releases/tag/0.33.1 + +### Fixed +* (py_binary) Fix building of zip file when using `--build_python_zip` + argument. Fixes [#1954](https://github.com/bazelbuild/rules_python/issues/1954). + ## [0.33.0] - 2024-06-12 [0.33.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.33.0 diff --git a/python/private/common/py_executable_bazel.bzl b/python/private/common/py_executable_bazel.bzl index bc7f66b2db..361e075a39 100644 --- a/python/private/common/py_executable_bazel.bzl +++ b/python/private/common/py_executable_bazel.bzl @@ -270,7 +270,6 @@ def _create_executable( ctx, output = executable, zip_file = zip_file, - python_binary_path = runtime_details.executable_interpreter_path, stage2_bootstrap = stage2_bootstrap, runtime_details = runtime_details, ) diff --git a/tests/base_rules/py_executable_base_tests.bzl b/tests/base_rules/py_executable_base_tests.bzl index 43e800a99f..c96ec4e108 100644 --- a/tests/base_rules/py_executable_base_tests.bzl +++ b/tests/base_rules/py_executable_base_tests.bzl @@ -20,7 +20,7 @@ load("@rules_testing//lib:truth.bzl", "matching") load("@rules_testing//lib:util.bzl", rt_util = "util") load("//tests/base_rules:base_tests.bzl", "create_base_tests") load("//tests/base_rules:util.bzl", "WINDOWS_ATTR", pt_util = "util") -load("//tests/support:support.bzl", "WINDOWS_X86_64") +load("//tests/support:support.bzl", "LINUX_X86_64", "WINDOWS_X86_64") _BuiltinPyRuntimeInfo = PyRuntimeInfo @@ -67,6 +67,50 @@ def _test_basic_windows_impl(env, target): _tests.append(_test_basic_windows) +def _test_basic_zip(name, config): + if rp_config.enable_pystar: + target_compatible_with = select({ + # Disable the new test on windows because we have _test_basic_windows. + "@platforms//os:windows": ["@platforms//:incompatible"], + "//conditions:default": [], + }) + else: + target_compatible_with = ["@platforms//:incompatible"] + rt_util.helper_target( + config.rule, + name = name + "_subject", + srcs = ["main.py"], + main = "main.py", + ) + analysis_test( + name = name, + impl = _test_basic_zip_impl, + target = name + "_subject", + config_settings = { + # NOTE: The default for this flag is based on the Bazel host OS, not + # the target platform. For windows, it defaults to true, so force + # it to that to match behavior when this test runs on other + # platforms. + "//command_line_option:build_python_zip": "true", + "//command_line_option:cpu": "linux_x86_64", + "//command_line_option:crosstool_top": Label("//tests/cc:cc_toolchain_suite"), + "//command_line_option:extra_toolchains": [str(Label("//tests/cc:all"))], + "//command_line_option:platforms": [LINUX_X86_64], + }, + attr_values = {"target_compatible_with": target_compatible_with}, + ) + +def _test_basic_zip_impl(env, target): + target = env.expect.that_target(target) + target.runfiles().contains_predicate(matching.str_endswith( + target.meta.format_str("/{name}.zip"), + )) + target.runfiles().contains_predicate(matching.str_endswith( + target.meta.format_str("/{name}"), + )) + +_tests.append(_test_basic_zip) + def _test_executable_in_runfiles(name, config): rt_util.helper_target( config.rule, From e682cd0e970e11d66931b9b4b70a7f50989e7789 Mon Sep 17 00:00:00 2001 From: Fabian Meumertzheim Date: Thu, 13 Jun 2024 18:14:00 +0200 Subject: [PATCH 060/345] fix: Remove transitive legacy struct provider usage (#1957) Makes `rules_python` compatible with `--incompatible_disallow_struct_provider_syntax`. Fixes #1956 --- .bazelrc | 3 +++ CHANGELOG.md | 2 +- MODULE.bazel | 2 +- examples/bzlmod/MODULE.bazel | 2 +- internal_deps.bzl | 7 +++---- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.bazelrc b/.bazelrc index 94cfb93350..3b915864ce 100644 --- a/.bazelrc +++ b/.bazelrc @@ -17,6 +17,9 @@ test --test_output=errors # Python targets as required. build --incompatible_default_to_explicit_init_py +# Ensure ongoing compatibility with this flag. +common --incompatible_disallow_struct_provider_syntax + # Windows makes use of runfiles for some rules build --enable_runfiles diff --git a/CHANGELOG.md b/CHANGELOG.md index 9abbd44de0..046e086fe8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ A brief description of the categories of changes: [x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/x.x.x ### Changed -* Nothing yet +* `protobuf`/`com_google_protobuf` dependency bumped to `v24.4` ### Fixed * Nothing yet diff --git a/MODULE.bazel b/MODULE.bazel index 53d845ed88..3cdc47fb7b 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -11,7 +11,7 @@ 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 = "21.7", repo_name = "com_google_protobuf") +bazel_dep(name = "protobuf", version = "24.4", repo_name = "com_google_protobuf") internal_deps = use_extension("//python/private/bzlmod:internal_deps.bzl", "internal_deps") use_repo( diff --git a/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel index 0d30161147..e46989e9fd 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -15,7 +15,7 @@ local_path_override( bazel_dep(name = "rules_proto", version = "5.3.0-21.7") # (py_proto_library specific) Add the protobuf library for well-known types (e.g. `Any`, `Timestamp`, etc) -bazel_dep(name = "protobuf", version = "21.7", repo_name = "com_google_protobuf") +bazel_dep(name = "protobuf", version = "24.4", repo_name = "com_google_protobuf") # We next initialize the python toolchain using the extension. # You can set different Python versions in this block. diff --git a/internal_deps.bzl b/internal_deps.bzl index 8818751644..56962cbd19 100644 --- a/internal_deps.bzl +++ b/internal_deps.bzl @@ -173,11 +173,10 @@ def rules_python_internal_deps(): http_archive( name = "com_google_protobuf", - sha256 = "75be42bd736f4df6d702a0e4e4d30de9ee40eac024c4b845d17ae4cc831fe4ae", - strip_prefix = "protobuf-21.7", + sha256 = "616bb3536ac1fff3fb1a141450fa28b875e985712170ea7f1bfe5e5fc41e2cd8", + strip_prefix = "protobuf-24.4", urls = [ - "https://mirror.bazel.build/github.com/protocolbuffers/protobuf/archive/v21.7.tar.gz", - "https://github.com/protocolbuffers/protobuf/archive/v21.7.tar.gz", + "https://github.com/protocolbuffers/protobuf/releases/download/v24.4/protobuf-24.4.tar.gz", ], ) From 53dee20d6728b67672cb04eeaa36113144031de0 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 13 Jun 2024 17:10:29 -0700 Subject: [PATCH 061/345] docs: fix doc for how to use new bootstrap impl (#1959) The target name and value were both incorrect. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 046e086fe8..4ba7045a70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -137,7 +137,7 @@ A brief description of the categories of changes: placeholder, just like the `python_default_visibility` directive does. * (rules) A new bootstrap implementation that doesn't require a system Python is available. It can be enabled by setting - {obj}`--@rules_python//python:config_settings:bootstrap_impl=two_phase`. It + {obj}`--@rules_python//python/config_settings:bootstrap_impl=script`. It will become the default in a subsequent release. ([#691](https://github.com/bazelbuild/rules_python/issues/691)) * (providers) `PyRuntimeInfo` has two new attributes: From ec86f20992ff01cca39afbe7b9b8520d4ed36402 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 13 Jun 2024 17:11:46 -0700 Subject: [PATCH 062/345] chore: various cleanups to make google imports/patching easier (#1958) * Make py_library doc customizable. * Correct a typo checkers are spammy about * Add missing bzl_library. I would have expected our docgen to have also noticed this, but it must be picking it up from another transitive dependency, while the Google tests don't get that. --- python/config_settings/BUILD.bazel | 10 +++++----- python/private/common/BUILD.bazel | 1 + python/private/common/py_library.bzl | 26 +++++++++++++++----------- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel index e2d2608c7c..2742d18977 100644 --- a/python/config_settings/BUILD.bazel +++ b/python/config_settings/BUILD.bazel @@ -33,7 +33,7 @@ string_flag( name = "precompile", build_setting_default = PrecompileFlag.AUTO, values = sorted(PrecompileFlag.__members__.values()), - # NOTE: Only public because its an implicit dependency + # NOTE: Only public because it's an implicit dependency visibility = ["//visibility:public"], ) @@ -41,7 +41,7 @@ string_flag( name = "precompile_source_retention", build_setting_default = PrecompileSourceRetentionFlag.KEEP_SOURCE, values = sorted(PrecompileSourceRetentionFlag.__members__.values()), - # NOTE: Only public because its an implicit dependency + # NOTE: Only public because it's an implicit dependency visibility = ["//visibility:public"], ) @@ -49,7 +49,7 @@ string_flag( name = "precompile_add_to_runfiles", build_setting_default = PrecompileAddToRunfilesFlag.ALWAYS, values = sorted(PrecompileAddToRunfilesFlag.__members__.values()), - # NOTE: Only public because its an implicit dependency + # NOTE: Only public because it's an implicit dependency visibility = ["//visibility:public"], ) @@ -57,7 +57,7 @@ string_flag( name = "pyc_collection", build_setting_default = PycCollectionFlag.DISABLED, values = sorted(PycCollectionFlag.__members__.values()), - # NOTE: Only public because its an implicit dependency + # NOTE: Only public because it's an implicit dependency visibility = ["//visibility:public"], ) @@ -65,7 +65,7 @@ string_flag( name = "bootstrap_impl", build_setting_default = BootstrapImplFlag.SYSTEM_PYTHON, values = sorted(BootstrapImplFlag.__members__.values()), - # NOTE: Only public because its an implicit dependency + # NOTE: Only public because it's an implicit dependency visibility = ["//visibility:public"], ) diff --git a/python/private/common/BUILD.bazel b/python/private/common/BUILD.bazel index e258f8a5eb..a415e0587e 100644 --- a/python/private/common/BUILD.bazel +++ b/python/private/common/BUILD.bazel @@ -35,6 +35,7 @@ bzl_library( "//python/private:enum_bzl", "//python/private:flags_bzl", "//python/private:reexports_bzl", + "//python/private:rules_cc_srcs_bzl", "@bazel_skylib//rules:common_settings", ], ) diff --git a/python/private/common/py_library.bzl b/python/private/common/py_library.bzl index b927a4fb9a..977bdb3312 100644 --- a/python/private/common/py_library.bzl +++ b/python/private/common/py_library.bzl @@ -102,6 +102,18 @@ def py_library_impl(ctx, *, semantics): create_output_group_info(py_info.transitive_sources, extra_groups = {}), ] +_DEFAULT_PY_LIBRARY_DOC = """ +A library of Python code that can be depended upon. + +Default outputs: +* The input Python sources +* The precompiled artifacts from the sources. + +NOTE: Precompilation affects which of the default outputs are included in the +resulting runfiles. See the precompile-related attributes and flags for +more information. +""" + def create_py_library_rule(*, attrs = {}, **kwargs): """Creates a py_library rule. @@ -111,6 +123,9 @@ def create_py_library_rule(*, attrs = {}, **kwargs): Returns: A rule object """ + + # Within Google, the doc attribute is overridden + kwargs.setdefault("doc", _DEFAULT_PY_LIBRARY_DOC) return rule( attrs = dicts.add(LIBRARY_ATTRS, attrs), toolchains = [ @@ -120,16 +135,5 @@ def create_py_library_rule(*, attrs = {}, **kwargs): # TODO(b/253818097): fragments=py is only necessary so that # RequiredConfigFragmentsTest passes fragments = ["py"], - doc = """ -A library of Python code that can be depended upon. - -Default outputs: -* The input Python sources -* The precompiled artifacts from the sources. - -NOTE: Precompilation affects which of the default outputs are included in the -resulting runfiles. See the precompile-related attributes and flags for -more information. -""", **kwargs ) From 5034cc12ccc2e2d6ff7b4c43dc95fd982c4a1b8f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 10:31:56 +0900 Subject: [PATCH 063/345] build(deps): bump idna from 3.4 to 3.7 in /tools/publish (#1849) Bumps [idna](https://github.com/kjd/idna) from 3.4 to 3.7.
Release notes

Sourced from idna's releases.

v3.7

What's Changed

  • Fix issue where specially crafted inputs to encode() could take exceptionally long amount of time to process. [CVE-2024-3651]

Thanks to Guido Vranken for reporting the issue.

Full Changelog: https://github.com/kjd/idna/compare/v3.6...v3.7

Changelog

Sourced from idna's changelog.

3.7 (2024-04-11) ++++++++++++++++

  • Fix issue where specially crafted inputs to encode() could take exceptionally long amount of time to process. [CVE-2024-3651]

Thanks to Guido Vranken for reporting the issue.

3.6 (2023-11-25) ++++++++++++++++

  • Fix regression to include tests in source distribution.

3.5 (2023-11-24) ++++++++++++++++

  • Update to Unicode 15.1.0
  • String codec name is now "idna2008" as overriding the system codec "idna" was not working.
  • Fix typing error for codec encoding
  • "setup.cfg" has been added for this release due to some downstream lack of adherence to PEP 517. Should be removed in a future release so please prepare accordingly.
  • Removed reliance on a symlink for the "idna-data" tool to comport with PEP 517 and the Python Packaging User Guide for sdist archives.
  • Added security reporting protocol for project

Thanks Jon Ribbens, Diogo Teles Sant'Anna, Wu Tingfeng for contributions to this release.

Commits
  • 1d365e1 Release v3.7
  • c1b3154 Merge pull request #172 from kjd/optimize-contextj
  • 0394ec7 Merge branch 'master' into optimize-contextj
  • cd58a23 Merge pull request #152 from elliotwutingfeng/dev
  • 5beb28b More efficient resolution of joiner contexts
  • 1b12148 Update ossf/scorecard-action to v2.3.1
  • d516b87 Update Github actions/checkout to v4
  • c095c75 Merge branch 'master' into dev
  • 60a0a4c Fix typo in GitHub Actions workflow key
  • 5918a0e Merge branch 'master' into dev
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=idna&package-manager=pip&previous-version=3.4&new-version=3.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/bazelbuild/rules_python/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/publish/requirements_darwin.txt | 6 +++--- tools/publish/requirements_windows.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/publish/requirements_darwin.txt b/tools/publish/requirements_darwin.txt index 5bf8544c0a..f6fae79529 100644 --- a/tools/publish/requirements_darwin.txt +++ b/tools/publish/requirements_darwin.txt @@ -106,9 +106,9 @@ docutils==0.19 \ --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ --hash=sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc # via readme-renderer -idna==3.4 \ - --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ - --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 +idna==3.7 \ + --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ + --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 # via requests importlib-metadata==6.0.0 \ --hash=sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad \ diff --git a/tools/publish/requirements_windows.txt b/tools/publish/requirements_windows.txt index 128c0b56b6..b171d3ffd9 100644 --- a/tools/publish/requirements_windows.txt +++ b/tools/publish/requirements_windows.txt @@ -106,9 +106,9 @@ docutils==0.19 \ --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ --hash=sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc # via readme-renderer -idna==3.4 \ - --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ - --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 +idna==3.7 \ + --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ + --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 # via requests importlib-metadata==6.0.0 \ --hash=sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad \ From 2c3df9094b3da02b6d6d027af8986fe843cfde2a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 01:40:09 +0000 Subject: [PATCH 064/345] build(deps): bump cryptography from 41.0.6 to 42.0.4 in /tools/publish (#1772) Bumps [cryptography](https://github.com/pyca/cryptography) from 41.0.6 to 42.0.4.
Changelog

Sourced from cryptography's changelog.

42.0.4 - 2024-02-20


* Fixed a null-pointer-dereference and segfault that could occur when
creating
a PKCS#12 bundle. Credit to **Alexander-Programming** for reporting the
  issue. **CVE-2024-26130**
* Fixed ASN.1 encoding for PKCS7/SMIME signed messages. The fields
``SMIMECapabilities``
and ``SignatureAlgorithmIdentifier`` should now be correctly encoded
according to the
  definitions in :rfc:`2633` :rfc:`3370`.

.. _v42-0-3:

42.0.3 - 2024-02-15

  • Fixed an initialization issue that caused key loading failures for some users.

.. _v42-0-2:

42.0.2 - 2024-01-30


* Updated Windows, macOS, and Linux wheels to be compiled with OpenSSL
3.2.1.
* Fixed an issue that prevented the use of Python buffer protocol
objects in
  ``sign`` and ``verify`` methods on asymmetric keys.
* Fixed an issue with incorrect keyword-argument naming with
``EllipticCurvePrivateKey``

:meth:`~cryptography.hazmat.primitives.asymmetric.ec.EllipticCurvePrivateKey.exchange`,
  ``X25519PrivateKey``

:meth:`~cryptography.hazmat.primitives.asymmetric.x25519.X25519PrivateKey.exchange`,
  ``X448PrivateKey``

:meth:`~cryptography.hazmat.primitives.asymmetric.x448.X448PrivateKey.exchange`,
  and ``DHPrivateKey``

:meth:`~cryptography.hazmat.primitives.asymmetric.dh.DHPrivateKey.exchange`.

.. _v42-0-1:

42.0.1 - 2024-01-24

  • Fixed an issue with incorrect keyword-argument naming with EllipticCurvePrivateKey :meth:~cryptography.hazmat.primitives.asymmetric.ec.EllipticCurvePrivateKey.sign.
  • Resolved compatibility issue with loading certain RSA public keys in :func:~cryptography.hazmat.primitives.serialization.load_pem_public_key.

.. _v42-0-0:

42.0.0 - 2024-01-22


</tr></table>

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=cryptography&package-manager=pip&previous-version=41.0.6&new-version=42.0.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/bazelbuild/rules_python/network/alerts).
--------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> --- tools/publish/requirements.txt | 57 ++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/tools/publish/requirements.txt b/tools/publish/requirements.txt index 0fda1bbb4e..2a9721df34 100644 --- a/tools/publish/requirements.txt +++ b/tools/publish/requirements.txt @@ -168,30 +168,39 @@ charset-normalizer==3.0.1 \ --hash=sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7 \ --hash=sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8 # via requests -cryptography==41.0.6 \ - --hash=sha256:068bc551698c234742c40049e46840843f3d98ad7ce265fd2bd4ec0d11306596 \ - --hash=sha256:0f27acb55a4e77b9be8d550d762b0513ef3fc658cd3eb15110ebbcbd626db12c \ - --hash=sha256:2132d5865eea673fe6712c2ed5fb4fa49dba10768bb4cc798345748380ee3660 \ - --hash=sha256:3288acccef021e3c3c10d58933f44e8602cf04dba96d9796d70d537bb2f4bbc4 \ - --hash=sha256:35f3f288e83c3f6f10752467c48919a7a94b7d88cc00b0668372a0d2ad4f8ead \ - --hash=sha256:398ae1fc711b5eb78e977daa3cbf47cec20f2c08c5da129b7a296055fbb22aed \ - --hash=sha256:422e3e31d63743855e43e5a6fcc8b4acab860f560f9321b0ee6269cc7ed70cc3 \ - --hash=sha256:48783b7e2bef51224020efb61b42704207dde583d7e371ef8fc2a5fb6c0aabc7 \ - --hash=sha256:4d03186af98b1c01a4eda396b137f29e4e3fb0173e30f885e27acec8823c1b09 \ - --hash=sha256:5daeb18e7886a358064a68dbcaf441c036cbdb7da52ae744e7b9207b04d3908c \ - --hash=sha256:60e746b11b937911dc70d164060d28d273e31853bb359e2b2033c9e93e6f3c43 \ - --hash=sha256:742ae5e9a2310e9dade7932f9576606836ed174da3c7d26bc3d3ab4bd49b9f65 \ - --hash=sha256:7e00fb556bda398b99b0da289ce7053639d33b572847181d6483ad89835115f6 \ - --hash=sha256:85abd057699b98fce40b41737afb234fef05c67e116f6f3650782c10862c43da \ - --hash=sha256:8efb2af8d4ba9dbc9c9dd8f04d19a7abb5b49eab1f3694e7b5a16a5fc2856f5c \ - --hash=sha256:ae236bb8760c1e55b7a39b6d4d32d2279bc6c7c8500b7d5a13b6fb9fc97be35b \ - --hash=sha256:afda76d84b053923c27ede5edc1ed7d53e3c9f475ebaf63c68e69f1403c405a8 \ - --hash=sha256:b27a7fd4229abef715e064269d98a7e2909ebf92eb6912a9603c7e14c181928c \ - --hash=sha256:b648fe2a45e426aaee684ddca2632f62ec4613ef362f4d681a9a6283d10e079d \ - --hash=sha256:c5a550dc7a3b50b116323e3d376241829fd326ac47bc195e04eb33a8170902a9 \ - --hash=sha256:da46e2b5df770070412c46f87bac0849b8d685c5f2679771de277a422c7d0b86 \ - --hash=sha256:f39812f70fc5c71a15aa3c97b2bbe213c3f2a460b79bd21c40d033bb34a9bf36 \ - --hash=sha256:ff369dd19e8fe0528b02e8df9f2aeb2479f89b1270d90f96a63500afe9af5cae +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 \ From f8ae19d012927ade5df446a7c84555b4426f36d6 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 14 Jun 2024 11:21:52 +0900 Subject: [PATCH 065/345] ci: add a custom dependabot file (#1960) This way the requirements files in the examples and tests are not managed, which should reduce the PR noise. --- .github/dependabot.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..9632f4e3d3 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,17 @@ +--- +version: 2 +updates: + # Maintain dependencies for GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + + - package-ecosystem: "pip" + directories: + # Maintain dependencies for our tools + - "/docs/sphinx" + - "/tools/publish" + schedule: + interval: "weekly" + open-pull-requests-limit: 3 From 9576016eb5847d75e258b9763614cece68ab2e46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 02:43:15 +0000 Subject: [PATCH 066/345] build(deps): bump pygments from 2.17.2 to 2.18.0 in /docs/sphinx (#1966) Bumps [pygments](https://github.com/pygments/pygments) from 2.17.2 to 2.18.0.
Release notes

Sourced from pygments's releases.

2.18.0

  • New lexers:

  • Updated lexers:

    • Awk: recognize ternary operator (#2687)
    • Bash: add openrc alias (#2599, #2371)
    • Coq: add keywords, lex more vernacular command arguments, produce fewer tokens on heading comments (#2678)
    • DNS zone files: Fix comment parsing (#2595)
    • Hy: Support unicode literals (#1126)
    • Inform6: Update to Inform 6.42 (#2644)
    • lean: Fix name handling (#2614)
    • Logtalk: add uninstantiation keyword and recognize escape sequences (#2619)
    • Macaulay2: Update to 1.23 (#2655)
    • Python: fix highlighting of soft keywords before None/True/False
    • reStructuredText: use Token.Comment for comments instead of Comment.Preproc (#2598)
    • Rust: highlight :, :: and -> as Punctuation and whitespace as Whitespace, instead of Text in both cases (#2631)
    • Spice: Add keywords (#2621)
    • SQL Explain: allow negative numbers (#2610)
    • Swift: Support multiline strings (#2681)
    • ThingsDB: add constants and new functions; support template strings (#2624)
    • UL4: support nested <?doc?> and <?note?> tags (#2597)
    • VHDL: support multi-line comments of VHDL-2008 (#2622)
    • Wikitext: Remove kk-* in variant_langs (#2647)
    • Xtend: Add val and var (#2602)
  • New styles:

  • Make background colors in the image formatter work with Pillow 10.0 (#2623)

  • Require Python 3.8. As a result, the importlib-metadata package is no longer needed for fast plugin discovery on Python 3.7. The plugins extra (used as, e.g., pip install pygments[plugins])

... (truncated)

Changelog

Sourced from pygments's changelog.

Version 2.18.0

(released May 4th, 2024)

  • New lexers:

  • Updated lexers:

    • Awk: recognize ternary operator (#2687)
    • Bash: add openrc alias (#2599, #2371)
    • Coq: add keywords, lex more vernacular command arguments, produce fewer tokens on heading comments (#2678)
    • DNS zone files: Fix comment parsing (#2595)
    • Hy: Support unicode literals (#1126)
    • Inform6: Update to Inform 6.42 (#2644)
    • lean: Fix name handling (#2614)
    • Logtalk: add uninstantiation keyword and recognize escape sequences (#2619)
    • Macaulay2: Update to 1.23 (#2655)
    • Python: fix highlighting of soft keywords before None/True/False
    • reStructuredText: use Token.Comment for comments instead of Comment.Preproc (#2598)
    • Rust: highlight :, :: and -> as Punctuation and whitespace as Whitespace, instead of Text in both cases (#2631)
    • Spice: Add keywords (#2621)
    • SQL Explain: allow negative numbers (#2610)
    • Swift: Support multiline strings (#2681)
    • ThingsDB: add constants and new functions; support template strings (#2624)
    • UL4: support nested <?doc?> and <?note?> tags (#2597)
    • VHDL: support multi-line comments of VHDL-2008 (#2622)
    • Wikitext: Remove kk-* in variant_langs (#2647)
    • Xtend: Add val and var (#2602)
  • New styles:

  • Make background colors in the image formatter work with Pillow 10.0 (#2623)

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pygments&package-manager=pip&previous-version=2.17.2&new-version=2.18.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/sphinx/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/sphinx/requirements.txt b/docs/sphinx/requirements.txt index d7c90573af..1cddcf2a6b 100644 --- a/docs/sphinx/requirements.txt +++ b/docs/sphinx/requirements.txt @@ -220,9 +220,9 @@ packaging==23.2 \ # via # readthedocs-sphinx-ext # sphinx -pygments==2.17.2 \ - --hash=sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c \ - --hash=sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367 +pygments==2.18.0 \ + --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ + --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a # via sphinx pyyaml==6.0.1 \ --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ From df375ff23d421ece29812af38be2e051f1712501 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 13:18:26 +0900 Subject: [PATCH 067/345] build(deps): bump actions/checkout from 2 to 4 (#1961) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 4.
Release notes

Sourced from actions/checkout's releases.

v4.0.0

What's Changed

New Contributors

Full Changelog: https://github.com/actions/checkout/compare/v3...v4.0.0

v3.6.0

What's Changed

New Contributors

Full Changelog: https://github.com/actions/checkout/compare/v3.5.3...v3.6.0

v3.5.3

What's Changed

New Contributors

Full Changelog: https://github.com/actions/checkout/compare/v3...v3.5.3

v3.5.2

What's Changed

Full Changelog: https://github.com/actions/checkout/compare/v3.5.1...v3.5.2

v3.5.1

What's Changed

New Contributors

... (truncated)

Changelog

Sourced from actions/checkout's changelog.

Changelog

v4.1.7

v4.1.6

v4.1.5

v4.1.4

v4.1.3

v4.1.2

v4.1.1

v4.1.0

v4.0.0

v3.6.0

v3.5.3

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=2&new-version=4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/mypy.yaml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/mypy.yaml b/.github/workflows/mypy.yaml index b0d0cdff1b..429775172e 100644 --- a/.github/workflows/mypy.yaml +++ b/.github/workflows/mypy.yaml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-20.04 steps: # Checkout the code - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - uses: jpetrucciani/mypy-check@master with: requirements: 1.6.0 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index eb23bc8411..edaa06115b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Create release archive and notes run: .github/workflows/create_archive_and_notes.sh - name: Publish wheel dist From 2cd450fca89f4915092f33921c99cd8a984f72c8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 13:19:45 +0900 Subject: [PATCH 068/345] build(deps): bump actions/stale from 3 to 9 (#1962) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/stale](https://github.com/actions/stale) from 3 to 9.
Release notes

Sourced from actions/stale's releases.

v9.0.0

Breaking Changes

  1. Action is now stateful: If the action ends because of operations-per-run then the next run will start from the first unprocessed issue skipping the issues processed during the previous run(s). The state is reset when all the issues are processed. This should be considered for scheduling workflow runs.
  2. Version 9 of this action updated the runtime to Node.js 20. All scripts are now run with Node.js 20 instead of Node.js 16 and are affected by any breaking changes between Node.js 16 and 20.

What Else Changed

  1. Performance optimization that removes unnecessary API calls by @​dsame #1033 fixes #792
  2. Logs displaying current github API rate limit by @​dsame #1032 addresses #1029

For more information, please read the action documentation and its section about statefulness

New Contributors

Full Changelog: https://github.com/actions/stale/compare/v8...v9.0.0

v8.0.0

:warning: This version contains breaking changes :warning:

What's Changed

Breaking Changes

  • In this release we prevent scenarios when the build is not interrupted on some exceptions, which led to successful builds when they are supposed to fail

Example

name: 'Remove labels when the issue or PR becomes
stale'
on:
  schedule:
    - cron: '30 1 * * *'

permissions: pull-requests: write

jobs: stale: runs-on: ubuntu-latest steps: - uses: actions/stale@v8 with: labels-to-remove-when-stale: 'label1,label2'

v7.0.0

... (truncated)

Changelog

Sourced from actions/stale's changelog.

Changelog

[7.0.0]

:warning: Breaking change :warning:

[6.0.1]

Update @​actions/core to v1.10.0 (#839)

[6.0.0]

:warning: Breaking change :warning:

Issues/PRs default close-issue-reason is now not_planned(#789)

[5.1.0]

Don't process stale issues right after they're marked stale [Add close-issue-reason option]#764#772 Various dependabot/dependency updates

4.1.0 (2021-07-14)

Features

4.0.0 (2021-07-14)

Features

Bug Fixes

  • dry-run: forbid mutations in dry-run (#500) (f1017f3), closes #499
  • logs: coloured logs (#465) (5fbbfba)
  • operations: fail fast the current batch to respect the operations limit (#474) (5f6f311), closes #466
  • label comparison: make label comparison case insensitive #517, closes #516
  • filtering comments by actor could have strange behavior: "stale" comments are now detected based on if the message is the stale message not who made the comment(#519), fixes #441, #509, #518

Breaking Changes

... (truncated)

Commits
  • 28ca103 Upgrade Node to v20 (#1110)
  • b69b346 build(deps-dev): bump @​types/node from 18.16.18 to 20.5.1 (#1079)
  • 88a6f4f build(deps-dev): bump typescript from 5.1.3 to 5.2.2 (#1083)
  • 796531a Merge pull request #1080 from akv-platform/fix-delete-cache
  • 8986f62 Don not try to delete cache if it does not exists
  • cab99b3 fix typo proceeded/processed
  • 184e7af Merge pull request #1064 from actions/dependabot/npm_and_yarn/typescript-esli...
  • 523885c chore: update eslint-plugin, parser and eslint-plugin-jest
  • 2487a1d build(deps-dev): bump @​typescript-eslint/eslint-plugin
  • 60c722e Merge pull request #1063 from actions/dependabot/npm_and_yarn/jest-29.6.2
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/stale&package-manager=github_actions&previous-version=3&new-version=9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 8d388e2f7a..d37121b0da 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -26,7 +26,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/stale@v3 + - uses: actions/stale@v9 with: repo-token: ${{ secrets.GITHUB_TOKEN }} From 177847d0328e923b869264e45f8041b27b830ced Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 04:24:24 +0000 Subject: [PATCH 069/345] build(deps): bump markupsafe from 2.1.3 to 2.1.5 in /docs/sphinx (#1964) Bumps [markupsafe](https://github.com/pallets/markupsafe) from 2.1.3 to 2.1.5.
Release notes

Sourced from markupsafe's releases.

2.1.5

This is a fix release for the 2.1.x feature release branch. It fixes bugs but does not otherwise change behavior and should not result in breaking changes.

Fixes a regression in striptags behavior from 2.14. Spaces are now collapsed correctly.

2.1.4

This is a fix release for the 2.1.x feature release branch. It fixes bugs but does not otherwise change behavior and should not result in breaking changes.

Changelog

Sourced from markupsafe's changelog.

Version 2.1.5

Released 2024-02-02

  • Fix striptags not collapsing spaces. :issue:417

Version 2.1.4

Released 2024-01-19

  • Don't use regular expressions for striptags, avoiding a performance issue. :pr:413
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=markupsafe&package-manager=pip&previous-version=2.1.3&new-version=2.1.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/sphinx/requirements.txt | 122 +++++++++++++++++------------------ 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/docs/sphinx/requirements.txt b/docs/sphinx/requirements.txt index 1cddcf2a6b..6ed2418ee8 100644 --- a/docs/sphinx/requirements.txt +++ b/docs/sphinx/requirements.txt @@ -140,67 +140,67 @@ markdown-it-py==3.0.0 \ # via # mdit-py-plugins # myst-parser -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 +markupsafe==2.1.5 \ + --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ + --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ + --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ + --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ + --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ + --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ + --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ + --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \ + --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ + --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ + --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \ + --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \ + --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \ + --hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \ + --hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \ + --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \ + --hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \ + --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \ + --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \ + --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \ + --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \ + --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \ + --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \ + --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \ + --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \ + --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \ + --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \ + --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \ + --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \ + --hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \ + --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \ + --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \ + --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \ + --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \ + --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ + --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ + --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \ + --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ + --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ + --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ + --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \ + --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \ + --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \ + --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \ + --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \ + --hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \ + --hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \ + --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \ + --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ + --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \ + --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \ + --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \ + --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \ + --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \ + --hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \ + --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \ + --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \ + --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \ + --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ + --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 # via jinja2 mdit-py-plugins==0.4.0 \ --hash=sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9 \ From 7a437cc94ff722d8c088ab6140b0cd940d28c4d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 14:40:28 +0900 Subject: [PATCH 070/345] build(deps): bump softprops/action-gh-release from 1 to 2 (#1963) Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 1 to 2.
Release notes

Sourced from softprops/action-gh-release's releases.

v2.0.0

  • update actions.yml declaration to node20 to address warnings
Changelog

Sourced from softprops/action-gh-release's changelog.

0.1.12

  • fix bug leading to empty strings subsituted for inputs users don't provide breaking api calls #144
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=softprops/action-gh-release&package-manager=github_actions&previous-version=1&new-version=2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index edaa06115b..96624b347a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -37,7 +37,7 @@ jobs: TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} run: bazel run --stamp --embed_label=${{ github.ref_name }} //python/runfiles:wheel.publish - name: Release - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 with: # Use GH feature to populate the changelog automatically generate_release_notes: true From 82054683dd7ecd6db2304e8a26e6b1b6f2497da9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 15 Jun 2024 00:02:35 +0000 Subject: [PATCH 071/345] build(deps): bump typing-extensions from 4.9.0 to 4.12.2 in /docs/sphinx (#1965) Bumps [typing-extensions](https://github.com/python/typing_extensions) from 4.9.0 to 4.12.2.
Release notes

Sourced from typing-extensions's releases.

4.12.2

  • Fix regression in v4.12.0 where specialization of certain generics with an overridden __eq__ method would raise errors. Patch by Jelle Zijlstra.
  • Fix tests so they pass on 3.13.0b2

4.12.1

  • Preliminary changes for compatibility with the draft implementation of PEP 649 in Python 3.14. Patch by Jelle Zijlstra.
  • Fix regression in v4.12.0 where nested Annotated types would cause TypeError to be raised if the nested Annotated type had unhashable metadata. Patch by Alex Waygood.

4.12.0

This release focuses on compatibility with the upcoming release of Python 3.13. Most changes are related to the implementation of type parameter defaults (PEP 696).

Thanks to all of the people who contributed patches, especially Alex Waygood, who did most of the work adapting typing-extensions to the CPython PEP 696 implementation.

There is a single change since 4.12.0rc1:

  • Fix incorrect behaviour of typing_extensions.ParamSpec on Python 3.8 and 3.9 that meant that isinstance(typing_extensions.ParamSpec("P"), typing.TypeVar) would have a different result in some situations depending on whether or not a profiling function had been set using sys.setprofile. Patch by Alex Waygood.

Changes included in 4.12.0rc1:

  • Improve the implementation of type parameter defaults (PEP 696)
    • Backport the typing.NoDefault sentinel object from Python 3.13. TypeVars, ParamSpecs and TypeVarTuples without default values now have their __default__ attribute set to this sentinel value.
    • TypeVars, ParamSpecs and TypeVarTuples now have a has_default() method, matching typing.TypeVar, typing.ParamSpec and typing.TypeVarTuple on Python 3.13+.
    • TypeVars, ParamSpecs and TypeVarTuples with default=None passed to their constructors now have their __default__ attribute set to None at runtime rather than types.NoneType.
    • Fix most tests for TypeVar, ParamSpec and TypeVarTuple on Python 3.13.0b1 and newer.
    • Backport CPython PR #118774, allowing type parameters without default values to follow those with default values in some type parameter lists. Patch by Alex Waygood, backporting a CPython PR by Jelle Zijlstra.
    • It is now disallowed to use a TypeVar with a default value after a TypeVarTuple in a type parameter list. This matches the CPython implementation of PEP 696 on Python 3.13+.
    • Fix bug in PEP-696 implementation where a default value for a ParamSpec

... (truncated)

Changelog

Sourced from typing-extensions's changelog.

Release 4.12.2 (June 7, 2024)

  • Add typing_extensions.get_annotations, a backport of inspect.get_annotations that adds features specified by PEP 649. Patch by Jelle Zijlstra.
  • Fix regression in v4.12.0 where specialization of certain generics with an overridden __eq__ method would raise errors. Patch by Jelle Zijlstra.
  • Fix tests so they pass on 3.13.0b2

Release 4.12.1 (June 1, 2024)

  • Preliminary changes for compatibility with the draft implementation of PEP 649 in Python 3.14. Patch by Jelle Zijlstra.
  • Fix regression in v4.12.0 where nested Annotated types would cause TypeError to be raised if the nested Annotated type had unhashable metadata. Patch by Alex Waygood.

Release 4.12.0 (May 23, 2024)

This release is mostly the same as 4.12.0rc1 but fixes one more longstanding bug.

  • Fix incorrect behaviour of typing_extensions.ParamSpec on Python 3.8 and 3.9 that meant that isinstance(typing_extensions.ParamSpec("P"), typing.TypeVar) would have a different result in some situations depending on whether or not a profiling function had been set using sys.setprofile. Patch by Alex Waygood.

Release 4.12.0rc1 (May 16, 2024)

This release focuses on compatibility with the upcoming release of Python 3.13. Most changes are related to the implementation of type parameter defaults (PEP 696).

Thanks to all of the people who contributed patches, especially Alex Waygood, who did most of the work adapting typing-extensions to the CPython PEP 696 implementation.

Full changelog:

  • Improve the implementation of type parameter defaults (PEP 696)
    • Backport the typing.NoDefault sentinel object from Python 3.13. TypeVars, ParamSpecs and TypeVarTuples without default values now have their __default__ attribute set to this sentinel value.
    • TypeVars, ParamSpecs and TypeVarTuples now have a has_default() method, matching typing.TypeVar, typing.ParamSpec and typing.TypeVarTuple on Python 3.13+.
    • TypeVars, ParamSpecs and TypeVarTuples with default=None passed to their constructors now have their __default__ attribute set to None

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=typing-extensions&package-manager=pip&previous-version=4.9.0&new-version=4.12.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/sphinx/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/sphinx/requirements.txt b/docs/sphinx/requirements.txt index 6ed2418ee8..aefa1a4d07 100644 --- a/docs/sphinx/requirements.txt +++ b/docs/sphinx/requirements.txt @@ -335,9 +335,9 @@ sphinxcontrib-serializinghtml==1.1.9 \ --hash=sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54 \ --hash=sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1 # via sphinx -typing-extensions==4.9.0 \ - --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ - --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd +typing-extensions==4.12.2 \ + --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ + --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 # via rules_python_docs (docs/sphinx/pyproject.toml) urllib3==2.1.0 \ --hash=sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3 \ From 7f1d59e750ba510dcbc985e8cd94413b5434981e Mon Sep 17 00:00:00 2001 From: Jeremy Volkman Date: Sat, 15 Jun 2024 21:14:40 -0700 Subject: [PATCH 072/345] fix(bzlmod): use same target in requirement('foo') and all_requirements (#1973) We have at least one instance in our pre-bzlmod workspace like: ``` deps = list(all_requirements) deps.remove(requirement('foo')) ``` But when using bzlmod, the generated `all_requirements` list contains targets like `@@rules_python~~pip~my_deps//sqlalchemy:sqlalchemy`, whereas `requirement('sqlalchemy')` will return `@@rules_python~~pip~my_deps//sqlalchemy:pkg`. So this operation now fails. This change makes `all_requirements` also use the `:pkg` targets to match `requirement`. --- CHANGELOG.md | 2 +- python/private/bzlmod/pip_repository.bzl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ba7045a70..e39239418a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,7 +28,7 @@ A brief description of the categories of changes: * `protobuf`/`com_google_protobuf` dependency bumped to `v24.4` ### Fixed -* Nothing yet +* (bzlmod): Targets in `all_requirements` now use the same form as targets returned by the `requirement` macro. ### Removed * Nothing yet diff --git a/python/private/bzlmod/pip_repository.bzl b/python/private/bzlmod/pip_repository.bzl index 0f962031d6..d42eb8b056 100644 --- a/python/private/bzlmod/pip_repository.bzl +++ b/python/private/bzlmod/pip_repository.bzl @@ -55,7 +55,7 @@ def _pip_repository_impl(rctx): for p in bzl_packages ]), "%%ALL_REQUIREMENTS%%": render.list([ - macro_tmpl.format(p, p) + macro_tmpl.format(p, "pkg") for p in bzl_packages ]), "%%ALL_WHL_REQUIREMENTS_BY_PACKAGE%%": render.dict({ From fce7354d2104581c90b7b6289347e730ecb72eda Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 17 Jun 2024 22:05:28 +0900 Subject: [PATCH 073/345] refactor(bzlmod): generate fewer targets for pip_config_settings (#1974) Remove the `python_version` from `flag_values` and reduces the number of targets we create by a lot because we no longer need to create all of the micro version combinations to also match when we want to match e.g. 3.10 on a particular platform by using a trick I've learned in #1968: ```starlark select({ "is_python_3.x": "my_config_setting" "//conditions:default": "is_python_3.x" }) ``` Then further optimization was done on how we create the aliases and config settings and optimizing the usage of `pip_whl` flag finally reduced the internal number targets. The number config settings targets in `//tests/private/pip_config_settings/...` where we have multiple python versions has changed: * `:is_*` - from **995** to **996** (the extra addition being is_python_default). * `:_.*is_*` - from **28272** to **2480** (just python version) and then to **496** (final). Work towards #260 --- CHANGELOG.md | 2 + python/config_settings/BUILD.bazel | 27 ++ python/private/config_settings.bzl | 8 + python/private/pip_config_settings.bzl | 255 ++++++++---------- python/private/pip_flags.bzl | 1 + .../render_pkg_aliases_test.bzl | 6 +- 6 files changed, 149 insertions(+), 150 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e39239418a..af8394b5f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,8 @@ A brief description of the categories of changes: ### Changed * `protobuf`/`com_google_protobuf` dependency bumped to `v24.4` +* (bzlmod): optimize the creation of config settings used in pip to + reduce the total number of targets in the hub repo. ### Fixed * (bzlmod): Targets in `all_requirements` now use the same form as targets returned by the `requirement` macro. diff --git a/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel index 2742d18977..73e6ef941b 100644 --- a/python/config_settings/BUILD.bazel +++ b/python/config_settings/BUILD.bazel @@ -88,6 +88,33 @@ string_flag( visibility = ["//visibility:public"], ) +config_setting( + name = "is_pip_whl_auto", + flag_values = { + ":pip_whl": UseWhlFlag.AUTO, + }, + # NOTE: Only public because it is used in pip hub repos. + visibility = ["//visibility:public"], +) + +config_setting( + name = "is_pip_whl_no", + flag_values = { + ":pip_whl": UseWhlFlag.NO, + }, + # NOTE: Only public because it is used in pip hub repos. + visibility = ["//visibility:public"], +) + +config_setting( + name = "is_pip_whl_only", + flag_values = { + ":pip_whl": UseWhlFlag.ONLY, + }, + # NOTE: Only public because it is used in pip hub repos. + visibility = ["//visibility:public"], +) + string_flag( name = "pip_whl_osx_arch", build_setting_default = UniversalWhlFlag.ARCH, diff --git a/python/private/config_settings.bzl b/python/private/config_settings.bzl index 92b96b3264..0537655a47 100644 --- a/python/private/config_settings.bzl +++ b/python/private/config_settings.bzl @@ -181,6 +181,14 @@ def construct_config_settings(name = None): # buildifier: disable=function-docs visibility = ["//visibility:public"], ) + native.config_setting( + name = "is_python_version_unset", + flag_values = { + Label("//python/config_settings:python_version"): "", + }, + visibility = ["//visibility:public"], + ) + for version, matching_versions in VERSION_FLAG_VALUES.items(): is_python_config_setting( name = "is_python_{}".format(version), diff --git a/python/private/pip_config_settings.bzl b/python/private/pip_config_settings.bzl index 2fe3c87a10..b13b39b725 100644 --- a/python/private/pip_config_settings.bzl +++ b/python/private/pip_config_settings.bzl @@ -39,12 +39,10 @@ Note, that here the specialization of musl vs manylinux wheels is the same in order to ensure that the matching fails if the user requests for `musl` and we don't have it or vice versa. """ -load(":config_settings.bzl", "is_python_config_setting") load( ":pip_flags.bzl", "INTERNAL_FLAGS", "UniversalWhlFlag", - "UseWhlFlag", "WhlLibcFlag", ) @@ -53,12 +51,14 @@ FLAGS = struct( f: str(Label("//python/config_settings:" + f)) for f in [ "python_version", - "pip_whl", "pip_whl_glibc_version", "pip_whl_muslc_version", "pip_whl_osx_arch", "pip_whl_osx_version", "py_linux_libc", + "is_pip_whl_no", + "is_pip_whl_only", + "is_pip_whl_auto", ] } ) @@ -82,8 +82,7 @@ def pip_config_settings( target_platforms = [], name = None, visibility = None, - alias_rule = None, - config_setting_rule = None): + native = native): """Generate all of the pip config settings. Args: @@ -100,10 +99,9 @@ def pip_config_settings( constraint values for each condition. visibility (list[str], optional): The visibility to be passed to the exposed labels. All other labels will be private. - alias_rule (rule): The alias rule to use for creating the - objects. Can be overridden for unit tests reasons. - config_setting_rule (rule): The config setting rule to use for creating the - objects. Can be overridden for unit tests reasons. + native (struct): The struct containing alias and config_setting rules + to use for creating the objects. Can be overridden for unit tests + reasons. """ glibc_versions = [""] + glibc_versions @@ -114,43 +112,25 @@ def pip_config_settings( for t in target_platforms ] - alias_rule = alias_rule or native.alias - - for version in python_versions: - is_python = "is_python_{}".format(version) - alias_rule( + for python_version in [""] + python_versions: + is_python = "is_python_{}".format(python_version or "version_unset") + native.alias( name = is_python, actual = Label("//python/config_settings:" + is_python), visibility = visibility, ) - for os, cpu in target_platforms: - constraint_values = [] - suffix = "" - if os: - constraint_values.append("@platforms//os:" + os) - suffix += "_" + os - if cpu: - constraint_values.append("@platforms//cpu:" + cpu) - suffix += "_" + cpu - - _sdist_config_setting( - name = "sdist" + suffix, - constraint_values = constraint_values, - visibility = visibility, - config_setting_rule = config_setting_rule, - ) - for python_version in python_versions: - _sdist_config_setting( - name = "cp{}_sdist{}".format(python_version, suffix), - python_version = python_version, - constraint_values = constraint_values, - visibility = visibility, - config_setting_rule = config_setting_rule, - ) - - for python_version in [""] + python_versions: - _whl_config_settings( + for os, cpu in target_platforms: + constraint_values = [] + suffix = "" + if os: + constraint_values.append("@platforms//os:" + os) + suffix += "_" + os + if cpu: + constraint_values.append("@platforms//cpu:" + cpu) + suffix += "_" + cpu + + _dist_config_settings( suffix = suffix, plat_flag_values = _plat_flag_values( os = os, @@ -161,34 +141,45 @@ def pip_config_settings( ), constraint_values = constraint_values, python_version = python_version, + is_python = is_python, visibility = visibility, - config_setting_rule = config_setting_rule, + native = native, ) -def _whl_config_settings(*, suffix, plat_flag_values, **kwargs): - # With the following three we cover different per-version wheels - python_version = kwargs.get("python_version") - py = "cp{}_py".format(python_version) if python_version else "py" - pycp = "cp{}_cp3x".format(python_version) if python_version else "cp3x" - - flag_values = {} - - for n, f in { - "{}_none_any{}".format(py, suffix): None, - "{}3_none_any{}".format(py, suffix): _flags.whl_py3, - "{}3_abi3_any{}".format(py, suffix): _flags.whl_py3_abi3, - "{}_none_any{}".format(pycp, suffix): _flags.whl_pycp3x, - "{}_abi3_any{}".format(pycp, suffix): _flags.whl_pycp3x_abi3, - "{}_cp_any{}".format(pycp, suffix): _flags.whl_pycp3x_abicp, - }.items(): - if f and f in flag_values: - fail("BUG") - elif f: +def _dist_config_settings(*, suffix, plat_flag_values, **kwargs): + flag_values = {_flags.dist: ""} + + # First create an sdist, we will be building upon the flag values, which + # will ensure that each sdist config setting is the least specialized of + # all. However, we need at least one flag value to cover the case where we + # have `sdist` for any platform, hence we have a non-empty `flag_values` + # here. + _dist_config_setting( + name = "sdist{}".format(suffix), + flag_values = flag_values, + is_pip_whl = FLAGS.is_pip_whl_no, + **kwargs + ) + + for name, f in [ + ("py_none", _flags.whl_py2_py3), + ("py3_none", _flags.whl_py3), + ("py3_abi3", _flags.whl_py3_abi3), + ("cp3x_none", _flags.whl_pycp3x), + ("cp3x_abi3", _flags.whl_pycp3x_abi3), + ("cp3x_cp", _flags.whl_pycp3x_abicp), + ]: + if f in flag_values: + # This should never happen as all of the different whls should have + # unique flag values. + fail("BUG: the flag {} is attempted to be added twice to the list".format(f)) + else: flag_values[f] = "" - _whl_config_setting( - name = n, + _dist_config_setting( + name = "{}_any{}".format(name, suffix), flag_values = flag_values, + is_pip_whl = FLAGS.is_pip_whl_only, **kwargs ) @@ -197,22 +188,25 @@ def _whl_config_settings(*, suffix, plat_flag_values, **kwargs): for (suffix, flag_values) in plat_flag_values: flag_values = flag_values | generic_flag_values - for n, f in { - "{}_none_{}".format(py, suffix): _flags.whl_plat, - "{}3_none_{}".format(py, suffix): _flags.whl_plat_py3, - "{}3_abi3_{}".format(py, suffix): _flags.whl_plat_py3_abi3, - "{}_none_{}".format(pycp, suffix): _flags.whl_plat_pycp3x, - "{}_abi3_{}".format(pycp, suffix): _flags.whl_plat_pycp3x_abi3, - "{}_cp_{}".format(pycp, suffix): _flags.whl_plat_pycp3x_abicp, - }.items(): - if f and f in flag_values: - fail("BUG") - elif f: + for name, f in [ + ("py_none", _flags.whl_plat), + ("py3_none", _flags.whl_plat_py3), + ("py3_abi3", _flags.whl_plat_py3_abi3), + ("cp3x_none", _flags.whl_plat_pycp3x), + ("cp3x_abi3", _flags.whl_plat_pycp3x_abi3), + ("cp3x_cp", _flags.whl_plat_pycp3x_abicp), + ]: + if f in flag_values: + # This should never happen as all of the different whls should have + # unique flag values. + fail("BUG: the flag {} is attempted to be added twice to the list".format(f)) + else: flag_values[f] = "" - _whl_config_setting( - name = n, + _dist_config_setting( + name = "{}_{}".format(name, suffix), flag_values = flag_values, + is_pip_whl = FLAGS.is_pip_whl_only, **kwargs ) @@ -282,85 +276,50 @@ def _plat_flag_values(os, cpu, osx_versions, glibc_versions, muslc_versions): return ret -def _whl_config_setting(*, name, flag_values, visibility, config_setting_rule = None, **kwargs): - config_setting_rule = config_setting_rule or _config_setting_or - config_setting_rule( - name = "is_" + name, - flag_values = flag_values | { - FLAGS.pip_whl: UseWhlFlag.ONLY, - }, - default = flag_values | { - _flags.whl_py2_py3: "", - FLAGS.pip_whl: UseWhlFlag.AUTO, - }, - visibility = visibility, - **kwargs - ) - -def _sdist_config_setting(*, name, visibility, config_setting_rule = None, **kwargs): - config_setting_rule = config_setting_rule or _config_setting_or - config_setting_rule( - name = "is_" + name, - flag_values = {FLAGS.pip_whl: UseWhlFlag.NO}, - default = {FLAGS.pip_whl: UseWhlFlag.AUTO}, - visibility = visibility, - **kwargs - ) +def _dist_config_setting(*, name, is_pip_whl, is_python, python_version, native = native, **kwargs): + """A macro to create a target that matches is_pip_whl_auto and one more value. -def _config_setting_or(*, name, flag_values, default, visibility, **kwargs): - match_name = "_{}".format(name) - default_name = "_{}_default".format(name) + Args: + name: The name of the public target. + is_pip_whl: The config setting to match in addition to + `is_pip_whl_auto` when evaluating the config setting. + is_python: The python version config_setting to match. + python_version: The python version name. + native (struct): The struct containing alias and config_setting rules + to use for creating the objects. Can be overridden for unit tests + reasons. + **kwargs: The kwargs passed to the config_setting rule. Visibility of + the main alias target is also taken from the kwargs. + """ + _name = "_is_" + name + visibility = kwargs.get("visibility") native.alias( - name = name, + name = "is_cp{}_{}".format(python_version, name) if python_version else "is_{}".format(name), actual = select({ - "//conditions:default": default_name, - match_name: match_name, + # First match by the python version + is_python: _name, + "//conditions:default": is_python, }), visibility = visibility, ) - _config_setting( - name = match_name, - flag_values = flag_values, - visibility = visibility, - **kwargs - ) - _config_setting( - name = default_name, - flag_values = default, + if python_version: + # Reuse the config_setting targets that we use with the default + # `python_version` setting. + return + + config_setting_name = _name + "_setting" + native.config_setting(name = config_setting_name, **kwargs) + + # Next match by the `pip_whl` flag value and then match by the flags that + # are intrinsic to the distribution. + native.alias( + name = _name, + actual = select({ + "//conditions:default": FLAGS.is_pip_whl_auto, + FLAGS.is_pip_whl_auto: config_setting_name, + is_pip_whl: config_setting_name, + }), visibility = visibility, - **kwargs ) - -def _config_setting(python_version = "", **kwargs): - if python_version: - # NOTE @aignas 2024-05-26: with this we are getting about 24k internal - # config_setting targets in our unit tests. Whilst the number of the - # external dependencies does not dictate this number, it does mean that - # bazel will take longer to parse stuff. This would be especially - # noticeable in repos, which use multiple hub repos within a single - # workspace. - # - # A way to reduce the number of targets would be: - # * put them to a central location and teach this code to just alias them, - # maybe we should create a pip_config_settings repo within the pip - # extension, which would collect config settings for all hub_repos. - # * put them in rules_python - this has the drawback of exposing things like - # is_cp3.10_linux and users may start depending upon the naming - # convention and this API is very unstable. - is_python_config_setting( - python_version = python_version, - **kwargs - ) - else: - # We need this to ensure that there are no ambiguous matches when python_version - # is unset, which usually happens when we are not using the python version aware - # rules. - flag_values = kwargs.pop("flag_values", {}) | { - FLAGS.python_version: "", - } - native.config_setting( - flag_values = flag_values, - **kwargs - ) diff --git a/python/private/pip_flags.bzl b/python/private/pip_flags.bzl index c8154ff383..1d271c7318 100644 --- a/python/private/pip_flags.bzl +++ b/python/private/pip_flags.bzl @@ -54,6 +54,7 @@ WhlLibcFlag = enum( ) INTERNAL_FLAGS = [ + "dist", "whl_plat", "whl_plat_py3", "whl_plat_py3_abi3", diff --git a/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl b/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl index a0689f70b9..da8a918aed 100644 --- a/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl +++ b/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl @@ -926,8 +926,10 @@ def _test_config_settings_exist(env): mock_rule = lambda name, **kwargs: available_config_settings.append(name) pip_config_settings( python_versions = ["3.11"], - alias_rule = mock_rule, - config_setting_rule = mock_rule, + native = struct( + alias = mock_rule, + config_setting = mock_rule, + ), **kwargs ) From 25bba58fb8834e2388558c4b45aa69298b44dc4f Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Mon, 17 Jun 2024 15:25:10 -0700 Subject: [PATCH 074/345] chore: access ctx.version_file to inform Bazel stamping info is needed (#1952) This enables an optimization in Bazel et al to better track when targets actually need stamping information. Accessing the `ctx.version_file` tells Bazel the target depends on stamping information, which related systems can use to optimize processing of the build graph. --- python/private/common/py_executable.bzl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/python/private/common/py_executable.bzl b/python/private/common/py_executable.bzl index ff1f74de99..cbe7ccf279 100644 --- a/python/private/common/py_executable.bzl +++ b/python/private/common/py_executable.bzl @@ -243,6 +243,9 @@ def py_executable_base_impl(ctx, *, semantics, is_test, inherited_environment = def _get_build_info(ctx, cc_toolchain): build_info_files = py_internal.cc_toolchain_build_info_files(cc_toolchain) if cc_helper.is_stamping_enabled(ctx): + # Makes the target depend on BUILD_INFO_KEY, which helps to discover stamped targets + # See b/326620485 for more details. + ctx.version_file # buildifier: disable=no-effect return build_info_files.non_redacted_build_info_files.to_list() else: return build_info_files.redacted_build_info_files.to_list() From 1016a5cbd676985c260d2375bbe01133069dcf91 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 15:57:16 -0700 Subject: [PATCH 075/345] build(deps): bump urllib3 from 1.26.18 to 1.26.19 in /tools/publish (#1981) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [urllib3](https://github.com/urllib3/urllib3) from 1.26.18 to 1.26.19.
Release notes

Sourced from urllib3's releases.

1.26.19

🚀 urllib3 is fundraising for HTTP/2 support

urllib3 is raising ~$40,000 USD to release HTTP/2 support and ensure long-term sustainable maintenance of the project after a sharp decline in financial support for 2023. If your company or organization uses Python and would benefit from HTTP/2 support in Requests, pip, cloud SDKs, and thousands of other projects please consider contributing financially to ensure HTTP/2 support is developed sustainably and maintained for the long-haul.

Thank you for your support.

Changes

  • Added the Proxy-Authorization header to the list of headers to strip from requests when redirecting to a different host. As before, different headers can be set via Retry.remove_headers_on_redirect.

Full Changelog: https://github.com/urllib3/urllib3/compare/1.26.18...1.26.19

Note that due to an issue with our release automation, no multiple.intoto.jsonl file is available for this release.

Changelog

Sourced from urllib3's changelog.

1.26.19 (2024-06-17)

  • Added the Proxy-Authorization header to the list of headers to strip from requests when redirecting to a different host. As before, different headers can be set via Retry.remove_headers_on_redirect.
  • Fixed handling of OpenSSL 3.2.0 new error message for misconfiguring an HTTP proxy as HTTPS. ([#3405](https://github.com/urllib3/urllib3/issues/3405) <https://github.com/urllib3/urllib3/issues/3405>__)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=urllib3&package-manager=pip&previous-version=1.26.18&new-version=1.26.19)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/bazelbuild/rules_python/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/publish/requirements_darwin.txt | 6 +++--- tools/publish/requirements_windows.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/publish/requirements_darwin.txt b/tools/publish/requirements_darwin.txt index f6fae79529..290411a74c 100644 --- a/tools/publish/requirements_darwin.txt +++ b/tools/publish/requirements_darwin.txt @@ -176,9 +176,9 @@ twine==4.0.2 \ --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \ --hash=sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8 # via -r tools/publish/requirements.in -urllib3==1.26.18 \ - --hash=sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07 \ - --hash=sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0 +urllib3==1.26.19 \ + --hash=sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3 \ + --hash=sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429 # via # requests # twine diff --git a/tools/publish/requirements_windows.txt b/tools/publish/requirements_windows.txt index b171d3ffd9..95b88339c7 100644 --- a/tools/publish/requirements_windows.txt +++ b/tools/publish/requirements_windows.txt @@ -180,9 +180,9 @@ twine==4.0.2 \ --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \ --hash=sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8 # via -r tools/publish/requirements.in -urllib3==1.26.18 \ - --hash=sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07 \ - --hash=sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0 +urllib3==1.26.19 \ + --hash=sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3 \ + --hash=sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429 # via # requests # twine From c72f20c00b1ac5e3d3ad1fe58c9198e61b157647 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 16:07:58 -0700 Subject: [PATCH 076/345] build(deps): bump babel from 2.13.1 to 2.15.0 in /docs/sphinx (#1983) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [babel](https://github.com/python-babel/babel) from 2.13.1 to 2.15.0.
Release notes

Sourced from babel's releases.

v2.15.0

The changelog below is auto-generated by GitHub.

The binary artifacts attached to this GitHub release were generated by the GitHub Actions workflow.

Please see CHANGELOG.rst for additional details.


What's Changed

New Contributors

Full Changelog: https://github.com/python-babel/babel/compare/v2.14.0...v2.15.0

Version 2.14.0

Upcoming deprecation

  • This version, Babel 2.14, is the last version of Babel to support Python 3.7. Babel 2.15 will require Python 3.8 or newer. We had previously announced Babel 2.13 to have been the last version to support Python 3.7, but being able to use CLDR 43 with Python 3.7 was deemed important enough to keep supporting the EOL Python version for one more release.

Possibly backwards incompatible changes

  • Locale.number_symbols will now have first-level keys for each numbering system. Since the implicit default numbering system still is "latn", what had previously been e.g. Locale.number_symbols['decimal'] is now Locale.number_symbols['latn']['decimal'].
  • Babel no longer directly depends on either distutils or setuptools; if you had been using the Babel setuptools command extensions, you would need to explicitly depend on setuptools – though given you're running setup.py you probably already do.

The changelog below is auto-generated by GitHub.

Please see CHANGELOG.rst for additional details.

What's Changed

New Contributors

... (truncated)

Changelog

Sourced from babel's changelog.

Version 2.15.0

Python version support


* Babel 2.15.0 will require Python 3.8 or newer. (:gh:`1048`)

Features


* CLDR: Upgrade to CLDR 44 (:gh:`1071`) (@akx)
* Dates: Support for the &quot;fall back to short format&quot;
logic for time delta formatting (:gh:`1075`) (@akx)
* Message: More versatile .po IO functions (:gh:`1068`) (@akx)
* Numbers: Improved support for alternate spaces when parsing numbers
(:gh:`1007`) (@ronnix's first contribution)

Infrastructure
  • Upgrade GitHub Actions (:gh:1054) (@​cclauss's first contribution)
  • The Unicode license is now included in locale-data and in the documentation (:gh:1074) (@​akx)

Version 2.14.0

Upcoming deprecation


* This version, Babel 2.14, is the last version of Babel to support
Python 3.7.
  Babel 2.15 will require Python 3.8 or newer.
* We had previously announced Babel 2.13 to have been the last version
to support
Python 3.7, but being able to use CLDR 43 with Python 3.7 was deemed
important
  enough to keep supporting the EOL Python version for one more release.

Possibly backwards incompatible changes
</code></pre>
<ul>
<li><code>Locale.number_symbols</code> will now have
first-level keys for each numbering system.
Since the implicit default numbering system still is
<code>&quot;latn&quot;</code>, what had previously
been e.g. <code>Locale.number_symbols['decimal']</code> is
now
<code>Locale.number_symbols['latn']['decimal']</code>.</li>
<li>Babel no longer directly depends on either
<code>distutils</code> or
<code>setuptools</code>; if you had been
using the Babel setuptools command extensions, you would need to
explicitly depend on <code>setuptools</code> –
though given you're running <code>setup.py</code> you
probably already do.</li>
</ul>
<p>Features</p>
<pre><code>
* CLDR/Numbers: Add support of local numbering systems for number
symbols by @kajte in :gh:`1036`
* CLDR: Upgrade to CLDR 43 by @rix0rrr in :gh:`1043`
* Frontend: Allow last_translator to be passed as an option to
extract_message by @AivGitHub in :gh:`1044`
&lt;/tr&gt;&lt;/table&gt;
</code></pre>
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>

<ul>
<li><a
href="https://github.com/python-babel/babel/commit/40b194f4777366e95cc2dfb680fd696b86ef1c04"><code>40b194f</code></a>
Prepare for 2.15.0 release (<a
href="https://redirect.github.com/python-babel/babel/issues/1079">#1079</a>)</li>
<li><a
href="https://github.com/python-babel/babel/commit/c2e6c6e538418f4c195275c1afff831c4706c2e1"><code>c2e6c6e</code></a>
Encode support for the &quot;fall back to short format&quot;
logic for time delta forma...</li>
<li><a
href="https://github.com/python-babel/babel/commit/1a03526e2dda9818424c400530163464a2e74b9b"><code>1a03526</code></a>
Include Unicode license in <code>locale-data</code> and in
documentation (<a
href="https://redirect.github.com/python-babel/babel/issues/1074">#1074</a>)</li>
<li><a
href="https://github.com/python-babel/babel/commit/c0fb56e6a5a7fa9268b5164db0ff0fc28524d648"><code>c0fb56e</code></a>
Allow alternative space characters as group separator when parsing
numbers (#...</li>
<li><a
href="https://github.com/python-babel/babel/commit/fe82fbc90d8044d17bfc4ae1c7a0cb24e85153ef"><code>fe82fbc</code></a>
Use CLDR 44 and adjust tests to match new data (<a
href="https://redirect.github.com/python-babel/babel/issues/1071">#1071</a>)</li>
<li><a
href="https://github.com/python-babel/babel/commit/e0d10183635b9ae1d37c31811e23c8974a1bc31e"><code>e0d1018</code></a>
Improve .po IO (<a
href="https://redirect.github.com/python-babel/babel/issues/1068">#1068</a>)</li>
<li><a
href="https://github.com/python-babel/babel/commit/40e60a1f6cf178d9f57fcc14f157ea1b2ab77361"><code>40e60a1</code></a>
Upgrade GitHub Actions (<a
href="https://redirect.github.com/python-babel/babel/issues/1054">#1054</a>)</li>
<li><a
href="https://github.com/python-babel/babel/commit/2a1709a7768f6f07c3d2dbfdb03d3c8a6bd80aef"><code>2a1709a</code></a>
Drop support for Python 3.7 (EOL since June 2023) (<a
href="https://redirect.github.com/python-babel/babel/issues/1048">#1048</a>)</li>
<li><a
href="https://github.com/python-babel/babel/commit/a8505a4de1d365d7eac6313908cac6dda2708a05"><code>a8505a4</code></a>
Prepare for 2.14.0 release (<a
href="https://redirect.github.com/python-babel/babel/issues/1047">#1047</a>)</li>
<li><a
href="https://github.com/python-babel/babel/commit/946efcdddb73d4470f2dc4e689aef0477a0ca02f"><code>946efcd</code></a>
Improve parsing of malformed decimals (<a
href="https://redirect.github.com/python-babel/babel/issues/1042">#1042</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/python-babel/babel/compare/v2.13.1...v2.15.0">compare
view</a></li>
</ul>
</details>

<br />
[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=babel&package-manager=pip&previous-version=2.13.1&new-version=2.15.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/sphinx/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/sphinx/requirements.txt b/docs/sphinx/requirements.txt index aefa1a4d07..55926918c8 100644 --- a/docs/sphinx/requirements.txt +++ b/docs/sphinx/requirements.txt @@ -12,9 +12,9 @@ alabaster==0.7.13 \ --hash=sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3 \ --hash=sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2 # via sphinx -babel==2.13.1 \ - --hash=sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900 \ - --hash=sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed +babel==2.15.0 \ + --hash=sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb \ + --hash=sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413 # via sphinx certifi==2023.11.17 \ --hash=sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1 \ From ac3abf6e9d5a3e878cc58a0fa2579f417b61a078 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Mon, 17 Jun 2024 16:28:33 -0700 Subject: [PATCH 077/345] docs: Fix a few typos in docs and function names (#1978) These were found by some Google internal typo checkers --- python/private/common/attributes.bzl | 2 +- python/private/parse_requirements.bzl | 2 +- python/private/py_interpreter_program.bzl | 2 +- python/private/py_toolchain_suite.bzl | 2 +- python/private/render_pkg_aliases.bzl | 4 ++-- python/private/repo_utils.bzl | 2 +- python/private/zip_main_template.py | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/python/private/common/attributes.bzl b/python/private/common/attributes.bzl index eb70055787..eb4108f7c6 100644 --- a/python/private/common/attributes.bzl +++ b/python/private/common/attributes.bzl @@ -335,7 +335,7 @@ in the resulting output or not. Valid values are: * `inherit`: Inherit the value from the `--precompile_source_retention` flag. * `keep_source`: Include the original Python source. -* `omit_source`: Don't include the orignal py source. +* `omit_source`: Don't include the original py source. * `omit_if_generated_source`: Keep the original source if it's a regular source file, but omit it if it's a generated file. """, diff --git a/python/private/parse_requirements.bzl b/python/private/parse_requirements.bzl index cb5024c841..21e132b4f8 100644 --- a/python/private/parse_requirements.bzl +++ b/python/private/parse_requirements.bzl @@ -270,7 +270,7 @@ def parse_requirements( contents = ctx.read(file) # Parse the requirements file directly in starlark to get the information - # needed for the whl_libary declarations later. + # needed for the whl_library declarations later. parse_result = parse(contents) # Replicate a surprising behavior that WORKSPACE builds allowed: diff --git a/python/private/py_interpreter_program.bzl b/python/private/py_interpreter_program.bzl index 833ea53b1c..cd62a7190d 100644 --- a/python/private/py_interpreter_program.bzl +++ b/python/private/py_interpreter_program.bzl @@ -57,7 +57,7 @@ def _py_interpreter_program_impl(ctx): py_interpreter_program = rule( doc = """ -Binary-like rule that doesn't require a toolchain becaues its part of +Binary-like rule that doesn't require a toolchain because its part of implementing build tools for the toolchain. This rule expects the Python interprter to be externally provided. diff --git a/python/private/py_toolchain_suite.bzl b/python/private/py_toolchain_suite.bzl index 174c36f782..64ed0c3995 100644 --- a/python/private/py_toolchain_suite.bzl +++ b/python/private/py_toolchain_suite.bzl @@ -36,7 +36,7 @@ def py_toolchain_suite(*, prefix, user_repository_name, python_version, set_pyth """ # We have to use a String value here because bzlmod is passing in a - # string as we cannot have list of bools in build rule attribues. + # string as we cannot have list of bools in build rule attributes. # This if statement does not appear to work unless it is in the # toolchain file. if set_python_version_constraint in ["True", "False"]: diff --git a/python/private/render_pkg_aliases.bzl b/python/private/render_pkg_aliases.bzl index a37c32882e..82ac764f00 100644 --- a/python/private/render_pkg_aliases.bzl +++ b/python/private/render_pkg_aliases.bzl @@ -544,7 +544,7 @@ def get_filename_config_settings( suffixes = target_platforms else: prefixes = ["{}_{}".format(py, abi)] - suffixes = _whl_config_setting_sufixes( + suffixes = _whl_config_setting_suffixes( platform_tag = parsed.platform_tag, glibc_versions = glibc_versions, muslc_versions = muslc_versions, @@ -578,7 +578,7 @@ def get_filename_config_settings( else: return [":is_{}".format(p) for p in prefixes], setting_supported_versions -def _whl_config_setting_sufixes( +def _whl_config_setting_suffixes( platform_tag, glibc_versions, muslc_versions, diff --git a/python/private/repo_utils.bzl b/python/private/repo_utils.bzl index 52677584e4..54ad45c2f1 100644 --- a/python/private/repo_utils.bzl +++ b/python/private/repo_utils.bzl @@ -86,7 +86,7 @@ def _execute_internal( arguments, environment = {}, **kwargs): - """Execute a subprocess with debugging instrumention. + """Execute a subprocess with debugging instrumentation. Args: rctx: repository_ctx object diff --git a/python/private/zip_main_template.py b/python/private/zip_main_template.py index 18eaed9630..2d3aea7b7b 100644 --- a/python/private/zip_main_template.py +++ b/python/private/zip_main_template.py @@ -2,7 +2,7 @@ # # NOTE: This file is a "stage 1" bootstrap, so it's responsible for locating the # desired runtime and having it run the stage 2 bootstrap. This means it can't -# assume much about the current runtime and environment. e.g, the current +# assume much about the current runtime and environment. e.g., the current # runtime may not be the correct one, the zip may not have been extract, the # runfiles env vars may not be set, etc. # From aeba7163e24274ea448aa77e242177d08de45bcb Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 18 Jun 2024 09:00:45 -0700 Subject: [PATCH 078/345] fix: enable auto exec groups using attribute (#1986) This allows the precompile action to resolve its tools separately from other toolchains, allowing toolchain types with otherwise incompatible `exec_compatible_with` definitions to be used together. --- CHANGELOG.md | 3 +++ python/private/common/attributes.bzl | 3 +++ 2 files changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index af8394b5f4..c978cd6a6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,9 @@ A brief description of the categories of changes: ### Fixed * (bzlmod): Targets in `all_requirements` now use the same form as targets returned by the `requirement` macro. +* (rules) Auto exec groups are enabled. This allows actions run by the rules, + such as precompiling, to pick an execution platform separately from what + other toolchains support. ### Removed * Nothing yet diff --git a/python/private/common/attributes.bzl b/python/private/common/attributes.bzl index eb4108f7c6..503578b78c 100644 --- a/python/private/common/attributes.bzl +++ b/python/private/common/attributes.bzl @@ -361,6 +361,9 @@ in the resulting output or not. Valid values are: default = "//python/config_settings:precompile_source_retention", providers = [BuildSettingInfo], ), + # Force enabling auto exec groups, see + # https://bazel.build/extending/auto-exec-groups#how-enable-particular-rule + "_use_auto_exec_groups": attr.bool(default = True), }, allow_none = True, ) From b16f4f9198285bb485abe5b0a3dcfa35fcb9a0fc Mon Sep 17 00:00:00 2001 From: Greg Roodt Date: Wed, 19 Jun 2024 02:34:06 +1000 Subject: [PATCH 079/345] docs: Remove proposals (#1990) Removes the proposals. Most of them are either implemented already, or no longer relevant. The maintainers have not used in-repo proposals for a number of years, so I don't think it will be a big loss to delete these. --- ...-10-25-selecting-between-python-2-and-3.md | 136 ---------- ...08-customizing-the-python-stub-template.md | 47 ---- ...019-02-12-design-for-a-python-toolchain.md | 247 ------------------ proposals/README.md | 11 - 4 files changed, 441 deletions(-) delete mode 100644 proposals/2018-10-25-selecting-between-python-2-and-3.md delete mode 100644 proposals/2018-11-08-customizing-the-python-stub-template.md delete mode 100644 proposals/2019-02-12-design-for-a-python-toolchain.md delete mode 100644 proposals/README.md diff --git a/proposals/2018-10-25-selecting-between-python-2-and-3.md b/proposals/2018-10-25-selecting-between-python-2-and-3.md deleted file mode 100644 index e731f971ce..0000000000 --- a/proposals/2018-10-25-selecting-between-python-2-and-3.md +++ /dev/null @@ -1,136 +0,0 @@ ---- -title: Selecting Between Python 2 and 3 -status: Accepted -created: 2018-10-25 -updated: 2019-01-11 -authors: - - [brandjon@](https://github.com/brandjon) -reviewers: - - [mrovner@](https://github.com/mrovner) -discussion thread: [bazel #6583](https://github.com/bazelbuild/bazel/issues/6583) ---- - -# Selecting Between Python 2 and 3 - -## Abstract - -The "Python mode" configuration value controls whether Python 2 or Python 3 is used to run Python targets built by Bazel. This design document reviews the existing mechanisms for setting the Python mode (the "tri-state model") and describes a simplified mechanism that should replace it (the "boolean model"). - -Links to Github issues are given where applicable. See also [bazel #6444](https://github.com/bazelbuild/bazel/issues/6444) for a tracking list of Python mode issues. - -Throughout, when we say `py_binary`, we also mean to include `py_test`. - -## Background - -The Python mode controls whether a Python 2 or 3 interpreter is used to run a `py_binary` that is built by Bazel. - -* When no `py_runtime` is supplied (via `--python_top`), the mode should control whether the command `python2` or `python3` is embedded into the generated wrapper script ([bazel #4815](https://github.com/bazelbuild/bazel/issues/4815)). - -* In a future design for a "`py_toolchain`"-type rule, a pair of interpreter targets will be bundled together as a toolchain, and the mode will control which one gets their full path embedded into this script. - -The Python mode is also used to help validate that Python source code annotated with `srcs_version` is used appropriately: If a Python target has the `srcs_version` attribute set to `PY2` or `PY3` rather than to `PY2AND3` (the default), it can only be depended on by targets built in Python 2 or Python 3 mode respectively. - -Whenever the same Bazel target can be built in multiple configurations within a single build, it is necessary to write the output artifacts of different versions of the target to different paths. Otherwise the build fails with an "action conflict" error -- Bazel's way of avoiding a correctness bug. For Python targets, and more broadly for targets that may transitively depend on Python targets, this means that different output path roots must be used for different Python modes. - -## Out-of-scope generalizations - -It is possible to imagine extending the Python mode and `srcs_version` so that it can check for compatibility with minor releases (ex: "Python 3.7"), patch releases ("Python 3.7.1"), alternative interpreters ("CPython" or "PyPy"), and exclude known bad releases. We decline to do so because this treads into generalized constraint checking, which may be better handled in the future by the [platforms and toolchain framework](https://docs.bazel.build/versions/master/toolchains.html). - -Compared to these other kinds of version checks, Python 2 vs. 3 is a more compelling use case to support with dedicated machinery. The incompatibilities between these versions are more severe. In many code bases there is an ongoing effort to migrate from 2 to 3, while in others there exists Python 2 code that will never be migrated and must be supported indefinitely. - -## Tri-state model - -Under the existing tri-state model, the Python mode can take on three values: `PY2`, `PY3`, and `null`. The first two modes can be triggered by the `--force_python` flag on the command line or by the `default_python_version` attribute on `py_binary` rules. The `null` mode is the default state when neither the flag nor `default_python_version` is specified. `select()` expressions can distinguish between these states by using `config_setting`s that test the value of `force_python` (where `null` is matched by `//conditions:default`). - -The Python mode is "sticky"; once it is set to `PY2` or `PY3`, it stays that way for all subsequent targets. For a `py_binary` target, this means that all transitive dependencies of the target are built with the same mode as the target itself. For the `--force_python` flag, this means that if the flag is given, it applies universally to the entire build invocation, regardless of the `default_python_version` attributes of any Python targets (hence the "default" in the attribute's name). - -### Data dependencies - -In principle the Python mode needs to propagate to any `py_library` targets that are transitively in the `deps` attribute. Conceptually, this corresponds to enforcing that a Python binary cannot `import` a module written for a different version of Python than the currently running interpreter. But there is no need to propagate the mode across the `data` attribute, which often corresponds to one Python binary calling another as a separate process. - -In order to facilitate `PY3` binaries that depend on `PY2` ones and vice versa, the tri-state model needs to be modified so that the mode is reset to `null` for `data` attributes ([bazel #6441](https://github.com/bazelbuild/bazel/issues/6441)). But it's not clear exactly which attributes should trigger a reset. For example, suppose a Python source file is generated by a `genrule`: Then the `genrule` shouldn't propagate any Python mode to any of its attributes, even though it appears in the transitive closure of a `py_binary`'s `deps`. One could imagine resetting the mode across every attribute except those in a small whitelist (`deps` of `py_binary`, `py_test`, and `py_library`), but this would require new functionality in Bazel and possibly interact poorly with Starlark-defined rules. - -### Output roots - -Since targets that are built for Python 3 produce different results than those built for Python 2, the outputs for these two configurations must be kept separate in order to avoid action conflicts. Therefore, targets built in `PY3` mode get placed under an output root that includes the string "`-py3`". - -Currently, targets that are built in the `null` mode default to using Python 2. Counterintuitively, there is a subtle distinction between building a target in `null` mode and `PY2` mode: Even though the same interpreter is used for the top-level target, the target's transitive dependencies may behave differently, for instance if a `select()` on `force_python` is used. This means that using both `PY2` and `null` for the same target can result in action conflicts ([bazel #6501](https://github.com/bazelbuild/bazel/issues/6501)). However, due to a bug it is not yet possible to have both `PY2` and `null` modes within the same build invocation. - -Under the tri-state model, the most straightforward solution for these action conflicts is to use a separate "`-py2`" root for `PY2` mode. This would mean that the same target could be built in not two but three different configurations, corresponding to the three different modes, even though there are only two distinct Python versions. A more complicated alternative would be to prohibit `select()` from being able to distinguish `null` from `PY2`, in order to help ensure that building an arbitrary target in both of these modes does not succeed with different results. - -### Libraries at the top level - -Currently the mode is only changed by `--force_python` and by `py_binary`. This means that when you build a `py_library` at the top level (that is, specifying it directly on the build command line) without a `--force_python` flag, the library gets the `null` mode, which means Python 2 by default. This causes an error if the library has `srcs_python` set to `PY3`. This in turn means you cannot run a flagless build command on a wildcard pattern, such as `bazel build :all` or `bazel build ...`, if any of the targets in the package(s) contains a Python 3-only library target. Worse, if there are both a Python 2-only library and a Python 3-only library, even specifying `--force_python` can't make the wildcard build work. - -In the tri-state model, this can be addressed by allowing `py_library` to change the mode from `null` to either `PY2` or `PY3` based on whichever version is compatible with its `srcs_version` attribute. This was a proposed fix for [bazel #1446](https://github.com/bazelbuild/bazel/issues/1446). - -## Boolean model - -Under the boolean model, `null` is eliminated as a valid value for the Python mode. Instead, the mode will immediately default to either `PY2` or `PY3`. The mode is no longer sticky, but changes as needed whenever a new `py_binary` target is reached. - -Since there is no longer a third value corresponding to "uncommitted", a target can no longer tell whether it was set to `PY2` mode explicitly (by a flag or a `py_binary`), or if it was set by default because no mode was specified. The current version will be inspectable using `config_setting` to read a setting whose value is always one of `"PY2"` or `"PY3"`. - -### Data dependencies - -Since `py_binary` will now change the mode as needed, there is no need to explicitly reset the mode to a particular value (`null`) when crossing `data` attributes. Python 3 targets can freely depend on Python 2 targets and vice versa, so long as the dependency is not via the `deps` attribute in a way that violates `srcs_version` validation (see below). - -### Output roots - -Since there are only two modes, there need only be two output roots. This avoids action conflicts without resorting to creating a redundant third output root, or trying to coerce two similar-but-distinct modes to map onto the same output root. - -Since the mode is not being reset across data dependencies, it is possible that compared to the tri-state model, the boolean model causes some data dependencies to be built in two configurations instead of just one. This is considered to be an acceptable tradeoff of the boolean model. Note that there exist other cases where redundant rebuilding occurs regardless of which model we use. - -### Libraries at the top level - -We want to be able to build a `py_library` at the top level without having to specify the correct mode. At the same time, we still want `srcs_version` to validate that a `py_binary` only depends on `py_library`s that are compatible with its mode. The way to achieve this is to move validation from within the `py_library` rule up to the `py_binary` rule. - -We add two new boolean fields to a provider returned by `py_library`. This bools correspond to whether or not there are any Python 2-only and Python 3-only sources (respectively) in the library's transitive closure. It is easy to compute these bits as boolean ORs as the providers are merged. `py_binary` simply checks these bits against its own Python mode. - -It is important that when `py_binary` detects a version conflict, the user is given the label of one or more transitive dependencies that introduced the constraint. There are several ways to implement this, such as: - -- additional provider fields to propagate context to the error message -- an aspect that traverses the dependencies of the `py_binary` -- emitting warning messages at conflicting `py_library` targets - -The choice of which approach to use is outside the scope of this proposal. - -It is possible that a library is only ever used by Python 3 binaries, but when the library is built as part of a `bazel build :all` command it gets the Python 2 mode by default. This happens even if the library is annotated with `srcs_version` set to `PY3`. Generally this should cause no harm aside from some repeated build work. In the future we can add the same version attribute that `py_binary` has to `py_library`, so the target definition can be made unambiguous. - -Aside from failures due to validation, there is currently a bug whereby building a `PY2` library in `PY3` mode can invoke a stub wrapper that fails ([bazel #1393](https://github.com/bazelbuild/bazel/issues/1393)). We will remove the stub and the behavior that attempted to call it. - -## API changes - -The attribute `default_python_version` of `py_binary` is renamed to `python_version`. The flag `--force_python` is renamed to `--python_version`. (An alternative naming scheme would have been to use "python_major_version", but this is more verbose and inconsistent with `srcs_version`.) - -The Python mode becomes "non-sticky" and `srcs_version` validation becomes less strict. Building a `py_library` target directly will not trigger validation. Building a `py_binary` that depends on a `py_library` having an incompatible version will only fail if the dependency occurs via transitive `deps`, and not when it occurs via other paths such as a `data` dep or a `genrule` that produces a source file. - -The `"py"` provider of Python rules gains two new boolean fields, `has_py2_only_sources` and `has_py3_only_sources`. Existing Python rules are updated to set these fields. Dependencies of Python rules that do not have the `"py"` provider, or those fields on that provider, are treated as if the value of the fields is `False`. - -A new `select()`-able target is created at `@bazel_tools//tools/python:python_version` to return the current Python mode. It can be used in the `flag_values` attribute of `config_setting` and always equals either `"PY2"` or `"PY3"`. (In the future this flag may be moved out of `@bazel_tools` and into `bazelbuild/rules_python`. It may also be made into a `build_setting` so that it can replace the native `--python_version` flag.) It is disallowed to use `"python_version"` in a `config_setting`. - -The flag `--host_force_python` is unaffected by this doc, except that it becomes illegal to use it in a `config_setting`. - -## Migration and compatibility - -The rollout and migration of the new features are split into two groups, syntactic and semantic. - -For syntax, the new `--python_version` flag and `python_version` attribute are available immediately, and behave exactly the same as the old flag and attribute. When both the new and old flags are present on the command line, or both the new and old attributes are present on the same target, the new one takes precedence and the old is ignored. The `@bazel_tools//tools/python:python_version` target is also available unconditionally. - -A migration flag `--incompatible_remove_old_python_version_api` makes unavailable the `--force_python` flag and `default_python_version` attribute, and disallows `select()`-ing on `"force_python"` and `"host_force_python"`. - -For semantics, a flag `--incompatible_allow_python_version_transitions` makes Bazel use the new non-sticky version transitions and the deferred `srcs_version` validation. This applies regardless of whether the new or old API is used to specify the Python version. The new `"py"` provider fields are created regardless of which flags are given. - -Migrating for `--incompatible_remove_old_python_version_api` guarantees that the Python version only ever has two possible values. Migrating for `--incompatible_allow_python_version_transitions` enables data dependencies across different versions of Python. It is recommended to do the API migration first in order to avoid action conflicts. - -Strictly speaking, Python 3 support is currently marked "experimental" in documentation, so in theory we may be able to make these changes without introducing new incompatible and experimental flags. However these changes will likely affect many users of the Python rules, so flags would be more user-friendly. Bazel is also transitioning to a policy wherein all experimental APIs must be flag-guarded, regardless of any disclaimers in their documentation. - -## Changelog - -Date | Change ------------- | ------ -2018-10-25 | Initial version -2018-11-02 | Refine migration path -2018-12-17 | Refine plan for `select()` -2018-12-19 | Refine plan for `select()` again -2019-01-10 | Refine migration path -2019-01-11 | Formal approval and update provider fields diff --git a/proposals/2018-11-08-customizing-the-python-stub-template.md b/proposals/2018-11-08-customizing-the-python-stub-template.md deleted file mode 100644 index 5b9d87820e..0000000000 --- a/proposals/2018-11-08-customizing-the-python-stub-template.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Customizing the Python Stub Template -status: Draft, not yet ready for review -created: 2018-11-08 -updated: 2018-11-09 -authors: - - [brandjon@](https://github.com/brandjon) -reviewers: - - [gpshead@](https://github.com/gpshead) -discussion thread: [bazel #137](https://github.com/bazelbuild/bazel/issues/137) ---- - -# Customizing the Python Stub Template - -## Abstract - -This design document proposes a way to use a different Python stub template, so that users can control how the Python interpreter gets invoked to run their targets. - -**Open questions:** It is not currently clear whether the use cases warrant this kind of expressivity, or whether users can get by with smaller, more narrowly focused ways of parameterizing the existing stub template. The exact stub API is also to be determined. - -## Background - -The usual executable artifact of a `py_binary` rule is a Python stub script. This script manipulates the Python environment to set up the module import path and make the runfiles available, before passing control to the underlying user Python program. The stub script is generated from a [stub template](https://github.com/bazelbuild/bazel/blob/ef0024b831a71521390dcb837b24b86485e5998d/src/main/java/com/google/devtools/build/lib/bazel/rules/python/python_stub_template.txt) by [instantiating some placeholders](https://github.com/bazelbuild/bazel/blob/ef0024b831a71521390dcb837b24b86485e5998d/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java#L152-L159). - -Generally the Python stub and user program is executed using the system Python interpreter of the target platform. Although this is non-hermetic, the details of the interpreter can be reified by a [`py_runtime`](https://docs.bazel.build/versions/master/be/python.html#py_runtime) target. In the future this will allow for platform-aware selection of an appropriate Python interpreter using the [toolchain](https://docs.bazel.build/versions/master/toolchains.html) framework. - -## Proposal - -A new `Label`-valued attribute, `stub_template`, is added to `py_runtime`. This label points to a file; by default it is `//tools/python:python_stub_template.txt`, which is the renamed location of the existing template. The `py_runtime` rule will resolve this label to an `Artifact` and propagate it in a new field of [`BazelPyRuntimeProvider`](https://github.com/bazelbuild/bazel/blob/1f684e1b87cd8881a0a4b33e86ba66743e32d674/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPyRuntimeProvider.java). [`BazelPythonSemantics#createExecutable`](https://github.com/bazelbuild/bazel/blob/ef0024b831a71521390dcb837b24b86485e5998d/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPythonSemantics.java#L130) will refer to this `Artifact` instead of retrieving the template as a Java resource file. - -It is not yet decided which template placeholders are specified, or whether the placeholders will remain an experimental API for the moment. - -## Original approach - -An earlier proposed approach (suggested on the discussion thread, and implemented by [fahhem@](https://github.com/fahhem)) was to add the `stub_template` attribute to `py_binary` rather than to `py_runtime`. - -This would make it trivial to customize the stub for an individual Python target without affecting the other targets in the build. This could be useful if there were a one-off target that had special requirements. - -However, the author believes that the stub is more naturally tied to the Python interpreter than to an individual target. Putting the attribute on `py_runtime` makes it easy to affect all Python targets that use the same interpreter. It also allows the same Python target to use different stubs depending on which interpreter it is built for -- for instance, the same target can have different stubs on different platforms. - -If it is necessary to use a custom stub for a particular target, that could still be achieved by making that one target use a different `py_runtime`. This isn't possible at the moment but will be when a `py_toolchain` rule is added. - -## Changelog - -Date | Change ------------- | ------ -2018-11-08 | Initial version diff --git a/proposals/2019-02-12-design-for-a-python-toolchain.md b/proposals/2019-02-12-design-for-a-python-toolchain.md deleted file mode 100644 index 0d45866107..0000000000 --- a/proposals/2019-02-12-design-for-a-python-toolchain.md +++ /dev/null @@ -1,247 +0,0 @@ ---- -title: Design for a Python Toolchain -status: Accepted -created: 2019-02-12 -updated: 2019-02-21 -authors: - - [brandjon@](https://github.com/brandjon) -reviewers: - - [katre@](https://github.com/katre), [mrovner@](https://github.com/mrovner), [nlopezgi@](https://github.com/nlopezgi) -discussion thread: [bazel #7375](https://github.com/bazelbuild/bazel/issues/7375) ---- - -# Design for a Python Toolchain - -## Abstract - -This doc outlines the design of a Python toolchain rule and its associated machinery. Essentially a new `py_runtime_pair` toolchain rule is created to wrap two `py_runtime` targets (one for Python 2 and one for Python 3), thereby making runtimes discoverable via [toolchain resolution](https://docs.bazel.build/versions/master/toolchains.html). This replaces the previous mechanism of explicitly specifying a global runtime via `--python_top` or `--python_path`; those flags are now deprecated. - -The new toolchain-related definitions are implemented in Starlark. A byproduct of this is that the provider type for `py_runtime` is exposed to Starlark. We also add to `py_runtime` an attribute for declaring whether it represents a Python 2 or Python 3 runtime. - -## Motivation - -The goal is to make the native Python rules use the toolchain framework to resolve the Python runtime. Advantages include: - -* allowing each `py_binary` to use a runtime suitable for its target platform - -* allowing Python 2 and Python 3 targets to run in the same build without [hacks](https://github.com/bazelbuild/bazel/issues/4815#issuecomment-460777113) - -* making it easier to run Python-related builds under remote execution - -* adding support for autodetection of available system Python runtimes, without requiring ad hoc rule logic - -* removing `--python_top` and `--python_path` - -* bringing Python in line with other rule sets and Bazel's best practices - -**Non-goal:** This work does not allow individual `py_binary`s to directly name a Python runtime to use. Instead, this information should be worked into either the configuration or a future toolchain constraint system. See the FAQ, below. - -## Design - -### New definitions - -A new [toolchain type](https://docs.bazel.build/versions/master/toolchains.html#writing-rules-that-use-toolchains) is created at `@bazel_tools//tools/python:toolchain_type`. This is the type for toolchains that provide a way to run Python code. - -Toolchain rules of this type are expected to return a [`ToolchainInfo`](https://docs.bazel.build/versions/master/skylark/lib/ToolchainInfo.html) with two fields, `py2_runtime` and `py3_runtime`, each of type `PyRuntimeInfo`. They are used for `PY2` and `PY3` binaries respectively. - -```python -def _some_python_toolchain_impl(ctx): - ... - return [platform_common.ToolchainInfo( - py2_runtime = PyRuntimeInfo(...), - py3_runtime = PyRuntimeInfo(...))] -``` - -If either Python 2 or Python 3 is not provided by the toolchain, the corresponding field may be set to `None`. This is strongly discouraged, as it will prevent any target relying on that toolchain from using that version of Python. Toolchains that do use `None` here should be registered with lower priority than other toolchains, so that they are chosen only as a fallback. - -`PyRuntimeInfo` is the newly-exposed Starlark name of the native provider returned by the [`py_runtime`](https://docs.bazel.build/versions/master/be/python.html#py_runtime) rule. Like `PyInfo`, it is a top-level built-in name. Also like `PyInfo` and the native Python rules, it will eventually be migrated to Starlark and moved out of the Bazel repository. - -A `PyRuntimeInfo` 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 build target 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. Note that any platform runtime imposes a requirement on the target platform. Therefore, any toolchain returning such a `PyRuntimeInfo` should include a corresponding target platform constraint, to ensure it cannot be selected for a platform that does not have the interpreter at that path. Even an in-build runtime can require platform constraints, for instance in the case of a wrapper script that invokes the system interpreter. - -We provide two [`constraint_setting`](https://docs.bazel.build/versions/master/be/platform.html#constraint_setting)s to act as a standardized namespace for this kind of platform constraint: `@bazel_tools//tools/python:py2_interpreter_path` and `@bazel_tools//tools/python:py3_interpreter_path`. This doc does not mandate any particular structure for the names of [`constraint_value`](https://docs.bazel.build/versions/master/be/platform.html#constraint_value)s associated with these settings. If a platform does not provide a Python 2 runtime, it should have no constraint value associated with `py2_interpreter_path`, and similarly for Python 3. - -`PyRuntimeInfo` has the following fields, each of which corresponds to an attribute on `py_runtime`. (The last one, `python_version`, is newly added in this doc.) - -* `interpreter_path`: 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`: If this is an in-build runtime, this field is a `File` representing the interpreter. Otherwise, this is `None`. - -* `files`: 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 toolchain. The value of `interpreter` need not be included in this field. If this is a platform runtime then this field is `None`. - -* `python_version`: Either the string `"PY2"` or `"PY3"`, indicating which version of Python the interpreter referenced by `interpreter_path` or `interpreter` is. - -The constructor of `PyRuntimeInfo` takes each of these fields as keyword arguments. The constructor enforces the invariants about which combinations of fields may be `None`. Fields that are not meaningful may be omitted; e.g. when `interpreter_path` is given, `interpreter` and `files` may be omitted instead of passing `None`. - -It is not possible to directly specify a system command (e.g. `"python"`) in `interpreter_path`. However, this can be done indirectly by creating a wrapper script that invokes the system command, and referencing that script from the `interpreter` field. - -Finally, we define a standard Python toolchain rule implementing the new toolchain type. The rule's name is `py_runtime_pair` and it can be loaded from `@bazel_tools//tools/python:toolchain.bzl`. It has two label-valued attributes, `py2_runtime` and `py3_runtime`, that refer to `py_runtime` targets. - -### Changes to the native Python rules - -The executable Python rules [`py_binary`](https://docs.bazel.build/versions/master/be/python.html#py_binary) and [`py_test`](https://docs.bazel.build/versions/master/be/python.html#py_test) are modified to require the new toolchain type. The Python runtime information is obtained by retrieving a `PyRuntimeInfo` from either the `py2_runtime` or `py3_runtime` field of the toolchain, rather than from `--python_top`. The `python_version` field of the `PyRuntimeInfo` is also checked to ensure that a `py_runtime` didn't accidentally end up in the wrong place. - -Since `--python_top` is no longer read, it is deprecated. Since `--python_path` was only read when no runtime information is available, but the toolchain must always be present, it too is deprecated. - -Implementation wise, the native `PyRuntimeProvider` is turned into the user-visible `PyRuntimeInfo` by adding Starlark API annotations in the usual way (`@SkylarkCallable`, etc.). A previous version of this proposal suggested defining `PyRuntimeInfo` in Starlark underneath `@bazel_tools` and accessing it from the native rules, but this is technically difficult to implement. - -A `python_version` attribute is added to `py_runtime`. It is mandatory and accepts values `"PY2"` and `"PY3"` only. - -As a drive-by cleanup (and non-breaking change), the `files` attribute of `py_runtime` is made optional. For the non-hermetic case, specifying `files` is nonsensical and it is even an error to give it a non-empty value. For the hermetic case, `files` can be useful but is by no means necessary if the interpreter requires no additional in-repo inputs (such as when the "interpreter" is just a wrapper script that dispatches to the platform's system interpreter). - -### Default toolchain - -For convenience, we supply a predefined [toolchain](https://docs.bazel.build/versions/master/be/platform.html#toolchain) of last resort, `@bazel_tools//tools/python:autodetecting_python_toolchain`. This toolchain is registered with lower priority than any user-registered Python toolchain. It simply dispatches to a wrapper script that tries to locate a suitable interpreter from `PATH` at runtime, on a best-effort basis. It has no platform constraints. - -## Example - -Here is a minimal example that defines a platform whose Python interpreters are located under a non-standard path. The example also defines a Python toolchain to accompany this platform. - -```python -# //platform_defs:BUILD - -load("@bazel_tools//tools/python:toolchain.bzl", "py_runtime_pair") - -# Constraint values that represent that the system's "python2" and "python3" -# executables are located under /usr/weirdpath. - -constraint_value( - name = "usr_weirdpath_python2", - constraint_setting = "@bazel_tools//tools/python:py2_interpreter_path", -) - -constraint_value( - name = "usr_weirdpath_python3", - constraint_setting = "@bazel_tools//tools/python:py3_interpreter_path", -) - -# A definition of a platform whose Python interpreters are under these paths. - -platform( - name = "my_platform", - constraint_values = [ - ":usr_weirdpath_python2", - ":usr_weirdpath_python3", - ], -) - -# Python runtime definitions that reify these system paths as BUILD targets. - -py_runtime( - name = "my_platform_py2_runtime", - interpreter_path = "/usr/weirdpath/python2", -) - -py_runtime( - name = "my_platform_py3_runtime", - interpreter_path = "/usr/weirdpath/python3", -) - -py_runtime_pair( - name = "my_platform_runtimes", - py2_runtime = ":my_platform_py2_runtime", - py3_runtime = ":my_platform_py3_runtime", -) - -# A toolchain definition to expose these runtimes to toolchain resolution. - -toolchain( - name = "my_platform_python_toolchain", - # Since the Python interpreter is invoked at runtime on the target - # platform, there's no need to specify execution platform constraints here. - target_compatible_with = [ - # Make sure this toolchain is only selected for a target platform that - # advertises that it has interpreters available under /usr/weirdpath. - ":usr_weirdpath_python2", - ":usr_weirdpath_python3", - ], - toolchain = ":my_platform_runtimes", - toolchain_type = "@bazel_tools//tools/python:toolchain_type", -) -``` - -```python -# //pkg:BUILD - -# An ordinary Python target to build. -py_binary( - name = "my_pybin", - srcs = ["my_pybin.py"], - python_version = "PY3", -) -``` - -```python -# WORKSPACE - -# Register the custom Python toolchain so it can be chosen for my_platform. -register_toolchains( - "//platform_defs:my_platform_python_toolchain", -) -``` - -We can then build with - -``` -bazel build //pkg:my_pybin --platforms=//platform_defs:my_platform -``` - -and thanks to toolchain resolution, the resulting executable will automatically know to use the interpreter located at `/usr/weirdpath/python3`. - -If we had not defined a custom toolchain, then we'd be stuck with `autodetecting_python_toolchain`, which would fail at execution time if `/usr/weirdpath` were not on `PATH`. (It would also be slightly slower since it requires an extra invocation of the interpreter at execution time to confirm its version.) - -## Backward compatibility - -The new `@bazel_tools` definitions and the `PyRuntimeInfo` provider are made available immediately. A new flag, `--incompatible_use_python_toolchains`, is created to assist migration. When the flag is enabled, `py_binary` and `py_test` will use the `PyRuntimeInfo` obtained from the toolchain, instead of the one obtained from `--python_top` or the default information in `--python_path`. In addition, when `--incompatible_use_python_toolchains` is enabled it is an error to set the following flags: `--python_top`, `--python_path`, `--python2_path`, `--python3_path`. (The latter two were already deprecated.) These flags will be deleted when the incompatible flag is removed. - -Because of how the toolchain framework is implemented, it is not possible to gate whether a rule requires a toolchain type based on a flag. Therefore `py_binary` and `py_test` are made to require `@bazel_tools//tools/python:toolchain_type` immediately and unconditionally. This may impact how toolchain resolution determines the toolchains and execution platforms for a given build, but should not otherwise cause problems so long as the build uses constraints correctly. - -The new `python_version` attribute is added to `py_runtime` immediately. Its default value is the same as the `python_version` attribute for `py_binary`, i.e. `PY3` if `--incompatible_py3_is_default` is true and `PY2` otherwise. When `--incompatible_use_python_toolchains` is enabled this attribute becomes mandatory. - -## FAQ - -#### How can I force a `py_binary` to use a given runtime, say for a particular minor version of Python? - -This is not directly addressed by this doc. Note that such a system could be used not just for controlling the minor version of the interpreter, but also to choose between different Python implementations (CPython vs PyPy), compilation modes (optimized, debug), an interpreter linked with a pre-selected set of extensions, etc. - -There are two possible designs. - -The first design is to put this information in the configuration, and have the toolchain read the configuration to decide which `PyRuntimeInfo` to return. We'd use Starlark Build Configurations to define a flag to represent the Python minor version, and transition the `py_binary` target's configuration to use this version. This configuration would be inherited by the resolved toolchain just like any other dependency inherits its parents configuration. The toolchain could then use a `select()` on the minor version flag to choose which `py_runtime` to depend on. - -There's one problem: Currently all toolchains are analyzed in the host configuration. It is expected that this will be addressed soon. - -We could even migrate the Python major version to use this approach. Instead of having two different `ToolchainInfo` fields, `py2_runtime` and `py3_runtime`, we'd have a single `py_runtime` field that would be populated with one or the other based on the configuration. (It's still a good idea to keep them as separate attributes in the user-facing toolchain rule, i.e. `py_runtime_pair`, because it's a very common use case to require both major versions of Python in a build. But note that this causes both runtimes to be analyzed as dependencies, even if the whole build uses only one or the other.) - -The second design for controlling what runtime is chosen is to introduce additional constraints on the toolchain, and let toolchain resolution solve the problem. However, currently toolchains only support constraints on the target and execution platforms, and this is not a platform-related constraint. What would be needed is a per-target semantic-level constraint system. - -The second approach has the advantage of allowing individual runtimes to be registered independently, without having to combine them into a massive `select()`. But the first approach is much more feasible to implement in the short-term. - -#### Why `py_runtime_pair` as opposed to some other way of organizing multiple Python runtimes? - -Alternatives might include a dictionary mapping from version identifiers to runtimes, or a list of runtimes paired with additional metadata. - -The `PY2`/`PY3` dichotomy is already baked into the Python rule set and indeed the Python ecosystem at large. Keeping this concept in the toolchain rule serves to complement, rather than complicate, Bazel's existing Python support. - -It will always be possible to add new toolchains, first by extending the schema of the `ToolchainInfo` accepted by the Python rules, and then by defining new user-facing toolchain rules that serve as front-ends for this provider. - -#### Why not split Python 2 and Python 3 into two separate toolchain types? - -The general pattern for rule sets seems to be to have a single toolchain type representing all of a language's concerns. Case in point: The naming convention for toolchain types is to literally name the target "toolchain_type", and let the package path distinguish its label. - -If the way of categorizing Python runtimes changes in the future, it will probably be easier to migrate rules to use a new provider schema than to use a new set of toolchain types. - -#### How does the introduction of new symbols to `@bazel_tools` affect the eventual plan to migrate the Python rules to `bazelbuild/rules_python`? - -The new `PyRuntimeInfo` provider and `py_runtime_pair` rule would have forwarding aliases set up, so they could be accessed both from `@bazel_tools` and `rules_python` during a future migration window. - -Forwarding aliases would also be defined for the toolchain type and the two `constraint_setting`s. Note that aliasing `toolchain_type`s is currently broken ([#7404](https://github.com/bazelbuild/bazel/issues/7404)). - -In the initial implementation of this proposal, the predefined `autodetecting_python_toolchain` will be automatically registered in the user's workspace by Bazel. This follows precedent for other languages with built-in support in Bazel. Once the rules are migrated to `rules_python`, registration will not be automatic; the user will have to explicitly call a configuration helper defined in `rules_python` from their own `WORKSPACE` file. - -## Changelog - -Date | Change ------------- | ------ -2019-02-12 | Initial version -2019-02-14 | Make `PyRuntimeInfo` natively defined -2019-02-15 | Clarify platform runtime vs in-build runtime -2019-02-21 | Formal approval diff --git a/proposals/README.md b/proposals/README.md deleted file mode 100644 index 36a8a0b7d3..0000000000 --- a/proposals/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Python Rules Proposals - -This is an index of all design documents and proposals for Python rules, both in native code (the Bazel binary) and in Starlark (the rules_python repository). Some of these proposals are also hosted in this directory. - -Proposals that impact native code are also indexed by [bazelbuild/proposals](https://github.com/bazelbuild/proposals), and subject to the [Bazel design process](https://bazel.build/designs/index.html). - -Last updated | Status | Title | Author(s) ------------- | ------------- | ------| --------- -2019-02-21 | Accepted | [Design for a Python Toolchain](https://github.com/bazelbuild/rules_python/blob/master/proposals/2019-02-12-design-for-a-python-toolchain.md) | [brandjon@](https://github.com/brandjon) -2018-11-09 | Draft | [Customizing the Python Stub Template](https://github.com/bazelbuild/rules_python/blob/master/proposals/2018-11-08-customizing-the-python-stub-template.md) | [brandjon@](https://github.com/brandjon) -2019-01-11 | Accepted | [Selecting Between Python 2 and 3](https://github.com/bazelbuild/rules_python/blob/master/proposals/2018-10-25-selecting-between-python-2-and-3.md) | [brandjon@](https://github.com/brandjon) From 95b150db2544c422823d097e1d5ab46774d8b5e5 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 18 Jun 2024 13:43:19 -0700 Subject: [PATCH 080/345] chore: use `**` globs instead of explcit BUILD.bazel reference in distribution filegroups (#1991) This is to make Google patching and imports of rules_python easier. Within Google, `BUILD` is the file name instead of `BUILD.bazel`. It's also easy for the distribution filegroups to accidentally miss files, so to prevent that, just glob everything. --- python/config_settings/BUILD.bazel | 3 +-- python/config_settings/private/BUILD.bazel | 4 +--- python/entry_points/BUILD.bazel | 6 +----- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel index 73e6ef941b..f4411744ca 100644 --- a/python/config_settings/BUILD.bazel +++ b/python/config_settings/BUILD.bazel @@ -18,8 +18,7 @@ load(":config_settings.bzl", "construct_config_settings") filegroup( name = "distribution", - srcs = glob(["*.bzl"]) + [ - "BUILD.bazel", + srcs = glob(["**"]) + [ "//python/config_settings/private:distribution", ], visibility = ["//python:__pkg__"], diff --git a/python/config_settings/private/BUILD.bazel b/python/config_settings/private/BUILD.bazel index aa68c6508c..cb42e4999a 100644 --- a/python/config_settings/private/BUILD.bazel +++ b/python/config_settings/private/BUILD.bazel @@ -1,7 +1,5 @@ filegroup( name = "distribution", - srcs = glob(["*.bzl"]) + [ - "BUILD.bazel", - ], + srcs = glob(["**"]), visibility = ["//python/config_settings:__pkg__"], ) diff --git a/python/entry_points/BUILD.bazel b/python/entry_points/BUILD.bazel index d45fb18825..46dbd9298b 100644 --- a/python/entry_points/BUILD.bazel +++ b/python/entry_points/BUILD.bazel @@ -32,10 +32,6 @@ bzl_library( filegroup( name = "distribution", - srcs = glob([ - "*.bzl", - ]) + [ - "BUILD.bazel", - ], + srcs = glob(["**"]), visibility = ["//python:__subpackages__"], ) From d7e07fcdcc70fefea438f558a811099b5da756c1 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 18 Jun 2024 16:15:55 -0700 Subject: [PATCH 081/345] refactor(internal): allow setting linking mode for internal cc_details APIs (#1982) This upstreams a Google patch to control how py_binary links C++ dependencies. This just extends the internal helper functions a bit to allow specifying some of the otherwise hard coded values and passing in additional args to the cc_details struct. --- python/private/common/common.bzl | 12 +++++++++- python/private/common/py_executable.bzl | 22 +++++++++---------- python/private/common/py_executable_bazel.bzl | 1 + 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/python/private/common/common.bzl b/python/private/common/common.bzl index 0ac9187b79..5559ccd195 100644 --- a/python/private/common/common.bzl +++ b/python/private/common/common.bzl @@ -153,7 +153,9 @@ def create_cc_details_struct( cc_info_for_self_link, cc_info_with_extra_link_time_libraries, extra_runfiles, - cc_toolchain): + cc_toolchain, + feature_config, + **kwargs): """Creates a CcDetails struct. Args: @@ -170,6 +172,12 @@ def create_cc_details_struct( part of `cc_info_with_extra_link_time_libraries`; should be added to runfiles. cc_toolchain: CcToolchain that should be used when building. + feature_config: struct from cc_configure_features(); see + //python/private/common:py_executable.bzl%cc_configure_features. + **kwargs: Additional keys/values to set in the returned struct. This is to + facilitate extensions with less patching. Any added fields should + pick names that are unlikely to collide if the CcDetails API has + additional fields added. Returns: A `CcDetails` struct. @@ -180,6 +188,8 @@ def create_cc_details_struct( cc_info_with_extra_link_time_libraries = cc_info_with_extra_link_time_libraries, extra_runfiles = extra_runfiles, cc_toolchain = cc_toolchain, + feature_config = feature_config, + **kwargs ) def create_executable_result_struct(*, extra_files_to_build, output_groups, extra_runfiles = None): diff --git a/python/private/common/py_executable.bzl b/python/private/common/py_executable.bzl index cbe7ccf279..6b75b4139a 100644 --- a/python/private/common/py_executable.bzl +++ b/python/private/common/py_executable.bzl @@ -554,15 +554,7 @@ def _get_native_deps_details(ctx, *, semantics, cc_details, is_test): dso = ctx.actions.declare_file(semantics.get_native_deps_dso_name(ctx)) share_native_deps = py_internal.share_native_deps(ctx) - cc_feature_config = cc_configure_features( - ctx, - cc_toolchain = cc_details.cc_toolchain, - # See b/171276569#comment18: this feature string is just to allow - # Google's RBE to know the link action is for the Python case so it can - # take special actions (though as of Jun 2022, no special action is - # taken). - extra_features = ["native_deps_link"], - ) + cc_feature_config = cc_details.feature_config if share_native_deps: linked_lib = _create_shared_native_deps_dso( ctx, @@ -921,7 +913,12 @@ def create_base_executable_rule(*, attrs, fragments = [], **kwargs): **kwargs ) -def cc_configure_features(ctx, *, cc_toolchain, extra_features): +def cc_configure_features( + ctx, + *, + cc_toolchain, + extra_features, + linking_mode = "static_linking_mode"): """Configure C++ features for Python purposes. Args: @@ -929,11 +926,14 @@ def cc_configure_features(ctx, *, cc_toolchain, extra_features): cc_toolchain: The CcToolchain the target is using. extra_features: list of strings; additional features to request be enabled. + linking_mode: str; either "static_linking_mode" or + "dynamic_linking_mode". Specifies the linking mode feature for + C++ linking. Returns: struct of the feature configuration and all requested features. """ - requested_features = ["static_linking_mode"] + requested_features = [linking_mode] requested_features.extend(extra_features) requested_features.extend(ctx.features) if "legacy_whole_archive" not in ctx.disabled_features: diff --git a/python/private/common/py_executable_bazel.bzl b/python/private/common/py_executable_bazel.bzl index 361e075a39..a0cfebad8a 100644 --- a/python/private/common/py_executable_bazel.bzl +++ b/python/private/common/py_executable_bazel.bzl @@ -560,6 +560,7 @@ def _get_cc_details_for_binary(ctx, extra_deps): extra_runfiles = ctx.runfiles(), # Though the rules require the CcToolchain, it isn't actually used. cc_toolchain = None, + feature_config = None, ) def _get_interpreter_path(ctx, *, runtime, flag_interpreter_path): From cf1f36dd9c0150f1eca5c518d66b49bc6159c68f Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Wed, 19 Jun 2024 13:08:58 +0900 Subject: [PATCH 082/345] fix(toolchain): disable exec toolchain by default (#1968) This makes the exec tools toolchain disabled by default to prevent toolchain resolution from matching it and inadvertently pulling in a dependency on the hermetic runtimes. While the hermetic runtime wouldn't actually be used (precompiling is disabled by default), the dependency triggered downloading of the runtimes, which breaks environments which forbid remote downloads they haven't vetted (such a case is Bazel's own build process). To fix this, a flag is added to control if the exec tools toolchain is enabled or not. When disabled (the default), the toolchain won't match, and the remote dependency isn't triggered. Fixes #1967. --------- Co-authored-by: Richard Levasseur --- CHANGELOG.md | 5 ++++ .../api/python/config_settings/index.md | 26 ++++++++++++++++++- docs/sphinx/toolchains.md | 2 +- python/config_settings/BUILD.bazel | 20 ++++++++++++++ python/private/BUILD.bazel | 1 + python/private/autodetecting_toolchain.bzl | 3 ++- python/private/flags.bzl | 9 +++++++ python/private/py_toolchain_suite.bzl | 14 ++++++++-- .../precompile/precompile_tests.bzl | 7 +++++ tests/support/support.bzl | 1 + 10 files changed, 83 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c978cd6a6f..00ba8e4731 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,11 @@ A brief description of the categories of changes: reduce the total number of targets in the hub repo. ### Fixed +* (toolchains) The {obj}`exec_tools_toolchain_type` is disabled by default. + To enable it, set {obj}`--//python/config_settings:exec_tools_toolchain=enabled`. + This toolchain must be enabled for precompilation to work. This toolchain will + be enabled by default in a future release. + Fixes [1967](https://github.com/bazelbuild/rules_python/issues/1967). * (bzlmod): Targets in `all_requirements` now use the same form as targets returned by the `requirement` macro. * (rules) Auto exec groups are enabled. This allows actions run by the rules, such as precompiling, to pick an execution platform separately from what diff --git a/docs/sphinx/api/python/config_settings/index.md b/docs/sphinx/api/python/config_settings/index.md index 8c23bf6855..50647abb8d 100644 --- a/docs/sphinx/api/python/config_settings/index.md +++ b/docs/sphinx/api/python/config_settings/index.md @@ -10,6 +10,22 @@ Determines the default hermetic Python toolchain version. This can be set to one of the values that `rules_python` maintains. ::: +::::{bzl:flag} exec_tools_toolchain +Determines if the {obj}`exec_tools_toolchain_type` toolchain is enabled. + +:::{note} +* Note that this only affects the rules_python generated toolchains. +::: + +Values: + +* `enabled`: Allow matching of the registered toolchains at build time. +* `disabled`: Prevent the toolchain from being matched at build time. + +:::{versionadded} 0.33.2 +::: +:::: + ::::{bzl:flag} precompile Determines if Python source files should be compiled at build time. @@ -34,6 +50,8 @@ Values: * `force_disabled`: Like `disabled`, except overrides target-level setting. This is useful useful for development, testing enabling precompilation more broadly, or as an escape hatch if build-time compiling is not available. +:::{versionadded} 0.33.0 +::: :::: ::::{bzl:flag} precompile_source_retention @@ -51,9 +69,11 @@ Values: * `omit_source`: Don't include the orignal py source. * `omit_if_generated_source`: Keep the original source if it's a regular source file, but omit it if it's a generated file. +:::{versionadded} 0.33.0 +::: :::: -:::{bzl:flag} precompile_add_to_runfiles +::::{bzl:flag} precompile_add_to_runfiles Determines if a target adds its compiled files to its runfiles. When a target compiles its files, but doesn't add them to its own runfiles, it @@ -66,7 +86,9 @@ Values: runfiles; they are still added to {bzl:obj}`PyInfo.transitive_pyc_files`. See also: {bzl:obj}`py_binary.pyc_collection` attribute. This is useful for allowing incrementally enabling precompilation on a per-binary basis. +:::{versionadded} 0.33.0 ::: +:::: ::::{bzl:flag} pyc_collection Determine if `py_binary` collects transitive pyc files. @@ -78,6 +100,8 @@ This flag is overridden by the target level `pyc_collection` attribute. Values: * `include_pyc`: Include `PyInfo.transitive_pyc_files` as part of the binary. * `disabled`: Don't include `PyInfo.transitive_pyc_files` as part of the binary. +:::{versionadded} 0.33.0 +::: :::: ::::{bzl:flag} py_linux_libc diff --git a/docs/sphinx/toolchains.md b/docs/sphinx/toolchains.md index e3be22f97b..26557cabed 100644 --- a/docs/sphinx/toolchains.md +++ b/docs/sphinx/toolchains.md @@ -233,7 +233,7 @@ use `python3` from the environment a binary runs within. This provides extremely limited functionality to the rules (at build time, nothing is knowable about the Python runtime). -Bazel itself automatically registers `@bazel_tools//python:autodetecting_toolchain` +Bazel itself automatically registers `@bazel_tools//tools/python:autodetecting_toolchain` as the lowest priority toolchain. For WORKSPACE builds, if no other toolchain is registered, that toolchain will be used. For bzlmod builds, rules_python automatically registers a higher-priority toolchain; it won't be used unless diff --git a/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel index f4411744ca..1003efb8c2 100644 --- a/python/config_settings/BUILD.bazel +++ b/python/config_settings/BUILD.bazel @@ -2,6 +2,7 @@ load("@bazel_skylib//rules:common_settings.bzl", "string_flag") load( "//python/private:flags.bzl", "BootstrapImplFlag", + "ExecToolsToolchainFlag", "PrecompileAddToRunfilesFlag", "PrecompileFlag", "PrecompileSourceRetentionFlag", @@ -28,6 +29,25 @@ construct_config_settings( name = "construct_config_settings", ) +string_flag( + name = "exec_tools_toolchain", + build_setting_default = ExecToolsToolchainFlag.DISABLED, + values = sorted(ExecToolsToolchainFlag.__members__.values()), + # NOTE: Only public because it is used in py_toolchain_suite from toolchain + # repositories + visibility = ["//visibility:private"], +) + +config_setting( + name = "is_exec_tools_toolchain_enabled", + flag_values = { + "exec_tools_toolchain": ExecToolsToolchainFlag.ENABLED, + }, + # NOTE: Only public because it is used in py_toolchain_suite from toolchain + # repositories + visibility = ["//visibility:public"], +) + string_flag( name = "precompile", build_setting_default = PrecompileFlag.AUTO, diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 422ed9c7c2..e2a2bc01a2 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -59,6 +59,7 @@ bzl_library( name = "autodetecting_toolchain_bzl", srcs = ["autodetecting_toolchain.bzl"], deps = [ + ":toolchain_types_bzl", "//python:py_runtime_bzl", "//python:py_runtime_pair_bzl", ], diff --git a/python/private/autodetecting_toolchain.bzl b/python/private/autodetecting_toolchain.bzl index 55c95699c9..174136e870 100644 --- a/python/private/autodetecting_toolchain.bzl +++ b/python/private/autodetecting_toolchain.bzl @@ -16,6 +16,7 @@ load("//python:py_runtime.bzl", "py_runtime") load("//python:py_runtime_pair.bzl", "py_runtime_pair") +load(":toolchain_types.bzl", "TARGET_TOOLCHAIN_TYPE") def define_autodetecting_toolchain(name): """Defines the autodetecting Python toolchain. @@ -65,6 +66,6 @@ def define_autodetecting_toolchain(name): native.toolchain( name = name, toolchain = ":_autodetecting_py_runtime_pair", - toolchain_type = ":toolchain_type", + toolchain_type = TARGET_TOOLCHAIN_TYPE, visibility = ["//visibility:public"], ) diff --git a/python/private/flags.bzl b/python/private/flags.bzl index d141f72eee..fa31262c94 100644 --- a/python/private/flags.bzl +++ b/python/private/flags.bzl @@ -37,6 +37,15 @@ def _precompile_flag_get_effective_value(ctx): value = PrecompileFlag.DISABLED return value +# Determines if the Python exec tools toolchain should be registered. +# buildifier: disable=name-conventions +ExecToolsToolchainFlag = enum( + # Enable registering the exec tools toolchain using the hermetic toolchain. + ENABLED = "enabled", + # Disable registering the exec tools toolchain using the hermetic toolchain. + DISABLED = "disabled", +) + # Determines if Python source files should be compiled at build time. # # NOTE: The flag value is overridden by the target-level attribute, except diff --git a/python/private/py_toolchain_suite.bzl b/python/private/py_toolchain_suite.bzl index 64ed0c3995..564e0ee45d 100644 --- a/python/private/py_toolchain_suite.bzl +++ b/python/private/py_toolchain_suite.bzl @@ -22,6 +22,8 @@ load( "TARGET_TOOLCHAIN_TYPE", ) +_IS_EXEC_TOOLCHAIN_ENABLED = Label("//python/config_settings:is_exec_tools_toolchain_enabled") + def py_toolchain_suite(*, prefix, user_repository_name, python_version, set_python_version_constraint, flag_values, **kwargs): """For internal use only. @@ -106,8 +108,16 @@ def py_toolchain_suite(*, prefix, user_repository_name, python_version, set_pyth user_repository_name = user_repository_name, ), toolchain_type = EXEC_TOOLS_TOOLCHAIN_TYPE, - # The target settings capture the Python version - target_settings = target_settings, + target_settings = select({ + _IS_EXEC_TOOLCHAIN_ENABLED: target_settings, + # Whatever the default is, it has to map to a `config_setting` + # that will never match. Since the default branch is only taken if + # _IS_EXEC_TOOLCHAIN_ENABLED is false, then it will never match + # when later evaluated during toolchain resolution. + # Note that @platforms//:incompatible can't be used here because + # the RHS must be a `config_setting`. + "//conditions:default": [_IS_EXEC_TOOLCHAIN_ENABLED], + }), exec_compatible_with = kwargs.get("target_compatible_with"), ) diff --git a/tests/base_rules/precompile/precompile_tests.bzl b/tests/base_rules/precompile/precompile_tests.bzl index 02ab4ab19c..58bdafe39c 100644 --- a/tests/base_rules/precompile/precompile_tests.bzl +++ b/tests/base_rules/precompile/precompile_tests.bzl @@ -27,6 +27,7 @@ load("//tests/base_rules:py_info_subject.bzl", "py_info_subject") load( "//tests/support:support.bzl", "CC_TOOLCHAIN", + "EXEC_TOOLS_TOOLCHAIN", "PLATFORM_TOOLCHAIN", "PRECOMPILE", "PRECOMPILE_ADD_TO_RUNFILES", @@ -61,6 +62,7 @@ def _test_precompile_enabled_setup(name, py_rule, **kwargs): target = name + "_subject", config_settings = { "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, + EXEC_TOOLS_TOOLCHAIN: "enabled", }, ) @@ -119,6 +121,7 @@ def _test_pyc_only(name): config_settings = { "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, ##PRECOMPILE_SOURCE_RETENTION: "omit_source", + EXEC_TOOLS_TOOLCHAIN: "enabled", }, target = name + "_subject", ) @@ -161,6 +164,7 @@ def _test_precompile_if_generated(name): target = name + "_subject", config_settings = { "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, + EXEC_TOOLS_TOOLCHAIN: "enabled", }, ) @@ -203,6 +207,7 @@ def _test_omit_source_if_generated_source(name): config_settings = { "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, PRECOMPILE_SOURCE_RETENTION: "omit_if_generated_source", + EXEC_TOOLS_TOOLCHAIN: "enabled", }, ) @@ -252,6 +257,7 @@ def _test_precompile_add_to_runfiles_decided_elsewhere(name): "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, PRECOMPILE_ADD_TO_RUNFILES: "decided_elsewhere", PRECOMPILE: "enabled", + EXEC_TOOLS_TOOLCHAIN: "enabled", }, ) @@ -288,6 +294,7 @@ def _test_precompiler_action(name): target = name + "_subject", config_settings = { "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, + EXEC_TOOLS_TOOLCHAIN: "enabled", }, ) diff --git a/tests/support/support.bzl b/tests/support/support.bzl index 4bcc554854..efcc43a54f 100644 --- a/tests/support/support.bzl +++ b/tests/support/support.bzl @@ -31,6 +31,7 @@ CC_TOOLCHAIN = str(Label("//tests/cc:all")) # str() around Label() is necessary because rules_testing's config_settings # doesn't accept yet Label objects. +EXEC_TOOLS_TOOLCHAIN = str(Label("//python/config_settings:exec_tools_toolchain")) PRECOMPILE = str(Label("//python/config_settings:precompile")) PYC_COLLECTION = str(Label("//python/config_settings:pyc_collection")) PRECOMPILE_SOURCE_RETENTION = str(Label("//python/config_settings:precompile_source_retention")) From a1d2e45e8bbc838197b4f1d130d72793a20541a4 Mon Sep 17 00:00:00 2001 From: lberki Date: Wed, 19 Jun 2024 15:54:02 +0200 Subject: [PATCH 083/345] fix: Resolve the test manifest with the runfiles lib. (#1993) This makes it possible for the test to work with sibling repository layout. Tested by running the :gazelle_python_manifest.test in build_file_generation with all combinations of both values of --legacy_external_runfiles, --enable_bzlmod and --sibling_repository_layout. --- gazelle/manifest/defs.bzl | 7 +++++-- gazelle/manifest/test/test.go | 8 +++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/gazelle/manifest/defs.bzl b/gazelle/manifest/defs.bzl index ccabfd2994..542f6dc015 100644 --- a/gazelle/manifest/defs.bzl +++ b/gazelle/manifest/defs.bzl @@ -116,7 +116,7 @@ def gazelle_python_manifest( attrs = { "env": { "_TEST_MANIFEST": "$(rootpath {})".format(manifest), - "_TEST_MANIFEST_GENERATOR_HASH": "$(rootpath {})".format(manifest_generator_hash), + "_TEST_MANIFEST_GENERATOR_HASH": "$(rlocationpath {})".format(manifest_generator_hash), "_TEST_REQUIREMENTS": "$(rootpath {})".format(requirements), }, "size": "small", @@ -130,7 +130,10 @@ def gazelle_python_manifest( manifest_generator_hash, ], rundir = ".", - deps = [Label("//manifest")], + deps = [ + Label("//manifest"), + Label("@com_github_bazelbuild_rules_go//go/runfiles"), + ], # kwargs could contain test-specific attributes like size or timeout **dict(attrs, **kwargs) ) diff --git a/gazelle/manifest/test/test.go b/gazelle/manifest/test/test.go index 72cb260d4d..506c7d2074 100644 --- a/gazelle/manifest/test/test.go +++ b/gazelle/manifest/test/test.go @@ -26,6 +26,7 @@ import ( "path/filepath" "testing" + "github.com/bazelbuild/rules_go/go/runfiles" "github.com/bazelbuild/rules_python/gazelle/manifest" ) @@ -49,7 +50,12 @@ func TestGazelleManifestIsUpdated(t *testing.T) { t.Fatal("failed to find the Gazelle manifest file integrity") } - manifestGeneratorHashPath := os.Getenv("_TEST_MANIFEST_GENERATOR_HASH") + manifestGeneratorHashPath, err := runfiles.Rlocation( + os.Getenv("_TEST_MANIFEST_GENERATOR_HASH")) + if err != nil { + t.Fatal("failed to resolve runfiles path of manifest: %v", err) + } + manifestGeneratorHash, err := os.Open(manifestGeneratorHashPath) if err != nil { t.Fatalf("opening %q: %v", manifestGeneratorHashPath, err) From 0533e75ef78dd8b1b83c76aaf76a01aff7316670 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 19 Jun 2024 08:23:10 -0700 Subject: [PATCH 084/345] fix: allow creating PyRuntimeInfo without specifying interpreter_version_info (#1992) This regression was flagged by some of the Bazel tests. When the dict->struct interpreter_version code was factored out, it didn't properly handle the value `None`, which occurs if the provider is directly instantiated (None comes from the initializer default). To fix, treat None as an empty dict. The logic already assumes the dict is potentially empty or missing keys, so it can continue on OK. Also adds a test for creating PyRuntimeInfo without this argument. --- CHANGELOG.md | 2 + python/private/common/providers.bzl | 4 +- tests/py_runtime_info/BUILD.bazel | 5 ++ .../py_runtime_info/py_runtime_info_tests.bzl | 65 +++++++++++++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 tests/py_runtime_info/BUILD.bazel create mode 100644 tests/py_runtime_info/py_runtime_info_tests.bzl diff --git a/CHANGELOG.md b/CHANGELOG.md index 00ba8e4731..46ddd1b609 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,8 @@ A brief description of the categories of changes: * (rules) Auto exec groups are enabled. This allows actions run by the rules, such as precompiling, to pick an execution platform separately from what other toolchains support. +* (providers) {obj}`PyRuntimeInfo` doesn't require passing the + `interpreter_version_info` arg. ### Removed * Nothing yet diff --git a/python/private/common/providers.bzl b/python/private/common/providers.bzl index e1876ff9d3..eb8b910a2e 100644 --- a/python/private/common/providers.bzl +++ b/python/private/common/providers.bzl @@ -41,13 +41,13 @@ 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 of versio info fields. See interpreter_version_info + 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) # Copy in case the original is frozen + 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'") diff --git a/tests/py_runtime_info/BUILD.bazel b/tests/py_runtime_info/BUILD.bazel new file mode 100644 index 0000000000..c501d6d8b1 --- /dev/null +++ b/tests/py_runtime_info/BUILD.bazel @@ -0,0 +1,5 @@ +load(":py_runtime_info_tests.bzl", "py_runtime_info_test_suite") + +py_runtime_info_test_suite( + name = "py_runtime_info_tests", +) diff --git a/tests/py_runtime_info/py_runtime_info_tests.bzl b/tests/py_runtime_info/py_runtime_info_tests.bzl new file mode 100644 index 0000000000..9acf541683 --- /dev/null +++ b/tests/py_runtime_info/py_runtime_info_tests.bzl @@ -0,0 +1,65 @@ +# 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. +"""Starlark tests for PyRuntimeInfo provider.""" + +load("@rules_testing//lib:analysis_test.bzl", "analysis_test") +load("@rules_testing//lib:test_suite.bzl", "test_suite") +load("//python:py_runtime_info.bzl", "PyRuntimeInfo") +load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility + +def _create_py_runtime_info_without_interpreter_version_info_impl(ctx): + kwargs = {} + if IS_BAZEL_7_OR_HIGHER: + kwargs["bootstrap_template"] = ctx.attr.bootstrap_template + + return [PyRuntimeInfo( + interpreter = ctx.file.interpreter, + files = depset(ctx.files.files), + python_version = "PY3", + **kwargs + )] + +_create_py_runtime_info_without_interpreter_version_info = rule( + implementation = _create_py_runtime_info_without_interpreter_version_info_impl, + attrs = { + "bootstrap_template": attr.label(allow_single_file = True, default = "bootstrap.txt"), + "files": attr.label_list(allow_files = True, default = ["data.txt"]), + "interpreter": attr.label(allow_single_file = True, default = "interpreter.sh"), + "python_version": attr.string(default = "PY3"), + }, +) + +_tests = [] + +def _test_can_create_py_runtime_info_without_interpreter_version_info(name): + _create_py_runtime_info_without_interpreter_version_info( + name = name + "_subject", + ) + analysis_test( + name = name, + target = name + "_subject", + impl = _test_can_create_py_runtime_info_without_interpreter_version_info_impl, + ) + +def _test_can_create_py_runtime_info_without_interpreter_version_info_impl(env, target): + # If we get this for, construction succeeded, so nothing to check + _ = env, target # @unused + +_tests.append(_test_can_create_py_runtime_info_without_interpreter_version_info) + +def py_runtime_info_test_suite(name): + test_suite( + name = name, + tests = _tests, + ) From a124c845463ce9b7c1a071a10a28500a88cb309a Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Thu, 20 Jun 2024 00:23:36 +0900 Subject: [PATCH 085/345] doc: Changelog updates for 0.33.2 (#1995) This is to include the changelog in the auto-generated docs. --------- Co-authored-by: Richard Levasseur --- CHANGELOG.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46ddd1b609..240abee424 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,11 +30,6 @@ A brief description of the categories of changes: reduce the total number of targets in the hub repo. ### Fixed -* (toolchains) The {obj}`exec_tools_toolchain_type` is disabled by default. - To enable it, set {obj}`--//python/config_settings:exec_tools_toolchain=enabled`. - This toolchain must be enabled for precompilation to work. This toolchain will - be enabled by default in a future release. - Fixes [1967](https://github.com/bazelbuild/rules_python/issues/1967). * (bzlmod): Targets in `all_requirements` now use the same form as targets returned by the `requirement` macro. * (rules) Auto exec groups are enabled. This allows actions run by the rules, such as precompiling, to pick an execution platform separately from what @@ -45,6 +40,17 @@ A brief description of the categories of changes: ### Removed * Nothing yet +## [0.33.2] - 2024-06-13 + +[0.33.2]: https://github.com/bazelbuild/rules_python/releases/tag/0.33.2 + +### Fixed +* (toolchains) The {obj}`exec_tools_toolchain_type` is disabled by default. + To enable it, set {obj}`--//python/config_settings:exec_tools_toolchain=enabled`. + This toolchain must be enabled for precompilation to work. This toolchain will + be enabled by default in a future release. + Fixes [1967](https://github.com/bazelbuild/rules_python/issues/1967). + ## [0.33.1] - 2024-06-13 [0.33.1]: https://github.com/bazelbuild/rules_python/releases/tag/0.33.1 From 0b6b471f18382456bec3a292585ea38b71770ad4 Mon Sep 17 00:00:00 2001 From: Greg Roodt Date: Thu, 20 Jun 2024 23:15:53 +1000 Subject: [PATCH 086/345] refactor!: Remove entrypoint (#1987) Removes the entrypoint macro. This has been replaced with `py_console_script_binary`. I was getting familiar again with the code-base today and remembered that we were on a path to deprecate `entrypoint` in favor of `py_console_script_binary`. So I did a very quick clean-up. It has been mentioned for a while that it would be removed, so I *think* removal is valid now from a compatibility standpoint: https://github.com/bazelbuild/rules_python/pull/1987/files#diff-fed3a6d7d568aea2237b65544571ef9519b5f249ddbb23d521e6e55161c10452L33 Either way, we probably don't want to carry this into the 1.0 --- .bazelci/presubmit.yml | 12 - .bazelignore | 1 - .bazelrc | 4 +- CHANGELOG.md | 2 +- examples/pip_parse_vendored/requirements.bzl | 5 - python/pip.bzl | 3 - .../pip_repository_requirements.bzl.tmpl | 5 - python/private/bzlmod/requirements.bzl.tmpl | 20 -- tests/integration/BUILD.bazel | 9 - .../pip_repository_entry_points/.bazelrc | 10 - .../pip_repository_entry_points/.gitignore | 4 - .../pip_repository_entry_points/BUILD.bazel | 32 --- .../pip_repository_entry_points/WORKSPACE | 32 --- .../pip_repository_entry_points_test.py | 83 ------- .../requirements.in | 8 - .../requirements.txt | 219 ----------------- .../requirements_windows.txt | 223 ------------------ 17 files changed, 3 insertions(+), 669 deletions(-) delete mode 100644 tests/integration/pip_repository_entry_points/.bazelrc delete mode 100644 tests/integration/pip_repository_entry_points/.gitignore delete mode 100644 tests/integration/pip_repository_entry_points/BUILD.bazel delete mode 100644 tests/integration/pip_repository_entry_points/WORKSPACE delete mode 100644 tests/integration/pip_repository_entry_points/pip_repository_entry_points_test.py delete mode 100644 tests/integration/pip_repository_entry_points/requirements.in delete mode 100644 tests/integration/pip_repository_entry_points/requirements.txt delete mode 100644 tests/integration/pip_repository_entry_points/requirements_windows.txt diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 30138d3be6..9fd7cae311 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -515,18 +515,6 @@ tasks: - "bazel run //:os_specific_requirements.update" - "git diff --exit-code" - integration_test_pip_repository_entry_points_macos_workspace: - <<: *reusable_build_test_all - <<: *common_workspace_flags - name: "pip_repository_entry_points: macOS, workspace" - working_directory: tests/integration/pip_repository_entry_points - platform: macos - integration_test_pip_repository_entry_points_windows_workspace: - <<: *reusable_build_test_all - <<: *common_workspace_flags - name: "pip_repository_entry_points: Windows, workspace" - working_directory: tests/integration/pip_repository_entry_points - platform: windows integration_test_ignore_root_user_error_macos_workspace: <<: *reusable_build_test_all diff --git a/.bazelignore b/.bazelignore index 713903d832..95391738c1 100644 --- a/.bazelignore +++ b/.bazelignore @@ -26,4 +26,3 @@ examples/py_proto_library/bazel-py_proto_library 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/pip_repository_entry_points/bazel-pip_repository_entry_points diff --git a/.bazelrc b/.bazelrc index 3b915864ce..07188a9196 100644 --- a/.bazelrc +++ b/.bazelrc @@ -4,8 +4,8 @@ # (Note, we cannot use `common --deleted_packages` because the bazel version command doesn't support it) # To update these lines, execute # `bazel run @rules_bazel_integration_test//tools:update_deleted_packages` -build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/dupe_requirements,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/pip_repository_entry_points,tests/integration/py_cc_toolchain_registered -query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/dupe_requirements,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/pip_repository_entry_points,tests/integration/py_cc_toolchain_registered +build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered test --test_output=errors diff --git a/CHANGELOG.md b/CHANGELOG.md index 240abee424..42c5d766ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,7 +38,7 @@ A brief description of the categories of changes: `interpreter_version_info` arg. ### Removed -* Nothing yet +* (pip): Removes the `entrypoint` macro that was replaced by `py_console_script_binary` in 0.26.0. ## [0.33.2] - 2024-06-13 diff --git a/examples/pip_parse_vendored/requirements.bzl b/examples/pip_parse_vendored/requirements.bzl index c6465955ba..8298f49cf2 100644 --- a/examples/pip_parse_vendored/requirements.bzl +++ b/examples/pip_parse_vendored/requirements.bzl @@ -30,11 +30,6 @@ def data_requirement(name): def dist_info_requirement(name): return "@my_project_pip_deps_vendored_{}//:{}".format(pip_utils.normalize_name(name), "dist_info") -def entry_point(pkg, script = None): - if not script: - script = pkg - return "@my_project_pip_deps_vendored_" + pip_utils.normalize_name(pkg) + "//:rules_python_wheel_entry_point_" + script - def _get_annotation(requirement): # This expects to parse `setuptools==58.2.0 --hash=sha256:2551203ae6955b9876741a26ab3e767bb3242dafe86a32a749ea0d78b6792f11` # down to `setuptools`. diff --git a/python/pip.bzl b/python/pip.bzl index c7cdbb2cc5..8cc091d3cb 100644 --- a/python/pip.bzl +++ b/python/pip.bzl @@ -106,9 +106,6 @@ def data_requirement(name): def dist_info_requirement(name): return "{macro_tmpl}".format(pip_utils.normalize_name(name), "dist_info") -def entry_point(pkg, script = None): - fail("Not implemented yet") - def install_deps(**whl_library_kwargs): {install_deps_calls} for wheel_name in _wheel_names: diff --git a/python/pip_install/pip_repository_requirements.bzl.tmpl b/python/pip_install/pip_repository_requirements.bzl.tmpl index 07b4b08148..2f4bcd6916 100644 --- a/python/pip_install/pip_repository_requirements.bzl.tmpl +++ b/python/pip_install/pip_repository_requirements.bzl.tmpl @@ -29,11 +29,6 @@ def data_requirement(name): def dist_info_requirement(name): return "%%MACRO_TMPL%%".format(pip_utils.normalize_name(name), "dist_info") -def entry_point(pkg, script = None): - if not script: - script = pkg - return "@%%NAME%%_" + pip_utils.normalize_name(pkg) + "//:rules_python_wheel_entry_point_" + script - def _get_annotation(requirement): # This expects to parse `setuptools==58.2.0 --hash=sha256:2551203ae6955b9876741a26ab3e767bb3242dafe86a32a749ea0d78b6792f11` # down to `setuptools`. diff --git a/python/private/bzlmod/requirements.bzl.tmpl b/python/private/bzlmod/requirements.bzl.tmpl index b99322dd96..ba227aeb2d 100644 --- a/python/private/bzlmod/requirements.bzl.tmpl +++ b/python/private/bzlmod/requirements.bzl.tmpl @@ -24,23 +24,3 @@ def data_requirement(name): def dist_info_requirement(name): return "%%MACRO_TMPL%%".format(pip_utils.normalize_name(name), "dist_info") - -def entry_point(pkg, script = None): - """entry_point returns the target of the canonical label of the package entrypoints. - """ - actual_script = script or pkg - - fail("""Please replace this instance of entry_point with the following: - -``` -load("@rules_python//python/entry_points:py_console_script_binary.bzl", "py_console_script_binary") - -py_console_script_binary( - name = "{pkg}", - pkg = "@%%NAME%%//{pkg}",{script} -) -``` -""".format( - pkg = pip_utils.normalize_name(pkg), - script = "" if not script else "\n script = \"%s\"," % actual_script, - )) diff --git a/tests/integration/BUILD.bazel b/tests/integration/BUILD.bazel index f48bd50353..f1c427f463 100644 --- a/tests/integration/BUILD.bazel +++ b/tests/integration/BUILD.bazel @@ -63,15 +63,6 @@ default_test_runner( # TODO: add compile_pip_requirements_test_from_external_repo -rules_python_integration_test( - name = "pip_repository_entry_points_workspace_test", - timeout = "long", - bzlmod = False, - # The dependencies needed for this test are not cross-platform: https://github.com/bazelbuild/rules_python/issues/260 - tags = ["fix-windows"], - workspace_path = "pip_repository_entry_points", -) - rules_python_integration_test( name = "compile_pip_requirements_test", ) diff --git a/tests/integration/pip_repository_entry_points/.bazelrc b/tests/integration/pip_repository_entry_points/.bazelrc deleted file mode 100644 index 55ee08f1f0..0000000000 --- a/tests/integration/pip_repository_entry_points/.bazelrc +++ /dev/null @@ -1,10 +0,0 @@ -# Bazel configuration flags - -build --enable_runfiles - -# https://docs.bazel.build/versions/main/best-practices.html#using-the-bazelrc-file -try-import %workspace%/user.bazelrc - -# The requirements.bzl entry_point functions aren't supported under bzlmod. -# They are replaced by py_console_script_binary, which already has tests -build --noexperimental_enable_bzlmod diff --git a/tests/integration/pip_repository_entry_points/.gitignore b/tests/integration/pip_repository_entry_points/.gitignore deleted file mode 100644 index e5ae073b3c..0000000000 --- a/tests/integration/pip_repository_entry_points/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# git ignore patterns - -/bazel-* -user.bazelrc diff --git a/tests/integration/pip_repository_entry_points/BUILD.bazel b/tests/integration/pip_repository_entry_points/BUILD.bazel deleted file mode 100644 index c39b1f0a2d..0000000000 --- a/tests/integration/pip_repository_entry_points/BUILD.bazel +++ /dev/null @@ -1,32 +0,0 @@ -load("@pip//:requirements.bzl", "entry_point") -load("@rules_python//python:defs.bzl", "py_test") -load("@rules_python//python:pip.bzl", "compile_pip_requirements") - -# This rule adds a convenient way to update the requirements file. -compile_pip_requirements( - name = "requirements", - src = "requirements.in", - requirements_windows = ":requirements_windows.txt", -) - -pip_sphinx = entry_point( - pkg = "sphinx", - script = "sphinx-build", -) - -pip_yamllint = entry_point("yamllint") - -py_test( - name = "pip_parse_entry_points_test", - srcs = ["pip_repository_entry_points_test.py"], - data = [ - pip_sphinx, - pip_yamllint, - ], - env = { - "SPHINX_BUILD_ENTRY_POINT": "$(rootpath {})".format(pip_sphinx), - "YAMLLINT_ENTRY_POINT": "$(rootpath {})".format(pip_yamllint), - }, - main = "pip_repository_entry_points_test.py", - deps = ["@rules_python//python/runfiles"], -) diff --git a/tests/integration/pip_repository_entry_points/WORKSPACE b/tests/integration/pip_repository_entry_points/WORKSPACE deleted file mode 100644 index 0ae087b2e0..0000000000 --- a/tests/integration/pip_repository_entry_points/WORKSPACE +++ /dev/null @@ -1,32 +0,0 @@ -workspace(name = "pip_entry_points_example") - -local_repository( - name = "rules_python", - path = "../../..", -) - -load("@rules_python//python:repositories.bzl", "py_repositories", "python_register_toolchains") - -py_repositories() - -# This toolchain is explicitly 3.10 while `rules_python` is 3.9 to act as -# a regression test, ensuring 3.10 is functional -python_register_toolchains( - name = "python310", - python_version = "3.10", -) - -load("@python310//:defs.bzl", "interpreter") -load("@rules_python//python:pip.bzl", "pip_parse") - -# For a more thorough example of `pip_parse`. See `@rules_python//examples/pip_parse` -pip_parse( - name = "pip", - python_interpreter_target = interpreter, - requirements_lock = "//:requirements.txt", - requirements_windows = "//:requirements_windows.txt", -) - -load("@pip//:requirements.bzl", "install_deps") - -install_deps() diff --git a/tests/integration/pip_repository_entry_points/pip_repository_entry_points_test.py b/tests/integration/pip_repository_entry_points/pip_repository_entry_points_test.py deleted file mode 100644 index 0375153615..0000000000 --- a/tests/integration/pip_repository_entry_points/pip_repository_entry_points_test.py +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env python3 -# 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. - - -import os -import subprocess -import unittest -from pathlib import Path - -from rules_python.python.runfiles import runfiles - - -class PipRepositoryEntryPointsTest(unittest.TestCase): - maxDiff = None - - def test_entry_point_void_return(self): - env = os.environ.get("YAMLLINT_ENTRY_POINT") - self.assertIsNotNone(env) - - r = runfiles.Create() - entry_point = Path(r.Rlocation(str(Path(*Path(env).parts[1:])))) - self.assertTrue(entry_point.exists()) - - proc = subprocess.run( - [str(entry_point), "--version"], - check=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - self.assertEqual(proc.stdout.decode("utf-8").strip(), "yamllint 1.28.0") - - # yamllint entry_point is of the form `def run(argv=None):` - with self.assertRaises(subprocess.CalledProcessError) as context: - subprocess.run( - [str(entry_point), "--option-does-not-exist"], - check=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - self.assertIn("returned non-zero exit status 2", str(context.exception)) - - def test_entry_point_int_return(self): - env = os.environ.get("SPHINX_BUILD_ENTRY_POINT") - self.assertIsNotNone(env) - - r = runfiles.Create() - entry_point = Path(r.Rlocation(str(Path(*Path(env).parts[1:])))) - self.assertTrue(entry_point.exists()) - - proc = subprocess.run( - [str(entry_point), "--version"], - check=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - # sphinx-build uses args[0] for its name, only assert the version here - self.assertTrue(proc.stdout.decode("utf-8").strip().endswith("4.3.2")) - - # sphinx-build entry_point is of the form `def main(argv: List[str] = sys.argv[1:]) -> int:` - with self.assertRaises(subprocess.CalledProcessError) as context: - subprocess.run( - [entry_point, "--option-does-not-exist"], - check=True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - self.assertIn("returned non-zero exit status 2", str(context.exception)) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/integration/pip_repository_entry_points/requirements.in b/tests/integration/pip_repository_entry_points/requirements.in deleted file mode 100644 index f5391eb014..0000000000 --- a/tests/integration/pip_repository_entry_points/requirements.in +++ /dev/null @@ -1,8 +0,0 @@ -sphinx==4.3.2 -yamllint>=1.28.0 - -# Last available for Ubuntu python3.6 -setuptools==65.5.1 - -certifi>=2023.7.22 # https://security.snyk.io/vuln/SNYK-PYTHON-CERTIFI-5805047 - diff --git a/tests/integration/pip_repository_entry_points/requirements.txt b/tests/integration/pip_repository_entry_points/requirements.txt deleted file mode 100644 index 1ef1f9dd5c..0000000000 --- a/tests/integration/pip_repository_entry_points/requirements.txt +++ /dev/null @@ -1,219 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# bazel run //:requirements.update -# -alabaster==0.7.12 \ - --hash=sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359 \ - --hash=sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02 - # via sphinx -babel==2.9.1 \ - --hash=sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9 \ - --hash=sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0 - # via sphinx -certifi==2023.7.22 \ - --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ - --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 - # via - # -r requirements.in - # requests -charset-normalizer==2.0.10 \ - --hash=sha256:876d180e9d7432c5d1dfd4c5d26b72f099d503e8fcc0feb7532c9289be60fcbd \ - --hash=sha256:cb957888737fc0bbcd78e3df769addb41fd1ff8cf950dc9e7ad7793f1bf44455 - # via requests -docutils==0.17.1 \ - --hash=sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125 \ - --hash=sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61 - # via sphinx -idna==3.3 \ - --hash=sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff \ - --hash=sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d - # via requests -imagesize==1.3.0 \ - --hash=sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c \ - --hash=sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d - # via sphinx -jinja2==3.0.3 \ - --hash=sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8 \ - --hash=sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7 - # via sphinx -markupsafe==2.0.1 \ - --hash=sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298 \ - --hash=sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64 \ - --hash=sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b \ - --hash=sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194 \ - --hash=sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567 \ - --hash=sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff \ - --hash=sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724 \ - --hash=sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74 \ - --hash=sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646 \ - --hash=sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35 \ - --hash=sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6 \ - --hash=sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a \ - --hash=sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6 \ - --hash=sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad \ - --hash=sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26 \ - --hash=sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38 \ - --hash=sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac \ - --hash=sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7 \ - --hash=sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6 \ - --hash=sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047 \ - --hash=sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75 \ - --hash=sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f \ - --hash=sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b \ - --hash=sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135 \ - --hash=sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8 \ - --hash=sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a \ - --hash=sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a \ - --hash=sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1 \ - --hash=sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9 \ - --hash=sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864 \ - --hash=sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914 \ - --hash=sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee \ - --hash=sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f \ - --hash=sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18 \ - --hash=sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8 \ - --hash=sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2 \ - --hash=sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d \ - --hash=sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b \ - --hash=sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b \ - --hash=sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86 \ - --hash=sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6 \ - --hash=sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f \ - --hash=sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb \ - --hash=sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833 \ - --hash=sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28 \ - --hash=sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e \ - --hash=sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415 \ - --hash=sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902 \ - --hash=sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f \ - --hash=sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d \ - --hash=sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9 \ - --hash=sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d \ - --hash=sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145 \ - --hash=sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066 \ - --hash=sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c \ - --hash=sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1 \ - --hash=sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a \ - --hash=sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207 \ - --hash=sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f \ - --hash=sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53 \ - --hash=sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd \ - --hash=sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134 \ - --hash=sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85 \ - --hash=sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9 \ - --hash=sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5 \ - --hash=sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94 \ - --hash=sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509 \ - --hash=sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51 \ - --hash=sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872 - # via jinja2 -packaging==21.3 \ - --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ - --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 - # via sphinx -pathspec==0.9.0 \ - --hash=sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a \ - --hash=sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1 - # via yamllint -pygments==2.11.2 \ - --hash=sha256:44238f1b60a76d78fc8ca0528ee429702aae011c265fe6a8dd8b63049ae41c65 \ - --hash=sha256:4e426f72023d88d03b2fa258de560726ce890ff3b630f88c21cbb8b2503b8c6a - # via sphinx -pyparsing==3.0.6 \ - --hash=sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4 \ - --hash=sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81 - # via packaging -pytz==2021.3 \ - --hash=sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c \ - --hash=sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326 - # via babel -pyyaml==6.0 \ - --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:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0 \ - --hash=sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92 \ - --hash=sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f \ - --hash=sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2 \ - --hash=sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc \ - --hash=sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c \ - --hash=sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86 \ - --hash=sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4 \ - --hash=sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c \ - --hash=sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34 \ - --hash=sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b \ - --hash=sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c \ - --hash=sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb \ - --hash=sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737 \ - --hash=sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3 \ - --hash=sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d \ - --hash=sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53 \ - --hash=sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78 \ - --hash=sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803 \ - --hash=sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a \ - --hash=sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174 \ - --hash=sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5 - # via yamllint -requests==2.27.1 \ - --hash=sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61 \ - --hash=sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d - # via sphinx -snowballstemmer==2.2.0 \ - --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 \ - --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a - # via sphinx -sphinx==4.3.2 \ - --hash=sha256:0a8836751a68306b3fe97ecbe44db786f8479c3bf4b80e3a7f5c838657b4698c \ - --hash=sha256:6a11ea5dd0bdb197f9c2abc2e0ce73e01340464feaece525e64036546d24c851 - # via -r requirements.in -sphinxcontrib-applehelp==1.0.2 \ - --hash=sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a \ - --hash=sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58 - # via sphinx -sphinxcontrib-devhelp==1.0.2 \ - --hash=sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e \ - --hash=sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4 - # via sphinx -sphinxcontrib-htmlhelp==2.0.0 \ - --hash=sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07 \ - --hash=sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2 - # via sphinx -sphinxcontrib-jsmath==1.0.1 \ - --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 \ - --hash=sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8 - # via sphinx -sphinxcontrib-qthelp==1.0.3 \ - --hash=sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72 \ - --hash=sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6 - # via sphinx -sphinxcontrib-serializinghtml==1.1.5 \ - --hash=sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd \ - --hash=sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952 - # via sphinx -urllib3==1.26.7 \ - --hash=sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece \ - --hash=sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844 - # via requests -yamllint==1.28.0 \ - --hash=sha256:89bb5b5ac33b1ade059743cf227de73daa34d5e5a474b06a5e17fc16583b0cf2 \ - --hash=sha256:9e3d8ddd16d0583214c5fdffe806c9344086721f107435f68bad990e5a88826b - # via -r requirements.in - -# The following packages are considered to be unsafe in a requirements file: -setuptools==65.5.1 \ - --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ - --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f - # via - # -r requirements.in - # sphinx - # yamllint diff --git a/tests/integration/pip_repository_entry_points/requirements_windows.txt b/tests/integration/pip_repository_entry_points/requirements_windows.txt deleted file mode 100644 index 83f2daaf4d..0000000000 --- a/tests/integration/pip_repository_entry_points/requirements_windows.txt +++ /dev/null @@ -1,223 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.10 -# by the following command: -# -# bazel run //:requirements.update -# -alabaster==0.7.12 \ - --hash=sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359 \ - --hash=sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02 - # via sphinx -babel==2.9.1 \ - --hash=sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9 \ - --hash=sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0 - # via sphinx -certifi==2023.7.22 \ - --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ - --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 - # via - # -r requirements.in - # requests -charset-normalizer==2.0.10 \ - --hash=sha256:876d180e9d7432c5d1dfd4c5d26b72f099d503e8fcc0feb7532c9289be60fcbd \ - --hash=sha256:cb957888737fc0bbcd78e3df769addb41fd1ff8cf950dc9e7ad7793f1bf44455 - # via requests -colorama==0.4.6 \ - --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ - --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 - # via sphinx -docutils==0.17.1 \ - --hash=sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125 \ - --hash=sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61 - # via sphinx -idna==3.7 \ - --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ - --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 - # via requests -imagesize==1.3.0 \ - --hash=sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c \ - --hash=sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d - # via sphinx -jinja2==3.1.4 \ - --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ - --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d - # via sphinx -markupsafe==2.0.1 \ - --hash=sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298 \ - --hash=sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64 \ - --hash=sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b \ - --hash=sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194 \ - --hash=sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567 \ - --hash=sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff \ - --hash=sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724 \ - --hash=sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74 \ - --hash=sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646 \ - --hash=sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35 \ - --hash=sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6 \ - --hash=sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a \ - --hash=sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6 \ - --hash=sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad \ - --hash=sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26 \ - --hash=sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38 \ - --hash=sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac \ - --hash=sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7 \ - --hash=sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6 \ - --hash=sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047 \ - --hash=sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75 \ - --hash=sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f \ - --hash=sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b \ - --hash=sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135 \ - --hash=sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8 \ - --hash=sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a \ - --hash=sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a \ - --hash=sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1 \ - --hash=sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9 \ - --hash=sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864 \ - --hash=sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914 \ - --hash=sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee \ - --hash=sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f \ - --hash=sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18 \ - --hash=sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8 \ - --hash=sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2 \ - --hash=sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d \ - --hash=sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b \ - --hash=sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b \ - --hash=sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86 \ - --hash=sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6 \ - --hash=sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f \ - --hash=sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb \ - --hash=sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833 \ - --hash=sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28 \ - --hash=sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e \ - --hash=sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415 \ - --hash=sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902 \ - --hash=sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f \ - --hash=sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d \ - --hash=sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9 \ - --hash=sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d \ - --hash=sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145 \ - --hash=sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066 \ - --hash=sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c \ - --hash=sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1 \ - --hash=sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a \ - --hash=sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207 \ - --hash=sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f \ - --hash=sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53 \ - --hash=sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd \ - --hash=sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134 \ - --hash=sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85 \ - --hash=sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9 \ - --hash=sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5 \ - --hash=sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94 \ - --hash=sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509 \ - --hash=sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51 \ - --hash=sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872 - # via jinja2 -packaging==21.3 \ - --hash=sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb \ - --hash=sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522 - # via sphinx -pathspec==0.9.0 \ - --hash=sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a \ - --hash=sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1 - # via yamllint -pygments==2.15.0 \ - --hash=sha256:77a3299119af881904cd5ecd1ac6a66214b6e9bed1f2db16993b54adede64094 \ - --hash=sha256:f7e36cffc4c517fbc252861b9a6e4644ca0e5abadf9a113c72d1358ad09b9500 - # via sphinx -pyparsing==3.0.6 \ - --hash=sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4 \ - --hash=sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81 - # via packaging -pytz==2021.3 \ - --hash=sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c \ - --hash=sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326 - # via babel -pyyaml==6.0 \ - --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:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0 \ - --hash=sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92 \ - --hash=sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f \ - --hash=sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2 \ - --hash=sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc \ - --hash=sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c \ - --hash=sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86 \ - --hash=sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4 \ - --hash=sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c \ - --hash=sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34 \ - --hash=sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b \ - --hash=sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c \ - --hash=sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb \ - --hash=sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737 \ - --hash=sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3 \ - --hash=sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d \ - --hash=sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53 \ - --hash=sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78 \ - --hash=sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803 \ - --hash=sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a \ - --hash=sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174 \ - --hash=sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5 - # via yamllint -requests==2.31.0 \ - --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ - --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 - # via sphinx -snowballstemmer==2.2.0 \ - --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 \ - --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a - # via sphinx -sphinx==4.3.2 \ - --hash=sha256:0a8836751a68306b3fe97ecbe44db786f8479c3bf4b80e3a7f5c838657b4698c \ - --hash=sha256:6a11ea5dd0bdb197f9c2abc2e0ce73e01340464feaece525e64036546d24c851 - # via -r requirements.in -sphinxcontrib-applehelp==1.0.2 \ - --hash=sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a \ - --hash=sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58 - # via sphinx -sphinxcontrib-devhelp==1.0.2 \ - --hash=sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e \ - --hash=sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4 - # via sphinx -sphinxcontrib-htmlhelp==2.0.0 \ - --hash=sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07 \ - --hash=sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2 - # via sphinx -sphinxcontrib-jsmath==1.0.1 \ - --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 \ - --hash=sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8 - # via sphinx -sphinxcontrib-qthelp==1.0.3 \ - --hash=sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72 \ - --hash=sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6 - # via sphinx -sphinxcontrib-serializinghtml==1.1.5 \ - --hash=sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd \ - --hash=sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952 - # via sphinx -urllib3==1.26.18 \ - --hash=sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07 \ - --hash=sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0 - # via requests -yamllint==1.28.0 \ - --hash=sha256:89bb5b5ac33b1ade059743cf227de73daa34d5e5a474b06a5e17fc16583b0cf2 \ - --hash=sha256:9e3d8ddd16d0583214c5fdffe806c9344086721f107435f68bad990e5a88826b - # via -r requirements.in - -# The following packages are considered to be unsafe in a requirements file: -setuptools==65.5.1 \ - --hash=sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31 \ - --hash=sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f - # via - # -r requirements.in - # sphinx - # yamllint From e8dcfefe5534afbf8cd17aa944be0db8f1be20a3 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 20 Jun 2024 12:22:33 -0700 Subject: [PATCH 087/345] refactor: lookup exec interpreter using toolchain resolution (#1997) This changes the exec tools toolchain to use toolchain resolution to find the interpreter. The main benefit of this is it avoids having to duplicate specifying where the interpreter is. Instead, it is automatically found by toolchain resolution. --- CHANGELOG.md | 3 + python/private/BUILD.bazel | 10 ++ python/private/common/py_library.bzl | 1 + python/private/py_exec_tools_info.bzl | 6 - python/private/py_exec_tools_toolchain.bzl | 36 +++-- python/repositories.bzl | 6 - tests/exec_toolchain_matching/BUILD.bazel | 76 +++++++++ .../exec_toolchain_matching_tests.bzl | 152 ++++++++++++++++++ tests/support/support.bzl | 5 +- 9 files changed, 271 insertions(+), 24 deletions(-) create mode 100644 tests/exec_toolchain_matching/BUILD.bazel create mode 100644 tests/exec_toolchain_matching/exec_toolchain_matching_tests.bzl diff --git a/CHANGELOG.md b/CHANGELOG.md index 42c5d766ea..af6e5273ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,9 @@ A brief description of the categories of changes: * `protobuf`/`com_google_protobuf` dependency bumped to `v24.4` * (bzlmod): optimize the creation of config settings used in pip to reduce the total number of targets in the hub repo. +* (toolchains) The exec tools toolchain now finds its interpreter by reusing + the regular interpreter toolchain. This avoids having to duplicate specifying + where the runtime for the exec tools toolchain is. ### Fixed * (bzlmod): Targets in `all_requirements` now use the same form as targets returned by the `requirement` macro. diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index e2a2bc01a2..cd385e3700 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -16,6 +16,7 @@ load("@bazel_skylib//:bzl_library.bzl", "bzl_library") load("//python:py_binary.bzl", "py_binary") load("//python:py_library.bzl", "py_library") load("//python:versions.bzl", "print_toolchains_checksums") +load(":py_exec_tools_toolchain.bzl", "current_interpreter_executable") load(":stamp.bzl", "stamp_build_setting") package( @@ -464,3 +465,12 @@ py_library( "//tests/entry_points:__pkg__", ], ) + +# The current toolchain's interpreter as an excutable, usable with +# executable=True attributes. +current_interpreter_executable( + name = "current_interpreter_executable", + # Not actually public. Only public because it's an implicit dependency of + # py_exec_tools_toolchain. + visibility = ["//visibility:public"], +) diff --git a/python/private/common/py_library.bzl b/python/private/common/py_library.bzl index 977bdb3312..673beedd2a 100644 --- a/python/private/common/py_library.bzl +++ b/python/private/common/py_library.bzl @@ -64,6 +64,7 @@ def py_library_impl(ctx, *, semantics): """ check_native_allowed(ctx) direct_sources = filter_to_py_srcs(ctx.files.srcs) + precompile_result = semantics.maybe_precompile(ctx, direct_sources) direct_pyc_files = depset(precompile_result.pyc_files) default_outputs = depset(precompile_result.keep_srcs, transitive = [direct_pyc_files]) diff --git a/python/private/py_exec_tools_info.bzl b/python/private/py_exec_tools_info.bzl index 3011f531c8..2998543102 100644 --- a/python/private/py_exec_tools_info.bzl +++ b/python/private/py_exec_tools_info.bzl @@ -31,12 +31,6 @@ to setup the runtime environment for the binary. See also: NOTE: What interpreter is used depends on the toolchain constraints. Ensure the proper target constraints are being applied when obtaining this from the toolchain. -""", - "exec_interpreter_version_info": """ -struct of interpreter version info for `exec_interpreter`. Note this -is for the exec interpreter, not the target interpreter. For version information -about the target Python runtime, use the `//python:toolchain_type` toolchain -information. """, "precompiler": """ Optional Target. The tool to use for generating pyc files. If not available, diff --git a/python/private/py_exec_tools_toolchain.bzl b/python/private/py_exec_tools_toolchain.bzl index 6036db4e7c..5c17b89625 100644 --- a/python/private/py_exec_tools_toolchain.bzl +++ b/python/private/py_exec_tools_toolchain.bzl @@ -14,15 +14,12 @@ """Rule that defines a toolchain for build tools.""" -load("//python/private/common:providers.bzl", "interpreter_version_info_struct_from_dict") +load("//python/private:toolchain_types.bzl", "TARGET_TOOLCHAIN_TYPE") load(":py_exec_tools_info.bzl", "PyExecToolsInfo") def _py_exec_tools_toolchain_impl(ctx): return [platform_common.ToolchainInfo(exec_tools = PyExecToolsInfo( exec_interpreter = ctx.attr.exec_interpreter, - exec_interpreter_version_info = interpreter_version_info_struct_from_dict( - ctx.attr.exec_interpreter_version_info, - ), precompiler = ctx.attr.precompiler, ))] @@ -30,13 +27,9 @@ py_exec_tools_toolchain = rule( implementation = _py_exec_tools_toolchain_impl, attrs = { "exec_interpreter": attr.label( + default = "//python/private:current_interpreter_executable", cfg = "exec", - allow_files = True, - doc = "See PyExecToolsInfo.exec_interpreter", - executable = True, - ), - "exec_interpreter_version_info": attr.string_dict( - doc = "See PyExecToolsInfo.exec_interpreter_version_info", + doc = "See PyexecToolsInfo.exec_interpreter.", ), "precompiler": attr.label( allow_files = True, @@ -45,3 +38,26 @@ py_exec_tools_toolchain = rule( ), }, ) + +def _current_interpreter_executable_impl(ctx): + toolchain = ctx.toolchains[TARGET_TOOLCHAIN_TYPE] + runtime = toolchain.py3_runtime + if runtime.interpreter: + executable = ctx.actions.declare_file(ctx.label.name) + ctx.actions.symlink(output = executable, target_file = runtime.interpreter, is_executable = True) + else: + executable = ctx.actions.declare_symlink(ctx.label.name) + ctx.actions.symlink(output = executable, target_path = runtime.interpreter_path) + return [ + toolchain, + DefaultInfo( + executable = executable, + runfiles = ctx.runfiles([executable], transitive_files = runtime.files), + ), + ] + +current_interpreter_executable = rule( + implementation = _current_interpreter_executable_impl, + toolchains = [TARGET_TOOLCHAIN_TYPE], + executable = True, +) diff --git a/python/repositories.bzl b/python/repositories.bzl index 4ffadd050a..245aae2546 100644 --- a/python/repositories.bzl +++ b/python/repositories.bzl @@ -399,12 +399,6 @@ py_cc_toolchain( py_exec_tools_toolchain( name = "py_exec_tools_toolchain", - exec_interpreter = "{python_path}", - exec_interpreter_version_info = {{ - "major": "{interpreter_version_info_major}", - "minor": "{interpreter_version_info_minor}", - "micro": "{interpreter_version_info_micro}", - }}, precompiler = "@rules_python//tools/precompiler:precompiler", ) """.format( diff --git a/tests/exec_toolchain_matching/BUILD.bazel b/tests/exec_toolchain_matching/BUILD.bazel new file mode 100644 index 0000000000..ce04bf7897 --- /dev/null +++ b/tests/exec_toolchain_matching/BUILD.bazel @@ -0,0 +1,76 @@ +# 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("//python/private:py_exec_tools_toolchain.bzl", "py_exec_tools_toolchain") # buildifier: disable=bzl-visibility +load( + ":exec_toolchain_matching_tests.bzl", + "define_py_runtime", + "exec_toolchain_matching_test_suite", +) + +exec_toolchain_matching_test_suite( + name = "exec_toolchain_matching_tests", +) + +define_py_runtime( + name = "target_3.12_linux", + interpreter_path = "/linux/python3.12", + interpreter_version_info = { + "major": "3", + "minor": "12", + }, +) + +define_py_runtime( + name = "target_3.12_mac", + interpreter_path = "/mac/python3.12", + interpreter_version_info = { + "major": "3", + "minor": "12", + }, +) + +define_py_runtime( + name = "target_3.12_any", + interpreter_path = "/any/python3.11", + interpreter_version_info = { + "major": "3", + "minor": "11", + }, +) + +define_py_runtime( + name = "target_default", + interpreter_path = "/should_not_match_anything", + interpreter_version_info = { + "major": "-1", + "minor": "-1", + }, +) + +# While these have the same definition, we register duplicates with different +# names because it makes understanding toolchain resolution easier. Toolchain +# resolution debug output shows the implementation name, not the toolchain() +# call that was being evaluated. +py_exec_tools_toolchain( + name = "exec_3.12", +) + +py_exec_tools_toolchain( + name = "exec_3.11_any", +) + +py_exec_tools_toolchain( + name = "exec_default", +) diff --git a/tests/exec_toolchain_matching/exec_toolchain_matching_tests.bzl b/tests/exec_toolchain_matching/exec_toolchain_matching_tests.bzl new file mode 100644 index 0000000000..f6eae5ad5f --- /dev/null +++ b/tests/exec_toolchain_matching/exec_toolchain_matching_tests.bzl @@ -0,0 +1,152 @@ +# 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. +"""Starlark tests for PyRuntimeInfo provider.""" + +load("@rules_testing//lib:analysis_test.bzl", "analysis_test") +load("@rules_testing//lib:test_suite.bzl", "test_suite") +load("@rules_testing//lib:util.bzl", rt_util = "util") +load("//python:py_runtime.bzl", "py_runtime") +load("//python:py_runtime_pair.bzl", "py_runtime_pair") +load("//python/private:toolchain_types.bzl", "EXEC_TOOLS_TOOLCHAIN_TYPE", "TARGET_TOOLCHAIN_TYPE") # buildifier: disable=bzl-visibility +load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility +load("//tests/support:support.bzl", "LINUX", "MAC", "PYTHON_VERSION") + +_LookupInfo = provider() # buildifier: disable=provider-params + +def _lookup_toolchains_impl(ctx): + return [_LookupInfo( + target = ctx.toolchains[TARGET_TOOLCHAIN_TYPE], + exec = ctx.toolchains[EXEC_TOOLS_TOOLCHAIN_TYPE], + )] + +_lookup_toolchains = rule( + implementation = _lookup_toolchains_impl, + toolchains = [TARGET_TOOLCHAIN_TYPE, EXEC_TOOLS_TOOLCHAIN_TYPE], + attrs = {"_use_auto_exec_groups": attr.bool(default = True)}, +) + +def define_py_runtime(name, **kwargs): + py_runtime( + name = name + "_runtime", + **kwargs + ) + py_runtime_pair( + name = name, + py3_runtime = name + "_runtime", + ) + +_tests = [] + +def _test_exec_matches_target_python_version(name): + rt_util.helper_target( + _lookup_toolchains, + name = name + "_subject", + ) + + # ==== Target toolchains ===== + + # This is never matched. It comes first to ensure the python version + # constraint is being respected. + native.toolchain( + name = "00_target_3.11_any", + toolchain_type = TARGET_TOOLCHAIN_TYPE, + toolchain = ":target_3.12_linux", + target_settings = ["//python/config_settings:is_python_3.11"], + ) + + # This is matched by the top-level target being built in what --platforms + # specifies. + native.toolchain( + name = "10_target_3.12_linux", + toolchain_type = TARGET_TOOLCHAIN_TYPE, + toolchain = ":target_3.12_linux", + target_compatible_with = ["@platforms//os:linux"], + target_settings = ["//python/config_settings:is_python_3.12"], + ) + + # This is matched when the exec config switches to the mac platform and + # then looks for a Python runtime for itself. + native.toolchain( + name = "15_target_3.12_mac", + toolchain_type = TARGET_TOOLCHAIN_TYPE, + toolchain = ":target_3.12_mac", + target_compatible_with = ["@platforms//os:macos"], + target_settings = ["//python/config_settings:is_python_3.12"], + ) + + # This is never matched. It's just here so that toolchains from the + # environment don't match. + native.toolchain( + name = "99_target_default", + toolchain_type = TARGET_TOOLCHAIN_TYPE, + toolchain = ":target_default", + ) + + # ==== Exec tools toolchains ===== + + # Register a 3.11 before to ensure it the python version is respected + native.toolchain( + name = "00_exec_3.11_any", + toolchain_type = EXEC_TOOLS_TOOLCHAIN_TYPE, + toolchain = ":exec_3.11_any", + target_settings = ["//python/config_settings:is_python_3.11"], + ) + + # Note that mac comes first. This is so it matches instead of linux + # We only ever look for mac ones, so no need to register others. + native.toolchain( + name = "10_exec_3.12_mac", + toolchain_type = EXEC_TOOLS_TOOLCHAIN_TYPE, + toolchain = ":exec_3.12", + exec_compatible_with = ["@platforms//os:macos"], + target_settings = ["//python/config_settings:is_python_3.12"], + ) + + # This is never matched. It's just here so that toolchains from the + # environment don't match. + native.toolchain( + name = "99_exec_default", + toolchain_type = EXEC_TOOLS_TOOLCHAIN_TYPE, + toolchain = ":exec_default", + ) + + analysis_test( + name = name, + target = name + "_subject", + impl = _test_exec_matches_target_python_version_impl, + config_settings = { + "//command_line_option:extra_execution_platforms": [str(MAC)], + "//command_line_option:extra_toolchains": ["//tests/exec_toolchain_matching:all"], + "//command_line_option:platforms": [str(LINUX)], + PYTHON_VERSION: "3.12", + }, + ) + +_tests.append(_test_exec_matches_target_python_version) + +def _test_exec_matches_target_python_version_impl(env, target): + target_runtime = target[_LookupInfo].target.py3_runtime + exec_runtime = target[_LookupInfo].exec.exec_tools.exec_interpreter[platform_common.ToolchainInfo].py3_runtime + + env.expect.that_str(target_runtime.interpreter_path).equals("/linux/python3.12") + env.expect.that_str(exec_runtime.interpreter_path).equals("/mac/python3.12") + + if IS_BAZEL_7_OR_HIGHER: + target_version = target_runtime.interpreter_version_info + exec_version = exec_runtime.interpreter_version_info + + env.expect.that_bool(target_version == exec_version) + +def exec_toolchain_matching_test_suite(name): + test_suite(name = name, tests = _tests) diff --git a/tests/support/support.bzl b/tests/support/support.bzl index efcc43a54f..2e5820312a 100644 --- a/tests/support/support.bzl +++ b/tests/support/support.bzl @@ -33,6 +33,7 @@ CC_TOOLCHAIN = str(Label("//tests/cc:all")) # doesn't accept yet Label objects. EXEC_TOOLS_TOOLCHAIN = str(Label("//python/config_settings:exec_tools_toolchain")) PRECOMPILE = str(Label("//python/config_settings:precompile")) -PYC_COLLECTION = str(Label("//python/config_settings:pyc_collection")) -PRECOMPILE_SOURCE_RETENTION = str(Label("//python/config_settings:precompile_source_retention")) PRECOMPILE_ADD_TO_RUNFILES = str(Label("//python/config_settings:precompile_add_to_runfiles")) +PRECOMPILE_SOURCE_RETENTION = str(Label("//python/config_settings:precompile_source_retention")) +PYC_COLLECTION = str(Label("//python/config_settings:pyc_collection")) +PYTHON_VERSION = str(Label("//python/config_settings:python_version")) From 0dcaa2e801aa53347fb6b6ba0238a7b04e85aa2b Mon Sep 17 00:00:00 2001 From: Yun Peng Date: Fri, 21 Jun 2024 02:13:58 +0200 Subject: [PATCH 088/345] fix: Add `configure=True` for internal_config_repo (#1998) Mark internal_config_repo as `configure = True` so that it won't be vendored by Bazel vendor mode. https://bazel.build/rules/lib/globals/bzl#parameters_7 --- python/private/internal_config_repo.bzl | 1 + 1 file changed, 1 insertion(+) diff --git a/python/private/internal_config_repo.bzl b/python/private/internal_config_repo.bzl index 7be34aef8f..c37bc351cc 100644 --- a/python/private/internal_config_repo.bzl +++ b/python/private/internal_config_repo.bzl @@ -92,6 +92,7 @@ def _internal_config_repo_impl(rctx): internal_config_repo = repository_rule( implementation = _internal_config_repo_impl, + configure = True, environ = [_ENABLE_PYSTAR_ENVVAR_NAME], ) From d003204fe2f4d513816e561d838adb9c6433418c Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 22 Jun 2024 10:51:37 +0900 Subject: [PATCH 089/345] chore: remove dead code from whl_target_platforms (#2001) Remove dead code only used in tests. Work towards #260 --- python/private/whl_target_platforms.bzl | 97 ------------------- .../whl_target_platforms/select_whl_tests.bzl | 19 +--- 2 files changed, 1 insertion(+), 115 deletions(-) diff --git a/python/private/whl_target_platforms.bzl b/python/private/whl_target_platforms.bzl index 08177ca1b3..bee795732a 100644 --- a/python/private/whl_target_platforms.bzl +++ b/python/private/whl_target_platforms.bzl @@ -46,63 +46,6 @@ _OS_PREFIXES = { "win": "windows", } # buildifier: disable=unsorted-dict-items -def _whl_priority(value): - """Return a value for sorting whl lists. - - TODO @aignas 2024-03-29: In the future we should create a repo for each - repo that matches the abi and then we could have config flags for the - preference of `any` wheels or `sdist` or `manylinux` vs `musllinux` or - `universal2`. Ideally we use `select` statements in the hub repo to do - the selection based on the config, but for now this is the best way to - get this working for the host platform. - - In the future the right thing would be to have `bool_flag` or something - similar to be able to have select statements that does the right thing: - * select whls vs sdists. - * select manylinux vs musllinux - * select universal2 vs arch-specific whls - - All of these can be expressed as configuration settings and included in the - select statements in the `whl` repo. This means that the user can configure - for a particular target what they need. - - Returns a 4-tuple where the items are: - * bool - is it an 'any' wheel? True if it is. - * bool - is it an 'universal' wheel? True if it is. (e.g. macos universal2 wheels) - * int - the minor plaform version (e.g. osx os version, libc version) - * int - the major plaform version (e.g. osx os version, libc version) - """ - if "." in value: - value, _, _ = value.partition(".") - - if "any" == value: - return (True, False, 0, 0) - - if "linux" in value: - os, _, tail = value.partition("_") - if os == "linux": - # If the platform tag starts with 'linux', then return something less than what 'any' returns - minor = 0 - major = 0 - else: - major, _, tail = tail.partition("_") # We don't need to use that because it's the same for all candidates now - minor, _, _ = tail.partition("_") - - return (False, os == "linux", int(minor), int(major)) - - if "mac" in value or "osx" in value: - _, _, tail = value.partition("_") - major, _, tail = tail.partition("_") - minor, _, _ = tail.partition("_") - - return (False, "universal2" in value, int(minor), int(major)) - - if not "win" in value: - fail("BUG: only windows, linux and mac platforms are supported, but got: {}".format(value)) - - # Windows does not have multiple wheels for the same target platform - return (False, False, 0, 0) - def select_whls(*, whls, want_python_version = "3.0", want_abis = [], want_platforms = [], logger = None): """Select a subset of wheels suitable for target platforms from a list. @@ -203,46 +146,6 @@ def select_whls(*, whls, want_python_version = "3.0", want_abis = [], want_platf for key, v in candidates.items() ] -def select_whl(*, whls, want_platform): - """Select a suitable wheel from a list. - - Args: - whls(list[struct]): A list of candidates. - want_platform(str): The target platform. - - Returns: - None or a struct with `url`, `sha256` and `filename` attributes for the - selected whl. If no match is found, None is returned. - """ - if not whls: - return None - - # TODO @aignas 2024-05-23: once we do the selection in the hub repo using - # an actual select, then this function will be the one that is used within - # the repository context instead of `select_whl`. - whls = select_whls( - whls = whls, - want_python_version = "", - want_platforms = [want_platform], - ) - - candidates = { - parse_whl_name(w.filename).platform_tag: w - for w in whls - # TODO @aignas 2024-06-01: to be addressed in #1837, where we add the necessary - # config settings. - if "musllinux_" not in w.filename - } - - target_whl_platform = sorted( - candidates.keys(), - key = _whl_priority, - ) - if not target_whl_platform: - return None - - return candidates[target_whl_platform[0]] - def whl_target_platforms(platform_tag, abi_tag = ""): """Parse the wheel abi and platform tags and return (os, cpu) tuples. diff --git a/tests/private/whl_target_platforms/select_whl_tests.bzl b/tests/private/whl_target_platforms/select_whl_tests.bzl index ebd2b263f1..59e9d77918 100644 --- a/tests/private/whl_target_platforms/select_whl_tests.bzl +++ b/tests/private/whl_target_platforms/select_whl_tests.bzl @@ -15,7 +15,7 @@ "" load("@rules_testing//lib:test_suite.bzl", "test_suite") -load("//python/private:whl_target_platforms.bzl", "select_whl", "select_whls") # buildifier: disable=bzl-visibility +load("//python/private:whl_target_platforms.bzl", "select_whls") # buildifier: disable=bzl-visibility WHL_LIST = [ "pkg-0.0.1-cp311-cp311-macosx_10_9_universal2.whl", @@ -79,11 +79,6 @@ def _match(env, got, *want_filenames): # Check that we pass the original structs env.expect.that_str(got[0].other).equals("dummy") -def _select_whl(**kwargs): - """A small wrapper to make the tests more DRY.""" - got_single = select_whl(**kwargs) - return [got_single] if got_single else [] - def _select_whls(whls, **kwargs): return select_whls( whls = [ @@ -214,8 +209,6 @@ def _test_match_abi_and_not_py_version(env): "pkg-0.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", "pkg-0.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", ) - got = _select_whl(whls = got, want_platform = "linux_x86_64") - _match(env, got, "pkg-0.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl") _tests.append(_test_match_abi_and_not_py_version) @@ -228,8 +221,6 @@ def _test_select_filename_with_many_tags(env): "pkg-0.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", "pkg-0.0.1-cp39-cp39-musllinux_1_1_i686.whl", ) - got = _select_whl(whls = got, want_platform = "linux_x86_32") - _match(env, got, "pkg-0.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl") _tests.append(_test_select_filename_with_many_tags) @@ -247,8 +238,6 @@ def _test_osx_prefer_arch_specific(env): "pkg-0.0.1-cp311-cp311-macosx_10_9_universal2.whl", "pkg-0.0.1-cp311-cp311-macosx_10_9_x86_64.whl", ) - got = _select_whl(whls = got, want_platform = "osx_x86_64") - _match(env, got, "pkg-0.0.1-cp311-cp311-macosx_10_9_x86_64.whl") got = _select_whls(whls = WHL_LIST, want_abis = ["cp311"], want_platforms = ["osx_aarch64"], want_python_version = "3.11") _match( @@ -257,8 +246,6 @@ def _test_osx_prefer_arch_specific(env): "pkg-0.0.1-cp311-cp311-macosx_10_9_universal2.whl", "pkg-0.0.1-cp311-cp311-macosx_11_0_arm64.whl", ) - got = _select_whl(whls = got, want_platform = "osx_aarch64") - _match(env, got, "pkg-0.0.1-cp311-cp311-macosx_11_0_arm64.whl") _tests.append(_test_osx_prefer_arch_specific) @@ -270,8 +257,6 @@ def _test_osx_fallback_to_universal2(env): got, "pkg-0.0.1-cp311-cp311-macosx_10_9_universal2.whl", ) - got = _select_whl(whls = got, want_platform = "osx_aarch64") - _match(env, got, "pkg-0.0.1-cp311-cp311-macosx_10_9_universal2.whl") _tests.append(_test_osx_fallback_to_universal2) @@ -286,8 +271,6 @@ def _test_prefer_manylinux_wheels(env): "pkg-0.0.1-cp39-abi3-any.whl", "pkg-0.0.1-py3-none-any.whl", ) - got = _select_whl(whls = got, want_platform = "linux_x86_64") - _match(env, got, "pkg-0.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl") _tests.append(_test_prefer_manylinux_wheels) From 0fd7b64c2d35fe43d09bf250e3189a4386eb8d9e Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 22 Jun 2024 10:51:53 +0900 Subject: [PATCH 090/345] fix(bzlmod): pass only non-default values to whl_library (#2002) Before this change `isolated`, `quiet` and `timeout` would get dropped if they were specified to some non-default value. This fixes it. Work towards #260. --- CHANGELOG.md | 2 ++ python/private/bzlmod/pip.bzl | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index af6e5273ea..b259e51fbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,8 @@ A brief description of the categories of changes: other toolchains support. * (providers) {obj}`PyRuntimeInfo` doesn't require passing the `interpreter_version_info` arg. +* (bzlmod) Correctly pass `isolated`, `quiet` and `timeout` values to `whl_library` + and drop the defaults from the lock file. ### Removed * (pip): Removes the `entrypoint` macro that was replaced by `py_console_script_binary` in 0.26.0. diff --git a/python/private/bzlmod/pip.bzl b/python/private/bzlmod/pip.bzl index 122debd2a2..2ded3a4acd 100644 --- a/python/private/bzlmod/pip.bzl +++ b/python/private/bzlmod/pip.bzl @@ -239,7 +239,11 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s quiet = (pip_attr.quiet, True), timeout = (pip_attr.timeout, 600), ) - whl_library_args.update({k: v for k, (v, default) in maybe_args_with_default.items() if v == default}) + whl_library_args.update({ + k: v + for k, (v, default) in maybe_args_with_default.items() + if v != default + }) if get_index_urls: # TODO @aignas 2024-05-26: move to a separate function From 04a803c286451f7ad782369b7c529a46e6ad5c9e Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 23 Jun 2024 09:20:18 +0900 Subject: [PATCH 091/345] refactor: move PyPI related extension and repository_rule setup to its own dir (#2003) This is to ensure that future work is easier and its clear where to add tests. Now all of the unit tests can be run by just `bazel test //tests/pypi/...`. Refactor summary: - chore: add aignas to CODEOWNERS - chore: add a new directory for storing PyPI related code - move pypi_index_sources.bzl to private/pypi - chore: move parse_requirements_txt to private/pypi - move parse_whl_name to private/pypi - move whl_target_platforms to private/pypi - move parse_requirements to private/pypi - move pip_repo_name to private/pypi - remove unused file - move pip_config_settings to private/pypi - move pypi_index to pypi/private and rename - move labels.bzl to private/pypi - move generate_build_bazel to private/pypi - move render_pkg_aliases.bzl to private/pypi - move patch_whl.bzl to private/pypi - Move envsubst and render_tests to top level of tests - move pip_install_srcs to private/pypi - split and move pip_install/pip_repository.bzl to private/pypi - move the bzlmod extension to private/pypi --- .github/CODEOWNERS | 5 +- examples/pip_parse_vendored/requirements.bzl | 52 +- python/BUILD.bazel | 2 +- python/config_settings/BUILD.bazel | 2 +- python/extensions/BUILD.bazel | 2 - python/pip.bzl | 5 +- python/pip_install/BUILD.bazel | 42 +- python/pip_install/pip_repository.bzl | 1106 +---------------- python/pip_install/private/BUILD.bazel | 48 - .../pip_install/private/pip_install_utils.bzl | 132 -- python/pip_install/private/srcs.bzl | 18 - python/pip_install/requirements_parser.bzl | 118 +- .../tools/dependency_resolver/BUILD.bazel | 2 +- .../tools/wheel_installer/BUILD.bazel | 2 +- python/private/BUILD.bazel | 82 +- python/private/bzlmod/BUILD.bazel | 31 +- python/private/bzlmod/pip.bzl | 816 +----------- python/private/normalize_platform.bzl | 13 - python/private/pypi/BUILD.bazel | 238 ++++ python/private/pypi/README.md | 9 + python/private/pypi/attrs.bzl | 224 ++++ python/private/pypi/bzlmod.bzl | 818 ++++++++++++ .../config_settings.bzl} | 9 +- .../private/{pip_flags.bzl => pypi/flags.bzl} | 2 +- .../generate_group_library_build_bazel.bzl | 6 +- .../generate_whl_library_build_bazel.bzl | 6 +- python/private/pypi/group_library.bzl | 40 + .../hub_repository.bzl} | 52 +- .../index_sources.bzl} | 2 +- python/private/{ => pypi}/labels.bzl | 0 python/private/pypi/package_annotation.bzl | 49 + .../private/{ => pypi}/parse_requirements.bzl | 10 +- .../private/pypi/parse_requirements_txt.bzl | 133 ++ python/private/pypi/parse_simpleapi_html.bzl | 106 ++ python/private/{ => pypi}/parse_whl_name.bzl | 0 python/private/{ => pypi}/patch_whl.bzl | 22 +- python/private/pypi/pip_repository.bzl | 327 +++++ python/private/pypi/pip_repository_attrs.bzl | 73 ++ .../private/{ => pypi}/render_pkg_aliases.bzl | 16 +- python/private/{ => pypi}/repack_whl.py | 0 .../requirements.bzl.tmpl.bzlmod} | 0 .../pypi/requirements.bzl.tmpl.workspace | 72 ++ .../simpleapi_download.bzl} | 102 +- python/private/pypi/whl_library.bzl | 509 ++++++++ .../whl_repo_name.bzl} | 4 +- .../{ => pypi}/whl_target_platforms.bzl | 0 python/private/text_util.bzl | 3 + tests/{private => }/envsubst/BUILD.bazel | 0 .../{private => }/envsubst/envsubst_tests.bzl | 0 .../normalize_name/BUILD.bazel | 0 .../normalize_name/normalize_name_tests.bzl | 0 tests/pip_install/BUILD.bazel | 17 - tests/pip_install/group_library/BUILD.bazel | 3 - .../requirements_parser/BUILD.bazel | 3 - tests/pip_install/whl_library/BUILD.bazel | 3 - tests/private/pip_config_settings/BUILD.bazel | 5 - tests/private/pip_repo_name/BUILD.bazel | 3 - tests/private/pypi_index/BUILD.bazel | 3 - tests/private/pypi_index_sources/BUILD.bazel | 3 - tests/pypi/config_settings/BUILD.bazel | 5 + .../config_settings_tests.bzl} | 6 +- .../BUILD.bazel | 3 + ...erate_group_library_build_bazel_tests.bzl} | 4 +- .../BUILD.bazel | 3 + ...enerate_whl_library_build_bazel_tests.bzl} | 4 +- tests/pypi/index_sources/BUILD.bazel | 3 + .../index_sources/index_sources_tests.bzl} | 8 +- .../parse_requirements/BUILD.bazel | 0 .../parse_requirements_tests.bzl | 2 +- tests/pypi/parse_requirements_txt/BUILD.bazel | 3 + .../parse_requirements_txt_tests.bzl} | 54 +- tests/pypi/parse_simpleapi_html/BUILD.bazel | 3 + .../parse_simpleapi_html_tests.bzl} | 16 +- .../parse_whl_name/BUILD.bazel | 0 .../parse_whl_name/parse_whl_name_tests.bzl | 2 +- .../render_pkg_aliases/BUILD.bazel | 0 .../render_pkg_aliases_test.bzl | 16 +- tests/pypi/whl_repo_name/BUILD.bazel | 3 + .../whl_repo_name/whl_repo_name_tests.bzl} | 10 +- .../whl_target_platforms/BUILD.bazel | 0 .../whl_target_platforms/select_whl_tests.bzl | 2 +- .../whl_target_platforms_tests.bzl | 2 +- tests/{private => }/text_util/BUILD.bazel | 0 .../{private => }/text_util/render_tests.bzl | 0 84 files changed, 2829 insertions(+), 2670 deletions(-) delete mode 100644 python/pip_install/private/BUILD.bazel delete mode 100644 python/pip_install/private/pip_install_utils.bzl delete mode 100644 python/pip_install/private/srcs.bzl delete mode 100644 python/private/normalize_platform.bzl create mode 100644 python/private/pypi/BUILD.bazel create mode 100644 python/private/pypi/README.md create mode 100644 python/private/pypi/attrs.bzl create mode 100644 python/private/pypi/bzlmod.bzl rename python/private/{pip_config_settings.bzl => pypi/config_settings.bzl} (98%) rename python/private/{pip_flags.bzl => pypi/flags.bzl} (98%) rename python/{pip_install/private => private/pypi}/generate_group_library_build_bazel.bzl (99%) rename python/{pip_install/private => private/pypi}/generate_whl_library_build_bazel.bzl (99%) create mode 100644 python/private/pypi/group_library.bzl rename python/private/{bzlmod/pip_repository.bzl => pypi/hub_repository.bzl} (79%) rename python/private/{pypi_index_sources.bzl => pypi/index_sources.bzl} (98%) rename python/private/{ => pypi}/labels.bzl (100%) create mode 100644 python/private/pypi/package_annotation.bzl rename python/private/{ => pypi}/parse_requirements.bzl (98%) create mode 100644 python/private/pypi/parse_requirements_txt.bzl create mode 100644 python/private/pypi/parse_simpleapi_html.bzl rename python/private/{ => pypi}/parse_whl_name.bzl (100%) rename python/private/{ => pypi}/patch_whl.bzl (87%) create mode 100644 python/private/pypi/pip_repository.bzl create mode 100644 python/private/pypi/pip_repository_attrs.bzl rename python/private/{ => pypi}/render_pkg_aliases.bzl (97%) rename python/private/{ => pypi}/repack_whl.py (100%) rename python/private/{bzlmod/requirements.bzl.tmpl => pypi/requirements.bzl.tmpl.bzlmod} (100%) create mode 100644 python/private/pypi/requirements.bzl.tmpl.workspace rename python/private/{pypi_index.bzl => pypi/simpleapi_download.bzl} (67%) create mode 100644 python/private/pypi/whl_library.bzl rename python/private/{pip_repo_name.bzl => pypi/whl_repo_name.bzl} (94%) rename python/private/{ => pypi}/whl_target_platforms.bzl (100%) rename tests/{private => }/envsubst/BUILD.bazel (100%) rename tests/{private => }/envsubst/envsubst_tests.bzl (100%) rename tests/{pip_hub_repository => }/normalize_name/BUILD.bazel (100%) rename tests/{pip_hub_repository => }/normalize_name/normalize_name_tests.bzl (100%) delete mode 100644 tests/pip_install/BUILD.bazel delete mode 100644 tests/pip_install/group_library/BUILD.bazel delete mode 100644 tests/pip_install/requirements_parser/BUILD.bazel delete mode 100644 tests/pip_install/whl_library/BUILD.bazel delete mode 100644 tests/private/pip_config_settings/BUILD.bazel delete mode 100644 tests/private/pip_repo_name/BUILD.bazel delete mode 100644 tests/private/pypi_index/BUILD.bazel delete mode 100644 tests/private/pypi_index_sources/BUILD.bazel create mode 100644 tests/pypi/config_settings/BUILD.bazel rename tests/{private/pip_config_settings/pip_config_settings_tests.bzl => pypi/config_settings/config_settings_tests.bzl} (98%) create mode 100644 tests/pypi/generate_group_library_build_bazel/BUILD.bazel rename tests/{pip_install/group_library/generate_build_bazel_tests.bzl => pypi/generate_group_library_build_bazel/generate_group_library_build_bazel_tests.bzl} (91%) create mode 100644 tests/pypi/generate_whl_library_build_bazel/BUILD.bazel rename tests/{pip_install/whl_library/generate_build_bazel_tests.bzl => pypi/generate_whl_library_build_bazel/generate_whl_library_build_bazel_tests.bzl} (98%) create mode 100644 tests/pypi/index_sources/BUILD.bazel rename tests/{private/pypi_index_sources/pypi_index_sources_tests.bzl => pypi/index_sources/index_sources_tests.bzl} (88%) rename tests/{private => pypi}/parse_requirements/BUILD.bazel (100%) rename tests/{private => pypi}/parse_requirements/parse_requirements_tests.bzl (99%) create mode 100644 tests/pypi/parse_requirements_txt/BUILD.bazel rename tests/{pip_install/requirements_parser/requirements_parser_tests.bzl => pypi/parse_requirements_txt/parse_requirements_txt_tests.bzl} (88%) create mode 100644 tests/pypi/parse_simpleapi_html/BUILD.bazel rename tests/{private/pypi_index/pypi_index_tests.bzl => pypi/parse_simpleapi_html/parse_simpleapi_html_tests.bzl} (95%) rename tests/{private => pypi}/parse_whl_name/BUILD.bazel (100%) rename tests/{private => pypi}/parse_whl_name/parse_whl_name_tests.bzl (96%) rename tests/{pip_hub_repository => pypi}/render_pkg_aliases/BUILD.bazel (100%) rename tests/{pip_hub_repository => pypi}/render_pkg_aliases/render_pkg_aliases_test.bzl (98%) create mode 100644 tests/pypi/whl_repo_name/BUILD.bazel rename tests/{private/pip_repo_name/pip_repo_name_tests.bzl => pypi/whl_repo_name/whl_repo_name_tests.bzl} (82%) rename tests/{private => pypi}/whl_target_platforms/BUILD.bazel (100%) rename tests/{private => pypi}/whl_target_platforms/select_whl_tests.bzl (98%) rename tests/{private => pypi}/whl_target_platforms/whl_target_platforms_tests.bzl (97%) rename tests/{private => }/text_util/BUILD.bazel (100%) rename tests/{private => }/text_util/render_tests.bzl (100%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 3449bcfac0..a75b5a91a3 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -11,5 +11,6 @@ /python/private/toolchains_repo.bzl @f0rmiga /python/tests/toolchains/ @f0rmiga -# pip_parse related code -/python/pip_install/ @hrfuller +# PyPI integration related code +/python/private/pypi/ @aignas +/tests/pypi/ @aignas diff --git a/examples/pip_parse_vendored/requirements.bzl b/examples/pip_parse_vendored/requirements.bzl index 8298f49cf2..50bfe9fe8e 100644 --- a/examples/pip_parse_vendored/requirements.bzl +++ b/examples/pip_parse_vendored/requirements.bzl @@ -6,16 +6,54 @@ load("@rules_python//python:pip.bzl", "pip_utils") load("@rules_python//python/pip_install:pip_repository.bzl", "group_library", "whl_library") -all_requirements = ["@my_project_pip_deps_vendored_certifi//:pkg", "@my_project_pip_deps_vendored_charset_normalizer//:pkg", "@my_project_pip_deps_vendored_idna//:pkg", "@my_project_pip_deps_vendored_requests//:pkg", "@my_project_pip_deps_vendored_urllib3//:pkg"] - -all_whl_requirements_by_package = {"certifi": "@my_project_pip_deps_vendored_certifi//:whl", "charset_normalizer": "@my_project_pip_deps_vendored_charset_normalizer//:whl", "idna": "@my_project_pip_deps_vendored_idna//:whl", "requests": "@my_project_pip_deps_vendored_requests//:whl", "urllib3": "@my_project_pip_deps_vendored_urllib3//:whl"} +all_requirements = [ + "@my_project_pip_deps_vendored_certifi//:pkg", + "@my_project_pip_deps_vendored_charset_normalizer//:pkg", + "@my_project_pip_deps_vendored_idna//:pkg", + "@my_project_pip_deps_vendored_requests//:pkg", + "@my_project_pip_deps_vendored_urllib3//:pkg", +] + +all_whl_requirements_by_package = { + "certifi": "@my_project_pip_deps_vendored_certifi//:whl", + "charset_normalizer": "@my_project_pip_deps_vendored_charset_normalizer//:whl", + "idna": "@my_project_pip_deps_vendored_idna//:whl", + "requests": "@my_project_pip_deps_vendored_requests//:whl", + "urllib3": "@my_project_pip_deps_vendored_urllib3//:whl", +} all_whl_requirements = all_whl_requirements_by_package.values() -all_data_requirements = ["@my_project_pip_deps_vendored_certifi//:data", "@my_project_pip_deps_vendored_charset_normalizer//:data", "@my_project_pip_deps_vendored_idna//:data", "@my_project_pip_deps_vendored_requests//:data", "@my_project_pip_deps_vendored_urllib3//:data"] - -_packages = [("my_project_pip_deps_vendored_certifi", "certifi==2023.7.22 --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"), ("my_project_pip_deps_vendored_charset_normalizer", "charset-normalizer==2.1.1 --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"), ("my_project_pip_deps_vendored_idna", "idna==3.4 --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"), ("my_project_pip_deps_vendored_requests", "requests==2.28.1 --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 --hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"), ("my_project_pip_deps_vendored_urllib3", "urllib3==1.26.13 --hash=sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc --hash=sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8")] -_config = {"download_only": False, "enable_implicit_namespace_pkgs": False, "environment": {}, "envsubst": ["PIP_RETRIES"], "extra_pip_args": ["--retries=${PIP_RETRIES:-5}"], "isolated": True, "pip_data_exclude": [], "python_interpreter": "python3", "python_interpreter_target": "@python39_host//:python", "quiet": True, "repo": "my_project_pip_deps_vendored", "repo_prefix": "my_project_pip_deps_vendored_", "timeout": 600} +all_data_requirements = [ + "@my_project_pip_deps_vendored_certifi//:data", + "@my_project_pip_deps_vendored_charset_normalizer//:data", + "@my_project_pip_deps_vendored_idna//:data", + "@my_project_pip_deps_vendored_requests//:data", + "@my_project_pip_deps_vendored_urllib3//:data", +] + +_packages = [ + ("my_project_pip_deps_vendored_certifi", "certifi==2023.7.22 --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"), + ("my_project_pip_deps_vendored_charset_normalizer", "charset-normalizer==2.1.1 --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"), + ("my_project_pip_deps_vendored_idna", "idna==3.4 --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"), + ("my_project_pip_deps_vendored_requests", "requests==2.28.1 --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 --hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"), + ("my_project_pip_deps_vendored_urllib3", "urllib3==1.26.13 --hash=sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc --hash=sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8"), +] +_config = { + "download_only": False, + "enable_implicit_namespace_pkgs": False, + "environment": {}, + "envsubst": ["PIP_RETRIES"], + "extra_pip_args": ["--retries=${PIP_RETRIES:-5}"], + "isolated": True, + "pip_data_exclude": [], + "python_interpreter": "python3", + "python_interpreter_target": "@python39_host//:python", + "quiet": True, + "repo": "my_project_pip_deps_vendored", + "repo_prefix": "my_project_pip_deps_vendored_", + "timeout": 600, +} _annotations = {} def requirement(name): diff --git a/python/BUILD.bazel b/python/BUILD.bazel index cbf29964fb..29b495bf90 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -101,7 +101,7 @@ bzl_library( "//python/pip_install:requirements_bzl", "//python/private:bzlmod_enabled_bzl", "//python/private:full_version_bzl", - "//python/private:render_pkg_aliases_bzl", + "//python/private/pypi:render_pkg_aliases_bzl", "//python/private/whl_filegroup:whl_filegroup_bzl", ], ) diff --git a/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel index 1003efb8c2..f6f46db770 100644 --- a/python/config_settings/BUILD.bazel +++ b/python/config_settings/BUILD.bazel @@ -9,7 +9,7 @@ load( "PycCollectionFlag", ) load( - "//python/private:pip_flags.bzl", + "//python/private/pypi:flags.bzl", "INTERNAL_FLAGS", "UniversalWhlFlag", "UseWhlFlag", diff --git a/python/extensions/BUILD.bazel b/python/extensions/BUILD.bazel index eb095ab746..1bc2a71192 100644 --- a/python/extensions/BUILD.bazel +++ b/python/extensions/BUILD.bazel @@ -36,8 +36,6 @@ bzl_library( srcs = ["python.bzl"], visibility = ["//:__subpackages__"], deps = [ - "//python/private:util_bzl", - "//python/private/bzlmod:bazel_features_bzl", "//python/private/bzlmod:python_bzl", ], ) diff --git a/python/pip.bzl b/python/pip.bzl index 8cc091d3cb..f1c74dd964 100644 --- a/python/pip.bzl +++ b/python/pip.bzl @@ -19,12 +19,13 @@ symbols should not be used and they are either undocumented here or marked as for internal use only. """ -load("//python/pip_install:pip_repository.bzl", "pip_repository", _package_annotation = "package_annotation") load("//python/pip_install:requirements.bzl", _compile_pip_requirements = "compile_pip_requirements") load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") load("//python/private:full_version.bzl", "full_version") load("//python/private:normalize_name.bzl", "normalize_name") -load("//python/private:render_pkg_aliases.bzl", "NO_MATCH_ERROR_MESSAGE_TEMPLATE") +load("//python/private/pypi:package_annotation.bzl", _package_annotation = "package_annotation") +load("//python/private/pypi:pip_repository.bzl", "pip_repository") +load("//python/private/pypi:render_pkg_aliases.bzl", "NO_MATCH_ERROR_MESSAGE_TEMPLATE") load("//python/private/whl_filegroup:whl_filegroup.bzl", _whl_filegroup = "whl_filegroup") compile_pip_requirements = _compile_pip_requirements diff --git a/python/pip_install/BUILD.bazel b/python/pip_install/BUILD.bazel index 91f2ec7b59..1894c4d915 100644 --- a/python/pip_install/BUILD.bazel +++ b/python/pip_install/BUILD.bazel @@ -22,23 +22,10 @@ bzl_library( name = "pip_repository_bzl", srcs = ["pip_repository.bzl"], deps = [ - ":repositories_bzl", - "//python:repositories_bzl", - "//python:versions_bzl", - "//python/pip_install/private:generate_group_library_build_bazel_bzl", - "//python/pip_install/private:generate_whl_library_build_bazel_bzl", - "//python/pip_install/private:srcs_bzl", - "//python/private:bzlmod_enabled_bzl", - "//python/private:envsubst_bzl", - "//python/private:normalize_name_bzl", - "//python/private:parse_requirements_bzl", - "//python/private:parse_whl_name_bzl", - "//python/private:patch_whl_bzl", - "//python/private:render_pkg_aliases_bzl", - "//python/private:repo_utils_bzl", - "//python/private:toolchains_repo_bzl", - "//python/private:whl_target_platforms_bzl", - "@bazel_skylib//lib:sets", + "//python/private/pypi:group_library_bzl", + "//python/private/pypi:package_annotation_bzl", + "//python/private/pypi:pip_repository_bzl", + "//python/private/pypi:whl_library_bzl", ], ) @@ -51,11 +38,6 @@ bzl_library( ], ) -bzl_library( - name = "requirements_parser_bzl", - srcs = ["requirements_parser.bzl"], -) - bzl_library( name = "repositories_bzl", srcs = ["repositories.bzl"], @@ -71,7 +53,6 @@ filegroup( srcs = glob(["*.bzl"]) + [ "BUILD.bazel", "pip_repository_requirements.bzl.tmpl", - "//python/pip_install/private:distribution", "//python/pip_install/tools/dependency_resolver:distribution", "//python/pip_install/tools/wheel_installer:distribution", ], @@ -92,23 +73,10 @@ filegroup( filegroup( name = "bzl", - srcs = glob(["*.bzl"]) + [ - "//python/pip_install/private:bzl_srcs", - ], + srcs = glob(["*.bzl"]), visibility = ["//:__subpackages__"], ) -filegroup( - name = "py_srcs", - srcs = [ - "//python/pip_install/tools/dependency_resolver:py_srcs", - "//python/pip_install/tools/wheel_installer:py_srcs", - "//python/private:repack_whl.py", - "//tools:wheelmaker.py", - ], - visibility = ["//python/pip_install/private:__pkg__"], -) - exports_files( glob(["*.bzl"]), visibility = ["//docs:__pkg__"], diff --git a/python/pip_install/pip_repository.bzl b/python/pip_install/pip_repository.bzl index d6c8d9149c..18deee1993 100644 --- a/python/pip_install/pip_repository.bzl +++ b/python/pip_install/pip_repository.bzl @@ -14,1099 +14,13 @@ "" -load("@bazel_skylib//lib:sets.bzl", "sets") -load("//python:repositories.bzl", "is_standalone_interpreter") -load("//python:versions.bzl", "WINDOWS_NAME") -load("//python/pip_install:repositories.bzl", "all_requirements") -load("//python/pip_install/private:generate_group_library_build_bazel.bzl", "generate_group_library_build_bazel") -load("//python/pip_install/private:generate_whl_library_build_bazel.bzl", "generate_whl_library_build_bazel") -load("//python/pip_install/private:srcs.bzl", "PIP_INSTALL_PY_SRCS") -load("//python/private:auth.bzl", "AUTH_ATTRS", "get_auth") -load("//python/private:envsubst.bzl", "envsubst") -load("//python/private:normalize_name.bzl", "normalize_name") -load("//python/private:parse_requirements.bzl", "host_platform", "parse_requirements", "select_requirement") -load("//python/private:parse_whl_name.bzl", "parse_whl_name") -load("//python/private:patch_whl.bzl", "patch_whl") -load("//python/private:render_pkg_aliases.bzl", "render_pkg_aliases", "whl_alias") -load("//python/private:repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") -load("//python/private:toolchains_repo.bzl", "get_host_os_arch") -load("//python/private:whl_target_platforms.bzl", "whl_target_platforms") - -CPPFLAGS = "CPPFLAGS" - -COMMAND_LINE_TOOLS_PATH_SLUG = "commandlinetools" - -_WHEEL_ENTRY_POINT_PREFIX = "rules_python_wheel_entry_point" - -def _construct_pypath(rctx): - """Helper function to construct a PYTHONPATH. - - Contains entries for code in this repo as well as packages downloaded from //python/pip_install:repositories.bzl. - This allows us to run python code inside repository rule implementations. - - Args: - rctx: Handle to the repository_context. - - Returns: String of the PYTHONPATH. - """ - - separator = ":" if not "windows" in rctx.os.name.lower() else ";" - pypath = separator.join([ - str(rctx.path(entry).dirname) - for entry in rctx.attr._python_path_entries - ]) - return pypath - -def _get_python_interpreter_attr(rctx): - """A helper function for getting the `python_interpreter` attribute or it's default - - Args: - rctx (repository_ctx): Handle to the rule repository context. - - Returns: - str: The attribute value or it's default - """ - if rctx.attr.python_interpreter: - return rctx.attr.python_interpreter - - if "win" in rctx.os.name: - return "python.exe" - else: - return "python3" - -def _resolve_python_interpreter(rctx): - """Helper function to find the python interpreter from the common attributes - - Args: - rctx: Handle to the rule repository context. - - Returns: - `path` object, for the resolved path to the Python interpreter. - """ - python_interpreter = _get_python_interpreter_attr(rctx) - - if rctx.attr.python_interpreter_target != None: - python_interpreter = rctx.path(rctx.attr.python_interpreter_target) - - (os, _) = get_host_os_arch(rctx) - - # On Windows, the symlink doesn't work because Windows attempts to find - # Python DLLs where the symlink is, not where the symlink points. - if os == WINDOWS_NAME: - python_interpreter = python_interpreter.realpath - elif "/" not in python_interpreter: - # It's a plain command, e.g. "python3", to look up in the environment. - found_python_interpreter = rctx.which(python_interpreter) - if not found_python_interpreter: - fail("python interpreter `{}` not found in PATH".format(python_interpreter)) - python_interpreter = found_python_interpreter - else: - python_interpreter = rctx.path(python_interpreter) - return python_interpreter - -def _get_xcode_location_cflags(rctx): - """Query the xcode sdk location to update cflags - - Figure out if this interpreter target comes from rules_python, and patch the xcode sdk location if so. - Pip won't be able to compile c extensions from sdists with the pre built python distributions from indygreg - otherwise. See https://github.com/indygreg/python-build-standalone/issues/103 - """ - - # Only run on MacOS hosts - if not rctx.os.name.lower().startswith("mac os"): - return [] - - xcode_sdk_location = repo_utils.execute_unchecked( - rctx, - op = "GetXcodeLocation", - arguments = [repo_utils.which_checked(rctx, "xcode-select"), "--print-path"], - ) - if xcode_sdk_location.return_code != 0: - return [] - - xcode_root = xcode_sdk_location.stdout.strip() - if COMMAND_LINE_TOOLS_PATH_SLUG not in xcode_root.lower(): - # This is a full xcode installation somewhere like /Applications/Xcode13.0.app/Contents/Developer - # so we need to change the path to to the macos specific tools which are in a different relative - # path than xcode installed command line tools. - xcode_root = "{}/Platforms/MacOSX.platform/Developer".format(xcode_root) - return [ - "-isysroot {}/SDKs/MacOSX.sdk".format(xcode_root), - ] - -def _get_toolchain_unix_cflags(rctx, python_interpreter): - """Gather cflags from a standalone toolchain for unix systems. - - Pip won't be able to compile c extensions from sdists with the pre built python distributions from indygreg - otherwise. See https://github.com/indygreg/python-build-standalone/issues/103 - """ - - # Only run on Unix systems - if not rctx.os.name.lower().startswith(("mac os", "linux")): - return [] - - # Only update the location when using a standalone toolchain. - if not is_standalone_interpreter(rctx, python_interpreter): - return [] - - stdout = repo_utils.execute_checked_stdout( - rctx, - op = "GetPythonVersionForUnixCflags", - arguments = [ - python_interpreter, - "-c", - "import sys; print(f'{sys.version_info[0]}.{sys.version_info[1]}', end='')", - ], - ) - _python_version = stdout - include_path = "{}/include/python{}".format( - python_interpreter.dirname, - _python_version, - ) - - return ["-isystem {}".format(include_path)] - -def use_isolated(ctx, attr): - """Determine whether or not to pass the pip `--isolated` flag to the pip invocation. - - Args: - ctx: repository or module context - attr: attributes for the repo rule or tag extension - - Returns: - True if --isolated should be passed - """ - use_isolated = attr.isolated - - # The environment variable will take precedence over the attribute - isolated_env = ctx.os.environ.get("RULES_PYTHON_PIP_ISOLATED", None) - if isolated_env != None: - if isolated_env.lower() in ("0", "false"): - use_isolated = False - else: - use_isolated = True - - return use_isolated - -def _parse_optional_attrs(rctx, args, extra_pip_args = None): - """Helper function to parse common attributes of pip_repository and whl_library repository rules. - - This function also serializes the structured arguments as JSON - so they can be passed on the command line to subprocesses. - - Args: - rctx: Handle to the rule repository context. - args: A list of parsed args for the rule. - extra_pip_args: The pip args to pass. - Returns: Augmented args list. - """ - - if use_isolated(rctx, rctx.attr): - args.append("--isolated") - - # Bazel version 7.1.0 and later (and rolling releases from version 8.0.0-pre.20240128.3) - # support rctx.getenv(name, default): When building incrementally, any change to the value of - # the variable named by name will cause this repository to be re-fetched. - if "getenv" in dir(rctx): - getenv = rctx.getenv - else: - getenv = rctx.os.environ.get - - # Check for None so we use empty default types from our attrs. - # Some args want to be list, and some want to be dict. - if extra_pip_args != None: - args += [ - "--extra_pip_args", - json.encode(struct(arg = [ - envsubst(pip_arg, rctx.attr.envsubst, getenv) - for pip_arg in rctx.attr.extra_pip_args - ])), - ] - - if rctx.attr.download_only: - args.append("--download_only") - - if rctx.attr.pip_data_exclude != None: - args += [ - "--pip_data_exclude", - json.encode(struct(arg = rctx.attr.pip_data_exclude)), - ] - - if rctx.attr.enable_implicit_namespace_pkgs: - args.append("--enable_implicit_namespace_pkgs") - - if rctx.attr.environment != None: - args += [ - "--environment", - json.encode(struct(arg = rctx.attr.environment)), - ] - - return args - -def _create_repository_execution_environment(rctx, python_interpreter): - """Create a environment dictionary for processes we spawn with rctx.execute. - - Args: - rctx (repository_ctx): The repository context. - python_interpreter (path): The resolved python interpreter. - Returns: - Dictionary of environment variable suitable to pass to rctx.execute. - """ - - # Gather any available CPPFLAGS values - cppflags = [] - cppflags.extend(_get_xcode_location_cflags(rctx)) - cppflags.extend(_get_toolchain_unix_cflags(rctx, python_interpreter)) - - env = { - "PYTHONPATH": _construct_pypath(rctx), - CPPFLAGS: " ".join(cppflags), - } - - return env - -_BUILD_FILE_CONTENTS = """\ -package(default_visibility = ["//visibility:public"]) - -# Ensure the `requirements.bzl` source can be accessed by stardoc, since users load() from it -exports_files(["requirements.bzl"]) -""" - -def _pip_repository_impl(rctx): - requirements_by_platform = parse_requirements( - rctx, - requirements_by_platform = rctx.attr.requirements_by_platform, - requirements_linux = rctx.attr.requirements_linux, - requirements_lock = rctx.attr.requirements_lock, - requirements_osx = rctx.attr.requirements_darwin, - requirements_windows = rctx.attr.requirements_windows, - extra_pip_args = rctx.attr.extra_pip_args, - ) - selected_requirements = {} - options = None - repository_platform = host_platform(rctx.os) - for name, requirements in requirements_by_platform.items(): - r = select_requirement( - requirements, - platform = repository_platform, - ) - if not r: - continue - options = options or r.extra_pip_args - selected_requirements[name] = r.requirement_line - - bzl_packages = sorted(selected_requirements.keys()) - - # Normalize cycles first - requirement_cycles = { - name: sorted(sets.to_list(sets.make(deps))) - for name, deps in rctx.attr.experimental_requirement_cycles.items() - } - - # Check for conflicts between cycles _before_ we normalize package names so - # that reported errors use the names the user specified - for i in range(len(requirement_cycles)): - left_group = requirement_cycles.keys()[i] - left_deps = requirement_cycles.values()[i] - for j in range(len(requirement_cycles) - (i + 1)): - right_deps = requirement_cycles.values()[1 + i + j] - right_group = requirement_cycles.keys()[1 + i + j] - for d in left_deps: - if d in right_deps: - fail("Error: Requirement %s cannot be repeated between cycles %s and %s; please merge the cycles." % (d, left_group, right_group)) - - # And normalize the names as used in the cycle specs - # - # NOTE: We must check that a listed dependency is actually in the actual - # requirements set for the current platform so that we can support cycles in - # platform-conditional requirements. Otherwise we'll blindly generate a - # label referencing a package which may not be installed on the current - # platform. - requirement_cycles = { - normalize_name(name): sorted([normalize_name(d) for d in group if normalize_name(d) in bzl_packages]) - for name, group in requirement_cycles.items() - } - - imports = [ - # NOTE: Maintain the order consistent with `buildifier` - 'load("@rules_python//python:pip.bzl", "pip_utils")', - 'load("@rules_python//python/pip_install:pip_repository.bzl", "group_library", "whl_library")', - ] - - annotations = {} - for pkg, annotation in rctx.attr.annotations.items(): - filename = "{}.annotation.json".format(normalize_name(pkg)) - rctx.file(filename, json.encode_indent(json.decode(annotation))) - annotations[pkg] = "@{name}//:{filename}".format(name = rctx.attr.name, filename = filename) - - config = { - "download_only": rctx.attr.download_only, - "enable_implicit_namespace_pkgs": rctx.attr.enable_implicit_namespace_pkgs, - "environment": rctx.attr.environment, - "envsubst": rctx.attr.envsubst, - "extra_pip_args": options, - "isolated": use_isolated(rctx, rctx.attr), - "pip_data_exclude": rctx.attr.pip_data_exclude, - "python_interpreter": _get_python_interpreter_attr(rctx), - "quiet": rctx.attr.quiet, - "repo": rctx.attr.name, - "timeout": rctx.attr.timeout, - } - if rctx.attr.use_hub_alias_dependencies: - config["dep_template"] = "@{}//{{name}}:{{target}}".format(rctx.attr.name) - else: - config["repo_prefix"] = "{}_".format(rctx.attr.name) - - if rctx.attr.python_interpreter_target: - config["python_interpreter_target"] = str(rctx.attr.python_interpreter_target) - if rctx.attr.experimental_target_platforms: - config["experimental_target_platforms"] = rctx.attr.experimental_target_platforms - - macro_tmpl = "@%s//{}:{}" % rctx.attr.name - - aliases = render_pkg_aliases( - aliases = { - pkg: [whl_alias(repo = rctx.attr.name + "_" + pkg)] - for pkg in bzl_packages or [] - }, - ) - for path, contents in aliases.items(): - rctx.file(path, contents) - - rctx.file("BUILD.bazel", _BUILD_FILE_CONTENTS) - rctx.template("requirements.bzl", rctx.attr._template, substitutions = { - " # %%GROUP_LIBRARY%%": """\ - group_repo = "{name}__groups" - group_library( - name = group_repo, - repo_prefix = "{name}_", - groups = all_requirement_groups, - )""".format(name = rctx.attr.name) if not rctx.attr.use_hub_alias_dependencies else "", - "%%ALL_DATA_REQUIREMENTS%%": _format_repr_list([ - macro_tmpl.format(p, "data") - for p in bzl_packages - ]), - "%%ALL_REQUIREMENTS%%": _format_repr_list([ - macro_tmpl.format(p, "pkg") - for p in bzl_packages - ]), - "%%ALL_REQUIREMENT_GROUPS%%": _format_dict(_repr_dict(requirement_cycles)), - "%%ALL_WHL_REQUIREMENTS_BY_PACKAGE%%": _format_dict(_repr_dict({ - p: macro_tmpl.format(p, "whl") - for p in bzl_packages - })), - "%%ANNOTATIONS%%": _format_dict(_repr_dict(annotations)), - "%%CONFIG%%": _format_dict(_repr_dict(config)), - "%%EXTRA_PIP_ARGS%%": json.encode(options), - "%%IMPORTS%%": "\n".join(imports), - "%%MACRO_TMPL%%": macro_tmpl, - "%%NAME%%": rctx.attr.name, - "%%PACKAGES%%": _format_repr_list( - [ - ("{}_{}".format(rctx.attr.name, p), r) - for p, r in sorted(selected_requirements.items()) - ], - ), - }) - - return - -common_env = [ - "RULES_PYTHON_PIP_ISOLATED", - REPO_DEBUG_ENV_VAR, -] - -common_attrs = { - "download_only": attr.bool( - doc = """ -Whether to use "pip download" instead of "pip wheel". Disables building wheels from source, but allows use of ---platform, --python-version, --implementation, and --abi in --extra_pip_args to download wheels for a different -platform from the host platform. - """, - ), - "enable_implicit_namespace_pkgs": attr.bool( - default = False, - doc = """ -If true, disables conversion of native namespace packages into pkg-util style namespace packages. When set all py_binary -and py_test targets must specify either `legacy_create_init=False` or the global Bazel option -`--incompatible_default_to_explicit_init_py` to prevent `__init__.py` being automatically generated in every directory. - -This option is required to support some packages which cannot handle the conversion to pkg-util style. - """, - ), - "environment": attr.string_dict( - doc = """ -Environment variables to set in the pip subprocess. -Can be used to set common variables such as `http_proxy`, `https_proxy` and `no_proxy` -Note that pip is run with "--isolated" on the CLI so `PIP__` -style env vars are ignored, but env vars that control requests and urllib3 -can be passed. If you need `PIP__`, take a look at `extra_pip_args` -and `envsubst`. - """, - default = {}, - ), - "envsubst": attr.string_list( - mandatory = False, - doc = """\ -A list of environment variables to substitute (e.g. `["PIP_INDEX_URL", -"PIP_RETRIES"]`). The corresponding variables are expanded in `extra_pip_args` -using the syntax `$VARNAME` or `${VARNAME}` (expanding to empty string if unset) -or `${VARNAME:-default}` (expanding to default if the variable is unset or empty -in the environment). Note: On Bazel 6 and Bazel 7.0 changes to the variables named -here do not cause packages to be re-fetched. Don't fetch different things based -on the value of these variables. -""", - ), - "experimental_requirement_cycles": attr.string_list_dict( - default = {}, - doc = """\ -A mapping of dependency cycle names to a list of requirements which form that cycle. - -Requirements which form cycles will be installed together and taken as -dependencies together in order to ensure that the cycle is always satisified. - -Example: - `sphinx` depends on `sphinxcontrib-serializinghtml` - When listing both as requirements, ala - - ``` - py_binary( - name = "doctool", - ... - deps = [ - "@pypi//sphinx:pkg", - "@pypi//sphinxcontrib_serializinghtml", - ] - ) - ``` - - Will produce a Bazel error such as - - ``` - ERROR: .../external/pypi_sphinxcontrib_serializinghtml/BUILD.bazel:44:6: in alias rule @pypi_sphinxcontrib_serializinghtml//:pkg: cycle in dependency graph: - //:doctool (...) - @pypi//sphinxcontrib_serializinghtml:pkg (...) - .-> @pypi_sphinxcontrib_serializinghtml//:pkg (...) - | @pypi_sphinxcontrib_serializinghtml//:_pkg (...) - | @pypi_sphinx//:pkg (...) - | @pypi_sphinx//:_pkg (...) - `-- @pypi_sphinxcontrib_serializinghtml//:pkg (...) - ``` - - Which we can resolve by configuring these two requirements to be installed together as a cycle - - ``` - pip_parse( - ... - experimental_requirement_cycles = { - "sphinx": [ - "sphinx", - "sphinxcontrib-serializinghtml", - ] - }, - ) - ``` - -Warning: - If a dependency participates in multiple cycles, all of those cycles must be - collapsed down to one. For instance `a <-> b` and `a <-> c` cannot be listed - as two separate cycles. -""", - ), - "experimental_target_platforms": attr.string_list( - default = [], - doc = """\ -A list of platforms that we will generate the conditional dependency graph for -cross platform wheels by parsing the wheel metadata. This will generate the -correct dependencies for packages like `sphinx` or `pylint`, which include -`colorama` when installed and used on Windows platforms. - -An empty list means falling back to the legacy behaviour where the host -platform is the target platform. - -WARNING: It may not work as expected in cases where the python interpreter -implementation that is being used at runtime is different between different platforms. -This has been tested for CPython only. - -For specific target platforms use values of the form `_` where `` -is one of `linux`, `osx`, `windows` and arch is one of `x86_64`, `x86_32`, -`aarch64`, `s390x` and `ppc64le`. - -You can also target a specific Python version by using `cp3__`. -If multiple python versions are specified as target platforms, then select statements -of the `lib` and `whl` targets will include usage of version aware toolchain config -settings like `@rules_python//python/config_settings:is_python_3.y`. - -Special values: `host` (for generating deps for the host platform only) and -`_*` values. For example, `cp39_*`, `linux_*`, `cp39_linux_*`. - -NOTE: this is not for cross-compiling Python wheels but rather for parsing the `whl` METADATA correctly. -""", - ), - "extra_pip_args": attr.string_list( - doc = """Extra arguments to pass on to pip. Must not contain spaces. - -Supports environment variables using the syntax `$VARNAME` or -`${VARNAME}` (expanding to empty string if unset) or -`${VARNAME:-default}` (expanding to default if the variable is unset -or empty in the environment), if `"VARNAME"` is listed in the -`envsubst` attribute. See also `envsubst`. -""", - ), - "isolated": attr.bool( - doc = """\ -Whether or not to pass the [--isolated](https://pip.pypa.io/en/stable/cli/pip/#cmdoption-isolated) flag to -the underlying pip command. Alternatively, the `RULES_PYTHON_PIP_ISOLATED` environment variable can be used -to control this flag. -""", - default = True, - ), - "pip_data_exclude": attr.string_list( - doc = "Additional data exclusion parameters to add to the pip packages BUILD file.", - ), - "python_interpreter": attr.string( - doc = """\ -The python interpreter to use. This can either be an absolute path or the name -of a binary found on the host's `PATH` environment variable. If no value is set -`python3` is defaulted for Unix systems and `python.exe` for Windows. -""", - # NOTE: This attribute should not have a default. See `_get_python_interpreter_attr` - # default = "python3" - ), - "python_interpreter_target": attr.label( - allow_single_file = True, - doc = """ -If you are using a custom python interpreter built by another repository rule, -use this attribute to specify its BUILD target. This allows pip_repository to invoke -pip using the same interpreter as your toolchain. If set, takes precedence over -python_interpreter. An example value: "@python3_x86_64-unknown-linux-gnu//:python". -""", - ), - "quiet": attr.bool( - default = True, - doc = """\ -If True, suppress printing stdout and stderr output to the terminal. - -If you would like to get more diagnostic output, please use: - - RULES_PYTHON_REPO_DEBUG=1 - -or - - RULES_PYTHON_REPO_DEBUG_VERBOSITY= -""", - ), - "repo_prefix": attr.string( - doc = """ -Prefix for the generated packages will be of the form `@//...` - -DEPRECATED. Only left for people who vendor requirements.bzl. -""", - ), - # 600 is documented as default here: https://docs.bazel.build/versions/master/skylark/lib/repository_ctx.html#execute - "timeout": attr.int( - default = 600, - doc = "Timeout (in seconds) on the rule's execution duration.", - ), - "_py_srcs": attr.label_list( - doc = "Python sources used in the repository rule", - allow_files = True, - default = PIP_INSTALL_PY_SRCS, - ), -} - -pip_repository_attrs = { - "annotations": attr.string_dict( - doc = "Optional annotations to apply to packages", - ), - "requirements_by_platform": attr.label_keyed_string_dict( - doc = """\ -The requirements files and the comma delimited list of target platforms as values. - -The keys are the requirement files and the values are comma-separated platform -identifiers. For now we only support `_` values that are present in -`@platforms//os` and `@platforms//cpu` packages respectively. -""", - ), - "requirements_darwin": attr.label( - allow_single_file = True, - doc = "Override the requirements_lock attribute when the host platform is Mac OS", - ), - "requirements_linux": attr.label( - allow_single_file = True, - doc = "Override the requirements_lock attribute when the host platform is Linux", - ), - "requirements_lock": attr.label( - allow_single_file = True, - doc = """\ -A fully resolved 'requirements.txt' pip requirement file containing the -transitive set of your dependencies. If this file is passed instead of -'requirements' no resolve will take place and pip_repository will create -individual repositories for each of your dependencies so that wheels are -fetched/built only for the targets specified by 'build/run/test'. Note that if -your lockfile is platform-dependent, you can use the `requirements_[platform]` -attributes. - -Note, that in general requirements files are compiled for a specific platform, -but sometimes they can work for multiple platforms. `rules_python` right now -supports requirements files that are created for a particular platform without -platform markers. -""", - ), - "requirements_windows": attr.label( - allow_single_file = True, - doc = "Override the requirements_lock attribute when the host platform is Windows", - ), - "use_hub_alias_dependencies": attr.bool( - default = False, - doc = """\ -Controls if the hub alias dependencies are used. If set to true, then the -group_library will be included in the hub repo. - -True will become default in a subsequent release. -""", - ), - "_template": attr.label( - default = ":pip_repository_requirements.bzl.tmpl", - ), -} - -pip_repository_attrs.update(**common_attrs) - -pip_repository = repository_rule( - attrs = pip_repository_attrs, - doc = """Accepts a locked/compiled requirements file and installs the dependencies listed within. - -Those dependencies become available in a generated `requirements.bzl` file. -You can instead check this `requirements.bzl` file into your repo, see the "vendoring" section below. - -In your WORKSPACE file: - -```starlark -load("@rules_python//python:pip.bzl", "pip_parse") - -pip_parse( - name = "pypi", - requirements_lock = ":requirements.txt", -) - -load("@pypi//:requirements.bzl", "install_deps") - -install_deps() -``` - -You can then reference installed dependencies from a `BUILD` file with the alias targets generated in the same repo, for example, for `PyYAML` we would have the following: -- `@pypi//pyyaml` and `@pypi//pyyaml:pkg` both point to the `py_library` - created after extracting the `PyYAML` package. -- `@pypi//pyyaml:data` points to the extra data included in the package. -- `@pypi//pyyaml:dist_info` points to the `dist-info` files in the package. -- `@pypi//pyyaml:whl` points to the wheel file that was extracted. - -```starlark -py_library( - name = "bar", - ... - deps = [ - "//my/other:dep", - "@pypi//numpy", - "@pypi//requests", - ], -) -``` - -or - -```starlark -load("@pypi//:requirements.bzl", "requirement") - -py_library( - name = "bar", - ... - deps = [ - "//my/other:dep", - requirement("numpy"), - requirement("requests"), - ], -) -``` - -In addition to the `requirement` macro, which is used to access the generated `py_library` -target generated from a package's wheel, The generated `requirements.bzl` file contains -functionality for exposing [entry points][whl_ep] as `py_binary` targets as well. - -[whl_ep]: https://packaging.python.org/specifications/entry-points/ - -```starlark -load("@pypi//:requirements.bzl", "entry_point") - -alias( - name = "pip-compile", - actual = entry_point( - pkg = "pip-tools", - script = "pip-compile", - ), -) -``` - -Note that for packages whose name and script are the same, only the name of the package -is needed when calling the `entry_point` macro. - -```starlark -load("@pip//:requirements.bzl", "entry_point") - -alias( - name = "flake8", - actual = entry_point("flake8"), -) -``` - -### Vendoring the requirements.bzl file - -In some cases you may not want to generate the requirements.bzl file as a repository rule -while Bazel is fetching dependencies. For example, if you produce a reusable Bazel module -such as a ruleset, you may want to include the requirements.bzl file rather than make your users -install the WORKSPACE setup to generate it. -See https://github.com/bazelbuild/rules_python/issues/608 - -This is the same workflow as Gazelle, which creates `go_repository` rules with -[`update-repos`](https://github.com/bazelbuild/bazel-gazelle#update-repos) - -To do this, use the "write to source file" pattern documented in -https://blog.aspect.dev/bazel-can-write-to-the-source-folder -to put a copy of the generated requirements.bzl into your project. -Then load the requirements.bzl file directly rather than from the generated repository. -See the example in rules_python/examples/pip_parse_vendored. -""", - implementation = _pip_repository_impl, - environ = common_env, -) - -def _whl_library_impl(rctx): - python_interpreter = _resolve_python_interpreter(rctx) - args = [ - python_interpreter, - "-m", - "python.pip_install.tools.wheel_installer.wheel_installer", - "--requirement", - rctx.attr.requirement, - ] - extra_pip_args = [] - extra_pip_args.extend(rctx.attr.extra_pip_args) - - # Manually construct the PYTHONPATH since we cannot use the toolchain here - environment = _create_repository_execution_environment(rctx, python_interpreter) - - whl_path = None - if rctx.attr.whl_file: - whl_path = rctx.path(rctx.attr.whl_file) - - # Simulate the behaviour where the whl is present in the current directory. - rctx.symlink(whl_path, whl_path.basename) - whl_path = rctx.path(whl_path.basename) - elif rctx.attr.urls: - filename = rctx.attr.filename - urls = rctx.attr.urls - if not filename: - _, _, filename = urls[0].rpartition("/") - - if not (filename.endswith(".whl") or filename.endswith("tar.gz") or filename.endswith(".zip")): - if rctx.attr.filename: - msg = "got '{}'".format(filename) - else: - msg = "detected '{}' from url:\n{}".format(filename, urls[0]) - fail("Only '.whl', '.tar.gz' or '.zip' files are supported, {}".format(msg)) - - result = rctx.download( - url = urls, - output = filename, - sha256 = rctx.attr.sha256, - auth = get_auth(rctx, urls), - ) - - if not result.success: - fail("could not download the '{}' from {}:\n{}".format(filename, urls, result)) - - if filename.endswith(".whl"): - whl_path = rctx.path(rctx.attr.filename) - else: - # It is an sdist and we need to tell PyPI to use a file in this directory - # and not use any indexes. - extra_pip_args.extend(["--no-index", "--find-links", "."]) - - args = _parse_optional_attrs(rctx, args, extra_pip_args) - - if not whl_path: - repo_utils.execute_checked( - rctx, - op = "whl_library.ResolveRequirement({}, {})".format(rctx.attr.name, rctx.attr.requirement), - arguments = args, - environment = environment, - quiet = rctx.attr.quiet, - timeout = rctx.attr.timeout, - ) - - whl_path = rctx.path(json.decode(rctx.read("whl_file.json"))["whl_file"]) - if not rctx.delete("whl_file.json"): - fail("failed to delete the whl_file.json file") - - if rctx.attr.whl_patches: - patches = {} - for patch_file, json_args in rctx.attr.whl_patches.items(): - patch_dst = struct(**json.decode(json_args)) - if whl_path.basename in patch_dst.whls: - patches[patch_file] = patch_dst.patch_strip - - whl_path = patch_whl( - rctx, - python_interpreter = python_interpreter, - whl_path = whl_path, - patches = patches, - quiet = rctx.attr.quiet, - timeout = rctx.attr.timeout, - ) - - target_platforms = rctx.attr.experimental_target_platforms - if target_platforms: - parsed_whl = parse_whl_name(whl_path.basename) - if parsed_whl.platform_tag != "any": - # NOTE @aignas 2023-12-04: if the wheel is a platform specific - # wheel, we only include deps for that target platform - target_platforms = [ - p.target_platform - for p in whl_target_platforms( - platform_tag = parsed_whl.platform_tag, - abi_tag = parsed_whl.abi_tag, - ) - ] - - repo_utils.execute_checked( - rctx, - op = "whl_library.ExtractWheel({}, {})".format(rctx.attr.name, whl_path), - arguments = args + [ - "--whl-file", - whl_path, - ] + ["--platform={}".format(p) for p in target_platforms], - environment = environment, - quiet = rctx.attr.quiet, - timeout = rctx.attr.timeout, - ) - - metadata = json.decode(rctx.read("metadata.json")) - rctx.delete("metadata.json") - - entry_points = {} - for item in metadata["entry_points"]: - name = item["name"] - module = item["module"] - attribute = item["attribute"] - - # There is an extreme edge-case with entry_points that end with `.py` - # See: https://github.com/bazelbuild/bazel/blob/09c621e4cf5b968f4c6cdf905ab142d5961f9ddc/src/test/java/com/google/devtools/build/lib/rules/python/PyBinaryConfiguredTargetTest.java#L174 - entry_point_without_py = name[:-3] + "_py" if name.endswith(".py") else name - entry_point_target_name = ( - _WHEEL_ENTRY_POINT_PREFIX + "_" + entry_point_without_py - ) - entry_point_script_name = entry_point_target_name + ".py" - - rctx.file( - entry_point_script_name, - _generate_entry_point_contents(module, attribute), - ) - entry_points[entry_point_without_py] = entry_point_script_name - - build_file_contents = generate_whl_library_build_bazel( - 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, - group_deps = rctx.attr.group_deps, - data_exclude = rctx.attr.pip_data_exclude, - tags = [ - "pypi_name=" + metadata["name"], - "pypi_version=" + metadata["version"], - ], - entry_points = entry_points, - annotation = None if not rctx.attr.annotation else struct(**json.decode(rctx.read(rctx.attr.annotation))), - ) - rctx.file("BUILD.bazel", build_file_contents) - - return - -def _generate_entry_point_contents( - module, - attribute, - shebang = "#!/usr/bin/env python3"): - """Generate the contents of an entry point script. - - Args: - module (str): The name of the module to use. - attribute (str): The name of the attribute to call. - shebang (str, optional): The shebang to use for the entry point python - file. - - Returns: - str: A string of python code. - """ - contents = """\ -{shebang} -import sys -from {module} import {attribute} -if __name__ == "__main__": - sys.exit({attribute}()) -""".format( - shebang = shebang, - module = module, - attribute = attribute, - ) - return contents - -# NOTE @aignas 2024-03-21: The usage of dict({}, **common) ensures that all args to `dict` are unique -whl_library_attrs = dict({ - "annotation": attr.label( - doc = ( - "Optional json encoded file containing annotation to apply to the extracted wheel. " + - "See `package_annotation`" - ), - allow_files = True, - ), - "dep_template": attr.string( - doc = """ -The dep template to use for referencing the dependencies. It should have `{name}` -and `{target}` tokens that will be replaced with the normalized distribution name -and the target that we need respectively. -""", - ), - "filename": attr.string( - doc = "Download the whl file to this filename. Only used when the `urls` is passed. If not specified, will be auto-detected from the `urls`.", - ), - "group_deps": attr.string_list( - doc = "List of dependencies to skip in order to break the cycles within a dependency group.", - default = [], - ), - "group_name": attr.string( - doc = "Name of the group, if any.", - ), - "repo": attr.string( - mandatory = True, - doc = "Pointer to parent repo name. Used to make these rules rerun if the parent repo changes.", - ), - "requirement": attr.string( - mandatory = True, - doc = "Python requirement string describing the package to make available, if 'urls' or 'whl_file' is given, then this only needs to include foo[any_extras] as a bare minimum.", - ), - "sha256": attr.string( - doc = "The sha256 of the downloaded whl. Only used when the `urls` is passed.", - ), - "urls": attr.string_list( - doc = """\ -The list of urls of the whl to be downloaded using bazel downloader. Using this -attr makes `extra_pip_args` and `download_only` ignored.""", - ), - "whl_file": attr.label( - doc = "The whl file that should be used instead of downloading or building the whl.", - ), - "whl_patches": attr.label_keyed_string_dict( - doc = """a label-keyed-string dict that has - json.encode(struct([whl_file], patch_strip]) as values. This - is to maintain flexibility and correct bzlmod extension interface - until we have a better way to define whl_library and move whl - patching to a separate place. INTERNAL USE ONLY.""", - ), - "_python_path_entries": attr.label_list( - # Get the root directory of these rules and keep them as a default attribute - # in order to avoid unnecessary repository fetching restarts. - # - # This is very similar to what was done in https://github.com/bazelbuild/rules_go/pull/3478 - default = [ - Label("//:BUILD.bazel"), - ] + [ - # Includes all the external dependencies from repositories.bzl - Label("@" + repo + "//:BUILD.bazel") - for repo in all_requirements - ], - ), -}, **common_attrs) -whl_library_attrs.update(AUTH_ATTRS) - -whl_library = repository_rule( - attrs = whl_library_attrs, - doc = """ -Download and extracts a single wheel based into a bazel repo based on the requirement string passed in. -Instantiated from pip_repository and inherits config options from there.""", - implementation = _whl_library_impl, - environ = common_env, -) - -def package_annotation( - additive_build_content = None, - copy_files = {}, - copy_executables = {}, - data = [], - data_exclude_glob = [], - srcs_exclude_glob = []): - """Annotations to apply to the BUILD file content from package generated from a `pip_repository` rule. - - [cf]: https://github.com/bazelbuild/bazel-skylib/blob/main/docs/copy_file_doc.md - - Args: - additive_build_content (str, optional): Raw text to add to the generated `BUILD` file of a package. - copy_files (dict, optional): A mapping of `src` and `out` files for [@bazel_skylib//rules:copy_file.bzl][cf] - copy_executables (dict, optional): A mapping of `src` and `out` files for - [@bazel_skylib//rules:copy_file.bzl][cf]. Targets generated here will also be flagged as - executable. - data (list, optional): A list of labels to add as `data` dependencies to the generated `py_library` target. - data_exclude_glob (list, optional): A list of exclude glob patterns to add as `data` to the generated - `py_library` target. - srcs_exclude_glob (list, optional): A list of labels to add as `srcs` to the generated `py_library` target. - - Returns: - str: A json encoded string of the provided content. - """ - return json.encode(struct( - additive_build_content = additive_build_content, - copy_files = copy_files, - copy_executables = copy_executables, - data = data, - data_exclude_glob = data_exclude_glob, - srcs_exclude_glob = srcs_exclude_glob, - )) - -def _group_library_impl(rctx): - build_file_contents = generate_group_library_build_bazel( - repo_prefix = rctx.attr.repo_prefix, - groups = rctx.attr.groups, - ) - rctx.file("BUILD.bazel", build_file_contents) - -group_library = repository_rule( - attrs = { - "groups": attr.string_list_dict( - doc = "A mapping of group names to requirements within that group.", - ), - "repo_prefix": attr.string( - doc = "Prefix used for the whl_library created components of each group", - ), - }, - implementation = _group_library_impl, - doc = """ -Create a package containing only wrapper py_library and whl_library rules for implementing dependency groups. -This is an implementation detail of dependency groups and should not be used alone. - """, -) - -# pip_repository implementation - -def _format_list(items): - return "[{}]".format(", ".join(items)) - -def _format_repr_list(strings): - return _format_list( - [repr(s) for s in strings], - ) - -def _repr_dict(items): - return {k: repr(v) for k, v in items.items()} - -def _format_dict(items): - return "{{{}}}".format(", ".join(sorted(['"{}": {}'.format(k, v) for k, v in items.items()]))) +load("//python/private/pypi:group_library.bzl", _group_library = "group_library") +load("//python/private/pypi:package_annotation.bzl", _package_annotation = "package_annotation") +load("//python/private/pypi:pip_repository.bzl", _pip_repository = "pip_repository") +load("//python/private/pypi:whl_library.bzl", _whl_library = "whl_library") + +# Re-exports for backwards compatibility +group_library = _group_library +pip_repository = _pip_repository +whl_library = _whl_library +package_annotation = _package_annotation diff --git a/python/pip_install/private/BUILD.bazel b/python/pip_install/private/BUILD.bazel deleted file mode 100644 index 887d2d3468..0000000000 --- a/python/pip_install/private/BUILD.bazel +++ /dev/null @@ -1,48 +0,0 @@ -load("@bazel_skylib//:bzl_library.bzl", "bzl_library") -load(":pip_install_utils.bzl", "srcs_module") - -package(default_visibility = ["//:__subpackages__"]) - -exports_files([ - "srcs.bzl", -]) - -filegroup( - name = "distribution", - srcs = glob(["*"]), - visibility = ["//python/pip_install:__subpackages__"], -) - -filegroup( - name = "bzl_srcs", - srcs = glob(["*.bzl"]), -) - -srcs_module( - name = "srcs_module", - srcs = "//python/pip_install:py_srcs", - dest = ":srcs.bzl", -) - -bzl_library( - name = "generate_whl_library_build_bazel_bzl", - srcs = ["generate_whl_library_build_bazel.bzl"], - deps = [ - "//python/private:labels_bzl", - "//python/private:normalize_name_bzl", - ], -) - -bzl_library( - name = "generate_group_library_build_bazel_bzl", - srcs = ["generate_group_library_build_bazel.bzl"], - deps = [ - "//python/private:labels_bzl", - "//python/private:normalize_name_bzl", - ], -) - -bzl_library( - name = "srcs_bzl", - srcs = ["srcs.bzl"], -) diff --git a/python/pip_install/private/pip_install_utils.bzl b/python/pip_install/private/pip_install_utils.bzl deleted file mode 100644 index 488583dcb8..0000000000 --- a/python/pip_install/private/pip_install_utils.bzl +++ /dev/null @@ -1,132 +0,0 @@ -# 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. - -"""Utilities for `rules_python` pip rules""" - -_SRCS_TEMPLATE = """\ -\"\"\"A generated file containing all source files used for `@rules_python//python/pip_install:pip_repository.bzl` rules - -This file is auto-generated from the `@rules_python//python/pip_install/private:srcs_module.update` target. Please -`bazel run` this target to apply any updates. Note that doing so will discard any local modifications. -"\"\" - -# Each source file is tracked as a target so `pip_repository` rules will know to automatically rebuild if any of the -# sources changed. -PIP_INSTALL_PY_SRCS = [ - {srcs} -] -""" - -def _src_label(file): - dir_path, file_name = file.short_path.rsplit("/", 1) - - return "@rules_python//{}:{}".format( - dir_path, - file_name, - ) - -def _srcs_module_impl(ctx): - srcs = [_src_label(src) for src in ctx.files.srcs] - if not srcs: - fail("`srcs` cannot be empty") - output = ctx.actions.declare_file(ctx.label.name) - - ctx.actions.write( - output = output, - content = _SRCS_TEMPLATE.format( - srcs = "\n ".join(["\"{}\",".format(src) for src in srcs]), - ), - ) - - return DefaultInfo( - files = depset([output]), - ) - -_srcs_module = rule( - doc = "A rule for writing a list of sources to a templated file", - implementation = _srcs_module_impl, - attrs = { - "srcs": attr.label( - doc = "A filegroup of source files", - allow_files = True, - ), - }, -) - -_INSTALLER_TEMPLATE = """\ -#!/bin/bash -set -euo pipefail -cp -f "{path}" "${{BUILD_WORKSPACE_DIRECTORY}}/{dest}" -""" - -def _srcs_updater_impl(ctx): - output = ctx.actions.declare_file(ctx.label.name + ".sh") - target_file = ctx.file.input - dest = ctx.file.dest.short_path - - ctx.actions.write( - output = output, - content = _INSTALLER_TEMPLATE.format( - path = target_file.short_path, - dest = dest, - ), - is_executable = True, - ) - - return DefaultInfo( - files = depset([output]), - runfiles = ctx.runfiles(files = [target_file]), - executable = output, - ) - -_srcs_updater = rule( - doc = "A rule for writing a `srcs.bzl` file back to the repository", - implementation = _srcs_updater_impl, - attrs = { - "dest": attr.label( - doc = "The target file to write the new `input` to.", - allow_single_file = ["srcs.bzl"], - mandatory = True, - ), - "input": attr.label( - doc = "The file to write back to the repository", - allow_single_file = True, - mandatory = True, - ), - }, - executable = True, -) - -def srcs_module(name, dest, **kwargs): - """A helper rule to ensure `pip_repository` rules are always up to date - - Args: - name (str): The name of the sources module - dest (str): The filename the module should be written as in the current package. - **kwargs (dict): Additional keyword arguments - """ - tags = kwargs.pop("tags", []) - - _srcs_module( - name = name, - tags = tags, - **kwargs - ) - - _srcs_updater( - name = name + ".update", - input = name, - dest = dest, - tags = tags, - ) diff --git a/python/pip_install/private/srcs.bzl b/python/pip_install/private/srcs.bzl deleted file mode 100644 index e92e49fc5f..0000000000 --- a/python/pip_install/private/srcs.bzl +++ /dev/null @@ -1,18 +0,0 @@ -"""A generated file containing all source files used for `@rules_python//python/pip_install:pip_repository.bzl` rules - -This file is auto-generated from the `@rules_python//python/pip_install/private:srcs_module.update` target. Please -`bazel run` this target to apply any updates. Note that doing so will discard any local modifications. -""" - -# Each source file is tracked as a target so `pip_repository` rules will know to automatically rebuild if any of the -# sources changed. -PIP_INSTALL_PY_SRCS = [ - "@rules_python//python/pip_install/tools/dependency_resolver:__init__.py", - "@rules_python//python/pip_install/tools/dependency_resolver:dependency_resolver.py", - "@rules_python//python/pip_install/tools/wheel_installer:arguments.py", - "@rules_python//python/pip_install/tools/wheel_installer:namespace_pkgs.py", - "@rules_python//python/pip_install/tools/wheel_installer:wheel.py", - "@rules_python//python/pip_install/tools/wheel_installer:wheel_installer.py", - "@rules_python//python/private:repack_whl.py", - "@rules_python//tools:wheelmaker.py", -] diff --git a/python/pip_install/requirements_parser.bzl b/python/pip_install/requirements_parser.bzl index 3b49fdf181..82ec1b946c 100644 --- a/python/pip_install/requirements_parser.bzl +++ b/python/pip_install/requirements_parser.bzl @@ -14,120 +14,6 @@ "Pip requirements parser for Starlark" -_STATE = struct( - # Consume extraneous whitespace - ConsumeSpace = 0, - # Consume a comment - ConsumeComment = 1, - # Parse the name of a pip package - ParseDependency = 2, - # Parse a full requirement line - ParseRequirement = 3, - # Parse a pip option - ParseOption = 4, -) +load("//python/private/pypi:parse_requirements_txt.bzl", "parse_requirements_txt") -EOF = {} - -def parse(content): - """A simplistic (and incomplete) pip requirements lockfile parser. - - Parses package names and their full requirement lines, as well pip - options. - - Args: - content: lockfile content as a string - - Returns: - Struct with fields `requirements` and `options`. - - requirements: List of requirements, where each requirement is a 2-element - tuple containing the package name and the requirement line. - E.g., [(certifi', 'certifi==2021.10.8 --hash=sha256:7888...'), ...] - - options: List of pip option lines - """ - content = content.replace("\r", "") - - result = struct( - requirements = [], - options = [], - ) - state = _STATE.ConsumeSpace - buffer = "" - - inputs = content.elems()[:] - inputs.append(EOF) - - for input in inputs: - if state == _STATE.ConsumeSpace: - (state, buffer) = _handleConsumeSpace(input) - elif state == _STATE.ConsumeComment: - (state, buffer) = _handleConsumeComment(input, buffer, result) - elif state == _STATE.ParseDependency: - (state, buffer) = _handleParseDependency(input, buffer, result) - elif state == _STATE.ParseOption: - (state, buffer) = _handleParseOption(input, buffer, result) - elif state == _STATE.ParseRequirement: - (state, buffer) = _handleParseRequirement(input, buffer, result) - else: - fail("Unknown state %d" % state) - - return result - -def _handleConsumeSpace(input): - if input == EOF: - return (_STATE.ConsumeSpace, "") - if input.isspace(): - return (_STATE.ConsumeSpace, "") - elif input == "#": - return (_STATE.ConsumeComment, "") - elif input == "-": - return (_STATE.ParseOption, input) - - return (_STATE.ParseDependency, input) - -def _handleConsumeComment(input, buffer, result): - if input == "\n": - if len(result.requirements) > 0 and len(result.requirements[-1]) == 1: - result.requirements[-1] = (result.requirements[-1][0], buffer.rstrip(" \n")) - return (_STATE.ConsumeSpace, "") - elif len(buffer) > 0: - result.options.append(buffer.rstrip(" \n")) - return (_STATE.ConsumeSpace, "") - return (_STATE.ConsumeSpace, "") - return (_STATE.ConsumeComment, buffer) - -def _handleParseDependency(input, buffer, result): - if input == EOF: - fail("Enountered unexpected end of file while parsing requirement") - elif input.isspace() or input in [">", "<", "~", "=", ";", "["]: - result.requirements.append((buffer,)) - return (_STATE.ParseRequirement, buffer + input) - - return (_STATE.ParseDependency, buffer + input) - -def _handleParseOption(input, buffer, result): - if input == "\n" and buffer.endswith("\\"): - return (_STATE.ParseOption, buffer[0:-1]) - elif input == " ": - result.options.append(buffer.rstrip("\n")) - return (_STATE.ParseOption, "") - elif input == "\n" or input == EOF: - result.options.append(buffer.rstrip("\n")) - return (_STATE.ConsumeSpace, "") - elif input == "#" and (len(buffer) == 0 or buffer[-1].isspace()): - return (_STATE.ConsumeComment, buffer) - - return (_STATE.ParseOption, buffer + input) - -def _handleParseRequirement(input, buffer, result): - if input == "\n" and buffer.endswith("\\"): - return (_STATE.ParseRequirement, buffer[0:-1]) - elif input == "\n" or input == EOF: - result.requirements[-1] = (result.requirements[-1][0], buffer.rstrip(" \n")) - return (_STATE.ConsumeSpace, "") - elif input == "#" and (len(buffer) == 0 or buffer[-1].isspace()): - return (_STATE.ConsumeComment, buffer) - - return (_STATE.ParseRequirement, buffer + input) +parse = parse_requirements_txt diff --git a/python/pip_install/tools/dependency_resolver/BUILD.bazel b/python/pip_install/tools/dependency_resolver/BUILD.bazel index c2cfb39509..467b009332 100644 --- a/python/pip_install/tools/dependency_resolver/BUILD.bazel +++ b/python/pip_install/tools/dependency_resolver/BUILD.bazel @@ -15,5 +15,5 @@ filegroup( include = ["**/*.py"], exclude = ["**/*_test.py"], ), - visibility = ["//python/pip_install:__subpackages__"], + visibility = ["//:__subpackages__"], ) diff --git a/python/pip_install/tools/wheel_installer/BUILD.bazel b/python/pip_install/tools/wheel_installer/BUILD.bazel index a396488d3d..0c24d5a489 100644 --- a/python/pip_install/tools/wheel_installer/BUILD.bazel +++ b/python/pip_install/tools/wheel_installer/BUILD.bazel @@ -87,5 +87,5 @@ filegroup( include = ["**/*.py"], exclude = ["**/*_test.py"], ), - visibility = ["//python/pip_install:__subpackages__"], + visibility = ["//:__subpackages__"], ) diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index cd385e3700..ccc6acdcbf 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -31,6 +31,7 @@ filegroup( "//python/private/bzlmod:distribution", "//python/private/common:distribution", "//python/private/proto:distribution", + "//python/private/pypi:distribution", "//python/private/whl_filegroup:distribution", "//tools/build_defs/python/private:distribution", ], @@ -125,62 +126,6 @@ bzl_library( srcs = ["normalize_name.bzl"], ) -bzl_library( - name = "patch_whl_bzl", - srcs = ["patch_whl.bzl"], - deps = [":parse_whl_name_bzl"], -) - -bzl_library( - name = "parse_requirements_bzl", - srcs = ["parse_requirements.bzl"], - deps = [ - ":normalize_name_bzl", - ":pypi_index_sources_bzl", - ":whl_target_platforms_bzl", - "//python/pip_install:requirements_parser_bzl", - ], -) - -bzl_library( - name = "parse_whl_name_bzl", - srcs = ["parse_whl_name.bzl"], -) - -bzl_library( - name = "pip_flags_bzl", - srcs = ["pip_flags.bzl"], - deps = [ - ":enum_bzl", - ], -) - -bzl_library( - name = "pip_repo_name_bzl", - srcs = ["pip_repo_name.bzl"], - deps = [ - ":normalize_name_bzl", - ":parse_whl_name_bzl", - ], -) - -bzl_library( - name = "pypi_index_bzl", - srcs = ["pypi_index.bzl"], - deps = [ - ":auth_bzl", - ":normalize_name_bzl", - ":text_util_bzl", - "//python/pip_install:requirements_parser_bzl", - "//python/private/bzlmod:bazel_features_bzl", - ], -) - -bzl_library( - name = "pypi_index_sources_bzl", - srcs = ["pypi_index_sources.bzl"], -) - bzl_library( name = "py_cc_toolchain_bzl", srcs = [ @@ -285,17 +230,6 @@ bzl_library( srcs = ["register_extension_info.bzl"], ) -bzl_library( - name = "render_pkg_aliases_bzl", - srcs = ["render_pkg_aliases.bzl"], - deps = [ - ":normalize_name_bzl", - ":text_util_bzl", - ":version_label_bzl", - "//python/pip_install/private:generate_group_library_build_bazel_bzl", - ], -) - bzl_library( name = "repo_utils_bzl", srcs = ["repo_utils.bzl"], @@ -340,20 +274,6 @@ bzl_library( srcs = ["version_label.bzl"], ) -bzl_library( - name = "whl_target_platforms_bzl", - srcs = ["whl_target_platforms.bzl"], - visibility = ["//:__subpackages__"], - deps = [ - "parse_whl_name_bzl", - ], -) - -bzl_library( - name = "labels_bzl", - srcs = ["labels.bzl"], -) - # @bazel_tools can't define bzl_library itself, so we just put a wrapper around it. bzl_library( name = "bazel_tools_bzl", diff --git a/python/private/bzlmod/BUILD.bazel b/python/private/bzlmod/BUILD.bazel index 3362f34ffd..2cb35fc03e 100644 --- a/python/private/bzlmod/BUILD.bazel +++ b/python/private/bzlmod/BUILD.bazel @@ -13,7 +13,6 @@ # limitations under the License. load("@bazel_skylib//:bzl_library.bzl", "bzl_library") -load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") package(default_visibility = ["//:__subpackages__"]) @@ -29,33 +28,7 @@ bzl_library( name = "pip_bzl", srcs = ["pip.bzl"], deps = [ - ":pip_repository_bzl", - "//python/pip_install:pip_repository_bzl", - "//python/private:pypi_index_bzl", - "//python/private:full_version_bzl", - "//python/private:normalize_name_bzl", - "//python/private:parse_requirements_bzl", - "//python/private:parse_whl_name_bzl", - "//python/private:pip_repo_name_bzl", - "//python/private:version_label_bzl", - ":bazel_features_bzl", - ] + [ - "@pythons_hub//:interpreters_bzl", - ] if BZLMOD_ENABLED else [], -) - -bzl_library( - name = "bazel_features_bzl", - deps = ["@bazel_features//:features"], -) - -bzl_library( - name = "pip_repository_bzl", - srcs = ["pip_repository.bzl"], - visibility = ["//:__subpackages__"], - deps = [ - "//python/private:render_pkg_aliases_bzl", - "//python/private:text_util_bzl", + "//python/private/pypi:bzlmod_bzl", ], ) @@ -66,6 +39,8 @@ bzl_library( ":pythons_hub_bzl", "//python:repositories_bzl", "//python/private:toolchains_repo_bzl", + "//python/private:util_bzl", + "@bazel_features//:features", ], ) diff --git a/python/private/bzlmod/pip.bzl b/python/private/bzlmod/pip.bzl index 2ded3a4acd..ecf94b69d5 100644 --- a/python/private/bzlmod/pip.bzl +++ b/python/private/bzlmod/pip.bzl @@ -12,817 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -"pip module extension for use with bzlmod" +"pip module extensions for use with bzlmod." -load("@bazel_features//:features.bzl", "bazel_features") -load("@pythons_hub//:interpreters.bzl", "DEFAULT_PYTHON_VERSION", "INTERPRETER_LABELS") -load( - "//python/pip_install:pip_repository.bzl", - "pip_repository_attrs", - "use_isolated", - "whl_library", -) -load("//python/private:auth.bzl", "AUTH_ATTRS") -load("//python/private:normalize_name.bzl", "normalize_name") -load("//python/private:parse_requirements.bzl", "host_platform", "parse_requirements", "select_requirement") -load("//python/private:parse_whl_name.bzl", "parse_whl_name") -load("//python/private:pip_repo_name.bzl", "pip_repo_name") -load("//python/private:pypi_index.bzl", "simpleapi_download") -load("//python/private:render_pkg_aliases.bzl", "whl_alias") -load("//python/private:repo_utils.bzl", "repo_utils") -load("//python/private:version_label.bzl", "version_label") -load(":pip_repository.bzl", "pip_repository") +load("//python/private/pypi:bzlmod.bzl", "pypi", "pypi_internal") -def _parse_version(version): - major, _, version = version.partition(".") - minor, _, version = version.partition(".") - patch, _, version = version.partition(".") - build, _, version = version.partition(".") - - return struct( - # use semver vocabulary here - major = major, - minor = minor, - patch = patch, # this is called `micro` in the Python interpreter versioning scheme - build = build, - ) - -def _major_minor_version(version): - version = _parse_version(version) - return "{}.{}".format(version.major, version.minor) - -def _whl_mods_impl(mctx): - """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, - copy_files = mods.copy_files, - copy_executables = mods.copy_executables, - data = mods.data, - data_exclude_glob = mods.data_exclude_glob, - srcs_exclude_glob = mods.srcs_exclude_glob, - )) - - _whl_mods_repo( - name = hub_name, - whl_mods = whl_mods, - ) - -def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, simpleapi_cache): - logger = repo_utils.logger(module_ctx) - python_interpreter_target = pip_attr.python_interpreter_target - is_hub_reproducible = True - - # if we do not have the python_interpreter set in the attributes - # we programmatically find it. - hub_name = pip_attr.hub_name - if python_interpreter_target == None and not pip_attr.python_interpreter: - python_name = "python_{}_host".format( - pip_attr.python_version.replace(".", "_"), - ) - if python_name not in INTERPRETER_LABELS: - fail(( - "Unable to find interpreter for pip hub '{hub_name}' for " + - "python_version={version}: Make sure a corresponding " + - '`python.toolchain(python_version="{version}")` call exists.' + - "Expected to find {python_name} among registered versions:\n {labels}" - ).format( - hub_name = hub_name, - version = pip_attr.python_version, - python_name = python_name, - labels = " \n".join(INTERPRETER_LABELS), - )) - python_interpreter_target = INTERPRETER_LABELS[python_name] - - pip_name = "{}_{}".format( - hub_name, - version_label(pip_attr.python_version), - ) - 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 - - if pip_attr.experimental_requirement_cycles: - requirement_cycles = { - name: [normalize_name(whl_name) for whl_name in whls] - for name, whls in pip_attr.experimental_requirement_cycles.items() - } - - whl_group_mapping = { - whl_name: group_name - 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 = {} - - # Create a new wheel library for each of the different whls - - get_index_urls = None - if pip_attr.experimental_index_url: - if pip_attr.download_only: - fail("Currently unsupported to use `download_only` and `experimental_index_url`") - - get_index_urls = lambda ctx, distributions: simpleapi_download( - ctx, - attr = struct( - index_url = pip_attr.experimental_index_url, - extra_index_urls = pip_attr.experimental_extra_index_urls or [], - index_url_overrides = pip_attr.experimental_index_url_overrides or {}, - sources = distributions, - envsubst = pip_attr.envsubst, - # Auth related info - netrc = pip_attr.netrc, - auth_patterns = pip_attr.auth_patterns, - ), - cache = simpleapi_cache, - parallel_download = pip_attr.parallel_download, - ) - - requirements_by_platform = parse_requirements( - module_ctx, - requirements_by_platform = pip_attr.requirements_by_platform, - requirements_linux = pip_attr.requirements_linux, - requirements_lock = pip_attr.requirements_lock, - requirements_osx = pip_attr.requirements_darwin, - requirements_windows = pip_attr.requirements_windows, - extra_pip_args = pip_attr.extra_pip_args, - get_index_urls = get_index_urls, - python_version = major_minor, - logger = logger, - ) - - repository_platform = host_platform(module_ctx.os) - 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) - group_deps = requirement_cycles.get(group_name, []) - - # Construct args separately so that the lock file can be smaller and does not include unused - # attrs. - whl_library_args = dict( - repo = pip_name, - dep_template = "@{}//{{name}}:{{target}}".format(hub_name), - ) - maybe_args = dict( - # The following values are safe to omit if they have false like values - annotation = annotation, - download_only = pip_attr.download_only, - enable_implicit_namespace_pkgs = pip_attr.enable_implicit_namespace_pkgs, - environment = pip_attr.environment, - envsubst = pip_attr.envsubst, - experimental_target_platforms = pip_attr.experimental_target_platforms, - group_deps = group_deps, - group_name = group_name, - pip_data_exclude = pip_attr.pip_data_exclude, - python_interpreter = pip_attr.python_interpreter, - python_interpreter_target = python_interpreter_target, - whl_patches = { - p: json.encode(args) - for p, args in whl_overrides.get(whl_name, {}).items() - }, - ) - whl_library_args.update({k: v for k, v in maybe_args.items() if v}) - maybe_args_with_default = dict( - # The following values have defaults next to them - isolated = (use_isolated(module_ctx, pip_attr), True), - quiet = (pip_attr.quiet, True), - timeout = (pip_attr.timeout, 600), - ) - whl_library_args.update({ - k: v - for k, (v, default) in maybe_args_with_default.items() - if v != default - }) - - if get_index_urls: - # TODO @aignas 2024-05-26: move to a separate function - found_something = False - for requirement in requirements: - for distribution in requirement.whls + [requirement.sdist]: - if not distribution: - # sdist may be None - continue - - found_something = True - is_hub_reproducible = False - - if pip_attr.netrc: - whl_library_args["netrc"] = pip_attr.netrc - if pip_attr.auth_patterns: - whl_library_args["auth_patterns"] = pip_attr.auth_patterns - - # 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) - - # This is no-op because pip is not used to download the wheel. - whl_library_args.pop("download_only", None) - - repo_name = pip_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 - - # Pure python wheels or sdists may need to have a platform here - target_platforms = None - if distribution.filename.endswith("-any.whl") or not distribution.filename.endswith(".whl"): - if len(requirements) > 1: - target_platforms = requirement.target_platforms - - 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, - filename = distribution.filename, - target_platforms = target_platforms, - ), - ) - - if found_something: - continue - - requirement = select_requirement( - requirements, - platform = 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)) - - whl_library_args["requirement"] = requirement.requirement_line - if requirement.extra_pip_args: - whl_library_args["extra_pip_args"] = requirement.extra_pip_args - - # 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 - -def _pip_impl(module_ctx): - """Implementation of a class tag that creates the pip hub and corresponding pip spoke whl repositories. - - This implementation iterates through all of the `pip.parse` calls and creates - different pip hub repositories based on the "hub_name". Each of the - pip calls create spoke repos that uses a specific Python interpreter. - - In a MODULES.bazel file we have: - - pip.parse( - hub_name = "pip", - python_version = 3.9, - requirements_lock = "//:requirements_lock_3_9.txt", - requirements_windows = "//:requirements_windows_3_9.txt", - ) - pip.parse( - hub_name = "pip", - python_version = 3.10, - requirements_lock = "//:requirements_lock_3_10.txt", - requirements_windows = "//:requirements_windows_3_10.txt", - ) - - For instance, we have a hub with the name of "pip". - A repository named the following is created. It is actually called last when - all of the pip spokes are collected. - - - @@rules_python~override~pip~pip - - As shown in the example code above we have the following. - Two different pip.parse statements exist in MODULE.bazel provide the hub_name "pip". - These definitions create two different pip spoke repositories that are - related to the hub "pip". - One spoke uses Python 3.9 and the other uses Python 3.10. This code automatically - determines the Python version and the interpreter. - Both of these pip spokes contain requirements files that includes websocket - and its dependencies. - - We also need repositories for the wheels that the different pip spokes contain. - For each Python version a different wheel repository is created. In our example - each pip spoke had a requirements file that contained websockets. We - then create two different wheel repositories that are named the following. - - - @@rules_python~override~pip~pip_39_websockets - - @@rules_python~override~pip~pip_310_websockets - - And if the wheel has any other dependencies subsequent wheels are created in the same fashion. - - The hub repository has aliases for `pkg`, `data`, etc, which have a select that resolves to - a spoke repository depending on the Python version. - - Also we may have more than one hub as defined in a MODULES.bazel file. So we could have multiple - hubs pointing to various different pip spokes. - - Some other business rules notes. A hub can only have one spoke per Python version. We cannot - have a hub named "pip" that has two spokes that use the Python 3.9 interpreter. Second - we cannot have the same hub name used in sub-modules. The hub name has to be globally - unique. - - This implementation also handles the creation of whl_modification JSON files that are used - during the creation of wheel libraries. These JSON files used via the annotations argument - when calling wheel_installer.py. - - Args: - module_ctx: module contents - """ - - # Build all of the wheel modifications if the tag class is called. - _whl_mods_impl(module_ctx) - - _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 = {} - - # 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 = {} - - 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) - is_extension_reproducible = is_extension_reproducible and is_hub_reproducible - - for hub_name, whl_map in hub_whl_map.items(): - pip_repository( - name = hub_name, - repo_name = hub_name, - whl_map = { - key: json.encode(value) - for key, value in whl_map.items() - }, - default_version = _major_minor_version(DEFAULT_PYTHON_VERSION), - groups = hub_group_map.get(hub_name), - ) - - if bazel_features.external_deps.extension_metadata_has_reproducible: - # If we are not using the `experimental_index_url feature, the extension is fully - # deterministic and we don't need to create a lock entry for it. - # - # 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) - 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. - - Args: - **kwargs: A kwarg for setting defaults for the specific attributes. The - key is expected to be the same as the attribute key. - - Returns: - A dict of attributes. - """ - attrs = dict({ - "experimental_extra_index_urls": attr.string_list( - doc = """\ -The extra index URLs to use for downloading wheels using bazel downloader. -Each value is going to be subject to `envsubst` substitutions if necessary. - -The indexes must support Simple API as described here: -https://packaging.python.org/en/latest/specifications/simple-repository-api/ - -This is equivalent to `--extra-index-urls` `pip` option. -""", - default = [], - ), - "experimental_index_url": attr.string( - default = kwargs.get("experimental_index_url", ""), - doc = """\ -The index URL to use for downloading wheels using bazel downloader. This value is going -to be subject to `envsubst` substitutions if necessary. - -The indexes must support Simple API as described here: -https://packaging.python.org/en/latest/specifications/simple-repository-api/ - -In the future this could be defaulted to `https://pypi.org` when this feature becomes -stable. - -This is equivalent to `--index-url` `pip` option. -""", - ), - "experimental_index_url_overrides": attr.string_dict( - doc = """\ -The index URL overrides for each package to use for downloading wheels using -bazel downloader. This value is going to be subject to `envsubst` substitutions -if necessary. - -The key is the package name (will be normalized before usage) and the value is the -index URL. - -This design pattern has been chosen in order to be fully deterministic about which -packages come from which source. We want to avoid issues similar to what happened in -https://pytorch.org/blog/compromised-nightly-dependency/. - -The indexes must support Simple API as described here: -https://packaging.python.org/en/latest/specifications/simple-repository-api/ -""", - ), - "hub_name": attr.string( - mandatory = True, - doc = """ -The name of the repo pip dependencies will be accessible from. - -This name must be unique between modules; unless your module is guaranteed to -always be the root module, it's highly recommended to include your module name -in the hub name. Repo mapping, `use_repo(..., pip="my_modules_pip_deps")`, can -be used for shorter local names within your module. - -Within a module, the same `hub_name` can be specified to group different Python -versions of pip dependencies under one repository name. This allows using a -Python version-agnostic name when referring to pip dependencies; the -correct version will be automatically selected. - -Typically, a module will only have a single hub of pip dependencies, but this -is not required. Each hub is a separate resolution of pip dependencies. This -means if different programs need different versions of some library, separate -hubs can be created, and each program can use its respective hub's targets. -Targets from different hubs should not be used together. -""", - ), - "parallel_download": attr.bool( - doc = """\ -The flag allows to make use of parallel downloading feature in bazel 7.1 and above -when the bazel downloader is used. This is by default enabled as it improves the -performance by a lot, but in case the queries to the simple API are very expensive -or when debugging authentication issues one may want to disable this feature. - -NOTE, This will download (potentially duplicate) data for multiple packages if -there is more than one index available, but in general this should be negligible -because the simple API calls are very cheap and the user should not notice any -extra overhead. - -If we are in synchronous mode, then we will use the first result that we -find in case extra indexes are specified. -""", - default = True, - ), - "python_version": attr.string( - mandatory = True, - doc = """ -The Python version the dependencies are targetting, in Major.Minor format -(e.g., "3.11") or patch level granularity (e.g. "3.11.1"). - -If an interpreter isn't explicitly provided (using `python_interpreter` or -`python_interpreter_target`), then the version specified here must have -a corresponding `python.toolchain()` configured. -""", - ), - "whl_modifications": attr.label_keyed_string_dict( - mandatory = False, - doc = """\ -A dict of labels to wheel names that is typically generated by the whl_modifications. -The labels are JSON config files describing the modifications. -""", - ), - }, **pip_repository_attrs) - attrs.update(AUTH_ATTRS) - - # Like the pip_repository rule, we end up setting this manually so - # don't allow users to override it. - attrs.pop("repo_prefix") - - # annotations has been replaced with whl_modifications in bzlmod - attrs.pop("annotations") - - return attrs - -def _whl_mod_attrs(): - attrs = { - "additive_build_content": attr.string( - doc = "(str, optional): Raw text to add to the generated `BUILD` file of a package.", - ), - "additive_build_content_file": attr.label( - doc = """\ -(label, optional): path to a BUILD file to add to the generated -`BUILD` file of a package. You cannot use both additive_build_content and additive_build_content_file -arguments at the same time.""", - ), - "copy_executables": attr.string_dict( - doc = """\ -(dict, optional): A mapping of `src` and `out` files for -[@bazel_skylib//rules:copy_file.bzl][cf]. Targets generated here will also be flagged as -executable.""", - ), - "copy_files": attr.string_dict( - doc = """\ -(dict, optional): A mapping of `src` and `out` files for -[@bazel_skylib//rules:copy_file.bzl][cf]""", - ), - "data": attr.string_list( - doc = """\ -(list, optional): A list of labels to add as `data` dependencies to -the generated `py_library` target.""", - ), - "data_exclude_glob": attr.string_list( - doc = """\ -(list, optional): A list of exclude glob patterns to add as `data` to -the generated `py_library` target.""", - ), - "hub_name": attr.string( - doc = """\ -Name of the whl modification, hub we use this name to set the modifications for -pip.parse. If you have different pip hubs you can use a different name, -otherwise it is best practice to just use one. - -You cannot have the same `hub_name` in different modules. You can reuse the same -name in the same module for different wheels that you put in the same hub, but you -cannot have a child module that uses the same `hub_name`. -""", - mandatory = True, - ), - "srcs_exclude_glob": attr.string_list( - doc = """\ -(list, optional): A list of labels to add as `srcs` to the generated -`py_library` target.""", - ), - "whl_name": attr.string( - doc = "The whl name that the modifications are used for.", - mandatory = True, - ), - } - return attrs - -# NOTE: the naming of 'override' is taken from the bzlmod native -# 'archive_override', 'git_override' bzlmod functions. -_override_tag = tag_class( - attrs = { - "file": attr.string( - doc = """\ -The Python distribution file name which needs to be patched. This will be -applied to all repositories that setup this distribution via the pip.parse tag -class.""", - mandatory = True, - ), - "patch_strip": attr.int( - default = 0, - doc = """\ -The number of leading path segments to be stripped from the file name in the -patches.""", - ), - "patches": attr.label_list( - doc = """\ -A list of patches to apply to the repository *after* 'whl_library' is extracted -and BUILD.bazel file is generated.""", - mandatory = True, - ), - }, - doc = """\ -Apply any overrides (e.g. patches) to a given Python distribution defined by -other tags in this extension.""", -) - -pip = module_extension( - doc = """\ -This extension is used to make dependencies from pip available. - -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. `@pip//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_impl, - tag_classes = { - "override": _override_tag, - "parse": tag_class( - 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. -""", - ), - }, -) - -pip_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. -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. -""", - ), - }, -) - -def _whl_mods_repo_impl(rctx): - rctx.file("BUILD.bazel", "") - for whl_name, mods in rctx.attr.whl_mods.items(): - rctx.file("{}.json".format(whl_name), mods) - -_whl_mods_repo = repository_rule( - doc = """\ -This rule creates json files based on the whl_mods attribute. -""", - implementation = _whl_mods_repo_impl, - attrs = { - "whl_mods": attr.string_dict( - mandatory = True, - doc = "JSON endcoded string that is provided to wheel_builder.py", - ), - }, -) +pip = pypi +pip_internal = pypi_internal diff --git a/python/private/normalize_platform.bzl b/python/private/normalize_platform.bzl deleted file mode 100644 index 633062f399..0000000000 --- a/python/private/normalize_platform.bzl +++ /dev/null @@ -1,13 +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. diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel new file mode 100644 index 0000000000..1530837f7d --- /dev/null +++ b/python/private/pypi/BUILD.bazel @@ -0,0 +1,238 @@ +# 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("@bazel_skylib//:bzl_library.bzl", "bzl_library") +load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") + +package(default_visibility = ["//:__subpackages__"]) + +licenses(["notice"]) + +filegroup( + name = "distribution", + srcs = glob(["**"]), + visibility = ["//python/private:__pkg__"], +) + +# Filegroup of bzl files that can be used by downstream rules for documentation generation +filegroup( + name = "bzl", + srcs = glob(["**/*.bzl"]), + visibility = ["//python/private:__pkg__"], +) + +# Keep sorted by library name and keep the files named by the main symbol they export + +bzl_library( + name = "attrs_bzl", + srcs = ["attrs.bzl"], +) + +bzl_library( + name = "bzlmod_bzl", + srcs = ["bzlmod.bzl"], + deps = [ + ":attrs_bzl", + ":hub_repository_bzl", + ":parse_requirements_bzl", + ":parse_whl_name_bzl", + ":pip_repository_attrs_bzl", + ":simpleapi_download_bzl", + ":whl_library_bzl", + ":whl_repo_name_bzl", + "//python/private:full_version_bzl", + "//python/private:normalize_name_bzl", + "//python/private:version_label_bzl", + "@bazel_features//:features", + ] + [ + "@pythons_hub//:interpreters_bzl", + ] if BZLMOD_ENABLED else [], +) + +bzl_library( + name = "config_settings_bzl", + srcs = ["config_settings.bzl"], + deps = ["flags_bzl"], +) + +bzl_library( + name = "flags_bzl", + srcs = ["flags.bzl"], + deps = ["//python/private:enum_bzl"], +) + +bzl_library( + name = "generate_whl_library_build_bazel_bzl", + srcs = ["generate_whl_library_build_bazel.bzl"], + deps = [ + ":labels_bzl", + "//python/private:normalize_name_bzl", + ], +) + +bzl_library( + name = "generate_group_library_build_bazel_bzl", + srcs = ["generate_group_library_build_bazel.bzl"], + deps = [ + ":labels_bzl", + "//python/private:normalize_name_bzl", + ], +) + +bzl_library( + name = "group_library_bzl", + srcs = ["group_library.bzl"], + deps = [ + ":generate_group_library_build_bazel_bzl", + ], +) + +bzl_library( + name = "hub_repository_bzl", + srcs = ["hub_repository.bzl"], + visibility = ["//:__subpackages__"], + deps = [ + ":render_pkg_aliases_bzl", + "//python/private:text_util_bzl", + ], +) + +bzl_library( + name = "index_sources_bzl", + srcs = ["index_sources.bzl"], +) + +bzl_library( + name = "labels_bzl", + srcs = ["labels.bzl"], +) + +bzl_library( + name = "package_annotation_bzl", + srcs = ["package_annotation.bzl"], +) + +bzl_library( + name = "parse_requirements_bzl", + srcs = ["parse_requirements.bzl"], + deps = [ + ":index_sources_bzl", + ":parse_requirements_txt_bzl", + ":whl_target_platforms_bzl", + "//python/private:normalize_name_bzl", + ], +) + +bzl_library( + name = "parse_requirements_txt_bzl", + srcs = ["parse_requirements_txt.bzl"], +) + +bzl_library( + name = "parse_simpleapi_html_bzl", + srcs = ["parse_simpleapi_html.bzl"], +) + +bzl_library( + name = "parse_whl_name_bzl", + srcs = ["parse_whl_name.bzl"], +) + +bzl_library( + name = "patch_whl_bzl", + srcs = ["patch_whl.bzl"], + deps = [ + ":parse_whl_name_bzl", + "//python/private:repo_utils_bzl", + ], +) + +bzl_library( + name = "pip_repository_bzl", + srcs = ["pip_repository.bzl"], + deps = [ + ":attrs_bzl", + ":parse_requirements_bzl", + ":pip_repository_attrs_bzl", + ":render_pkg_aliases_bzl", + "//python/private:normalize_name_bzl", + "//python/private:repo_utils_bzl", + "//python/private:text_util_bzl", + "@bazel_skylib//lib:sets", + ], +) + +bzl_library( + name = "pip_repository_attrs_bzl", + srcs = ["pip_repository_attrs.bzl"], +) + +bzl_library( + name = "render_pkg_aliases_bzl", + srcs = ["render_pkg_aliases.bzl"], + deps = [ + ":generate_group_library_build_bazel_bzl", + ":labels_bzl", + ":parse_whl_name_bzl", + ":whl_target_platforms_bzl", + "//python/private:normalize_name_bzl", + "//python/private:text_util_bzl", + ], +) + +bzl_library( + name = "simpleapi_download_bzl", + srcs = ["simpleapi_download.bzl"], + deps = [ + ":parse_simpleapi_html_bzl", + "//python/private:auth_bzl", + "//python/private:normalize_name_bzl", + "//python/private:text_util_bzl", + "@bazel_features//:features", + ], +) + +bzl_library( + name = "whl_library_bzl", + srcs = ["whl_library.bzl"], + deps = [ + ":attrs_bzl", + ":generate_whl_library_build_bazel_bzl", + ":parse_whl_name_bzl", + ":patch_whl_bzl", + ":whl_target_platforms_bzl", + "//python:repositories_bzl", + "//python:versions_bzl", + "//python/pip_install:repositories_bzl", + "//python/private:auth_bzl", + "//python/private:envsubst_bzl", + "//python/private:repo_utils_bzl", + "//python/private:toolchains_repo_bzl", + ], +) + +bzl_library( + name = "whl_repo_name_bzl", + srcs = ["whl_repo_name.bzl"], + deps = [ + ":parse_whl_name_bzl", + "//python/private:normalize_name_bzl", + ], +) + +bzl_library( + name = "whl_target_platforms_bzl", + srcs = ["whl_target_platforms.bzl"], + deps = [":parse_whl_name_bzl"], +) diff --git a/python/private/pypi/README.md b/python/private/pypi/README.md new file mode 100644 index 0000000000..6be5703912 --- /dev/null +++ b/python/private/pypi/README.md @@ -0,0 +1,9 @@ +# PyPI integration code + +This code is for integrating with PyPI and other compatible indexes. At the +moment we have code for: +* Downloading packages using `pip` or `repository_ctx.download`. +* Interacting with PyPI compatible indexes via [SimpleAPI] spec. +* Locking a `requirements.in` or [PEP621] compliant `pyproject.toml`. + +[PEP621]: https://peps.python.org/pep-0621/ diff --git a/python/private/pypi/attrs.bzl b/python/private/pypi/attrs.bzl new file mode 100644 index 0000000000..79ffea54a1 --- /dev/null +++ b/python/private/pypi/attrs.bzl @@ -0,0 +1,224 @@ +# 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. + +"common attributes for whl_library and pip_repository" + +ATTRS = { + "download_only": attr.bool( + doc = """ +Whether to use "pip download" instead of "pip wheel". Disables building wheels from source, but allows use of +--platform, --python-version, --implementation, and --abi in --extra_pip_args to download wheels for a different +platform from the host platform. + """, + ), + "enable_implicit_namespace_pkgs": attr.bool( + default = False, + doc = """ +If true, disables conversion of native namespace packages into pkg-util style namespace packages. When set all py_binary +and py_test targets must specify either `legacy_create_init=False` or the global Bazel option +`--incompatible_default_to_explicit_init_py` to prevent `__init__.py` being automatically generated in every directory. + +This option is required to support some packages which cannot handle the conversion to pkg-util style. + """, + ), + "environment": attr.string_dict( + doc = """ +Environment variables to set in the pip subprocess. +Can be used to set common variables such as `http_proxy`, `https_proxy` and `no_proxy` +Note that pip is run with "--isolated" on the CLI so `PIP__` +style env vars are ignored, but env vars that control requests and urllib3 +can be passed. If you need `PIP__`, take a look at `extra_pip_args` +and `envsubst`. + """, + default = {}, + ), + "envsubst": attr.string_list( + mandatory = False, + doc = """\ +A list of environment variables to substitute (e.g. `["PIP_INDEX_URL", +"PIP_RETRIES"]`). The corresponding variables are expanded in `extra_pip_args` +using the syntax `$VARNAME` or `${VARNAME}` (expanding to empty string if unset) +or `${VARNAME:-default}` (expanding to default if the variable is unset or empty +in the environment). Note: On Bazel 6 and Bazel 7.0 changes to the variables named +here do not cause packages to be re-fetched. Don't fetch different things based +on the value of these variables. +""", + ), + "experimental_requirement_cycles": attr.string_list_dict( + default = {}, + doc = """\ +A mapping of dependency cycle names to a list of requirements which form that cycle. + +Requirements which form cycles will be installed together and taken as +dependencies together in order to ensure that the cycle is always satisified. + +Example: + `sphinx` depends on `sphinxcontrib-serializinghtml` + When listing both as requirements, ala + + ``` + py_binary( + name = "doctool", + ... + deps = [ + "@pypi//sphinx:pkg", + "@pypi//sphinxcontrib_serializinghtml", + ] + ) + ``` + + Will produce a Bazel error such as + + ``` + ERROR: .../external/pypi_sphinxcontrib_serializinghtml/BUILD.bazel:44:6: in alias rule @pypi_sphinxcontrib_serializinghtml//:pkg: cycle in dependency graph: + //:doctool (...) + @pypi//sphinxcontrib_serializinghtml:pkg (...) + .-> @pypi_sphinxcontrib_serializinghtml//:pkg (...) + | @pypi_sphinxcontrib_serializinghtml//:_pkg (...) + | @pypi_sphinx//:pkg (...) + | @pypi_sphinx//:_pkg (...) + `-- @pypi_sphinxcontrib_serializinghtml//:pkg (...) + ``` + + Which we can resolve by configuring these two requirements to be installed together as a cycle + + ``` + pip_parse( + ... + experimental_requirement_cycles = { + "sphinx": [ + "sphinx", + "sphinxcontrib-serializinghtml", + ] + }, + ) + ``` + +Warning: + If a dependency participates in multiple cycles, all of those cycles must be + collapsed down to one. For instance `a <-> b` and `a <-> c` cannot be listed + as two separate cycles. +""", + ), + "experimental_target_platforms": attr.string_list( + default = [], + doc = """\ +A list of platforms that we will generate the conditional dependency graph for +cross platform wheels by parsing the wheel metadata. This will generate the +correct dependencies for packages like `sphinx` or `pylint`, which include +`colorama` when installed and used on Windows platforms. + +An empty list means falling back to the legacy behaviour where the host +platform is the target platform. + +WARNING: It may not work as expected in cases where the python interpreter +implementation that is being used at runtime is different between different platforms. +This has been tested for CPython only. + +For specific target platforms use values of the form `_` where `` +is one of `linux`, `osx`, `windows` and arch is one of `x86_64`, `x86_32`, +`aarch64`, `s390x` and `ppc64le`. + +You can also target a specific Python version by using `cp3__`. +If multiple python versions are specified as target platforms, then select statements +of the `lib` and `whl` targets will include usage of version aware toolchain config +settings like `@rules_python//python/config_settings:is_python_3.y`. + +Special values: `host` (for generating deps for the host platform only) and +`_*` values. For example, `cp39_*`, `linux_*`, `cp39_linux_*`. + +NOTE: this is not for cross-compiling Python wheels but rather for parsing the `whl` METADATA correctly. +""", + ), + "extra_pip_args": attr.string_list( + doc = """Extra arguments to pass on to pip. Must not contain spaces. + +Supports environment variables using the syntax `$VARNAME` or +`${VARNAME}` (expanding to empty string if unset) or +`${VARNAME:-default}` (expanding to default if the variable is unset +or empty in the environment), if `"VARNAME"` is listed in the +`envsubst` attribute. See also `envsubst`. +""", + ), + "isolated": attr.bool( + doc = """\ +Whether or not to pass the [--isolated](https://pip.pypa.io/en/stable/cli/pip/#cmdoption-isolated) flag to +the underlying pip command. Alternatively, the `RULES_PYTHON_PIP_ISOLATED` environment variable can be used +to control this flag. +""", + default = True, + ), + "pip_data_exclude": attr.string_list( + doc = "Additional data exclusion parameters to add to the pip packages BUILD file.", + ), + "python_interpreter": attr.string( + doc = """\ +The python interpreter to use. This can either be an absolute path or the name +of a binary found on the host's `PATH` environment variable. If no value is set +`python3` is defaulted for Unix systems and `python.exe` for Windows. +""", + # NOTE: This attribute should not have a default. See `_get_python_interpreter_attr` + # default = "python3" + ), + "python_interpreter_target": attr.label( + allow_single_file = True, + doc = """ +If you are using a custom python interpreter built by another repository rule, +use this attribute to specify its BUILD target. This allows pip_repository to invoke +pip using the same interpreter as your toolchain. If set, takes precedence over +python_interpreter. An example value: "@python3_x86_64-unknown-linux-gnu//:python". +""", + ), + "quiet": attr.bool( + default = True, + doc = """\ +If True, suppress printing stdout and stderr output to the terminal. + +If you would like to get more diagnostic output, please use: + + RULES_PYTHON_REPO_DEBUG=1 + +or + + RULES_PYTHON_REPO_DEBUG_VERBOSITY= +""", + ), + # 600 is documented as default here: https://docs.bazel.build/versions/master/skylark/lib/repository_ctx.html#execute + "timeout": attr.int( + default = 600, + doc = "Timeout (in seconds) on the rule's execution duration.", + ), +} + +def use_isolated(ctx, attr): + """Determine whether or not to pass the pip `--isolated` flag to the pip invocation. + + Args: + ctx: repository or module context + attr: attributes for the repo rule or tag extension + + Returns: + True if --isolated should be passed + """ + use_isolated = attr.isolated + + # The environment variable will take precedence over the attribute + isolated_env = ctx.os.environ.get("RULES_PYTHON_PIP_ISOLATED", None) + if isolated_env != None: + if isolated_env.lower() in ("0", "false"): + use_isolated = False + else: + use_isolated = True + + return use_isolated diff --git a/python/private/pypi/bzlmod.bzl b/python/private/pypi/bzlmod.bzl new file mode 100644 index 0000000000..e98208a2a6 --- /dev/null +++ b/python/private/pypi/bzlmod.bzl @@ -0,0 +1,818 @@ +# 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. + +"pip module extension for use with bzlmod" + +load("@bazel_features//:features.bzl", "bazel_features") +load("@pythons_hub//:interpreters.bzl", "DEFAULT_PYTHON_VERSION", "INTERPRETER_LABELS") +load("//python/private:auth.bzl", "AUTH_ATTRS") +load("//python/private:normalize_name.bzl", "normalize_name") +load("//python/private:repo_utils.bzl", "repo_utils") +load("//python/private:version_label.bzl", "version_label") +load(":attrs.bzl", "use_isolated") +load(":hub_repository.bzl", "hub_repository") +load(":parse_requirements.bzl", "host_platform", "parse_requirements", "select_requirement") +load(":parse_whl_name.bzl", "parse_whl_name") +load(":pip_repository_attrs.bzl", "ATTRS") +load(":render_pkg_aliases.bzl", "whl_alias") +load(":simpleapi_download.bzl", "simpleapi_download") +load(":whl_library.bzl", "whl_library") +load(":whl_repo_name.bzl", "whl_repo_name") + +def _parse_version(version): + major, _, version = version.partition(".") + minor, _, version = version.partition(".") + patch, _, version = version.partition(".") + build, _, version = version.partition(".") + + return struct( + # use semver vocabulary here + major = major, + minor = minor, + patch = patch, # this is called `micro` in the Python interpreter versioning scheme + build = build, + ) + +def _major_minor_version(version): + version = _parse_version(version) + return "{}.{}".format(version.major, version.minor) + +def _whl_mods_impl(mctx): + """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, + copy_files = mods.copy_files, + copy_executables = mods.copy_executables, + data = mods.data, + data_exclude_glob = mods.data_exclude_glob, + srcs_exclude_glob = mods.srcs_exclude_glob, + )) + + _whl_mods_repo( + name = hub_name, + whl_mods = whl_mods, + ) + +def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, simpleapi_cache): + logger = repo_utils.logger(module_ctx) + python_interpreter_target = pip_attr.python_interpreter_target + is_hub_reproducible = True + + # if we do not have the python_interpreter set in the attributes + # we programmatically find it. + hub_name = pip_attr.hub_name + if python_interpreter_target == None and not pip_attr.python_interpreter: + python_name = "python_{}_host".format( + pip_attr.python_version.replace(".", "_"), + ) + if python_name not in INTERPRETER_LABELS: + fail(( + "Unable to find interpreter for pip hub '{hub_name}' for " + + "python_version={version}: Make sure a corresponding " + + '`python.toolchain(python_version="{version}")` call exists.' + + "Expected to find {python_name} among registered versions:\n {labels}" + ).format( + hub_name = hub_name, + version = pip_attr.python_version, + python_name = python_name, + labels = " \n".join(INTERPRETER_LABELS), + )) + python_interpreter_target = INTERPRETER_LABELS[python_name] + + pip_name = "{}_{}".format( + hub_name, + version_label(pip_attr.python_version), + ) + 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 + + if pip_attr.experimental_requirement_cycles: + requirement_cycles = { + name: [normalize_name(whl_name) for whl_name in whls] + for name, whls in pip_attr.experimental_requirement_cycles.items() + } + + whl_group_mapping = { + whl_name: group_name + 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 = {} + + # Create a new wheel library for each of the different whls + + get_index_urls = None + if pip_attr.experimental_index_url: + if pip_attr.download_only: + fail("Currently unsupported to use `download_only` and `experimental_index_url`") + + get_index_urls = lambda ctx, distributions: simpleapi_download( + ctx, + attr = struct( + index_url = pip_attr.experimental_index_url, + extra_index_urls = pip_attr.experimental_extra_index_urls or [], + index_url_overrides = pip_attr.experimental_index_url_overrides or {}, + sources = distributions, + envsubst = pip_attr.envsubst, + # Auth related info + netrc = pip_attr.netrc, + auth_patterns = pip_attr.auth_patterns, + ), + cache = simpleapi_cache, + parallel_download = pip_attr.parallel_download, + ) + + requirements_by_platform = parse_requirements( + module_ctx, + requirements_by_platform = pip_attr.requirements_by_platform, + requirements_linux = pip_attr.requirements_linux, + requirements_lock = pip_attr.requirements_lock, + requirements_osx = pip_attr.requirements_darwin, + requirements_windows = pip_attr.requirements_windows, + extra_pip_args = pip_attr.extra_pip_args, + get_index_urls = get_index_urls, + python_version = major_minor, + logger = logger, + ) + + repository_platform = host_platform(module_ctx.os) + 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) + group_deps = requirement_cycles.get(group_name, []) + + # Construct args separately so that the lock file can be smaller and does not include unused + # attrs. + whl_library_args = dict( + repo = pip_name, + dep_template = "@{}//{{name}}:{{target}}".format(hub_name), + ) + maybe_args = dict( + # The following values are safe to omit if they have false like values + annotation = annotation, + download_only = pip_attr.download_only, + enable_implicit_namespace_pkgs = pip_attr.enable_implicit_namespace_pkgs, + environment = pip_attr.environment, + envsubst = pip_attr.envsubst, + experimental_target_platforms = pip_attr.experimental_target_platforms, + group_deps = group_deps, + group_name = group_name, + pip_data_exclude = pip_attr.pip_data_exclude, + python_interpreter = pip_attr.python_interpreter, + python_interpreter_target = python_interpreter_target, + whl_patches = { + p: json.encode(args) + for p, args in whl_overrides.get(whl_name, {}).items() + }, + ) + whl_library_args.update({k: v for k, v in maybe_args.items() if v}) + maybe_args_with_default = dict( + # The following values have defaults next to them + isolated = (use_isolated(module_ctx, pip_attr), True), + quiet = (pip_attr.quiet, True), + timeout = (pip_attr.timeout, 600), + ) + whl_library_args.update({ + k: v + for k, (v, default) in maybe_args_with_default.items() + if v != default + }) + + if get_index_urls: + # TODO @aignas 2024-05-26: move to a separate function + found_something = False + for requirement in requirements: + for distribution in requirement.whls + [requirement.sdist]: + if not distribution: + # sdist may be None + continue + + found_something = True + is_hub_reproducible = False + + if pip_attr.netrc: + whl_library_args["netrc"] = pip_attr.netrc + if pip_attr.auth_patterns: + whl_library_args["auth_patterns"] = pip_attr.auth_patterns + + # 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) + + # This is no-op because pip is not used to download the wheel. + whl_library_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 + + # Pure python wheels or sdists may need to have a platform here + target_platforms = None + if distribution.filename.endswith("-any.whl") or not distribution.filename.endswith(".whl"): + if len(requirements) > 1: + target_platforms = requirement.target_platforms + + 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, + filename = distribution.filename, + target_platforms = target_platforms, + ), + ) + + if found_something: + continue + + requirement = select_requirement( + requirements, + platform = 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)) + + whl_library_args["requirement"] = requirement.requirement_line + if requirement.extra_pip_args: + whl_library_args["extra_pip_args"] = requirement.extra_pip_args + + # 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 + +def _pip_impl(module_ctx): + """Implementation of a class tag that creates the pip hub and corresponding pip spoke whl repositories. + + This implementation iterates through all of the `pip.parse` calls and creates + different pip hub repositories based on the "hub_name". Each of the + pip calls create spoke repos that uses a specific Python interpreter. + + In a MODULES.bazel file we have: + + pip.parse( + hub_name = "pip", + python_version = 3.9, + requirements_lock = "//:requirements_lock_3_9.txt", + requirements_windows = "//:requirements_windows_3_9.txt", + ) + pip.parse( + hub_name = "pip", + python_version = 3.10, + requirements_lock = "//:requirements_lock_3_10.txt", + requirements_windows = "//:requirements_windows_3_10.txt", + ) + + For instance, we have a hub with the name of "pip". + A repository named the following is created. It is actually called last when + all of the pip spokes are collected. + + - @@rules_python~override~pip~pip + + As shown in the example code above we have the following. + Two different pip.parse statements exist in MODULE.bazel provide the hub_name "pip". + These definitions create two different pip spoke repositories that are + related to the hub "pip". + One spoke uses Python 3.9 and the other uses Python 3.10. This code automatically + determines the Python version and the interpreter. + Both of these pip spokes contain requirements files that includes websocket + and its dependencies. + + We also need repositories for the wheels that the different pip spokes contain. + For each Python version a different wheel repository is created. In our example + each pip spoke had a requirements file that contained websockets. We + then create two different wheel repositories that are named the following. + + - @@rules_python~override~pip~pip_39_websockets + - @@rules_python~override~pip~pip_310_websockets + + And if the wheel has any other dependencies subsequent wheels are created in the same fashion. + + The hub repository has aliases for `pkg`, `data`, etc, which have a select that resolves to + a spoke repository depending on the Python version. + + Also we may have more than one hub as defined in a MODULES.bazel file. So we could have multiple + hubs pointing to various different pip spokes. + + Some other business rules notes. A hub can only have one spoke per Python version. We cannot + have a hub named "pip" that has two spokes that use the Python 3.9 interpreter. Second + we cannot have the same hub name used in sub-modules. The hub name has to be globally + unique. + + This implementation also handles the creation of whl_modification JSON files that are used + during the creation of wheel libraries. These JSON files used via the annotations argument + when calling wheel_installer.py. + + Args: + module_ctx: module contents + """ + + # Build all of the wheel modifications if the tag class is called. + _whl_mods_impl(module_ctx) + + _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 = {} + + # 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 = {} + + 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) + is_extension_reproducible = is_extension_reproducible and is_hub_reproducible + + for hub_name, whl_map in hub_whl_map.items(): + hub_repository( + name = hub_name, + repo_name = hub_name, + whl_map = { + key: json.encode(value) + for key, value in whl_map.items() + }, + default_version = _major_minor_version(DEFAULT_PYTHON_VERSION), + groups = hub_group_map.get(hub_name), + ) + + if bazel_features.external_deps.extension_metadata_has_reproducible: + # If we are not using the `experimental_index_url feature, the extension is fully + # deterministic and we don't need to create a lock entry for it. + # + # 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) + 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. + + Args: + **kwargs: A kwarg for setting defaults for the specific attributes. The + key is expected to be the same as the attribute key. + + Returns: + A dict of attributes. + """ + attrs = dict({ + "experimental_extra_index_urls": attr.string_list( + doc = """\ +The extra index URLs to use for downloading wheels using bazel downloader. +Each value is going to be subject to `envsubst` substitutions if necessary. + +The indexes must support Simple API as described here: +https://packaging.python.org/en/latest/specifications/simple-repository-api/ + +This is equivalent to `--extra-index-urls` `pip` option. +""", + default = [], + ), + "experimental_index_url": attr.string( + default = kwargs.get("experimental_index_url", ""), + doc = """\ +The index URL to use for downloading wheels using bazel downloader. This value is going +to be subject to `envsubst` substitutions if necessary. + +The indexes must support Simple API as described here: +https://packaging.python.org/en/latest/specifications/simple-repository-api/ + +In the future this could be defaulted to `https://pypi.org` when this feature becomes +stable. + +This is equivalent to `--index-url` `pip` option. +""", + ), + "experimental_index_url_overrides": attr.string_dict( + doc = """\ +The index URL overrides for each package to use for downloading wheels using +bazel downloader. This value is going to be subject to `envsubst` substitutions +if necessary. + +The key is the package name (will be normalized before usage) and the value is the +index URL. + +This design pattern has been chosen in order to be fully deterministic about which +packages come from which source. We want to avoid issues similar to what happened in +https://pytorch.org/blog/compromised-nightly-dependency/. + +The indexes must support Simple API as described here: +https://packaging.python.org/en/latest/specifications/simple-repository-api/ +""", + ), + "hub_name": attr.string( + mandatory = True, + doc = """ +The name of the repo pip dependencies will be accessible from. + +This name must be unique between modules; unless your module is guaranteed to +always be the root module, it's highly recommended to include your module name +in the hub name. Repo mapping, `use_repo(..., pip="my_modules_pip_deps")`, can +be used for shorter local names within your module. + +Within a module, the same `hub_name` can be specified to group different Python +versions of pip dependencies under one repository name. This allows using a +Python version-agnostic name when referring to pip dependencies; the +correct version will be automatically selected. + +Typically, a module will only have a single hub of pip dependencies, but this +is not required. Each hub is a separate resolution of pip dependencies. This +means if different programs need different versions of some library, separate +hubs can be created, and each program can use its respective hub's targets. +Targets from different hubs should not be used together. +""", + ), + "parallel_download": attr.bool( + doc = """\ +The flag allows to make use of parallel downloading feature in bazel 7.1 and above +when the bazel downloader is used. This is by default enabled as it improves the +performance by a lot, but in case the queries to the simple API are very expensive +or when debugging authentication issues one may want to disable this feature. + +NOTE, This will download (potentially duplicate) data for multiple packages if +there is more than one index available, but in general this should be negligible +because the simple API calls are very cheap and the user should not notice any +extra overhead. + +If we are in synchronous mode, then we will use the first result that we +find in case extra indexes are specified. +""", + default = True, + ), + "python_version": attr.string( + mandatory = True, + doc = """ +The Python version the dependencies are targetting, in Major.Minor format +(e.g., "3.11") or patch level granularity (e.g. "3.11.1"). + +If an interpreter isn't explicitly provided (using `python_interpreter` or +`python_interpreter_target`), then the version specified here must have +a corresponding `python.toolchain()` configured. +""", + ), + "whl_modifications": attr.label_keyed_string_dict( + mandatory = False, + doc = """\ +A dict of labels to wheel names that is typically generated by the whl_modifications. +The labels are JSON config files describing the modifications. +""", + ), + }, **ATTRS) + attrs.update(AUTH_ATTRS) + + return attrs + +def _whl_mod_attrs(): + attrs = { + "additive_build_content": attr.string( + doc = "(str, optional): Raw text to add to the generated `BUILD` file of a package.", + ), + "additive_build_content_file": attr.label( + doc = """\ +(label, optional): path to a BUILD file to add to the generated +`BUILD` file of a package. You cannot use both additive_build_content and additive_build_content_file +arguments at the same time.""", + ), + "copy_executables": attr.string_dict( + doc = """\ +(dict, optional): A mapping of `src` and `out` files for +[@bazel_skylib//rules:copy_file.bzl][cf]. Targets generated here will also be flagged as +executable.""", + ), + "copy_files": attr.string_dict( + doc = """\ +(dict, optional): A mapping of `src` and `out` files for +[@bazel_skylib//rules:copy_file.bzl][cf]""", + ), + "data": attr.string_list( + doc = """\ +(list, optional): A list of labels to add as `data` dependencies to +the generated `py_library` target.""", + ), + "data_exclude_glob": attr.string_list( + doc = """\ +(list, optional): A list of exclude glob patterns to add as `data` to +the generated `py_library` target.""", + ), + "hub_name": attr.string( + doc = """\ +Name of the whl modification, hub we use this name to set the modifications for +pip.parse. If you have different pip hubs you can use a different name, +otherwise it is best practice to just use one. + +You cannot have the same `hub_name` in different modules. You can reuse the same +name in the same module for different wheels that you put in the same hub, but you +cannot have a child module that uses the same `hub_name`. +""", + mandatory = True, + ), + "srcs_exclude_glob": attr.string_list( + doc = """\ +(list, optional): A list of labels to add as `srcs` to the generated +`py_library` target.""", + ), + "whl_name": attr.string( + doc = "The whl name that the modifications are used for.", + mandatory = True, + ), + } + return attrs + +# NOTE: the naming of 'override' is taken from the bzlmod native +# 'archive_override', 'git_override' bzlmod functions. +_override_tag = tag_class( + attrs = { + "file": attr.string( + doc = """\ +The Python distribution file name which needs to be patched. This will be +applied to all repositories that setup this distribution via the pip.parse tag +class.""", + mandatory = True, + ), + "patch_strip": attr.int( + default = 0, + doc = """\ +The number of leading path segments to be stripped from the file name in the +patches.""", + ), + "patches": attr.label_list( + doc = """\ +A list of patches to apply to the repository *after* 'whl_library' is extracted +and BUILD.bazel file is generated.""", + mandatory = True, + ), + }, + doc = """\ +Apply any overrides (e.g. patches) to a given Python distribution defined by +other tags in this extension.""", +) + +pypi = module_extension( + doc = """\ +This extension is used to make dependencies from pip available. + +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. `@pip//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_impl, + tag_classes = { + "override": _override_tag, + "parse": tag_class( + 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. +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. +""", + ), + }, +) + +def _whl_mods_repo_impl(rctx): + rctx.file("BUILD.bazel", "") + for whl_name, mods in rctx.attr.whl_mods.items(): + rctx.file("{}.json".format(whl_name), mods) + +_whl_mods_repo = repository_rule( + doc = """\ +This rule creates json files based on the whl_mods attribute. +""", + implementation = _whl_mods_repo_impl, + attrs = { + "whl_mods": attr.string_dict( + mandatory = True, + doc = "JSON endcoded string that is provided to wheel_builder.py", + ), + }, +) diff --git a/python/private/pip_config_settings.bzl b/python/private/pypi/config_settings.bzl similarity index 98% rename from python/private/pip_config_settings.bzl rename to python/private/pypi/config_settings.bzl index b13b39b725..974121782f 100644 --- a/python/private/pip_config_settings.bzl +++ b/python/private/pypi/config_settings.bzl @@ -39,12 +39,7 @@ Note, that here the specialization of musl vs manylinux wheels is the same in order to ensure that the matching fails if the user requests for `musl` and we don't have it or vice versa. """ -load( - ":pip_flags.bzl", - "INTERNAL_FLAGS", - "UniversalWhlFlag", - "WhlLibcFlag", -) +load(":flags.bzl", "INTERNAL_FLAGS", "UniversalWhlFlag", "WhlLibcFlag") FLAGS = struct( **{ @@ -73,7 +68,7 @@ _flags = struct( } ) -def pip_config_settings( +def config_settings( *, python_versions = [], glibc_versions = [], diff --git a/python/private/pip_flags.bzl b/python/private/pypi/flags.bzl similarity index 98% rename from python/private/pip_flags.bzl rename to python/private/pypi/flags.bzl index 1d271c7318..d834be8cc6 100644 --- a/python/private/pip_flags.bzl +++ b/python/private/pypi/flags.bzl @@ -18,7 +18,7 @@ NOTE: The transitive loads of this should be kept minimal. This avoids loading unnecessary files when all that are needed are flag definitions. """ -load(":enum.bzl", "enum") +load("//python/private:enum.bzl", "enum") # Determines if we should use whls for third party # diff --git a/python/pip_install/private/generate_group_library_build_bazel.bzl b/python/private/pypi/generate_group_library_build_bazel.bzl similarity index 99% rename from python/pip_install/private/generate_group_library_build_bazel.bzl rename to python/private/pypi/generate_group_library_build_bazel.bzl index 5fa93e22b7..54da066b42 100644 --- a/python/pip_install/private/generate_group_library_build_bazel.bzl +++ b/python/private/pypi/generate_group_library_build_bazel.bzl @@ -14,15 +14,15 @@ """Generate the BUILD.bazel contents for a repo defined by a group_library.""" +load("//python/private:normalize_name.bzl", "normalize_name") +load("//python/private:text_util.bzl", "render") load( - "//python/private:labels.bzl", + ":labels.bzl", "PY_LIBRARY_IMPL_LABEL", "PY_LIBRARY_PUBLIC_LABEL", "WHEEL_FILE_IMPL_LABEL", "WHEEL_FILE_PUBLIC_LABEL", ) -load("//python/private:normalize_name.bzl", "normalize_name") -load("//python/private:text_util.bzl", "render") _PRELUDE = """\ load("@rules_python//python:defs.bzl", "py_library") diff --git a/python/pip_install/private/generate_whl_library_build_bazel.bzl b/python/private/pypi/generate_whl_library_build_bazel.bzl similarity index 99% rename from python/pip_install/private/generate_whl_library_build_bazel.bzl rename to python/private/pypi/generate_whl_library_build_bazel.bzl index f3ddd3bcab..d25f73a049 100644 --- a/python/pip_install/private/generate_whl_library_build_bazel.bzl +++ b/python/private/pypi/generate_whl_library_build_bazel.bzl @@ -14,8 +14,10 @@ """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( - "//python/private:labels.bzl", + ":labels.bzl", "DATA_LABEL", "DIST_INFO_LABEL", "PY_LIBRARY_IMPL_LABEL", @@ -24,8 +26,6 @@ load( "WHEEL_FILE_IMPL_LABEL", "WHEEL_FILE_PUBLIC_LABEL", ) -load("//python/private:normalize_name.bzl", "normalize_name") -load("//python/private:text_util.bzl", "render") _COPY_FILE_TEMPLATE = """\ copy_file( diff --git a/python/private/pypi/group_library.bzl b/python/private/pypi/group_library.bzl new file mode 100644 index 0000000000..ff800e2f18 --- /dev/null +++ b/python/private/pypi/group_library.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. + +"""group_library implementation for WORKSPACE setups.""" + +load(":generate_group_library_build_bazel.bzl", "generate_group_library_build_bazel") + +def _group_library_impl(rctx): + build_file_contents = generate_group_library_build_bazel( + repo_prefix = rctx.attr.repo_prefix, + groups = rctx.attr.groups, + ) + rctx.file("BUILD.bazel", build_file_contents) + +group_library = repository_rule( + attrs = { + "groups": attr.string_list_dict( + doc = "A mapping of group names to requirements within that group.", + ), + "repo_prefix": attr.string( + doc = "Prefix used for the whl_library created components of each group", + ), + }, + implementation = _group_library_impl, + doc = """ +Create a package containing only wrapper py_library and whl_library rules for implementing dependency groups. +This is an implementation detail of dependency groups and should not be used alone. + """, +) diff --git a/python/private/bzlmod/pip_repository.bzl b/python/private/pypi/hub_repository.bzl similarity index 79% rename from python/private/bzlmod/pip_repository.bzl rename to python/private/pypi/hub_repository.bzl index d42eb8b056..5e209d6f9f 100644 --- a/python/private/bzlmod/pip_repository.bzl +++ b/python/private/pypi/hub_repository.bzl @@ -14,12 +14,12 @@ "" +load("//python/private:text_util.bzl", "render") load( - "//python/private:render_pkg_aliases.bzl", + ":render_pkg_aliases.bzl", "render_multiplatform_pkg_aliases", "whl_alias", ) -load("//python/private:text_util.bzl", "render") _BUILD_FILE_CONTENTS = """\ package(default_visibility = ["//visibility:public"]) @@ -28,7 +28,7 @@ package(default_visibility = ["//visibility:public"]) exports_files(["requirements.bzl"]) """ -def _pip_repository_impl(rctx): +def _impl(rctx): bzl_packages = rctx.attr.whl_map.keys() aliases = render_multiplatform_pkg_aliases( aliases = { @@ -66,35 +66,33 @@ def _pip_repository_impl(rctx): "%%NAME%%": rctx.attr.repo_name, }) -pip_repository_attrs = { - "default_version": attr.string( - mandatory = True, - doc = """\ +hub_repository = repository_rule( + attrs = { + "default_version": attr.string( + mandatory = True, + doc = """\ This is the default python version in the format of X.Y. This should match what is setup by the 'python' extension using the 'is_default = True' setting.""", - ), - "groups": attr.string_list_dict( - mandatory = False, - ), - "repo_name": attr.string( - mandatory = True, - doc = "The apparent name of the repo. This is needed because in bzlmod, the name attribute becomes the canonical name.", - ), - "whl_map": attr.string_dict( - mandatory = True, - doc = """\ + ), + "groups": attr.string_list_dict( + mandatory = False, + ), + "repo_name": attr.string( + mandatory = True, + doc = "The apparent name of the repo. This is needed because in bzlmod, the name attribute becomes the canonical name.", + ), + "whl_map": attr.string_dict( + mandatory = True, + doc = """\ The wheel map where values are json.encoded strings of the whl_map constructed in the pip.parse tag class. """, - ), - "_template": attr.label( - default = ":requirements.bzl.tmpl", - ), -} - -pip_repository = repository_rule( - attrs = pip_repository_attrs, + ), + "_template": attr.label( + default = ":requirements.bzl.tmpl.bzlmod", + ), + }, doc = """A rule for bzlmod mulitple pip repository creation. PRIVATE USE ONLY.""", - implementation = _pip_repository_impl, + implementation = _impl, ) diff --git a/python/private/pypi_index_sources.bzl b/python/private/pypi/index_sources.bzl similarity index 98% rename from python/private/pypi_index_sources.bzl rename to python/private/pypi/index_sources.bzl index 470a8c9f5a..21660141db 100644 --- a/python/private/pypi_index_sources.bzl +++ b/python/private/pypi/index_sources.bzl @@ -16,7 +16,7 @@ A file that houses private functions used in the `bzlmod` extension with the same name. """ -def get_simpleapi_sources(line): +def index_sources(line): """Get PyPI sources from a requirements.txt line. We interpret the spec described in diff --git a/python/private/labels.bzl b/python/private/pypi/labels.bzl similarity index 100% rename from python/private/labels.bzl rename to python/private/pypi/labels.bzl diff --git a/python/private/pypi/package_annotation.bzl b/python/private/pypi/package_annotation.bzl new file mode 100644 index 0000000000..4a54703ac4 --- /dev/null +++ b/python/private/pypi/package_annotation.bzl @@ -0,0 +1,49 @@ +# 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. + +"""Package annotation API for WORKSPACE setups.""" + +def package_annotation( + additive_build_content = None, + copy_files = {}, + copy_executables = {}, + data = [], + data_exclude_glob = [], + srcs_exclude_glob = []): + """Annotations to apply to the BUILD file content from package generated from a `pip_repository` rule. + + [cf]: https://github.com/bazelbuild/bazel-skylib/blob/main/docs/copy_file_doc.md + + Args: + additive_build_content (str, optional): Raw text to add to the generated `BUILD` file of a package. + copy_files (dict, optional): A mapping of `src` and `out` files for [@bazel_skylib//rules:copy_file.bzl][cf] + copy_executables (dict, optional): A mapping of `src` and `out` files for + [@bazel_skylib//rules:copy_file.bzl][cf]. Targets generated here will also be flagged as + executable. + data (list, optional): A list of labels to add as `data` dependencies to the generated `py_library` target. + data_exclude_glob (list, optional): A list of exclude glob patterns to add as `data` to the generated + `py_library` target. + srcs_exclude_glob (list, optional): A list of labels to add as `srcs` to the generated `py_library` target. + + Returns: + str: A json encoded string of the provided content. + """ + return json.encode(struct( + additive_build_content = additive_build_content, + copy_files = copy_files, + copy_executables = copy_executables, + data = data, + data_exclude_glob = data_exclude_glob, + srcs_exclude_glob = srcs_exclude_glob, + )) diff --git a/python/private/parse_requirements.bzl b/python/private/pypi/parse_requirements.bzl similarity index 98% rename from python/private/parse_requirements.bzl rename to python/private/pypi/parse_requirements.bzl index 21e132b4f8..22a6f0a875 100644 --- a/python/private/parse_requirements.bzl +++ b/python/private/pypi/parse_requirements.bzl @@ -26,9 +26,9 @@ file for the host platform to be backwards compatible with the legacy behavior. """ -load("//python/pip_install:requirements_parser.bzl", "parse") -load(":normalize_name.bzl", "normalize_name") -load(":pypi_index_sources.bzl", "get_simpleapi_sources") +load("//python/private:normalize_name.bzl", "normalize_name") +load(":index_sources.bzl", "index_sources") +load(":parse_requirements_txt.bzl", "parse_requirements_txt") load(":whl_target_platforms.bzl", "select_whls", "whl_target_platforms") # This includes the vendored _translate_cpu and _translate_os from @@ -271,7 +271,7 @@ def parse_requirements( # Parse the requirements file directly in starlark to get the information # needed for the whl_library declarations later. - parse_result = parse(contents) + parse_result = parse_requirements_txt(contents) # Replicate a surprising behavior that WORKSPACE builds allowed: # Defining a repo with the same name multiple times, but only the last @@ -317,7 +317,7 @@ def parse_requirements( (requirement_line, ",".join(extra_pip_args)), struct( distribution = distribution, - srcs = get_simpleapi_sources(requirement_line), + srcs = index_sources(requirement_line), requirement_line = requirement_line, target_platforms = [], extra_pip_args = extra_pip_args, diff --git a/python/private/pypi/parse_requirements_txt.bzl b/python/private/pypi/parse_requirements_txt.bzl new file mode 100644 index 0000000000..6f51d034da --- /dev/null +++ b/python/private/pypi/parse_requirements_txt.bzl @@ -0,0 +1,133 @@ +# 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. + +"""Pip requirements parser for Starlark.""" + +_STATE = struct( + # Consume extraneous whitespace + ConsumeSpace = 0, + # Consume a comment + ConsumeComment = 1, + # Parse the name of a pip package + ParseDependency = 2, + # Parse a full requirement line + ParseRequirement = 3, + # Parse a pip option + ParseOption = 4, +) + +EOF = {} + +def parse_requirements_txt(content): + """A simplistic (and incomplete) pip requirements lockfile parser. + + Parses package names and their full requirement lines, as well pip + options. + + Args: + content: lockfile content as a string + + Returns: + Struct with fields `requirements` and `options`. + + requirements: List of requirements, where each requirement is a 2-element + tuple containing the package name and the requirement line. + E.g., [(certifi', 'certifi==2021.10.8 --hash=sha256:7888...'), ...] + + options: List of pip option lines + """ + content = content.replace("\r", "") + + result = struct( + requirements = [], + options = [], + ) + state = _STATE.ConsumeSpace + buffer = "" + + inputs = content.elems()[:] + inputs.append(EOF) + + for input in inputs: + if state == _STATE.ConsumeSpace: + (state, buffer) = _handleConsumeSpace(input) + elif state == _STATE.ConsumeComment: + (state, buffer) = _handleConsumeComment(input, buffer, result) + elif state == _STATE.ParseDependency: + (state, buffer) = _handleParseDependency(input, buffer, result) + elif state == _STATE.ParseOption: + (state, buffer) = _handleParseOption(input, buffer, result) + elif state == _STATE.ParseRequirement: + (state, buffer) = _handleParseRequirement(input, buffer, result) + else: + fail("Unknown state %d" % state) + + return result + +def _handleConsumeSpace(input): + if input == EOF: + return (_STATE.ConsumeSpace, "") + if input.isspace(): + return (_STATE.ConsumeSpace, "") + elif input == "#": + return (_STATE.ConsumeComment, "") + elif input == "-": + return (_STATE.ParseOption, input) + + return (_STATE.ParseDependency, input) + +def _handleConsumeComment(input, buffer, result): + if input == "\n": + if len(result.requirements) > 0 and len(result.requirements[-1]) == 1: + result.requirements[-1] = (result.requirements[-1][0], buffer.rstrip(" \n")) + return (_STATE.ConsumeSpace, "") + elif len(buffer) > 0: + result.options.append(buffer.rstrip(" \n")) + return (_STATE.ConsumeSpace, "") + return (_STATE.ConsumeSpace, "") + return (_STATE.ConsumeComment, buffer) + +def _handleParseDependency(input, buffer, result): + if input == EOF: + fail("Enountered unexpected end of file while parsing requirement") + elif input.isspace() or input in [">", "<", "~", "=", ";", "["]: + result.requirements.append((buffer,)) + return (_STATE.ParseRequirement, buffer + input) + + return (_STATE.ParseDependency, buffer + input) + +def _handleParseOption(input, buffer, result): + if input == "\n" and buffer.endswith("\\"): + return (_STATE.ParseOption, buffer[0:-1]) + elif input == " ": + result.options.append(buffer.rstrip("\n")) + return (_STATE.ParseOption, "") + elif input == "\n" or input == EOF: + result.options.append(buffer.rstrip("\n")) + return (_STATE.ConsumeSpace, "") + elif input == "#" and (len(buffer) == 0 or buffer[-1].isspace()): + return (_STATE.ConsumeComment, buffer) + + return (_STATE.ParseOption, buffer + input) + +def _handleParseRequirement(input, buffer, result): + if input == "\n" and buffer.endswith("\\"): + return (_STATE.ParseRequirement, buffer[0:-1]) + elif input == "\n" or input == EOF: + result.requirements[-1] = (result.requirements[-1][0], buffer.rstrip(" \n")) + return (_STATE.ConsumeSpace, "") + elif input == "#" and (len(buffer) == 0 or buffer[-1].isspace()): + return (_STATE.ConsumeComment, buffer) + + return (_STATE.ParseRequirement, buffer + input) diff --git a/python/private/pypi/parse_simpleapi_html.bzl b/python/private/pypi/parse_simpleapi_html.bzl new file mode 100644 index 0000000000..f7cd032aca --- /dev/null +++ b/python/private/pypi/parse_simpleapi_html.bzl @@ -0,0 +1,106 @@ +# 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. + +""" +Parse SimpleAPI HTML in Starlark. +""" + +def parse_simpleapi_html(*, url, content): + """Get the package URLs for given shas by parsing the Simple API HTML. + + Args: + url(str): The URL that the HTML content can be downloaded from. + content(str): The Simple API HTML content. + + Returns: + A list of structs with: + * filename: The filename of the artifact. + * url: The URL to download the artifact. + * sha256: The sha256 of the artifact. + * metadata_sha256: The whl METADATA sha256 if we can download it. If this is + present, then the 'metadata_url' is also present. Defaults to "". + * metadata_url: The URL for the METADATA if we can download it. Defaults to "". + """ + sdists = {} + whls = {} + lines = content.split("= (2, 0): + # We don't expect to have version 2.0 here, but have this check in place just in case. + # https://packaging.python.org/en/latest/specifications/simple-repository-api/#versioning-pypi-s-simple-api + fail("Unsupported API version: {}".format(api_version)) + + for line in lines[1:]: + dist_url, _, tail = line.partition("#sha256=") + sha256, _, tail = tail.partition("\"") + + # See https://packaging.python.org/en/latest/specifications/simple-repository-api/#adding-yank-support-to-the-simple-api + yanked = "data-yanked" in line + + maybe_metadata, _, tail = tail.partition(">") + filename, _, tail = tail.partition("<") + + metadata_sha256 = "" + metadata_url = "" + for metadata_marker in ["data-core-metadata", "data-dist-info-metadata"]: + metadata_marker = metadata_marker + "=\"sha256=" + if metadata_marker in maybe_metadata: + # Implement https://peps.python.org/pep-0714/ + _, _, tail = maybe_metadata.partition(metadata_marker) + metadata_sha256, _, _ = tail.partition("\"") + metadata_url = dist_url + ".metadata" + break + + if filename.endswith(".whl"): + whls[sha256] = struct( + filename = filename, + url = _absolute_url(url, dist_url), + sha256 = sha256, + metadata_sha256 = metadata_sha256, + metadata_url = _absolute_url(url, metadata_url), + yanked = yanked, + ) + else: + sdists[sha256] = struct( + filename = filename, + url = _absolute_url(url, dist_url), + sha256 = sha256, + metadata_sha256 = "", + metadata_url = "", + yanked = yanked, + ) + + return struct( + sdists = sdists, + whls = whls, + ) + +def _absolute_url(index_url, candidate): + if not candidate.startswith(".."): + return candidate + + candidate_parts = candidate.split("..") + last = candidate_parts[-1] + for _ in range(len(candidate_parts) - 1): + index_url, _, _ = index_url.rstrip("/").rpartition("/") + + return "{}/{}".format(index_url, last.strip("/")) diff --git a/python/private/parse_whl_name.bzl b/python/private/pypi/parse_whl_name.bzl similarity index 100% rename from python/private/parse_whl_name.bzl rename to python/private/pypi/parse_whl_name.bzl diff --git a/python/private/patch_whl.bzl b/python/private/pypi/patch_whl.bzl similarity index 87% rename from python/private/patch_whl.bzl rename to python/private/pypi/patch_whl.bzl index 9e3119f744..c2c633da7f 100644 --- a/python/private/patch_whl.bzl +++ b/python/private/pypi/patch_whl.bzl @@ -27,7 +27,8 @@ other patches ensures that the users have overview on exactly what has changed within the wheel. """ -load("//python/private:parse_whl_name.bzl", "parse_whl_name") +load("//python/private:repo_utils.bzl", "repo_utils") +load(":parse_whl_name.bzl", "parse_whl_name") _rules_python_root = Label("//:BUILD.bazel") @@ -40,7 +41,7 @@ def patch_whl(rctx, *, python_interpreter, whl_path, patches, **kwargs): whl_path: The whl file name to be patched. patches: a label-keyed-int dict that has the patch files as keys and the patch_strip as the value. - **kwargs: extras passed to rctx.execute. + **kwargs: extras passed to repo_utils.execute_checked. Returns: value of the repackaging action. @@ -75,11 +76,12 @@ def patch_whl(rctx, *, python_interpreter, whl_path, patches, **kwargs): record_patch = rctx.path("RECORD.patch") - result = rctx.execute( - [ + repo_utils.execute_checked( + rctx, + arguments = [ python_interpreter, "-m", - "python.private.repack_whl", + "python.private.pypi.repack_whl", "--record-patch", record_patch, whl_input, @@ -91,16 +93,6 @@ def patch_whl(rctx, *, python_interpreter, whl_path, patches, **kwargs): **kwargs ) - if result.return_code: - fail( - "repackaging .whl {whl} failed: with exit code '{return_code}':\n{stdout}\n\nstderr:\n{stderr}".format( - whl = whl_input.basename, - stdout = result.stdout, - stderr = result.stderr, - return_code = result.return_code, - ), - ) - if record_patch.exists: record_patch_contents = rctx.read(record_patch) warning_msg = """WARNING: the resultant RECORD file of the patch wheel is different diff --git a/python/private/pypi/pip_repository.bzl b/python/private/pypi/pip_repository.bzl new file mode 100644 index 0000000000..a22f4d9d2c --- /dev/null +++ b/python/private/pypi/pip_repository.bzl @@ -0,0 +1,327 @@ +# 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. + +"" + +load("@bazel_skylib//lib:sets.bzl", "sets") +load("//python/private:normalize_name.bzl", "normalize_name") +load("//python/private:repo_utils.bzl", "REPO_DEBUG_ENV_VAR") +load("//python/private:text_util.bzl", "render") +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") + +def _get_python_interpreter_attr(rctx): + """A helper function for getting the `python_interpreter` attribute or it's default + + Args: + rctx (repository_ctx): Handle to the rule repository context. + + Returns: + str: The attribute value or it's default + """ + if rctx.attr.python_interpreter: + return rctx.attr.python_interpreter + + if "win" in rctx.os.name: + return "python.exe" + else: + return "python3" + +def use_isolated(ctx, attr): + """Determine whether or not to pass the pip `--isolated` flag to the pip invocation. + + Args: + ctx: repository or module context + attr: attributes for the repo rule or tag extension + + Returns: + True if --isolated should be passed + """ + use_isolated = attr.isolated + + # The environment variable will take precedence over the attribute + isolated_env = ctx.os.environ.get("RULES_PYTHON_PIP_ISOLATED", None) + if isolated_env != None: + if isolated_env.lower() in ("0", "false"): + use_isolated = False + else: + use_isolated = True + + return use_isolated + +_BUILD_FILE_CONTENTS = """\ +package(default_visibility = ["//visibility:public"]) + +# Ensure the `requirements.bzl` source can be accessed by stardoc, since users load() from it +exports_files(["requirements.bzl"]) +""" + +def _pip_repository_impl(rctx): + requirements_by_platform = parse_requirements( + rctx, + requirements_by_platform = rctx.attr.requirements_by_platform, + requirements_linux = rctx.attr.requirements_linux, + requirements_lock = rctx.attr.requirements_lock, + requirements_osx = rctx.attr.requirements_darwin, + requirements_windows = rctx.attr.requirements_windows, + extra_pip_args = rctx.attr.extra_pip_args, + ) + selected_requirements = {} + options = None + repository_platform = host_platform(rctx.os) + for name, requirements in requirements_by_platform.items(): + r = select_requirement( + requirements, + platform = repository_platform, + ) + if not r: + continue + options = options or r.extra_pip_args + selected_requirements[name] = r.requirement_line + + bzl_packages = sorted(selected_requirements.keys()) + + # Normalize cycles first + requirement_cycles = { + name: sorted(sets.to_list(sets.make(deps))) + for name, deps in rctx.attr.experimental_requirement_cycles.items() + } + + # Check for conflicts between cycles _before_ we normalize package names so + # that reported errors use the names the user specified + for i in range(len(requirement_cycles)): + left_group = requirement_cycles.keys()[i] + left_deps = requirement_cycles.values()[i] + for j in range(len(requirement_cycles) - (i + 1)): + right_deps = requirement_cycles.values()[1 + i + j] + right_group = requirement_cycles.keys()[1 + i + j] + for d in left_deps: + if d in right_deps: + fail("Error: Requirement %s cannot be repeated between cycles %s and %s; please merge the cycles." % (d, left_group, right_group)) + + # And normalize the names as used in the cycle specs + # + # NOTE: We must check that a listed dependency is actually in the actual + # requirements set for the current platform so that we can support cycles in + # platform-conditional requirements. Otherwise we'll blindly generate a + # label referencing a package which may not be installed on the current + # platform. + requirement_cycles = { + normalize_name(name): sorted([normalize_name(d) for d in group if normalize_name(d) in bzl_packages]) + for name, group in requirement_cycles.items() + } + + imports = [ + # NOTE: Maintain the order consistent with `buildifier` + 'load("@rules_python//python:pip.bzl", "pip_utils")', + 'load("@rules_python//python/pip_install:pip_repository.bzl", "group_library", "whl_library")', + ] + + annotations = {} + for pkg, annotation in rctx.attr.annotations.items(): + filename = "{}.annotation.json".format(normalize_name(pkg)) + rctx.file(filename, json.encode_indent(json.decode(annotation))) + annotations[pkg] = "@{name}//:{filename}".format(name = rctx.attr.name, filename = filename) + + config = { + "download_only": rctx.attr.download_only, + "enable_implicit_namespace_pkgs": rctx.attr.enable_implicit_namespace_pkgs, + "environment": rctx.attr.environment, + "envsubst": rctx.attr.envsubst, + "extra_pip_args": options, + "isolated": use_isolated(rctx, rctx.attr), + "pip_data_exclude": rctx.attr.pip_data_exclude, + "python_interpreter": _get_python_interpreter_attr(rctx), + "quiet": rctx.attr.quiet, + "repo": rctx.attr.name, + "timeout": rctx.attr.timeout, + } + if rctx.attr.use_hub_alias_dependencies: + config["dep_template"] = "@{}//{{name}}:{{target}}".format(rctx.attr.name) + else: + config["repo_prefix"] = "{}_".format(rctx.attr.name) + + if rctx.attr.python_interpreter_target: + config["python_interpreter_target"] = str(rctx.attr.python_interpreter_target) + if rctx.attr.experimental_target_platforms: + config["experimental_target_platforms"] = rctx.attr.experimental_target_platforms + + macro_tmpl = "@%s//{}:{}" % rctx.attr.name + + aliases = render_pkg_aliases( + aliases = { + pkg: [whl_alias(repo = rctx.attr.name + "_" + pkg)] + for pkg in bzl_packages or [] + }, + ) + for path, contents in aliases.items(): + rctx.file(path, contents) + + rctx.file("BUILD.bazel", _BUILD_FILE_CONTENTS) + rctx.template("requirements.bzl", rctx.attr._template, substitutions = { + " # %%GROUP_LIBRARY%%": """\ + group_repo = "{name}__groups" + group_library( + name = group_repo, + repo_prefix = "{name}_", + groups = all_requirement_groups, + )""".format(name = rctx.attr.name) if not rctx.attr.use_hub_alias_dependencies else "", + "%%ALL_DATA_REQUIREMENTS%%": render.list([ + macro_tmpl.format(p, "data") + for p in bzl_packages + ]), + "%%ALL_REQUIREMENTS%%": render.list([ + macro_tmpl.format(p, "pkg") + for p in bzl_packages + ]), + "%%ALL_REQUIREMENT_GROUPS%%": render.dict(requirement_cycles), + "%%ALL_WHL_REQUIREMENTS_BY_PACKAGE%%": render.dict({ + p: macro_tmpl.format(p, "whl") + for p in bzl_packages + }), + "%%ANNOTATIONS%%": render.dict(dict(sorted(annotations.items()))), + "%%CONFIG%%": render.dict(dict(sorted(config.items()))), + "%%EXTRA_PIP_ARGS%%": json.encode(options), + "%%IMPORTS%%": "\n".join(imports), + "%%MACRO_TMPL%%": macro_tmpl, + "%%NAME%%": rctx.attr.name, + "%%PACKAGES%%": render.list( + [ + ("{}_{}".format(rctx.attr.name, p), r) + for p, r in sorted(selected_requirements.items()) + ], + ), + }) + + return + +pip_repository = repository_rule( + attrs = dict( + annotations = attr.string_dict( + doc = "Optional annotations to apply to packages", + ), + _template = attr.label( + default = ":requirements.bzl.tmpl.workspace", + ), + **ATTRS + ), + doc = """Accepts a locked/compiled requirements file and installs the dependencies listed within. + +Those dependencies become available in a generated `requirements.bzl` file. +You can instead check this `requirements.bzl` file into your repo, see the "vendoring" section below. + +In your WORKSPACE file: + +```starlark +load("@rules_python//python:pip.bzl", "pip_parse") + +pip_parse( + name = "pypi", + requirements_lock = ":requirements.txt", +) + +load("@pypi//:requirements.bzl", "install_deps") + +install_deps() +``` + +You can then reference installed dependencies from a `BUILD` file with the alias targets generated in the same repo, for example, for `PyYAML` we would have the following: +- `@pypi//pyyaml` and `@pypi//pyyaml:pkg` both point to the `py_library` + created after extracting the `PyYAML` package. +- `@pypi//pyyaml:data` points to the extra data included in the package. +- `@pypi//pyyaml:dist_info` points to the `dist-info` files in the package. +- `@pypi//pyyaml:whl` points to the wheel file that was extracted. + +```starlark +py_library( + name = "bar", + ... + deps = [ + "//my/other:dep", + "@pypi//numpy", + "@pypi//requests", + ], +) +``` + +or + +```starlark +load("@pypi//:requirements.bzl", "requirement") + +py_library( + name = "bar", + ... + deps = [ + "//my/other:dep", + requirement("numpy"), + requirement("requests"), + ], +) +``` + +In addition to the `requirement` macro, which is used to access the generated `py_library` +target generated from a package's wheel, The generated `requirements.bzl` file contains +functionality for exposing [entry points][whl_ep] as `py_binary` targets as well. + +[whl_ep]: https://packaging.python.org/specifications/entry-points/ + +```starlark +load("@pypi//:requirements.bzl", "entry_point") + +alias( + name = "pip-compile", + actual = entry_point( + pkg = "pip-tools", + script = "pip-compile", + ), +) +``` + +Note that for packages whose name and script are the same, only the name of the package +is needed when calling the `entry_point` macro. + +```starlark +load("@pip//:requirements.bzl", "entry_point") + +alias( + name = "flake8", + actual = entry_point("flake8"), +) +``` + +### Vendoring the requirements.bzl file + +In some cases you may not want to generate the requirements.bzl file as a repository rule +while Bazel is fetching dependencies. For example, if you produce a reusable Bazel module +such as a ruleset, you may want to include the requirements.bzl file rather than make your users +install the WORKSPACE setup to generate it. +See https://github.com/bazelbuild/rules_python/issues/608 + +This is the same workflow as Gazelle, which creates `go_repository` rules with +[`update-repos`](https://github.com/bazelbuild/bazel-gazelle#update-repos) + +To do this, use the "write to source file" pattern documented in +https://blog.aspect.dev/bazel-can-write-to-the-source-folder +to put a copy of the generated requirements.bzl into your project. +Then load the requirements.bzl file directly rather than from the generated repository. +See the example in rules_python/examples/pip_parse_vendored. +""", + implementation = _pip_repository_impl, + environ = [ + "RULES_PYTHON_PIP_ISOLATED", + REPO_DEBUG_ENV_VAR, + ], +) diff --git a/python/private/pypi/pip_repository_attrs.bzl b/python/private/pypi/pip_repository_attrs.bzl new file mode 100644 index 0000000000..23000869e9 --- /dev/null +++ b/python/private/pypi/pip_repository_attrs.bzl @@ -0,0 +1,73 @@ +# 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. + +"""Common attributes between bzlmod pip.parse and workspace pip_parse. + +A common attributes shared between bzlmod and workspace implementations +stored in a separate file to avoid unnecessary refetching of the +repositories.""" + +load(":attrs.bzl", COMMON_ATTRS = "ATTRS") + +ATTRS = { + "requirements_by_platform": attr.label_keyed_string_dict( + doc = """\ +The requirements files and the comma delimited list of target platforms as values. + +The keys are the requirement files and the values are comma-separated platform +identifiers. For now we only support `_` values that are present in +`@platforms//os` and `@platforms//cpu` packages respectively. +""", + ), + "requirements_darwin": attr.label( + allow_single_file = True, + doc = "Override the requirements_lock attribute when the host platform is Mac OS", + ), + "requirements_linux": attr.label( + allow_single_file = True, + doc = "Override the requirements_lock attribute when the host platform is Linux", + ), + "requirements_lock": attr.label( + allow_single_file = True, + doc = """\ +A fully resolved 'requirements.txt' pip requirement file containing the +transitive set of your dependencies. If this file is passed instead of +'requirements' no resolve will take place and pip_repository will create +individual repositories for each of your dependencies so that wheels are +fetched/built only for the targets specified by 'build/run/test'. Note that if +your lockfile is platform-dependent, you can use the `requirements_[platform]` +attributes. + +Note, that in general requirements files are compiled for a specific platform, +but sometimes they can work for multiple platforms. `rules_python` right now +supports requirements files that are created for a particular platform without +platform markers. +""", + ), + "requirements_windows": attr.label( + allow_single_file = True, + doc = "Override the requirements_lock attribute when the host platform is Windows", + ), + "use_hub_alias_dependencies": attr.bool( + default = False, + doc = """\ +Controls if the hub alias dependencies are used. If set to true, then the +group_library will be included in the hub repo. + +True will become default in a subsequent release. +""", + ), +} + +ATTRS.update(**COMMON_ATTRS) diff --git a/python/private/render_pkg_aliases.bzl b/python/private/pypi/render_pkg_aliases.bzl similarity index 97% rename from python/private/render_pkg_aliases.bzl rename to python/private/pypi/render_pkg_aliases.bzl index 82ac764f00..eb907fee0f 100644 --- a/python/private/render_pkg_aliases.bzl +++ b/python/private/pypi/render_pkg_aliases.bzl @@ -16,8 +16,10 @@ This is used in bzlmod and non-bzlmod setups.""" +load("//python/private:normalize_name.bzl", "normalize_name") +load("//python/private:text_util.bzl", "render") load( - "//python/pip_install/private:generate_group_library_build_bazel.bzl", + ":generate_group_library_build_bazel.bzl", "generate_group_library_build_bazel", ) # buildifier: disable=bzl-visibility load( @@ -29,9 +31,7 @@ load( "WHEEL_FILE_IMPL_LABEL", "WHEEL_FILE_PUBLIC_LABEL", ) -load(":normalize_name.bzl", "normalize_name") load(":parse_whl_name.bzl", "parse_whl_name") -load(":text_util.bzl", "render") load(":whl_target_platforms.bzl", "whl_target_platforms") NO_MATCH_ERROR_MESSAGE_TEMPLATE = """\ @@ -309,7 +309,7 @@ def render_multiplatform_pkg_aliases(*, aliases, default_version = None, **kwarg aliases = config_setting_aliases, **kwargs ) - contents["_config/BUILD.bazel"] = _render_pip_config_settings(**flag_versions) + contents["_config/BUILD.bazel"] = _render_config_settings(**flag_versions) return contents def multiplatform_whl_aliases(*, aliases, default_version = None, **kwargs): @@ -398,12 +398,12 @@ def multiplatform_whl_aliases(*, aliases, default_version = None, **kwargs): ret.extend(versioned.values()) return ret -def _render_pip_config_settings(python_versions = [], target_platforms = [], osx_versions = [], glibc_versions = [], muslc_versions = []): +def _render_config_settings(python_versions = [], target_platforms = [], osx_versions = [], glibc_versions = [], muslc_versions = []): return """\ -load("@rules_python//python/private:pip_config_settings.bzl", "pip_config_settings") +load("@rules_python//python/private/pypi:config_settings.bzl", "config_settings") -pip_config_settings( - name = "pip_config_settings", +config_settings( + name = "config_settings", glibc_versions = {glibc_versions}, muslc_versions = {muslc_versions}, osx_versions = {osx_versions}, diff --git a/python/private/repack_whl.py b/python/private/pypi/repack_whl.py similarity index 100% rename from python/private/repack_whl.py rename to python/private/pypi/repack_whl.py diff --git a/python/private/bzlmod/requirements.bzl.tmpl b/python/private/pypi/requirements.bzl.tmpl.bzlmod similarity index 100% rename from python/private/bzlmod/requirements.bzl.tmpl rename to python/private/pypi/requirements.bzl.tmpl.bzlmod diff --git a/python/private/pypi/requirements.bzl.tmpl.workspace b/python/private/pypi/requirements.bzl.tmpl.workspace new file mode 100644 index 0000000000..2f4bcd6916 --- /dev/null +++ b/python/private/pypi/requirements.bzl.tmpl.workspace @@ -0,0 +1,72 @@ +"""Starlark representation of locked requirements. + +@generated by rules_python pip_parse repository rule. +""" + +%%IMPORTS%% + +all_requirements = %%ALL_REQUIREMENTS%% + +all_whl_requirements_by_package = %%ALL_WHL_REQUIREMENTS_BY_PACKAGE%% + +all_whl_requirements = all_whl_requirements_by_package.values() + +all_data_requirements = %%ALL_DATA_REQUIREMENTS%% + +_packages = %%PACKAGES%% +_config = %%CONFIG%% +_annotations = %%ANNOTATIONS%% + +def requirement(name): + return "%%MACRO_TMPL%%".format(pip_utils.normalize_name(name), "pkg") + +def whl_requirement(name): + return "%%MACRO_TMPL%%".format(pip_utils.normalize_name(name), "whl") + +def data_requirement(name): + return "%%MACRO_TMPL%%".format(pip_utils.normalize_name(name), "data") + +def dist_info_requirement(name): + return "%%MACRO_TMPL%%".format(pip_utils.normalize_name(name), "dist_info") + +def _get_annotation(requirement): + # This expects to parse `setuptools==58.2.0 --hash=sha256:2551203ae6955b9876741a26ab3e767bb3242dafe86a32a749ea0d78b6792f11` + # down to `setuptools`. + name = requirement.split(" ")[0].split("=")[0].split("[")[0] + return _annotations.get(name) + +def install_deps(**whl_library_kwargs): + """Repository rule macro. Install dependencies from `pip_parse`. + + Args: + **whl_library_kwargs: Additional arguments which will flow to underlying + `whl_library` calls. See pip_repository.bzl for details. + """ + + # Set up the requirement groups + all_requirement_groups = %%ALL_REQUIREMENT_GROUPS%% + + requirement_group_mapping = { + requirement: group_name + for group_name, group_requirements in all_requirement_groups.items() + for requirement in group_requirements + } + + # %%GROUP_LIBRARY%% + + # Install wheels which may be participants in a group + whl_config = dict(_config) + whl_config.update(whl_library_kwargs) + + for name, requirement in _packages: + group_name = requirement_group_mapping.get(name.replace("%%NAME%%_", "")) + group_deps = all_requirement_groups.get(group_name, []) + + whl_library( + name = name, + requirement = requirement, + group_name = group_name, + group_deps = group_deps, + annotation = _get_annotation(requirement), + **whl_config + ) diff --git a/python/private/pypi_index.bzl b/python/private/pypi/simpleapi_download.bzl similarity index 67% rename from python/private/pypi_index.bzl rename to python/private/pypi/simpleapi_download.bzl index 64d908e32b..b258fef07a 100644 --- a/python/private/pypi_index.bzl +++ b/python/private/pypi/simpleapi_download.bzl @@ -17,9 +17,10 @@ A file that houses private functions used in the `bzlmod` extension with the sam """ load("@bazel_features//:features.bzl", "bazel_features") -load(":auth.bzl", "get_auth") -load(":envsubst.bzl", "envsubst") -load(":normalize_name.bzl", "normalize_name") +load("//python/private:auth.bzl", "get_auth") +load("//python/private:envsubst.bzl", "envsubst") +load("//python/private:normalize_name.bzl", "normalize_name") +load(":parse_simpleapi_html.bzl", "parse_simpleapi_html") def simpleapi_download(ctx, *, attr, cache, parallel_download = True): """Download Simple API HTML. @@ -71,7 +72,7 @@ def simpleapi_download(ctx, *, attr, cache, parallel_download = True): success = False for index_url in index_urls: - result = read_simple_api( + result = _read_simpleapi( ctx = ctx, url = "{}/{}/".format( index_url_overrides.get(pkg_normalized, index_url).rstrip("/"), @@ -122,7 +123,7 @@ def simpleapi_download(ctx, *, attr, cache, parallel_download = True): return contents -def read_simple_api(ctx, url, attr, cache, **download_kwargs): +def _read_simpleapi(ctx, url, attr, cache, **download_kwargs): """Read SimpleAPI. Args: @@ -195,98 +196,9 @@ def _read_index_result(ctx, result, output, url, cache, cache_key): content = ctx.read(output) - output = parse_simple_api_html(url = url, content = content) + output = parse_simpleapi_html(url = url, content = content) if output: cache.setdefault(cache_key, output) return struct(success = True, output = output, cache_key = cache_key) else: return struct(success = False) - -def parse_simple_api_html(*, url, content): - """Get the package URLs for given shas by parsing the Simple API HTML. - - Args: - url(str): The URL that the HTML content can be downloaded from. - content(str): The Simple API HTML content. - - Returns: - A list of structs with: - * filename: The filename of the artifact. - * url: The URL to download the artifact. - * sha256: The sha256 of the artifact. - * metadata_sha256: The whl METADATA sha256 if we can download it. If this is - present, then the 'metadata_url' is also present. Defaults to "". - * metadata_url: The URL for the METADATA if we can download it. Defaults to "". - """ - sdists = {} - whls = {} - lines = content.split("= (2, 0): - # We don't expect to have version 2.0 here, but have this check in place just in case. - # https://packaging.python.org/en/latest/specifications/simple-repository-api/#versioning-pypi-s-simple-api - fail("Unsupported API version: {}".format(api_version)) - - for line in lines[1:]: - dist_url, _, tail = line.partition("#sha256=") - sha256, _, tail = tail.partition("\"") - - # See https://packaging.python.org/en/latest/specifications/simple-repository-api/#adding-yank-support-to-the-simple-api - yanked = "data-yanked" in line - - maybe_metadata, _, tail = tail.partition(">") - filename, _, tail = tail.partition("<") - - metadata_sha256 = "" - metadata_url = "" - for metadata_marker in ["data-core-metadata", "data-dist-info-metadata"]: - metadata_marker = metadata_marker + "=\"sha256=" - if metadata_marker in maybe_metadata: - # Implement https://peps.python.org/pep-0714/ - _, _, tail = maybe_metadata.partition(metadata_marker) - metadata_sha256, _, _ = tail.partition("\"") - metadata_url = dist_url + ".metadata" - break - - if filename.endswith(".whl"): - whls[sha256] = struct( - filename = filename, - url = _absolute_url(url, dist_url), - sha256 = sha256, - metadata_sha256 = metadata_sha256, - metadata_url = _absolute_url(url, metadata_url), - yanked = yanked, - ) - else: - sdists[sha256] = struct( - filename = filename, - url = _absolute_url(url, dist_url), - sha256 = sha256, - metadata_sha256 = "", - metadata_url = "", - yanked = yanked, - ) - - return struct( - sdists = sdists, - whls = whls, - ) - -def _absolute_url(index_url, candidate): - if not candidate.startswith(".."): - return candidate - - candidate_parts = candidate.split("..") - last = candidate_parts[-1] - for _ in range(len(candidate_parts) - 1): - index_url, _, _ = index_url.rstrip("/").rpartition("/") - - return "{}/{}".format(index_url, last.strip("/")) diff --git a/python/private/pypi/whl_library.bzl b/python/private/pypi/whl_library.bzl new file mode 100644 index 0000000000..cae0db3e2b --- /dev/null +++ b/python/private/pypi/whl_library.bzl @@ -0,0 +1,509 @@ +# 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. + +"" + +load("//python:repositories.bzl", "is_standalone_interpreter") +load("//python:versions.bzl", "WINDOWS_NAME") +load("//python/pip_install:repositories.bzl", "all_requirements") +load("//python/private:auth.bzl", "AUTH_ATTRS", "get_auth") +load("//python/private:envsubst.bzl", "envsubst") +load("//python/private:repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") +load("//python/private:toolchains_repo.bzl", "get_host_os_arch") +load(":attrs.bzl", "ATTRS", "use_isolated") +load(":generate_whl_library_build_bazel.bzl", "generate_whl_library_build_bazel") +load(":parse_whl_name.bzl", "parse_whl_name") +load(":patch_whl.bzl", "patch_whl") +load(":whl_target_platforms.bzl", "whl_target_platforms") + +_CPPFLAGS = "CPPFLAGS" +_COMMAND_LINE_TOOLS_PATH_SLUG = "commandlinetools" +_WHEEL_ENTRY_POINT_PREFIX = "rules_python_wheel_entry_point" + +def _construct_pypath(rctx): + """Helper function to construct a PYTHONPATH. + + Contains entries for code in this repo as well as packages downloaded from //python/pip_install:repositories.bzl. + This allows us to run python code inside repository rule implementations. + + Args: + rctx: Handle to the repository_context. + + Returns: String of the PYTHONPATH. + """ + + separator = ":" if not "windows" in rctx.os.name.lower() else ";" + pypath = separator.join([ + str(rctx.path(entry).dirname) + for entry in rctx.attr._python_path_entries + ]) + return pypath + +def _get_python_interpreter_attr(rctx): + """A helper function for getting the `python_interpreter` attribute or it's default + + Args: + rctx (repository_ctx): Handle to the rule repository context. + + Returns: + str: The attribute value or it's default + """ + if rctx.attr.python_interpreter: + return rctx.attr.python_interpreter + + if "win" in rctx.os.name: + return "python.exe" + else: + return "python3" + +def _resolve_python_interpreter(rctx): + """Helper function to find the python interpreter from the common attributes + + Args: + rctx: Handle to the rule repository context. + + Returns: + `path` object, for the resolved path to the Python interpreter. + """ + python_interpreter = _get_python_interpreter_attr(rctx) + + if rctx.attr.python_interpreter_target != None: + python_interpreter = rctx.path(rctx.attr.python_interpreter_target) + + (os, _) = get_host_os_arch(rctx) + + # On Windows, the symlink doesn't work because Windows attempts to find + # Python DLLs where the symlink is, not where the symlink points. + if os == WINDOWS_NAME: + python_interpreter = python_interpreter.realpath + elif "/" not in python_interpreter: + # It's a plain command, e.g. "python3", to look up in the environment. + found_python_interpreter = rctx.which(python_interpreter) + if not found_python_interpreter: + fail("python interpreter `{}` not found in PATH".format(python_interpreter)) + python_interpreter = found_python_interpreter + else: + python_interpreter = rctx.path(python_interpreter) + return python_interpreter + +def _get_xcode_location_cflags(rctx): + """Query the xcode sdk location to update cflags + + Figure out if this interpreter target comes from rules_python, and patch the xcode sdk location if so. + Pip won't be able to compile c extensions from sdists with the pre built python distributions from indygreg + otherwise. See https://github.com/indygreg/python-build-standalone/issues/103 + """ + + # Only run on MacOS hosts + if not rctx.os.name.lower().startswith("mac os"): + return [] + + xcode_sdk_location = repo_utils.execute_unchecked( + rctx, + op = "GetXcodeLocation", + arguments = [repo_utils.which_checked(rctx, "xcode-select"), "--print-path"], + ) + if xcode_sdk_location.return_code != 0: + return [] + + xcode_root = xcode_sdk_location.stdout.strip() + if _COMMAND_LINE_TOOLS_PATH_SLUG not in xcode_root.lower(): + # This is a full xcode installation somewhere like /Applications/Xcode13.0.app/Contents/Developer + # so we need to change the path to to the macos specific tools which are in a different relative + # path than xcode installed command line tools. + xcode_root = "{}/Platforms/MacOSX.platform/Developer".format(xcode_root) + return [ + "-isysroot {}/SDKs/MacOSX.sdk".format(xcode_root), + ] + +def _get_toolchain_unix_cflags(rctx, python_interpreter): + """Gather cflags from a standalone toolchain for unix systems. + + Pip won't be able to compile c extensions from sdists with the pre built python distributions from indygreg + otherwise. See https://github.com/indygreg/python-build-standalone/issues/103 + """ + + # Only run on Unix systems + if not rctx.os.name.lower().startswith(("mac os", "linux")): + return [] + + # Only update the location when using a standalone toolchain. + if not is_standalone_interpreter(rctx, python_interpreter): + return [] + + stdout = repo_utils.execute_checked_stdout( + rctx, + op = "GetPythonVersionForUnixCflags", + arguments = [ + python_interpreter, + "-c", + "import sys; print(f'{sys.version_info[0]}.{sys.version_info[1]}', end='')", + ], + ) + _python_version = stdout + include_path = "{}/include/python{}".format( + python_interpreter.dirname, + _python_version, + ) + + return ["-isystem {}".format(include_path)] + +def _parse_optional_attrs(rctx, args, extra_pip_args = None): + """Helper function to parse common attributes of pip_repository and whl_library repository rules. + + This function also serializes the structured arguments as JSON + so they can be passed on the command line to subprocesses. + + Args: + rctx: Handle to the rule repository context. + args: A list of parsed args for the rule. + extra_pip_args: The pip args to pass. + Returns: Augmented args list. + """ + + if use_isolated(rctx, rctx.attr): + args.append("--isolated") + + # Bazel version 7.1.0 and later (and rolling releases from version 8.0.0-pre.20240128.3) + # support rctx.getenv(name, default): When building incrementally, any change to the value of + # the variable named by name will cause this repository to be re-fetched. + if "getenv" in dir(rctx): + getenv = rctx.getenv + else: + getenv = rctx.os.environ.get + + # Check for None so we use empty default types from our attrs. + # Some args want to be list, and some want to be dict. + if extra_pip_args != None: + args += [ + "--extra_pip_args", + json.encode(struct(arg = [ + envsubst(pip_arg, rctx.attr.envsubst, getenv) + for pip_arg in rctx.attr.extra_pip_args + ])), + ] + + if rctx.attr.download_only: + args.append("--download_only") + + if rctx.attr.pip_data_exclude != None: + args += [ + "--pip_data_exclude", + json.encode(struct(arg = rctx.attr.pip_data_exclude)), + ] + + if rctx.attr.enable_implicit_namespace_pkgs: + args.append("--enable_implicit_namespace_pkgs") + + if rctx.attr.environment != None: + args += [ + "--environment", + json.encode(struct(arg = rctx.attr.environment)), + ] + + return args + +def _create_repository_execution_environment(rctx, python_interpreter): + """Create a environment dictionary for processes we spawn with rctx.execute. + + Args: + rctx (repository_ctx): The repository context. + python_interpreter (path): The resolved python interpreter. + Returns: + Dictionary of environment variable suitable to pass to rctx.execute. + """ + + # Gather any available CPPFLAGS values + cppflags = [] + cppflags.extend(_get_xcode_location_cflags(rctx)) + cppflags.extend(_get_toolchain_unix_cflags(rctx, python_interpreter)) + + env = { + "PYTHONPATH": _construct_pypath(rctx), + _CPPFLAGS: " ".join(cppflags), + } + + return env + +def _whl_library_impl(rctx): + python_interpreter = _resolve_python_interpreter(rctx) + args = [ + python_interpreter, + "-m", + "python.pip_install.tools.wheel_installer.wheel_installer", + "--requirement", + rctx.attr.requirement, + ] + extra_pip_args = [] + extra_pip_args.extend(rctx.attr.extra_pip_args) + + # Manually construct the PYTHONPATH since we cannot use the toolchain here + environment = _create_repository_execution_environment(rctx, python_interpreter) + + whl_path = None + if rctx.attr.whl_file: + whl_path = rctx.path(rctx.attr.whl_file) + + # Simulate the behaviour where the whl is present in the current directory. + rctx.symlink(whl_path, whl_path.basename) + whl_path = rctx.path(whl_path.basename) + elif rctx.attr.urls: + filename = rctx.attr.filename + urls = rctx.attr.urls + if not filename: + _, _, filename = urls[0].rpartition("/") + + if not (filename.endswith(".whl") or filename.endswith("tar.gz") or filename.endswith(".zip")): + if rctx.attr.filename: + msg = "got '{}'".format(filename) + else: + msg = "detected '{}' from url:\n{}".format(filename, urls[0]) + fail("Only '.whl', '.tar.gz' or '.zip' files are supported, {}".format(msg)) + + result = rctx.download( + url = urls, + output = filename, + sha256 = rctx.attr.sha256, + auth = get_auth(rctx, urls), + ) + + if not result.success: + fail("could not download the '{}' from {}:\n{}".format(filename, urls, result)) + + if filename.endswith(".whl"): + whl_path = rctx.path(rctx.attr.filename) + else: + # It is an sdist and we need to tell PyPI to use a file in this directory + # and not use any indexes. + extra_pip_args.extend(["--no-index", "--find-links", "."]) + + args = _parse_optional_attrs(rctx, args, extra_pip_args) + + if not whl_path: + repo_utils.execute_checked( + rctx, + op = "whl_library.ResolveRequirement({}, {})".format(rctx.attr.name, rctx.attr.requirement), + arguments = args, + environment = environment, + quiet = rctx.attr.quiet, + timeout = rctx.attr.timeout, + ) + + whl_path = rctx.path(json.decode(rctx.read("whl_file.json"))["whl_file"]) + if not rctx.delete("whl_file.json"): + fail("failed to delete the whl_file.json file") + + if rctx.attr.whl_patches: + patches = {} + for patch_file, json_args in rctx.attr.whl_patches.items(): + patch_dst = struct(**json.decode(json_args)) + if whl_path.basename in patch_dst.whls: + patches[patch_file] = patch_dst.patch_strip + + whl_path = patch_whl( + rctx, + op = "whl_library.PatchWhl({}, {})".format(rctx.attr.name, rctx.attr.requirement), + python_interpreter = python_interpreter, + whl_path = whl_path, + patches = patches, + quiet = rctx.attr.quiet, + timeout = rctx.attr.timeout, + ) + + target_platforms = rctx.attr.experimental_target_platforms + if target_platforms: + parsed_whl = parse_whl_name(whl_path.basename) + if parsed_whl.platform_tag != "any": + # NOTE @aignas 2023-12-04: if the wheel is a platform specific + # wheel, we only include deps for that target platform + target_platforms = [ + p.target_platform + for p in whl_target_platforms( + platform_tag = parsed_whl.platform_tag, + abi_tag = parsed_whl.abi_tag, + ) + ] + + repo_utils.execute_checked( + rctx, + op = "whl_library.ExtractWheel({}, {})".format(rctx.attr.name, whl_path), + arguments = args + [ + "--whl-file", + whl_path, + ] + ["--platform={}".format(p) for p in target_platforms], + environment = environment, + quiet = rctx.attr.quiet, + timeout = rctx.attr.timeout, + ) + + metadata = json.decode(rctx.read("metadata.json")) + rctx.delete("metadata.json") + + # NOTE @aignas 2024-06-22: this has to live on until we stop supporting + # passing `twine` as a `:pkg` library via the `WORKSPACE` builds. + # + # See ../../packaging.bzl line 190 + entry_points = {} + for item in metadata["entry_points"]: + name = item["name"] + module = item["module"] + attribute = item["attribute"] + + # There is an extreme edge-case with entry_points that end with `.py` + # See: https://github.com/bazelbuild/bazel/blob/09c621e4cf5b968f4c6cdf905ab142d5961f9ddc/src/test/java/com/google/devtools/build/lib/rules/python/PyBinaryConfiguredTargetTest.java#L174 + entry_point_without_py = name[:-3] + "_py" if name.endswith(".py") else name + entry_point_target_name = ( + _WHEEL_ENTRY_POINT_PREFIX + "_" + entry_point_without_py + ) + entry_point_script_name = entry_point_target_name + ".py" + + rctx.file( + entry_point_script_name, + _generate_entry_point_contents(module, attribute), + ) + entry_points[entry_point_without_py] = entry_point_script_name + + build_file_contents = generate_whl_library_build_bazel( + 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, + group_deps = rctx.attr.group_deps, + data_exclude = rctx.attr.pip_data_exclude, + tags = [ + "pypi_name=" + metadata["name"], + "pypi_version=" + metadata["version"], + ], + entry_points = entry_points, + annotation = None if not rctx.attr.annotation else struct(**json.decode(rctx.read(rctx.attr.annotation))), + ) + rctx.file("BUILD.bazel", build_file_contents) + + return + +def _generate_entry_point_contents( + module, + attribute, + shebang = "#!/usr/bin/env python3"): + """Generate the contents of an entry point script. + + Args: + module (str): The name of the module to use. + attribute (str): The name of the attribute to call. + shebang (str, optional): The shebang to use for the entry point python + file. + + Returns: + str: A string of python code. + """ + contents = """\ +{shebang} +import sys +from {module} import {attribute} +if __name__ == "__main__": + sys.exit({attribute}()) +""".format( + shebang = shebang, + module = module, + attribute = attribute, + ) + return contents + +# NOTE @aignas 2024-03-21: The usage of dict({}, **common) ensures that all args to `dict` are unique +whl_library_attrs = dict({ + "annotation": attr.label( + doc = ( + "Optional json encoded file containing annotation to apply to the extracted wheel. " + + "See `package_annotation`" + ), + allow_files = True, + ), + "dep_template": attr.string( + doc = """ +The dep template to use for referencing the dependencies. It should have `{name}` +and `{target}` tokens that will be replaced with the normalized distribution name +and the target that we need respectively. +""", + ), + "filename": attr.string( + doc = "Download the whl file to this filename. Only used when the `urls` is passed. If not specified, will be auto-detected from the `urls`.", + ), + "group_deps": attr.string_list( + doc = "List of dependencies to skip in order to break the cycles within a dependency group.", + default = [], + ), + "group_name": attr.string( + doc = "Name of the group, if any.", + ), + "repo": attr.string( + mandatory = True, + doc = "Pointer to parent repo name. Used to make these rules rerun if the parent repo changes.", + ), + "repo_prefix": attr.string( + doc = """ +Prefix for the generated packages will be of the form `@//...` + +DEPRECATED. Only left for people who vendor requirements.bzl. +""", + ), + "requirement": attr.string( + mandatory = True, + doc = "Python requirement string describing the package to make available, if 'urls' or 'whl_file' is given, then this only needs to include foo[any_extras] as a bare minimum.", + ), + "sha256": attr.string( + doc = "The sha256 of the downloaded whl. Only used when the `urls` is passed.", + ), + "urls": attr.string_list( + doc = """\ +The list of urls of the whl to be downloaded using bazel downloader. Using this +attr makes `extra_pip_args` and `download_only` ignored.""", + ), + "whl_file": attr.label( + doc = "The whl file that should be used instead of downloading or building the whl.", + ), + "whl_patches": attr.label_keyed_string_dict( + doc = """a label-keyed-string dict that has + json.encode(struct([whl_file], patch_strip]) as values. This + is to maintain flexibility and correct bzlmod extension interface + until we have a better way to define whl_library and move whl + patching to a separate place. INTERNAL USE ONLY.""", + ), + "_python_path_entries": attr.label_list( + # Get the root directory of these rules and keep them as a default attribute + # in order to avoid unnecessary repository fetching restarts. + # + # This is very similar to what was done in https://github.com/bazelbuild/rules_go/pull/3478 + default = [ + Label("//:BUILD.bazel"), + ] + [ + # Includes all the external dependencies from repositories.bzl + Label("@" + repo + "//:BUILD.bazel") + for repo in all_requirements + ], + ), +}, **ATTRS) +whl_library_attrs.update(AUTH_ATTRS) + +whl_library = repository_rule( + attrs = whl_library_attrs, + doc = """ +Download and extracts a single wheel based into a bazel repo based on the requirement string passed in. +Instantiated from pip_repository and inherits config options from there.""", + implementation = _whl_library_impl, + environ = [ + "RULES_PYTHON_PIP_ISOLATED", + REPO_DEBUG_ENV_VAR, + ], +) diff --git a/python/private/pip_repo_name.bzl b/python/private/pypi/whl_repo_name.bzl similarity index 94% rename from python/private/pip_repo_name.bzl rename to python/private/pypi/whl_repo_name.bzl index bef4304e15..295f5a45c4 100644 --- a/python/private/pip_repo_name.bzl +++ b/python/private/pypi/whl_repo_name.bzl @@ -15,10 +15,10 @@ """A function to convert a dist name to a valid bazel repo name. """ -load(":normalize_name.bzl", "normalize_name") +load("//python/private:normalize_name.bzl", "normalize_name") load(":parse_whl_name.bzl", "parse_whl_name") -def pip_repo_name(prefix, filename, sha256): +def whl_repo_name(prefix, filename, sha256): """Return a valid whl_library repo name given a distribution filename. Args: diff --git a/python/private/whl_target_platforms.bzl b/python/private/pypi/whl_target_platforms.bzl similarity index 100% rename from python/private/whl_target_platforms.bzl rename to python/private/pypi/whl_target_platforms.bzl diff --git a/python/private/text_util.bzl b/python/private/text_util.bzl index dade9cba9b..702a08e281 100644 --- a/python/private/text_util.bzl +++ b/python/private/text_util.bzl @@ -36,6 +36,9 @@ def _render_alias(name, actual, *, visibility = None): ]) def _render_dict(d, *, key_repr = repr, value_repr = repr): + if not d: + return "{}" + return "\n".join([ "{", _indent("\n".join([ diff --git a/tests/private/envsubst/BUILD.bazel b/tests/envsubst/BUILD.bazel similarity index 100% rename from tests/private/envsubst/BUILD.bazel rename to tests/envsubst/BUILD.bazel diff --git a/tests/private/envsubst/envsubst_tests.bzl b/tests/envsubst/envsubst_tests.bzl similarity index 100% rename from tests/private/envsubst/envsubst_tests.bzl rename to tests/envsubst/envsubst_tests.bzl diff --git a/tests/pip_hub_repository/normalize_name/BUILD.bazel b/tests/normalize_name/BUILD.bazel similarity index 100% rename from tests/pip_hub_repository/normalize_name/BUILD.bazel rename to tests/normalize_name/BUILD.bazel diff --git a/tests/pip_hub_repository/normalize_name/normalize_name_tests.bzl b/tests/normalize_name/normalize_name_tests.bzl similarity index 100% rename from tests/pip_hub_repository/normalize_name/normalize_name_tests.bzl rename to tests/normalize_name/normalize_name_tests.bzl diff --git a/tests/pip_install/BUILD.bazel b/tests/pip_install/BUILD.bazel deleted file mode 100644 index 60d25de7df..0000000000 --- a/tests/pip_install/BUILD.bazel +++ /dev/null @@ -1,17 +0,0 @@ -load("@bazel_skylib//rules:diff_test.bzl", "diff_test") - -diff_test( - name = "srcs_diff_test", - failure_message = ( - "Please run 'bazel run //python/pip_install/private:srcs_module.update' " + - "to update the 'srcs.bzl' module found in the same package." - ), - file1 = "//python/pip_install/private:srcs_module", - file2 = "//python/pip_install/private:srcs.bzl", - # TODO: The diff_test here fails on Windows. As does the - # install script. This should be fixed. - target_compatible_with = select({ - "@platforms//os:windows": ["@platforms//:incompatible"], - "//conditions:default": [], - }), -) diff --git a/tests/pip_install/group_library/BUILD.bazel b/tests/pip_install/group_library/BUILD.bazel deleted file mode 100644 index 5a27e112db..0000000000 --- a/tests/pip_install/group_library/BUILD.bazel +++ /dev/null @@ -1,3 +0,0 @@ -load(":generate_build_bazel_tests.bzl", "generate_build_bazel_test_suite") - -generate_build_bazel_test_suite(name = "generate_build_bazel_tests") diff --git a/tests/pip_install/requirements_parser/BUILD.bazel b/tests/pip_install/requirements_parser/BUILD.bazel deleted file mode 100644 index 2787f16f94..0000000000 --- a/tests/pip_install/requirements_parser/BUILD.bazel +++ /dev/null @@ -1,3 +0,0 @@ -load(":requirements_parser_tests.bzl", parse_requirements_tests = "parse_tests") - -parse_requirements_tests(name = "test_parse_requirements") diff --git a/tests/pip_install/whl_library/BUILD.bazel b/tests/pip_install/whl_library/BUILD.bazel deleted file mode 100644 index 5a27e112db..0000000000 --- a/tests/pip_install/whl_library/BUILD.bazel +++ /dev/null @@ -1,3 +0,0 @@ -load(":generate_build_bazel_tests.bzl", "generate_build_bazel_test_suite") - -generate_build_bazel_test_suite(name = "generate_build_bazel_tests") diff --git a/tests/private/pip_config_settings/BUILD.bazel b/tests/private/pip_config_settings/BUILD.bazel deleted file mode 100644 index c3752e0ac3..0000000000 --- a/tests/private/pip_config_settings/BUILD.bazel +++ /dev/null @@ -1,5 +0,0 @@ -load(":pip_config_settings_tests.bzl", "pip_config_settings_test_suite") - -pip_config_settings_test_suite( - name = "pip_config_settings", -) diff --git a/tests/private/pip_repo_name/BUILD.bazel b/tests/private/pip_repo_name/BUILD.bazel deleted file mode 100644 index 7c6782daaf..0000000000 --- a/tests/private/pip_repo_name/BUILD.bazel +++ /dev/null @@ -1,3 +0,0 @@ -load(":pip_repo_name_tests.bzl", "pip_repo_name_test_suite") - -pip_repo_name_test_suite(name = "pip_repo_name_tests") diff --git a/tests/private/pypi_index/BUILD.bazel b/tests/private/pypi_index/BUILD.bazel deleted file mode 100644 index d365896cd3..0000000000 --- a/tests/private/pypi_index/BUILD.bazel +++ /dev/null @@ -1,3 +0,0 @@ -load(":pypi_index_tests.bzl", "pypi_index_test_suite") - -pypi_index_test_suite(name = "pypi_index_tests") diff --git a/tests/private/pypi_index_sources/BUILD.bazel b/tests/private/pypi_index_sources/BUILD.bazel deleted file mode 100644 index 212615f480..0000000000 --- a/tests/private/pypi_index_sources/BUILD.bazel +++ /dev/null @@ -1,3 +0,0 @@ -load(":pypi_index_sources_tests.bzl", "pypi_index_sources_test_suite") - -pypi_index_sources_test_suite(name = "pypi_index_sources_tests") diff --git a/tests/pypi/config_settings/BUILD.bazel b/tests/pypi/config_settings/BUILD.bazel new file mode 100644 index 0000000000..15dbd7f70e --- /dev/null +++ b/tests/pypi/config_settings/BUILD.bazel @@ -0,0 +1,5 @@ +load(":config_settings_tests.bzl", "config_settings_test_suite") + +config_settings_test_suite( + name = "config_settings_tests", +) diff --git a/tests/private/pip_config_settings/pip_config_settings_tests.bzl b/tests/pypi/config_settings/config_settings_tests.bzl similarity index 98% rename from tests/private/pip_config_settings/pip_config_settings_tests.bzl rename to tests/pypi/config_settings/config_settings_tests.bzl index a66e7f47d5..87e18b412f 100644 --- a/tests/private/pip_config_settings/pip_config_settings_tests.bzl +++ b/tests/pypi/config_settings/config_settings_tests.bzl @@ -17,7 +17,7 @@ load("@rules_testing//lib:analysis_test.bzl", "analysis_test") load("@rules_testing//lib:test_suite.bzl", "test_suite") load("@rules_testing//lib:truth.bzl", "subjects") load("@rules_testing//lib:util.bzl", test_util = "util") -load("//python/private:pip_config_settings.bzl", "pip_config_settings") # buildifier: disable=bzl-visibility +load("//python/private/pypi:config_settings.bzl", "config_settings") # buildifier: disable=bzl-visibility def _subject_impl(ctx): _ = ctx # @unused @@ -520,13 +520,13 @@ def _test_all(name): _tests.append(_test_all) -def pip_config_settings_test_suite(name): # buildifier: disable=function-docstring +def config_settings_test_suite(name): # buildifier: disable=function-docstring test_suite( name = name, tests = _tests, ) - pip_config_settings( + config_settings( name = "dummy", python_versions = ["3.8", "3.9", "3.10"], glibc_versions = [(2, 14), (2, 17)], diff --git a/tests/pypi/generate_group_library_build_bazel/BUILD.bazel b/tests/pypi/generate_group_library_build_bazel/BUILD.bazel new file mode 100644 index 0000000000..df5ab82320 --- /dev/null +++ b/tests/pypi/generate_group_library_build_bazel/BUILD.bazel @@ -0,0 +1,3 @@ +load(":generate_group_library_build_bazel_tests.bzl", "generate_group_library_build_bazel_test_suite") + +generate_group_library_build_bazel_test_suite(name = "generate_group_library_build_bazel_tests") diff --git a/tests/pip_install/group_library/generate_build_bazel_tests.bzl b/tests/pypi/generate_group_library_build_bazel/generate_group_library_build_bazel_tests.bzl similarity index 91% rename from tests/pip_install/group_library/generate_build_bazel_tests.bzl rename to tests/pypi/generate_group_library_build_bazel/generate_group_library_build_bazel_tests.bzl index cf082c2990..a46aa413a3 100644 --- a/tests/pip_install/group_library/generate_build_bazel_tests.bzl +++ b/tests/pypi/generate_group_library_build_bazel/generate_group_library_build_bazel_tests.bzl @@ -15,7 +15,7 @@ "" load("@rules_testing//lib:test_suite.bzl", "test_suite") -load("//python/pip_install/private:generate_group_library_build_bazel.bzl", "generate_group_library_build_bazel") # buildifier: disable=bzl-visibility +load("//python/private/pypi:generate_group_library_build_bazel.bzl", "generate_group_library_build_bazel") # buildifier: disable=bzl-visibility _tests = [] @@ -95,7 +95,7 @@ py_library( _tests.append(_test_in_hub) -def generate_build_bazel_test_suite(name): +def generate_group_library_build_bazel_test_suite(name): """Create the test suite. Args: diff --git a/tests/pypi/generate_whl_library_build_bazel/BUILD.bazel b/tests/pypi/generate_whl_library_build_bazel/BUILD.bazel new file mode 100644 index 0000000000..bea8e82ce3 --- /dev/null +++ b/tests/pypi/generate_whl_library_build_bazel/BUILD.bazel @@ -0,0 +1,3 @@ +load(":generate_whl_library_build_bazel_tests.bzl", "generate_whl_library_build_bazel_test_suite") + +generate_whl_library_build_bazel_test_suite(name = "generate_whl_library_build_bazel_tests") diff --git a/tests/pip_install/whl_library/generate_build_bazel_tests.bzl b/tests/pypi/generate_whl_library_build_bazel/generate_whl_library_build_bazel_tests.bzl similarity index 98% rename from tests/pip_install/whl_library/generate_build_bazel_tests.bzl rename to tests/pypi/generate_whl_library_build_bazel/generate_whl_library_build_bazel_tests.bzl index 62858afc94..3d4df14b5b 100644 --- a/tests/pip_install/whl_library/generate_build_bazel_tests.bzl +++ b/tests/pypi/generate_whl_library_build_bazel/generate_whl_library_build_bazel_tests.bzl @@ -15,7 +15,7 @@ "" load("@rules_testing//lib:test_suite.bzl", "test_suite") -load("//python/pip_install/private:generate_whl_library_build_bazel.bzl", "generate_whl_library_build_bazel") # buildifier: disable=bzl-visibility +load("//python/private/pypi:generate_whl_library_build_bazel.bzl", "generate_whl_library_build_bazel") # buildifier: disable=bzl-visibility _tests = [] @@ -569,7 +569,7 @@ config_setting( _tests.append(_test_group_member_deps_to_hub) -def generate_build_bazel_test_suite(name): +def generate_whl_library_build_bazel_test_suite(name): """Create the test suite. Args: diff --git a/tests/pypi/index_sources/BUILD.bazel b/tests/pypi/index_sources/BUILD.bazel new file mode 100644 index 0000000000..7cd327abef --- /dev/null +++ b/tests/pypi/index_sources/BUILD.bazel @@ -0,0 +1,3 @@ +load(":index_sources_tests.bzl", "index_sources_test_suite") + +index_sources_test_suite(name = "index_sources_tests") diff --git a/tests/private/pypi_index_sources/pypi_index_sources_tests.bzl b/tests/pypi/index_sources/index_sources_tests.bzl similarity index 88% rename from tests/private/pypi_index_sources/pypi_index_sources_tests.bzl rename to tests/pypi/index_sources/index_sources_tests.bzl index 48d790fc68..0a767078ba 100644 --- a/tests/private/pypi_index_sources/pypi_index_sources_tests.bzl +++ b/tests/pypi/index_sources/index_sources_tests.bzl @@ -15,7 +15,7 @@ "" load("@rules_testing//lib:test_suite.bzl", "test_suite") -load("//python/private:pypi_index_sources.bzl", "get_simpleapi_sources") # buildifier: disable=bzl-visibility +load("//python/private/pypi:index_sources.bzl", "index_sources") # buildifier: disable=bzl-visibility _tests = [] @@ -27,7 +27,7 @@ def _test_no_simple_api_sources(env): "foo==0.0.1 @ https://someurl.org; python_version < 2.7 --hash=sha256:deadbeef", ] for input in inputs: - got = get_simpleapi_sources(input) + got = index_sources(input) env.expect.that_collection(got.shas).contains_exactly([]) env.expect.that_str(got.version).equals("0.0.1") @@ -45,13 +45,13 @@ def _test_simple_api_sources(env): ], } for input, want_shas in tests.items(): - got = get_simpleapi_sources(input) + got = index_sources(input) env.expect.that_collection(got.shas).contains_exactly(want_shas) env.expect.that_str(got.version).equals("0.0.2") _tests.append(_test_simple_api_sources) -def pypi_index_sources_test_suite(name): +def index_sources_test_suite(name): """Create the test suite. Args: diff --git a/tests/private/parse_requirements/BUILD.bazel b/tests/pypi/parse_requirements/BUILD.bazel similarity index 100% rename from tests/private/parse_requirements/BUILD.bazel rename to tests/pypi/parse_requirements/BUILD.bazel diff --git a/tests/private/parse_requirements/parse_requirements_tests.bzl b/tests/pypi/parse_requirements/parse_requirements_tests.bzl similarity index 99% rename from tests/private/parse_requirements/parse_requirements_tests.bzl rename to tests/pypi/parse_requirements/parse_requirements_tests.bzl index 81cf523460..13ce8f44ed 100644 --- a/tests/private/parse_requirements/parse_requirements_tests.bzl +++ b/tests/pypi/parse_requirements/parse_requirements_tests.bzl @@ -15,7 +15,7 @@ "" load("@rules_testing//lib:test_suite.bzl", "test_suite") -load("//python/private:parse_requirements.bzl", "parse_requirements", "select_requirement") # buildifier: disable=bzl-visibility +load("//python/private/pypi:parse_requirements.bzl", "parse_requirements", "select_requirement") # buildifier: disable=bzl-visibility def _mock_ctx(): testdata = { diff --git a/tests/pypi/parse_requirements_txt/BUILD.bazel b/tests/pypi/parse_requirements_txt/BUILD.bazel new file mode 100644 index 0000000000..526fa73d4b --- /dev/null +++ b/tests/pypi/parse_requirements_txt/BUILD.bazel @@ -0,0 +1,3 @@ +load(":parse_requirements_txt_tests.bzl", "parse_requirements_txt_test_suite") + +parse_requirements_txt_test_suite(name = "parse_requirements_txt_tests") diff --git a/tests/pip_install/requirements_parser/requirements_parser_tests.bzl b/tests/pypi/parse_requirements_txt/parse_requirements_txt_tests.bzl similarity index 88% rename from tests/pip_install/requirements_parser/requirements_parser_tests.bzl rename to tests/pypi/parse_requirements_txt/parse_requirements_txt_tests.bzl index 5ea742e70d..f4e899054a 100644 --- a/tests/pip_install/requirements_parser/requirements_parser_tests.bzl +++ b/tests/pypi/parse_requirements_txt/parse_requirements_txt_tests.bzl @@ -15,83 +15,83 @@ "Unit tests for yaml.bzl" load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest") -load("//python/pip_install:requirements_parser.bzl", "parse") +load("//python/private/pypi:parse_requirements_txt.bzl", "parse_requirements_txt") # buildifier: disable=bzl-visibility def _parse_basic_test_impl(ctx): env = unittest.begin(ctx) # Base cases - asserts.equals(env, [], parse("").requirements) - asserts.equals(env, [], parse("\n").requirements) + asserts.equals(env, [], parse_requirements_txt("").requirements) + asserts.equals(env, [], parse_requirements_txt("\n").requirements) # Various requirement specifiers (https://pip.pypa.io/en/stable/reference/requirement-specifiers/#requirement-specifiers) - asserts.equals(env, [("SomeProject", "SomeProject")], parse("SomeProject\n").requirements) - asserts.equals(env, [("SomeProject", "SomeProject == 1.3")], parse("SomeProject == 1.3\n").requirements) - asserts.equals(env, [("SomeProject", "SomeProject >= 1.2, < 2.0")], parse("SomeProject >= 1.2, < 2.0\n").requirements) - asserts.equals(env, [("SomeProject", "SomeProject[foo, bar]")], parse("SomeProject[foo, bar]\n").requirements) - asserts.equals(env, [("SomeProject", "SomeProject ~= 1.4.2")], parse("SomeProject ~= 1.4.2\n").requirements) - asserts.equals(env, [("SomeProject", "SomeProject == 5.4 ; python_version < '3.8'")], parse("SomeProject == 5.4 ; python_version < '3.8'\n").requirements) - asserts.equals(env, [("SomeProject", "SomeProject ; sys_platform == 'win32'")], parse("SomeProject ; sys_platform == 'win32'\n").requirements) - asserts.equals(env, [("requests", "requests [security] >= 2.8.1, == 2.8.* ; python_version < 2.7")], parse("requests [security] >= 2.8.1, == 2.8.* ; python_version < 2.7\n").requirements) + asserts.equals(env, [("SomeProject", "SomeProject")], parse_requirements_txt("SomeProject\n").requirements) + asserts.equals(env, [("SomeProject", "SomeProject == 1.3")], parse_requirements_txt("SomeProject == 1.3\n").requirements) + asserts.equals(env, [("SomeProject", "SomeProject >= 1.2, < 2.0")], parse_requirements_txt("SomeProject >= 1.2, < 2.0\n").requirements) + asserts.equals(env, [("SomeProject", "SomeProject[foo, bar]")], parse_requirements_txt("SomeProject[foo, bar]\n").requirements) + asserts.equals(env, [("SomeProject", "SomeProject ~= 1.4.2")], parse_requirements_txt("SomeProject ~= 1.4.2\n").requirements) + asserts.equals(env, [("SomeProject", "SomeProject == 5.4 ; python_version < '3.8'")], parse_requirements_txt("SomeProject == 5.4 ; python_version < '3.8'\n").requirements) + asserts.equals(env, [("SomeProject", "SomeProject ; sys_platform == 'win32'")], parse_requirements_txt("SomeProject ; sys_platform == 'win32'\n").requirements) + asserts.equals(env, [("requests", "requests [security] >= 2.8.1, == 2.8.* ; python_version < 2.7")], parse_requirements_txt("requests [security] >= 2.8.1, == 2.8.* ; python_version < 2.7\n").requirements) # Multiple requirements - asserts.equals(env, [("FooProject", "FooProject==1.0.0"), ("BarProject", "BarProject==2.0.0")], parse("""\ + asserts.equals(env, [("FooProject", "FooProject==1.0.0"), ("BarProject", "BarProject==2.0.0")], parse_requirements_txt("""\ FooProject==1.0.0 BarProject==2.0.0 """).requirements) - asserts.equals(env, [("FooProject", "FooProject==1.0.0"), ("BarProject", "BarProject==2.0.0")], parse("""\ + asserts.equals(env, [("FooProject", "FooProject==1.0.0"), ("BarProject", "BarProject==2.0.0")], parse_requirements_txt("""\ FooProject==1.0.0 BarProject==2.0.0 """).requirements) # Comments - asserts.equals(env, [("SomeProject", "SomeProject")], parse("""\ + asserts.equals(env, [("SomeProject", "SomeProject")], parse_requirements_txt("""\ # This is a comment SomeProject """).requirements) - asserts.equals(env, [("SomeProject", "SomeProject")], parse("""\ + asserts.equals(env, [("SomeProject", "SomeProject")], parse_requirements_txt("""\ SomeProject # This is a comment """).requirements) - asserts.equals(env, [("SomeProject", "SomeProject == 1.3")], parse("""\ + asserts.equals(env, [("SomeProject", "SomeProject == 1.3")], parse_requirements_txt("""\ SomeProject == 1.3 # This is a comment """).requirements) - asserts.equals(env, [("FooProject", "FooProject==1.0.0"), ("BarProject", "BarProject==2.0.0")], parse("""\ + asserts.equals(env, [("FooProject", "FooProject==1.0.0"), ("BarProject", "BarProject==2.0.0")], parse_requirements_txt("""\ FooProject==1.0.0 # Comment BarProject==2.0.0 #Comment """).requirements) - asserts.equals(env, [("requests", "requests @ https://github.com/psf/requests/releases/download/v2.29.0/requests-2.29.0.tar.gz#sha1=3897c249b51a1a405d615a8c9cb92e5fdbf0dd49")], parse("""\ + asserts.equals(env, [("requests", "requests @ https://github.com/psf/requests/releases/download/v2.29.0/requests-2.29.0.tar.gz#sha1=3897c249b51a1a405d615a8c9cb92e5fdbf0dd49")], parse_requirements_txt("""\ requests @ https://github.com/psf/requests/releases/download/v2.29.0/requests-2.29.0.tar.gz#sha1=3897c249b51a1a405d615a8c9cb92e5fdbf0dd49 """).requirements) # Multiline - asserts.equals(env, [("certifi", "certifi==2021.10.8 --hash=sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872 --hash=sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569")], parse("""\ + asserts.equals(env, [("certifi", "certifi==2021.10.8 --hash=sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872 --hash=sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569")], parse_requirements_txt("""\ certifi==2021.10.8 \ --hash=sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872 \ --hash=sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569 # via requests """).requirements) - asserts.equals(env, [("requests", "requests @ https://github.com/psf/requests/releases/download/v2.29.0/requests-2.29.0.tar.gz#sha1=3897c249b51a1a405d615a8c9cb92e5fdbf0dd49 --hash=sha256:eca58eb564b134e4ff521a02aa6f566c653835753e1fc8a50a20cb6bee4673cd")], parse("""\ + asserts.equals(env, [("requests", "requests @ https://github.com/psf/requests/releases/download/v2.29.0/requests-2.29.0.tar.gz#sha1=3897c249b51a1a405d615a8c9cb92e5fdbf0dd49 --hash=sha256:eca58eb564b134e4ff521a02aa6f566c653835753e1fc8a50a20cb6bee4673cd")], parse_requirements_txt("""\ requests @ https://github.com/psf/requests/releases/download/v2.29.0/requests-2.29.0.tar.gz#sha1=3897c249b51a1a405d615a8c9cb92e5fdbf0dd49 \ --hash=sha256:eca58eb564b134e4ff521a02aa6f566c653835753e1fc8a50a20cb6bee4673cd # via requirements.txt """).requirements) # Options - asserts.equals(env, ["--pre"], parse("--pre\n").options) - asserts.equals(env, ["--find-links", "/my/local/archives"], parse("--find-links /my/local/archives\n").options) - asserts.equals(env, ["--pre", "--find-links", "/my/local/archives"], parse("""\ + asserts.equals(env, ["--pre"], parse_requirements_txt("--pre\n").options) + asserts.equals(env, ["--find-links", "/my/local/archives"], parse_requirements_txt("--find-links /my/local/archives\n").options) + asserts.equals(env, ["--pre", "--find-links", "/my/local/archives"], parse_requirements_txt("""\ --pre --find-links /my/local/archives """).options) - asserts.equals(env, ["--pre", "--find-links", "/my/local/archives"], parse("""\ + asserts.equals(env, ["--pre", "--find-links", "/my/local/archives"], parse_requirements_txt("""\ --pre # Comment --find-links /my/local/archives """).options) - asserts.equals(env, struct(requirements = [("FooProject", "FooProject==1.0.0")], options = ["--pre", "--find-links", "/my/local/archives"]), parse("""\ + asserts.equals(env, struct(requirements = [("FooProject", "FooProject==1.0.0")], options = ["--pre", "--find-links", "/my/local/archives"]), parse_requirements_txt("""\ --pre # Comment FooProject==1.0.0 --find-links /my/local/archives @@ -116,7 +116,7 @@ def _parse_requirements_lockfile_test_impl(ctx): ("urllib3", "urllib3==1.26.7 --hash=sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece --hash=sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"), ("yamllint", "yamllint==1.26.3 --hash=sha256:3934dcde484374596d6b52d8db412929a169f6d9e52e20f9ade5bf3523d9b96e"), ("setuptools", "setuptools==59.6.0 --hash=sha256:22c7348c6d2976a52632c67f7ab0cdf40147db7789f9aed18734643fe9cf3373 --hash=sha256:4ce92f1e1f8f01233ee9952c04f6b81d1e02939d6e1b488428154974a4d0783e"), - ], parse("""\ + ], parse_requirements_txt("""\ # # This file is autogenerated by pip-compile with python 3.9 # To update, run: @@ -220,5 +220,5 @@ parse_requirements_lockfile_test = unittest.make( attrs = {}, ) -def parse_tests(name): +def parse_requirements_txt_test_suite(name): unittest.suite(name, parse_basic_test, parse_requirements_lockfile_test) diff --git a/tests/pypi/parse_simpleapi_html/BUILD.bazel b/tests/pypi/parse_simpleapi_html/BUILD.bazel new file mode 100644 index 0000000000..e63ef0d5fa --- /dev/null +++ b/tests/pypi/parse_simpleapi_html/BUILD.bazel @@ -0,0 +1,3 @@ +load(":parse_simpleapi_html_tests.bzl", "parse_simpleapi_html_test_suite") + +parse_simpleapi_html_test_suite(name = "parse_simpleapi_html_tests") diff --git a/tests/private/pypi_index/pypi_index_tests.bzl b/tests/pypi/parse_simpleapi_html/parse_simpleapi_html_tests.bzl similarity index 95% rename from tests/private/pypi_index/pypi_index_tests.bzl rename to tests/pypi/parse_simpleapi_html/parse_simpleapi_html_tests.bzl index fa381065b1..a60bb1f330 100644 --- a/tests/private/pypi_index/pypi_index_tests.bzl +++ b/tests/pypi/parse_simpleapi_html/parse_simpleapi_html_tests.bzl @@ -16,7 +16,7 @@ load("@rules_testing//lib:test_suite.bzl", "test_suite") load("@rules_testing//lib:truth.bzl", "subjects") -load("//python/private:pypi_index.bzl", "parse_simple_api_html") # buildifier: disable=bzl-visibility +load("//python/private/pypi:parse_simpleapi_html.bzl", "parse_simpleapi_html") # buildifier: disable=bzl-visibility _tests = [] @@ -42,7 +42,7 @@ def _generate_html(*items): ]), ) -def _test_parse_simple_api_html(env): +def _test_sdist(env): # buildifier: disable=unsorted-dict-items tests = [ ( @@ -65,7 +65,7 @@ def _test_parse_simple_api_html(env): for (input, want) in tests: html = _generate_html(input) - got = parse_simple_api_html(url = input.url, content = html) + got = parse_simpleapi_html(url = input.url, content = html) env.expect.that_collection(got.sdists).has_size(1) env.expect.that_collection(got.whls).has_size(0) if not got: @@ -85,9 +85,9 @@ def _test_parse_simple_api_html(env): actual.url().equals(want.url) actual.yanked().equals(want.yanked) -_tests.append(_test_parse_simple_api_html) +_tests.append(_test_sdist) -def _test_parse_simple_api_html_whls(env): +def _test_whls(env): # buildifier: disable=unsorted-dict-items tests = [ ( @@ -189,7 +189,7 @@ def _test_parse_simple_api_html_whls(env): for (input, want) in tests: html = _generate_html(input) - got = parse_simple_api_html(url = input.url, content = html) + got = parse_simpleapi_html(url = input.url, content = html) env.expect.that_collection(got.sdists).has_size(0) env.expect.that_collection(got.whls).has_size(1) if not got: @@ -213,9 +213,9 @@ def _test_parse_simple_api_html_whls(env): actual.url().equals(want.url) actual.yanked().equals(want.yanked) -_tests.append(_test_parse_simple_api_html_whls) +_tests.append(_test_whls) -def pypi_index_test_suite(name): +def parse_simpleapi_html_test_suite(name): """Create the test suite. Args: diff --git a/tests/private/parse_whl_name/BUILD.bazel b/tests/pypi/parse_whl_name/BUILD.bazel similarity index 100% rename from tests/private/parse_whl_name/BUILD.bazel rename to tests/pypi/parse_whl_name/BUILD.bazel diff --git a/tests/private/parse_whl_name/parse_whl_name_tests.bzl b/tests/pypi/parse_whl_name/parse_whl_name_tests.bzl similarity index 96% rename from tests/private/parse_whl_name/parse_whl_name_tests.bzl rename to tests/pypi/parse_whl_name/parse_whl_name_tests.bzl index c249f9fb1a..4a88a6e7c5 100644 --- a/tests/private/parse_whl_name/parse_whl_name_tests.bzl +++ b/tests/pypi/parse_whl_name/parse_whl_name_tests.bzl @@ -15,7 +15,7 @@ "" load("@rules_testing//lib:test_suite.bzl", "test_suite") -load("//python/private:parse_whl_name.bzl", "parse_whl_name") # buildifier: disable=bzl-visibility +load("//python/private/pypi:parse_whl_name.bzl", "parse_whl_name") # buildifier: disable=bzl-visibility _tests = [] diff --git a/tests/pip_hub_repository/render_pkg_aliases/BUILD.bazel b/tests/pypi/render_pkg_aliases/BUILD.bazel similarity index 100% rename from tests/pip_hub_repository/render_pkg_aliases/BUILD.bazel rename to tests/pypi/render_pkg_aliases/BUILD.bazel diff --git a/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl b/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl similarity index 98% rename from tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl rename to tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl index da8a918aed..0d4c75e3c2 100644 --- a/tests/pip_hub_repository/render_pkg_aliases/render_pkg_aliases_test.bzl +++ b/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl @@ -16,12 +16,9 @@ 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:pip_config_settings.bzl", - "pip_config_settings", -) # buildifier: disable=bzl-visibility -load( - "//python/private:render_pkg_aliases.bzl", + "//python/private/pypi:render_pkg_aliases.bzl", "get_filename_config_settings", "get_whl_flag_versions", "multiplatform_whl_aliases", @@ -182,10 +179,10 @@ alias( env.expect.that_str(actual.pop("_config/BUILD.bazel")).equals( """\ -load("@rules_python//python/private:pip_config_settings.bzl", "pip_config_settings") +load("@rules_python//python/private/pypi:config_settings.bzl", "config_settings") -pip_config_settings( - name = "pip_config_settings", +config_settings( + name = "config_settings", glibc_versions = [], muslc_versions = [], osx_versions = [], @@ -722,7 +719,6 @@ def _test_cp37_abi3_linux_x86_64(env): python_default = True, want = [ ":is_cp3x_abi3_linux_x86_64", - # TODO @aignas 2024-05-29: update the pip_config_settings to generate this ":is_cp3.2_cp3x_abi3_linux_x86_64", ], ) @@ -924,7 +920,7 @@ def _test_config_settings_exist(env): ] available_config_settings = [] mock_rule = lambda name, **kwargs: available_config_settings.append(name) - pip_config_settings( + config_settings( python_versions = ["3.11"], native = struct( alias = mock_rule, diff --git a/tests/pypi/whl_repo_name/BUILD.bazel b/tests/pypi/whl_repo_name/BUILD.bazel new file mode 100644 index 0000000000..8671dd7754 --- /dev/null +++ b/tests/pypi/whl_repo_name/BUILD.bazel @@ -0,0 +1,3 @@ +load(":whl_repo_name_tests.bzl", "whl_repo_name_test_suite") + +whl_repo_name_test_suite(name = "whl_repo_name_tests") diff --git a/tests/private/pip_repo_name/pip_repo_name_tests.bzl b/tests/pypi/whl_repo_name/whl_repo_name_tests.bzl similarity index 82% rename from tests/private/pip_repo_name/pip_repo_name_tests.bzl rename to tests/pypi/whl_repo_name/whl_repo_name_tests.bzl index 574d558277..8b7df83530 100644 --- a/tests/private/pip_repo_name/pip_repo_name_tests.bzl +++ b/tests/pypi/whl_repo_name/whl_repo_name_tests.bzl @@ -15,24 +15,24 @@ "" load("@rules_testing//lib:test_suite.bzl", "test_suite") -load("//python/private:pip_repo_name.bzl", "pip_repo_name") # buildifier: disable=bzl-visibility +load("//python/private/pypi:whl_repo_name.bzl", "whl_repo_name") # buildifier: disable=bzl-visibility _tests = [] def _test_simple(env): - got = pip_repo_name("prefix", "foo-1.2.3-py3-none-any.whl", "deadbeef") + got = whl_repo_name("prefix", "foo-1.2.3-py3-none-any.whl", "deadbeef") env.expect.that_str(got).equals("prefix_foo_py3_none_any_deadbeef") _tests.append(_test_simple) def _test_sdist(env): - got = pip_repo_name("prefix", "foo-1.2.3.tar.gz", "deadbeef000deadbeef") + got = whl_repo_name("prefix", "foo-1.2.3.tar.gz", "deadbeef000deadbeef") env.expect.that_str(got).equals("prefix_foo_sdist_deadbeef") _tests.append(_test_sdist) def _test_platform_whl(env): - got = pip_repo_name( + got = whl_repo_name( "prefix", "foo-1.2.3-cp39.cp310-abi3-manylinux1_x86_64.manylinux_2_17_x86_64.whl", "deadbeef000deadbeef", @@ -43,7 +43,7 @@ def _test_platform_whl(env): _tests.append(_test_platform_whl) -def pip_repo_name_test_suite(name): +def whl_repo_name_test_suite(name): """Create the test suite. Args: diff --git a/tests/private/whl_target_platforms/BUILD.bazel b/tests/pypi/whl_target_platforms/BUILD.bazel similarity index 100% rename from tests/private/whl_target_platforms/BUILD.bazel rename to tests/pypi/whl_target_platforms/BUILD.bazel diff --git a/tests/private/whl_target_platforms/select_whl_tests.bzl b/tests/pypi/whl_target_platforms/select_whl_tests.bzl similarity index 98% rename from tests/private/whl_target_platforms/select_whl_tests.bzl rename to tests/pypi/whl_target_platforms/select_whl_tests.bzl index 59e9d77918..3fd80e3ee3 100644 --- a/tests/private/whl_target_platforms/select_whl_tests.bzl +++ b/tests/pypi/whl_target_platforms/select_whl_tests.bzl @@ -15,7 +15,7 @@ "" load("@rules_testing//lib:test_suite.bzl", "test_suite") -load("//python/private:whl_target_platforms.bzl", "select_whls") # buildifier: disable=bzl-visibility +load("//python/private/pypi:whl_target_platforms.bzl", "select_whls") # buildifier: disable=bzl-visibility WHL_LIST = [ "pkg-0.0.1-cp311-cp311-macosx_10_9_universal2.whl", diff --git a/tests/private/whl_target_platforms/whl_target_platforms_tests.bzl b/tests/pypi/whl_target_platforms/whl_target_platforms_tests.bzl similarity index 97% rename from tests/private/whl_target_platforms/whl_target_platforms_tests.bzl rename to tests/pypi/whl_target_platforms/whl_target_platforms_tests.bzl index 07f3158b31..a72bdc275f 100644 --- a/tests/private/whl_target_platforms/whl_target_platforms_tests.bzl +++ b/tests/pypi/whl_target_platforms/whl_target_platforms_tests.bzl @@ -15,7 +15,7 @@ "" load("@rules_testing//lib:test_suite.bzl", "test_suite") -load("//python/private:whl_target_platforms.bzl", "whl_target_platforms") # buildifier: disable=bzl-visibility +load("//python/private/pypi:whl_target_platforms.bzl", "whl_target_platforms") # buildifier: disable=bzl-visibility _tests = [] diff --git a/tests/private/text_util/BUILD.bazel b/tests/text_util/BUILD.bazel similarity index 100% rename from tests/private/text_util/BUILD.bazel rename to tests/text_util/BUILD.bazel diff --git a/tests/private/text_util/render_tests.bzl b/tests/text_util/render_tests.bzl similarity index 100% rename from tests/private/text_util/render_tests.bzl rename to tests/text_util/render_tests.bzl From 55d1042c245abc973a64319296abda8a1a279fe7 Mon Sep 17 00:00:00 2001 From: Greg Roodt Date: Sun, 23 Jun 2024 11:35:56 +1000 Subject: [PATCH 092/345] docs: Removes dead link after docs were migrated to sphinx (#2005) I believe the intended content is now here: https://rules-python.readthedocs.io/en/latest/#migrating-from-the-bundled-rules Im not sure there is much value linking to that page, but I don't mind. Just let me know. --------- Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> --- README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 546af97009..d890d702d6 100644 --- a/README.md +++ b/README.md @@ -13,13 +13,9 @@ Documentation for rules_python is at and i Examples live in the [examples](examples) directory. -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[`Migrating from the Bundled Rules`](#Migrating-from-the-bundled-rules) below. - -The core rules are stable. Their implementation in Bazel is subject to Bazel's +The core rules are stable. Their implementation 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). +This repository aims to follow [semantic versioning](https://semver.org). 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 [How to contribute](CONTRIBUTING.md) page for information on our development workflow. From 4c091c3ebd4f028ef0297458175adadbd686caa3 Mon Sep 17 00:00:00 2001 From: Greg Roodt Date: Sun, 23 Jun 2024 13:57:44 +1000 Subject: [PATCH 093/345] refactor: Remove unused template substitution (#2004) Removing a minor nit. The variable seems unused. --- python/private/pypi/hub_repository.bzl | 1 - 1 file changed, 1 deletion(-) diff --git a/python/private/pypi/hub_repository.bzl b/python/private/pypi/hub_repository.bzl index 5e209d6f9f..40a3ab13e5 100644 --- a/python/private/pypi/hub_repository.bzl +++ b/python/private/pypi/hub_repository.bzl @@ -63,7 +63,6 @@ def _impl(rctx): for p in bzl_packages }), "%%MACRO_TMPL%%": macro_tmpl, - "%%NAME%%": rctx.attr.repo_name, }) hub_repository = repository_rule( From ea49937782fb0b969c72625f3b397f4bab53d412 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 23 Jun 2024 21:25:59 +0900 Subject: [PATCH 094/345] refactor: move the remaining PyPI related functions to private/pypi (#2006) A continuation of #2003, this time we finish moving the `pip_compile` stuff. Summary: - move multi_pip_parse to private/pypi and re-export - remove unused files leftover from #2003 - move repositories.bzl to private/pypi/deps.bzl - move pip_compile to private/pypi - move the pip_install tools to private --- BUILD.bazel | 1 - DEVELOPING.md | 2 +- MODULE.bazel | 4 +- examples/multi_python_versions/WORKSPACE | 4 - internal_setup.bzl | 4 +- python/BUILD.bazel | 15 +- python/pip.bzl | 245 +----------------- python/pip_install/BUILD.bazel | 30 +-- .../pip_repository_requirements.bzl.tmpl | 72 ----- python/pip_install/repositories.bzl | 129 +-------- python/pip_install/requirements.bzl | 147 +---------- .../tools/dependency_resolver/BUILD.bazel | 19 -- .../tools/wheel_installer/BUILD.bazel | 91 ------- python/private/bzlmod/internal_deps.bzl | 4 +- python/private/normalize_name.bzl | 1 - python/private/pypi/BUILD.bazel | 53 +++- .../pypi/dependency_resolver/BUILD.bazel | 7 + .../pypi}/dependency_resolver/__init__.py | 0 .../dependency_resolver.py | 0 python/private/pypi/deps.bzl | 143 ++++++++++ python/private/pypi/multi_pip_parse.bzl | 160 ++++++++++++ python/private/pypi/pip_compile.bzl | 167 ++++++++++++ .../tools => private/pypi}/requirements.txt | 0 python/private/pypi/whl_installer/BUILD.bazel | 36 +++ .../pypi/whl_installer}/arguments.py | 2 +- .../pypi/whl_installer}/namespace_pkgs.py | 0 .../pypi/whl_installer}/wheel.py | 0 .../pypi/whl_installer}/wheel_installer.py | 2 +- python/private/pypi/whl_library.bzl | 4 +- python/private/pypi/whl_library_alias.bzl | 99 +++++++ python/repositories.bzl | 4 +- .../compile_pip_requirements/WORKSPACE | 4 - .../WORKSPACE | 4 - tests/integration/pip_parse/WORKSPACE | 5 + tests/pypi/whl_installer/BUILD.bazel | 52 ++++ .../pypi/whl_installer}/arguments_test.py | 5 +- .../whl_installer}/namespace_pkgs_test.py | 2 +- .../whl_installer}/wheel_installer_test.py | 2 +- .../pypi/whl_installer}/wheel_test.py | 10 +- .../pycross/private/tools/BUILD.bazel | 2 +- .../pycross/private/tools/wheel_installer.py | 2 +- tools/private/update_deps/BUILD.bazel | 10 +- tools/private/update_deps/update_pip_deps.py | 24 +- 43 files changed, 777 insertions(+), 790 deletions(-) delete mode 100644 python/pip_install/pip_repository_requirements.bzl.tmpl delete mode 100644 python/pip_install/tools/dependency_resolver/BUILD.bazel delete mode 100644 python/pip_install/tools/wheel_installer/BUILD.bazel create mode 100644 python/private/pypi/dependency_resolver/BUILD.bazel rename python/{pip_install/tools => private/pypi}/dependency_resolver/__init__.py (100%) rename python/{pip_install/tools => private/pypi}/dependency_resolver/dependency_resolver.py (100%) create mode 100644 python/private/pypi/deps.bzl create mode 100644 python/private/pypi/multi_pip_parse.bzl create mode 100644 python/private/pypi/pip_compile.bzl rename python/{pip_install/tools => private/pypi}/requirements.txt (100%) create mode 100644 python/private/pypi/whl_installer/BUILD.bazel rename python/{pip_install/tools/wheel_installer => private/pypi/whl_installer}/arguments.py (98%) rename python/{pip_install/tools/wheel_installer => private/pypi/whl_installer}/namespace_pkgs.py (100%) rename python/{pip_install/tools/wheel_installer => private/pypi/whl_installer}/wheel.py (100%) rename python/{pip_install/tools/wheel_installer => private/pypi/whl_installer}/wheel_installer.py (98%) create mode 100644 python/private/pypi/whl_library_alias.bzl create mode 100644 tests/pypi/whl_installer/BUILD.bazel rename {python/pip_install/tools/wheel_installer => tests/pypi/whl_installer}/arguments_test.py (94%) rename {python/pip_install/tools/wheel_installer => tests/pypi/whl_installer}/namespace_pkgs_test.py (98%) rename {python/pip_install/tools/wheel_installer => tests/pypi/whl_installer}/wheel_installer_test.py (97%) rename {python/pip_install/tools/wheel_installer => tests/pypi/whl_installer}/wheel_test.py (97%) diff --git a/BUILD.bazel b/BUILD.bazel index c97f41dee2..038b56a0c6 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -40,7 +40,6 @@ filegroup( "internal_setup.bzl", "version.bzl", "//python:distribution", - "//python/pip_install:distribution", "//tools:distribution", "@rules_python_gazelle_plugin//:distribution", ], diff --git a/DEVELOPING.md b/DEVELOPING.md index 3c9e89d1d6..a70d3b171f 100644 --- a/DEVELOPING.md +++ b/DEVELOPING.md @@ -2,7 +2,7 @@ ## Updating internal dependencies -1. Modify the `./python/pip_install/tools/requirements.txt` file and run: +1. Modify the `./python/private/pypi/requirements.txt` file and run: ``` bazel run //tools/private/update_deps:update_pip_deps ``` diff --git a/MODULE.bazel b/MODULE.bazel index 3cdc47fb7b..735600b98d 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -16,8 +16,6 @@ bazel_dep(name = "protobuf", version = "24.4", repo_name = "com_google_protobuf" internal_deps = use_extension("//python/private/bzlmod:internal_deps.bzl", "internal_deps") use_repo( internal_deps, - "rules_python_internal", - # START: maintained by 'bazel run //tools/private/update_deps:update_pip_deps' "pypi__build", "pypi__click", "pypi__colorama", @@ -33,7 +31,7 @@ use_repo( "pypi__tomli", "pypi__wheel", "pypi__zipp", - # END: maintained by 'bazel run //tools/private/update_deps:update_pip_deps' + "rules_python_internal", ) # We need to do another use_extension call to expose the "pythons_hub" diff --git a/examples/multi_python_versions/WORKSPACE b/examples/multi_python_versions/WORKSPACE index f3a69ce769..4f731d95a8 100644 --- a/examples/multi_python_versions/WORKSPACE +++ b/examples/multi_python_versions/WORKSPACE @@ -9,10 +9,6 @@ load("@rules_python//python:repositories.bzl", "py_repositories", "python_regist py_repositories() -load("@rules_python//python/pip_install:repositories.bzl", "pip_install_dependencies") - -pip_install_dependencies() - default_python_version = "3.9" python_register_multi_toolchains( diff --git a/internal_setup.bzl b/internal_setup.bzl index bb62611213..1967c0e568 100644 --- a/internal_setup.bzl +++ b/internal_setup.bzl @@ -22,8 +22,8 @@ load("@rules_bazel_integration_test//bazel_integration_test:deps.bzl", "bazel_in load("@rules_bazel_integration_test//bazel_integration_test:repo_defs.bzl", "bazel_binaries") load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") load("//:version.bzl", "SUPPORTED_BAZEL_VERSIONS") -load("//python/pip_install:repositories.bzl", "pip_install_dependencies") load("//python/private:internal_config_repo.bzl", "internal_config_repo") # buildifier: disable=bzl-visibility +load("//python/private/pypi:deps.bzl", "pypi_deps") # buildifier: disable=bzl-visibility def rules_python_internal_setup(): """Setup for rules_python tests and tools.""" @@ -31,7 +31,7 @@ def rules_python_internal_setup(): internal_config_repo(name = "rules_python_internal") # Because we don't use the pip_install rule, we have to call this to fetch its deps - pip_install_dependencies() + pypi_deps() bazel_skylib_workspace() diff --git a/python/BUILD.bazel b/python/BUILD.bazel index 29b495bf90..96b2282221 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -39,6 +39,7 @@ filegroup( "//python/constraints:distribution", "//python/entry_points:distribution", "//python/extensions:distribution", + "//python/pip_install:distribution", "//python/private:distribution", "//python/runfiles:distribution", ], @@ -96,12 +97,12 @@ bzl_library( name = "pip_bzl", srcs = ["pip.bzl"], deps = [ - "//python/pip_install:pip_repository_bzl", - "//python/pip_install:repositories_bzl", - "//python/pip_install:requirements_bzl", - "//python/private:bzlmod_enabled_bzl", - "//python/private:full_version_bzl", - "//python/private/pypi:render_pkg_aliases_bzl", + "//python/private:normalize_name_bzl", + "//python/private/pypi:multi_pip_parse_bzl", + "//python/private/pypi:package_annotation_bzl", + "//python/private/pypi:pip_compile_bzl", + "//python/private/pypi:pip_repository_bzl", + "//python/private/pypi:whl_library_alias_bzl", "//python/private/whl_filegroup:whl_filegroup_bzl", ], ) @@ -210,7 +211,6 @@ bzl_library( srcs = ["repositories.bzl"], deps = [ ":versions_bzl", - "//python/pip_install:repositories_bzl", "//python/private:auth_bzl", "//python/private:bazel_tools_bzl", "//python/private:bzlmod_enabled_bzl", @@ -219,6 +219,7 @@ bzl_library( "//python/private:internal_config_repo_bzl", "//python/private:repo_utils_bzl", "//python/private:toolchains_repo_bzl", + "//python/private/pypi:deps_bzl", ], ) diff --git a/python/pip.bzl b/python/pip.bzl index f1c74dd964..a1a67200b1 100644 --- a/python/pip.bzl +++ b/python/pip.bzl @@ -19,250 +19,27 @@ symbols should not be used and they are either undocumented here or marked as for internal use only. """ -load("//python/pip_install:requirements.bzl", _compile_pip_requirements = "compile_pip_requirements") -load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") -load("//python/private:full_version.bzl", "full_version") load("//python/private:normalize_name.bzl", "normalize_name") +load("//python/private/pypi:multi_pip_parse.bzl", _multi_pip_parse = "multi_pip_parse") load("//python/private/pypi:package_annotation.bzl", _package_annotation = "package_annotation") +load("//python/private/pypi:pip_compile.bzl", "pip_compile") load("//python/private/pypi:pip_repository.bzl", "pip_repository") -load("//python/private/pypi:render_pkg_aliases.bzl", "NO_MATCH_ERROR_MESSAGE_TEMPLATE") +load("//python/private/pypi:whl_library_alias.bzl", _whl_library_alias = "whl_library_alias") load("//python/private/whl_filegroup:whl_filegroup.bzl", _whl_filegroup = "whl_filegroup") -compile_pip_requirements = _compile_pip_requirements +compile_pip_requirements = pip_compile package_annotation = _package_annotation pip_parse = pip_repository whl_filegroup = _whl_filegroup -def _multi_pip_parse_impl(rctx): - rules_python = rctx.attr._rules_python_workspace.workspace_name - load_statements = [] - install_deps_calls = [] - process_requirements_calls = [] - for python_version, pypi_repository in rctx.attr.pip_parses.items(): - sanitized_python_version = python_version.replace(".", "_") - load_statement = """\ -load( - "@{pypi_repository}//:requirements.bzl", - _{sanitized_python_version}_install_deps = "install_deps", - _{sanitized_python_version}_all_requirements = "all_requirements", -)""".format( - pypi_repository = pypi_repository, - sanitized_python_version = sanitized_python_version, - ) - load_statements.append(load_statement) - process_requirements_call = """\ -_process_requirements( - pkg_labels = _{sanitized_python_version}_all_requirements, - python_version = "{python_version}", - repo_prefix = "{pypi_repository}_", -)""".format( - pypi_repository = pypi_repository, - python_version = python_version, - sanitized_python_version = sanitized_python_version, - ) - process_requirements_calls.append(process_requirements_call) - install_deps_call = """ _{sanitized_python_version}_install_deps(**whl_library_kwargs)""".format( - sanitized_python_version = sanitized_python_version, - ) - install_deps_calls.append(install_deps_call) - - # NOTE @aignas 2023-10-31: I am not sure it is possible to render aliases - # for all of the packages using the `render_pkg_aliases` function because - # we need to know what the list of packages for each version is and then - # we would be creating directories for each. - macro_tmpl = "@%s_{}//:{}" % rctx.attr.name - - requirements_bzl = """\ -# Generated by python/pip.bzl - -load("@{rules_python}//python:pip.bzl", "whl_library_alias", "pip_utils") -{load_statements} - -_wheel_names = [] -_version_map = dict() -def _process_requirements(pkg_labels, python_version, repo_prefix): - for pkg_label in pkg_labels: - wheel_name = Label(pkg_label).package - if not wheel_name: - # We are dealing with the cases where we don't have aliases. - workspace_name = Label(pkg_label).workspace_name - wheel_name = workspace_name[len(repo_prefix):] - - _wheel_names.append(wheel_name) - if not wheel_name in _version_map: - _version_map[wheel_name] = dict() - _version_map[wheel_name][python_version] = repo_prefix - -{process_requirements_calls} - -def requirement(name): - return "{macro_tmpl}".format(pip_utils.normalize_name(name), "pkg") - -def whl_requirement(name): - return "{macro_tmpl}".format(pip_utils.normalize_name(name), "whl") - -def data_requirement(name): - return "{macro_tmpl}".format(pip_utils.normalize_name(name), "data") - -def dist_info_requirement(name): - return "{macro_tmpl}".format(pip_utils.normalize_name(name), "dist_info") - -def install_deps(**whl_library_kwargs): -{install_deps_calls} - for wheel_name in _wheel_names: - whl_library_alias( - name = "{name}_" + wheel_name, - wheel_name = wheel_name, - default_version = "{default_version}", - version_map = _version_map[wheel_name], - ) -""".format( - name = rctx.attr.name, - install_deps_calls = "\n".join(install_deps_calls), - load_statements = "\n".join(load_statements), - macro_tmpl = macro_tmpl, - process_requirements_calls = "\n".join(process_requirements_calls), - rules_python = rules_python, - default_version = rctx.attr.default_version, - ) - rctx.file("requirements.bzl", requirements_bzl) - rctx.file("BUILD.bazel", "exports_files(['requirements.bzl'])") - -_multi_pip_parse = repository_rule( - _multi_pip_parse_impl, - attrs = { - "default_version": attr.string(), - "pip_parses": attr.string_dict(), - "_rules_python_workspace": attr.label(default = Label("//:WORKSPACE")), - }, -) - -def _whl_library_alias_impl(rctx): - rules_python = rctx.attr._rules_python_workspace.workspace_name - if rctx.attr.default_version: - default_repo_prefix = rctx.attr.version_map[rctx.attr.default_version] - else: - default_repo_prefix = None - version_map = rctx.attr.version_map.items() - build_content = ["# Generated by python/pip.bzl"] - for alias_name in ["pkg", "whl", "data", "dist_info"]: - build_content.append(_whl_library_render_alias_target( - alias_name = alias_name, - default_repo_prefix = default_repo_prefix, - rules_python = rules_python, - version_map = version_map, - wheel_name = rctx.attr.wheel_name, - )) - rctx.file("BUILD.bazel", "\n".join(build_content)) - -def _whl_library_render_alias_target( - alias_name, - default_repo_prefix, - rules_python, - version_map, - wheel_name): - # The template below adds one @, but under bzlmod, the name - # is canonical, so we have to add a second @. - if BZLMOD_ENABLED: - rules_python = "@" + rules_python - - alias = ["""\ -alias( - name = "{alias_name}", - actual = select({{""".format(alias_name = alias_name)] - for [python_version, repo_prefix] in version_map: - alias.append("""\ - "@{rules_python}//python/config_settings:is_python_{full_python_version}": "{actual}",""".format( - full_python_version = full_version(python_version), - actual = "@{repo_prefix}{wheel_name}//:{alias_name}".format( - repo_prefix = repo_prefix, - wheel_name = wheel_name, - alias_name = alias_name, - ), - rules_python = rules_python, - )) - if default_repo_prefix: - default_actual = "@{repo_prefix}{wheel_name}//:{alias_name}".format( - repo_prefix = default_repo_prefix, - wheel_name = wheel_name, - alias_name = alias_name, - ) - alias.append(' "//conditions:default": "{default_actual}",'.format( - default_actual = default_actual, - )) - - alias.append(" },") # Close select expression condition dict - if not default_repo_prefix: - supported_versions = sorted([python_version for python_version, _ in version_map]) - alias.append(' no_match_error="""{}""",'.format( - NO_MATCH_ERROR_MESSAGE_TEMPLATE.format( - supported_versions = ", ".join(supported_versions), - rules_python = rules_python, - ), - )) - alias.append(" ),") # Close the select expression - alias.append(' visibility = ["//visibility:public"],') - alias.append(")") # Close the alias() expression - return "\n".join(alias) - -whl_library_alias = repository_rule( - _whl_library_alias_impl, - attrs = { - "default_version": attr.string( - mandatory = False, - doc = "Optional Python version in major.minor format, e.g. '3.10'." + - "The Python version of the wheel to use when the versions " + - "from `version_map` don't match. This allows the default " + - "(version unaware) rules to match and select a wheel. If " + - "not specified, then the default rules won't be able to " + - "resolve a wheel and an error will occur.", - ), - "version_map": attr.string_dict(mandatory = True), - "wheel_name": attr.string(mandatory = True), - "_rules_python_workspace": attr.label(default = Label("//:WORKSPACE")), - }, -) - -def multi_pip_parse(name, default_version, python_versions, python_interpreter_target, requirements_lock, **kwargs): - """NOT INTENDED FOR DIRECT USE! - - This is intended to be used by the multi_pip_parse implementation in the template of the - multi_toolchain_aliases repository rule. - - Args: - name: the name of the multi_pip_parse repository. - default_version: the default Python version. - python_versions: all Python toolchain versions currently registered. - python_interpreter_target: a dictionary which keys are Python versions and values are resolved host interpreters. - requirements_lock: a dictionary which keys are Python versions and values are locked requirements files. - **kwargs: extra arguments passed to all wrapped pip_parse. - - Returns: - The internal implementation of multi_pip_parse repository rule. - """ - pip_parses = {} - for python_version in python_versions: - if not python_version in python_interpreter_target: - fail("Missing python_interpreter_target for Python version %s in '%s'" % (python_version, name)) - if not python_version in requirements_lock: - fail("Missing requirements_lock for Python version %s in '%s'" % (python_version, name)) - - pip_parse_name = name + "_" + python_version.replace(".", "_") - pip_parse( - name = pip_parse_name, - python_interpreter_target = python_interpreter_target[python_version], - requirements_lock = requirements_lock[python_version], - **kwargs - ) - pip_parses[python_version] = pip_parse_name - - return _multi_pip_parse( - name = name, - default_version = default_version, - pip_parses = pip_parses, - ) - # Extra utilities visible to rules_python users. pip_utils = struct( normalize_name = normalize_name, ) + +# The following are only exported here because they are used from +# multi_toolchain_aliases repository_rule, not intended for public use. +# +# See ./private/toolchains_repo.bzl +multi_pip_parse = _multi_pip_parse +whl_library_alias = _whl_library_alias diff --git a/python/pip_install/BUILD.bazel b/python/pip_install/BUILD.bazel index 1894c4d915..683199f807 100644 --- a/python/pip_install/BUILD.bazel +++ b/python/pip_install/BUILD.bazel @@ -32,43 +32,21 @@ bzl_library( bzl_library( name = "requirements_bzl", srcs = ["requirements.bzl"], - deps = [ - ":repositories_bzl", - "//python:defs_bzl", - ], + deps = ["//python/private/pypi:pip_compile_bzl"], ) bzl_library( name = "repositories_bzl", srcs = ["repositories.bzl"], deps = [ - "//:version_bzl", - "//python/private:bazel_tools_bzl", - "@bazel_skylib//lib:versions", + "//python/private/pypi:deps_bzl", ], ) filegroup( name = "distribution", - srcs = glob(["*.bzl"]) + [ - "BUILD.bazel", - "pip_repository_requirements.bzl.tmpl", - "//python/pip_install/tools/dependency_resolver:distribution", - "//python/pip_install/tools/wheel_installer:distribution", - ], - visibility = ["//:__pkg__"], -) - -filegroup( - name = "repositories", - srcs = ["repositories.bzl"], - visibility = ["//tools/private/update_deps:__pkg__"], -) - -filegroup( - name = "requirements_txt", - srcs = ["tools/requirements.txt"], - visibility = ["//tools/private/update_deps:__pkg__"], + srcs = glob(["**"]), + visibility = ["//python:__pkg__"], ) filegroup( diff --git a/python/pip_install/pip_repository_requirements.bzl.tmpl b/python/pip_install/pip_repository_requirements.bzl.tmpl deleted file mode 100644 index 2f4bcd6916..0000000000 --- a/python/pip_install/pip_repository_requirements.bzl.tmpl +++ /dev/null @@ -1,72 +0,0 @@ -"""Starlark representation of locked requirements. - -@generated by rules_python pip_parse repository rule. -""" - -%%IMPORTS%% - -all_requirements = %%ALL_REQUIREMENTS%% - -all_whl_requirements_by_package = %%ALL_WHL_REQUIREMENTS_BY_PACKAGE%% - -all_whl_requirements = all_whl_requirements_by_package.values() - -all_data_requirements = %%ALL_DATA_REQUIREMENTS%% - -_packages = %%PACKAGES%% -_config = %%CONFIG%% -_annotations = %%ANNOTATIONS%% - -def requirement(name): - return "%%MACRO_TMPL%%".format(pip_utils.normalize_name(name), "pkg") - -def whl_requirement(name): - return "%%MACRO_TMPL%%".format(pip_utils.normalize_name(name), "whl") - -def data_requirement(name): - return "%%MACRO_TMPL%%".format(pip_utils.normalize_name(name), "data") - -def dist_info_requirement(name): - return "%%MACRO_TMPL%%".format(pip_utils.normalize_name(name), "dist_info") - -def _get_annotation(requirement): - # This expects to parse `setuptools==58.2.0 --hash=sha256:2551203ae6955b9876741a26ab3e767bb3242dafe86a32a749ea0d78b6792f11` - # down to `setuptools`. - name = requirement.split(" ")[0].split("=")[0].split("[")[0] - return _annotations.get(name) - -def install_deps(**whl_library_kwargs): - """Repository rule macro. Install dependencies from `pip_parse`. - - Args: - **whl_library_kwargs: Additional arguments which will flow to underlying - `whl_library` calls. See pip_repository.bzl for details. - """ - - # Set up the requirement groups - all_requirement_groups = %%ALL_REQUIREMENT_GROUPS%% - - requirement_group_mapping = { - requirement: group_name - for group_name, group_requirements in all_requirement_groups.items() - for requirement in group_requirements - } - - # %%GROUP_LIBRARY%% - - # Install wheels which may be participants in a group - whl_config = dict(_config) - whl_config.update(whl_library_kwargs) - - for name, requirement in _packages: - group_name = requirement_group_mapping.get(name.replace("%%NAME%%_", "")) - group_deps = all_requirement_groups.get(group_name, []) - - whl_library( - name = name, - requirement = requirement, - group_name = group_name, - group_deps = group_deps, - annotation = _get_annotation(requirement), - **whl_config - ) diff --git a/python/pip_install/repositories.bzl b/python/pip_install/repositories.bzl index 3f91860b8b..5231d1f0a1 100644 --- a/python/pip_install/repositories.bzl +++ b/python/pip_install/repositories.bzl @@ -14,131 +14,6 @@ "" -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") +load("//python/private/pypi:deps.bzl", "pypi_deps") -_RULE_DEPS = [ - # START: maintained by 'bazel run //tools/private/update_deps:update_pip_deps' - ( - "pypi__build", - "https://files.pythonhosted.org/packages/e2/03/f3c8ba0a6b6e30d7d18c40faab90807c9bb5e9a1e3b2fe2008af624a9c97/build-1.2.1-py3-none-any.whl", - "75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4", - ), - ( - "pypi__click", - "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", - "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - ), - ( - "pypi__colorama", - "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", - "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", - ), - ( - "pypi__importlib_metadata", - "https://files.pythonhosted.org/packages/2d/0a/679461c511447ffaf176567d5c496d1de27cbe34a87df6677d7171b2fbd4/importlib_metadata-7.1.0-py3-none-any.whl", - "30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570", - ), - ( - "pypi__installer", - "https://files.pythonhosted.org/packages/e5/ca/1172b6638d52f2d6caa2dd262ec4c811ba59eee96d54a7701930726bce18/installer-0.7.0-py3-none-any.whl", - "05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53", - ), - ( - "pypi__more_itertools", - "https://files.pythonhosted.org/packages/50/e2/8e10e465ee3987bb7c9ab69efb91d867d93959095f4807db102d07995d94/more_itertools-10.2.0-py3-none-any.whl", - "686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684", - ), - ( - "pypi__packaging", - "https://files.pythonhosted.org/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl", - "2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", - ), - ( - "pypi__pep517", - "https://files.pythonhosted.org/packages/25/6e/ca4a5434eb0e502210f591b97537d322546e4833dcb4d470a48c375c5540/pep517-0.13.1-py3-none-any.whl", - "31b206f67165b3536dd577c5c3f1518e8fbaf38cbc57efff8369a392feff1721", - ), - ( - "pypi__pip", - "https://files.pythonhosted.org/packages/8a/6a/19e9fe04fca059ccf770861c7d5721ab4c2aebc539889e97c7977528a53b/pip-24.0-py3-none-any.whl", - "ba0d021a166865d2265246961bec0152ff124de910c5cc39f1156ce3fa7c69dc", - ), - ( - "pypi__pip_tools", - "https://files.pythonhosted.org/packages/0d/dc/38f4ce065e92c66f058ea7a368a9c5de4e702272b479c0992059f7693941/pip_tools-7.4.1-py3-none-any.whl", - "4c690e5fbae2f21e87843e89c26191f0d9454f362d8acdbd695716493ec8b3a9", - ), - ( - "pypi__pyproject_hooks", - "https://files.pythonhosted.org/packages/ae/f3/431b9d5fe7d14af7a32340792ef43b8a714e7726f1d7b69cc4e8e7a3f1d7/pyproject_hooks-1.1.0-py3-none-any.whl", - "7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2", - ), - ( - "pypi__setuptools", - "https://files.pythonhosted.org/packages/de/88/70c5767a0e43eb4451c2200f07d042a4bcd7639276003a9c54a68cfcc1f8/setuptools-70.0.0-py3-none-any.whl", - "54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4", - ), - ( - "pypi__tomli", - "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", - "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", - ), - ( - "pypi__wheel", - "https://files.pythonhosted.org/packages/7d/cd/d7460c9a869b16c3dd4e1e403cce337df165368c71d6af229a74699622ce/wheel-0.43.0-py3-none-any.whl", - "55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81", - ), - ( - "pypi__zipp", - "https://files.pythonhosted.org/packages/da/55/a03fd7240714916507e1fcf7ae355bd9d9ed2e6db492595f1a67f61681be/zipp-3.18.2-py3-none-any.whl", - "dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e", - ), - # END: maintained by 'bazel run //tools/private/update_deps:update_pip_deps' -] - -_GENERIC_WHEEL = """\ -package(default_visibility = ["//visibility:public"]) - -load("@rules_python//python:defs.bzl", "py_library") - -py_library( - name = "lib", - srcs = glob(["**/*.py"]), - data = glob(["**/*"], exclude=[ - # These entries include those put into user-installed dependencies by - # data_exclude in /python/pip_install/tools/bazel.py - # to avoid non-determinism following pip install's behavior. - "**/*.py", - "**/*.pyc", - "**/*.pyc.*", # During pyc creation, temp files named *.pyc.NNN are created - "**/* *", - "**/*.dist-info/RECORD", - "BUILD", - "WORKSPACE", - ]), - # This makes this directory a top-level in the python import - # search path for anything that depends on this. - imports = ["."], -) -""" - -# Collate all the repository names so they can be easily consumed -all_requirements = [name for (name, _, _) in _RULE_DEPS] - -def requirement(pkg): - return Label("@pypi__" + pkg + "//:lib") - -def pip_install_dependencies(): - """ - Fetch dependencies these rules depend on. Workspaces that use the pip_parse rule can call this. - """ - for (name, url, sha256) in _RULE_DEPS: - maybe( - http_archive, - name, - url = url, - sha256 = sha256, - type = "zip", - build_file_content = _GENERIC_WHEEL, - ) +pip_install_dependencies = pypi_deps diff --git a/python/pip_install/requirements.bzl b/python/pip_install/requirements.bzl index 5caf7629f5..6ae3f8fef1 100644 --- a/python/pip_install/requirements.bzl +++ b/python/pip_install/requirements.bzl @@ -14,149 +14,6 @@ """Rules to verify and update pip-compile locked requirements.txt""" -load("//python:defs.bzl", _py_binary = "py_binary", _py_test = "py_test") -load("//python/pip_install:repositories.bzl", "requirement") +load("//python/private/pypi:pip_compile.bzl", "pip_compile") -def compile_pip_requirements( - name, - src = None, - extra_args = [], - extra_deps = [], - generate_hashes = True, - py_binary = _py_binary, - py_test = _py_test, - requirements_in = None, - requirements_txt = None, - requirements_darwin = None, - requirements_linux = None, - requirements_windows = None, - visibility = ["//visibility:private"], - tags = None, - **kwargs): - """Generates targets for managing pip dependencies with pip-compile. - - By default this rules generates a filegroup named "[name]" which can be included in the data - of some other compile_pip_requirements rule that references these requirements - (e.g. with `-r ../other/requirements.txt`). - - It also generates two targets for running pip-compile: - - - validate with `bazel test [name]_test` - - update with `bazel run [name].update` - - If you are using a version control system, the requirements.txt generated by this rule should - be checked into it to ensure that all developers/users have the same dependency versions. - - Args: - name: base name for generated targets, typically "requirements". - src: file containing inputs to dependency resolution. If not specified, - defaults to `pyproject.toml`. Supported formats are: - * a requirements text file, usually named `requirements.in` - * A `.toml` file, where the `project.dependencies` list is used as per - [PEP621](https://peps.python.org/pep-0621/). - extra_args: passed to pip-compile. - extra_deps: extra dependencies passed to pip-compile. - generate_hashes: whether to put hashes in the requirements_txt file. - py_binary: the py_binary rule to be used. - py_test: the py_test rule to be used. - requirements_in: file expressing desired dependencies. Deprecated, use src instead. - requirements_txt: result of "compiling" the requirements.in file. - requirements_linux: File of linux specific resolve output to check validate if requirement.in has changes. - requirements_darwin: File of darwin specific resolve output to check validate if requirement.in has changes. - requirements_windows: File of windows specific resolve output to check validate if requirement.in has changes. - tags: tagging attribute common to all build rules, passed to both the _test and .update rules. - visibility: passed to both the _test and .update rules. - **kwargs: other bazel attributes passed to the "_test" rule. - """ - if requirements_in and src: - fail("Only one of 'src' and 'requirements_in' attributes can be used") - else: - src = requirements_in or src or "pyproject.toml" - - requirements_txt = name + ".txt" if requirements_txt == None else requirements_txt - - # "Default" target produced by this macro - # Allow a compile_pip_requirements rule to include another one in the data - # for a requirements file that does `-r ../other/requirements.txt` - native.filegroup( - name = name, - srcs = kwargs.pop("data", []) + [requirements_txt], - visibility = visibility, - ) - - data = [name, requirements_txt, src] + [f for f in (requirements_linux, requirements_darwin, requirements_windows) if f != None] - - # Use the Label constructor so this is expanded in the context of the file - # where it appears, which is to say, in @rules_python - pip_compile = Label("//python/pip_install/tools/dependency_resolver:dependency_resolver.py") - - loc = "$(rlocationpath {})" - - args = [ - loc.format(src), - loc.format(requirements_txt), - "//%s:%s.update" % (native.package_name(), name), - "--resolver=backtracking", - "--allow-unsafe", - ] - if generate_hashes: - args.append("--generate-hashes") - if requirements_linux: - args.append("--requirements-linux={}".format(loc.format(requirements_linux))) - if requirements_darwin: - args.append("--requirements-darwin={}".format(loc.format(requirements_darwin))) - if requirements_windows: - args.append("--requirements-windows={}".format(loc.format(requirements_windows))) - args.extend(extra_args) - - deps = [ - requirement("build"), - requirement("click"), - requirement("colorama"), - requirement("importlib_metadata"), - requirement("more_itertools"), - requirement("packaging"), - requirement("pep517"), - requirement("pip"), - requirement("pip_tools"), - requirement("pyproject_hooks"), - requirement("setuptools"), - requirement("tomli"), - requirement("zipp"), - Label("//python/runfiles:runfiles"), - ] + extra_deps - - tags = tags or [] - tags.append("requires-network") - tags.append("no-remote-exec") - tags.append("no-sandbox") - attrs = { - "args": args, - "data": data, - "deps": deps, - "main": pip_compile, - "srcs": [pip_compile], - "tags": tags, - "visibility": visibility, - } - - # cheap way to detect the bazel version - _bazel_version_4_or_greater = "propeller_optimize" in dir(native) - - # Bazel 4.0 added the "env" attribute to py_test/py_binary - if _bazel_version_4_or_greater: - attrs["env"] = kwargs.pop("env", {}) - - py_binary( - name = name + ".update", - **attrs - ) - - timeout = kwargs.pop("timeout", "short") - - py_test( - name = name + "_test", - timeout = timeout, - # kwargs could contain test-specific attributes like size or timeout - **dict(attrs, **kwargs) - ) +compile_pip_requirements = pip_compile diff --git a/python/pip_install/tools/dependency_resolver/BUILD.bazel b/python/pip_install/tools/dependency_resolver/BUILD.bazel deleted file mode 100644 index 467b009332..0000000000 --- a/python/pip_install/tools/dependency_resolver/BUILD.bazel +++ /dev/null @@ -1,19 +0,0 @@ -exports_files(["dependency_resolver.py"]) - -filegroup( - name = "distribution", - srcs = glob( - ["*"], - exclude = ["*_test.py"], - ), - visibility = ["//python/pip_install:__subpackages__"], -) - -filegroup( - name = "py_srcs", - srcs = glob( - include = ["**/*.py"], - exclude = ["**/*_test.py"], - ), - visibility = ["//:__subpackages__"], -) diff --git a/python/pip_install/tools/wheel_installer/BUILD.bazel b/python/pip_install/tools/wheel_installer/BUILD.bazel deleted file mode 100644 index 0c24d5a489..0000000000 --- a/python/pip_install/tools/wheel_installer/BUILD.bazel +++ /dev/null @@ -1,91 +0,0 @@ -load("//python:defs.bzl", "py_binary", "py_library", "py_test") -load("//python/pip_install:repositories.bzl", "requirement") - -py_library( - name = "lib", - srcs = [ - "arguments.py", - "namespace_pkgs.py", - "wheel.py", - "wheel_installer.py", - ], - visibility = ["//third_party/rules_pycross/pycross/private:__subpackages__"], - deps = [ - requirement("installer"), - requirement("pip"), - requirement("packaging"), - requirement("setuptools"), - ], -) - -py_binary( - name = "wheel_installer", - srcs = [ - "wheel_installer.py", - ], - deps = [":lib"], -) - -py_test( - name = "arguments_test", - size = "small", - srcs = [ - "arguments_test.py", - ], - deps = [ - ":lib", - ], -) - -py_test( - name = "namespace_pkgs_test", - size = "small", - srcs = [ - "namespace_pkgs_test.py", - ], - deps = [ - ":lib", - ], -) - -py_test( - name = "wheel_test", - size = "small", - srcs = [ - "wheel_test.py", - ], - data = ["//examples/wheel:minimal_with_py_package"], - deps = [ - ":lib", - ], -) - -py_test( - name = "wheel_installer_test", - size = "small", - srcs = [ - "wheel_installer_test.py", - ], - data = ["//examples/wheel:minimal_with_py_package"], - deps = [ - ":lib", - ], -) - -filegroup( - name = "distribution", - srcs = glob( - ["*"], - exclude = ["*_test.py"], - ), - visibility = ["//python/pip_install:__subpackages__"], -) - -filegroup( - name = "py_srcs", - srcs = glob( - include = ["**/*.py"], - exclude = ["**/*_test.py"], - ), - visibility = ["//:__subpackages__"], -) diff --git a/python/private/bzlmod/internal_deps.bzl b/python/private/bzlmod/internal_deps.bzl index 62ca71fecc..e0eca9ef3b 100644 --- a/python/private/bzlmod/internal_deps.bzl +++ b/python/private/bzlmod/internal_deps.bzl @@ -9,12 +9,12 @@ "Python toolchain module extension for internal rule use" load("@bazel_skylib//lib:modules.bzl", "modules") -load("//python/pip_install:repositories.bzl", "pip_install_dependencies") load("//python/private:internal_config_repo.bzl", "internal_config_repo") +load("//python/private/pypi:deps.bzl", "pypi_deps") def _internal_deps(): internal_config_repo(name = "rules_python_internal") - pip_install_dependencies() + pypi_deps() internal_deps = modules.as_extension( _internal_deps, diff --git a/python/private/normalize_name.bzl b/python/private/normalize_name.bzl index aaeca803b9..7898222e41 100644 --- a/python/private/normalize_name.bzl +++ b/python/private/normalize_name.bzl @@ -38,7 +38,6 @@ Also see Python spec on normalizing package names: https://packaging.python.org/en/latest/specifications/name-normalization/ """ -# Keep in sync with ../pip_install/tools/lib/bazel.py def normalize_name(name): """normalize a PyPI package name and return a valid bazel label. diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel index 1530837f7d..e7ae735531 100644 --- a/python/private/pypi/BUILD.bazel +++ b/python/private/pypi/BUILD.bazel @@ -21,7 +21,13 @@ licenses(["notice"]) filegroup( name = "distribution", - srcs = glob(["**"]), + srcs = glob( + ["**"], + exclude = ["requirements.txt"], + ) + [ + "//python/private/pypi/dependency_resolver:distribution", + "//python/private/pypi/whl_installer:distribution", + ], visibility = ["//python/private:__pkg__"], ) @@ -29,7 +35,16 @@ filegroup( filegroup( name = "bzl", srcs = glob(["**/*.bzl"]), - visibility = ["//python/private:__pkg__"], + visibility = [ + "//python/private:__pkg__", + "//tools/private:__pkg__", + ], +) + +filegroup( + name = "requirements_txt", + srcs = ["requirements.txt"], + visibility = ["//tools/private/update_deps:__pkg__"], ) # Keep sorted by library name and keep the files named by the main symbol they export @@ -66,6 +81,14 @@ bzl_library( deps = ["flags_bzl"], ) +bzl_library( + name = "deps_bzl", + srcs = ["deps.bzl"], + deps = [ + "//python/private:bazel_tools_bzl", + ], +) + bzl_library( name = "flags_bzl", srcs = ["flags.bzl"], @@ -118,6 +141,12 @@ bzl_library( srcs = ["labels.bzl"], ) +bzl_library( + name = "multi_pip_parse_bzl", + srcs = ["multi_pip_parse.bzl"], + deps = ["pip_repository_bzl"], +) + bzl_library( name = "package_annotation_bzl", srcs = ["package_annotation.bzl"], @@ -158,6 +187,15 @@ bzl_library( ], ) +bzl_library( + name = "pip_compile_bzl", + srcs = ["pip_compile.bzl"], + deps = [ + ":deps_bzl", + "//python:defs_bzl", + ], +) + bzl_library( name = "pip_repository_bzl", srcs = ["pip_repository.bzl"], @@ -203,18 +241,27 @@ bzl_library( ], ) +bzl_library( + name = "whl_library_alias_bzl", + srcs = ["whl_library_alias.bzl"], + deps = [ + ":render_pkg_aliases_bzl", + "//python/private:full_version_bzl", + ], +) + bzl_library( name = "whl_library_bzl", srcs = ["whl_library.bzl"], deps = [ ":attrs_bzl", + ":deps_bzl", ":generate_whl_library_build_bazel_bzl", ":parse_whl_name_bzl", ":patch_whl_bzl", ":whl_target_platforms_bzl", "//python:repositories_bzl", "//python:versions_bzl", - "//python/pip_install:repositories_bzl", "//python/private:auth_bzl", "//python/private:envsubst_bzl", "//python/private:repo_utils_bzl", diff --git a/python/private/pypi/dependency_resolver/BUILD.bazel b/python/private/pypi/dependency_resolver/BUILD.bazel new file mode 100644 index 0000000000..9531b55552 --- /dev/null +++ b/python/private/pypi/dependency_resolver/BUILD.bazel @@ -0,0 +1,7 @@ +exports_files(["dependency_resolver.py"]) + +filegroup( + name = "distribution", + srcs = glob(["**"]), + visibility = ["//python/private/pypi:__subpackages__"], +) diff --git a/python/pip_install/tools/dependency_resolver/__init__.py b/python/private/pypi/dependency_resolver/__init__.py similarity index 100% rename from python/pip_install/tools/dependency_resolver/__init__.py rename to python/private/pypi/dependency_resolver/__init__.py diff --git a/python/pip_install/tools/dependency_resolver/dependency_resolver.py b/python/private/pypi/dependency_resolver/dependency_resolver.py similarity index 100% rename from python/pip_install/tools/dependency_resolver/dependency_resolver.py rename to python/private/pypi/dependency_resolver/dependency_resolver.py diff --git a/python/private/pypi/deps.bzl b/python/private/pypi/deps.bzl new file mode 100644 index 0000000000..81bef7aaab --- /dev/null +++ b/python/private/pypi/deps.bzl @@ -0,0 +1,143 @@ +# 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. + +"" + +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") +load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") + +_RULE_DEPS = [ + # START: maintained by 'bazel run //tools/private/update_deps:update_pip_deps' + ( + "pypi__build", + "https://files.pythonhosted.org/packages/e2/03/f3c8ba0a6b6e30d7d18c40faab90807c9bb5e9a1e3b2fe2008af624a9c97/build-1.2.1-py3-none-any.whl", + "75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4", + ), + ( + "pypi__click", + "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", + "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + ), + ( + "pypi__colorama", + "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", + "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", + ), + ( + "pypi__importlib_metadata", + "https://files.pythonhosted.org/packages/2d/0a/679461c511447ffaf176567d5c496d1de27cbe34a87df6677d7171b2fbd4/importlib_metadata-7.1.0-py3-none-any.whl", + "30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570", + ), + ( + "pypi__installer", + "https://files.pythonhosted.org/packages/e5/ca/1172b6638d52f2d6caa2dd262ec4c811ba59eee96d54a7701930726bce18/installer-0.7.0-py3-none-any.whl", + "05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53", + ), + ( + "pypi__more_itertools", + "https://files.pythonhosted.org/packages/50/e2/8e10e465ee3987bb7c9ab69efb91d867d93959095f4807db102d07995d94/more_itertools-10.2.0-py3-none-any.whl", + "686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684", + ), + ( + "pypi__packaging", + "https://files.pythonhosted.org/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl", + "2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + ), + ( + "pypi__pep517", + "https://files.pythonhosted.org/packages/25/6e/ca4a5434eb0e502210f591b97537d322546e4833dcb4d470a48c375c5540/pep517-0.13.1-py3-none-any.whl", + "31b206f67165b3536dd577c5c3f1518e8fbaf38cbc57efff8369a392feff1721", + ), + ( + "pypi__pip", + "https://files.pythonhosted.org/packages/8a/6a/19e9fe04fca059ccf770861c7d5721ab4c2aebc539889e97c7977528a53b/pip-24.0-py3-none-any.whl", + "ba0d021a166865d2265246961bec0152ff124de910c5cc39f1156ce3fa7c69dc", + ), + ( + "pypi__pip_tools", + "https://files.pythonhosted.org/packages/0d/dc/38f4ce065e92c66f058ea7a368a9c5de4e702272b479c0992059f7693941/pip_tools-7.4.1-py3-none-any.whl", + "4c690e5fbae2f21e87843e89c26191f0d9454f362d8acdbd695716493ec8b3a9", + ), + ( + "pypi__pyproject_hooks", + "https://files.pythonhosted.org/packages/ae/f3/431b9d5fe7d14af7a32340792ef43b8a714e7726f1d7b69cc4e8e7a3f1d7/pyproject_hooks-1.1.0-py3-none-any.whl", + "7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2", + ), + ( + "pypi__setuptools", + "https://files.pythonhosted.org/packages/de/88/70c5767a0e43eb4451c2200f07d042a4bcd7639276003a9c54a68cfcc1f8/setuptools-70.0.0-py3-none-any.whl", + "54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4", + ), + ( + "pypi__tomli", + "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", + "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + ), + ( + "pypi__wheel", + "https://files.pythonhosted.org/packages/7d/cd/d7460c9a869b16c3dd4e1e403cce337df165368c71d6af229a74699622ce/wheel-0.43.0-py3-none-any.whl", + "55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81", + ), + ( + "pypi__zipp", + "https://files.pythonhosted.org/packages/da/55/a03fd7240714916507e1fcf7ae355bd9d9ed2e6db492595f1a67f61681be/zipp-3.18.2-py3-none-any.whl", + "dce197b859eb796242b0622af1b8beb0a722d52aa2f57133ead08edd5bf5374e", + ), + # END: maintained by 'bazel run //tools/private/update_deps:update_pip_deps' +] + +_GENERIC_WHEEL = """\ +package(default_visibility = ["//visibility:public"]) + +load("@rules_python//python:defs.bzl", "py_library") + +py_library( + name = "lib", + srcs = glob(["**/*.py"]), + data = glob(["**/*"], exclude=[ + # These entries include those put into user-installed dependencies by + # data_exclude to avoid non-determinism. + "**/*.py", + "**/*.pyc", + "**/*.pyc.*", # During pyc creation, temp files named *.pyc.NNN are created + "**/* *", + "**/*.dist-info/RECORD", + "BUILD", + "WORKSPACE", + ]), + # This makes this directory a top-level in the python import + # search path for anything that depends on this. + imports = ["."], +) +""" + +# Collate all the repository names so they can be easily consumed +all_requirements = [name for (name, _, _) in _RULE_DEPS] + +def requirement(pkg): + return Label("@pypi__" + pkg + "//:lib") + +def pypi_deps(): + """ + Fetch dependencies these rules depend on. Workspaces that use the pip_parse rule can call this. + """ + for (name, url, sha256) in _RULE_DEPS: + maybe( + http_archive, + name, + url = url, + sha256 = sha256, + type = "zip", + build_file_content = _GENERIC_WHEEL, + ) diff --git a/python/private/pypi/multi_pip_parse.bzl b/python/private/pypi/multi_pip_parse.bzl new file mode 100644 index 0000000000..fe9e2db82d --- /dev/null +++ b/python/private/pypi/multi_pip_parse.bzl @@ -0,0 +1,160 @@ +# 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 pip_parse implementation for version aware toolchains in WORKSPACE.""" + +load(":pip_repository.bzl", pip_parse = "pip_repository") + +def _multi_pip_parse_impl(rctx): + rules_python = rctx.attr._rules_python_workspace.workspace_name + load_statements = [] + install_deps_calls = [] + process_requirements_calls = [] + for python_version, pypi_repository in rctx.attr.pip_parses.items(): + sanitized_python_version = python_version.replace(".", "_") + load_statement = """\ +load( + "@{pypi_repository}//:requirements.bzl", + _{sanitized_python_version}_install_deps = "install_deps", + _{sanitized_python_version}_all_requirements = "all_requirements", +)""".format( + pypi_repository = pypi_repository, + sanitized_python_version = sanitized_python_version, + ) + load_statements.append(load_statement) + process_requirements_call = """\ +_process_requirements( + pkg_labels = _{sanitized_python_version}_all_requirements, + python_version = "{python_version}", + repo_prefix = "{pypi_repository}_", +)""".format( + pypi_repository = pypi_repository, + python_version = python_version, + sanitized_python_version = sanitized_python_version, + ) + process_requirements_calls.append(process_requirements_call) + install_deps_call = """ _{sanitized_python_version}_install_deps(**whl_library_kwargs)""".format( + sanitized_python_version = sanitized_python_version, + ) + install_deps_calls.append(install_deps_call) + + # NOTE @aignas 2023-10-31: I am not sure it is possible to render aliases + # for all of the packages using the `render_pkg_aliases` function because + # we need to know what the list of packages for each version is and then + # we would be creating directories for each. + macro_tmpl = "@%s_{}//:{}" % rctx.attr.name + + requirements_bzl = """\ +# Generated by python/pip.bzl + +load("@{rules_python}//python:pip.bzl", "whl_library_alias", "pip_utils") +{load_statements} + +_wheel_names = [] +_version_map = dict() +def _process_requirements(pkg_labels, python_version, repo_prefix): + for pkg_label in pkg_labels: + wheel_name = Label(pkg_label).package + if not wheel_name: + # We are dealing with the cases where we don't have aliases. + workspace_name = Label(pkg_label).workspace_name + wheel_name = workspace_name[len(repo_prefix):] + + _wheel_names.append(wheel_name) + if not wheel_name in _version_map: + _version_map[wheel_name] = dict() + _version_map[wheel_name][python_version] = repo_prefix + +{process_requirements_calls} + +def requirement(name): + return "{macro_tmpl}".format(pip_utils.normalize_name(name), "pkg") + +def whl_requirement(name): + return "{macro_tmpl}".format(pip_utils.normalize_name(name), "whl") + +def data_requirement(name): + return "{macro_tmpl}".format(pip_utils.normalize_name(name), "data") + +def dist_info_requirement(name): + return "{macro_tmpl}".format(pip_utils.normalize_name(name), "dist_info") + +def install_deps(**whl_library_kwargs): +{install_deps_calls} + for wheel_name in _wheel_names: + whl_library_alias( + name = "{name}_" + wheel_name, + wheel_name = wheel_name, + default_version = "{default_version}", + version_map = _version_map[wheel_name], + ) +""".format( + name = rctx.attr.name, + install_deps_calls = "\n".join(install_deps_calls), + load_statements = "\n".join(load_statements), + macro_tmpl = macro_tmpl, + process_requirements_calls = "\n".join(process_requirements_calls), + rules_python = rules_python, + default_version = rctx.attr.default_version, + ) + rctx.file("requirements.bzl", requirements_bzl) + rctx.file("BUILD.bazel", "exports_files(['requirements.bzl'])") + +_multi_pip_parse = repository_rule( + _multi_pip_parse_impl, + attrs = { + "default_version": attr.string(), + "pip_parses": attr.string_dict(), + "_rules_python_workspace": attr.label(default = Label("//:WORKSPACE")), + }, +) + +def multi_pip_parse(name, default_version, python_versions, python_interpreter_target, requirements_lock, **kwargs): + """NOT INTENDED FOR DIRECT USE! + + This is intended to be used by the multi_pip_parse implementation in the template of the + multi_toolchain_aliases repository rule. + + Args: + name: the name of the multi_pip_parse repository. + default_version: the default Python version. + python_versions: all Python toolchain versions currently registered. + python_interpreter_target: a dictionary which keys are Python versions and values are resolved host interpreters. + requirements_lock: a dictionary which keys are Python versions and values are locked requirements files. + **kwargs: extra arguments passed to all wrapped pip_parse. + + Returns: + The internal implementation of multi_pip_parse repository rule. + """ + pip_parses = {} + for python_version in python_versions: + if not python_version in python_interpreter_target: + fail("Missing python_interpreter_target for Python version %s in '%s'" % (python_version, name)) + if not python_version in requirements_lock: + fail("Missing requirements_lock for Python version %s in '%s'" % (python_version, name)) + + pip_parse_name = name + "_" + python_version.replace(".", "_") + pip_parse( + name = pip_parse_name, + python_interpreter_target = python_interpreter_target[python_version], + requirements_lock = requirements_lock[python_version], + **kwargs + ) + pip_parses[python_version] = pip_parse_name + + return _multi_pip_parse( + name = name, + default_version = default_version, + pip_parses = pip_parses, + ) diff --git a/python/private/pypi/pip_compile.bzl b/python/private/pypi/pip_compile.bzl new file mode 100644 index 0000000000..7389e72120 --- /dev/null +++ b/python/private/pypi/pip_compile.bzl @@ -0,0 +1,167 @@ +# 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. + +""" +Rules to verify and update pip-compile locked requirements.txt. + +NOTE @aignas 2024-06-23: We are using the implementation specific name here to +make it possible to have multiple tools inside the `pypi` directory +""" + +load("//python:defs.bzl", _py_binary = "py_binary", _py_test = "py_test") +load(":deps.bzl", "requirement") + +def pip_compile( + name, + src = None, + extra_args = [], + extra_deps = [], + generate_hashes = True, + py_binary = _py_binary, + py_test = _py_test, + requirements_in = None, + requirements_txt = None, + requirements_darwin = None, + requirements_linux = None, + requirements_windows = None, + visibility = ["//visibility:private"], + tags = None, + **kwargs): + """Generates targets for managing pip dependencies with pip-compile. + + By default this rules generates a filegroup named "[name]" which can be included in the data + of some other compile_pip_requirements rule that references these requirements + (e.g. with `-r ../other/requirements.txt`). + + It also generates two targets for running pip-compile: + + - validate with `bazel test [name]_test` + - update with `bazel run [name].update` + + If you are using a version control system, the requirements.txt generated by this rule should + be checked into it to ensure that all developers/users have the same dependency versions. + + Args: + name: base name for generated targets, typically "requirements". + src: file containing inputs to dependency resolution. If not specified, + defaults to `pyproject.toml`. Supported formats are: + * a requirements text file, usually named `requirements.in` + * A `.toml` file, where the `project.dependencies` list is used as per + [PEP621](https://peps.python.org/pep-0621/). + extra_args: passed to pip-compile. + extra_deps: extra dependencies passed to pip-compile. + generate_hashes: whether to put hashes in the requirements_txt file. + py_binary: the py_binary rule to be used. + py_test: the py_test rule to be used. + requirements_in: file expressing desired dependencies. Deprecated, use src instead. + requirements_txt: result of "compiling" the requirements.in file. + requirements_linux: File of linux specific resolve output to check validate if requirement.in has changes. + requirements_darwin: File of darwin specific resolve output to check validate if requirement.in has changes. + requirements_windows: File of windows specific resolve output to check validate if requirement.in has changes. + tags: tagging attribute common to all build rules, passed to both the _test and .update rules. + visibility: passed to both the _test and .update rules. + **kwargs: other bazel attributes passed to the "_test" rule. + """ + if requirements_in and src: + fail("Only one of 'src' and 'requirements_in' attributes can be used") + else: + src = requirements_in or src or "pyproject.toml" + + requirements_txt = name + ".txt" if requirements_txt == None else requirements_txt + + # "Default" target produced by this macro + # Allow a compile_pip_requirements rule to include another one in the data + # for a requirements file that does `-r ../other/requirements.txt` + native.filegroup( + name = name, + srcs = kwargs.pop("data", []) + [requirements_txt], + visibility = visibility, + ) + + data = [name, requirements_txt, src] + [f for f in (requirements_linux, requirements_darwin, requirements_windows) if f != None] + + # Use the Label constructor so this is expanded in the context of the file + # where it appears, which is to say, in @rules_python + pip_compile = Label("//python/private/pypi/dependency_resolver:dependency_resolver.py") + + loc = "$(rlocationpath {})" + + args = [ + loc.format(src), + loc.format(requirements_txt), + "//%s:%s.update" % (native.package_name(), name), + "--resolver=backtracking", + "--allow-unsafe", + ] + if generate_hashes: + args.append("--generate-hashes") + if requirements_linux: + args.append("--requirements-linux={}".format(loc.format(requirements_linux))) + if requirements_darwin: + args.append("--requirements-darwin={}".format(loc.format(requirements_darwin))) + if requirements_windows: + args.append("--requirements-windows={}".format(loc.format(requirements_windows))) + args.extend(extra_args) + + deps = [ + requirement("build"), + requirement("click"), + requirement("colorama"), + requirement("importlib_metadata"), + requirement("more_itertools"), + requirement("packaging"), + requirement("pep517"), + requirement("pip"), + requirement("pip_tools"), + requirement("pyproject_hooks"), + requirement("setuptools"), + requirement("tomli"), + requirement("zipp"), + Label("//python/runfiles:runfiles"), + ] + extra_deps + + tags = tags or [] + tags.append("requires-network") + tags.append("no-remote-exec") + tags.append("no-sandbox") + attrs = { + "args": args, + "data": data, + "deps": deps, + "main": pip_compile, + "srcs": [pip_compile], + "tags": tags, + "visibility": visibility, + } + + # cheap way to detect the bazel version + _bazel_version_4_or_greater = "propeller_optimize" in dir(native) + + # Bazel 4.0 added the "env" attribute to py_test/py_binary + if _bazel_version_4_or_greater: + attrs["env"] = kwargs.pop("env", {}) + + py_binary( + name = name + ".update", + **attrs + ) + + timeout = kwargs.pop("timeout", "short") + + py_test( + name = name + "_test", + timeout = timeout, + # kwargs could contain test-specific attributes like size or timeout + **dict(attrs, **kwargs) + ) diff --git a/python/pip_install/tools/requirements.txt b/python/private/pypi/requirements.txt similarity index 100% rename from python/pip_install/tools/requirements.txt rename to python/private/pypi/requirements.txt diff --git a/python/private/pypi/whl_installer/BUILD.bazel b/python/private/pypi/whl_installer/BUILD.bazel new file mode 100644 index 0000000000..58231ceb04 --- /dev/null +++ b/python/private/pypi/whl_installer/BUILD.bazel @@ -0,0 +1,36 @@ +load("//python:defs.bzl", "py_binary", "py_library") +load("//python/private/pypi:deps.bzl", "requirement") + +py_library( + name = "lib", + srcs = [ + "arguments.py", + "namespace_pkgs.py", + "wheel.py", + "wheel_installer.py", + ], + visibility = [ + "//tests:__subpackages__", + "//third_party/rules_pycross/pycross/private:__subpackages__", + ], + deps = [ + requirement("installer"), + requirement("pip"), + requirement("packaging"), + requirement("setuptools"), + ], +) + +py_binary( + name = "wheel_installer", + srcs = [ + "wheel_installer.py", + ], + deps = [":lib"], +) + +filegroup( + name = "distribution", + srcs = glob(["*"]), + visibility = ["//python/private/pypi:__subpackages__"], +) diff --git a/python/pip_install/tools/wheel_installer/arguments.py b/python/private/pypi/whl_installer/arguments.py similarity index 98% rename from python/pip_install/tools/wheel_installer/arguments.py rename to python/private/pypi/whl_installer/arguments.py index 71133c29ca..173d3a39a3 100644 --- a/python/pip_install/tools/wheel_installer/arguments.py +++ b/python/private/pypi/whl_installer/arguments.py @@ -17,7 +17,7 @@ import pathlib from typing import Any, Dict, Set -from python.pip_install.tools.wheel_installer import wheel +from python.private.pypi.whl_installer import wheel def parser(**kwargs: Any) -> argparse.ArgumentParser: diff --git a/python/pip_install/tools/wheel_installer/namespace_pkgs.py b/python/private/pypi/whl_installer/namespace_pkgs.py similarity index 100% rename from python/pip_install/tools/wheel_installer/namespace_pkgs.py rename to python/private/pypi/whl_installer/namespace_pkgs.py diff --git a/python/pip_install/tools/wheel_installer/wheel.py b/python/private/pypi/whl_installer/wheel.py similarity index 100% rename from python/pip_install/tools/wheel_installer/wheel.py rename to python/private/pypi/whl_installer/wheel.py diff --git a/python/pip_install/tools/wheel_installer/wheel_installer.py b/python/private/pypi/whl_installer/wheel_installer.py similarity index 98% rename from python/pip_install/tools/wheel_installer/wheel_installer.py rename to python/private/pypi/whl_installer/wheel_installer.py index 801ef959f0..ef8181c30d 100644 --- a/python/pip_install/tools/wheel_installer/wheel_installer.py +++ b/python/private/pypi/whl_installer/wheel_installer.py @@ -27,7 +27,7 @@ from pip._vendor.packaging.utils import canonicalize_name -from python.pip_install.tools.wheel_installer import arguments, namespace_pkgs, wheel +from python.private.pypi.whl_installer import arguments, namespace_pkgs, wheel def _configure_reproducible_wheels() -> None: diff --git a/python/private/pypi/whl_library.bzl b/python/private/pypi/whl_library.bzl index cae0db3e2b..77cbd4e29b 100644 --- a/python/private/pypi/whl_library.bzl +++ b/python/private/pypi/whl_library.bzl @@ -16,12 +16,12 @@ load("//python:repositories.bzl", "is_standalone_interpreter") load("//python:versions.bzl", "WINDOWS_NAME") -load("//python/pip_install:repositories.bzl", "all_requirements") load("//python/private:auth.bzl", "AUTH_ATTRS", "get_auth") load("//python/private:envsubst.bzl", "envsubst") load("//python/private:repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") load("//python/private:toolchains_repo.bzl", "get_host_os_arch") load(":attrs.bzl", "ATTRS", "use_isolated") +load(":deps.bzl", "all_requirements") load(":generate_whl_library_build_bazel.bzl", "generate_whl_library_build_bazel") load(":parse_whl_name.bzl", "parse_whl_name") load(":patch_whl.bzl", "patch_whl") @@ -241,7 +241,7 @@ def _whl_library_impl(rctx): args = [ python_interpreter, "-m", - "python.pip_install.tools.wheel_installer.wheel_installer", + "python.private.pypi.whl_installer.wheel_installer", "--requirement", rctx.attr.requirement, ] diff --git a/python/private/pypi/whl_library_alias.bzl b/python/private/pypi/whl_library_alias.bzl new file mode 100644 index 0000000000..263d7ec0e7 --- /dev/null +++ b/python/private/pypi/whl_library_alias.bzl @@ -0,0 +1,99 @@ +# 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. + +"""whl_library aliases for multi_pip_parse.""" + +load("//python/private:full_version.bzl", "full_version") +load(":render_pkg_aliases.bzl", "NO_MATCH_ERROR_MESSAGE_TEMPLATE") + +def _whl_library_alias_impl(rctx): + rules_python = rctx.attr._rules_python_workspace.workspace_name + if rctx.attr.default_version: + default_repo_prefix = rctx.attr.version_map[rctx.attr.default_version] + else: + default_repo_prefix = None + version_map = rctx.attr.version_map.items() + build_content = ["# Generated by python/pip.bzl"] + for alias_name in ["pkg", "whl", "data", "dist_info"]: + build_content.append(_whl_library_render_alias_target( + alias_name = alias_name, + default_repo_prefix = default_repo_prefix, + rules_python = rules_python, + version_map = version_map, + wheel_name = rctx.attr.wheel_name, + )) + rctx.file("BUILD.bazel", "\n".join(build_content)) + +def _whl_library_render_alias_target( + alias_name, + default_repo_prefix, + rules_python, + version_map, + wheel_name): + alias = ["""\ +alias( + name = "{alias_name}", + actual = select({{""".format(alias_name = alias_name)] + for [python_version, repo_prefix] in version_map: + alias.append("""\ + "@{rules_python}//python/config_settings:is_python_{full_python_version}": "{actual}",""".format( + full_python_version = full_version(python_version), + actual = "@{repo_prefix}{wheel_name}//:{alias_name}".format( + repo_prefix = repo_prefix, + wheel_name = wheel_name, + alias_name = alias_name, + ), + rules_python = rules_python, + )) + if default_repo_prefix: + default_actual = "@{repo_prefix}{wheel_name}//:{alias_name}".format( + repo_prefix = default_repo_prefix, + wheel_name = wheel_name, + alias_name = alias_name, + ) + alias.append(' "//conditions:default": "{default_actual}",'.format( + default_actual = default_actual, + )) + + alias.append(" },") # Close select expression condition dict + if not default_repo_prefix: + supported_versions = sorted([python_version for python_version, _ in version_map]) + alias.append(' no_match_error="""{}""",'.format( + NO_MATCH_ERROR_MESSAGE_TEMPLATE.format( + supported_versions = ", ".join(supported_versions), + rules_python = rules_python, + ), + )) + alias.append(" ),") # Close the select expression + alias.append(' visibility = ["//visibility:public"],') + alias.append(")") # Close the alias() expression + return "\n".join(alias) + +whl_library_alias = repository_rule( + _whl_library_alias_impl, + attrs = { + "default_version": attr.string( + mandatory = False, + doc = "Optional Python version in major.minor format, e.g. '3.10'." + + "The Python version of the wheel to use when the versions " + + "from `version_map` don't match. This allows the default " + + "(version unaware) rules to match and select a wheel. If " + + "not specified, then the default rules won't be able to " + + "resolve a wheel and an error will occur.", + ), + "version_map": attr.string_dict(mandatory = True), + "wheel_name": attr.string(mandatory = True), + "_rules_python_workspace": attr.label(default = Label("//:WORKSPACE")), + }, +) diff --git a/python/repositories.bzl b/python/repositories.bzl index 245aae2546..d58feefd31 100644 --- a/python/repositories.bzl +++ b/python/repositories.bzl @@ -19,7 +19,6 @@ For historic reasons, pip_repositories() is defined in //python:pip.bzl. load("@bazel_tools//tools/build_defs/repo:http.bzl", _http_archive = "http_archive") load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") -load("//python/pip_install:repositories.bzl", "pip_install_dependencies") load("//python/private:auth.bzl", "get_auth") load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") load("//python/private:coverage_deps.bzl", "coverage_dep") @@ -33,6 +32,7 @@ load( "toolchain_aliases", "toolchains_repo", ) +load("//python/private/pypi:deps.bzl", "pypi_deps") load( ":versions.bzl", "DEFAULT_RELEASE_BASE_URL", @@ -68,7 +68,7 @@ def py_repositories(): sha256 = "2037875b9a4456dce4a79d112a8ae885bbc4aad968e6587dca6e64f3a0900cdf", strip_prefix = "rules_cc-0.0.9", ) - pip_install_dependencies() + pypi_deps() ######## # Remaining content of the file is only used to support toolchains. diff --git a/tests/integration/compile_pip_requirements/WORKSPACE b/tests/integration/compile_pip_requirements/WORKSPACE index 5a2204bc37..0eeab2067c 100644 --- a/tests/integration/compile_pip_requirements/WORKSPACE +++ b/tests/integration/compile_pip_requirements/WORKSPACE @@ -7,10 +7,6 @@ load("@rules_python//python:repositories.bzl", "py_repositories", "python_regist py_repositories() -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/compile_pip_requirements_test_from_external_repo/WORKSPACE b/tests/integration/compile_pip_requirements_test_from_external_repo/WORKSPACE index 9a08c285e3..48caeb442f 100644 --- a/tests/integration/compile_pip_requirements_test_from_external_repo/WORKSPACE +++ b/tests/integration/compile_pip_requirements_test_from_external_repo/WORKSPACE @@ -7,10 +7,6 @@ load("@rules_python//python:repositories.bzl", "py_repositories", "python_regist py_repositories() -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/pip_parse/WORKSPACE b/tests/integration/pip_parse/WORKSPACE index 4b4f41ddab..db0cd0c7c8 100644 --- a/tests/integration/pip_parse/WORKSPACE +++ b/tests/integration/pip_parse/WORKSPACE @@ -7,6 +7,11 @@ load("@rules_python//python:repositories.bzl", "py_repositories", "python_regist 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() diff --git a/tests/pypi/whl_installer/BUILD.bazel b/tests/pypi/whl_installer/BUILD.bazel new file mode 100644 index 0000000000..048a877b65 --- /dev/null +++ b/tests/pypi/whl_installer/BUILD.bazel @@ -0,0 +1,52 @@ +load("//python:defs.bzl", "py_test") + +alias( + name = "lib", + actual = "//python/private/pypi/whl_installer:lib", +) + +py_test( + name = "arguments_test", + size = "small", + srcs = [ + "arguments_test.py", + ], + deps = [ + ":lib", + ], +) + +py_test( + name = "namespace_pkgs_test", + size = "small", + srcs = [ + "namespace_pkgs_test.py", + ], + deps = [ + ":lib", + ], +) + +py_test( + name = "wheel_installer_test", + size = "small", + srcs = [ + "wheel_installer_test.py", + ], + data = ["//examples/wheel:minimal_with_py_package"], + deps = [ + ":lib", + ], +) + +py_test( + name = "wheel_test", + size = "small", + srcs = [ + "wheel_test.py", + ], + data = ["//examples/wheel:minimal_with_py_package"], + deps = [ + ":lib", + ], +) diff --git a/python/pip_install/tools/wheel_installer/arguments_test.py b/tests/pypi/whl_installer/arguments_test.py similarity index 94% rename from python/pip_install/tools/wheel_installer/arguments_test.py rename to tests/pypi/whl_installer/arguments_test.py index fa018da40f..5538054a59 100644 --- a/python/pip_install/tools/wheel_installer/arguments_test.py +++ b/tests/pypi/whl_installer/arguments_test.py @@ -12,18 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -import argparse import json import unittest -from python.pip_install.tools.wheel_installer import arguments, wheel +from python.private.pypi.whl_installer import arguments, wheel class ArgumentsTestCase(unittest.TestCase): def test_arguments(self) -> None: parser = arguments.parser() - repo_name = "foo" - repo_prefix = "pypi_" index_url = "--index_url=pypi.org/simple" extra_pip_args = [index_url] requirement = "foo==1.0.0 --hash=sha256:deadbeef" diff --git a/python/pip_install/tools/wheel_installer/namespace_pkgs_test.py b/tests/pypi/whl_installer/namespace_pkgs_test.py similarity index 98% rename from python/pip_install/tools/wheel_installer/namespace_pkgs_test.py rename to tests/pypi/whl_installer/namespace_pkgs_test.py index 4aa0fea978..fbbd50926a 100644 --- a/python/pip_install/tools/wheel_installer/namespace_pkgs_test.py +++ b/tests/pypi/whl_installer/namespace_pkgs_test.py @@ -19,7 +19,7 @@ import unittest from typing import Optional, Set -from python.pip_install.tools.wheel_installer import namespace_pkgs +from python.private.pypi.whl_installer import namespace_pkgs class TempDir: diff --git a/python/pip_install/tools/wheel_installer/wheel_installer_test.py b/tests/pypi/whl_installer/wheel_installer_test.py similarity index 97% rename from python/pip_install/tools/wheel_installer/wheel_installer_test.py rename to tests/pypi/whl_installer/wheel_installer_test.py index 74b9c305f5..7139779c3e 100644 --- a/python/pip_install/tools/wheel_installer/wheel_installer_test.py +++ b/tests/pypi/whl_installer/wheel_installer_test.py @@ -19,7 +19,7 @@ import unittest from pathlib import Path -from python.pip_install.tools.wheel_installer import wheel, wheel_installer +from python.private.pypi.whl_installer import wheel_installer class TestRequirementExtrasParsing(unittest.TestCase): diff --git a/python/pip_install/tools/wheel_installer/wheel_test.py b/tests/pypi/whl_installer/wheel_test.py similarity index 97% rename from python/pip_install/tools/wheel_installer/wheel_test.py rename to tests/pypi/whl_installer/wheel_test.py index 3ddfaf7f2e..9b27205ac9 100644 --- a/python/pip_install/tools/wheel_installer/wheel_test.py +++ b/tests/pypi/whl_installer/wheel_test.py @@ -2,7 +2,7 @@ from random import shuffle from unittest import mock -from python.pip_install.tools.wheel_installer import wheel +from python.private.pypi.whl_installer import wheel class DepsTest(unittest.TestCase): @@ -218,7 +218,7 @@ def test_can_get_deps_based_on_specific_python_version(self): self.assertEqual({"@platforms//os:linux": ["posix_dep"]}, py38_deps.deps_select) @mock.patch( - "python.pip_install.tools.wheel_installer.wheel.host_interpreter_minor_version" + "python.private.pypi.whl_installer.wheel.host_interpreter_minor_version" ) def test_can_get_version_select(self, mock_host_interpreter_version): requires_dist = [ @@ -267,7 +267,7 @@ def test_can_get_version_select(self, mock_host_interpreter_version): ) @mock.patch( - "python.pip_install.tools.wheel_installer.wheel.host_interpreter_minor_version" + "python.private.pypi.whl_installer.wheel.host_interpreter_minor_version" ) def test_deps_spanning_all_target_py_versions_are_added_to_common( self, mock_host_version @@ -290,7 +290,7 @@ def test_deps_spanning_all_target_py_versions_are_added_to_common( self.assertEqual({}, got.deps_select) @mock.patch( - "python.pip_install.tools.wheel_installer.wheel.host_interpreter_minor_version" + "python.private.pypi.whl_installer.wheel.host_interpreter_minor_version" ) def test_deps_are_not_duplicated(self, mock_host_version): mock_host_version.return_value = 7 @@ -319,7 +319,7 @@ def test_deps_are_not_duplicated(self, mock_host_version): self.assertEqual({}, got.deps_select) @mock.patch( - "python.pip_install.tools.wheel_installer.wheel.host_interpreter_minor_version" + "python.private.pypi.whl_installer.wheel.host_interpreter_minor_version" ) def test_deps_are_not_duplicated_when_encountering_platform_dep_first( self, mock_host_version diff --git a/third_party/rules_pycross/pycross/private/tools/BUILD.bazel b/third_party/rules_pycross/pycross/private/tools/BUILD.bazel index a87e6aa67e..41485c18a3 100644 --- a/third_party/rules_pycross/pycross/private/tools/BUILD.bazel +++ b/third_party/rules_pycross/pycross/private/tools/BUILD.bazel @@ -20,7 +20,7 @@ py_binary( srcs = ["wheel_installer.py"], visibility = ["//visibility:public"], deps = [ - "//python/pip_install/tools/wheel_installer:lib", + "//python/private/pypi/whl_installer:lib", "@pypi__installer//:lib", ], ) diff --git a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py index 0c352cf129..c03c4c2523 100644 --- a/third_party/rules_pycross/pycross/private/tools/wheel_installer.py +++ b/third_party/rules_pycross/pycross/private/tools/wheel_installer.py @@ -30,7 +30,7 @@ from installer.destinations import SchemeDictionaryDestination from installer.sources import WheelFile -from python.pip_install.tools.wheel_installer import namespace_pkgs +from python.private.pypi.whl_installer import namespace_pkgs def setup_namespace_pkg_compatibility(wheel_dir: Path) -> None: diff --git a/tools/private/update_deps/BUILD.bazel b/tools/private/update_deps/BUILD.bazel index 2ab7cc73a6..c83deb03db 100644 --- a/tools/private/update_deps/BUILD.bazel +++ b/tools/private/update_deps/BUILD.bazel @@ -50,14 +50,12 @@ py_binary( name = "update_pip_deps", srcs = ["update_pip_deps.py"], data = [ - "//:MODULE.bazel", - "//python/pip_install:repositories", - "//python/pip_install:requirements_txt", + "//python/private/pypi:deps.bzl", + "//python/private/pypi:requirements_txt", ], env = { - "MODULE_BAZEL": "$(rlocationpath //:MODULE.bazel)", - "REPOSITORIES_BZL": "$(rlocationpath //python/pip_install:repositories)", - "REQUIREMENTS_TXT": "$(rlocationpath //python/pip_install:requirements_txt)", + "DEPS_BZL": "$(rlocationpath //python/private/pypi:deps.bzl)", + "REQUIREMENTS_TXT": "$(rlocationpath //python/private/pypi:requirements_txt)", }, imports = ["../../.."], deps = [ diff --git a/tools/private/update_deps/update_pip_deps.py b/tools/private/update_deps/update_pip_deps.py index 3c4b46ecfd..1034382f0d 100755 --- a/tools/private/update_deps/update_pip_deps.py +++ b/tools/private/update_deps/update_pip_deps.py @@ -129,19 +129,13 @@ def main(): "--requirements-txt", type=path_from_runfiles, default=os.environ.get("REQUIREMENTS_TXT"), - help="The requirements.txt path for the pip_install tools, defaults to the value taken from REQUIREMENTS_TXT", + help="The requirements.txt path for the pypi tools, defaults to the value taken from REQUIREMENTS_TXT", ) parser.add_argument( - "--module-bazel", + "--deps-bzl", type=path_from_runfiles, - default=os.environ.get("MODULE_BAZEL"), - help="The path for the file to be updated, defaults to the value taken from MODULE_BAZEL", - ) - parser.add_argument( - "--repositories-bzl", - type=path_from_runfiles, - default=os.environ.get("REPOSITORIES_BZL"), - help="The path for the file to be updated, defaults to the value taken from REPOSITORIES_BZL", + default=os.environ.get("DEPS_BZL"), + help="The path for the file to be updated, defaults to the value taken from DEPS_BZL", ) args = parser.parse_args() @@ -149,21 +143,13 @@ def main(): deps = _get_deps(report) update_file( - path=args.repositories_bzl, + path=args.deps_bzl, snippet=_dep_snippet(deps), start_marker=args.start, end_marker=args.end, dry_run=args.dry_run, ) - update_file( - path=args.module_bazel, - snippet=_module_snippet(deps), - start_marker=args.start, - end_marker=args.end, - dry_run=args.dry_run, - ) - if __name__ == "__main__": main() From 1a225f4c91bd55eb3898668eb88c4ef2e7aae0a4 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Tue, 25 Jun 2024 01:07:24 +0900 Subject: [PATCH 095/345] chore: adjust CODEOWNERS (#2008) Add @aignas to all code and @groodt to `pypi`. Remove @f0rmiga from toolchains as the main maintainers have sufficient knowledge about them. Gazelle plugin ownership should be better, but we can solve it in a subsequent PR. --- .github/CODEOWNERS | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index a75b5a91a3..a7ca2b06c2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,16 +1,11 @@ # NB: Last matching rule takes precedence in CODEOWNERS. -* @rickeylev +* @rickeylev @aignas # Directory containing the Gazelle extension and Go code. /gazelle/ @f0rmiga /examples/build_file_generation/ @f0rmiga -# Toolchains -/python/repositories.bzl @f0rmiga -/python/private/toolchains_repo.bzl @f0rmiga -/python/tests/toolchains/ @f0rmiga - # PyPI integration related code -/python/private/pypi/ @aignas -/tests/pypi/ @aignas +/python/private/pypi/ @groodt +/tests/pypi/ @groodt From 5b2564a5bc06ec9724fb59f6bee0c74b7f16118d Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Mon, 24 Jun 2024 14:09:15 -0700 Subject: [PATCH 096/345] fix: make first default output the executable again (#2010) This fixes a small change in behavior identified by some Google regression tests. When precompiling was introduced, the target's executable was no longer the first file in the default outputs depset. While that behavior isn't a strong contract, it is the convention with many other rules, and the existing behavior for Bazel 7+. To fix, put the executable as the first value in the default outputs list. Also adds a test for this behavior. --- CHANGELOG.md | 1 + python/private/common/py_executable.bzl | 5 +++-- tests/base_rules/py_executable_base_tests.bzl | 11 +++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b259e51fbe..6ae6508f21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,7 @@ A brief description of the categories of changes: `interpreter_version_info` arg. * (bzlmod) Correctly pass `isolated`, `quiet` and `timeout` values to `whl_library` and drop the defaults from the lock file. +* (rules) The first element of the default outputs is now the executable again. ### Removed * (pip): Removes the `entrypoint` macro that was replaced by `py_console_script_binary` in 0.26.0. diff --git a/python/private/common/py_executable.bzl b/python/private/common/py_executable.bzl index 6b75b4139a..2b4a9397c8 100644 --- a/python/private/common/py_executable.bzl +++ b/python/private/common/py_executable.bzl @@ -166,9 +166,10 @@ def py_executable_base_impl(ctx, *, semantics, is_test, inherited_environment = main_py = precompile_result.py_to_pyc_map[main_py] direct_pyc_files = depset(precompile_result.pyc_files) - default_outputs = precompile_result.keep_srcs + precompile_result.pyc_files executable = _declare_executable_file(ctx) - default_outputs.append(executable) + default_outputs = [executable] + default_outputs.extend(precompile_result.keep_srcs) + default_outputs.extend(precompile_result.pyc_files) imports = collect_imports(ctx, semantics) diff --git a/tests/base_rules/py_executable_base_tests.bzl b/tests/base_rules/py_executable_base_tests.bzl index c96ec4e108..eb1a1b6c07 100644 --- a/tests/base_rules/py_executable_base_tests.bzl +++ b/tests/base_rules/py_executable_base_tests.bzl @@ -18,6 +18,7 @@ load("@rules_python_internal//:rules_python_config.bzl", rp_config = "config") load("@rules_testing//lib:analysis_test.bzl", "analysis_test") load("@rules_testing//lib:truth.bzl", "matching") load("@rules_testing//lib:util.bzl", rt_util = "util") +load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility load("//tests/base_rules:base_tests.bzl", "create_base_tests") load("//tests/base_rules:util.bzl", "WINDOWS_ATTR", pt_util = "util") load("//tests/support:support.bzl", "LINUX_X86_64", "WINDOWS_X86_64") @@ -297,6 +298,16 @@ def _test_files_to_build_impl(env, target): "{package}/{test_name}_subject.py", ]) + if IS_BAZEL_7_OR_HIGHER: + # As of Bazel 7, the first default output is the executable, so + # verify that is the case. rules_testing + # DepsetFileSubject.contains_exactly doesn't provide an in_order() + # call, nor access to the underlying depset, so we have to do things + # manually. + first_default_output = target[DefaultInfo].files.to_list()[0] + executable = target[DefaultInfo].files_to_run.executable + env.expect.that_file(first_default_output).equals(executable) + def _test_name_cannot_end_in_py(name, config): # Bazel 5 will crash with a Java stacktrace when the native Python # rules have an error. From 9f291c3c3c2860159b1942ed233f5a71cf29dc94 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Mon, 24 Jun 2024 16:35:58 -0700 Subject: [PATCH 097/345] refactor: call a function to define internal pypi flags instead of listcomp (#2011) This is updated so tooling can more automatically process the files. In particular, it helps tools, like buildozer, process the files, which makes it easier to import the code into Google. This is because there is a named target that buildozer can be told to process, whereas, with a list comprehension, it's an arbitrary chunk of code that has to be patched, without an identifiable label. --- python/config_settings/BUILD.bazel | 16 ++++------------ python/private/pypi/BUILD.bazel | 5 ++++- python/private/pypi/flags.bzl | 10 ++++++++++ 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel index f6f46db770..f2383d6056 100644 --- a/python/config_settings/BUILD.bazel +++ b/python/config_settings/BUILD.bazel @@ -10,10 +10,10 @@ load( ) load( "//python/private/pypi:flags.bzl", - "INTERNAL_FLAGS", "UniversalWhlFlag", "UseWhlFlag", "WhlLibcFlag", + "define_pypi_internal_flags", ) load(":config_settings.bzl", "construct_config_settings") @@ -163,14 +163,6 @@ string_flag( visibility = ["//visibility:public"], ) -# private pip whl related flags. Their values cannot be changed and they -# are an implementation detail of how `pip_config_settings` work. -[ - string_flag( - name = "_internal_pip_" + flag, - build_setting_default = "", - values = [""], - visibility = ["//visibility:public"], - ) - for flag in INTERNAL_FLAGS -] +define_pypi_internal_flags( + name = "define_pypi_internal_flags", +) diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel index e7ae735531..0960b6a21d 100644 --- a/python/private/pypi/BUILD.bazel +++ b/python/private/pypi/BUILD.bazel @@ -92,7 +92,10 @@ bzl_library( bzl_library( name = "flags_bzl", srcs = ["flags.bzl"], - deps = ["//python/private:enum_bzl"], + deps = [ + "//python/private:enum_bzl", + "@bazel_skylib//rules:common_settings", + ], ) bzl_library( diff --git a/python/private/pypi/flags.bzl b/python/private/pypi/flags.bzl index d834be8cc6..1e380625ce 100644 --- a/python/private/pypi/flags.bzl +++ b/python/private/pypi/flags.bzl @@ -18,6 +18,7 @@ NOTE: The transitive loads of this should be kept minimal. This avoids loading unnecessary files when all that are needed are flag definitions. """ +load("@bazel_skylib//rules:common_settings.bzl", "string_flag") load("//python/private:enum.bzl", "enum") # Determines if we should use whls for third party @@ -68,3 +69,12 @@ INTERNAL_FLAGS = [ "whl_pycp3x_abi3", "whl_pycp3x_abicp", ] + +def define_pypi_internal_flags(name): + for flag in INTERNAL_FLAGS: + string_flag( + name = "_internal_pip_" + flag, + build_setting_default = "", + values = [""], + visibility = ["//visibility:public"], + ) From 5dfc1c75e4232c9ca8d876f820302b79da4a4b8c Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:19:37 +0900 Subject: [PATCH 098/345] chore: bump sphinxdocs deps (#2013) Closes #1984 Closes #1985 Closes #2012 --- docs/sphinx/requirements.txt | 96 +++++++++++++++++------------------- 1 file changed, 46 insertions(+), 50 deletions(-) diff --git a/docs/sphinx/requirements.txt b/docs/sphinx/requirements.txt index 55926918c8..f2f0158f88 100644 --- a/docs/sphinx/requirements.txt +++ b/docs/sphinx/requirements.txt @@ -4,21 +4,21 @@ # # bazel run //docs/sphinx:requirements.update # -absl-py==2.0.0 \ - --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3 \ - --hash=sha256:d9690211c5fcfefcdd1a45470ac2b5c5acd45241c3af71eed96bc5441746c0d5 +absl-py==2.1.0 \ + --hash=sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308 \ + --hash=sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff # via rules_python_docs (docs/sphinx/pyproject.toml) -alabaster==0.7.13 \ - --hash=sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3 \ - --hash=sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2 +alabaster==0.7.16 \ + --hash=sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65 \ + --hash=sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92 # via sphinx babel==2.15.0 \ --hash=sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb \ --hash=sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413 # via sphinx -certifi==2023.11.17 \ - --hash=sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1 \ - --hash=sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474 +certifi==2024.6.2 \ + --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ + --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 # via requests charset-normalizer==3.3.2 \ --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ @@ -202,21 +202,21 @@ markupsafe==2.1.5 \ --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 # via jinja2 -mdit-py-plugins==0.4.0 \ - --hash=sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9 \ - --hash=sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b +mdit-py-plugins==0.4.1 \ + --hash=sha256:1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a \ + --hash=sha256:834b8ac23d1cd60cec703646ffd22ae97b7955a6d596eb1d304be1e251ae499c # via myst-parser mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba # via markdown-it-py -myst-parser==2.0.0 \ - --hash=sha256:7c36344ae39c8e740dad7fdabf5aa6fc4897a813083c6cc9990044eb93656b14 \ - --hash=sha256:ea929a67a6a0b1683cdbe19b8d2e724cd7643f8aa3e7bb18dd65beac3483bead +myst-parser==3.0.1 \ + --hash=sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1 \ + --hash=sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87 # via rules_python_docs (docs/sphinx/pyproject.toml) -packaging==23.2 \ - --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 \ - --hash=sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 +packaging==24.1 \ + --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ + --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 # via # readthedocs-sphinx-ext # sphinx @@ -254,6 +254,7 @@ pyyaml==6.0.1 \ --hash=sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4 \ --hash=sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba \ --hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \ + --hash=sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef \ --hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \ --hash=sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd \ --hash=sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3 \ @@ -276,13 +277,13 @@ pyyaml==6.0.1 \ --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f # via myst-parser -readthedocs-sphinx-ext==2.2.3 \ - --hash=sha256:6583c26791a5853ee9e57ce9db864e2fb06808ba470f805d74d53fc50811e012 \ - --hash=sha256:e9d911792789b88ae12e2be94d88c619f89a4fa1fe9e42c1505c9930a07163d8 +readthedocs-sphinx-ext==2.2.5 \ + --hash=sha256:ee5fd5b99db9f0c180b2396cbce528aa36671951b9526bb0272dbfce5517bd27 \ + --hash=sha256:f8c56184ea011c972dd45a90122568587cc85b0127bc9cf064d17c68bc809daa # via rules_python_docs (docs/sphinx/pyproject.toml) -requests==2.31.0 \ - --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ - --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 +requests==2.32.3 \ + --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ + --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 # via # readthedocs-sphinx-ext # sphinx @@ -290,34 +291,29 @@ snowballstemmer==2.2.0 \ --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 \ --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a # via sphinx -sphinx==7.2.6 \ - --hash=sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560 \ - --hash=sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5 +sphinx==7.3.7 \ + --hash=sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3 \ + --hash=sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc # via # myst-parser # rules_python_docs (docs/sphinx/pyproject.toml) # sphinx-rtd-theme - # sphinxcontrib-applehelp - # sphinxcontrib-devhelp - # sphinxcontrib-htmlhelp # sphinxcontrib-jquery - # sphinxcontrib-qthelp - # sphinxcontrib-serializinghtml sphinx-rtd-theme==2.0.0 \ --hash=sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b \ --hash=sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586 # via rules_python_docs (docs/sphinx/pyproject.toml) -sphinxcontrib-applehelp==1.0.7 \ - --hash=sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d \ - --hash=sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa +sphinxcontrib-applehelp==1.0.8 \ + --hash=sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619 \ + --hash=sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4 # via sphinx -sphinxcontrib-devhelp==1.0.5 \ - --hash=sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212 \ - --hash=sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f +sphinxcontrib-devhelp==1.0.6 \ + --hash=sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f \ + --hash=sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3 # via sphinx -sphinxcontrib-htmlhelp==2.0.4 \ - --hash=sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a \ - --hash=sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9 +sphinxcontrib-htmlhelp==2.0.5 \ + --hash=sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015 \ + --hash=sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04 # via sphinx sphinxcontrib-jquery==4.1 \ --hash=sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a \ @@ -327,19 +323,19 @@ sphinxcontrib-jsmath==1.0.1 \ --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 \ --hash=sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8 # via sphinx -sphinxcontrib-qthelp==1.0.6 \ - --hash=sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d \ - --hash=sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4 +sphinxcontrib-qthelp==1.0.7 \ + --hash=sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6 \ + --hash=sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182 # via sphinx -sphinxcontrib-serializinghtml==1.1.9 \ - --hash=sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54 \ - --hash=sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1 +sphinxcontrib-serializinghtml==1.1.10 \ + --hash=sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7 \ + --hash=sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f # via sphinx typing-extensions==4.12.2 \ --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 # via rules_python_docs (docs/sphinx/pyproject.toml) -urllib3==2.1.0 \ - --hash=sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3 \ - --hash=sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54 +urllib3==2.2.2 \ + --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ + --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 # via requests From f56fe42e858e9cf381a7598131b49a130550d8ab Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Wed, 26 Jun 2024 06:01:42 +0900 Subject: [PATCH 099/345] fix(whl_library): correctly handle arch-specific deps in wheels (#2007) It seems that there was a single-line bug that did not allow us to handle arch-specific deps and since the percentage of such wheels is extremely low, it went under the radar for quite some time. I am going to not implement any explicit passing of the default python version to `whl_library` as it is a much bigger change. Just doing this could be sufficient for the time being. Fixes #1996 --- CHANGELOG.md | 5 ++- python/private/pypi/whl_installer/wheel.py | 21 ++++++----- tests/pypi/whl_installer/wheel_test.py | 41 ++++++++++++++++++++++ 3 files changed, 58 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ae6508f21..0cbf2f91ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,9 @@ A brief description of the categories of changes: `interpreter_version_info` arg. * (bzlmod) Correctly pass `isolated`, `quiet` and `timeout` values to `whl_library` and drop the defaults from the lock file. +* (whl_library) Correctly handle arch-specific dependencies when we encounter a + platform specific wheel and use `experimental_target_platforms`. + Fixes [#1996](https://github.com/bazelbuild/rules_python/issues/1996). * (rules) The first element of the default outputs is now the executable again. ### Removed @@ -55,7 +58,7 @@ A brief description of the categories of changes: To enable it, set {obj}`--//python/config_settings:exec_tools_toolchain=enabled`. This toolchain must be enabled for precompilation to work. This toolchain will be enabled by default in a future release. - Fixes [1967](https://github.com/bazelbuild/rules_python/issues/1967). + Fixes [#1967](https://github.com/bazelbuild/rules_python/issues/1967). ## [0.33.1] - 2024-06-13 diff --git a/python/private/pypi/whl_installer/wheel.py b/python/private/pypi/whl_installer/wheel.py index 3d6780de9a..c167df9193 100644 --- a/python/private/pypi/whl_installer/wheel.py +++ b/python/private/pypi/whl_installer/wheel.py @@ -342,7 +342,12 @@ def __init__( self.name: str = Deps._normalize(name) self._platforms: Set[Platform] = platforms or set() self._target_versions = {p.minor_version for p in platforms or {}} - self._add_version_select = platforms and len(self._target_versions) > 2 + self._default_minor_version = None + if platforms and len(self._target_versions) > 2: + # TODO @aignas 2024-06-23: enable this to be set via a CLI arg + # for being more explicit. + self._default_minor_version = host_interpreter_minor_version() + if None in self._target_versions and len(self._target_versions) > 2: raise ValueError( f"all python versions need to be specified explicitly, got: {platforms}" @@ -540,21 +545,21 @@ def _add_req(self, req: Requirement, extras: Set[str]) -> None: ): continue - if match_arch and self._add_version_select: + if match_arch and self._default_minor_version: self._add(req.name, plat) - if plat.minor_version == host_interpreter_minor_version(): + if plat.minor_version == self._default_minor_version: self._add(req.name, Platform(plat.os, plat.arch)) elif match_arch: - self._add(req.name, plat) - elif match_os and self._add_version_select: + self._add(req.name, Platform(plat.os, plat.arch)) + elif match_os and self._default_minor_version: self._add(req.name, Platform(plat.os, minor_version=plat.minor_version)) - if plat.minor_version == host_interpreter_minor_version(): + if plat.minor_version == self._default_minor_version: self._add(req.name, Platform(plat.os)) elif match_os: self._add(req.name, Platform(plat.os)) - elif match_version and self._add_version_select: + elif match_version and self._default_minor_version: self._add(req.name, Platform(minor_version=plat.minor_version)) - if plat.minor_version == host_interpreter_minor_version(): + if plat.minor_version == self._default_minor_version: self._add(req.name, Platform()) elif match_version: self._add(req.name, None) diff --git a/tests/pypi/whl_installer/wheel_test.py b/tests/pypi/whl_installer/wheel_test.py index 9b27205ac9..76bfe720bc 100644 --- a/tests/pypi/whl_installer/wheel_test.py +++ b/tests/pypi/whl_installer/wheel_test.py @@ -217,6 +217,42 @@ def test_can_get_deps_based_on_specific_python_version(self): self.assertEqual(["bar"], py38_deps.deps) self.assertEqual({"@platforms//os:linux": ["posix_dep"]}, py38_deps.deps_select) + @mock.patch( + "python.private.pypi.whl_installer.wheel.host_interpreter_minor_version" + ) + def test_no_version_select_when_single_version(self, mock_host_interpreter_version): + requires_dist = [ + "bar", + "baz; python_version >= '3.8'", + "posix_dep; os_name=='posix'", + "posix_dep_with_version; os_name=='posix' and python_version >= '3.8'", + "arch_dep; platform_machine=='x86_64' and python_version >= '3.8'", + ] + mock_host_interpreter_version.return_value = 7 + + self.maxDiff = None + + deps = wheel.Deps( + "foo", + requires_dist=requires_dist, + platforms=[ + wheel.Platform(os=os, arch=wheel.Arch.x86_64, minor_version=minor) + for minor in [8] + for os in [wheel.OS.linux, wheel.OS.windows] + ], + ) + got = deps.build() + + self.assertEqual(["bar", "baz"], got.deps) + self.assertEqual( + { + "@platforms//os:linux": ["posix_dep", "posix_dep_with_version"], + "linux_x86_64": ["arch_dep", "posix_dep", "posix_dep_with_version"], + "windows_x86_64": ["arch_dep"], + }, + got.deps_select, + ) + @mock.patch( "python.private.pypi.whl_installer.wheel.host_interpreter_minor_version" ) @@ -227,6 +263,7 @@ def test_can_get_version_select(self, mock_host_interpreter_version): "baz_new; python_version >= '3.8'", "posix_dep; os_name=='posix'", "posix_dep_with_version; os_name=='posix' and python_version >= '3.8'", + "arch_dep; platform_machine=='x86_64' and python_version < '3.8'", ] mock_host_interpreter_version.return_value = 7 @@ -251,6 +288,8 @@ def test_can_get_version_select(self, mock_host_interpreter_version): "@//python/config_settings:is_python_3.8": ["baz_new"], "@//python/config_settings:is_python_3.9": ["baz_new"], "@platforms//os:linux": ["baz", "posix_dep"], + "cp37_linux_x86_64": ["arch_dep", "baz", "posix_dep"], + "cp37_windows_x86_64": ["arch_dep", "baz"], "cp37_linux_anyarch": ["baz", "posix_dep"], "cp38_linux_anyarch": [ "baz_new", @@ -262,6 +301,8 @@ def test_can_get_version_select(self, mock_host_interpreter_version): "posix_dep", "posix_dep_with_version", ], + "linux_x86_64": ["arch_dep", "baz", "posix_dep"], + "windows_x86_64": ["arch_dep", "baz"], }, got.deps_select, ) From 49d180fc773da54df63386c64790dbf8b7616735 Mon Sep 17 00:00:00 2001 From: Nic <138107617+nicbadiu@users.noreply.github.com> Date: Wed, 26 Jun 2024 20:32:09 +0300 Subject: [PATCH 100/345] fix(multiplatform): Add i386 Linux support (#1999) Enable i386 Linux platform detection support. Without this change `rules_python` complains about an unrecognized platform when run on a 32-bit platform, e.g. where `os.uname().machine` returns `i686`. This effectively makes `rules_python` unusable on 32-bit platforms. --- python/versions.bzl | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/python/versions.bzl b/python/versions.bzl index 26b975d068..fd385cd1d5 100644 --- a/python/versions.bzl +++ b/python/versions.bzl @@ -532,6 +532,17 @@ PLATFORMS = { 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", From 11133b3e593243868a7a5926dab4fec5d455df40 Mon Sep 17 00:00:00 2001 From: Mark Elliot <123787712+mark-thm@users.noreply.github.com> Date: Wed, 26 Jun 2024 18:29:36 -0400 Subject: [PATCH 101/345] fix: Fix broken logger statement in parse_requirements.bzl (#2017) parse_requirements.bzl includes a broken logger statement by passing a string instead of a lambda. The result is that when a hash is no longer available on pypi (say, due to a release being yanked) that rules_python causes Bazel to halt. Since we use Bazel to generate requirements files, this means the only solution is to use non-Bazel tooling to get back to a functional state before then running Bazel tooling to update the requirements file -- all down to a faulty log statement. This PR corrects the faulty log statement. A more thorough fix might be to update the logger to warn if its invoked with a string instead of a lambda rather than failing. An example traceback which led to this discovery: ``` ERROR: Traceback (most recent call last): File ".../external/rules_python~/python/private/bzlmod/pip.bzl", line 472, column 52, in _pip_impl is_hub_reproducible = _create_whl_repos(module_ctx, pip_attr, hub_whl_map, whl_overrides, hub_group_map, simpleapi_cache) File ".../external/rules_python~/python/private/bzlmod/pip.bzl", line 187, column 50, in _create_whl_repos requirements_by_platform = parse_requirements( File ".../external/rules_python~/python/private/parse_requirements.bzl", line 348, column 37, in parse_requirements whls, sdist = _add_dists( File ".../external/rules_python~/python/private/parse_requirements.bzl", line 452, column 24, in _add_dists logger.warn("Could not find a whl or an sdist with sha256={}".format(sha256)) File ".../external/rules_python~/python/private/repo_utils.bzl", line 78, column 39, in lambda warn = lambda message_cb: _log(0, "WARNING", message_cb), File ".../external/rules_python~/python/private/repo_utils.bzl", line 72, column 71, in _log print("\nrules_python: {}: ".format(level.upper()), message_cb()) # buildifier: disable=print Error: 'string' object is not callable ``` --------- Co-authored-by: Richard Levasseur --- CHANGELOG.md | 1 + python/private/pypi/parse_requirements.bzl | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0cbf2f91ce..9dc5ec4bca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,7 @@ A brief description of the categories of changes: platform specific wheel and use `experimental_target_platforms`. Fixes [#1996](https://github.com/bazelbuild/rules_python/issues/1996). * (rules) The first element of the default outputs is now the executable again. +* (pip) Fixed crash when pypi packages lacked a sha (e.g. yanked packages) ### Removed * (pip): Removes the `entrypoint` macro that was replaced by `py_console_script_binary` in 0.26.0. diff --git a/python/private/pypi/parse_requirements.bzl b/python/private/pypi/parse_requirements.bzl index 22a6f0a875..f99329a995 100644 --- a/python/private/pypi/parse_requirements.bzl +++ b/python/private/pypi/parse_requirements.bzl @@ -449,7 +449,7 @@ def _add_dists(requirement, index_urls, python_version, logger = None): continue if logger: - logger.warn("Could not find a whl or an sdist with sha256={}".format(sha256)) + logger.warn(lambda: "Could not find a whl or an sdist with sha256={}".format(sha256)) yanked = {} for dist in whls + [sdist]: From 4e70959c1ec2629581989fb2145fe65cab101360 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 27 Jun 2024 19:30:17 -0700 Subject: [PATCH 102/345] feat: add runtime_env toolchain suite to replace "autodetecting" toolchain (#2018) This adds a more comprehensive replacement for the "autodetecting" toolchain. Specifically, it defines all our toolchain types so that they take precedence when specified. This prevents the hermetic toolchains (registered by default) from accidentally being used when undesired. To keep the behavior backwards compatible, an alias is added for the autodetecting toolchain with a deprecation notice. The name `runtime_env` was chosen instead of "autodetecting" so that it's more clear these toolchains are not "automatic" or "detecting" anything -- they're just taking a value from the runtime environment and using it. --------- Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> --- .bazelci/presubmit.yml | 1 + CHANGELOG.md | 7 ++ docs/sphinx/api/python/index.md | 15 +-- .../python/runtime_env_toolchains/index.md | 38 ++++++ docs/sphinx/toolchains.md | 2 +- python/BUILD.bazel | 10 +- python/private/BUILD.bazel | 23 +++- python/private/autodetecting_toolchain.bzl | 71 ----------- python/private/py_cc_toolchain_rule.bzl | 8 ++ python/private/py_exec_tools_toolchain.bzl | 19 ++- python/private/py_runtime_pair_rule.bzl | 9 ++ python/private/runtime_env_toolchain.bzl | 112 ++++++++++++++++++ ...h => runtime_env_toolchain_interpreter.sh} | 4 +- python/runtime_env_toolchains/BUILD.bazel | 19 +++ .../precompile/precompile_tests.bzl | 1 + tests/runtime_env_toolchain/BUILD.bazel | 17 +++ .../runtime_env_toolchain_tests.bzl | 101 ++++++++++++++++ tests/support/support.bzl | 1 + 18 files changed, 363 insertions(+), 95 deletions(-) create mode 100644 docs/sphinx/api/python/runtime_env_toolchains/index.md delete mode 100644 python/private/autodetecting_toolchain.bzl create mode 100644 python/private/runtime_env_toolchain.bzl rename python/private/{autodetecting_toolchain_interpreter.sh => runtime_env_toolchain_interpreter.sh} (94%) create mode 100644 python/runtime_env_toolchains/BUILD.bazel create mode 100644 tests/runtime_env_toolchain/BUILD.bazel create mode 100644 tests/runtime_env_toolchain/runtime_env_toolchain_tests.bzl diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 9fd7cae311..b778ac49a4 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -182,6 +182,7 @@ tasks: platform: rbe_ubuntu1604 test_flags: - "--test_tag_filters=-integration-test,-acceptance-test" + - "--extra_toolchains=@buildkite_config//config:cc-toolchain" integration_test_build_file_generation_ubuntu_minimum_supported_workspace: <<: *minimum_supported_version diff --git a/CHANGELOG.md b/CHANGELOG.md index 9dc5ec4bca..1fe53e70d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,9 @@ A brief description of the categories of changes: * (toolchains) The exec tools toolchain now finds its interpreter by reusing the regular interpreter toolchain. This avoids having to duplicate specifying where the runtime for the exec tools toolchain is. +* (toolchains) ({obj}`//python:autodetecting_toolchain`) is deprecated. It is + replaced by {obj}`//python/runtime_env_toolchains:all`. The old target will be + removed in a future release. ### Fixed * (bzlmod): Targets in `all_requirements` now use the same form as targets returned by the `requirement` macro. @@ -47,6 +50,10 @@ A brief description of the categories of changes: * (rules) The first element of the default outputs is now the executable again. * (pip) Fixed crash when pypi packages lacked a sha (e.g. yanked packages) +### Added +* (toolchains) {obj}`//python/runtime_env_toolchains:all`, which is a drop-in + replacement for the "autodetecting" toolchain. + ### Removed * (pip): Removes the `entrypoint` macro that was replaced by `py_console_script_binary` in 0.26.0. diff --git a/docs/sphinx/api/python/index.md b/docs/sphinx/api/python/index.md index 494e7b4a02..6c794475ac 100644 --- a/docs/sphinx/api/python/index.md +++ b/docs/sphinx/api/python/index.md @@ -26,18 +26,11 @@ provides: ::::{target} autodetecting_toolchain -A simple toolchain that simply uses `python3` from the runtime environment. +Legacy toolchain; despite its name, it doesn't autodetect anything. -Note that this toolchain provides no build-time information, which makes it of -limited utility. +:::{deprecated} 0.34.0 -This is only provided to aid migration off the builtin Bazel toolchain -(`@bazel_tools//python:autodetecting_toolchain`), and is largely only applicable -to WORKSPACE builds. - -:::{deprecated} unspecified - -Switch to using a hermetic toolchain or manual toolchain configuration instead. +Use {obj}`@rules_python//python/runtime_env_toolchain:all` instead. ::: - :::: + diff --git a/docs/sphinx/api/python/runtime_env_toolchains/index.md b/docs/sphinx/api/python/runtime_env_toolchains/index.md new file mode 100644 index 0000000000..ef31f086d7 --- /dev/null +++ b/docs/sphinx/api/python/runtime_env_toolchains/index.md @@ -0,0 +1,38 @@ +:::{default-domain} bzl +::: +:::{bzl:currentfile} //python/runtime_env_toolchain:BUILD.bazel +::: + +# //python/runtime_env_toolchain + +::::{target} all + +A set of toolchains that invoke `python3` from the runtime environment. + +Note that this toolchain provides no build-time information, which makes it of +limited utility. This is because the invocation of `python3` is done when a +program is run, not at build time. + +This is only provided to aid migration off the builtin Bazel toolchain +(`@bazel_tools//python:autodetecting_toolchain`), and is largely only applicable +to WORKSPACE builds. + +To use this target, register it as a toolchain in WORKSPACE or MODULE.bazel: + +::: +register_toolchains("@rules_python//python/runtime_env_toolchains:all") +::: + +The benefit of this target over the legacy targets is this defines additional +toolchain types that rules_python needs. This prevents toolchain resolution from +continuing to search elsewhere (e.g. potentially incurring a download of the +hermetic runtimes when they won't be used). + +:::{deprecated} 0.34.0 + +Switch to using a hermetic toolchain or manual toolchain configuration instead. +::: + +:::{versionadded} 0.34.0 +::: +:::: diff --git a/docs/sphinx/toolchains.md b/docs/sphinx/toolchains.md index 26557cabed..fac1bfc6b0 100644 --- a/docs/sphinx/toolchains.md +++ b/docs/sphinx/toolchains.md @@ -240,5 +240,5 @@ automatically registers a higher-priority toolchain; it won't be used unless there is a toolchain misconfiguration somewhere. To aid migration off the Bazel-builtin toolchain, rules_python provides -{obj}`@rules_python//python:autodetecting_toolchain`. This is an equivalent +{obj}`@rules_python//python/runtime_env_toolchains:all`. This is an equivalent toolchain, but is implemented using rules_python's objects. diff --git a/python/BUILD.bazel b/python/BUILD.bazel index 96b2282221..7a69ac8051 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -24,7 +24,6 @@ that @rules_python//python is only concerned with the core rules. """ load("@bazel_skylib//:bzl_library.bzl", "bzl_library") -load("//python/private:autodetecting_toolchain.bzl", "define_autodetecting_toolchain") load(":current_py_toolchain.bzl", "current_py_toolchain") package(default_visibility = ["//visibility:public"]) @@ -320,11 +319,16 @@ toolchain_type( # safe if you know for a fact that your build is completely compatible with the # version of the `python` command installed on the target platform. -define_autodetecting_toolchain(name = "autodetecting_toolchain") +alias( + name = "autodetecting_toolchain", + actual = "//python/runtime_env_toolchains:runtime_env_toolchain", + deprecation = "Use //python/runtime_env_toolchains:all instead", +) alias( name = "autodetecting_toolchain_nonstrict", - actual = ":autodetecting_toolchain", + actual = "//python/runtime_env_toolchains:runtime_env_toolchain", + deprecation = "Use //python/runtime_env_toolchains:all instead", ) # ========= Packaging rules ========= diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index ccc6acdcbf..9c759cba9a 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -13,6 +13,7 @@ # limitations under the License. load("@bazel_skylib//:bzl_library.bzl", "bzl_library") +load("@bazel_skylib//rules:common_settings.bzl", "bool_setting") load("//python:py_binary.bzl", "py_binary") load("//python:py_library.bzl", "py_library") load("//python:versions.bzl", "print_toolchains_checksums") @@ -58,9 +59,10 @@ bzl_library( ) bzl_library( - name = "autodetecting_toolchain_bzl", - srcs = ["autodetecting_toolchain.bzl"], + name = "runtime_env_toolchain_bzl", + srcs = ["runtime_env_toolchain.bzl"], deps = [ + ":py_exec_tools_toolchain_bzl", ":toolchain_types_bzl", "//python:py_runtime_bzl", "//python:py_runtime_pair_bzl", @@ -140,6 +142,7 @@ bzl_library( ":py_cc_toolchain_info_bzl", ":rules_cc_srcs_bzl", ":util_bzl", + "@bazel_skylib//rules:common_settings", ], ) @@ -164,7 +167,11 @@ bzl_library( bzl_library( name = "py_exec_tools_toolchain_bzl", srcs = ["py_exec_tools_toolchain.bzl"], - deps = ["//python/private/common:providers_bzl"], + deps = [ + ":toolchain_types_bzl", + "//python/private/common:providers_bzl", + "@bazel_skylib//rules:common_settings", + ], ) bzl_library( @@ -192,6 +199,7 @@ bzl_library( deps = [ "//python:py_runtime_bzl", "//python:py_runtime_info_bzl", + "@bazel_skylib//rules:common_settings", ], ) @@ -365,6 +373,15 @@ config_setting( }, ) +# This should only be set by analysis tests to expose additional metadata to +# aid testing, so a setting instead of a flag. +bool_setting( + name = "visible_for_testing", + build_setting_default = False, + # This is only because it is an implicit dependency by the toolchains. + visibility = ["//visibility:public"], +) + print_toolchains_checksums(name = "print_toolchains_checksums") # Used for py_console_script_gen rule diff --git a/python/private/autodetecting_toolchain.bzl b/python/private/autodetecting_toolchain.bzl deleted file mode 100644 index 174136e870..0000000000 --- a/python/private/autodetecting_toolchain.bzl +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright 2019 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. - -"""Definitions related to the Python toolchain.""" - -load("//python:py_runtime.bzl", "py_runtime") -load("//python:py_runtime_pair.bzl", "py_runtime_pair") -load(":toolchain_types.bzl", "TARGET_TOOLCHAIN_TYPE") - -def define_autodetecting_toolchain(name): - """Defines the autodetecting Python toolchain. - - Args: - name: The name of the toolchain to introduce. Must have value - "autodetecting_toolchain". This param is present only to make the - BUILD file more readable. - """ - if name != "autodetecting_toolchain": - fail("Python autodetecting toolchain must be named " + - "'autodetecting_toolchain'") - - # buildifier: disable=native-py - py_runtime( - name = "_autodetecting_py3_runtime", - interpreter = "//python/private:autodetecting_toolchain_interpreter.sh", - python_version = "PY3", - stub_shebang = "#!/usr/bin/env python3", - visibility = ["//visibility:private"], - ) - - # This is a dummy runtime whose interpreter_path triggers the native rule - # logic to use the legacy behavior on Windows. - # TODO(#7844): Remove this target. - # buildifier: disable=native-py - py_runtime( - name = "_magic_sentinel_runtime", - interpreter_path = "/_magic_pyruntime_sentinel_do_not_use", - python_version = "PY3", - visibility = ["//visibility:private"], - ) - - py_runtime_pair( - name = "_autodetecting_py_runtime_pair", - py3_runtime = select({ - # If we're on windows, inject the sentinel to tell native rule logic - # that we attempted to use the autodetecting toolchain and need to - # switch back to legacy behavior. - # TODO(#7844): Remove this hack. - "@platforms//os:windows": ":_magic_sentinel_runtime", - "//conditions:default": ":_autodetecting_py3_runtime", - }), - visibility = ["//visibility:public"], - ) - - native.toolchain( - name = name, - toolchain = ":_autodetecting_py_runtime_pair", - toolchain_type = TARGET_TOOLCHAIN_TYPE, - visibility = ["//visibility:public"], - ) diff --git a/python/private/py_cc_toolchain_rule.bzl b/python/private/py_cc_toolchain_rule.bzl index 5d3debb702..1599415ac7 100644 --- a/python/private/py_cc_toolchain_rule.bzl +++ b/python/private/py_cc_toolchain_rule.bzl @@ -18,6 +18,7 @@ NOTE: This is a beta-quality feature. APIs subject to change until https://github.com/bazelbuild/rules_python/issues/824 is considered done. """ +load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("@rules_cc//cc:defs.bzl", "CcInfo") load(":py_cc_toolchain_info.bzl", "PyCcToolchainInfo") @@ -37,8 +38,12 @@ def _py_cc_toolchain_impl(ctx): ), python_version = ctx.attr.python_version, ) + extra_kwargs = {} + if ctx.attr._visible_for_testing[BuildSettingInfo].value: + extra_kwargs["toolchain_label"] = ctx.label return [platform_common.ToolchainInfo( py_cc_toolchain = py_cc_toolchain, + **extra_kwargs )] py_cc_toolchain = rule( @@ -60,6 +65,9 @@ py_cc_toolchain = rule( doc = "The Major.minor Python version, e.g. 3.11", mandatory = True, ), + "_visible_for_testing": attr.label( + default = "//python/private:visible_for_testing", + ), }, doc = """\ A toolchain for a Python runtime's C/C++ information (e.g. headers) diff --git a/python/private/py_exec_tools_toolchain.bzl b/python/private/py_exec_tools_toolchain.bzl index 5c17b89625..b3d0fb2634 100644 --- a/python/private/py_exec_tools_toolchain.bzl +++ b/python/private/py_exec_tools_toolchain.bzl @@ -14,14 +14,22 @@ """Rule that defines a toolchain for build tools.""" +load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("//python/private:toolchain_types.bzl", "TARGET_TOOLCHAIN_TYPE") load(":py_exec_tools_info.bzl", "PyExecToolsInfo") def _py_exec_tools_toolchain_impl(ctx): - return [platform_common.ToolchainInfo(exec_tools = PyExecToolsInfo( - exec_interpreter = ctx.attr.exec_interpreter, - precompiler = ctx.attr.precompiler, - ))] + extra_kwargs = {} + if ctx.attr._visible_for_testing[BuildSettingInfo].value: + extra_kwargs["toolchain_label"] = ctx.label + + return [platform_common.ToolchainInfo( + exec_tools = PyExecToolsInfo( + exec_interpreter = ctx.attr.exec_interpreter, + precompiler = ctx.attr.precompiler, + ), + **extra_kwargs + )] py_exec_tools_toolchain = rule( implementation = _py_exec_tools_toolchain_impl, @@ -36,6 +44,9 @@ py_exec_tools_toolchain = rule( cfg = "exec", doc = "See PyExecToolsInfo.precompiler", ), + "_visible_for_testing": attr.label( + default = "//python/private:visible_for_testing", + ), }, ) diff --git a/python/private/py_runtime_pair_rule.bzl b/python/private/py_runtime_pair_rule.bzl index 02f9a5ba89..eb91413563 100644 --- a/python/private/py_runtime_pair_rule.bzl +++ b/python/private/py_runtime_pair_rule.bzl @@ -14,6 +14,7 @@ """Implementation of py_runtime_pair.""" +load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("//python:py_runtime_info.bzl", "PyRuntimeInfo") load("//python/private:reexports.bzl", "BuiltinPyRuntimeInfo") load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") @@ -40,9 +41,14 @@ def _py_runtime_pair_impl(ctx): # fail("Using Python 2 is not supported and disabled; see " + # "https://github.com/bazelbuild/bazel/issues/15684") + extra_kwargs = {} + if ctx.attr._visible_for_testing[BuildSettingInfo].value: + extra_kwargs["toolchain_label"] = ctx.label + return [platform_common.ToolchainInfo( py2_runtime = py2_runtime, py3_runtime = py3_runtime, + **extra_kwargs )] def _get_py_runtime_info(target): @@ -85,6 +91,9 @@ The runtime to use for Python 3 targets. Must have `python_version` set to `PY3`. """, ), + "_visible_for_testing": attr.label( + default = "//python/private:visible_for_testing", + ), }, fragments = ["py"], doc = """\ diff --git a/python/private/runtime_env_toolchain.bzl b/python/private/runtime_env_toolchain.bzl new file mode 100644 index 0000000000..1601926178 --- /dev/null +++ b/python/private/runtime_env_toolchain.bzl @@ -0,0 +1,112 @@ +# Copyright 2019 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. +"""Definitions related to the Python toolchain.""" + +load("@rules_cc//cc:defs.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(":py_exec_tools_toolchain.bzl", "py_exec_tools_toolchain") +load(":toolchain_types.bzl", "EXEC_TOOLS_TOOLCHAIN_TYPE", "PY_CC_TOOLCHAIN_TYPE", "TARGET_TOOLCHAIN_TYPE") + +_IS_EXEC_TOOLCHAIN_ENABLED = Label("//python/config_settings:is_exec_tools_toolchain_enabled") + +def define_runtime_env_toolchain(name): + """Defines the runtime_env Python toolchain. + + This is a minimal suite of toolchains that provided limited functionality. + They're mostly only useful to aid migration off the builtin + `@bazel_tools//tools/python:autodetecting_toolchain` toolchain. + + NOTE: This was previously called the "autodetecting" toolchain, but was + renamed to better reflect its behavior, since it doesn't autodetect + anything. + + Args: + name: The name of the toolchain to introduce. + """ + base_name = name.replace("_toolchain", "") + + py_runtime( + name = "_runtime_env_py3_runtime", + interpreter = "//python/private:runtime_env_toolchain_interpreter.sh", + python_version = "PY3", + stub_shebang = "#!/usr/bin/env python3", + visibility = ["//visibility:private"], + tags = ["manual"], + ) + + # This is a dummy runtime whose interpreter_path triggers the native rule + # logic to use the legacy behavior on Windows. + # TODO(#7844): Remove this target. + py_runtime( + name = "_magic_sentinel_runtime", + interpreter_path = "/_magic_pyruntime_sentinel_do_not_use", + python_version = "PY3", + visibility = ["//visibility:private"], + tags = ["manual"], + ) + + py_runtime_pair( + name = "_runtime_env_py_runtime_pair", + py3_runtime = select({ + # If we're on windows, inject the sentinel to tell native rule logic + # that we attempted to use the runtime_env toolchain and need to + # switch back to legacy behavior. + # TODO(#7844): Remove this hack. + "@platforms//os:windows": ":_magic_sentinel_runtime", + "//conditions:default": ":_runtime_env_py3_runtime", + }), + visibility = ["//visibility:public"], + tags = ["manual"], + ) + + native.toolchain( + name = name, + toolchain = ":_runtime_env_py_runtime_pair", + toolchain_type = TARGET_TOOLCHAIN_TYPE, + visibility = ["//visibility:public"], + ) + + py_exec_tools_toolchain( + name = "_runtime_env_py_exec_tools_toolchain_impl", + precompiler = Label("//tools/precompiler:precompiler"), + visibility = ["//visibility:private"], + tags = ["manual"], + ) + native.toolchain( + name = base_name + "_py_exec_tools_toolchain", + toolchain = "_runtime_env_py_exec_tools_toolchain_impl", + toolchain_type = EXEC_TOOLS_TOOLCHAIN_TYPE, + target_settings = [_IS_EXEC_TOOLCHAIN_ENABLED], + visibility = ["//visibility:public"], + ) + cc_library( + name = "_empty_cc_lib", + visibility = ["//visibility:private"], + tags = ["manual"], + ) + py_cc_toolchain( + name = "_runtime_env_py_cc_toolchain_impl", + headers = ":_empty_cc_lib", + libs = ":_empty_cc_lib", + python_version = "0.0", + tags = ["manual"], + ) + native.toolchain( + name = base_name + "_py_cc_toolchain", + toolchain = ":_runtime_env_py_cc_toolchain_impl", + toolchain_type = PY_CC_TOOLCHAIN_TYPE, + visibility = ["//visibility:public"], + ) diff --git a/python/private/autodetecting_toolchain_interpreter.sh b/python/private/runtime_env_toolchain_interpreter.sh similarity index 94% rename from python/private/autodetecting_toolchain_interpreter.sh rename to python/private/runtime_env_toolchain_interpreter.sh index 5c8a10d601..2cb7cc7151 100644 --- a/python/private/autodetecting_toolchain_interpreter.sh +++ b/python/private/runtime_env_toolchain_interpreter.sh @@ -8,8 +8,8 @@ set -u # We do lose the ability to set -o pipefail. FAILURE_HEADER="\ -Error occurred while attempting to use the default Python toolchain \ -(@rules_python//python:autodetecting_toolchain)." +Error occurred while attempting to use the deprecated Python toolchain \ +(@rules_python//python/runtime_env_toolchain:all)." die() { echo "$FAILURE_HEADER" 1>&2 diff --git a/python/runtime_env_toolchains/BUILD.bazel b/python/runtime_env_toolchains/BUILD.bazel new file mode 100644 index 0000000000..21355ac939 --- /dev/null +++ b/python/runtime_env_toolchains/BUILD.bazel @@ -0,0 +1,19 @@ +# 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("//python/private:runtime_env_toolchain.bzl", "define_runtime_env_toolchain") + +package(default_visibility = ["//:__subpackages__"]) + +define_runtime_env_toolchain(name = "runtime_env_toolchain") diff --git a/tests/base_rules/precompile/precompile_tests.bzl b/tests/base_rules/precompile/precompile_tests.bzl index 58bdafe39c..5599f6101f 100644 --- a/tests/base_rules/precompile/precompile_tests.bzl +++ b/tests/base_rules/precompile/precompile_tests.bzl @@ -122,6 +122,7 @@ def _test_pyc_only(name): "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, ##PRECOMPILE_SOURCE_RETENTION: "omit_source", EXEC_TOOLS_TOOLCHAIN: "enabled", + PRECOMPILE: "enabled", }, target = name + "_subject", ) diff --git a/tests/runtime_env_toolchain/BUILD.bazel b/tests/runtime_env_toolchain/BUILD.bazel new file mode 100644 index 0000000000..ebcdbaf017 --- /dev/null +++ b/tests/runtime_env_toolchain/BUILD.bazel @@ -0,0 +1,17 @@ +# 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(":runtime_env_toolchain_tests.bzl", "runtime_env_toolchain_test_suite") + +runtime_env_toolchain_test_suite(name = "runtime_env_toolchain_tests") diff --git a/tests/runtime_env_toolchain/runtime_env_toolchain_tests.bzl b/tests/runtime_env_toolchain/runtime_env_toolchain_tests.bzl new file mode 100644 index 0000000000..9885a1ef9b --- /dev/null +++ b/tests/runtime_env_toolchain/runtime_env_toolchain_tests.bzl @@ -0,0 +1,101 @@ +# 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. + +"""Starlark tests for py_runtime rule.""" + +load("@rules_testing//lib:analysis_test.bzl", "analysis_test") +load("@rules_testing//lib:test_suite.bzl", "test_suite") +load("@rules_testing//lib:util.bzl", rt_util = "util") +load( + "//python/private:toolchain_types.bzl", + "EXEC_TOOLS_TOOLCHAIN_TYPE", + "PY_CC_TOOLCHAIN_TYPE", + "TARGET_TOOLCHAIN_TYPE", +) # buildifier: disable=bzl-visibility +load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility +load("//tests/support:support.bzl", "CC_TOOLCHAIN", "EXEC_TOOLS_TOOLCHAIN", "VISIBLE_FOR_TESTING") + +_LookupInfo = provider() # buildifier: disable=provider-params + +def _use_toolchains_impl(ctx): + return [ + _LookupInfo( + target = ctx.toolchains[TARGET_TOOLCHAIN_TYPE], + exec = ctx.toolchains[EXEC_TOOLS_TOOLCHAIN_TYPE], + cc = ctx.toolchains[PY_CC_TOOLCHAIN_TYPE], + ), + ] + +_use_toolchains = rule( + implementation = _use_toolchains_impl, + toolchains = [ + TARGET_TOOLCHAIN_TYPE, + EXEC_TOOLS_TOOLCHAIN_TYPE, + PY_CC_TOOLCHAIN_TYPE, + ], +) + +_tests = [] + +def _test_runtime_env_toolchain_matches(name): + rt_util.helper_target( + _use_toolchains, + name = name + "_subject", + ) + extra_toolchains = [ + str(Label("//python/runtime_env_toolchains:all")), + ] + + # We have to add a cc toolchain because py_cc toolchain depends on it. + # However, that package also defines a different fake py_cc toolchain we + # don't want to use, so we need to ensure the runtime_env toolchain has + # higher precendence. + # However, Bazel 6 and Bazel 7 process --extra_toolchains in different + # orders: + # * Bazel 6 goes left to right + # * Bazel 7 goes right to left + # We could just put our preferred toolchain before *and* after + # the undesired toolchain... + # However, Bazel 7 has a bug where *duplicate* entries are ignored, + # and only the *first* entry is respected. + if IS_BAZEL_7_OR_HIGHER: + extra_toolchains.insert(0, CC_TOOLCHAIN) + else: + extra_toolchains.append(CC_TOOLCHAIN) + analysis_test( + name = name, + impl = _test_runtime_env_toolchain_matches_impl, + target = name + "_subject", + config_settings = { + "//command_line_option:extra_toolchains": extra_toolchains, + EXEC_TOOLS_TOOLCHAIN: "enabled", + VISIBLE_FOR_TESTING: True, + }, + ) + +def _test_runtime_env_toolchain_matches_impl(env, target): + env.expect.that_str( + str(target[_LookupInfo].target.toolchain_label), + ).contains("runtime_env_py_runtime_pair") + env.expect.that_str( + str(target[_LookupInfo].exec.toolchain_label), + ).contains("runtime_env_py_exec_tools") + env.expect.that_str( + str(target[_LookupInfo].cc.toolchain_label), + ).contains("runtime_env_py_cc") + +_tests.append(_test_runtime_env_toolchain_matches) + +def runtime_env_toolchain_test_suite(name): + test_suite(name = name, tests = _tests) diff --git a/tests/support/support.bzl b/tests/support/support.bzl index 2e5820312a..a74346d7b3 100644 --- a/tests/support/support.bzl +++ b/tests/support/support.bzl @@ -37,3 +37,4 @@ PRECOMPILE_ADD_TO_RUNFILES = str(Label("//python/config_settings:precompile_add_ PRECOMPILE_SOURCE_RETENTION = str(Label("//python/config_settings:precompile_source_retention")) 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")) From 8d40b1931dc7e31cf9697869e7437ad9fbd96320 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 28 Jun 2024 11:41:46 +0900 Subject: [PATCH 103/345] fix(bzlmod): only expose common packages via the requirements constants (#1955) With this change the default `gazelle` instructions still work and users do not need to worry about which package is present on which platform. Work towards #260 --- CHANGELOG.md | 14 ++++++++++++++ python/private/pypi/bzlmod.bzl | 10 ++++++++-- python/private/pypi/hub_repository.bzl | 8 +++++++- python/private/pypi/parse_requirements.bzl | 18 ++++++++++++++++++ .../parse_requirements_tests.bzl | 10 ++++++++++ 5 files changed, 57 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1fe53e70d1..93707a1801 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,20 @@ A brief description of the categories of changes: removed in a future release. ### Fixed +* (bzlmod): When using `experimental_index_url` the `all_requirements`, + `all_whl_requirements` and `all_data_requirements` will now only include + common packages that are available on all target platforms. This is to ensure + that packages that are only present for some platforms are pulled only via + the `deps` of the materialized `py_library`. If you would like to include + platform specific packages, using a `select` statement with references to the + specific package will still work (e.g. + ``` + my_attr = all_requirements + select( + { + "@platforms//os:linux": ["@pypi//foo_available_only_on_linux"], + "//conditions:default": [], + } + )`. * (bzlmod): Targets in `all_requirements` now use the same form as targets returned by the `requirement` macro. * (rules) Auto exec groups are enabled. This allows actions run by the rules, such as precompiling, to pick an execution platform separately from what diff --git a/python/private/pypi/bzlmod.bzl b/python/private/pypi/bzlmod.bzl index e98208a2a6..6aafc71831 100644 --- a/python/private/pypi/bzlmod.bzl +++ b/python/private/pypi/bzlmod.bzl @@ -97,7 +97,7 @@ You cannot use both the additive_build_content and additive_build_content_file a whl_mods = whl_mods, ) -def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, simpleapi_cache): +def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, simpleapi_cache, exposed_packages): logger = repo_utils.logger(module_ctx) python_interpreter_target = pip_attr.python_interpreter_target is_hub_reproducible = True @@ -245,7 +245,9 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s 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 for distribution in requirement.whls + [requirement.sdist]: if not distribution: # sdist may be None @@ -290,6 +292,8 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s ) if found_something: + if is_exposed: + exposed_packages.setdefault(hub_name, {})[whl_name] = None continue requirement = select_requirement( @@ -431,6 +435,7 @@ def _pip_impl(module_ctx): # Where hub, whl, and pip are the repo names hub_whl_map = {} hub_group_map = {} + exposed_packages = {} simpleapi_cache = {} is_extension_reproducible = True @@ -470,7 +475,7 @@ def _pip_impl(module_ctx): 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) + 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(): @@ -482,6 +487,7 @@ def _pip_impl(module_ctx): for key, value in whl_map.items() }, default_version = _major_minor_version(DEFAULT_PYTHON_VERSION), + packages = sorted(exposed_packages.get(hub_name, {})), groups = hub_group_map.get(hub_name), ) diff --git a/python/private/pypi/hub_repository.bzl b/python/private/pypi/hub_repository.bzl index 40a3ab13e5..f589dd4744 100644 --- a/python/private/pypi/hub_repository.bzl +++ b/python/private/pypi/hub_repository.bzl @@ -29,7 +29,7 @@ exports_files(["requirements.bzl"]) """ def _impl(rctx): - bzl_packages = rctx.attr.whl_map.keys() + 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)] @@ -77,6 +77,12 @@ setting.""", "groups": attr.string_list_dict( mandatory = False, ), + "packages": attr.string_list( + mandatory = False, + doc = """\ +The list of packages that will be exposed via all_*requirements macros. Defaults to whl_map keys. +""", + ), "repo_name": attr.string( mandatory = True, doc = "The apparent name of the repo. This is needed because in bzlmod, the name attribute becomes the canonical name.", diff --git a/python/private/pypi/parse_requirements.bzl b/python/private/pypi/parse_requirements.bzl index f99329a995..d52180c009 100644 --- a/python/private/pypi/parse_requirements.bzl +++ b/python/private/pypi/parse_requirements.bzl @@ -181,6 +181,8 @@ def parse_requirements( * srcs: The Simple API downloadable source list. * requirement_line: The original requirement line. * target_platforms: The list of target platforms that this package is for. + * is_exposed: A boolean if the package should be exposed via the hub + repository. The second element is extra_pip_args should be passed to `whl_library`. """ @@ -266,6 +268,8 @@ def parse_requirements( for p in DEFAULT_PLATFORMS if p not in configured_platforms ] + for p in plats: + configured_platforms[p] = file contents = ctx.read(file) @@ -344,6 +348,19 @@ def parse_requirements( ret = {} for whl_name, reqs in requirements_by_platform.items(): + requirement_target_platforms = {} + for r in reqs.values(): + for p in r.target_platforms: + requirement_target_platforms[p] = None + + is_exposed = len(requirement_target_platforms) == len(configured_platforms) + if not is_exposed and logger: + logger.debug(lambda: "Package {} will not be exposed because it is only present on a subset of platforms: {} out of {}".format( + whl_name, + sorted(requirement_target_platforms), + sorted(configured_platforms), + )) + for r in sorted(reqs.values(), key = lambda r: r.requirement_line): whls, sdist = _add_dists( r, @@ -362,6 +379,7 @@ def parse_requirements( download = r.download, whls = whls, sdist = sdist, + is_exposed = is_exposed, ), ) diff --git a/tests/pypi/parse_requirements/parse_requirements_tests.bzl b/tests/pypi/parse_requirements/parse_requirements_tests.bzl index 13ce8f44ed..5c33dd83b2 100644 --- a/tests/pypi/parse_requirements/parse_requirements_tests.bzl +++ b/tests/pypi/parse_requirements/parse_requirements_tests.bzl @@ -98,6 +98,7 @@ def _test_simple(env): ], whls = [], sdist = None, + is_exposed = True, ), ], }) @@ -145,6 +146,7 @@ def _test_platform_markers_with_python_version(env): ], whls = [], sdist = None, + is_exposed = True, ), ], }) @@ -181,6 +183,7 @@ def _test_dupe_requirements(env): ], whls = [], sdist = None, + is_exposed = True, ), ], }) @@ -220,6 +223,7 @@ def _test_multi_os(env): target_platforms = ["windows_x86_64"], whls = [], sdist = None, + is_exposed = False, ), ], "foo": [ @@ -244,6 +248,7 @@ def _test_multi_os(env): ], whls = [], sdist = None, + is_exposed = True, ), struct( distribution = "foo", @@ -258,6 +263,7 @@ def _test_multi_os(env): target_platforms = ["windows_x86_64"], whls = [], sdist = None, + is_exposed = True, ), ], }) @@ -317,6 +323,7 @@ def _test_multi_os_download_only_platform(env): target_platforms = ["linux_x86_64"], whls = [], sdist = None, + is_exposed = True, ), ], }) @@ -371,6 +378,7 @@ def _test_os_arch_requirements_with_default(env): target_platforms = ["linux_aarch64", "linux_x86_64"], whls = [], sdist = None, + is_exposed = True, ), struct( distribution = "foo", @@ -385,6 +393,7 @@ def _test_os_arch_requirements_with_default(env): target_platforms = ["linux_super_exotic"], whls = [], sdist = None, + is_exposed = True, ), struct( distribution = "foo", @@ -406,6 +415,7 @@ def _test_os_arch_requirements_with_default(env): ], whls = [], sdist = None, + is_exposed = True, ), ], }) From 49c4dc8239d8d1f8dfab765f6c65750786fd32f5 Mon Sep 17 00:00:00 2001 From: Illia Ovchynnikov Date: Sat, 29 Jun 2024 16:32:14 +0200 Subject: [PATCH 104/345] feat(gazelle): Add directives for label format & normalisation (#1976) Adds new directives to alter default Gazelle label format to third-party dependencies useful for re-using Gazelle plugin with other rules, including `rules_pycross`. Fixes #1939 --- CHANGELOG.md | 5 + gazelle/README.md | 5 +- gazelle/python/configure.go | 19 ++ .../annotation_include_dep/__init__.py | 2 +- .../README.md | 4 + .../WORKSPACE | 0 .../test.yaml | 0 .../test1_unset/BUILD.in | 0 .../test1_unset/BUILD.out | 11 + .../test1_unset/bar.py | 6 + .../test1_unset/gazelle_python.yaml | 6 + .../test2_custom_prefix_colon/BUILD.in | 1 + .../test2_custom_prefix_colon/BUILD.out | 13 + .../test2_custom_prefix_colon/bar.py | 6 + .../gazelle_python.yaml | 6 + .../README.md | 4 + .../WORKSPACE | 0 .../test.yaml | 0 .../test1_type_none/BUILD.in | 1 + .../test1_type_none/BUILD.out | 10 + .../test1_type_none/bar.py | 5 + .../test1_type_none/gazelle_python.yaml | 6 + .../test2_type_pep503/BUILD.in | 1 + .../test2_type_pep503/BUILD.out | 10 + .../test2_type_pep503/bar.py | 5 + .../test2_type_pep503/gazelle_python.yaml | 6 + .../test3_type_snake_case/BUILD.in | 1 + .../test3_type_snake_case/BUILD.out | 10 + .../test3_type_snake_case/bar.py | 5 + .../test3_type_snake_case/gazelle_python.yaml | 6 + .../BUILD.in | 0 .../BUILD.out | 8 + .../test4_unset_defaults_to_snake_case/bar.py | 5 + .../gazelle_python.yaml | 6 + gazelle/pythonconfig/pythonconfig.go | 86 ++++++- gazelle/pythonconfig/pythonconfig_test.go | 238 +++++++++++++++++- 36 files changed, 476 insertions(+), 21 deletions(-) create mode 100644 gazelle/python/testdata/directive_python_label_convention/README.md create mode 100644 gazelle/python/testdata/directive_python_label_convention/WORKSPACE create mode 100644 gazelle/python/testdata/directive_python_label_convention/test.yaml create mode 100644 gazelle/python/testdata/directive_python_label_convention/test1_unset/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_label_convention/test1_unset/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_label_convention/test1_unset/bar.py create mode 100644 gazelle/python/testdata/directive_python_label_convention/test1_unset/gazelle_python.yaml create mode 100644 gazelle/python/testdata/directive_python_label_convention/test2_custom_prefix_colon/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_label_convention/test2_custom_prefix_colon/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_label_convention/test2_custom_prefix_colon/bar.py create mode 100644 gazelle/python/testdata/directive_python_label_convention/test2_custom_prefix_colon/gazelle_python.yaml create mode 100644 gazelle/python/testdata/directive_python_label_normalization/README.md create mode 100644 gazelle/python/testdata/directive_python_label_normalization/WORKSPACE create mode 100644 gazelle/python/testdata/directive_python_label_normalization/test.yaml create mode 100644 gazelle/python/testdata/directive_python_label_normalization/test1_type_none/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_label_normalization/test1_type_none/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_label_normalization/test1_type_none/bar.py create mode 100644 gazelle/python/testdata/directive_python_label_normalization/test1_type_none/gazelle_python.yaml create mode 100644 gazelle/python/testdata/directive_python_label_normalization/test2_type_pep503/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_label_normalization/test2_type_pep503/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_label_normalization/test2_type_pep503/bar.py create mode 100644 gazelle/python/testdata/directive_python_label_normalization/test2_type_pep503/gazelle_python.yaml create mode 100644 gazelle/python/testdata/directive_python_label_normalization/test3_type_snake_case/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_label_normalization/test3_type_snake_case/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_label_normalization/test3_type_snake_case/bar.py create mode 100644 gazelle/python/testdata/directive_python_label_normalization/test3_type_snake_case/gazelle_python.yaml create mode 100644 gazelle/python/testdata/directive_python_label_normalization/test4_unset_defaults_to_snake_case/BUILD.in create mode 100644 gazelle/python/testdata/directive_python_label_normalization/test4_unset_defaults_to_snake_case/BUILD.out create mode 100644 gazelle/python/testdata/directive_python_label_normalization/test4_unset_defaults_to_snake_case/bar.py create mode 100644 gazelle/python/testdata/directive_python_label_normalization/test4_unset_defaults_to_snake_case/gazelle_python.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index 93707a1801..61df0862dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -68,6 +68,11 @@ A brief description of the categories of changes: * (toolchains) {obj}`//python/runtime_env_toolchains:all`, which is a drop-in replacement for the "autodetecting" toolchain. +### Added +* (gazelle) Added new `python_label_convention` and `python_label_normalization` directives. These directive + allows altering default Gazelle label format to third-party dependencies useful for re-using Gazelle plugin + with other rules, including `rules_pycross`. See [#1939](https://github.com/bazelbuild/rules_python/issues/1939). + ### Removed * (pip): Removes the `entrypoint` macro that was replaced by `py_console_script_binary` in 0.26.0. diff --git a/gazelle/README.md b/gazelle/README.md index bb688b961a..d68b94de26 100644 --- a/gazelle/README.md +++ b/gazelle/README.md @@ -204,7 +204,10 @@ Python-specific directives are as follows: | Appends additional visibility labels to each generated target. This directive can be set multiple times. | | | [`# gazelle:python_test_file_pattern`](#directive-python_test_file_pattern) | `*_test.py,test_*.py` | | Filenames matching these comma-separated `glob`s will be mapped to `py_test` targets. | - +| `# gazelle:python_label_convention` | `$distribution_name$` | +| Defines the format of the distribution name in labels to third-party deps. Useful for using Gazelle plugin with other rules with different repository conventions (e.g. `rules_pycross`). Full label is always prepended with (pip) repository name, e.g. `@pip//numpy`. | +| `# gazelle:python_label_normalization` | `snake_case` | +| Controls how distribution names in labels to third-party deps are normalized. Useful for using Gazelle plugin with other rules with different label conventions (e.g. `rules_pycross` uses PEP-503). Can be "snake_case", "none", or "pep503". | #### Directive: `python_root`: diff --git a/gazelle/python/configure.go b/gazelle/python/configure.go index c35a261366..b82dd81f8f 100644 --- a/gazelle/python/configure.go +++ b/gazelle/python/configure.go @@ -67,6 +67,8 @@ func (py *Configurer) KnownDirectives() []string { pythonconfig.DefaultVisibilty, pythonconfig.Visibility, pythonconfig.TestFilePattern, + pythonconfig.LabelConvention, + pythonconfig.LabelNormalization, } } @@ -196,6 +198,23 @@ func (py *Configurer) Configure(c *config.Config, rel string, f *rule.File) { } } config.SetTestFilePattern(globStrings) + case pythonconfig.LabelConvention: + value := strings.TrimSpace(d.Value) + if value == "" { + log.Fatalf("directive '%s' requires a value", pythonconfig.LabelConvention) + } + config.SetLabelConvention(value) + case pythonconfig.LabelNormalization: + switch directiveArg := strings.ToLower(strings.TrimSpace(d.Value)); directiveArg { + case "pep503": + config.SetLabelNormalization(pythonconfig.Pep503LabelNormalizationType) + case "none": + config.SetLabelNormalization(pythonconfig.NoLabelNormalizationType) + case "snake_case": + config.SetLabelNormalization(pythonconfig.SnakeCaseLabelNormalizationType) + default: + config.SetLabelNormalization(pythonconfig.DefaultLabelNormalizationType) + } } } diff --git a/gazelle/python/testdata/annotation_include_dep/__init__.py b/gazelle/python/testdata/annotation_include_dep/__init__.py index 61015346de..a90a1b9f83 100644 --- a/gazelle/python/testdata/annotation_include_dep/__init__.py +++ b/gazelle/python/testdata/annotation_include_dep/__init__.py @@ -1,5 +1,5 @@ -import module1 import foo # third party package +import module1 # gazelle:include_dep //foo/bar:baz # gazelle:include_dep //hello:world,@star_wars//rebel_alliance/luke:skywalker diff --git a/gazelle/python/testdata/directive_python_label_convention/README.md b/gazelle/python/testdata/directive_python_label_convention/README.md new file mode 100644 index 0000000000..8ce0155fb8 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_convention/README.md @@ -0,0 +1,4 @@ +# Directive: `python_label_convention` + +This test case asserts that the `# gazelle:python_label_convention` directive +works as intended when set. \ No newline at end of file diff --git a/gazelle/python/testdata/directive_python_label_convention/WORKSPACE b/gazelle/python/testdata/directive_python_label_convention/WORKSPACE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_label_convention/test.yaml b/gazelle/python/testdata/directive_python_label_convention/test.yaml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_label_convention/test1_unset/BUILD.in b/gazelle/python/testdata/directive_python_label_convention/test1_unset/BUILD.in new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_label_convention/test1_unset/BUILD.out b/gazelle/python/testdata/directive_python_label_convention/test1_unset/BUILD.out new file mode 100644 index 0000000000..697a2027a0 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_convention/test1_unset/BUILD.out @@ -0,0 +1,11 @@ +load("@rules_python//python:defs.bzl", "py_library") + +py_library( + name = "test1_unset", + srcs = ["bar.py"], + visibility = ["//:__subpackages__"], + deps = [ + "@gazelle_python_test//google_cloud_aiplatform", + "@gazelle_python_test//google_cloud_storage", + ], +) diff --git a/gazelle/python/testdata/directive_python_label_convention/test1_unset/bar.py b/gazelle/python/testdata/directive_python_label_convention/test1_unset/bar.py new file mode 100644 index 0000000000..99a4b1ce95 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_convention/test1_unset/bar.py @@ -0,0 +1,6 @@ +from google.cloud import aiplatform, storage + + +def main(): + a = dir(aiplatform) + b = dir(storage) diff --git a/gazelle/python/testdata/directive_python_label_convention/test1_unset/gazelle_python.yaml b/gazelle/python/testdata/directive_python_label_convention/test1_unset/gazelle_python.yaml new file mode 100644 index 0000000000..bd5efaba63 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_convention/test1_unset/gazelle_python.yaml @@ -0,0 +1,6 @@ +manifest: + modules_mapping: + google.cloud.aiplatform: google_cloud_aiplatform + google.cloud.storage: google_cloud_storage + pip_repository: + name: gazelle_python_test diff --git a/gazelle/python/testdata/directive_python_label_convention/test2_custom_prefix_colon/BUILD.in b/gazelle/python/testdata/directive_python_label_convention/test2_custom_prefix_colon/BUILD.in new file mode 100644 index 0000000000..83ce6af886 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_convention/test2_custom_prefix_colon/BUILD.in @@ -0,0 +1 @@ +# gazelle:python_label_convention :$distribution_name$ \ No newline at end of file diff --git a/gazelle/python/testdata/directive_python_label_convention/test2_custom_prefix_colon/BUILD.out b/gazelle/python/testdata/directive_python_label_convention/test2_custom_prefix_colon/BUILD.out new file mode 100644 index 0000000000..061c8e5553 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_convention/test2_custom_prefix_colon/BUILD.out @@ -0,0 +1,13 @@ +load("@rules_python//python:defs.bzl", "py_library") + +# gazelle:python_label_convention :$distribution_name$ + +py_library( + name = "test2_custom_prefix_colon", + srcs = ["bar.py"], + visibility = ["//:__subpackages__"], + deps = [ + "@gazelle_python_test//:google_cloud_aiplatform", + "@gazelle_python_test//:google_cloud_storage", + ], +) diff --git a/gazelle/python/testdata/directive_python_label_convention/test2_custom_prefix_colon/bar.py b/gazelle/python/testdata/directive_python_label_convention/test2_custom_prefix_colon/bar.py new file mode 100644 index 0000000000..99a4b1ce95 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_convention/test2_custom_prefix_colon/bar.py @@ -0,0 +1,6 @@ +from google.cloud import aiplatform, storage + + +def main(): + a = dir(aiplatform) + b = dir(storage) diff --git a/gazelle/python/testdata/directive_python_label_convention/test2_custom_prefix_colon/gazelle_python.yaml b/gazelle/python/testdata/directive_python_label_convention/test2_custom_prefix_colon/gazelle_python.yaml new file mode 100644 index 0000000000..bd5efaba63 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_convention/test2_custom_prefix_colon/gazelle_python.yaml @@ -0,0 +1,6 @@ +manifest: + modules_mapping: + google.cloud.aiplatform: google_cloud_aiplatform + google.cloud.storage: google_cloud_storage + pip_repository: + name: gazelle_python_test diff --git a/gazelle/python/testdata/directive_python_label_normalization/README.md b/gazelle/python/testdata/directive_python_label_normalization/README.md new file mode 100644 index 0000000000..a2e18013a8 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_normalization/README.md @@ -0,0 +1,4 @@ +# Directive: `python_label_normalization` + +This test case asserts that the `# gazelle:python_label_normalization` directive +works as intended when set. \ No newline at end of file diff --git a/gazelle/python/testdata/directive_python_label_normalization/WORKSPACE b/gazelle/python/testdata/directive_python_label_normalization/WORKSPACE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_label_normalization/test.yaml b/gazelle/python/testdata/directive_python_label_normalization/test.yaml new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_label_normalization/test1_type_none/BUILD.in b/gazelle/python/testdata/directive_python_label_normalization/test1_type_none/BUILD.in new file mode 100644 index 0000000000..5f5620a946 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_normalization/test1_type_none/BUILD.in @@ -0,0 +1 @@ +# gazelle:python_label_normalization none \ No newline at end of file diff --git a/gazelle/python/testdata/directive_python_label_normalization/test1_type_none/BUILD.out b/gazelle/python/testdata/directive_python_label_normalization/test1_type_none/BUILD.out new file mode 100644 index 0000000000..6e707789d1 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_normalization/test1_type_none/BUILD.out @@ -0,0 +1,10 @@ +load("@rules_python//python:defs.bzl", "py_library") + +# gazelle:python_label_normalization none + +py_library( + name = "test1_type_none", + srcs = ["bar.py"], + visibility = ["//:__subpackages__"], + deps = ["@gazelle_python_test//google.cloud.storage"], +) diff --git a/gazelle/python/testdata/directive_python_label_normalization/test1_type_none/bar.py b/gazelle/python/testdata/directive_python_label_normalization/test1_type_none/bar.py new file mode 100644 index 0000000000..8b3839e00a --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_normalization/test1_type_none/bar.py @@ -0,0 +1,5 @@ +from google.cloud import storage + + +def main(): + b = dir(storage) diff --git a/gazelle/python/testdata/directive_python_label_normalization/test1_type_none/gazelle_python.yaml b/gazelle/python/testdata/directive_python_label_normalization/test1_type_none/gazelle_python.yaml new file mode 100644 index 0000000000..5bfada4437 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_normalization/test1_type_none/gazelle_python.yaml @@ -0,0 +1,6 @@ +manifest: + modules_mapping: + # Weird google.cloud.storage here on purpose to make normalization apparent + google.cloud.storage: google.cloud.storage + pip_repository: + name: gazelle_python_test diff --git a/gazelle/python/testdata/directive_python_label_normalization/test2_type_pep503/BUILD.in b/gazelle/python/testdata/directive_python_label_normalization/test2_type_pep503/BUILD.in new file mode 100644 index 0000000000..a2cca53870 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_normalization/test2_type_pep503/BUILD.in @@ -0,0 +1 @@ +# gazelle:python_label_normalization pep503 \ No newline at end of file diff --git a/gazelle/python/testdata/directive_python_label_normalization/test2_type_pep503/BUILD.out b/gazelle/python/testdata/directive_python_label_normalization/test2_type_pep503/BUILD.out new file mode 100644 index 0000000000..7a88c8b98e --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_normalization/test2_type_pep503/BUILD.out @@ -0,0 +1,10 @@ +load("@rules_python//python:defs.bzl", "py_library") + +# gazelle:python_label_normalization pep503 + +py_library( + name = "test2_type_pep503", + srcs = ["bar.py"], + visibility = ["//:__subpackages__"], + deps = ["@gazelle_python_test//google-cloud-storage"], +) diff --git a/gazelle/python/testdata/directive_python_label_normalization/test2_type_pep503/bar.py b/gazelle/python/testdata/directive_python_label_normalization/test2_type_pep503/bar.py new file mode 100644 index 0000000000..8b3839e00a --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_normalization/test2_type_pep503/bar.py @@ -0,0 +1,5 @@ +from google.cloud import storage + + +def main(): + b = dir(storage) diff --git a/gazelle/python/testdata/directive_python_label_normalization/test2_type_pep503/gazelle_python.yaml b/gazelle/python/testdata/directive_python_label_normalization/test2_type_pep503/gazelle_python.yaml new file mode 100644 index 0000000000..5bfada4437 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_normalization/test2_type_pep503/gazelle_python.yaml @@ -0,0 +1,6 @@ +manifest: + modules_mapping: + # Weird google.cloud.storage here on purpose to make normalization apparent + google.cloud.storage: google.cloud.storage + pip_repository: + name: gazelle_python_test diff --git a/gazelle/python/testdata/directive_python_label_normalization/test3_type_snake_case/BUILD.in b/gazelle/python/testdata/directive_python_label_normalization/test3_type_snake_case/BUILD.in new file mode 100644 index 0000000000..5d1a19a7a4 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_normalization/test3_type_snake_case/BUILD.in @@ -0,0 +1 @@ +# gazelle:python_label_normalization snake_case \ No newline at end of file diff --git a/gazelle/python/testdata/directive_python_label_normalization/test3_type_snake_case/BUILD.out b/gazelle/python/testdata/directive_python_label_normalization/test3_type_snake_case/BUILD.out new file mode 100644 index 0000000000..77f180c1c7 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_normalization/test3_type_snake_case/BUILD.out @@ -0,0 +1,10 @@ +load("@rules_python//python:defs.bzl", "py_library") + +# gazelle:python_label_normalization snake_case + +py_library( + name = "test3_type_snake_case", + srcs = ["bar.py"], + visibility = ["//:__subpackages__"], + deps = ["@gazelle_python_test//google_cloud_storage"], +) diff --git a/gazelle/python/testdata/directive_python_label_normalization/test3_type_snake_case/bar.py b/gazelle/python/testdata/directive_python_label_normalization/test3_type_snake_case/bar.py new file mode 100644 index 0000000000..8b3839e00a --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_normalization/test3_type_snake_case/bar.py @@ -0,0 +1,5 @@ +from google.cloud import storage + + +def main(): + b = dir(storage) diff --git a/gazelle/python/testdata/directive_python_label_normalization/test3_type_snake_case/gazelle_python.yaml b/gazelle/python/testdata/directive_python_label_normalization/test3_type_snake_case/gazelle_python.yaml new file mode 100644 index 0000000000..5bfada4437 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_normalization/test3_type_snake_case/gazelle_python.yaml @@ -0,0 +1,6 @@ +manifest: + modules_mapping: + # Weird google.cloud.storage here on purpose to make normalization apparent + google.cloud.storage: google.cloud.storage + pip_repository: + name: gazelle_python_test diff --git a/gazelle/python/testdata/directive_python_label_normalization/test4_unset_defaults_to_snake_case/BUILD.in b/gazelle/python/testdata/directive_python_label_normalization/test4_unset_defaults_to_snake_case/BUILD.in new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/directive_python_label_normalization/test4_unset_defaults_to_snake_case/BUILD.out b/gazelle/python/testdata/directive_python_label_normalization/test4_unset_defaults_to_snake_case/BUILD.out new file mode 100644 index 0000000000..22971937ed --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_normalization/test4_unset_defaults_to_snake_case/BUILD.out @@ -0,0 +1,8 @@ +load("@rules_python//python:defs.bzl", "py_library") + +py_library( + name = "test4_unset_defaults_to_snake_case", + srcs = ["bar.py"], + visibility = ["//:__subpackages__"], + deps = ["@gazelle_python_test//google_cloud_storage"], +) diff --git a/gazelle/python/testdata/directive_python_label_normalization/test4_unset_defaults_to_snake_case/bar.py b/gazelle/python/testdata/directive_python_label_normalization/test4_unset_defaults_to_snake_case/bar.py new file mode 100644 index 0000000000..8b3839e00a --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_normalization/test4_unset_defaults_to_snake_case/bar.py @@ -0,0 +1,5 @@ +from google.cloud import storage + + +def main(): + b = dir(storage) diff --git a/gazelle/python/testdata/directive_python_label_normalization/test4_unset_defaults_to_snake_case/gazelle_python.yaml b/gazelle/python/testdata/directive_python_label_normalization/test4_unset_defaults_to_snake_case/gazelle_python.yaml new file mode 100644 index 0000000000..5bfada4437 --- /dev/null +++ b/gazelle/python/testdata/directive_python_label_normalization/test4_unset_defaults_to_snake_case/gazelle_python.yaml @@ -0,0 +1,6 @@ +manifest: + modules_mapping: + # Weird google.cloud.storage here on purpose to make normalization apparent + google.cloud.storage: google.cloud.storage + pip_repository: + name: gazelle_python_test diff --git a/gazelle/pythonconfig/pythonconfig.go b/gazelle/pythonconfig/pythonconfig.go index aa9255290c..41a470a940 100644 --- a/gazelle/pythonconfig/pythonconfig.go +++ b/gazelle/pythonconfig/pythonconfig.go @@ -17,6 +17,7 @@ package pythonconfig import ( "fmt" "path" + "regexp" "strings" "github.com/emirpasic/gods/lists/singlylinkedlist" @@ -77,6 +78,13 @@ const ( // TestFilePattern represents the directive that controls which python // files are mapped to `py_test` targets. TestFilePattern = "python_test_file_pattern" + // LabelConvention represents the directive that defines the format of the + // labels to third-party dependencies. + LabelConvention = "python_label_convention" + // LabelNormalization represents the directive that controls how distribution + // names of labels to third-party dependencies are normalized. Supported values + // are 'none', 'pep503' and 'snake_case' (default). See LabelNormalizationType. + LabelNormalization = "python_label_normalization" ) // GenerationModeType represents one of the generation modes for the Python @@ -96,7 +104,8 @@ const ( ) const ( - packageNameNamingConventionSubstitution = "$package_name$" + packageNameNamingConventionSubstitution = "$package_name$" + distributionNameLabelConventionSubstitution = "$distribution_name$" ) const ( @@ -104,6 +113,10 @@ const ( DefaultVisibilityFmtString = "//%s:__subpackages__" // The default globs used to determine pt_test targets. DefaultTestFilePatternString = "*_test.py,test_*.py" + // The default convention of label of third-party dependencies. + DefaultLabelConvention = "$distribution_name$" + // The default normalization applied to distribution names of third-party dependency labels. + DefaultLabelNormalizationType = SnakeCaseLabelNormalizationType ) // defaultIgnoreFiles is the list of default values used in the @@ -112,14 +125,6 @@ var defaultIgnoreFiles = map[string]struct{}{ "setup.py": {}, } -func SanitizeDistribution(distributionName string) string { - sanitizedDistribution := strings.ToLower(distributionName) - sanitizedDistribution = strings.ReplaceAll(sanitizedDistribution, "-", "_") - sanitizedDistribution = strings.ReplaceAll(sanitizedDistribution, ".", "_") - - return sanitizedDistribution -} - // Configs is an extension of map[string]*Config. It provides finding methods // on top of the mapping. type Configs map[string]*Config @@ -156,8 +161,18 @@ type Config struct { defaultVisibility []string visibility []string testFilePattern []string + labelConvention string + labelNormalization LabelNormalizationType } +type LabelNormalizationType int + +const ( + NoLabelNormalizationType LabelNormalizationType = iota + Pep503LabelNormalizationType + SnakeCaseLabelNormalizationType +) + // New creates a new Config. func New( repoRoot string, @@ -180,6 +195,8 @@ func New( defaultVisibility: []string{fmt.Sprintf(DefaultVisibilityFmtString, "")}, visibility: []string{}, testFilePattern: strings.Split(DefaultTestFilePatternString, ","), + labelConvention: DefaultLabelConvention, + labelNormalization: DefaultLabelNormalizationType, } } @@ -209,6 +226,8 @@ func (c *Config) NewChild() *Config { defaultVisibility: c.defaultVisibility, visibility: c.visibility, testFilePattern: c.testFilePattern, + labelConvention: c.labelConvention, + labelNormalization: c.labelNormalization, } } @@ -263,10 +282,8 @@ func (c *Config) FindThirdPartyDependency(modName string) (string, bool) { } else if gazelleManifest.PipRepository != nil { distributionRepositoryName = gazelleManifest.PipRepository.Name } - sanitizedDistribution := SanitizeDistribution(distributionName) - // @// - lbl := label.New(distributionRepositoryName, sanitizedDistribution, sanitizedDistribution) + lbl := currentCfg.FormatThirdPartyDependency(distributionRepositoryName, distributionName) return lbl.String(), true } } @@ -443,3 +460,48 @@ func (c *Config) SetTestFilePattern(patterns []string) { func (c *Config) TestFilePattern() []string { return c.testFilePattern } + +// SetLabelConvention sets the label convention used for third-party dependencies. +func (c *Config) SetLabelConvention(convention string) { + c.labelConvention = convention +} + +// LabelConvention returns the label convention used for third-party dependencies. +func (c *Config) LabelConvention() string { + return c.labelConvention +} + +// SetLabelConvention sets the label normalization applied to distribution names of third-party dependencies. +func (c *Config) SetLabelNormalization(normalizationType LabelNormalizationType) { + c.labelNormalization = normalizationType +} + +// LabelConvention returns the label normalization applied to distribution names of third-party dependencies. +func (c *Config) LabelNormalization() LabelNormalizationType { + return c.labelNormalization +} + +// FormatThirdPartyDependency returns a label to a third-party dependency performing all formating and normalization. +func (c *Config) FormatThirdPartyDependency(repositoryName string, distributionName string) label.Label { + conventionalDistributionName := strings.ReplaceAll(c.labelConvention, distributionNameLabelConventionSubstitution, distributionName) + + var normConventionalDistributionName string + switch norm := c.LabelNormalization(); norm { + case SnakeCaseLabelNormalizationType: + // See /python/private/normalize_name.bzl + normConventionalDistributionName = strings.ToLower(conventionalDistributionName) + normConventionalDistributionName = regexp.MustCompile(`[-_.]+`).ReplaceAllString(normConventionalDistributionName, "_") + normConventionalDistributionName = strings.Trim(normConventionalDistributionName, "_") + case Pep503LabelNormalizationType: + // See https://packaging.python.org/en/latest/specifications/name-normalization/#name-format + normConventionalDistributionName = strings.ToLower(conventionalDistributionName) // ... "should be lowercased" + normConventionalDistributionName = regexp.MustCompile(`[-_.]+`).ReplaceAllString(normConventionalDistributionName, "-") // ... "all runs of the characters ., -, or _ replaced with a single -" + normConventionalDistributionName = strings.Trim(normConventionalDistributionName, "-") // ... "must start and end with a letter or number" + default: + fallthrough + case NoLabelNormalizationType: + normConventionalDistributionName = conventionalDistributionName + } + + return label.New(repositoryName, normConventionalDistributionName, normConventionalDistributionName) +} diff --git a/gazelle/pythonconfig/pythonconfig_test.go b/gazelle/pythonconfig/pythonconfig_test.go index bf31106e1e..7cdb9af1d1 100644 --- a/gazelle/pythonconfig/pythonconfig_test.go +++ b/gazelle/pythonconfig/pythonconfig_test.go @@ -4,20 +4,244 @@ import ( "testing" ) -func TestDistributionSanitizing(t *testing.T) { +func TestFormatThirdPartyDependency(t *testing.T) { + type testInput struct { + RepositoryName string + DistributionName string + LabelNormalization LabelNormalizationType + LabelConvention string + } + tests := map[string]struct { - input string + input testInput want string }{ - "upper case": {input: "DistWithUpperCase", want: "distwithuppercase"}, - "dashes": {input: "dist-with-dashes", want: "dist_with_dashes"}, - "dots": {input: "dist.with.dots", want: "dist_with_dots"}, - "mixed": {input: "To-be.sanitized", want: "to_be_sanitized"}, + "default / upper case": { + input: testInput{ + DistributionName: "DistWithUpperCase", + RepositoryName: "pip", + LabelNormalization: DefaultLabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//distwithuppercase", + }, + "default / dashes": { + input: testInput{ + DistributionName: "dist-with-dashes", + RepositoryName: "pip", + LabelNormalization: DefaultLabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//dist_with_dashes", + }, + "default / repeating dashes inside": { + input: testInput{ + DistributionName: "friendly--bard", + RepositoryName: "pip", + LabelNormalization: DefaultLabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//friendly_bard", + }, + "default / repeating underscores inside": { + input: testInput{ + DistributionName: "hello___something", + RepositoryName: "pip", + LabelNormalization: DefaultLabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//hello_something", + }, + "default / prefix repeating underscores": { + input: testInput{ + DistributionName: "__hello-something", + RepositoryName: "pip", + LabelNormalization: DefaultLabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//hello_something", + }, + "default / suffix repeating underscores": { + input: testInput{ + DistributionName: "hello-something___", + RepositoryName: "pip", + LabelNormalization: DefaultLabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//hello_something", + }, + "default / prefix repeating dashes": { + input: testInput{ + DistributionName: "---hello-something", + RepositoryName: "pip", + LabelNormalization: DefaultLabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//hello_something", + }, + "default / suffix repeating dashes": { + input: testInput{ + DistributionName: "hello-something----", + RepositoryName: "pip", + LabelNormalization: DefaultLabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//hello_something", + }, + "default / dots": { + input: testInput{ + DistributionName: "dist.with.dots", + RepositoryName: "pip", + LabelNormalization: DefaultLabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//dist_with_dots", + }, + "default / mixed": { + input: testInput{ + DistributionName: "FrIeNdLy-._.-bArD", + RepositoryName: "pip", + LabelNormalization: DefaultLabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//friendly_bard", + }, + "default / upper case / custom prefix & suffix": { + input: testInput{ + DistributionName: "DistWithUpperCase", + RepositoryName: "pip", + LabelNormalization: DefaultLabelNormalizationType, + LabelConvention: "pReFiX-$distribution_name$-sUfFiX", + }, + want: "@pip//prefix_distwithuppercase_suffix", + }, + "noop normalization / mixed": { + input: testInput{ + DistributionName: "not-TO-be.sanitized", + RepositoryName: "pip", + LabelNormalization: NoLabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//not-TO-be.sanitized", + }, + "noop normalization / mixed / custom prefix & suffix": { + input: testInput{ + DistributionName: "not-TO-be.sanitized", + RepositoryName: "pip", + LabelNormalization: NoLabelNormalizationType, + LabelConvention: "pre___$distribution_name$___fix", + }, + want: "@pip//pre___not-TO-be.sanitized___fix", + }, + "pep503 / upper case": { + input: testInput{ + DistributionName: "DistWithUpperCase", + RepositoryName: "pip", + LabelNormalization: Pep503LabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//distwithuppercase", + }, + "pep503 / underscores": { + input: testInput{ + DistributionName: "dist_with_underscores", + RepositoryName: "pip", + LabelNormalization: Pep503LabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//dist-with-underscores", + }, + "pep503 / repeating dashes inside": { + input: testInput{ + DistributionName: "friendly--bard", + RepositoryName: "pip", + LabelNormalization: Pep503LabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//friendly-bard", + }, + "pep503 / repeating underscores inside": { + input: testInput{ + DistributionName: "hello___something", + RepositoryName: "pip", + LabelNormalization: Pep503LabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//hello-something", + }, + "pep503 / prefix repeating underscores": { + input: testInput{ + DistributionName: "__hello-something", + RepositoryName: "pip", + LabelNormalization: Pep503LabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//hello-something", + }, + "pep503 / suffix repeating underscores": { + input: testInput{ + DistributionName: "hello-something___", + RepositoryName: "pip", + LabelNormalization: Pep503LabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//hello-something", + }, + "pep503 / prefix repeating dashes": { + input: testInput{ + DistributionName: "---hello-something", + RepositoryName: "pip", + LabelNormalization: Pep503LabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//hello-something", + }, + "pep503 / suffix repeating dashes": { + input: testInput{ + DistributionName: "hello-something----", + RepositoryName: "pip", + LabelNormalization: Pep503LabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//hello-something", + }, + "pep503 / dots": { + input: testInput{ + DistributionName: "dist.with.dots", + RepositoryName: "pip", + LabelNormalization: Pep503LabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//dist-with-dots", + }, + "pep503 / mixed": { + input: testInput{ + DistributionName: "To-be.sanitized", + RepositoryName: "pip", + LabelNormalization: Pep503LabelNormalizationType, + LabelConvention: DefaultLabelConvention, + }, + want: "@pip//to-be-sanitized", + }, + "pep503 / underscores / custom prefix & suffix": { + input: testInput{ + DistributionName: "dist_with_underscores", + RepositoryName: "pip", + LabelNormalization: Pep503LabelNormalizationType, + LabelConvention: "pre___$distribution_name$___fix", + }, + want: "@pip//pre-dist-with-underscores-fix", + }, } for name, tc := range tests { t.Run(name, func(t *testing.T) { - got := SanitizeDistribution(tc.input) + c := Config{ + labelNormalization: tc.input.LabelNormalization, + labelConvention: tc.input.LabelConvention, + } + gotLabel := c.FormatThirdPartyDependency(tc.input.RepositoryName, tc.input.DistributionName) + got := gotLabel.String() if tc.want != got { t.Fatalf("expected %q, got %q", tc.want, got) } From e5a0164f0b40df8cba783000b6531e9a2b715273 Mon Sep 17 00:00:00 2001 From: Greg Roodt Date: Mon, 1 Jul 2024 14:07:03 +1000 Subject: [PATCH 105/345] chore: Remove unused renovate.json (#2021) --- renovate.json | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 renovate.json diff --git a/renovate.json b/renovate.json deleted file mode 100644 index ee8c906b91..0000000000 --- a/renovate.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": [ - "config:base" - ] -} From 084b877c98b580839ceab2b071b02fc6768f3de6 Mon Sep 17 00:00:00 2001 From: Greg Roodt Date: Mon, 1 Jul 2024 20:23:36 +1000 Subject: [PATCH 106/345] (chore): Remove the extra indirection and `bzlmod` folder (#2022) The `bzlmod` folder seems like unnecessary indirection now. It was perhaps useful as we developed bzlmod support, but we no longer need it and it makes navigating the repository more difficult. --- MODULE.bazel | 6 +- python/extensions/BUILD.bazel | 4 +- python/extensions/pip.bzl | 2 +- python/extensions/python.bzl | 2 +- python/private/BUILD.bazel | 23 +++++++- python/private/bzlmod/BUILD.bazel | 55 ------------------- python/private/{bzlmod => }/internal_deps.bzl | 2 +- python/private/pypi/BUILD.bazel | 12 +++- .../pypi/{bzlmod.bzl => extension.bzl} | 0 python/private/{bzlmod => pypi}/pip.bzl | 2 +- python/private/{bzlmod => }/python.bzl | 4 +- python/private/{bzlmod => }/pythons_hub.bzl | 0 12 files changed, 43 insertions(+), 69 deletions(-) delete mode 100644 python/private/bzlmod/BUILD.bazel rename python/private/{bzlmod => }/internal_deps.bzl (91%) rename python/private/pypi/{bzlmod.bzl => extension.bzl} (100%) rename python/private/{bzlmod => pypi}/pip.bzl (90%) rename python/private/{bzlmod => }/python.bzl (99%) rename python/private/{bzlmod => }/pythons_hub.bzl (100%) diff --git a/MODULE.bazel b/MODULE.bazel index 735600b98d..b6d198ffc1 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -13,7 +13,7 @@ bazel_dep(name = "platforms", version = "0.0.4") bazel_dep(name = "rules_proto", version = "6.0.0-rc1") bazel_dep(name = "protobuf", version = "24.4", repo_name = "com_google_protobuf") -internal_deps = use_extension("//python/private/bzlmod:internal_deps.bzl", "internal_deps") +internal_deps = use_extension("//python/private:internal_deps.bzl", "internal_deps") use_repo( internal_deps, "pypi__build", @@ -54,7 +54,7 @@ register_toolchains("@pythons_hub//:all") ##################### # Install twine for our own runfiles wheel publishing and allow bzlmod users to use it. -pip = use_extension("//python/private/bzlmod:pip.bzl", "pip_internal") +pip = use_extension("//python/private/pypi:pip.bzl", "pip_internal") pip.parse( hub_name = "rules_python_publish_deps", python_version = "3.11", @@ -77,7 +77,7 @@ bazel_dep(name = "rules_go", version = "0.41.0", dev_dependency = True, repo_nam bazel_dep(name = "gazelle", version = "0.33.0", dev_dependency = True, repo_name = "bazel_gazelle") dev_pip = use_extension( - "//python/private/bzlmod:pip.bzl", + "//python/private/pypi:pip.bzl", "pip_internal", dev_dependency = True, ) diff --git a/python/extensions/BUILD.bazel b/python/extensions/BUILD.bazel index 1bc2a71192..e8a63d6d5b 100644 --- a/python/extensions/BUILD.bazel +++ b/python/extensions/BUILD.bazel @@ -28,7 +28,7 @@ bzl_library( name = "pip_bzl", srcs = ["pip.bzl"], visibility = ["//:__subpackages__"], - deps = ["//python/private/bzlmod:pip_bzl"], + deps = ["//python/private/pypi:pip_bzl"], ) bzl_library( @@ -36,6 +36,6 @@ bzl_library( srcs = ["python.bzl"], visibility = ["//:__subpackages__"], deps = [ - "//python/private/bzlmod:python_bzl", + "//python/private:python_bzl", ], ) diff --git a/python/extensions/pip.bzl b/python/extensions/pip.bzl index a69ee34ae7..e9d47263d5 100644 --- a/python/extensions/pip.bzl +++ b/python/extensions/pip.bzl @@ -14,6 +14,6 @@ "pip module extension for use with bzlmod" -load("//python/private/bzlmod:pip.bzl", _pip = "pip") +load("//python/private/pypi:pip.bzl", _pip = "pip") pip = _pip diff --git a/python/extensions/python.bzl b/python/extensions/python.bzl index 5428b7542e..4148d90877 100644 --- a/python/extensions/python.bzl +++ b/python/extensions/python.bzl @@ -14,6 +14,6 @@ "Python toolchain module extensions for use with bzlmod" -load("//python/private/bzlmod:python.bzl", _python = "python") +load("//python/private:python.bzl", _python = "python") python = _python diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 9c759cba9a..c5da4e31e3 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -29,7 +29,6 @@ licenses(["notice"]) filegroup( name = "distribution", srcs = glob(["**"]) + [ - "//python/private/bzlmod:distribution", "//python/private/common:distribution", "//python/private/proto:distribution", "//python/private/pypi:distribution", @@ -128,6 +127,28 @@ bzl_library( srcs = ["normalize_name.bzl"], ) +bzl_library( + name = "python_bzl", + srcs = ["python.bzl"], + deps = [ + ":pythons_hub_bzl", + ":toolchains_repo_bzl", + ":util_bzl", + "//python:repositories_bzl", + "@bazel_features//:features", + ], +) + +bzl_library( + name = "pythons_hub_bzl", + srcs = ["pythons_hub.bzl"], + deps = [ + ":full_version_bzl", + ":py_toolchain_suite_bzl", + "//python:versions_bzl", + ], +) + bzl_library( name = "py_cc_toolchain_bzl", srcs = [ diff --git a/python/private/bzlmod/BUILD.bazel b/python/private/bzlmod/BUILD.bazel deleted file mode 100644 index 2cb35fc03e..0000000000 --- a/python/private/bzlmod/BUILD.bazel +++ /dev/null @@ -1,55 +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. - -load("@bazel_skylib//:bzl_library.bzl", "bzl_library") - -package(default_visibility = ["//:__subpackages__"]) - -licenses(["notice"]) - -filegroup( - name = "distribution", - srcs = glob(["**"]), - visibility = ["//python/private:__pkg__"], -) - -bzl_library( - name = "pip_bzl", - srcs = ["pip.bzl"], - deps = [ - "//python/private/pypi:bzlmod_bzl", - ], -) - -bzl_library( - name = "python_bzl", - srcs = ["python.bzl"], - deps = [ - ":pythons_hub_bzl", - "//python:repositories_bzl", - "//python/private:toolchains_repo_bzl", - "//python/private:util_bzl", - "@bazel_features//:features", - ], -) - -bzl_library( - name = "pythons_hub_bzl", - srcs = ["pythons_hub.bzl"], - deps = [ - "//python:versions_bzl", - "//python/private:full_version_bzl", - "//python/private:py_toolchain_suite_bzl", - ], -) diff --git a/python/private/bzlmod/internal_deps.bzl b/python/private/internal_deps.bzl similarity index 91% rename from python/private/bzlmod/internal_deps.bzl rename to python/private/internal_deps.bzl index e0eca9ef3b..6ea3fa40c7 100644 --- a/python/private/bzlmod/internal_deps.bzl +++ b/python/private/internal_deps.bzl @@ -9,8 +9,8 @@ "Python toolchain module extension for internal rule use" load("@bazel_skylib//lib:modules.bzl", "modules") -load("//python/private:internal_config_repo.bzl", "internal_config_repo") load("//python/private/pypi:deps.bzl", "pypi_deps") +load(":internal_config_repo.bzl", "internal_config_repo") def _internal_deps(): internal_config_repo(name = "rules_python_internal") diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel index 0960b6a21d..08fb7259ec 100644 --- a/python/private/pypi/BUILD.bazel +++ b/python/private/pypi/BUILD.bazel @@ -55,8 +55,8 @@ bzl_library( ) bzl_library( - name = "bzlmod_bzl", - srcs = ["bzlmod.bzl"], + name = "extension_bzl", + srcs = ["extension.bzl"], deps = [ ":attrs_bzl", ":hub_repository_bzl", @@ -190,6 +190,14 @@ bzl_library( ], ) +bzl_library( + name = "pip_bzl", + srcs = ["pip.bzl"], + deps = [ + ":extension_bzl", + ], +) + bzl_library( name = "pip_compile_bzl", srcs = ["pip_compile.bzl"], diff --git a/python/private/pypi/bzlmod.bzl b/python/private/pypi/extension.bzl similarity index 100% rename from python/private/pypi/bzlmod.bzl rename to python/private/pypi/extension.bzl diff --git a/python/private/bzlmod/pip.bzl b/python/private/pypi/pip.bzl similarity index 90% rename from python/private/bzlmod/pip.bzl rename to python/private/pypi/pip.bzl index ecf94b69d5..cb8e111e0e 100644 --- a/python/private/bzlmod/pip.bzl +++ b/python/private/pypi/pip.bzl @@ -14,7 +14,7 @@ "pip module extensions for use with bzlmod." -load("//python/private/pypi:bzlmod.bzl", "pypi", "pypi_internal") +load("//python/private/pypi:extension.bzl", "pypi", "pypi_internal") pip = pypi pip_internal = pypi_internal diff --git a/python/private/bzlmod/python.bzl b/python/private/python.bzl similarity index 99% rename from python/private/bzlmod/python.bzl rename to python/private/python.bzl index f8be271fd6..56566790d3 100644 --- a/python/private/bzlmod/python.bzl +++ b/python/private/python.bzl @@ -16,9 +16,9 @@ load("@bazel_features//:features.bzl", "bazel_features") load("//python:repositories.bzl", "python_register_toolchains") -load("//python/private:toolchains_repo.bzl", "multi_toolchain_aliases") -load("//python/private:util.bzl", "IS_BAZEL_6_4_OR_HIGHER") load(":pythons_hub.bzl", "hub_repo") +load(":toolchains_repo.bzl", "multi_toolchain_aliases") +load(":util.bzl", "IS_BAZEL_6_4_OR_HIGHER") # This limit can be increased essentially arbitrarily, but doing so will cause a rebuild of all # targets using any of these toolchains due to the changed repository name. diff --git a/python/private/bzlmod/pythons_hub.bzl b/python/private/pythons_hub.bzl similarity index 100% rename from python/private/bzlmod/pythons_hub.bzl rename to python/private/pythons_hub.bzl From e6b9cffabb816be914a70d3cab526e5d9f88094a Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 5 Jul 2024 01:02:53 +0900 Subject: [PATCH 107/345] chore: include aignas to PyPI code reviewers (#2034) It seems that I am not added to PyPI reviewers. After rereading the comment at the top of the file, it makes sense. --- .github/CODEOWNERS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index a7ca2b06c2..6a8a48fb16 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -7,5 +7,5 @@ /examples/build_file_generation/ @f0rmiga # PyPI integration related code -/python/private/pypi/ @groodt -/tests/pypi/ @groodt +/python/private/pypi/ @aignas @groodt +/tests/pypi/ @aignas @groodt From 2cfbe731332426bbbed31f4e02140290bbf86d16 Mon Sep 17 00:00:00 2001 From: "Jonathan Giroux (Koltes)" Date: Fri, 5 Jul 2024 01:50:44 +0200 Subject: [PATCH 108/345] fix(windows): symlink bootstrap script when not building zip (#2015) This fixes #1840 by supporting again `--build_python_zip=false` on Windows. When the zip file isn't build, the transition executable looks for the eponymous bootstrap script but the latter doesn't exist. I've just added a symlink, and refactored a bit because logic would have been duplicated. It seems you don't run CICD on Windows. FWIW I've manually tested it, both with `build_python_zip` as `true` and `false`. --------- Co-authored-by: Richard Levasseur --- python/config_settings/transition.bzl | 54 +++++++++---- .../transition/multi_version_tests.bzl | 77 ++++++++++++++++++- 2 files changed, 115 insertions(+), 16 deletions(-) diff --git a/python/config_settings/transition.bzl b/python/config_settings/transition.bzl index 48b0447ede..da48a1fdb3 100644 --- a/python/config_settings/transition.bzl +++ b/python/config_settings/transition.bzl @@ -43,24 +43,40 @@ def _transition_py_impl(ctx): output = executable, target_file = target[DefaultInfo].files_to_run.executable, ) - zipfile_symlink = None + default_outputs = [] if target_is_windows: - # Under Windows, the expected ".zip" does not exist, so we have to - # create the symlink ourselves to achieve the same behaviour as in macOS - # and Linux. - zipfile = None - expected_target_path = target[DefaultInfo].files_to_run.executable.short_path[:-4] + ".zip" - for file in target[DefaultInfo].default_runfiles.files.to_list(): - if file.short_path == expected_target_path: - zipfile = file + # NOTE: Bazel 6 + host=linux + target=windows results in the .exe extension missing + inner_bootstrap_path = _strip_suffix(target[DefaultInfo].files_to_run.executable.short_path, ".exe") + inner_bootstrap = None + inner_zip_file_path = inner_bootstrap_path + ".zip" + inner_zip_file = None + for file in target[DefaultInfo].files.to_list(): + if file.short_path == inner_bootstrap_path: + inner_bootstrap = file + elif file.short_path == inner_zip_file_path: + inner_zip_file = file - if zipfile: - zipfile_symlink = ctx.actions.declare_file(ctx.attr.name + ".zip") + # TODO: Use `fragments.py.build_python_zip` once Bazel 6 support is dropped. + # Which file the Windows .exe looks for depends on the --build_python_zip file. + # Bazel 7+ has APIs to know the effective value of that flag, but not Bazel 6. + # To work around this, we treat the existence of a .zip in the default outputs + # to mean --build_python_zip=true. + if inner_zip_file: + suffix = ".zip" + underlying_launched_file = inner_zip_file + else: + suffix = "" + underlying_launched_file = inner_bootstrap + + if underlying_launched_file: + launched_file_symlink = ctx.actions.declare_file(ctx.attr.name + suffix) ctx.actions.symlink( is_executable = True, - output = zipfile_symlink, - target_file = zipfile, + output = launched_file_symlink, + target_file = underlying_launched_file, ) + default_outputs.append(launched_file_symlink) + env = {} for k, v in ctx.attr.env.items(): env[k] = ctx.expand_location(v) @@ -85,8 +101,8 @@ def _transition_py_impl(ctx): providers = [ DefaultInfo( executable = executable, - files = depset([zipfile_symlink] if zipfile_symlink else [], transitive = [target[DefaultInfo].files]), - runfiles = ctx.runfiles([zipfile_symlink] if zipfile_symlink else []).merge(target[DefaultInfo].default_runfiles), + files = depset(default_outputs, transitive = [target[DefaultInfo].files]), + runfiles = ctx.runfiles(default_outputs).merge(target[DefaultInfo].default_runfiles), ), py_info, py_runtime_info, @@ -169,6 +185,7 @@ _transition_py_binary = rule( attrs = _COMMON_ATTRS | _PY_TEST_ATTRS, cfg = _transition_python_version, executable = True, + fragments = ["py"], ) _transition_py_test = rule( @@ -176,6 +193,7 @@ _transition_py_test = rule( attrs = _COMMON_ATTRS | _PY_TEST_ATTRS, cfg = _transition_python_version, test = True, + fragments = ["py"], ) def _py_rule(rule_impl, transition_rule, name, python_version, **kwargs): @@ -263,3 +281,9 @@ def py_binary(name, python_version, **kwargs): def py_test(name, python_version, **kwargs): return _py_rule(_py_test, _transition_py_test, name, python_version, **kwargs) + +def _strip_suffix(s, suffix): + if s.endswith(suffix): + return s[:-len(suffix)] + else: + return s diff --git a/tests/config_settings/transition/multi_version_tests.bzl b/tests/config_settings/transition/multi_version_tests.bzl index f3707dba20..e35590bbb6 100644 --- a/tests/config_settings/transition/multi_version_tests.bzl +++ b/tests/config_settings/transition/multi_version_tests.bzl @@ -15,8 +15,9 @@ load("@rules_testing//lib:analysis_test.bzl", "analysis_test") load("@rules_testing//lib:test_suite.bzl", "test_suite") -load("@rules_testing//lib:util.bzl", rt_util = "util") +load("@rules_testing//lib:util.bzl", "TestingAspectInfo", rt_util = "util") load("//python/config_settings:transition.bzl", py_binary_transitioned = "py_binary", py_test_transitioned = "py_test") +load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility # NOTE @aignas 2024-06-04: we are using here something that is registered in the MODULE.Bazel # and if you find tests failing, it could be because of the toolchain resolution issues here. @@ -68,6 +69,80 @@ def _test_py_binary_with_transition_impl(env, target): _tests.append(_test_py_binary_with_transition) +def _setup_py_binary_windows(name, *, impl, build_python_zip): + rt_util.helper_target( + py_binary_transitioned, + name = name + "_subject", + srcs = [name + "_subject.py"], + python_version = _PYTHON_VERSION, + ) + + analysis_test( + name = name, + target = name + "_subject", + impl = impl, + config_settings = { + "//command_line_option:build_python_zip": build_python_zip, + "//command_line_option:extra_toolchains": "//tests/cc:all", + "//command_line_option:platforms": str(Label("//tests/support:windows_x86_64")), + }, + ) + +def _test_py_binary_windows_build_python_zip_false(name): + _setup_py_binary_windows( + name, + build_python_zip = "false", + impl = _test_py_binary_windows_build_python_zip_false_impl, + ) + +def _test_py_binary_windows_build_python_zip_false_impl(env, target): + default_outputs = env.expect.that_target(target).default_outputs() + if IS_BAZEL_7_OR_HIGHER: + # TODO: These outputs aren't correct. The outputs shouldn't + # have the "_" prefix on them (those are coming from the underlying + # wrapped binary). + env.expect.that_target(target).default_outputs().contains_exactly([ + "{package}/_{test_name}_subject", + "{package}/_{test_name}_subject.exe", + "{package}/{test_name}_subject", + "{package}/{test_name}_subject.py", + ]) + else: + inner_exe = target[TestingAspectInfo].attrs.target[DefaultInfo].files_to_run.executable + default_outputs.contains_at_least([ + inner_exe.short_path, + ]) + +_tests.append(_test_py_binary_windows_build_python_zip_false) + +def _test_py_binary_windows_build_python_zip_true(name): + _setup_py_binary_windows( + name, + build_python_zip = "true", + impl = _test_py_binary_windows_build_python_zip_true_impl, + ) + +def _test_py_binary_windows_build_python_zip_true_impl(env, target): + default_outputs = env.expect.that_target(target).default_outputs() + if IS_BAZEL_7_OR_HIGHER: + # TODO: These outputs aren't correct. The outputs shouldn't + # have the "_" prefix on them (those are coming from the underlying + # wrapped binary). + default_outputs.contains_exactly([ + "{package}/_{test_name}_subject.exe", + "{package}/_{test_name}_subject.zip", + "{package}/{test_name}_subject.py", + "{package}/{test_name}_subject.zip", + ]) + else: + inner_exe = target[TestingAspectInfo].attrs.target[DefaultInfo].files_to_run.executable + default_outputs.contains_at_least([ + "{package}/{test_name}_subject.zip", + inner_exe.short_path, + ]) + +_tests.append(_test_py_binary_windows_build_python_zip_true) + def multi_version_test_suite(name): test_suite( name = name, From 25a0a472013ef970880579c6794cbf3770bb55dd Mon Sep 17 00:00:00 2001 From: Mihai Dusmanu Date: Fri, 5 Jul 2024 08:35:38 +0200 Subject: [PATCH 109/345] fix: pypi parse_simpleapi_html.bzl is robust to metadata containing ">" sign (#2031) This PR modifies the logic for finding the end of the of the tag metadata attributes in the pypi `parse_simpleapi_html` function. This was discovered after investigation of the following error: ``` Error in repository_rule: invalid user-provided repo name 'pypi_311_=2_7,!=3_0_*,!=3_1_*,!=3_2_*">six_py2_none_any_8abb2f1d': valid names may contain only A-Z, a-z, 0-9, '-', '_', '.', and must start with a letter ``` which was traced back to the to a `data-requires-python` attribute containing a `>` sign (instead of `>`) in the Azure Artifacts pypi feed, e.g.: `six-1.16.0-py2.py3-none-any.whl
` --------- Co-authored-by: Mihai Dusmanu Co-authored-by: aignas <240938+aignas@users.noreply.github.com> --- CHANGELOG.md | 23 ++++++++++-- python/private/pypi/parse_simpleapi_html.bzl | 6 ++-- .../parse_simpleapi_html_tests.bzl | 36 +++++++++++++++++++ 3 files changed, 60 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61df0862dd..ac11e14cff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,24 @@ A brief description of the categories of changes: [x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/x.x.x +### Changed +* Nothing yet + +### Fixed +* (rules) Fixes python builds when the `--build_python_zip` is set to `false` on Windows. See [#1840](https://github.com/bazelbuild/rules_python/issues/1840). +* (pip) Fixed pypi parse_simpleapi_html function for feeds with package metadata + containing ">" sign + +### Added +* Nothing yet + +### Removed +* Nothing yet + +## [0.34.0] - 2024-07-04 + +[0.34.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.34.0 + ### Changed * `protobuf`/`com_google_protobuf` dependency bumped to `v24.4` * (bzlmod): optimize the creation of config settings used in pip to @@ -49,7 +67,8 @@ A brief description of the categories of changes: "@platforms//os:linux": ["@pypi//foo_available_only_on_linux"], "//conditions:default": [], } - )`. + ) + ``` * (bzlmod): Targets in `all_requirements` now use the same form as targets returned by the `requirement` macro. * (rules) Auto exec groups are enabled. This allows actions run by the rules, such as precompiling, to pick an execution platform separately from what @@ -67,8 +86,6 @@ A brief description of the categories of changes: ### Added * (toolchains) {obj}`//python/runtime_env_toolchains:all`, which is a drop-in replacement for the "autodetecting" toolchain. - -### Added * (gazelle) Added new `python_label_convention` and `python_label_normalization` directives. These directive allows altering default Gazelle label format to third-party dependencies useful for re-using Gazelle plugin with other rules, including `rules_pycross`. See [#1939](https://github.com/bazelbuild/rules_python/issues/1939). diff --git a/python/private/pypi/parse_simpleapi_html.bzl b/python/private/pypi/parse_simpleapi_html.bzl index f7cd032aca..248846922f 100644 --- a/python/private/pypi/parse_simpleapi_html.bzl +++ b/python/private/pypi/parse_simpleapi_html.bzl @@ -49,6 +49,8 @@ def parse_simpleapi_html(*, url, content): # https://packaging.python.org/en/latest/specifications/simple-repository-api/#versioning-pypi-s-simple-api fail("Unsupported API version: {}".format(api_version)) + # Each line follows the following pattern + # filename
for line in lines[1:]: dist_url, _, tail = line.partition("#sha256=") sha256, _, tail = tail.partition("\"") @@ -56,8 +58,8 @@ def parse_simpleapi_html(*, url, content): # See https://packaging.python.org/en/latest/specifications/simple-repository-api/#adding-yank-support-to-the-simple-api yanked = "data-yanked" in line - maybe_metadata, _, tail = tail.partition(">") - filename, _, tail = tail.partition("<") + head, _, _ = tail.rpartition("") + maybe_metadata, _, filename = head.rpartition(">") metadata_sha256 = "" metadata_url = "" diff --git a/tests/pypi/parse_simpleapi_html/parse_simpleapi_html_tests.bzl b/tests/pypi/parse_simpleapi_html/parse_simpleapi_html_tests.bzl index a60bb1f330..a532e878a7 100644 --- a/tests/pypi/parse_simpleapi_html/parse_simpleapi_html_tests.bzl +++ b/tests/pypi/parse_simpleapi_html/parse_simpleapi_html_tests.bzl @@ -61,6 +61,22 @@ def _test_sdist(env): yanked = False, ), ), + ( + struct( + attrs = [ + 'href="https://example.org/full-url/foo-0.0.1.tar.gz#sha256=deadbeefasource"', + 'data-requires-python=">=3.7"', + ], + filename = "foo-0.0.1.tar.gz", + url = "ignored", + ), + struct( + filename = "foo-0.0.1.tar.gz", + sha256 = "deadbeefasource", + url = "https://example.org/full-url/foo-0.0.1.tar.gz", + yanked = False, + ), + ), ] for (input, want) in tests: @@ -110,6 +126,26 @@ def _test_whls(env): yanked = False, ), ), + ( + struct( + attrs = [ + 'href="https://example.org/full-url/foo-0.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=deadbeef"', + 'data-requires-python=">=3.7"', + 'data-dist-info-metadata="sha256=deadb00f"', + 'data-core-metadata="sha256=deadb00f"', + ], + filename = "foo-0.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + url = "ignored", + ), + struct( + filename = "foo-0.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + metadata_sha256 = "deadb00f", + metadata_url = "https://example.org/full-url/foo-0.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata", + sha256 = "deadbeef", + url = "https://example.org/full-url/foo-0.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + yanked = False, + ), + ), ( struct( attrs = [ From 945cea46c88ca93fe66203aa92d3f481c3d7fbe2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 18:00:26 +0900 Subject: [PATCH 110/345] build(deps): bump certifi from 2023.7.22 to 2024.7.4 in /tools/publish (#2041) Bumps [certifi](https://github.com/certifi/python-certifi) from 2023.7.22 to 2024.7.4.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=certifi&package-manager=pip&previous-version=2023.7.22&new-version=2024.7.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/bazelbuild/rules_python/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/publish/requirements_darwin.txt | 6 +++--- tools/publish/requirements_windows.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/publish/requirements_darwin.txt b/tools/publish/requirements_darwin.txt index 290411a74c..46a615d28c 100644 --- a/tools/publish/requirements_darwin.txt +++ b/tools/publish/requirements_darwin.txt @@ -8,9 +8,9 @@ bleach==6.0.0 \ --hash=sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414 \ --hash=sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4 # via readme-renderer -certifi==2023.7.22 \ - --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ - --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 +certifi==2024.7.4 \ + --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ + --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 # via requests charset-normalizer==3.0.1 \ --hash=sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b \ diff --git a/tools/publish/requirements_windows.txt b/tools/publish/requirements_windows.txt index 95b88339c7..39a7b2fb3e 100644 --- a/tools/publish/requirements_windows.txt +++ b/tools/publish/requirements_windows.txt @@ -8,9 +8,9 @@ bleach==6.0.0 \ --hash=sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414 \ --hash=sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4 # via readme-renderer -certifi==2023.7.22 \ - --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ - --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 +certifi==2024.7.4 \ + --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ + --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 # via requests charset-normalizer==3.0.1 \ --hash=sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b \ From d71053962315ba901a49bbd947045588fbb1e0eb Mon Sep 17 00:00:00 2001 From: Sitaktif Date: Mon, 8 Jul 2024 10:01:31 +0100 Subject: [PATCH 111/345] refactor: use http_archive for the stdlib list (#2037) The `http_file` repo rules relied on Github-specific per-file HTTP API. Change this to use an `http_archive` repo rule, which refers to a simple URL containing the source tarball for stdlib-list. The release version of pypi/stdlib-list this is now pointing to is [v0.10.0](https://github.com/pypi/stdlib-list/releases/tag/v0.10.0). This tag is slightly older than the original commit it was pointing to (`8cbc2067a4a0f9eee57fb541e4cd7727724b7db4`) but, as discussed in https://github.com/pypi/stdlib-list/issues/122, the only differences are build or doc related, there are no differences in the sources (see the [diff](https://github.com/pypi/stdlib-list/compare/v0.10.0...8cbc2067a4a0f9eee57fb541e4cd7727724b7db4)). (Creating an associated issue didn't feel particularly useful but happy to do it if it's a mandatory part of the process!) --- gazelle/MODULE.bazel | 6 +----- gazelle/deps.bzl | 37 +++++++------------------------------ gazelle/python/BUILD.bazel | 12 ++++++------ 3 files changed, 14 insertions(+), 41 deletions(-) diff --git a/gazelle/MODULE.bazel b/gazelle/MODULE.bazel index 1829d248b2..0418b39036 100644 --- a/gazelle/MODULE.bazel +++ b/gazelle/MODULE.bazel @@ -31,9 +31,5 @@ use_repo( python_stdlib_list = use_extension("//python:extensions.bzl", "python_stdlib_list") use_repo( python_stdlib_list, - "python_stdlib_list_3_10", - "python_stdlib_list_3_11", - "python_stdlib_list_3_12", - "python_stdlib_list_3_8", - "python_stdlib_list_3_9", + "python_stdlib_list", ) diff --git a/gazelle/deps.bzl b/gazelle/deps.bzl index f4f4c24fc7..948d61e5ae 100644 --- a/gazelle/deps.bzl +++ b/gazelle/deps.bzl @@ -18,7 +18,7 @@ load( "@bazel_gazelle//:deps.bzl", _go_repository = "go_repository", ) -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_file") +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") def go_repository(name, **kwargs): if name not in native.existing_rules(): @@ -26,35 +26,12 @@ def go_repository(name, **kwargs): def python_stdlib_list_deps(): "Fetch python stdlib list dependencies" - http_file( - name = "python_stdlib_list_3_8", - sha256 = "ee6dc367011ff298b906dbaab408940aa57086d5f8f47278f4b7523b9aa13ae3", - url = "https://raw.githubusercontent.com/pypi/stdlib-list/8cbc2067a4a0f9eee57fb541e4cd7727724b7db4/stdlib_list/lists/3.8.txt", - downloaded_file_path = "3.8.txt", - ) - http_file( - name = "python_stdlib_list_3_9", - sha256 = "a4340e5ffe2e75bb18f548028cef6e6ac15384c44ae0a776e04dd869da1d1fd7", - url = "https://raw.githubusercontent.com/pypi/stdlib-list/8cbc2067a4a0f9eee57fb541e4cd7727724b7db4/stdlib_list/lists/3.9.txt", - downloaded_file_path = "3.9.txt", - ) - http_file( - name = "python_stdlib_list_3_10", - sha256 = "0b867738b78ac98944237de2600093a1c6ef259d1810017e46f01a29f3d199e7", - url = "https://raw.githubusercontent.com/pypi/stdlib-list/8cbc2067a4a0f9eee57fb541e4cd7727724b7db4/stdlib_list/lists/3.10.txt", - downloaded_file_path = "3.10.txt", - ) - http_file( - name = "python_stdlib_list_3_11", - sha256 = "3c1dbf991b17178d6ed3772f4fa8f64302feaf9c3385fef328a0c7ab736a79b1", - url = "https://raw.githubusercontent.com/pypi/stdlib-list/8cbc2067a4a0f9eee57fb541e4cd7727724b7db4/stdlib_list/lists/3.11.txt", - downloaded_file_path = "3.11.txt", - ) - http_file( - name = "python_stdlib_list_3_12", - sha256 = "6d3d53194218b43ee1d04bf9a4f0b6a9309bb59cdcaddede7d9cfe8b6835d34a", - url = "https://raw.githubusercontent.com/pypi/stdlib-list/8cbc2067a4a0f9eee57fb541e4cd7727724b7db4/stdlib_list/lists/3.12.txt", - downloaded_file_path = "3.12.txt", + http_archive( + name = "python_stdlib_list", + build_file_content = """exports_files(glob(["stdlib_list/lists/*.txt"]))""", + sha256 = "3f6fc8fba0a99ce8fa76c1b794a24f38962f6275ea9d5cfb43a874abe472571e", + strip_prefix = "stdlib-list-0.10.0", + url = "https://github.com/pypi/stdlib-list/releases/download/v0.10.0/v0.10.0.tar.gz", ) def gazelle_deps(): diff --git a/gazelle/python/BUILD.bazel b/gazelle/python/BUILD.bazel index 195c77623d..627a867c68 100644 --- a/gazelle/python/BUILD.bazel +++ b/gazelle/python/BUILD.bazel @@ -52,13 +52,13 @@ copy_file( name = "stdlib_list", src = select( { - "@rules_python//python/config_settings:is_python_3.10": "@python_stdlib_list_3_10//file", - "@rules_python//python/config_settings:is_python_3.11": "@python_stdlib_list_3_11//file", - "@rules_python//python/config_settings:is_python_3.12": "@python_stdlib_list_3_12//file", - "@rules_python//python/config_settings:is_python_3.8": "@python_stdlib_list_3_8//file", - "@rules_python//python/config_settings:is_python_3.9": "@python_stdlib_list_3_9//file", + "@rules_python//python/config_settings:is_python_3.10": "@python_stdlib_list//:stdlib_list/lists/3.10.txt", + "@rules_python//python/config_settings:is_python_3.11": "@python_stdlib_list//:stdlib_list/lists/3.11.txt", + "@rules_python//python/config_settings:is_python_3.12": "@python_stdlib_list//:stdlib_list/lists/3.12.txt", + "@rules_python//python/config_settings:is_python_3.8": "@python_stdlib_list//:stdlib_list/lists/3.8.txt", + "@rules_python//python/config_settings:is_python_3.9": "@python_stdlib_list//:stdlib_list/lists/3.9.txt", # This is the same behaviour as previously - "//conditions:default": "@python_stdlib_list_3_11//file", + "//conditions:default": "@python_stdlib_list//:stdlib_list/lists/3.11.txt", }, ), out = "stdlib_list.txt", From 7bba79de34b6352001cb42b801245d0de33ce225 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 09:02:08 +0000 Subject: [PATCH 112/345] build(deps): bump charset-normalizer from 3.0.1 to 3.3.2 in /tools/publish (#2028) Bumps [charset-normalizer](https://github.com/Ousret/charset_normalizer) from 3.0.1 to 3.3.2.
Release notes

Sourced from charset-normalizer's releases.

Version 3.3.2

3.3.2 (2023-10-31)

Fixed

  • Unintentional memory usage regression when using large payloads that match several encodings (#376)
  • Regression on some detection cases showcased in the documentation (#371)

Added

  • Noise (md) probe that identifies malformed Arabic representation due to the presence of letters in isolated form (credit to my wife, thanks!)

Version 3.3.1

3.3.1 (2023-10-22)

Changed

  • Optional mypyc compilation upgraded to version 1.6.1 for Python >= 3.8
  • Improved the general detection reliability based on reports from the community

Release 3.3.0

3.3.0 (2023-09-30)

Added

  • Allow to execute the CLI (e.g. normalizer) through python -m charset_normalizer.cli or python -m charset_normalizer
  • Support for 9 forgotten encodings that are supported by Python but unlisted in encoding.aliases as they have no alias (#323)

Removed

  • (internal) Redundant utils.is_ascii function and unused function is_private_use_only
  • (internal) charset_normalizer.assets is moved inside charset_normalizer.constant

Changed

  • (internal) Unicode code blocks in constants are updated using the latest v15.0.0 definition to improve detection
  • Optional mypyc compilation upgraded to version 1.5.1 for Python >= 3.8

Fixed

  • Unable to properly sort CharsetMatch when both chaos/noise and coherence were close due to an unreachable condition in __lt__ (#350)

Version 3.2.0

3.2.0 (2023-06-07)

Changed

  • Typehint for function from_path no longer enforce PathLike as its first argument
  • Minor improvement over the global detection reliability

Added

  • Introduce function is_binary that relies on main capabilities, and is optimized to detect binaries
  • Propagate enable_fallback argument throughout from_bytes, from_path, and from_fp that allow a deeper control over the detection (default True)
  • Explicit support for Python 3.12

Fixed

  • Edge case detection failure where a file would contain 'very-long' camel-cased word (Issue #289)

... (truncated)

Changelog

Sourced from charset-normalizer's changelog.

3.3.2 (2023-10-31)

Fixed

  • Unintentional memory usage regression when using large payload that match several encoding (#376)
  • Regression on some detection case showcased in the documentation (#371)

Added

  • Noise (md) probe that identify malformed arabic representation due to the presence of letters in isolated form (credit to my wife)

3.3.1 (2023-10-22)

Changed

  • Optional mypyc compilation upgraded to version 1.6.1 for Python >= 3.8
  • Improved the general detection reliability based on reports from the community

3.3.0 (2023-09-30)

Added

  • Allow to execute the CLI (e.g. normalizer) through python -m charset_normalizer.cli or python -m charset_normalizer
  • Support for 9 forgotten encoding that are supported by Python but unlisted in encoding.aliases as they have no alias (#323)

Removed

  • (internal) Redundant utils.is_ascii function and unused function is_private_use_only
  • (internal) charset_normalizer.assets is moved inside charset_normalizer.constant

Changed

  • (internal) Unicode code blocks in constants are updated using the latest v15.0.0 definition to improve detection
  • Optional mypyc compilation upgraded to version 1.5.1 for Python >= 3.8

Fixed

  • Unable to properly sort CharsetMatch when both chaos/noise and coherence were close due to an unreachable condition in __lt__ (#350)

3.2.0 (2023-06-07)

Changed

  • Typehint for function from_path no longer enforce PathLike as its first argument
  • Minor improvement over the global detection reliability

Added

  • Introduce function is_binary that relies on main capabilities, and optimized to detect binaries
  • Propagate enable_fallback argument throughout from_bytes, from_path, and from_fp that allow a deeper control over the detection (default True)
  • Explicit support for Python 3.12

Fixed

  • Edge case detection failure where a file would contain 'very-long' camel cased word (Issue #289)

3.1.0 (2023-03-06)

Added

  • Argument should_rename_legacy for legacy function detect and disregard any new arguments without errors (PR #262)

... (truncated)

Commits
  • 79dce48 :bug: Regression on some detection case showcased in the documentation (#371)...
  • a4b9b01 Bump github/codeql-action from 2.22.4 to 2.22.5 (#375)
  • dcc01cc Bump ossf/scorecard-action from 2.3.0 to 2.3.1 (#374)
  • 9cd402c Bump pytest from 7.4.2 to 7.4.3 (#373)
  • e274dcc :bug: Fix unintentional memory usage regression when using large payload that...
  • 07f3041 :arrow_up: Bump github/codeql-action from 2.22.3 to 2.22.4 (#370)
  • 5208644 :bookmark: Release 3.3.1 (#367)
  • 66966f1 :sparkle: Improve the detection around some cases (#366)
  • 49653a6 :arrow_up: Bump actions/setup-python from 4.7.0 to 4.7.1 (#359)
  • f6a66ed :arrow_up: Bump pypa/cibuildwheel from 2.16.0 to 2.16.2 (#361)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=charset-normalizer&package-manager=pip&previous-version=3.0.1&new-version=3.3.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/publish/requirements_darwin.txt | 180 +++++++++++++------------ tools/publish/requirements_windows.txt | 180 +++++++++++++------------ 2 files changed, 182 insertions(+), 178 deletions(-) diff --git a/tools/publish/requirements_darwin.txt b/tools/publish/requirements_darwin.txt index 46a615d28c..d243cc284a 100644 --- a/tools/publish/requirements_darwin.txt +++ b/tools/publish/requirements_darwin.txt @@ -12,95 +12,97 @@ certifi==2024.7.4 \ --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 # via requests -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 +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 # via requests docutils==0.19 \ --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ diff --git a/tools/publish/requirements_windows.txt b/tools/publish/requirements_windows.txt index 39a7b2fb3e..4bfdb19835 100644 --- a/tools/publish/requirements_windows.txt +++ b/tools/publish/requirements_windows.txt @@ -12,95 +12,97 @@ certifi==2024.7.4 \ --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 # via requests -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 +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 # via requests docutils==0.19 \ --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ From b024c5a7fe86abe7bdd58526c9aa5889db46762a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 11:29:49 +0900 Subject: [PATCH 113/345] build(deps): bump certifi from 2024.6.2 to 2024.7.4 in /docs/sphinx (#2046) Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.6.2 to 2024.7.4.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=certifi&package-manager=pip&previous-version=2024.6.2&new-version=2024.7.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/bazelbuild/rules_python/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/sphinx/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/sphinx/requirements.txt b/docs/sphinx/requirements.txt index f2f0158f88..af6763f682 100644 --- a/docs/sphinx/requirements.txt +++ b/docs/sphinx/requirements.txt @@ -16,9 +16,9 @@ babel==2.15.0 \ --hash=sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb \ --hash=sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413 # via sphinx -certifi==2024.6.2 \ - --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ - --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 +certifi==2024.7.4 \ + --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ + --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 # via requests charset-normalizer==3.3.2 \ --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ From e69097596506139dfc1b9dd18baba9d52b1ac479 Mon Sep 17 00:00:00 2001 From: Chowder <16789070+chowder@users.noreply.github.com> Date: Wed, 10 Jul 2024 03:39:40 +0100 Subject: [PATCH 114/345] fix: use `exec` to invoke the stage-2 bootstrap for non-zip case (#2047) When the two-stage bootstrap is used, the parent shell process runs python as a child process, which changes how signals are propagated. Specifically, if a signal is sent _directly_ to the parent (e.g. `kill $parent`), the child process (python) won't receive it and it will appear to be ignored. This is because the parent process is busy waiting for the child process. To fix, invoke the python process using `exec` instead. Because the process is entirely replaced, signals are sent directly to the replacement. This can't be used for zip files, though, because they rely on a catching the exit signal to perform cleanup of the extracted files. Fixes https://github.com/bazelbuild/rules_python/issues/2043 --------- Co-authored-by: Richard Levasseur --- CHANGELOG.md | 3 ++ python/private/stage1_bootstrap_template.sh | 33 +++++++++++++++------ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac11e14cff..cc44a47be0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,9 @@ A brief description of the categories of changes: * Nothing yet ### Fixed +* (rules) Signals are properly received when using {obj}`--bootstrap_impl=script` + (for non-zip builds). + ([#2043](https://github.com/bazelbuild/rules_python/issues/2043)) * (rules) Fixes python builds when the `--build_python_zip` is set to `false` on Windows. See [#1840](https://github.com/bazelbuild/rules_python/issues/1840). * (pip) Fixed pypi parse_simpleapi_html function for feeds with package metadata containing ">" sign diff --git a/python/private/stage1_bootstrap_template.sh b/python/private/stage1_bootstrap_template.sh index fb46cc696c..48711aa92f 100644 --- a/python/private/stage1_bootstrap_template.sh +++ b/python/private/stage1_bootstrap_template.sh @@ -106,13 +106,28 @@ declare -a interpreter_args interpreter_env+=("PYTHONSAFEPATH=1") export RUNFILES_DIR -# NOTE: We use <(...) to pass the Python program as a file so that stdin can -# still be passed along as normal. -env \ - "${interpreter_env[@]}" \ - "$python_exe" \ - "${interpreter_args[@]}" \ - "$stage2_bootstrap" \ - "$@" -exit $? +command=( + env + "${interpreter_env[@]}" + "$python_exe" + "${interpreter_args[@]}" + "$stage2_bootstrap" + "$@" +) + +# We use `exec` instead of a child process so that signals sent directly (e.g. +# using `kill`) to this process (the PID seen by the calling process) are +# received by the Python process. Otherwise, this process receives the signal +# and would have to manually propagate it. +# See https://github.com/bazelbuild/rules_python/issues/2043#issuecomment-2215469971 +# for more information. +# +# However, when running a zip file, we need to clean up the workspace after the +# process finishes so control must return here. +if [[ "$IS_ZIPFILE" == "1" ]]; then + "${command[@]}" + exit $? +else + exec "${command[@]}" +fi From 1d0c9a78eeb1fdee29b52f62ff482d9e8a03c2be Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 9 Jul 2024 23:31:35 -0700 Subject: [PATCH 115/345] chore: add cxxopt std=c++14 to BCR presubmit config (#2051) For some unknown reason, the BCR Mac jobs require `-std=c++14` when compiling. Without this, they fail with the error `C++ versions less than C++14 are not supported.` This only appears to happen in the BCR presubmits. --- .bcr/presubmit.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.bcr/presubmit.yml b/.bcr/presubmit.yml index 6be334ebfe..875ea93043 100644 --- a/.bcr/presubmit.yml +++ b/.bcr/presubmit.yml @@ -22,5 +22,10 @@ bcr_test_module: name: "Run test module" platform: ${{ platform }} bazel: ${{ bazel }} + test_flags: + - "--keep_going" + # Without these cxxopts, BCR's Mac builds fail + - '--cxxopt=-std=c++14' + - '--host_cxxopt=-std=c++14' test_targets: - "//..." From 04f5798f7ad0827b33b8bd96d225820d4a91b0b2 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 9 Jul 2024 23:33:01 -0700 Subject: [PATCH 116/345] tests: add integration test for build_python_zip (#2045) This is a more comprehensive regression test for verifying `--build_python_zip` is actually working (https://github.com/bazelbuild/rules_python/issues/1840) This also creates a small framework to make it easier to write integration tests that need to customize the environment bazel runs in and check the output of bazel itself. I figure this will be helpful for writing simple verification tests for repository/bzlmod phase logic (i.e. set the debug env vars and grep the output). While we should avoid heavy usage of these bazel-in-bazel tests, a bit of grepping logs would go a long way for covering edge cases that examples don't cover. --- .bazelrc | 4 +- tests/integration/BUILD.bazel | 12 ++ tests/integration/custom_commands/BUILD.bazel | 20 +++ .../integration/custom_commands/MODULE.bazel | 21 +++ tests/integration/custom_commands/WORKSPACE | 13 ++ .../custom_commands/WORKSPACE.bzlmod | 0 tests/integration/custom_commands/bin.py | 16 +++ tests/integration/custom_commands_test.py | 31 +++++ tests/integration/integration_test.bzl | 18 ++- tests/integration/runner.py | 131 ++++++++++++++++++ 10 files changed, 263 insertions(+), 3 deletions(-) create mode 100644 tests/integration/custom_commands/BUILD.bazel create mode 100644 tests/integration/custom_commands/MODULE.bazel create mode 100644 tests/integration/custom_commands/WORKSPACE create mode 100644 tests/integration/custom_commands/WORKSPACE.bzlmod create mode 100644 tests/integration/custom_commands/bin.py create mode 100644 tests/integration/custom_commands_test.py create mode 100644 tests/integration/runner.py diff --git a/.bazelrc b/.bazelrc index 07188a9196..bf13baf132 100644 --- a/.bazelrc +++ b/.bazelrc @@ -4,8 +4,8 @@ # (Note, we cannot use `common --deleted_packages` because the bazel version command doesn't support it) # To update these lines, execute # `bazel run @rules_bazel_integration_test//tools:update_deleted_packages` -build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered -query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered test --test_output=errors diff --git a/tests/integration/BUILD.bazel b/tests/integration/BUILD.bazel index f1c427f463..ac475da534 100644 --- a/tests/integration/BUILD.bazel +++ b/tests/integration/BUILD.bazel @@ -13,6 +13,7 @@ # limitations under the License. load("@rules_bazel_integration_test//bazel_integration_test:defs.bzl", "default_test_runner") +load("//python:py_library.bzl", "py_library") load(":integration_test.bzl", "rules_python_integration_test") licenses(["notice"]) @@ -102,3 +103,14 @@ rules_python_integration_test( bzlmod = False, workspace_path = "py_cc_toolchain_registered", ) + +rules_python_integration_test( + name = "custom_commands_test", + py_main = "custom_commands_test.py", +) + +py_library( + name = "runner_lib", + srcs = ["runner.py"], + imports = ["../../"], +) diff --git a/tests/integration/custom_commands/BUILD.bazel b/tests/integration/custom_commands/BUILD.bazel new file mode 100644 index 0000000000..b0fafff76f --- /dev/null +++ b/tests/integration/custom_commands/BUILD.bazel @@ -0,0 +1,20 @@ +# 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_python//python:py_binary.bzl", "py_binary") + +py_binary( + name = "bin", + srcs = ["bin.py"], +) diff --git a/tests/integration/custom_commands/MODULE.bazel b/tests/integration/custom_commands/MODULE.bazel new file mode 100644 index 0000000000..5bea8126aa --- /dev/null +++ b/tests/integration/custom_commands/MODULE.bazel @@ -0,0 +1,21 @@ +# 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(name = "module_under_test") + +bazel_dep(name = "rules_python", version = "0.0.0") +local_path_override( + module_name = "rules_python", + path = "../../..", +) diff --git a/tests/integration/custom_commands/WORKSPACE b/tests/integration/custom_commands/WORKSPACE new file mode 100644 index 0000000000..de908549c0 --- /dev/null +++ b/tests/integration/custom_commands/WORKSPACE @@ -0,0 +1,13 @@ +local_repository( + name = "rules_python", + path = "../../..", +) + +load("@rules_python//python:repositories.bzl", "py_repositories", "python_register_toolchains") + +py_repositories() + +python_register_toolchains( + name = "python_3_11", + python_version = "3.11", +) diff --git a/tests/integration/custom_commands/WORKSPACE.bzlmod b/tests/integration/custom_commands/WORKSPACE.bzlmod new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/integration/custom_commands/bin.py b/tests/integration/custom_commands/bin.py new file mode 100644 index 0000000000..62487b5740 --- /dev/null +++ b/tests/integration/custom_commands/bin.py @@ -0,0 +1,16 @@ +# 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. + +print("Hello, world") +print(__file__) diff --git a/tests/integration/custom_commands_test.py b/tests/integration/custom_commands_test.py new file mode 100644 index 0000000000..f78ee468bd --- /dev/null +++ b/tests/integration/custom_commands_test.py @@ -0,0 +1,31 @@ +# 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 logging +import unittest + +from tests.integration import runner + + +class CustomCommandsTest(runner.TestCase): + # Regression test for https://github.com/bazelbuild/rules_python/issues/1840 + def test_run_build_python_zip_false(self): + result = self.run_bazel("run", "--build_python_zip=false", "//:bin") + self.assert_result_matches(result, "bazel-out") + + +if __name__ == "__main__": + # Enabling this makes the runner log subprocesses as the test goes along. + # logging.basicConfig(level = "INFO") + unittest.main() diff --git a/tests/integration/integration_test.bzl b/tests/integration/integration_test.bzl index 16d6a5a1b7..7a8070aa1c 100644 --- a/tests/integration/integration_test.bzl +++ b/tests/integration/integration_test.bzl @@ -19,6 +19,7 @@ load( "bazel_integration_tests", "integration_test_utils", ) +load("//python:py_test.bzl", "py_test") def rules_python_integration_test( name, @@ -26,6 +27,7 @@ def rules_python_integration_test( bzlmod = True, gazelle_plugin = False, tags = None, + py_main = None, **kwargs): """Runs a bazel-in-bazel integration test. @@ -37,10 +39,24 @@ def rules_python_integration_test( disable bzlmod. gazelle_plugin: Whether the test uses the gazelle plugin. tags: Test tags. + py_main: Optional `.py` file to run tests using. When specified, a + python based test runner is used, and this source file is the main + entry point and responsible for executing tests. **kwargs: Passed to the upstream `bazel_integration_tests` rule. """ workspace_path = workspace_path or name.removesuffix("_test") - if bzlmod: + if py_main: + test_runner = name + "_py_runner" + py_test( + name = test_runner, + srcs = [py_main], + main = py_main, + deps = [":runner_lib"], + # Hide from ... patterns; should only be run as part + # of the bazel integration test + tags = ["manual"], + ) + elif bzlmod: if gazelle_plugin: test_runner = "//tests/integration:test_runner_gazelle_plugin" else: diff --git a/tests/integration/runner.py b/tests/integration/runner.py new file mode 100644 index 0000000000..9414a865c0 --- /dev/null +++ b/tests/integration/runner.py @@ -0,0 +1,131 @@ +# 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 logging +import os +import os.path +import pathlib +import re +import shlex +import subprocess +import unittest + +_logger = logging.getLogger(__name__) + +class ExecuteError(Exception): + def __init__(self, result): + self.result = result + def __str__(self): + return self.result.describe() + +class ExecuteResult: + def __init__( + self, + args: list[str], + env: dict[str, str], + cwd: pathlib.Path, + proc_result: subprocess.CompletedProcess, + ): + self.args = args + self.env = env + self.cwd = cwd + self.exit_code = proc_result.returncode + self.stdout = proc_result.stdout + self.stderr = proc_result.stderr + + def describe(self) -> str: + env_lines = [ + " " + shlex.quote(f"{key}={value}") + for key, value in sorted(self.env.items()) + ] + env = " \\\n".join(env_lines) + args = shlex.join(self.args) + maybe_stdout_nl = "" if self.stdout.endswith("\n") else "\n" + maybe_stderr_nl = "" if self.stderr.endswith("\n") else "\n" + return f"""\ +COMMAND: +cd {self.cwd} && \\ +env \\ +{env} \\ + {args} +RESULT: exit_code: {self.exit_code} +===== STDOUT START ===== +{self.stdout}{maybe_stdout_nl}===== STDOUT END ===== +===== STDERR START ===== +{self.stderr}{maybe_stderr_nl}===== STDERR END ===== +""" + + +class TestCase(unittest.TestCase): + def setUp(self): + super().setUp() + self.repo_root = pathlib.Path(os.environ["BIT_WORKSPACE_DIR"]) + self.bazel = pathlib.Path(os.environ["BIT_BAZEL_BINARY"]) + outer_test_tmpdir = pathlib.Path(os.environ["TEST_TMPDIR"]) + self.test_tmp_dir = outer_test_tmpdir / "bit_test_tmp" + # Put the global tmp not under the test tmp to better match how a real + # execution has entirely different directories for these. + self.tmp_dir = outer_test_tmpdir / "bit_tmp" + self.bazel_env = { + "PATH": os.environ["PATH"], + "TEST_TMPDIR": str(self.test_tmp_dir), + "TMP": str(self.tmp_dir), + # For some reason, this is necessary for Bazel 6.4 to work. + # If not present, it can't find some bash helpers in @bazel_tools + "RUNFILES_DIR": os.environ["TEST_SRCDIR"] + } + + def run_bazel(self, *args: str, check: bool = True) -> ExecuteResult: + """Run a bazel invocation. + + Args: + *args: The args to pass to bazel; the leading `bazel` command is + added automatically + check: True if the execution must succeed, False if failure + should raise an error. + Returns: + An `ExecuteResult` from running Bazel + """ + args = [str(self.bazel), *args] + env = self.bazel_env + _logger.info("executing: %s", shlex.join(args)) + cwd = self.repo_root + proc_result = subprocess.run( + args=args, + text=True, + capture_output=True, + cwd=cwd, + env=env, + check=False, + ) + exec_result = ExecuteResult(args, env, cwd, proc_result) + if check and exec_result.exit_code: + raise ExecuteError(exec_result) + else: + return exec_result + + def assert_result_matches(self, result: ExecuteResult, regex: str) -> None: + """Assert stdout/stderr of an invocation matches a regex. + + Args: + result: ExecuteResult from `run_bazel` whose stdout/stderr will + be checked. + regex: Pattern to match, using `re.search` semantics. + """ + if not re.search(regex, result.stdout + result.stderr): + self.fail( + "Bazel output did not match expected pattern\n" + + f"expected pattern: {regex}\n" + + f"invocation details:\n{result.describe()}" + ) From 03854a20c39e9e9bfebe91802102715cb027220a Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 10 Jul 2024 21:28:25 -0700 Subject: [PATCH 117/345] refactor: don't load repo-phase objects from build-phase (#2056) As a general practice, the repo-phase and build-phase shouldn't load code from one another because they can't use each other's objects. It can also result in confusing behavior because the "starlark environment" is slightly different between the two phases. Additionally, Google's version of Bazel essentially disables repo-phase objects, so loading e.g. http_archive results in errors. This makes it more difficult to import rules_python into Google, as we have to maintain patches to cut out the code (and thus we spend more time trying to import the code than working on it). --- python/private/pypi/deps.bzl | 5 +--- python/private/pypi/pip_compile.bzl | 27 +++++++++---------- python/private/pypi/whl_installer/BUILD.bazel | 14 +++++----- python/private/pypi/whl_library.bzl | 4 +-- 4 files changed, 22 insertions(+), 28 deletions(-) diff --git a/python/private/pypi/deps.bzl b/python/private/pypi/deps.bzl index 81bef7aaab..e07d9aa8db 100644 --- a/python/private/pypi/deps.bzl +++ b/python/private/pypi/deps.bzl @@ -123,10 +123,7 @@ py_library( """ # Collate all the repository names so they can be easily consumed -all_requirements = [name for (name, _, _) in _RULE_DEPS] - -def requirement(pkg): - return Label("@pypi__" + pkg + "//:lib") +all_repo_names = [name for (name, _, _) in _RULE_DEPS] def pypi_deps(): """ diff --git a/python/private/pypi/pip_compile.bzl b/python/private/pypi/pip_compile.bzl index 7389e72120..f284a00f68 100644 --- a/python/private/pypi/pip_compile.bzl +++ b/python/private/pypi/pip_compile.bzl @@ -20,7 +20,6 @@ make it possible to have multiple tools inside the `pypi` directory """ load("//python:defs.bzl", _py_binary = "py_binary", _py_test = "py_test") -load(":deps.bzl", "requirement") def pip_compile( name, @@ -115,19 +114,19 @@ def pip_compile( args.extend(extra_args) deps = [ - requirement("build"), - requirement("click"), - requirement("colorama"), - requirement("importlib_metadata"), - requirement("more_itertools"), - requirement("packaging"), - requirement("pep517"), - requirement("pip"), - requirement("pip_tools"), - requirement("pyproject_hooks"), - requirement("setuptools"), - requirement("tomli"), - requirement("zipp"), + Label("@pypi__build//:lib"), + Label("@pypi__click//:lib"), + Label("@pypi__colorama//:lib"), + Label("@pypi__importlib_metadata//:lib"), + Label("@pypi__more_itertools//:lib"), + Label("@pypi__packaging//:lib"), + Label("@pypi__pep517//:lib"), + Label("@pypi__pip//:lib"), + Label("@pypi__pip_tools//:lib"), + Label("@pypi__pyproject_hooks//:lib"), + Label("@pypi__setuptools//:lib"), + Label("@pypi__tomli//:lib"), + Label("@pypi__zipp//:lib"), Label("//python/runfiles:runfiles"), ] + extra_deps diff --git a/python/private/pypi/whl_installer/BUILD.bazel b/python/private/pypi/whl_installer/BUILD.bazel index 58231ceb04..fc9c0e62b2 100644 --- a/python/private/pypi/whl_installer/BUILD.bazel +++ b/python/private/pypi/whl_installer/BUILD.bazel @@ -1,5 +1,4 @@ load("//python:defs.bzl", "py_binary", "py_library") -load("//python/private/pypi:deps.bzl", "requirement") py_library( name = "lib", @@ -10,14 +9,13 @@ py_library( "wheel_installer.py", ], visibility = [ - "//tests:__subpackages__", - "//third_party/rules_pycross/pycross/private:__subpackages__", + "//:__subpackages__", ], deps = [ - requirement("installer"), - requirement("pip"), - requirement("packaging"), - requirement("setuptools"), + "@pypi__installer//:lib", + "@pypi__packaging//:lib", + "@pypi__pip//:lib", + "@pypi__setuptools//:lib", ], ) @@ -32,5 +30,5 @@ py_binary( filegroup( name = "distribution", srcs = glob(["*"]), - visibility = ["//python/private/pypi:__subpackages__"], + visibility = ["//:__subpackages__"], ) diff --git a/python/private/pypi/whl_library.bzl b/python/private/pypi/whl_library.bzl index 77cbd4e29b..a3fa1d8e36 100644 --- a/python/private/pypi/whl_library.bzl +++ b/python/private/pypi/whl_library.bzl @@ -21,7 +21,7 @@ load("//python/private:envsubst.bzl", "envsubst") load("//python/private:repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") load("//python/private:toolchains_repo.bzl", "get_host_os_arch") load(":attrs.bzl", "ATTRS", "use_isolated") -load(":deps.bzl", "all_requirements") +load(":deps.bzl", "all_repo_names") load(":generate_whl_library_build_bazel.bzl", "generate_whl_library_build_bazel") load(":parse_whl_name.bzl", "parse_whl_name") load(":patch_whl.bzl", "patch_whl") @@ -490,7 +490,7 @@ attr makes `extra_pip_args` and `download_only` ignored.""", ] + [ # Includes all the external dependencies from repositories.bzl Label("@" + repo + "//:BUILD.bazel") - for repo in all_requirements + for repo in all_repo_names ], ), }, **ATTRS) From cca1d4efe49733217e7df30a84a172ad3d6e4ae1 Mon Sep 17 00:00:00 2001 From: Douglas Thor Date: Thu, 11 Jul 2024 15:41:46 -0700 Subject: [PATCH 118/345] fix(gazelle): Use the correct rules_go label in gazelle/manifest/defs.bzl (#2058) Fixes #2057. Commit a1d2e45 (#1993) added a reference to `@com_github_bazelbuild_rules_go`, but the module is already added as `@io_bazel_rules_go`. --- gazelle/manifest/defs.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gazelle/manifest/defs.bzl b/gazelle/manifest/defs.bzl index 542f6dc015..5211b71aab 100644 --- a/gazelle/manifest/defs.bzl +++ b/gazelle/manifest/defs.bzl @@ -132,7 +132,7 @@ def gazelle_python_manifest( rundir = ".", deps = [ Label("//manifest"), - Label("@com_github_bazelbuild_rules_go//go/runfiles"), + Label("@io_bazel_rules_go//go/runfiles"), ], # kwargs could contain test-specific attributes like size or timeout **dict(attrs, **kwargs) From eeb74943097843612b5fa0e4e1adf3a380545445 Mon Sep 17 00:00:00 2001 From: Greg Roodt Date: Fri, 12 Jul 2024 10:13:31 +1000 Subject: [PATCH 119/345] feat: Introduce an experimental `uv` toolchain (#1989) # Context This PR introduces a toolchain for [uv](https://github.com/astral-sh/uv) and a module extension that can install it. It will be followed by some rules that make use of the toolchain for things like dependency locking. Relates to https://github.com/bazelbuild/rules_python/issues/1975 Future enhancements (in follow-up PRs): * Introduce a mechanism to use a uv toolchain for locking dependencies * Introduce a mechanism to use a uv toolchain for exporting a venv for downstream tools and IDEs * Factor out the uv download url * Decide on a final location in the repo structure for the toolchain (and any rules) # Notes Try it out: ```bash cd examples/bzlmod bazel run @rules_python//python/uv:current_toolchain ``` I was able to produce a windows lockfile from my `osx_x86_64`:
Click me ``` # This file was autogenerated by uv via the following command: # uv pip compile --python external/rules_python~~python~python_3_9_x86_64-apple-darwin/bin/python3 --python-platform windows --python-version 3.9 --no-strip-extras --generate-hashes --output-file bazel-out/darwin_x86_64-fastbuild/bin/spike_uv_pip_compile.requirements.out requirements.in alabaster==0.7.16 \ --hash=sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65 \ --hash=sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92 # via sphinx astroid==2.13.5 \ --hash=sha256:6891f444625b6edb2ac798829b689e95297e100ddf89dbed5a8c610e34901501 \ --hash=sha256:df164d5ac811b9f44105a72b8f9d5edfb7b5b2d7e979b04ea377a77b3229114a # via pylint babel==2.15.0 \ --hash=sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb \ --hash=sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413 # via sphinx certifi==2024.6.2 \ --hash=sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516 \ --hash=sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56 # via requests chardet==4.0.0 \ --hash=sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa \ --hash=sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5 # via requests colorama==0.4.6 \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 # via # -r requirements.in # pylint # sphinx dill==0.3.8 \ --hash=sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca \ --hash=sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7 # via pylint docutils==0.21.2 \ --hash=sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f \ --hash=sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 # via sphinx idna==2.10 \ --hash=sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6 \ --hash=sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0 # via requests imagesize==1.4.1 \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a # via sphinx importlib-metadata==7.2.1 \ --hash=sha256:509ecb2ab77071db5137c655e24ceb3eee66e7bbc6574165d0d114d9fc4bbe68 \ --hash=sha256:ffef94b0b66046dd8ea2d619b701fe978d9264d38f3998bc4c27ec3b146a87c8 # via sphinx isort==5.13.2 \ --hash=sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109 \ --hash=sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6 # via pylint jinja2==3.1.4 \ --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d # via sphinx lazy-object-proxy==1.10.0 \ --hash=sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56 \ --hash=sha256:02c83f957782cbbe8136bee26416686a6ae998c7b6191711a04da776dc9e47d4 \ --hash=sha256:0aefc7591920bbd360d57ea03c995cebc204b424524a5bd78406f6e1b8b2a5d8 \ --hash=sha256:127a789c75151db6af398b8972178afe6bda7d6f68730c057fbbc2e96b08d282 \ --hash=sha256:18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757 \ --hash=sha256:217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424 \ --hash=sha256:2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b \ --hash=sha256:2fc0a92c02fa1ca1e84fc60fa258458e5bf89d90a1ddaeb8ed9cc3147f417255 \ --hash=sha256:30b339b2a743c5288405aa79a69e706a06e02958eab31859f7f3c04980853b70 \ --hash=sha256:366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94 \ --hash=sha256:3ad54b9ddbe20ae9f7c1b29e52f123120772b06dbb18ec6be9101369d63a4074 \ --hash=sha256:5ad9e6ed739285919aa9661a5bbed0aaf410aa60231373c5579c6b4801bd883c \ --hash=sha256:5faf03a7d8942bb4476e3b62fd0f4cf94eaf4618e304a19865abf89a35c0bbee \ --hash=sha256:75fc59fc450050b1b3c203c35020bc41bd2695ed692a392924c6ce180c6f1dc9 \ --hash=sha256:76a095cfe6045c7d0ca77db9934e8f7b71b14645f0094ffcd842349ada5c5fb9 \ --hash=sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69 \ --hash=sha256:782e2c9b2aab1708ffb07d4bf377d12901d7a1d99e5e410d648d892f8967ab1f \ --hash=sha256:7ab7004cf2e59f7c2e4345604a3e6ea0d92ac44e1c2375527d56492014e690c3 \ --hash=sha256:80b39d3a151309efc8cc48675918891b865bdf742a8616a337cb0090791a0de9 \ --hash=sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d \ --hash=sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977 \ --hash=sha256:92f09ff65ecff3108e56526f9e2481b8116c0b9e1425325e13245abfd79bdb1b \ --hash=sha256:952c81d415b9b80ea261d2372d2a4a2332a3890c2b83e0535f263ddfe43f0d43 \ --hash=sha256:9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658 \ --hash=sha256:9e4ed0518a14dd26092614412936920ad081a424bdcb54cc13349a8e2c6d106a \ --hash=sha256:a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd \ --hash=sha256:b1f711e2c6dcd4edd372cf5dec5c5a30d23bba06ee012093267b3376c079ec83 \ --hash=sha256:b4f87d4ed9064b2628da63830986c3d2dca7501e6018347798313fcf028e2fd4 \ --hash=sha256:cb73507defd385b7705c599a94474b1d5222a508e502553ef94114a143ec6696 \ --hash=sha256:dc0d2fc424e54c70c4bc06787e4072c4f3b1aa2f897dfdc34ce1013cf3ceef05 \ --hash=sha256:e221060b701e2aa2ea991542900dd13907a5c90fa80e199dbf5a03359019e7a3 \ --hash=sha256:e271058822765ad5e3bca7f05f2ace0de58a3f4e62045a8c90a0dfd2f8ad8cc6 \ --hash=sha256:e2adb09778797da09d2b5ebdbceebf7dd32e2c96f79da9052b2e87b6ea495895 \ --hash=sha256:e333e2324307a7b5d86adfa835bb500ee70bfcd1447384a822e96495796b0ca4 \ --hash=sha256:e98c8af98d5707dcdecc9ab0863c0ea6e88545d42ca7c3feffb6b4d1e370c7ba \ --hash=sha256:edb45bb8278574710e68a6b021599a10ce730d156e5b254941754a9cc0b17d03 \ --hash=sha256:fec03caabbc6b59ea4a638bee5fce7117be8e99a4103d9d5ad77f15d6f81020c # via astroid markupsafe==2.1.5 \ --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \ --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \ --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \ --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \ --hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \ --hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \ --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \ --hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \ --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \ --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \ --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \ --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \ --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \ --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \ --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \ --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \ --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \ --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \ --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \ --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \ --hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \ --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \ --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \ --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \ --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \ --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \ --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \ --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \ --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \ --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \ --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \ --hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \ --hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \ --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \ --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \ --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \ --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \ --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \ --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \ --hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \ --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \ --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \ --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \ --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 # via jinja2 mccabe==0.7.0 \ --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e # via pylint packaging==24.1 \ --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 # via sphinx pathspec==0.12.1 \ --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \ --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712 # via yamllint platformdirs==4.2.2 \ --hash=sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee \ --hash=sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3 # via pylint pygments==2.18.0 \ --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a # via sphinx pylint==2.15.10 \ --hash=sha256:9df0d07e8948a1c3ffa3b6e2d7e6e63d9fb457c5da5b961ed63106594780cc7e \ --hash=sha256:b3dc5ef7d33858f297ac0d06cc73862f01e4f2e74025ec3eff347ce0bc60baf5 # via # -r requirements.in # pylint-print pylint-print==1.0.1 \ --hash=sha256:30aa207e9718ebf4ceb47fb87012092e6d8743aab932aa07aa14a73e750ad3d0 \ --hash=sha256:a2b2599e7887b93e551db2624c523c1e6e9e58c3be8416cd98d41e4427e2669b # via -r requirements.in python-dateutil==2.9.0.post0 \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 # via # -r requirements.in # s3cmd python-magic==0.4.27 \ --hash=sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b \ --hash=sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3 # via s3cmd pyyaml==6.0.1 \ --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ --hash=sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df \ --hash=sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741 \ --hash=sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206 \ --hash=sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27 \ --hash=sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595 \ --hash=sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62 \ --hash=sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98 \ --hash=sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696 \ --hash=sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290 \ --hash=sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9 \ --hash=sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d \ --hash=sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6 \ --hash=sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867 \ --hash=sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47 \ --hash=sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486 \ --hash=sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6 \ --hash=sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3 \ --hash=sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 \ --hash=sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938 \ --hash=sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0 \ --hash=sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c \ --hash=sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735 \ --hash=sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d \ --hash=sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28 \ --hash=sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4 \ --hash=sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba \ --hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \ --hash=sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef \ --hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \ --hash=sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd \ --hash=sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3 \ --hash=sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0 \ --hash=sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515 \ --hash=sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c \ --hash=sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c \ --hash=sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924 \ --hash=sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 \ --hash=sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43 \ --hash=sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859 \ --hash=sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 \ --hash=sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54 \ --hash=sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a \ --hash=sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b \ --hash=sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab \ --hash=sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa \ --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \ --hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \ --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f # via yamllint requests==2.25.1 \ --hash=sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804 \ --hash=sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e # via # -r requirements.in # sphinx s3cmd==2.1.0 \ --hash=sha256:49cd23d516b17974b22b611a95ce4d93fe326feaa07320bd1d234fed68cbccfa \ --hash=sha256:966b0a494a916fc3b4324de38f089c86c70ee90e8e1cae6d59102103a4c0cc03 # via -r requirements.in six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 # via python-dateutil snowballstemmer==2.2.0 \ --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 \ --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a # via sphinx sphinx==7.3.7 \ --hash=sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3 \ --hash=sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc # via -r requirements.in sphinxcontrib-applehelp==1.0.8 \ --hash=sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619 \ --hash=sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4 # via sphinx sphinxcontrib-devhelp==1.0.6 \ --hash=sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f \ --hash=sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3 # via sphinx sphinxcontrib-htmlhelp==2.0.5 \ --hash=sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015 \ --hash=sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04 # via sphinx sphinxcontrib-jsmath==1.0.1 \ --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 \ --hash=sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8 # via sphinx sphinxcontrib-qthelp==1.0.7 \ --hash=sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6 \ --hash=sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182 # via sphinx sphinxcontrib-serializinghtml==1.1.10 \ --hash=sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7 \ --hash=sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f # via # -r requirements.in # sphinx tabulate==0.9.0 \ --hash=sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c \ --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f # via -r requirements.in tomli==2.0.1 \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f # via # pylint # sphinx tomlkit==0.12.5 \ --hash=sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f \ --hash=sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c # via pylint typing-extensions==4.12.2 \ --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 # via # astroid # pylint urllib3==1.26.19 \ --hash=sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3 \ --hash=sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429 # via requests websockets==12.0 \ --hash=sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b \ --hash=sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6 \ --hash=sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df \ --hash=sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b \ --hash=sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205 \ --hash=sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892 \ --hash=sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53 \ --hash=sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2 \ --hash=sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed \ --hash=sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c \ --hash=sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd \ --hash=sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b \ --hash=sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931 \ --hash=sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30 \ --hash=sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370 \ --hash=sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be \ --hash=sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec \ --hash=sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf \ --hash=sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62 \ --hash=sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b \ --hash=sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402 \ --hash=sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f \ --hash=sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123 \ --hash=sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9 \ --hash=sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603 \ --hash=sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45 \ --hash=sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558 \ --hash=sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4 \ --hash=sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438 \ --hash=sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137 \ --hash=sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480 \ --hash=sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447 \ --hash=sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8 \ --hash=sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04 \ --hash=sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c \ --hash=sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb \ --hash=sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967 \ --hash=sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b \ --hash=sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d \ --hash=sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def \ --hash=sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c \ --hash=sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92 \ --hash=sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2 \ --hash=sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113 \ --hash=sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b \ --hash=sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28 \ --hash=sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7 \ --hash=sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d \ --hash=sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f \ --hash=sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468 \ --hash=sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8 \ --hash=sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae \ --hash=sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611 \ --hash=sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d \ --hash=sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9 \ --hash=sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca \ --hash=sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f \ --hash=sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2 \ --hash=sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077 \ --hash=sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2 \ --hash=sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6 \ --hash=sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374 \ --hash=sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc \ --hash=sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e \ --hash=sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53 \ --hash=sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399 \ --hash=sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547 \ --hash=sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3 \ --hash=sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870 \ --hash=sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5 \ --hash=sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8 \ --hash=sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7 # via -r requirements.in wheel==0.43.0 \ --hash=sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85 \ --hash=sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81 # via -r requirements.in wrapt==1.16.0 \ --hash=sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc \ --hash=sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81 \ --hash=sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09 \ --hash=sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e \ --hash=sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca \ --hash=sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0 \ --hash=sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb \ --hash=sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487 \ --hash=sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40 \ --hash=sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c \ --hash=sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060 \ --hash=sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202 \ --hash=sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41 \ --hash=sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9 \ --hash=sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b \ --hash=sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664 \ --hash=sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d \ --hash=sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362 \ --hash=sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00 \ --hash=sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc \ --hash=sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1 \ --hash=sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267 \ --hash=sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956 \ --hash=sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966 \ --hash=sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1 \ --hash=sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228 \ --hash=sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72 \ --hash=sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d \ --hash=sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292 \ --hash=sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0 \ --hash=sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0 \ --hash=sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36 \ --hash=sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c \ --hash=sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5 \ --hash=sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f \ --hash=sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73 \ --hash=sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b \ --hash=sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2 \ --hash=sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593 \ --hash=sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39 \ --hash=sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389 \ --hash=sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf \ --hash=sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf \ --hash=sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89 \ --hash=sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c \ --hash=sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c \ --hash=sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f \ --hash=sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440 \ --hash=sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465 \ --hash=sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136 \ --hash=sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b \ --hash=sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8 \ --hash=sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3 \ --hash=sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8 \ --hash=sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6 \ --hash=sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e \ --hash=sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f \ --hash=sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c \ --hash=sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e \ --hash=sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8 \ --hash=sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2 \ --hash=sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020 \ --hash=sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35 \ --hash=sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d \ --hash=sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3 \ --hash=sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537 \ --hash=sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809 \ --hash=sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d \ --hash=sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a \ --hash=sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4 # via astroid yamllint==1.35.1 \ --hash=sha256:2e16e504bb129ff515b37823b472750b36b6de07963bd74b307341ef5ad8bdc3 \ --hash=sha256:7a003809f88324fd2c877734f2d575ee7881dd9043360657cc8049c809eba6cd # via -r requirements.in zipp==3.19.2 \ --hash=sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19 \ --hash=sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c # via importlib-metadata ```
--------- Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Co-authored-by: Richard Levasseur --- examples/bzlmod/MODULE.bazel | 7 ++ python/BUILD.bazel | 2 + python/private/python.bzl | 17 +--- python/private/text_util.bzl | 16 ++++ python/uv/BUILD.bazel | 78 +++++++++++++++ python/uv/defs.bzl | 23 +++++ python/uv/extensions.bzl | 50 ++++++++++ python/uv/private/BUILD.bazel | 45 +++++++++ python/uv/private/current_toolchain.bzl | 56 +++++++++++ python/uv/private/providers.bzl | 31 ++++++ python/uv/private/toolchain_types.bzl | 22 +++++ python/uv/private/toolchains_repo.bzl | 50 ++++++++++ python/uv/private/versions.bzl | 94 ++++++++++++++++++ python/uv/repositories.bzl | 122 ++++++++++++++++++++++++ python/uv/toolchain.bzl | 64 +++++++++++++ 15 files changed, 662 insertions(+), 15 deletions(-) create mode 100644 python/uv/BUILD.bazel create mode 100644 python/uv/defs.bzl create mode 100644 python/uv/extensions.bzl create mode 100644 python/uv/private/BUILD.bazel create mode 100644 python/uv/private/current_toolchain.bzl create mode 100644 python/uv/private/providers.bzl create mode 100644 python/uv/private/toolchain_types.bzl create mode 100644 python/uv/private/toolchains_repo.bzl create mode 100644 python/uv/private/versions.bzl create mode 100644 python/uv/repositories.bzl create mode 100644 python/uv/toolchain.bzl diff --git a/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel index e46989e9fd..3da17a6eb2 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -43,6 +43,13 @@ python.toolchain( # rules based on the `python_version` arg values. use_repo(python, "python_3_10", "python_3_9", "python_versions") +# 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") +use_repo(uv, "uv_toolchains") + +register_toolchains("@uv_toolchains//:all") + # This extension allows a user to create modifications to how rules_python # creates different wheel repositories. Different attributes allow the user # to modify the BUILD file, and copy files. diff --git a/python/BUILD.bazel b/python/BUILD.bazel index 7a69ac8051..e83b79c914 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -11,6 +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. + """This package contains two sets of rules: 1) the "core" Python rules, which were historically bundled with Bazel and @@ -41,6 +42,7 @@ filegroup( "//python/pip_install:distribution", "//python/private:distribution", "//python/runfiles:distribution", + "//python/uv:distribution", ], visibility = ["//:__pkg__"], ) diff --git a/python/private/python.bzl b/python/private/python.bzl index 56566790d3..2791ae9e38 100644 --- a/python/private/python.bzl +++ b/python/private/python.bzl @@ -17,6 +17,7 @@ load("@bazel_features//:features.bzl", "bazel_features") load("//python:repositories.bzl", "python_register_toolchains") load(":pythons_hub.bzl", "hub_repo") +load(":text_util.bzl", "render") load(":toolchains_repo.bzl", "multi_toolchain_aliases") load(":util.bzl", "IS_BAZEL_6_4_OR_HIGHER") @@ -25,20 +26,6 @@ load(":util.bzl", "IS_BAZEL_6_4_OR_HIGHER") _MAX_NUM_TOOLCHAINS = 9999 _TOOLCHAIN_INDEX_PAD_LENGTH = len(str(_MAX_NUM_TOOLCHAINS)) -def _toolchain_prefix(index, name): - """Prefixes the given name with the index, padded with zeros to ensure lexicographic sorting. - - Examples: - _toolchain_prefix( 2, "foo") == "_0002_foo_" - _toolchain_prefix(2000, "foo") == "_2000_foo_" - """ - return "_{}_{}_".format(_left_pad_zero(index, _TOOLCHAIN_INDEX_PAD_LENGTH), name) - -def _left_pad_zero(index, length): - if index < 0: - fail("index must be non-negative") - return ("0" * length + str(index))[-length:] - # Printing a warning msg not debugging, so we have to disable # the buildifier check. # buildifier: disable=print @@ -202,7 +189,7 @@ def _python_impl(module_ctx): name = "pythons_hub", default_python_version = default_toolchain.python_version, toolchain_prefixes = [ - _toolchain_prefix(index, toolchain.name) + render.toolchain_prefix(index, toolchain.name, _TOOLCHAIN_INDEX_PAD_LENGTH) for index, toolchain in enumerate(toolchains) ], toolchain_python_versions = [t.python_version for t in toolchains], diff --git a/python/private/text_util.bzl b/python/private/text_util.bzl index 702a08e281..8a018e7969 100644 --- a/python/private/text_util.bzl +++ b/python/private/text_util.bzl @@ -99,11 +99,27 @@ def _render_tuple(items, *, value_repr = repr): ")", ]) +def _toolchain_prefix(index, name, pad_length): + """Prefixes the given name with the index, padded with zeros to ensure lexicographic sorting. + + Examples: + toolchain_prefix( 2, "foo", 4) == "_0002_foo_" + toolchain_prefix(2000, "foo", 4) == "_2000_foo_" + """ + return "_{}_{}_".format(_left_pad_zero(index, pad_length), name) + +def _left_pad_zero(index, length): + if index < 0: + fail("index must be non-negative") + return ("0" * length + str(index))[-length:] + render = struct( alias = _render_alias, dict = _render_dict, indent = _indent, + left_pad_zero = _left_pad_zero, list = _render_list, select = _render_select, tuple = _render_tuple, + toolchain_prefix = _toolchain_prefix, ) diff --git a/python/uv/BUILD.bazel b/python/uv/BUILD.bazel new file mode 100644 index 0000000000..3961c908ac --- /dev/null +++ b/python/uv/BUILD.bazel @@ -0,0 +1,78 @@ +# 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. + +# EXPERIMENTAL: This is experimental and may be removed without notice + +load("@bazel_skylib//:bzl_library.bzl", "bzl_library") +load("//python/uv/private:current_toolchain.bzl", "current_toolchain") + +package(default_visibility = ["//:__subpackages__"]) + +filegroup( + name = "distribution", + srcs = glob(["**"]) + [ + "//python/uv/private:distribution", + ], + visibility = ["//:__subpackages__"], +) + +# For stardoc to reference the files +exports_files(["defs.bzl"]) + +toolchain_type( + name = "uv_toolchain_type", + visibility = ["//visibility:public"], +) + +current_toolchain( + name = "current_toolchain", + # Marked manual so that `bazel test //...` passes + # even if no toolchain is registered. + tags = ["manual"], + # EXPERIMENTAL: Visibility is restricted to allow for changes. + visibility = ["@rules_python//examples:__subpackages__"], +) + +bzl_library( + name = "defs", + srcs = ["defs.bzl"], + # EXPERIMENTAL: Visibility is restricted to allow for changes. + visibility = ["//:__subpackages__"], +) + +bzl_library( + name = "extensions", + srcs = ["extensions.bzl"], + # EXPERIMENTAL: Visibility is restricted to allow for changes. + visibility = ["//:__subpackages__"], + deps = [":repositories"], +) + +bzl_library( + name = "repositories", + srcs = ["repositories.bzl"], + # EXPERIMENTAL: Visibility is restricted to allow for changes. + visibility = ["//:__subpackages__"], + deps = [ + "//python/uv/private:toolchains_repo", + "//python/uv/private:versions", + ], +) + +bzl_library( + name = "toolchain", + srcs = ["toolchain.bzl"], + # EXPERIMENTAL: Visibility is restricted to allow for changes. + visibility = ["//:__subpackages__"], +) diff --git a/python/uv/defs.bzl b/python/uv/defs.bzl new file mode 100644 index 0000000000..20b426a355 --- /dev/null +++ b/python/uv/defs.bzl @@ -0,0 +1,23 @@ +# 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. + +""" +EXPERIMENTAL: This is experimental and may be removed without notice + +A toolchain for uv +""" + +load("//python/uv/private:providers.bzl", _UvToolchainInfo = "UvToolchainInfo") + +UvToolchainInfo = _UvToolchainInfo diff --git a/python/uv/extensions.bzl b/python/uv/extensions.bzl new file mode 100644 index 0000000000..82560eb17c --- /dev/null +++ b/python/uv/extensions.bzl @@ -0,0 +1,50 @@ +# 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. + +""" +EXPERIMENTAL: This is experimental and may be removed without notice + +A module extension for working with uv. +""" + +load("//python/uv:repositories.bzl", "uv_register_toolchains") + +_DOC = """\ +A module extension for working with uv. +""" + +uv_toolchain = tag_class(attrs = { + "uv_version": attr.string(doc = "Explicit version of uv.", mandatory = True), +}) + +def _uv_toolchain_extension(module_ctx): + for mod in module_ctx.modules: + for toolchain in mod.tags.toolchain: + if not mod.is_root: + fail( + "Only the root module may configure the uv toolchain.", + "This prevents conflicting registrations with any other modules.", + "NOTE: We may wish to enforce a policy where toolchain configuration is only allowed in the root module, or in rules_python. See https://github.com/bazelbuild/bazel/discussions/22024", + ) + + uv_register_toolchains( + uv_version = toolchain.uv_version, + register_toolchains = False, + ) + +uv = module_extension( + doc = _DOC, + implementation = _uv_toolchain_extension, + tag_classes = {"toolchain": uv_toolchain}, +) diff --git a/python/uv/private/BUILD.bazel b/python/uv/private/BUILD.bazel new file mode 100644 index 0000000000..56dab35757 --- /dev/null +++ b/python/uv/private/BUILD.bazel @@ -0,0 +1,45 @@ +# 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("@bazel_skylib//:bzl_library.bzl", "bzl_library") + +filegroup( + name = "distribution", + srcs = glob(["**"]), + visibility = ["//python/uv:__pkg__"], +) + +bzl_library( + name = "current_toolchain", + srcs = ["current_toolchain.bzl"], + visibility = ["//python/uv:__subpackages__"], +) + +bzl_library( + name = "toolchain_types", + srcs = ["toolchain_types.bzl"], + visibility = ["//python/uv:__subpackages__"], +) + +bzl_library( + name = "toolchains_repo", + srcs = ["toolchains_repo.bzl"], + visibility = ["//python/uv:__subpackages__"], +) + +bzl_library( + name = "versions", + srcs = ["versions.bzl"], + visibility = ["//python/uv:__subpackages__"], +) diff --git a/python/uv/private/current_toolchain.bzl b/python/uv/private/current_toolchain.bzl new file mode 100644 index 0000000000..cd4a5926d2 --- /dev/null +++ b/python/uv/private/current_toolchain.bzl @@ -0,0 +1,56 @@ +# 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 module implements an alias rule to the resolved toolchain. +""" + +load("//python/uv/private:toolchain_types.bzl", "UV_TOOLCHAIN_TYPE") + +_DOC = """\ +Exposes a concrete toolchain which is the result of Bazel resolving the +toolchain for the execution or target platform. +Workaround for https://github.com/bazelbuild/bazel/issues/14009 +""" + +# Forward all the providers +def _current_toolchain_impl(ctx): + toolchain_info = ctx.toolchains[UV_TOOLCHAIN_TYPE] + + # Bazel requires executable rules to create the executable themselves, + # so we create a symlink in this rule so that it appears this rule created its executable. + original_uv_executable = toolchain_info.uv_toolchain_info.uv[DefaultInfo].files_to_run.executable + symlink_uv_executable = ctx.actions.declare_file("uv_symlink_{}".format(original_uv_executable.basename)) + ctx.actions.symlink(output = symlink_uv_executable, target_file = original_uv_executable) + + new_default_info = DefaultInfo( + files = depset([symlink_uv_executable]), + runfiles = toolchain_info.default_info.default_runfiles, + executable = symlink_uv_executable, + ) + + return [ + toolchain_info, + new_default_info, + toolchain_info.template_variable_info, + toolchain_info.uv_toolchain_info, + ] + +# Copied from java_toolchain_alias +# https://cs.opensource.google/bazel/bazel/+/master:tools/jdk/java_toolchain_alias.bzl +current_toolchain = rule( + implementation = _current_toolchain_impl, + toolchains = [UV_TOOLCHAIN_TYPE], + doc = _DOC, + executable = True, +) diff --git a/python/uv/private/providers.bzl b/python/uv/private/providers.bzl new file mode 100644 index 0000000000..ac1ef310ea --- /dev/null +++ b/python/uv/private/providers.bzl @@ -0,0 +1,31 @@ +# 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 module contains the definitions of all providers.""" + +UvToolchainInfo = provider( + doc = "Information about how to invoke the uv executable.", + fields = { + "uv": """ +:type: Target + +The uv binary `Target` +""", + "version": """ +:type: str + +The uv version +""", + }, +) diff --git a/python/uv/private/toolchain_types.bzl b/python/uv/private/toolchain_types.bzl new file mode 100644 index 0000000000..031e1ab0e0 --- /dev/null +++ b/python/uv/private/toolchain_types.bzl @@ -0,0 +1,22 @@ +# 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. + +"""Labels to identify toolchain types. + +This is a separate file because things needing the toolchain types (in +particular, toolchain() registrations) shouldn't need to load the entire +implementation of the toolchain. +""" + +UV_TOOLCHAIN_TYPE = Label("//python/uv:uv_toolchain_type") diff --git a/python/uv/private/toolchains_repo.bzl b/python/uv/private/toolchains_repo.bzl new file mode 100644 index 0000000000..12ae134c94 --- /dev/null +++ b/python/uv/private/toolchains_repo.bzl @@ -0,0 +1,50 @@ +# 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. + +"Creates a repository to hold toolchains" + +_TOOLCHAIN_TEMPLATE = """ +toolchain( + name = "{name}", + target_compatible_with = {compatible_with}, + toolchain = "{toolchain_label}", + toolchain_type = "{toolchain_type}", +) +""" + +def _toolchains_repo_impl(repository_ctx): + build_content = "" + for toolchain_name in repository_ctx.attr.toolchain_names: + toolchain_label = repository_ctx.attr.toolchain_labels[toolchain_name] + toolchain_compatible_with = repository_ctx.attr.toolchain_compatible_with[toolchain_name] + + build_content += _TOOLCHAIN_TEMPLATE.format( + name = toolchain_name, + toolchain_type = repository_ctx.attr.toolchain_type, + toolchain_label = toolchain_label, + compatible_with = json.encode(toolchain_compatible_with), + ) + + repository_ctx.file("BUILD.bazel", build_content) + +uv_toolchains_repo = repository_rule( + _toolchains_repo_impl, + doc = "Generates a toolchain hub repository", + attrs = { + "toolchain_compatible_with": attr.string_list_dict(doc = "A list of platform constraints for this toolchain, keyed by toolchain name.", mandatory = True), + "toolchain_labels": attr.string_dict(doc = "The name of the toolchain implementation target, keyed by toolchain name.", mandatory = True), + "toolchain_names": attr.string_list(doc = "List of toolchain names", mandatory = True), + "toolchain_type": attr.string(doc = "The toolchain type of the toolchains", mandatory = True), + }, +) diff --git a/python/uv/private/versions.bzl b/python/uv/private/versions.bzl new file mode 100644 index 0000000000..f7f0b9e0fe --- /dev/null +++ b/python/uv/private/versions.bzl @@ -0,0 +1,94 @@ +# 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. + +"""Version and integrity information for downloaded artifacts""" + +UV_PLATFORMS = { + "aarch64-apple-darwin": struct( + default_repo_name = "rules_python_uv_darwin_aarch64", + compatible_with = [ + "@platforms//os:macos", + "@platforms//cpu:aarch64", + ], + ), + "aarch64-unknown-linux-gnu": struct( + default_repo_name = "rules_python_uv_linux_aarch64", + compatible_with = [ + "@platforms//os:linux", + "@platforms//cpu:aarch64", + ], + ), + "powerpc64le-unknown-linux-gnu": struct( + default_repo_name = "rules_python_uv_linux_ppc", + compatible_with = [ + "@platforms//os:linux", + "@platforms//cpu:ppc", + ], + ), + "s390x-unknown-linux-gnu": struct( + default_repo_name = "rules_python_uv_linux_s390x", + compatible_with = [ + "@platforms//os:linux", + "@platforms//cpu:s390x", + ], + ), + "x86_64-apple-darwin": struct( + default_repo_name = "rules_python_uv_darwin_x86_64", + compatible_with = [ + "@platforms//os:macos", + "@platforms//cpu:x86_64", + ], + ), + "x86_64-pc-windows-msvc": struct( + default_repo_name = "rules_python_uv_windows_x86_64", + compatible_with = [ + "@platforms//os:windows", + "@platforms//cpu:x86_64", + ], + ), + "x86_64-unknown-linux-gnu": struct( + default_repo_name = "rules_python_uv_linux_x86_64", + compatible_with = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + ), +} + +# From: https://github.com/astral-sh/uv/releases +UV_TOOL_VERSIONS = { + "0.2.23": { + "aarch64-apple-darwin": struct( + sha256 = "1d41beb151ace9621a0e729d661cfb04d6375bffdaaf0e366d1653576ce3a687", + ), + "aarch64-unknown-linux-gnu": struct( + sha256 = "c35042255239b75d29b9fd4b0845894b91284ed3ff90c2595d0518b4c8902329", + ), + "powerpc64le-unknown-linux-gnu": struct( + sha256 = "ca16c9456d297e623164e3089d76259c6d70ac40c037dd2068accc3bb1b09d5e", + ), + "s390x-unknown-linux-gnu": struct( + sha256 = "55f8c2aa089f382645fce9eed3ee002f2cd48de4696568e7fd63105a02da568c", + ), + "x86_64-apple-darwin": struct( + sha256 = "960d2ae6ec31bcf5da3f66083dedc527712115b97ee43eae903d74a43874fa72", + ), + "x86_64-pc-windows-msvc": struct( + sha256 = "66f80537301c686a801b91468a43dbeb0881bd6d51857078c24f29e5dca8ecf1", + ), + "x86_64-unknown-linux-gnu": struct( + sha256 = "4384db514959beb4de1dcdf7f1f2d5faf664f7180820b0e7a521ef2147e33d1d", + ), + }, +} diff --git a/python/uv/repositories.bzl b/python/uv/repositories.bzl new file mode 100644 index 0000000000..7f27e8bdc5 --- /dev/null +++ b/python/uv/repositories.bzl @@ -0,0 +1,122 @@ +# 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. + +""" +EXPERIMENTAL: This is experimental and may be removed without notice + +Create repositories for uv toolchain dependencies +""" + +load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") +load("//python/uv/private:toolchain_types.bzl", "UV_TOOLCHAIN_TYPE") +load("//python/uv/private:toolchains_repo.bzl", "uv_toolchains_repo") +load("//python/uv/private:versions.bzl", "UV_PLATFORMS", "UV_TOOL_VERSIONS") + +UV_BUILD_TMPL = """\ +# Generated by repositories.bzl +load("@rules_python//python/uv:toolchain.bzl", "uv_toolchain") + +uv_toolchain( + name = "uv_toolchain", + uv = "{binary}", + version = "{version}", +) +""" + +def _uv_repo_impl(repository_ctx): + platform = repository_ctx.attr.platform + uv_version = repository_ctx.attr.uv_version + + is_windows = "windows" in platform + + suffix = ".zip" if is_windows else ".tar.gz" + filename = "uv-{platform}{suffix}".format( + platform = platform, + suffix = suffix, + ) + url = "https://github.com/astral-sh/uv/releases/download/{version}/{filename}".format( + version = uv_version, + filename = filename, + ) + if filename.endswith(".tar.gz"): + strip_prefix = filename[:-len(".tar.gz")] + else: + strip_prefix = "" + + repository_ctx.download_and_extract( + url = url, + sha256 = UV_TOOL_VERSIONS[repository_ctx.attr.uv_version][repository_ctx.attr.platform].sha256, + stripPrefix = strip_prefix, + ) + + binary = "uv.exe" if is_windows else "uv" + repository_ctx.file( + "BUILD.bazel", + UV_BUILD_TMPL.format( + binary = binary, + version = uv_version, + ), + ) + +uv_repository = repository_rule( + _uv_repo_impl, + doc = "Fetch external tools needed for uv toolchain", + attrs = { + "platform": attr.string(mandatory = True, values = UV_PLATFORMS.keys()), + "uv_version": attr.string(mandatory = True, values = UV_TOOL_VERSIONS.keys()), + }, +) + +# buildifier: disable=unnamed-macro +def uv_register_toolchains(uv_version = None, register_toolchains = True): + """Convenience macro which does typical toolchain setup + + Skip this macro if you need more control over the toolchain setup. + + Args: + uv_version: The uv toolchain version to download. + register_toolchains: If true, repositories will be generated to produce and register `uv_toolchain` targets. + """ + if not uv_version: + fail("uv_version is required") + + toolchain_names = [] + toolchain_labels_by_toolchain = {} + toolchain_compatible_with_by_toolchain = {} + + for platform in UV_PLATFORMS.keys(): + uv_repository_name = UV_PLATFORMS[platform].default_repo_name + + maybe( + uv_repository, + name = uv_repository_name, + uv_version = uv_version, + platform = platform, + ) + + toolchain_name = uv_repository_name + "_toolchain" + toolchain_names.append(toolchain_name) + toolchain_labels_by_toolchain[toolchain_name] = "@{}//:uv_toolchain".format(uv_repository_name) + toolchain_compatible_with_by_toolchain[toolchain_name] = UV_PLATFORMS[platform].compatible_with + + uv_toolchains_repo( + name = "uv_toolchains", + toolchain_type = str(UV_TOOLCHAIN_TYPE), + toolchain_names = toolchain_names, + toolchain_labels = toolchain_labels_by_toolchain, + toolchain_compatible_with = toolchain_compatible_with_by_toolchain, + ) + + if register_toolchains: + native.register_toolchains("@uv_toolchains//:all") diff --git a/python/uv/toolchain.bzl b/python/uv/toolchain.bzl new file mode 100644 index 0000000000..dbfda0b70c --- /dev/null +++ b/python/uv/toolchain.bzl @@ -0,0 +1,64 @@ +# 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. + +""" +EXPERIMENTAL: This is experimental and may be removed without notice + +This module implements the uv toolchain rule +""" + +load("//python/uv/private:providers.bzl", "UvToolchainInfo") + +def _uv_toolchain_impl(ctx): + uv = ctx.attr.uv + + default_info = DefaultInfo( + files = uv.files, + runfiles = uv[DefaultInfo].default_runfiles, + ) + uv_toolchain_info = UvToolchainInfo( + uv = uv, + version = ctx.attr.version, + ) + template_variable_info = platform_common.TemplateVariableInfo({ + "UV_BIN": uv[DefaultInfo].files_to_run.executable.path, + }) + + # Export all the providers inside our ToolchainInfo + # so the current_toolchain rule can grab and re-export them. + toolchain_info = platform_common.ToolchainInfo( + default_info = default_info, + template_variable_info = template_variable_info, + uv_toolchain_info = uv_toolchain_info, + ) + return [ + default_info, + toolchain_info, + template_variable_info, + ] + +uv_toolchain = rule( + implementation = _uv_toolchain_impl, + attrs = { + "uv": attr.label( + doc = "A static uv binary.", + mandatory = True, + allow_single_file = True, + executable = True, + cfg = "target", + ), + "version": attr.string(mandatory = True, doc = "Version of the uv binary."), + }, + doc = "Defines a uv toolchain.", +) From 43a32a3d75029cee07179e29cb215d25365054bc Mon Sep 17 00:00:00 2001 From: Greg Roodt Date: Sat, 13 Jul 2024 14:26:53 +1000 Subject: [PATCH 120/345] refactor: Address a few improvements on `uv` toolchain (#2062) Follows: https://github.com/bazelbuild/rules_python/pull/1989 Addresses the following: * Removes usage of `maybe` * Pretty-print renders some generated *.bazel * Shorter default_repo_names --- python/uv/private/BUILD.bazel | 3 +++ python/uv/private/toolchains_repo.bzl | 4 +++- python/uv/private/versions.bzl | 14 +++++++------- python/uv/repositories.bzl | 4 +--- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/python/uv/private/BUILD.bazel b/python/uv/private/BUILD.bazel index 56dab35757..80fd23913f 100644 --- a/python/uv/private/BUILD.bazel +++ b/python/uv/private/BUILD.bazel @@ -36,6 +36,9 @@ bzl_library( name = "toolchains_repo", srcs = ["toolchains_repo.bzl"], visibility = ["//python/uv:__subpackages__"], + deps = [ + "//python/private:text_util_bzl", + ], ) bzl_library( diff --git a/python/uv/private/toolchains_repo.bzl b/python/uv/private/toolchains_repo.bzl index 12ae134c94..9a8858f1b0 100644 --- a/python/uv/private/toolchains_repo.bzl +++ b/python/uv/private/toolchains_repo.bzl @@ -14,6 +14,8 @@ "Creates a repository to hold toolchains" +load("//python/private:text_util.bzl", "render") + _TOOLCHAIN_TEMPLATE = """ toolchain( name = "{name}", @@ -33,7 +35,7 @@ def _toolchains_repo_impl(repository_ctx): name = toolchain_name, toolchain_type = repository_ctx.attr.toolchain_type, toolchain_label = toolchain_label, - compatible_with = json.encode(toolchain_compatible_with), + compatible_with = render.list(toolchain_compatible_with), ) repository_ctx.file("BUILD.bazel", build_content) diff --git a/python/uv/private/versions.bzl b/python/uv/private/versions.bzl index f7f0b9e0fe..6e7091b4c8 100644 --- a/python/uv/private/versions.bzl +++ b/python/uv/private/versions.bzl @@ -16,49 +16,49 @@ UV_PLATFORMS = { "aarch64-apple-darwin": struct( - default_repo_name = "rules_python_uv_darwin_aarch64", + default_repo_name = "uv_darwin_aarch64", compatible_with = [ "@platforms//os:macos", "@platforms//cpu:aarch64", ], ), "aarch64-unknown-linux-gnu": struct( - default_repo_name = "rules_python_uv_linux_aarch64", + default_repo_name = "uv_linux_aarch64", compatible_with = [ "@platforms//os:linux", "@platforms//cpu:aarch64", ], ), "powerpc64le-unknown-linux-gnu": struct( - default_repo_name = "rules_python_uv_linux_ppc", + default_repo_name = "uv_linux_ppc", compatible_with = [ "@platforms//os:linux", "@platforms//cpu:ppc", ], ), "s390x-unknown-linux-gnu": struct( - default_repo_name = "rules_python_uv_linux_s390x", + default_repo_name = "uv_linux_s390x", compatible_with = [ "@platforms//os:linux", "@platforms//cpu:s390x", ], ), "x86_64-apple-darwin": struct( - default_repo_name = "rules_python_uv_darwin_x86_64", + default_repo_name = "uv_darwin_x86_64", compatible_with = [ "@platforms//os:macos", "@platforms//cpu:x86_64", ], ), "x86_64-pc-windows-msvc": struct( - default_repo_name = "rules_python_uv_windows_x86_64", + default_repo_name = "uv_windows_x86_64", compatible_with = [ "@platforms//os:windows", "@platforms//cpu:x86_64", ], ), "x86_64-unknown-linux-gnu": struct( - default_repo_name = "rules_python_uv_linux_x86_64", + default_repo_name = "uv_linux_x86_64", compatible_with = [ "@platforms//os:linux", "@platforms//cpu:x86_64", diff --git a/python/uv/repositories.bzl b/python/uv/repositories.bzl index 7f27e8bdc5..0125b2033b 100644 --- a/python/uv/repositories.bzl +++ b/python/uv/repositories.bzl @@ -18,7 +18,6 @@ EXPERIMENTAL: This is experimental and may be removed without notice Create repositories for uv toolchain dependencies """ -load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") load("//python/uv/private:toolchain_types.bzl", "UV_TOOLCHAIN_TYPE") load("//python/uv/private:toolchains_repo.bzl", "uv_toolchains_repo") load("//python/uv/private:versions.bzl", "UV_PLATFORMS", "UV_TOOL_VERSIONS") @@ -98,8 +97,7 @@ def uv_register_toolchains(uv_version = None, register_toolchains = True): for platform in UV_PLATFORMS.keys(): uv_repository_name = UV_PLATFORMS[platform].default_repo_name - maybe( - uv_repository, + uv_repository( name = uv_repository_name, uv_version = uv_version, platform = platform, From f0a23b6efb698bcbb68bbe6e12685a9aa688783b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 18:35:04 -0700 Subject: [PATCH 121/345] build(deps): bump zipp from 3.11.0 to 3.19.2 in /tools/publish (#2066) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [zipp](https://github.com/jaraco/zipp) from 3.11.0 to 3.19.2.
Changelog

Sourced from zipp's changelog.

v3.19.2

No significant changes.

v3.19.1

Bugfixes

  • Improved handling of malformed zip files. (#119)

v3.19.0

Features

  • Implement is_symlink. (#117)

v3.18.2

No significant changes.

v3.18.1

No significant changes.

v3.18.0

Features

  • Bypass ZipFile.namelist in glob for better performance. (#106)
  • Refactored glob functionality to support a more generalized solution with support for platform-specific path separators. (#108)

Bugfixes

  • Add special accounting for pypy when computing the stack level for text encoding warnings. (#114)

... (truncated)

Commits
  • c6a3339 Move Python compatibility concerns to the appropriate modules.
  • c24fc57 Finalize
  • 294a462 Ignore coverage misses in tests.compat.py39
  • aab60f4 🧎‍♀️ Genuflect to the types.
  • 59f852a Correct typo (incorrect letter used) when expacting alpharep root.
  • 2a7a5bc Add test capturing expectation that a Path is a Traversable.
  • 7d2b55b Update docstring to reference Traversable.
  • 6d1cb72 Finalize
  • fd604bd Merge pull request #120 from jaraco/bugfix/119-malformed-paths
  • c18417e Add news fragment.
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=zipp&package-manager=pip&previous-version=3.11.0&new-version=3.19.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/publish/requirements_darwin.txt | 6 +++--- tools/publish/requirements_windows.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/publish/requirements_darwin.txt b/tools/publish/requirements_darwin.txt index d243cc284a..dd4ac40820 100644 --- a/tools/publish/requirements_darwin.txt +++ b/tools/publish/requirements_darwin.txt @@ -188,7 +188,7 @@ webencodings==0.5.1 \ --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923 # via bleach -zipp==3.11.0 \ - --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ - --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 +zipp==3.19.2 \ + --hash=sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19 \ + --hash=sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c # via importlib-metadata diff --git a/tools/publish/requirements_windows.txt b/tools/publish/requirements_windows.txt index 4bfdb19835..7e210c9eb7 100644 --- a/tools/publish/requirements_windows.txt +++ b/tools/publish/requirements_windows.txt @@ -192,7 +192,7 @@ webencodings==0.5.1 \ --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923 # via bleach -zipp==3.11.0 \ - --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ - --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 +zipp==3.19.2 \ + --hash=sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19 \ + --hash=sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c # via importlib-metadata From 7093d91e235c950fcf277749c0c1f5bcefab2482 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 18:35:34 -0700 Subject: [PATCH 122/345] build(deps): bump setuptools from 65.6.3 to 70.0.0 in /examples/pip_parse (#2065) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [setuptools](https://github.com/pypa/setuptools) from 65.6.3 to 70.0.0.
Changelog

Sourced from setuptools's changelog.

v70.0.0

Features

  • Emit a warning when [tools.setuptools] is present in pyproject.toml and will be ignored. -- by :user:SnoopJ (#4150)
  • Improved AttributeError error message if pkg_resources.EntryPoint.require is called without extras or distribution Gracefully "do nothing" when trying to activate a pkg_resources.Distribution with a None location, rather than raising a TypeError -- by :user:Avasam (#4262)
  • Typed the dynamically defined variables from pkg_resources -- by :user:Avasam (#4267)
  • Modernized and refactored VCS handling in package_index. (#4332)

Bugfixes

  • In install command, use super to call the superclass methods. Avoids race conditions when monkeypatching from _distutils_system_mod occurs late. (#4136)
  • Fix finder template for lenient editable installs of implicit nested namespaces constructed by using package_dir to reorganise directory structure. (#4278)
  • Fix an error with UnicodeDecodeError handling in pkg_resources when trying to read files in UTF-8 with a fallback -- by :user:Avasam (#4348)

Improved Documentation

  • Uses RST substitution to put badges in 1 line. (#4312)

Deprecations and Removals

  • Further adoption of UTF-8 in setuptools. This change regards mostly files produced and consumed during the build process (e.g. metadata files, script wrappers, automatically updated config files, etc..) Although precautions were taken to minimize disruptions, some edge cases might be subject to backwards incompatibility.

    Support for "locale" encoding is now deprecated. (#4309)

  • Remove setuptools.convert_path after long deprecation period. This function was never defined by setuptools itself, but rather a side-effect of an import for internal usage. (#4322)

  • Remove fallback for customisations of distutils' build.sub_command after long deprecated period. Users are advised to import build directly from setuptools.command.build. (#4322)

  • Removed typing_extensions from vendored dependencies -- by :user:Avasam (#4324)

  • Remove deprecated setuptools.dep_util. The provided alternative is setuptools.modified. (#4360)

... (truncated)

Commits
  • 5cbf12a Workaround for release error in v70
  • 9c1bcc3 Bump version: 69.5.1 → 70.0.0
  • 4dc0c31 Remove deprecated setuptools.dep_util (#4360)
  • 6c1ef57 Remove xfail now that test passes. Ref #4371.
  • d14fa01 Add all site-packages dirs when creating simulated environment for test_edita...
  • 6b7f7a1 Prevent bin folders to be taken as extern packages when vendoring (#4370)
  • 69141f6 Add doctest for vendorised bin folder
  • 2a53cc1 Prevent 'bin' folders to be taken as extern packages
  • 7208628 Replace call to deprecated validate_pyproject command (#4363)
  • 96d681a Remove call to deprecated validate_pyproject command
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=setuptools&package-manager=pip&previous-version=65.6.3&new-version=70.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/bazelbuild/rules_python/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/pip_parse/requirements_lock.txt | 6 +++--- examples/pip_parse/requirements_windows.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/pip_parse/requirements_lock.txt b/examples/pip_parse/requirements_lock.txt index 91fa56d0e0..4e8af7f523 100644 --- a/examples/pip_parse/requirements_lock.txt +++ b/examples/pip_parse/requirements_lock.txt @@ -232,7 +232,7 @@ zipp==3.17.0 \ # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: -setuptools==65.6.3 \ - --hash=sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54 \ - --hash=sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75 +setuptools==70.0.0 \ + --hash=sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4 \ + --hash=sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0 # via yamllint diff --git a/examples/pip_parse/requirements_windows.txt b/examples/pip_parse/requirements_windows.txt index d249f9382f..4debc11dd1 100644 --- a/examples/pip_parse/requirements_windows.txt +++ b/examples/pip_parse/requirements_windows.txt @@ -236,7 +236,7 @@ zipp==3.17.0 \ # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: -setuptools==65.6.3 \ - --hash=sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54 \ - --hash=sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75 +setuptools==70.0.0 \ + --hash=sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4 \ + --hash=sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0 # via yamllint From 68f752e3fb141f520978ad86f3f0e155c3502a20 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Mon, 15 Jul 2024 18:36:17 -0700 Subject: [PATCH 123/345] fix: make mac zip builds work (#2052) Macs have an older version of `mktemp`, one that doesn't support the `--suffix` arg. This caused the combination of Macs and `--build_python_zip --bootstrap_impl=script` to fail. To fix, remove the `--suffix` arg. As far as I can tell, the suffix string, "Bazel.runfiles_", is just informational, so this is fine to remove. Also adds tests to verify that a binary runs with/without zip and for the script bootstrap. Fixes https://github.com/bazelbuild/rules_python/issues/2030 --- CHANGELOG.md | 5 +- python/private/stage1_bootstrap_template.sh | 11 +- tests/base_rules/BUILD.bazel | 40 +++++++ tests/base_rules/bin.py | 21 ++++ tests/base_rules/run_binary_zip_no_test.sh | 43 +++++++ tests/base_rules/run_binary_zip_yes_test.sh | 44 ++++++++ tests/base_rules/run_zip_test.sh | 38 +++++++ tests/support/sh_py_run_test.bzl | 117 ++++++++++++++++++++ 8 files changed, 316 insertions(+), 3 deletions(-) create mode 100644 tests/base_rules/bin.py create mode 100755 tests/base_rules/run_binary_zip_no_test.sh create mode 100755 tests/base_rules/run_binary_zip_yes_test.sh create mode 100755 tests/base_rules/run_zip_test.sh create mode 100644 tests/support/sh_py_run_test.bzl diff --git a/CHANGELOG.md b/CHANGELOG.md index cc44a47be0..d924f650ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,7 +31,10 @@ A brief description of the categories of changes: * (rules) Signals are properly received when using {obj}`--bootstrap_impl=script` (for non-zip builds). ([#2043](https://github.com/bazelbuild/rules_python/issues/2043)) -* (rules) Fixes python builds when the `--build_python_zip` is set to `false` on Windows. See [#1840](https://github.com/bazelbuild/rules_python/issues/1840). +* (rules) Fixes Python builds when the `--build_python_zip` is set to `false` on + Windows. See [#1840](https://github.com/bazelbuild/rules_python/issues/1840). +* (rules) Fixes Mac + `--build_python_zip` + {obj}`--bootstrap_impl=script` + ([#2030](https://github.com/bazelbuild/rules_python/issues/2030)). * (pip) Fixed pypi parse_simpleapi_html function for feeds with package metadata containing ">" sign diff --git a/python/private/stage1_bootstrap_template.sh b/python/private/stage1_bootstrap_template.sh index 48711aa92f..46e33b4837 100644 --- a/python/private/stage1_bootstrap_template.sh +++ b/python/private/stage1_bootstrap_template.sh @@ -16,7 +16,9 @@ PYTHON_BINARY='%python_binary%' IS_ZIPFILE="%is_zipfile%" if [[ "$IS_ZIPFILE" == "1" ]]; then - zip_dir=$(mktemp -d --suffix Bazel.runfiles_) + # NOTE: Macs have an old version of mktemp, so we must use only the + # minimal functionality of it. + zip_dir=$(mktemp -d) if [[ -n "$zip_dir" && -z "${RULES_PYTHON_BOOTSTRAP_VERBOSE:-}" ]]; then trap 'rm -fr "$zip_dir"' EXIT @@ -27,7 +29,7 @@ if [[ "$IS_ZIPFILE" == "1" ]]; then # The alternative requires having to copy ourselves elsewhere with the prelude # stripped (because zip can't extract from a stream). We avoid that because # it's wasteful. - ( unzip -q -d "$zip_dir" "$0" 2>/dev/null || /bin/true ) + ( unzip -q -d "$zip_dir" "$0" 2>/dev/null || true ) RUNFILES_DIR="$zip_dir/runfiles" if [[ ! -d "$RUNFILES_DIR" ]]; then @@ -105,6 +107,11 @@ declare -a interpreter_args # NOTE: Only works for 3.11+ interpreter_env+=("PYTHONSAFEPATH=1") +if [[ "$IS_ZIPFILE" == "1" ]]; then + interpreter_args+=("-XRULES_PYTHON_ZIP_DIR=$zip_dir") +fi + + export RUNFILES_DIR command=( diff --git a/tests/base_rules/BUILD.bazel b/tests/base_rules/BUILD.bazel index aa21042e25..62d73ac88f 100644 --- a/tests/base_rules/BUILD.bazel +++ b/tests/base_rules/BUILD.bazel @@ -11,3 +11,43 @@ # 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", "sh_py_run_test") + +_SUPPORTS_BOOTSTRAP_SCRIPT = select({ + "@platforms//os:windows": ["@platforms//:incompatible"], + "//conditions:default": [], +}) if IS_BAZEL_7_OR_HIGHER else ["@platforms//:incompatible"] + +sh_py_run_test( + name = "run_binary_zip_no_test", + build_python_zip = "no", + py_src = "bin.py", + sh_src = "run_binary_zip_no_test.sh", +) + +sh_py_run_test( + name = "run_binary_zip_yes_test", + build_python_zip = "yes", + py_src = "bin.py", + sh_src = "run_binary_zip_yes_test.sh", +) + +sh_py_run_test( + name = "run_binary_bootstrap_script_zip_yes_test", + bootstrap_impl = "script", + build_python_zip = "yes", + py_src = "bin.py", + sh_src = "run_binary_zip_yes_test.sh", + target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT, +) + +sh_py_run_test( + name = "run_binary_bootstrap_script_zip_no_test", + bootstrap_impl = "script", + build_python_zip = "no", + py_src = "bin.py", + sh_src = "run_binary_zip_no_test.sh", + target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT, +) diff --git a/tests/base_rules/bin.py b/tests/base_rules/bin.py new file mode 100644 index 0000000000..cffb79ba19 --- /dev/null +++ b/tests/base_rules/bin.py @@ -0,0 +1,21 @@ +# 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 sys + +print("Hello") +print( + "RULES_PYTHON_ZIP_DIR:{}".format(sys._xoptions.get("RULES_PYTHON_ZIP_DIR", "UNSET")) +) +print("file:", __file__) diff --git a/tests/base_rules/run_binary_zip_no_test.sh b/tests/base_rules/run_binary_zip_no_test.sh new file mode 100755 index 0000000000..2ee69f3f66 --- /dev/null +++ b/tests/base_rules/run_binary_zip_no_test.sh @@ -0,0 +1,43 @@ +# 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 2>&1) + +# How we detect if a zip file was executed from depends on which bootstrap +# is used. +# bootstrap_impl=script outputs RULES_PYTHON_ZIP_DIR= +# bootstrap_impl=system_python outputs file:.*Bazel.runfiles +expected_pattern="Hello" +if ! (echo "$actual" | grep "$expected_pattern" ) >/dev/null; then + echo "expected output to match: $expected_pattern" + echo "but got:\n$actual" + exit 1 +fi diff --git a/tests/base_rules/run_binary_zip_yes_test.sh b/tests/base_rules/run_binary_zip_yes_test.sh new file mode 100755 index 0000000000..ca278083dd --- /dev/null +++ b/tests/base_rules/run_binary_zip_yes_test.sh @@ -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. + +# --- 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) + +# How we detect if a zip file was executed from depends on which bootstrap +# is used. +# bootstrap_impl=script outputs RULES_PYTHON_ZIP_DIR: +# bootstrap_impl=system_python outputs file:.*Bazel.runfiles +expected_pattern="RULES_PYTHON_ZIP_DIR:/\|file:.*Bazel.runfiles" +if ! (echo "$actual" | grep "$expected_pattern" ) >/dev/null; then + echo "expected output to match: $expected_pattern" + echo "but got: $actual" + exit 1 +fi + diff --git a/tests/base_rules/run_zip_test.sh b/tests/base_rules/run_zip_test.sh new file mode 100755 index 0000000000..64857e6490 --- /dev/null +++ b/tests/base_rules/run_zip_test.sh @@ -0,0 +1,38 @@ +# 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. + +# --- 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 _main/tests/base_rules/_run_zip_test_bin) +if [[ -z "$bin" ]]; then + echo "Unable to locate test binary" + exit 1 +fi +actual=$($bin) + +if [[ ! "$actual" == RULES_PYTHON_ZIP_DIR=/* ]]; then + echo "expected output: RULES_PYTHON_ZIP_DIR=" + echo "but got: $actual" + exit 1 +fi diff --git a/tests/support/sh_py_run_test.bzl b/tests/support/sh_py_run_test.bzl new file mode 100644 index 0000000000..4b3d22d5bb --- /dev/null +++ b/tests/support/sh_py_run_test.bzl @@ -0,0 +1,117 @@ +# 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. +"""Run a py_binary with altered config settings in an sh_test. + +This facilitates verify running binaries with different configuration settings +without the overhead of a bazel-in-bazel integration test. +""" + +load("//python:py_binary.bzl", "py_binary") + +def _perform_transition_impl(input_settings, attr): + settings = dict(input_settings) + settings["//command_line_option:build_python_zip"] = attr.build_python_zip + if attr.bootstrap_impl: + settings["//python/config_settings:bootstrap_impl"] = attr.bootstrap_impl + return settings + +_perform_transition = transition( + implementation = _perform_transition_impl, + inputs = [ + "//python/config_settings:bootstrap_impl", + ], + outputs = [ + "//command_line_option:build_python_zip", + "//python/config_settings:bootstrap_impl", + ], +) + +def _transition_impl(ctx): + default_info = ctx.attr.target[DefaultInfo] + exe_ext = default_info.files_to_run.executable.extension + if exe_ext: + exe_ext = "." + exe_ext + exe_name = ctx.label.name + exe_ext + + executable = ctx.actions.declare_file(exe_name) + ctx.actions.symlink(output = executable, target_file = default_info.files_to_run.executable) + + default_outputs = [executable] + + # todo: could probably check target.owner vs src.owner to check if it should + # be symlinked or included as-is + # For simplicity of implementation, we're assuming the target being run is + # py_binary-like. In order for Windows to work, we need to make sure the + # file that the .exe launcher runs (the .zip or underlying non-exe + # executable) is a sibling of the .exe file with the same base name. + for src in default_info.files.to_list(): + if src.extension in ("", "zip"): + ext = ("." if src.extension else "") + src.extension + output = ctx.actions.declare_file(ctx.label.name + ext) + ctx.actions.symlink(output = output, target_file = src) + default_outputs.append(output) + + return [ + DefaultInfo( + executable = executable, + files = depset(default_outputs), + runfiles = default_info.default_runfiles, + ), + testing.TestEnvironment( + environment = ctx.attr.env, + ), + ] + +transition_binary = rule( + implementation = _transition_impl, + attrs = { + "bootstrap_impl": attr.string(), + "build_python_zip": attr.string(default = "auto"), + "env": attr.string_dict(), + "target": attr.label(executable = True, cfg = "target"), + "_allowlist_function_transition": attr.label( + default = "@bazel_tools//tools/allowlists/function_transition_allowlist", + ), + }, + cfg = _perform_transition, + executable = True, +) + +def sh_py_run_test(*, name, sh_src, py_src, **kwargs): + bin_name = "_{}_bin".format(name) + native.sh_test( + name = name, + srcs = [sh_src], + data = [bin_name], + deps = [ + "@bazel_tools//tools/bash/runfiles", + ], + env = { + "BIN_RLOCATION": "$(rlocationpath {})".format(bin_name), + }, + ) + + transition_binary( + name = bin_name, + tags = ["manual"], + target = "_{}_plain_bin".format(name), + **kwargs + ) + + py_binary( + name = "_{}_plain_bin".format(name), + srcs = [py_src], + main = py_src, + tags = ["manual"], + ) From 68c30483f80a55870eb113e17ab21ff65d5b97ed Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 16 Jul 2024 16:22:22 -0700 Subject: [PATCH 124/345] internal: repos to create a toolchain from a locally installed Python (#2000) This adds the primitives for defining a toolchain based on a locally installed Python. Doing this consists of two parts: * A repo rule to define a Python runtime pointing to a local Python installation. * A repo rule to define toolchains for those runtimes. The runtime repos create platform runtimes, i.e, it sets py_runtime.interpreter_path. This means the runtime isn't included in the runfiles. Note that these repo rules are largely implementation details, and are definitely not stable API-wise. Creating public APIs to use them through WORKSPACE or bzlmod will be done in a separate change (there's a few design and behavior questions to discuss). This is definitely experimental quality. In particular, the code that tries to figure out the C headers/libraries is very finicky. I couldn't find solid docs about how to do this, and there's a lot of undocumented settings, so what's there is what I was able to piece together from my laptop's behavior. Misc other changes: * Also fixes a bug if a pyenv-backed interpreter path is used for precompiling: pyenv uses `$0` to determine what to re-exec. The `:current_interpreter_executable` target used its own name, which pyenv didn't understand. * The repo logger now also accepts a string. This should help prevent accidentally passing a string causing an error. It's also just a bit more convenient when doing development. * Repo loggers will automatically include their rule name and repo name. This makes following logging output easier. * Makes `repo_utils.execute()` report progress. * Adds `repo_utils.getenv`, `repo_utils.watch`, and `repo_utils.watch_tree`: backwards compatibility functions for their `rctx` equivalents. * Adds `repo_utils.which_unchecked`: calls `which`, but allows for failure. * Adds `repo_utils.get_platforms_os_name()`: Returns the name used in `@platforms` for the OS reported by `rctx`. * Makes several repo util functions call `watch()` or `getenv()`, if available. This makes repository rules better respect environmental changes. * Adds more detail to the definition of an in-build vs platform runtime * Adds a README for the integration tests directory. Setting up and using one is a bit more involved than other tests, so some docs help. * Allows integration tests to specify bazel versions to use. --- .bazelrc | 4 +- docs/sphinx/glossary.md | 25 ++ python/private/full_version.bzl | 2 +- python/private/get_local_runtime_info.py | 49 ++++ python/private/local_runtime_repo.bzl | 252 ++++++++++++++++++ python/private/local_runtime_repo_setup.bzl | 141 ++++++++++ .../private/local_runtime_toolchains_repo.bzl | 93 +++++++ python/private/py_exec_tools_toolchain.bzl | 9 +- python/private/py_toolchain_suite.bzl | 76 +++++- python/private/repo_utils.bzl | 151 +++++++++-- python/private/text_util.bzl | 33 ++- tests/integration/BUILD.bazel | 10 + tests/integration/README.md | 21 ++ tests/integration/integration_test.bzl | 5 +- tests/integration/local_toolchains/.bazelrc | 5 + .../integration/local_toolchains/BUILD.bazel | 20 ++ .../integration/local_toolchains/MODULE.bazel | 40 +++ tests/integration/local_toolchains/REPO.bazel | 0 tests/integration/local_toolchains/WORKSPACE | 0 .../local_toolchains/WORKSPACE.bzlmod | 0 tests/integration/local_toolchains/test.py | 26 ++ 21 files changed, 924 insertions(+), 38 deletions(-) create mode 100644 python/private/get_local_runtime_info.py create mode 100644 python/private/local_runtime_repo.bzl create mode 100644 python/private/local_runtime_repo_setup.bzl create mode 100644 python/private/local_runtime_toolchains_repo.bzl create mode 100644 tests/integration/README.md create mode 100644 tests/integration/local_toolchains/.bazelrc create mode 100644 tests/integration/local_toolchains/BUILD.bazel create mode 100644 tests/integration/local_toolchains/MODULE.bazel create mode 100644 tests/integration/local_toolchains/REPO.bazel create mode 100644 tests/integration/local_toolchains/WORKSPACE create mode 100644 tests/integration/local_toolchains/WORKSPACE.bzlmod create mode 100644 tests/integration/local_toolchains/test.py diff --git a/.bazelrc b/.bazelrc index bf13baf132..0833d8d979 100644 --- a/.bazelrc +++ b/.bazelrc @@ -4,8 +4,8 @@ # (Note, we cannot use `common --deleted_packages` because the bazel version command doesn't support it) # To update these lines, execute # `bazel run @rules_bazel_integration_test//tools:update_deleted_packages` -build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered -query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered test --test_output=errors diff --git a/docs/sphinx/glossary.md b/docs/sphinx/glossary.md index f54034db2d..9afbcffb92 100644 --- a/docs/sphinx/glossary.md +++ b/docs/sphinx/glossary.md @@ -7,6 +7,30 @@ common attributes [Common attributes](https://bazel.build/reference/be/common-definitions#common-attributes) for a complete listing +in-build runtime +: An in-build runtime is one where the Python runtime, and all its files, are +known to the build system and a Python binary includes all the necessary parts +of the runtime in its runfiles. Such runtimes may be remotely downloaded, part +of your source control, or mapped in from local files by repositories. + +The main advantage of in-build runtimes is they ensure you know what Python +runtime will be used, since it's part of the build itself and included in +the resulting binary. The main disadvantage is the additional work it adds to +building. The whole Python runtime is included in a Python binary's runfiles, +which can be a significant number of files. + +platform runtime +: A platform runtime is a Python runtime that is assumed to be installed on the +system where a Python binary runs, whereever that may be. For example, using `/usr/bin/python3` +as the interpreter is a platform runtime -- it assumes that, wherever the binary +runs (your local machine, a remote worker, within a container, etc), that path +is available. Such runtimes are _not_ part of a binary's runfiles. + +The main advantage of platform runtimes is they are lightweight insofar as +building the binary is concerned. All Bazel has to do is pass along a string +path to the interpreter. The disadvantage is, if you don't control the systems +being run on, you may get different Python installations than expected. + rule callable : A function that behaves like a rule. This includes, but is not is not limited to: @@ -26,3 +50,4 @@ simple label nonconfigurable : A nonconfigurable value cannot use `select`. See Bazel's [configurable attributes](https://bazel.build/reference/be/common-definitions#configurable-attributes) documentation. + diff --git a/python/private/full_version.bzl b/python/private/full_version.bzl index 68c969416e..98eeee59a1 100644 --- a/python/private/full_version.bzl +++ b/python/private/full_version.bzl @@ -40,4 +40,4 @@ def full_version(version): ), ) else: - fail("Unknown version format: {}".format(version)) + fail("Unknown version format: '{}'".format(version)) diff --git a/python/private/get_local_runtime_info.py b/python/private/get_local_runtime_info.py new file mode 100644 index 0000000000..0207f56bef --- /dev/null +++ b/python/private/get_local_runtime_info.py @@ -0,0 +1,49 @@ +# 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 json +import sys +import sysconfig + +data = { + "major": sys.version_info.major, + "minor": sys.version_info.minor, + "micro": sys.version_info.micro, + "include": sysconfig.get_path("include"), + "implementation_name": sys.implementation.name, +} + +config_vars = [ + # The libpythonX.Y.so file. Usually? + # It might be a static archive (.a) file instead. + "LDLIBRARY", + # The directory with library files. Supposedly. + # It's not entirely clear how to get the directory with libraries. + # There's several types of libraries with different names and a plethora + # of settings. + # https://stackoverflow.com/questions/47423246/get-pythons-lib-path + # For now, it seems LIBDIR has what is needed, so just use that. + "LIBDIR", + # The versioned libpythonX.Y.so.N file. Usually? + # It might be a static archive (.a) file instead. + "INSTSONAME", + # The libpythonX.so file. Usually? + # It might be a static archive (a.) file instead. + "PY3LIBRARY", + # The platform-specific filename suffix for library files. + # Includes the dot, e.g. `.so` + "SHLIB_SUFFIX", +] +data.update(zip(config_vars, sysconfig.get_config_vars(*config_vars))) +print(json.dumps(data)) diff --git a/python/private/local_runtime_repo.bzl b/python/private/local_runtime_repo.bzl new file mode 100644 index 0000000000..f6bca6cc2c --- /dev/null +++ b/python/private/local_runtime_repo.bzl @@ -0,0 +1,252 @@ +# 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 a repository for a locally installed Python runtime.""" + +load("//python/private:enum.bzl", "enum") +load(":repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") + +# buildifier: disable=name-conventions +_OnFailure = enum( + SKIP = "skip", + WARN = "warn", + FAIL = "fail", +) + +_TOOLCHAIN_IMPL_TEMPLATE = """\ +# Generated by python/private/local_runtime_repo.bzl + +load("@rules_python//python/private:local_runtime_repo_setup.bzl", "define_local_runtime_toolchain_impl") + +define_local_runtime_toolchain_impl( + name = "local_runtime", + lib_ext = "{lib_ext}", + major = "{major}", + minor = "{minor}", + micro = "{micro}", + interpreter_path = "{interpreter_path}", + implementation_name = "{implementation_name}", + os = "{os}", +) +""" + +def _local_runtime_repo_impl(rctx): + logger = repo_utils.logger(rctx) + on_failure = rctx.attr.on_failure + + platforms_os_name = repo_utils.get_platforms_os_name(rctx) + if not platforms_os_name: + if on_failure == "fail": + fail("Unrecognized host platform '{}': cannot determine OS constraint".format( + rctx.os.name, + )) + + if on_failure == "warn": + logger.warn(lambda: "Unrecognized host platform '{}': cannot determine OS constraint".format( + rctx.os.name, + )) + + # else, on_failure must be skip + rctx.file("BUILD.bazel", _expand_incompatible_template()) + return + + result = _resolve_interpreter_path(rctx) + if not result.resolved_path: + if on_failure == "fail": + fail("interpreter not found: {}".format(result.describe_failure())) + + if on_failure == "warn": + logger.warn(lambda: "interpreter not found: {}".format(result.describe_failure())) + + # else, on_failure must be skip + rctx.file("BUILD.bazel", _expand_incompatible_template()) + return + else: + interpreter_path = result.resolved_path + + logger.info(lambda: "resolved interpreter {} to {}".format(rctx.attr.interpreter_path, interpreter_path)) + + exec_result = repo_utils.execute_unchecked( + rctx, + op = "local_runtime_repo.GetPythonInfo({})".format(rctx.name), + arguments = [ + interpreter_path, + rctx.path(rctx.attr._get_local_runtime_info), + ], + quiet = True, + ) + if exec_result.return_code != 0: + if on_failure == "fail": + fail("GetPythonInfo failed: {}".format(exec_result.describe_failure())) + if on_failure == "warn": + logger.warn(lambda: "GetPythonInfo failed: {}".format(exec_result.describe_failure())) + + # else, on_failure must be skip + rctx.file("BUILD.bazel", _expand_incompatible_template()) + return + + info = json.decode(exec_result.stdout) + logger.info(lambda: _format_get_info_result(info)) + + # NOTE: Keep in sync with recursive glob in define_local_runtime_toolchain_impl + repo_utils.watch_tree(rctx, rctx.path(info["include"])) + + # The cc_library.includes values have to be non-absolute paths, otherwise + # the toolchain will give an error. Work around this error by making them + # appear as part of this repo. + rctx.symlink(info["include"], "include") + + shared_lib_names = [ + info["PY3LIBRARY"], + info["LDLIBRARY"], + info["INSTSONAME"], + ] + + # In some cases, the value may be empty. Not clear why. + shared_lib_names = [v for v in shared_lib_names if v] + + # In some cases, the same value is returned for multiple keys. Not clear why. + shared_lib_names = {v: None for v in shared_lib_names}.keys() + shared_lib_dir = info["LIBDIR"] + + # The specific files are symlinked instead of the whole directory + # because it can point to a directory that has more than just + # the Python runtime shared libraries, e.g. /usr/lib, or a Python + # specific directory with pip-installed shared libraries. + rctx.report_progress("Symlinking external Python shared libraries") + for name in shared_lib_names: + origin = rctx.path("{}/{}".format(shared_lib_dir, name)) + + # The reported names don't always exist; it depends on the particulars + # of the runtime installation. + if origin.exists: + repo_utils.watch(rctx, origin) + rctx.symlink(origin, "lib/" + name) + + rctx.file("WORKSPACE", "") + rctx.file("MODULE.bazel", "") + rctx.file("REPO.bazel", "") + rctx.file("BUILD.bazel", _TOOLCHAIN_IMPL_TEMPLATE.format( + major = info["major"], + minor = info["minor"], + micro = info["micro"], + interpreter_path = interpreter_path, + lib_ext = info["SHLIB_SUFFIX"], + implementation_name = info["implementation_name"], + os = "@platforms//os:{}".format(repo_utils.get_platforms_os_name(rctx)), + )) + +local_runtime_repo = repository_rule( + implementation = _local_runtime_repo_impl, + doc = """ +Use a locally installed Python runtime as a toolchain implementation. + +Note this uses the runtime as a *platform runtime*. A platform runtime means +means targets don't include the runtime itself as part of their runfiles or +inputs. Instead, users must assure that where the targets run have the runtime +pre-installed or otherwise available. + +This results in lighter weight binaries (in particular, Bazel doesn't have to +create thousands of files for every `py_test`), at the risk of having to rely on +a system having the necessary Python installed. +""", + attrs = { + "interpreter_path": attr.string( + doc = """ +An absolute path or program name on the `PATH` env var. + +Values with slashes are assumed to be the path to a program. Otherwise, it is +treated as something to search for on `PATH` + +Note that, when a plain program name is used, the path to the interpreter is +resolved at repository evalution time, not runtime of any resulting binaries. +""", + default = "python3", + ), + "on_failure": attr.string( + default = _OnFailure.SKIP, + values = sorted(_OnFailure.__members__.values()), + doc = """ +How to handle errors when trying to automatically determine settings. + +* `skip` will silently skip creating a runtime. Instead, a non-functional + runtime will be generated and marked as incompatible so it cannot be used. + This is best if a local runtime is known not to work or be available + in certain cases and that's OK. e.g., one use windows paths when there + are people running on linux. +* `warn` will print a warning message. This is useful when you expect + a runtime to be available, but are OK with it missing and falling back + to some other runtime. +* `fail` will result in a failure. This is only recommended if you must + ensure the runtime is available. +""", + ), + "_get_local_runtime_info": attr.label( + allow_single_file = True, + default = "//python/private:get_local_runtime_info.py", + ), + "_rule_name": attr.string(default = "local_runtime_repo"), + }, + environ = ["PATH", REPO_DEBUG_ENV_VAR], +) + +def _expand_incompatible_template(): + return _TOOLCHAIN_IMPL_TEMPLATE.format( + interpreter_path = "/incompatible", + implementation_name = "incompatible", + lib_ext = "incompatible", + major = "0", + minor = "0", + micro = "0", + os = "@platforms//:incompatible", + ) + +def _resolve_interpreter_path(rctx): + """Find the absolute path for an interpreter. + + Args: + rctx: A repository_ctx object + + Returns: + `struct` with the following fields: + * `resolved_path`: `path` object of a path that exists + * `describe_failure`: `Callable | None`. If a path that doesn't exist, + returns a description of why it couldn't be resolved + A path object or None. The path may not exist. + """ + if "/" not in rctx.attr.interpreter_path and "\\" not in rctx.attr.interpreter_path: + # Provide a bit nicer integration with pyenv: recalculate the runtime if the + # user changes the python version using e.g. `pyenv shell` + repo_utils.getenv(rctx, "PYENV_VERSION") + result = repo_utils.which_unchecked(rctx, rctx.attr.interpreter_path) + resolved_path = result.binary + describe_failure = result.describe_failure + else: + repo_utils.watch(rctx, rctx.attr.interpreter_path) + resolved_path = rctx.path(rctx.attr.interpreter_path) + if not resolved_path.exists: + describe_failure = lambda: "Path not found: {}".format(repr(rctx.attr.interpreter_path)) + else: + describe_failure = None + + return struct( + resolved_path = resolved_path, + describe_failure = describe_failure, + ) + +def _format_get_info_result(info): + lines = ["GetPythonInfo result:"] + for key, value in sorted(info.items()): + lines.append(" {}: {}".format(key, value if value != "" else "")) + return "\n".join(lines) diff --git a/python/private/local_runtime_repo_setup.bzl b/python/private/local_runtime_repo_setup.bzl new file mode 100644 index 0000000000..23fa99dfa9 --- /dev/null +++ b/python/private/local_runtime_repo_setup.bzl @@ -0,0 +1,141 @@ +# 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. + +"""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_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") +load("@rules_python//python/private:py_exec_tools_toolchain.bzl", "py_exec_tools_toolchain") + +_PYTHON_VERSION_FLAG = Label("@rules_python//python/config_settings:python_version") + +def define_local_runtime_toolchain_impl( + name, + lib_ext, + major, + minor, + micro, + interpreter_path, + implementation_name, + os): + """Defines a toolchain implementation for a local Python runtime. + + Generates public targets: + * `python_runtimes`: The target toolchain type implementation + * `py_exec_tools_toolchain`: The exec tools toolchain type implementation + * `py_cc_toolchain`: The py cc toolchain type implementation + * `os`: A constraint (or alias to one) for the `target_compatible_with` this + toolchain is compatible with. + * `is_matching_python_version`: A `config_setting` for `target_settings` + this toolchain is compatible with. + + Args: + name: `str` Only present to satisfy tooling + lib_ext: `str` The file extension for the `libpython` shared libraries + major: `str` The major Python version, e.g. `3` of `3.9.1`. + minor: `str` The minor Python version, e.g. `9` of `3.9.1`. + micro: `str` The micro Python version, e.g. "1" of `3.9.1`. + interpreter_path: `str` Absolute path to the interpreter. + implementation_name: `str` The implementation name, as returned by + `sys.implementation.name`. + os: `str` A label to the OS constraint (e.g. `@platforms//os:linux`) for + this runtime. + """ + major_minor = "{}.{}".format(major, minor) + major_minor_micro = "{}.{}".format(major_minor, micro) + + cc_library( + name = "_python_headers", + # NOTE: Keep in sync with watch_tree() called in local_runtime_repo + srcs = native.glob(["include/**/*.h"]), + includes = ["include"], + ) + + cc_library( + 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 + ]), + hdrs = [":_python_headers"], + ) + + py_runtime( + name = "_py3_runtime", + interpreter_path = interpreter_path, + python_version = "PY3", + interpreter_version_info = { + "major": major, + "micro": micro, + "minor": minor, + }, + implementation_name = implementation_name, + ) + + py_runtime_pair( + name = "python_runtimes", + py2_runtime = None, + py3_runtime = ":_py3_runtime", + visibility = ["//visibility:public"], + ) + + py_exec_tools_toolchain( + name = "py_exec_tools_toolchain", + visibility = ["//visibility:public"], + precompiler = "@rules_python//tools/precompiler:precompiler", + ) + + py_cc_toolchain( + name = "py_cc_toolchain", + headers = ":_python_headers", + libs = ":_libpython", + python_version = major_minor_micro, + visibility = ["//visibility:public"], + ) + + native.alias( + name = "os", + # Call Label() to force the string to evaluate in the context of + # rules_python, not the calling BUILD-file code. This is because + # the value is an `@platforms//foo` string, which @rules_python has + # visibility to, but the calling repo may not. + actual = Label(os), + visibility = ["//visibility:public"], + ) + + native.config_setting( + name = "_is_major_minor", + flag_values = { + _PYTHON_VERSION_FLAG: major_minor, + }, + ) + native.config_setting( + name = "_is_major_minor_micro", + flag_values = { + _PYTHON_VERSION_FLAG: major_minor_micro, + }, + ) + selects.config_setting_group( + name = "is_matching_python_version", + match_any = [ + ":_is_major_minor", + ":_is_major_minor_micro", + ], + visibility = ["//visibility:public"], + ) diff --git a/python/private/local_runtime_toolchains_repo.bzl b/python/private/local_runtime_toolchains_repo.bzl new file mode 100644 index 0000000000..880fbfe224 --- /dev/null +++ b/python/private/local_runtime_toolchains_repo.bzl @@ -0,0 +1,93 @@ +# 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 a repository to hold a local Python toolchain definitions.""" + +load("//python/private:text_util.bzl", "render") +load(":repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") + +_TOOLCHAIN_TEMPLATE = """ +# Generated by local_runtime_toolchains_repo.bzl + +load("@rules_python//python/private:py_toolchain_suite.bzl", "define_local_toolchain_suites") + +define_local_toolchain_suites( + name = "toolchains", + version_aware_repo_names = {version_aware_names}, + version_unaware_repo_names = {version_unaware_names}, +) +""" + +def _local_runtime_toolchains_repo(rctx): + logger = repo_utils.logger(rctx) + rctx.file("WORKSPACE", "") + rctx.file("MODULE.bazel", "") + rctx.file("REPO.bazel", "") + + logger.info(lambda: _format_toolchains_for_logging(rctx)) + + rctx.file("BUILD.bazel", _TOOLCHAIN_TEMPLATE.format( + version_aware_names = render.list(rctx.attr.runtimes), + version_unaware_names = render.list(rctx.attr.default_runtimes or rctx.attr.runtimes), + )) + +local_runtime_toolchains_repo = repository_rule( + implementation = _local_runtime_toolchains_repo, + doc = """ +Create a repo of toolchains definitions for local runtimes. + +This is intended to be used on the toolchain implemenations generated by +`local_runtime_repo`. + +NOTE: This does not call `native.register_toolchains` -- the caller is +responsible for registering the toolchains this defines. +""", + attrs = { + "default_runtimes": attr.string_list( + doc = """ +The repo names of `local_runtime_repo` repos to define as toolchains. + +These will be defined as *version-unaware* toolchains. This means they will +match any Python version. As such, they are registered after the version-aware +toolchains defined by the `runtimes` attribute. + +Note that order matters: it determines the toolchain priority within the +package. +""", + ), + "runtimes": attr.string_list( + doc = """ +The repo names of `local_runtime_repo` repos to define as toolchains. + +These will be defined as *version-aware* toolchains. This means they require the +`--//python/config_settings:python_version` to be set in order to match. These +are registered before `default_runtimes`. + +Note that order matters: it determines the toolchain priority within the +package. +""", + ), + "_rule_name": attr.string(default = "local_toolchains_repo"), + }, + environ = [REPO_DEBUG_ENV_VAR], +) + +def _format_toolchains_for_logging(rctx): + lines = ["Local toolchain priority order:"] + i = 0 + for i, name in enumerate(rctx.attr.runtimes, start = i): + lines.append(" {}: {} (version aware)".format(i, name)) + for i, name in enumerate(rctx.attr.default_runtimes, start = i): + lines.append(" {}: {} (version unaware)".format(i, name)) + return "\n".join(lines) diff --git a/python/private/py_exec_tools_toolchain.bzl b/python/private/py_exec_tools_toolchain.bzl index b3d0fb2634..a4516d86eb 100644 --- a/python/private/py_exec_tools_toolchain.bzl +++ b/python/private/py_exec_tools_toolchain.bzl @@ -14,6 +14,7 @@ """Rule that defines a toolchain for build tools.""" +load("@bazel_skylib//lib:paths.bzl", "paths") load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("//python/private:toolchain_types.bzl", "TARGET_TOOLCHAIN_TYPE") load(":py_exec_tools_info.bzl", "PyExecToolsInfo") @@ -53,11 +54,15 @@ py_exec_tools_toolchain = rule( def _current_interpreter_executable_impl(ctx): toolchain = ctx.toolchains[TARGET_TOOLCHAIN_TYPE] runtime = toolchain.py3_runtime + + # NOTE: We name the output filename after the underlying file name + # because of things like pyenv: they use $0 to determine what to + # re-exec. If it's not a recognized name, then they fail. if runtime.interpreter: - executable = ctx.actions.declare_file(ctx.label.name) + executable = ctx.actions.declare_file(runtime.interpreter.basename) ctx.actions.symlink(output = executable, target_file = runtime.interpreter, is_executable = True) else: - executable = ctx.actions.declare_symlink(ctx.label.name) + executable = ctx.actions.declare_symlink(paths.basename(runtime.interpreter_path)) ctx.actions.symlink(output = executable, target_path = runtime.interpreter_path) return [ toolchain, diff --git a/python/private/py_toolchain_suite.bzl b/python/private/py_toolchain_suite.bzl index 564e0ee45d..3fead95069 100644 --- a/python/private/py_toolchain_suite.bzl +++ b/python/private/py_toolchain_suite.bzl @@ -15,6 +15,7 @@ """Create the toolchain defs in a BUILD.bazel file.""" load("@bazel_skylib//lib:selects.bzl", "selects") +load("//python/private:text_util.bzl", "render") load( ":toolchain_types.bzl", "EXEC_TOOLS_TOOLCHAIN_TYPE", @@ -24,7 +25,15 @@ load( _IS_EXEC_TOOLCHAIN_ENABLED = Label("//python/config_settings:is_exec_tools_toolchain_enabled") -def py_toolchain_suite(*, prefix, user_repository_name, python_version, set_python_version_constraint, flag_values, **kwargs): +# buildifier: disable=unnamed-macro +def py_toolchain_suite( + *, + prefix, + user_repository_name, + python_version, + set_python_version_constraint, + flag_values, + target_compatible_with = []): """For internal use only. Args: @@ -33,8 +42,7 @@ def py_toolchain_suite(*, prefix, user_repository_name, python_version, set_pyth python_version: The full (X.Y.Z) version of the interpreter. set_python_version_constraint: True or False as a string. flag_values: Extra flag values to match for this toolchain. - **kwargs: extra args passed to the `toolchain` calls. - + target_compatible_with: list constraints the toolchains are compatible with. """ # We have to use a String value here because bzlmod is passing in a @@ -82,30 +90,38 @@ def py_toolchain_suite(*, prefix, user_repository_name, python_version, set_pyth repr(set_python_version_constraint), )) + _internal_toolchain_suite( + prefix = prefix, + runtime_repo_name = user_repository_name, + target_settings = target_settings, + target_compatible_with = target_compatible_with, + ) + +def _internal_toolchain_suite(prefix, runtime_repo_name, target_compatible_with, target_settings): native.toolchain( name = "{prefix}_toolchain".format(prefix = prefix), - toolchain = "@{user_repository_name}//:python_runtimes".format( - user_repository_name = user_repository_name, + toolchain = "@{runtime_repo_name}//:python_runtimes".format( + runtime_repo_name = runtime_repo_name, ), toolchain_type = TARGET_TOOLCHAIN_TYPE, target_settings = target_settings, - **kwargs + target_compatible_with = target_compatible_with, ) native.toolchain( name = "{prefix}_py_cc_toolchain".format(prefix = prefix), - toolchain = "@{user_repository_name}//:py_cc_toolchain".format( - user_repository_name = user_repository_name, + toolchain = "@{runtime_repo_name}//:py_cc_toolchain".format( + runtime_repo_name = runtime_repo_name, ), toolchain_type = PY_CC_TOOLCHAIN_TYPE, target_settings = target_settings, - **kwargs + target_compatible_with = target_compatible_with, ) native.toolchain( name = "{prefix}_py_exec_tools_toolchain".format(prefix = prefix), - toolchain = "@{user_repository_name}//:py_exec_tools_toolchain".format( - user_repository_name = user_repository_name, + toolchain = "@{runtime_repo_name}//:py_exec_tools_toolchain".format( + runtime_repo_name = runtime_repo_name, ), toolchain_type = EXEC_TOOLS_TOOLCHAIN_TYPE, target_settings = select({ @@ -118,10 +134,46 @@ def py_toolchain_suite(*, prefix, user_repository_name, python_version, set_pyth # the RHS must be a `config_setting`. "//conditions:default": [_IS_EXEC_TOOLCHAIN_ENABLED], }), - exec_compatible_with = kwargs.get("target_compatible_with"), + exec_compatible_with = target_compatible_with, ) # NOTE: When adding a new toolchain, for WORKSPACE builds to see the # toolchain, the name must be added to the native.register_toolchains() # call in python/repositories.bzl. Bzlmod doesn't need anything; it will # register `:all`. + +def define_local_toolchain_suites(name, version_aware_repo_names, version_unaware_repo_names): + """Define toolchains for `local_runtime_repo` backed toolchains. + + This generates `toolchain` targets that can be registered using `:all`. The + specific names of the toolchain targets are not defined. The priority order + of the toolchains is the order that is passed in, with version-aware having + higher priority than version-unaware. + + Args: + name: `str` Unused; only present to satisfy tooling. + version_aware_repo_names: `list[str]` of the repo names that will have + version-aware toolchains defined. + version_unaware_repo_names: `list[str]` of the repo names that will have + version-unaware toolchains defined. + """ + i = 0 + for i, repo in enumerate(version_aware_repo_names, start = i): + prefix = render.left_pad_zero(i, 4) + _internal_toolchain_suite( + prefix = prefix, + runtime_repo_name = repo, + target_compatible_with = ["@{}//:os".format(repo)], + target_settings = ["@{}//:is_matching_python_version".format(repo)], + ) + + # The version unaware entries must go last because they will match any Python + # version. + for i, repo in enumerate(version_unaware_repo_names, start = i + 1): + prefix = render.left_pad_zero(i, 4) + _internal_toolchain_suite( + prefix = prefix, + runtime_repo_name = repo, + target_settings = [], + target_compatible_with = ["@{}//:os".format(repo)], + ) diff --git a/python/private/repo_utils.bzl b/python/private/repo_utils.bzl index 54ad45c2f1..9d76e19833 100644 --- a/python/private/repo_utils.bzl +++ b/python/private/repo_utils.bzl @@ -29,7 +29,7 @@ def _is_repo_debug_enabled(rctx): Returns: True if enabled, False if not. """ - return rctx.os.environ.get(REPO_DEBUG_ENV_VAR) == "1" + return _getenv(rctx, REPO_DEBUG_ENV_VAR) == "1" def _debug_print(rctx, message_cb): """Prints a message if repo debugging is enabled. @@ -46,7 +46,8 @@ def _logger(rctx): """Creates a logger instance for printing messages. Args: - rctx: repository_ctx object. + rctx: repository_ctx object. If the attribute `_rule_name` is + present, it will be included in log messages. Returns: A struct with attributes logging: trace, debug, info, warn, fail. @@ -65,11 +66,20 @@ def _logger(rctx): "TRACE": 3, }.get(verbosity_level, 0) - def _log(enabled_on_verbosity, level, message_cb): + def _log(enabled_on_verbosity, level, message_cb_or_str): if verbosity < enabled_on_verbosity: return + rule_name = getattr(rctx.attr, "_rule_name", "?") + if type(message_cb_or_str) == "string": + message = message_cb_or_str + else: + message = message_cb_or_str() - print("\nrules_python: {}: ".format(level.upper()), message_cb()) # buildifier: disable=print + print("\nrules_python:{}(@@{}) {}:".format( + rule_name, + rctx.name, + level.upper(), + ), message) # buildifier: disable=print return struct( trace = lambda message_cb: _log(3, "TRACE", message_cb), @@ -117,6 +127,7 @@ def _execute_internal( env_str = _env_to_str(environment), )) + rctx.report_progress("Running {}".format(op)) result = rctx.execute(arguments, environment = environment, **kwargs) if fail_on_error and result.return_code != 0: @@ -150,7 +161,18 @@ def _execute_internal( output = _outputs_to_str(result), )) - return result + result_kwargs = {k: getattr(result, k) for k in dir(result)} + return struct( + describe_failure = lambda: _execute_describe_failure( + op = op, + arguments = arguments, + result = result, + rctx = rctx, + kwargs = kwargs, + environment = environment, + ), + **result_kwargs + ) def _execute_unchecked(*args, **kwargs): """Execute a subprocess. @@ -185,6 +207,25 @@ def _execute_checked_stdout(*args, **kwargs): """Calls execute_checked, but only returns the stdout value.""" return _execute_checked(*args, **kwargs).stdout +def _execute_describe_failure(*, op, arguments, result, rctx, kwargs, environment): + return ( + "repo.execute: {op}: failure:\n" + + " command: {cmd}\n" + + " return code: {return_code}\n" + + " working dir: {cwd}\n" + + " timeout: {timeout}\n" + + " environment:{env_str}\n" + + "{output}" + ).format( + op = op, + cmd = _args_to_str(arguments), + return_code = result.return_code, + cwd = _cwd_to_str(rctx, kwargs), + timeout = _timeout_to_str(kwargs), + env_str = _env_to_str(environment), + output = _outputs_to_str(result), + ) + def _which_checked(rctx, binary_name): """Tests to see if a binary exists, and otherwise fails with a message. @@ -195,16 +236,54 @@ def _which_checked(rctx, binary_name): Returns: rctx.Path for the binary. """ + result = _which_unchecked(rctx, binary_name) + if result.binary == None: + fail(result.describe_failure()) + return result.binary + +def _which_unchecked(rctx, binary_name): + """Tests to see if a binary exists. + + This is also watch the `PATH` environment variable. + + Args: + binary_name: name of the binary to find. + rctx: repository context. + + Returns: + `struct` with attributes: + * `binary`: `repository_ctx.Path` + * `describe_failure`: `Callable | None`; takes no args. If the + binary couldn't be found, provides a detailed error description. + """ + path = _getenv(rctx, "PATH", "") binary = rctx.which(binary_name) - if binary == None: - fail(( - "Unable to find the binary '{binary_name}' on PATH.\n" + - " PATH = {path}" - ).format( - binary_name = binary_name, - path = rctx.os.environ.get("PATH"), - )) - return binary + if binary: + _watch(rctx, binary) + describe_failure = None + else: + describe_failure = lambda: _which_describe_failure(binary_name, path) + + return struct( + binary = binary, + describe_failure = describe_failure, + ) + +def _which_describe_failure(binary_name, path): + return ( + "Unable to find the binary '{binary_name}' on PATH.\n" + + " PATH = {path}" + ).format( + binary_name = binary_name, + path = path, + ) + +def _getenv(rctx, name, default = None): + # Bazel 7+ API + if hasattr(rctx, "getenv"): + return rctx.getenv(name, default) + else: + return rctx.os.environ.get("PATH", default) def _args_to_str(arguments): return " ".join([_arg_repr(a) for a in arguments]) @@ -262,12 +341,50 @@ def _outputs_to_str(result): lines.append("<{} empty>".format(name)) return "\n".join(lines) +def _get_platforms_os_name(rctx): + """Return the name in @platforms//os for the host os. + + Args: + rctx: repository_ctx + + Returns: + `str | None`. The target name if it maps to known platforms + value, otherwise None. + """ + os = rctx.os.name.lower() + if "linux" in os: + return os + if "windows" in os: + return "windows" + if "mac" in os: + return "osx" + + return None + +# TODO: Remove after Bazel 6 support dropped +def _watch(rctx, *args, **kwargs): + """Calls rctx.watch, if available.""" + if hasattr(rctx, "watch"): + rctx.watch(*args, **kwargs) + +# TODO: Remove after Bazel 6 support dropped +def _watch_tree(rctx, *args, **kwargs): + """Calls rctx.watch_tree, if available.""" + if hasattr(rctx, "watch_tree"): + rctx.watch_tree(*args, **kwargs) + repo_utils = struct( + # keep sorted + debug_print = _debug_print, execute_checked = _execute_checked, - execute_unchecked = _execute_unchecked, execute_checked_stdout = _execute_checked_stdout, + execute_unchecked = _execute_unchecked, + get_platforms_os_name = _get_platforms_os_name, + getenv = _getenv, is_repo_debug_enabled = _is_repo_debug_enabled, - debug_print = _debug_print, - which_checked = _which_checked, logger = _logger, + watch = _watch, + watch_tree = _watch_tree, + which_checked = _which_checked, + which_unchecked = _which_unchecked, ) diff --git a/python/private/text_util.bzl b/python/private/text_util.bzl index 8a018e7969..38f2b0e404 100644 --- a/python/private/text_util.bzl +++ b/python/private/text_util.bzl @@ -20,6 +20,15 @@ def _indent(text, indent = " " * 4): return "\n".join([indent + line for line in text.splitlines()]) +def _hanging_indent(text, indent = " " * 4): + if "\n" not in text: + return text + + lines = text.splitlines() + for i, line in enumerate(lines): + lines[i] = (indent if i != 0 else "") + line + return "\n".join(lines) + def _render_alias(name, actual, *, visibility = None): args = [ "name = \"{}\",".format(name), @@ -67,14 +76,24 @@ def _render_select(selects, *, no_match_error = None, key_repr = repr, value_rep return "{}({})".format(name, args) -def _render_list(items): +def _render_list(items, *, hanging_indent = ""): + """Convert a list to formatted text. + + Args: + items: list of items. + hanging_indent: str, indent to apply to second and following lines of + the formatted text. + + Returns: + The list pretty formatted as a string. + """ if not items: return "[]" if len(items) == 1: return "[{}]".format(repr(items[0])) - return "\n".join([ + text = "\n".join([ "[", _indent("\n".join([ "{},".format(repr(item)) @@ -82,6 +101,12 @@ def _render_list(items): ])), "]", ]) + if hanging_indent: + text = _hanging_indent(text, hanging_indent) + return text + +def _render_str(value): + return repr(value) def _render_tuple(items, *, value_repr = repr): if not items: @@ -116,10 +141,12 @@ def _left_pad_zero(index, length): render = struct( alias = _render_alias, dict = _render_dict, + hanging_indent = _hanging_indent, indent = _indent, left_pad_zero = _left_pad_zero, list = _render_list, select = _render_select, - tuple = _render_tuple, + str = _render_str, toolchain_prefix = _toolchain_prefix, + tuple = _render_tuple, ) diff --git a/tests/integration/BUILD.bazel b/tests/integration/BUILD.bazel index ac475da534..8724b25280 100644 --- a/tests/integration/BUILD.bazel +++ b/tests/integration/BUILD.bazel @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +load("@bazel_binaries//:defs.bzl", "bazel_binaries") load("@rules_bazel_integration_test//bazel_integration_test:defs.bzl", "default_test_runner") load("//python:py_library.bzl", "py_library") load(":integration_test.bzl", "rules_python_integration_test") @@ -84,6 +85,15 @@ rules_python_integration_test( workspace_path = "ignore_root_user_error", ) +rules_python_integration_test( + name = "local_toolchains_test", + bazel_versions = [ + version + for version in bazel_binaries.versions.all + if not version.startswith("6.") + ], +) + rules_python_integration_test( name = "pip_parse_test", ) diff --git a/tests/integration/README.md b/tests/integration/README.md new file mode 100644 index 0000000000..e36e363224 --- /dev/null +++ b/tests/integration/README.md @@ -0,0 +1,21 @@ +# Bazel-in-Bazel integration tests + +The tests in this directory are Bazel-in-Bazel integration tests. These are +necessary because our CI has a limit of 80 jobs, and our test matrix uses most +of those for more important end-to-end tests of user-facing examples. + +The tests in here are more for testing internal aspects of the rules that aren't +easily tested as tests run by Bazel itself (basically anything that happens +prior to the analysis phase). + +## Adding a new directory + +When adding a new diretory, a couple files need to be updated to tell the outer +Bazel to ignore the nested workspace. + +* Add the directory to the `--deleted_packages` flag. Run `pre-commit` and it + will do this for you. This also allows the integration test to see the + nested workspace files correctly. +* Update `.bazelignore` and add `tests/integration//bazel-`. + This prevents Bazel from following infinite symlinks and freezing. +* Add a `rules_python_integration_test` target to the BUILD file. diff --git a/tests/integration/integration_test.bzl b/tests/integration/integration_test.bzl index 7a8070aa1c..8606f66bb3 100644 --- a/tests/integration/integration_test.bzl +++ b/tests/integration/integration_test.bzl @@ -28,6 +28,7 @@ def rules_python_integration_test( gazelle_plugin = False, tags = None, py_main = None, + bazel_versions = None, **kwargs): """Runs a bazel-in-bazel integration test. @@ -42,6 +43,8 @@ def rules_python_integration_test( py_main: Optional `.py` file to run tests using. When specified, a python based test runner is used, and this source file is the main entry point and responsible for executing tests. + bazel_versions: `list[str] | None`, the bazel versions to test. I + not specified, defaults to all configured bazel versions. **kwargs: Passed to the upstream `bazel_integration_tests` rule. """ workspace_path = workspace_path or name.removesuffix("_test") @@ -90,7 +93,7 @@ def rules_python_integration_test( name = name, workspace_path = workspace_path, test_runner = test_runner, - bazel_versions = bazel_binaries.versions.all, + bazel_versions = bazel_versions or bazel_binaries.versions.all, workspace_files = [name + "_workspace_files"], # Override the tags so that the `manual` tag isn't applied. tags = (tags or []) + [ diff --git a/tests/integration/local_toolchains/.bazelrc b/tests/integration/local_toolchains/.bazelrc new file mode 100644 index 0000000000..551df401b3 --- /dev/null +++ b/tests/integration/local_toolchains/.bazelrc @@ -0,0 +1,5 @@ +common --action_env=RULES_PYTHON_BZLMOD_DEBUG=1 +common --lockfile_mode=off +test --test_output=errors +# Windows requires these for multi-python support: +build --enable_runfiles diff --git a/tests/integration/local_toolchains/BUILD.bazel b/tests/integration/local_toolchains/BUILD.bazel new file mode 100644 index 0000000000..6fbf548901 --- /dev/null +++ b/tests/integration/local_toolchains/BUILD.bazel @@ -0,0 +1,20 @@ +# 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_python//python:py_test.bzl", "py_test") + +py_test( + name = "test", + srcs = ["test.py"], +) diff --git a/tests/integration/local_toolchains/MODULE.bazel b/tests/integration/local_toolchains/MODULE.bazel new file mode 100644 index 0000000000..d4ef12e952 --- /dev/null +++ b/tests/integration/local_toolchains/MODULE.bazel @@ -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. +module(name = "module_under_test") + +bazel_dep(name = "rules_python", version = "0.0.0") +local_path_override( + module_name = "rules_python", + path = "../../..", +) + +local_runtime_repo = use_repo_rule("@rules_python//python/private:local_runtime_repo.bzl", "local_runtime_repo") + +local_runtime_toolchains_repo = use_repo_rule("@rules_python//python/private:local_runtime_toolchains_repo.bzl", "local_runtime_toolchains_repo") + +local_runtime_repo( + name = "local_python3", + interpreter_path = "python3", + on_failure = "fail", +) + +local_runtime_toolchains_repo( + name = "local_toolchains", + runtimes = ["local_python3"], +) + +python = use_extension("@rules_python//python/extensions:python.bzl", "python") +use_repo(python, "rules_python_bzlmod_debug") + +register_toolchains("@local_toolchains//:all") diff --git a/tests/integration/local_toolchains/REPO.bazel b/tests/integration/local_toolchains/REPO.bazel new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/integration/local_toolchains/WORKSPACE b/tests/integration/local_toolchains/WORKSPACE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/integration/local_toolchains/WORKSPACE.bzlmod b/tests/integration/local_toolchains/WORKSPACE.bzlmod new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/integration/local_toolchains/test.py b/tests/integration/local_toolchains/test.py new file mode 100644 index 0000000000..63771cf78d --- /dev/null +++ b/tests/integration/local_toolchains/test.py @@ -0,0 +1,26 @@ +import shutil +import subprocess +import sys +import unittest + + +class LocalToolchainTest(unittest.TestCase): + maxDiff = None + + def test_python_from_path_used(self): + shell_path = shutil.which("python3") + + # We call the interpreter and print its executable because of + # things like pyenv: they install a shim that re-execs python. + # The shim is e.g. /home/user/.pyenv/shims/python3, which then + # runs e.g. /usr/bin/python3 + expected = subprocess.check_output( + [shell_path, "-c", "import sys; print(sys.executable)"], + text=True, + ) + expected = expected.strip() + self.assertEqual(expected, sys.executable) + + +if __name__ == "__main__": + unittest.main() From bb3615f0b3e25a2532cf0c7855089f1ab2ac1c79 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:53:15 +0900 Subject: [PATCH 125/345] refactor(pypi): split out more utils and start passing 'abi_os_arch' around (#2069) This is extra preparation needed for #2059. Summary: - Create `pypi_repo_utils` for more ergonomic handling of Python in repo context. - Split the resolution of requirements files to platforms into a separate function to make the testing easier. This also allows more validation that was realized that there is a need for in the WIP feature PR. - Make the code more robust about the assumption of the target platform label. Work towards #260, #1105, #1868. --- python/private/pypi/BUILD.bazel | 22 +- python/private/pypi/extension.bzl | 19 +- python/private/pypi/parse_requirements.bzl | 178 ++---------- python/private/pypi/pip_repository.bzl | 16 +- python/private/pypi/pypi_repo_utils.bzl | 94 ++++++ python/private/pypi/render_pkg_aliases.bzl | 26 +- .../pypi/requirements_files_by_platform.bzl | 258 +++++++++++++++++ python/private/pypi/whl_library.bzl | 80 +----- .../parse_requirements_tests.bzl | 271 ++---------------- .../render_pkg_aliases_test.bzl | 10 +- .../BUILD.bazel | 3 + .../requirements_files_by_platform_tests.bzl | 205 +++++++++++++ 12 files changed, 674 insertions(+), 508 deletions(-) create mode 100644 python/private/pypi/pypi_repo_utils.bzl create mode 100644 python/private/pypi/requirements_files_by_platform.bzl create mode 100644 tests/pypi/requirements_files_by_platform/BUILD.bazel create mode 100644 tests/pypi/requirements_files_by_platform/requirements_files_by_platform_tests.bzl diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel index 08fb7259ec..00602b298c 100644 --- a/python/private/pypi/BUILD.bazel +++ b/python/private/pypi/BUILD.bazel @@ -161,6 +161,8 @@ bzl_library( deps = [ ":index_sources_bzl", ":parse_requirements_txt_bzl", + ":pypi_repo_utils_bzl", + ":requirements_files_by_platform_bzl", ":whl_target_platforms_bzl", "//python/private:normalize_name_bzl", ], @@ -227,6 +229,15 @@ bzl_library( srcs = ["pip_repository_attrs.bzl"], ) +bzl_library( + name = "pypi_repo_utils_bzl", + srcs = ["pypi_repo_utils.bzl"], + deps = [ + "//python:versions_bzl", + "//python/private:toolchains_repo_bzl", + ], +) + bzl_library( name = "render_pkg_aliases_bzl", srcs = ["render_pkg_aliases.bzl"], @@ -240,6 +251,14 @@ bzl_library( ], ) +bzl_library( + name = "requirements_files_by_platform_bzl", + srcs = ["requirements_files_by_platform.bzl"], + deps = [ + ":whl_target_platforms_bzl", + ], +) + bzl_library( name = "simpleapi_download_bzl", srcs = ["simpleapi_download.bzl"], @@ -270,13 +289,12 @@ bzl_library( ":generate_whl_library_build_bazel_bzl", ":parse_whl_name_bzl", ":patch_whl_bzl", + ":pypi_repo_utils_bzl", ":whl_target_platforms_bzl", "//python:repositories_bzl", - "//python:versions_bzl", "//python/private:auth_bzl", "//python/private:envsubst_bzl", "//python/private:repo_utils_bzl", - "//python/private:toolchains_repo_bzl", ], ) diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 6aafc71831..d837d8d50a 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -26,6 +26,7 @@ load(":parse_requirements.bzl", "host_platform", "parse_requirements", "select_r 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_library.bzl", "whl_library") load(":whl_repo_name.bzl", "whl_repo_name") @@ -183,12 +184,16 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s requirements_by_platform = parse_requirements( module_ctx, - requirements_by_platform = pip_attr.requirements_by_platform, - requirements_linux = pip_attr.requirements_linux, - requirements_lock = pip_attr.requirements_lock, - requirements_osx = pip_attr.requirements_darwin, - requirements_windows = pip_attr.requirements_windows, - extra_pip_args = pip_attr.extra_pip_args, + requirements_by_platform = requirements_files_by_platform( + requirements_by_platform = pip_attr.requirements_by_platform, + requirements_linux = pip_attr.requirements_linux, + requirements_lock = pip_attr.requirements_lock, + requirements_osx = pip_attr.requirements_darwin, + requirements_windows = pip_attr.requirements_windows, + extra_pip_args = pip_attr.extra_pip_args, + python_version = major_minor, + logger = logger, + ), get_index_urls = get_index_urls, python_version = major_minor, logger = logger, @@ -298,7 +303,7 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s requirement = select_requirement( requirements, - platform = repository_platform, + platform = None if pip_attr.download_only else repository_platform, ) if not requirement: # Sometimes the package is not present for host platform if there diff --git a/python/private/pypi/parse_requirements.bzl b/python/private/pypi/parse_requirements.bzl index d52180c009..5258153a84 100644 --- a/python/private/pypi/parse_requirements.bzl +++ b/python/private/pypi/parse_requirements.bzl @@ -29,7 +29,7 @@ behavior. load("//python/private:normalize_name.bzl", "normalize_name") load(":index_sources.bzl", "index_sources") load(":parse_requirements_txt.bzl", "parse_requirements_txt") -load(":whl_target_platforms.bzl", "select_whls", "whl_target_platforms") +load(":whl_target_platforms.bzl", "select_whls") # This includes the vendored _translate_cpu and _translate_os from # @platforms//host:extension.bzl at version 0.0.9 so that we don't @@ -80,72 +80,10 @@ DEFAULT_PLATFORMS = [ "windows_x86_64", ] -def _default_platforms(*, filter): - if not filter: - fail("Must specific a filter string, got: {}".format(filter)) - - if filter.startswith("cp3"): - # TODO @aignas 2024-05-23: properly handle python versions in the filter. - # For now we are just dropping it to ensure that we don't fail. - _, _, filter = filter.partition("_") - - sanitized = filter.replace("*", "").replace("_", "") - if sanitized and not sanitized.isalnum(): - fail("The platform filter can only contain '*', '_' and alphanumerics") - - if "*" in filter: - prefix = filter.rstrip("*") - if "*" in prefix: - fail("The filter can only contain '*' at the end of it") - - if not prefix: - return DEFAULT_PLATFORMS - - return [p for p in DEFAULT_PLATFORMS if p.startswith(prefix)] - else: - return [p for p in DEFAULT_PLATFORMS if filter in p] - -def _platforms_from_args(extra_pip_args): - platform_values = [] - - for arg in extra_pip_args: - if platform_values and platform_values[-1] == "": - platform_values[-1] = arg - continue - - if arg == "--platform": - platform_values.append("") - continue - - if not arg.startswith("--platform"): - continue - - _, _, plat = arg.partition("=") - if not plat: - _, _, plat = arg.partition(" ") - if plat: - platform_values.append(plat) - else: - platform_values.append("") - - if not platform_values: - return [] - - platforms = { - p.target_platform: None - for arg in platform_values - for p in whl_target_platforms(arg) - } - return list(platforms.keys()) - def parse_requirements( ctx, *, requirements_by_platform = {}, - requirements_osx = None, - requirements_linux = None, - requirements_lock = None, - requirements_windows = None, extra_pip_args = [], get_index_urls = None, python_version = None, @@ -158,10 +96,6 @@ def parse_requirements( requirements_by_platform (label_keyed_string_dict): a way to have different package versions (or different packages) for different os, arch combinations. - requirements_osx (label): The requirements file for the osx OS. - requirements_linux (label): The requirements file for the linux OS. - requirements_lock (label): The requirements file for all OSes, or used as a fallback. - requirements_windows (label): The requirements file for windows OS. extra_pip_args (string list): Extra pip arguments to perform extra validations and to be joined with args fined in files. get_index_urls: Callable[[ctx, list[str]], dict], a callable to get all @@ -186,91 +120,11 @@ def parse_requirements( The second element is extra_pip_args should be passed to `whl_library`. """ - if not ( - requirements_lock or - requirements_linux or - requirements_osx or - requirements_windows or - requirements_by_platform - ): - fail_fn( - "A 'requirements_lock' attribute must be specified, a platform-specific lockfiles " + - "via 'requirements_by_platform' or an os-specific lockfiles must be specified " + - "via 'requirements_*' attributes", - ) - return None - - platforms = _platforms_from_args(extra_pip_args) - - if platforms: - lock_files = [ - f - for f in [ - requirements_lock, - requirements_linux, - requirements_osx, - requirements_windows, - ] + list(requirements_by_platform.keys()) - if f - ] - - if len(lock_files) > 1: - # If the --platform argument is used, check that we are using - # a single `requirements_lock` file instead of the OS specific ones as that is - # the only correct way to use the API. - fail_fn("only a single 'requirements_lock' file can be used when using '--platform' pip argument, consider specifying it via 'requirements_lock' attribute") - return None - - files_by_platform = [ - (lock_files[0], platforms), - ] - else: - files_by_platform = { - file: [ - platform - for filter_or_platform in specifier.split(",") - for platform in (_default_platforms(filter = filter_or_platform) if filter_or_platform.endswith("*") else [filter_or_platform]) - ] - for file, specifier in requirements_by_platform.items() - }.items() - - for f in [ - # If the users need a greater span of the platforms, they should consider - # using the 'requirements_by_platform' attribute. - (requirements_linux, _default_platforms(filter = "linux_*")), - (requirements_osx, _default_platforms(filter = "osx_*")), - (requirements_windows, _default_platforms(filter = "windows_*")), - (requirements_lock, None), - ]: - if f[0]: - files_by_platform.append(f) - - configured_platforms = {} - options = {} requirements = {} - for file, plats in files_by_platform: - if plats: - for p in plats: - if p in configured_platforms: - fail_fn( - "Expected the platform '{}' to be map only to a single requirements file, but got multiple: '{}', '{}'".format( - p, - configured_platforms[p], - file, - ), - ) - return None - configured_platforms[p] = file - else: - plats = [ - p - for p in DEFAULT_PLATFORMS - if p not in configured_platforms - ] - for p in plats: - configured_platforms[p] = file - + for file, plats in requirements_by_platform.items(): + if logger: + logger.debug(lambda: "Using {} for {}".format(file, plats)) contents = ctx.read(file) # Parse the requirements file directly in starlark to get the information @@ -303,9 +157,9 @@ def parse_requirements( tokenized_options.append(p) pip_args = tokenized_options + extra_pip_args - for p in plats: - requirements[p] = requirements_dict - options[p] = pip_args + for plat in plats: + requirements[plat] = requirements_dict + options[plat] = pip_args requirements_by_platform = {} for target_platform, reqs_ in requirements.items(): @@ -325,7 +179,6 @@ def parse_requirements( requirement_line = requirement_line, target_platforms = [], extra_pip_args = extra_pip_args, - download = len(platforms) > 0, ), ) for_req.target_platforms.append(target_platform) @@ -353,12 +206,12 @@ def parse_requirements( for p in r.target_platforms: requirement_target_platforms[p] = None - is_exposed = len(requirement_target_platforms) == len(configured_platforms) + is_exposed = len(requirement_target_platforms) == len(requirements) if not is_exposed and logger: - logger.debug(lambda: "Package {} will not be exposed because it is only present on a subset of platforms: {} out of {}".format( + logger.debug(lambda: "Package '{}' will not be exposed because it is only present on a subset of platforms: {} out of {}".format( whl_name, sorted(requirement_target_platforms), - sorted(configured_platforms), + sorted(requirements), )) for r in sorted(reqs.values(), key = lambda r: r.requirement_line): @@ -376,13 +229,15 @@ def parse_requirements( requirement_line = r.requirement_line, target_platforms = sorted(r.target_platforms), extra_pip_args = r.extra_pip_args, - download = r.download, whls = whls, sdist = sdist, is_exposed = is_exposed, ), ) + if logger: + logger.debug(lambda: "Will configure whl repos: {}".format(ret.keys())) + return ret def select_requirement(requirements, *, platform): @@ -391,8 +246,9 @@ def select_requirement(requirements, *, platform): Args: requirements (list[struct]): The list of requirements as returned by the `parse_requirements` function above. - platform (str): The host platform. Usually an output of the - `host_platform` function. + platform (str or None): The host platform. Usually an output of the + `host_platform` function. If None, then this function will return + the first requirement it finds. Returns: None if not found or a struct returned as one of the values in the @@ -402,7 +258,7 @@ def select_requirement(requirements, *, platform): maybe_requirement = [ req for req in requirements - if platform in req.target_platforms or req.download + if not platform or [p for p in req.target_platforms if p.endswith(platform)] ] if not maybe_requirement: # Sometimes the package is not present for host platform if there diff --git a/python/private/pypi/pip_repository.bzl b/python/private/pypi/pip_repository.bzl index a22f4d9d2c..42622c3c73 100644 --- a/python/private/pypi/pip_repository.bzl +++ b/python/private/pypi/pip_repository.bzl @@ -21,6 +21,7 @@ load("//python/private:text_util.bzl", "render") 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(":requirements_files_by_platform.bzl", "requirements_files_by_platform") def _get_python_interpreter_attr(rctx): """A helper function for getting the `python_interpreter` attribute or it's default @@ -71,11 +72,14 @@ exports_files(["requirements.bzl"]) def _pip_repository_impl(rctx): requirements_by_platform = parse_requirements( rctx, - requirements_by_platform = rctx.attr.requirements_by_platform, - requirements_linux = rctx.attr.requirements_linux, - requirements_lock = rctx.attr.requirements_lock, - requirements_osx = rctx.attr.requirements_darwin, - requirements_windows = rctx.attr.requirements_windows, + requirements_by_platform = requirements_files_by_platform( + requirements_by_platform = rctx.attr.requirements_by_platform, + requirements_linux = rctx.attr.requirements_linux, + requirements_lock = rctx.attr.requirements_lock, + requirements_osx = rctx.attr.requirements_darwin, + requirements_windows = rctx.attr.requirements_windows, + extra_pip_args = rctx.attr.extra_pip_args, + ), extra_pip_args = rctx.attr.extra_pip_args, ) selected_requirements = {} @@ -84,7 +88,7 @@ def _pip_repository_impl(rctx): for name, requirements in requirements_by_platform.items(): r = select_requirement( requirements, - platform = repository_platform, + platform = None if rctx.attr.download_only else repository_platform, ) if not r: continue diff --git a/python/private/pypi/pypi_repo_utils.bzl b/python/private/pypi/pypi_repo_utils.bzl new file mode 100644 index 0000000000..6e5d93b160 --- /dev/null +++ b/python/private/pypi/pypi_repo_utils.bzl @@ -0,0 +1,94 @@ +# 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("//python:versions.bzl", "WINDOWS_NAME") +load("//python/private:toolchains_repo.bzl", "get_host_os_arch") + +def _get_python_interpreter_attr(ctx, *, python_interpreter = None): + """A helper function for getting the `python_interpreter` attribute or it's default + + Args: + ctx (repository_ctx): Handle to the rule repository context. + python_interpreter (str): The python interpreter override. + + Returns: + str: The attribute value or it's default + """ + if python_interpreter: + return python_interpreter + + if "win" in ctx.os.name: + return "python.exe" + else: + return "python3" + +def _resolve_python_interpreter(ctx, *, python_interpreter = None, python_interpreter_target = None): + """Helper function to find the python interpreter from the common attributes + + Args: + ctx: Handle to the rule repository context. + python_interpreter: The python interpreter to use. + python_interpreter_target: The python interpreter to use after downloading the label. + + Returns: + `path` object, for the resolved path to the Python interpreter. + """ + python_interpreter = _get_python_interpreter_attr(ctx, python_interpreter = python_interpreter) + + if python_interpreter_target != None: + python_interpreter = ctx.path(python_interpreter_target) + + (os, _) = get_host_os_arch(ctx) + + # On Windows, the symlink doesn't work because Windows attempts to find + # Python DLLs where the symlink is, not where the symlink points. + if os == WINDOWS_NAME: + python_interpreter = python_interpreter.realpath + elif "/" not in python_interpreter: + # It's a plain command, e.g. "python3", to look up in the environment. + found_python_interpreter = ctx.which(python_interpreter) + if not found_python_interpreter: + fail("python interpreter `{}` not found in PATH".format(python_interpreter)) + python_interpreter = found_python_interpreter + else: + python_interpreter = ctx.path(python_interpreter) + return python_interpreter + +def _construct_pypath(rctx, *, entries): + """Helper function to construct a PYTHONPATH. + + Contains entries for code in this repo as well as packages downloaded from //python/pip_install:repositories.bzl. + This allows us to run python code inside repository rule implementations. + + Args: + rctx: Handle to the repository_context. + entries: The list of entries to add to PYTHONPATH. + + Returns: String of the PYTHONPATH. + """ + + separator = ":" if not "windows" in rctx.os.name.lower() else ";" + pypath = separator.join([ + str(rctx.path(entry).dirname) + # Use a dict as a way to remove duplicates and then sort it. + for entry in sorted({x: None for x in entries}) + ]) + return pypath + +pypi_repo_utils = struct( + resolve_python_interpreter = _resolve_python_interpreter, + construct_pythonpath = _construct_pypath, +) diff --git a/python/private/pypi/render_pkg_aliases.bzl b/python/private/pypi/render_pkg_aliases.bzl index eb907fee0f..9e5158f8f0 100644 --- a/python/private/pypi/render_pkg_aliases.bzl +++ b/python/private/pypi/render_pkg_aliases.bzl @@ -265,6 +265,11 @@ def whl_alias(*, repo, version = None, config_setting = None, filename = None, t 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, @@ -448,7 +453,7 @@ def get_whl_flag_versions(aliases): parsed = parse_whl_name(a.filename) else: for plat in a.target_platforms or []: - target_platforms[plat] = None + target_platforms[_non_versioned_platform(plat)] = None continue for platform_tag in parsed.platform_tag.split("."): @@ -486,6 +491,19 @@ def get_whl_flag_versions(aliases): if v } +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)) + def get_filename_config_settings( *, filename, @@ -499,7 +517,7 @@ def get_filename_config_settings( Args: filename: the distribution filename (can be a whl or an sdist). - target_platforms: list[str], target platforms in "{os}_{cpu}" format. + 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. @@ -541,7 +559,7 @@ def get_filename_config_settings( if parsed.platform_tag == "any": prefixes = ["{}_{}_any".format(py, abi)] - suffixes = target_platforms + suffixes = [_non_versioned_platform(p) for p in target_platforms or []] else: prefixes = ["{}_{}".format(py, abi)] suffixes = _whl_config_setting_suffixes( @@ -553,7 +571,7 @@ def get_filename_config_settings( ) else: prefixes = ["sdist"] - suffixes = target_platforms + suffixes = [_non_versioned_platform(p) for p in target_platforms or []] if python_default and python_version: prefixes += ["cp{}_{}".format(python_version, p) for p in prefixes] diff --git a/python/private/pypi/requirements_files_by_platform.bzl b/python/private/pypi/requirements_files_by_platform.bzl new file mode 100644 index 0000000000..e3aafc083f --- /dev/null +++ b/python/private/pypi/requirements_files_by_platform.bzl @@ -0,0 +1,258 @@ +# 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. + +"""Get the requirement files by platform.""" + +load(":whl_target_platforms.bzl", "whl_target_platforms") + +# TODO @aignas 2024-05-13: consider using the same platform tags as are used in +# the //python:versions.bzl +DEFAULT_PLATFORMS = [ + "linux_aarch64", + "linux_arm", + "linux_ppc", + "linux_s390x", + "linux_x86_64", + "osx_aarch64", + "osx_x86_64", + "windows_x86_64", +] + +def _default_platforms(*, filter): + if not filter: + fail("Must specific a filter string, got: {}".format(filter)) + + if filter.startswith("cp3"): + # TODO @aignas 2024-05-23: properly handle python versions in the filter. + # For now we are just dropping it to ensure that we don't fail. + _, _, filter = filter.partition("_") + + sanitized = filter.replace("*", "").replace("_", "") + if sanitized and not sanitized.isalnum(): + fail("The platform filter can only contain '*', '_' and alphanumerics") + + if "*" in filter: + prefix = filter.rstrip("*") + if "*" in prefix: + fail("The filter can only contain '*' at the end of it") + + if not prefix: + return DEFAULT_PLATFORMS + + return [p for p in DEFAULT_PLATFORMS if p.startswith(prefix)] + else: + return [p for p in DEFAULT_PLATFORMS if filter in p] + +def _platforms_from_args(extra_pip_args): + platform_values = [] + + if not extra_pip_args: + return platform_values + + for arg in extra_pip_args: + if platform_values and platform_values[-1] == "": + platform_values[-1] = arg + continue + + if arg == "--platform": + platform_values.append("") + continue + + if not arg.startswith("--platform"): + continue + + _, _, plat = arg.partition("=") + if not plat: + _, _, plat = arg.partition(" ") + if plat: + platform_values.append(plat) + else: + platform_values.append("") + + if not platform_values: + return [] + + platforms = { + p.target_platform: None + for arg in platform_values + for p in whl_target_platforms(arg) + } + return list(platforms.keys()) + +def _platform(platform_string, python_version = None): + if not python_version or platform_string.startswith("cp3"): + return platform_string + + _, _, tail = python_version.partition(".") + minor, _, _ = tail.partition(".") + + return "cp3{}_{}".format(minor, platform_string) + +def requirements_files_by_platform( + *, + requirements_by_platform = {}, + requirements_osx = None, + requirements_linux = None, + requirements_lock = None, + requirements_windows = None, + extra_pip_args = None, + python_version = None, + logger = None, + fail_fn = fail): + """Resolve the requirement files by target platform. + + Args: + requirements_by_platform (label_keyed_string_dict): a way to have + different package versions (or different packages) for different + os, arch combinations. + requirements_osx (label): The requirements file for the osx OS. + requirements_linux (label): The requirements file for the linux OS. + requirements_lock (label): The requirements file for all OSes, or used as a fallback. + requirements_windows (label): The requirements file for windows OS. + extra_pip_args (string list): Extra pip arguments to perform extra validations and to + be joined with args fined in files. + python_version: str or None. This is needed when the get_index_urls is + specified. It should be of the form "3.x.x", + logger: repo_utils.logger or None, a simple struct to log diagnostic messages. + fail_fn (Callable[[str], None]): A failure function used in testing failure cases. + + Returns: + A dict with keys as the labels to the files and values as lists of + platforms that the files support. + """ + if not ( + requirements_lock or + requirements_linux or + requirements_osx or + requirements_windows or + requirements_by_platform + ): + fail_fn( + "A 'requirements_lock' attribute must be specified, a platform-specific lockfiles " + + "via 'requirements_by_platform' or an os-specific lockfiles must be specified " + + "via 'requirements_*' attributes", + ) + return None + + platforms = _platforms_from_args(extra_pip_args) + if logger: + logger.debug(lambda: "Platforms from pip args: {}".format(platforms)) + + if platforms: + lock_files = [ + f + for f in [ + requirements_lock, + requirements_linux, + requirements_osx, + requirements_windows, + ] + list(requirements_by_platform.keys()) + if f + ] + + if len(lock_files) > 1: + # If the --platform argument is used, check that we are using + # a single `requirements_lock` file instead of the OS specific ones as that is + # the only correct way to use the API. + fail_fn("only a single 'requirements_lock' file can be used when using '--platform' pip argument, consider specifying it via 'requirements_lock' attribute") + return None + + files_by_platform = [ + (lock_files[0], platforms), + ] + if logger: + logger.debug(lambda: "Files by platform with the platform set in the args: {}".format(files_by_platform)) + else: + files_by_platform = { + file: [ + platform + for filter_or_platform in specifier.split(",") + for platform in (_default_platforms(filter = filter_or_platform) if filter_or_platform.endswith("*") else [filter_or_platform]) + ] + for file, specifier in requirements_by_platform.items() + }.items() + + if logger: + logger.debug(lambda: "Files by platform with the platform set in the attrs: {}".format(files_by_platform)) + + for f in [ + # If the users need a greater span of the platforms, they should consider + # using the 'requirements_by_platform' attribute. + (requirements_linux, _default_platforms(filter = "linux_*")), + (requirements_osx, _default_platforms(filter = "osx_*")), + (requirements_windows, _default_platforms(filter = "windows_*")), + (requirements_lock, None), + ]: + if f[0]: + if logger: + logger.debug(lambda: "Adding an extra item to files_by_platform: {}".format(f)) + files_by_platform.append(f) + + configured_platforms = {} + requirements = {} + for file, plats in files_by_platform: + if plats: + plats = [_platform(p, python_version) for p in plats] + for p in plats: + if p in configured_platforms: + fail_fn( + "Expected the platform '{}' to be map only to a single requirements file, but got multiple: '{}', '{}'".format( + p, + configured_platforms[p], + file, + ), + ) + return None + + configured_platforms[p] = file + else: + default_platforms = [_platform(p, python_version) for p in DEFAULT_PLATFORMS] + plats = [ + p + for p in default_platforms + if p not in configured_platforms + ] + if logger: + logger.debug(lambda: "File {} will be used for the remaining platforms {} that are not in configured_platforms: {}".format( + file, + plats, + default_platforms, + )) + for p in plats: + configured_platforms[p] = file + + if logger: + logger.debug(lambda: "Configured platforms for file {} are {}".format(file, plats)) + + for p in plats: + if p in requirements: + # This should never happen because in the code above we should + # have unambiguous selection of the requirements files. + fail_fn("Attempting to override a requirements file '{}' with '{}' for platform '{}'".format( + requirements[p], + file, + p, + )) + return None + requirements[p] = file + + # Now return a dict that is similar to requirements_by_platform - where we + # have labels/files as keys in the dict to minimize the number of times we + # may parse the same file. + + ret = {} + for plat, file in requirements.items(): + ret.setdefault(file, []).append(plat) + + return ret diff --git a/python/private/pypi/whl_library.bzl b/python/private/pypi/whl_library.bzl index a3fa1d8e36..f453f92ccf 100644 --- a/python/private/pypi/whl_library.bzl +++ b/python/private/pypi/whl_library.bzl @@ -15,88 +15,21 @@ "" load("//python:repositories.bzl", "is_standalone_interpreter") -load("//python:versions.bzl", "WINDOWS_NAME") load("//python/private:auth.bzl", "AUTH_ATTRS", "get_auth") load("//python/private:envsubst.bzl", "envsubst") load("//python/private:repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") -load("//python/private:toolchains_repo.bzl", "get_host_os_arch") load(":attrs.bzl", "ATTRS", "use_isolated") load(":deps.bzl", "all_repo_names") load(":generate_whl_library_build_bazel.bzl", "generate_whl_library_build_bazel") load(":parse_whl_name.bzl", "parse_whl_name") load(":patch_whl.bzl", "patch_whl") +load(":pypi_repo_utils.bzl", "pypi_repo_utils") load(":whl_target_platforms.bzl", "whl_target_platforms") _CPPFLAGS = "CPPFLAGS" _COMMAND_LINE_TOOLS_PATH_SLUG = "commandlinetools" _WHEEL_ENTRY_POINT_PREFIX = "rules_python_wheel_entry_point" -def _construct_pypath(rctx): - """Helper function to construct a PYTHONPATH. - - Contains entries for code in this repo as well as packages downloaded from //python/pip_install:repositories.bzl. - This allows us to run python code inside repository rule implementations. - - Args: - rctx: Handle to the repository_context. - - Returns: String of the PYTHONPATH. - """ - - separator = ":" if not "windows" in rctx.os.name.lower() else ";" - pypath = separator.join([ - str(rctx.path(entry).dirname) - for entry in rctx.attr._python_path_entries - ]) - return pypath - -def _get_python_interpreter_attr(rctx): - """A helper function for getting the `python_interpreter` attribute or it's default - - Args: - rctx (repository_ctx): Handle to the rule repository context. - - Returns: - str: The attribute value or it's default - """ - if rctx.attr.python_interpreter: - return rctx.attr.python_interpreter - - if "win" in rctx.os.name: - return "python.exe" - else: - return "python3" - -def _resolve_python_interpreter(rctx): - """Helper function to find the python interpreter from the common attributes - - Args: - rctx: Handle to the rule repository context. - - Returns: - `path` object, for the resolved path to the Python interpreter. - """ - python_interpreter = _get_python_interpreter_attr(rctx) - - if rctx.attr.python_interpreter_target != None: - python_interpreter = rctx.path(rctx.attr.python_interpreter_target) - - (os, _) = get_host_os_arch(rctx) - - # On Windows, the symlink doesn't work because Windows attempts to find - # Python DLLs where the symlink is, not where the symlink points. - if os == WINDOWS_NAME: - python_interpreter = python_interpreter.realpath - elif "/" not in python_interpreter: - # It's a plain command, e.g. "python3", to look up in the environment. - found_python_interpreter = rctx.which(python_interpreter) - if not found_python_interpreter: - fail("python interpreter `{}` not found in PATH".format(python_interpreter)) - python_interpreter = found_python_interpreter - else: - python_interpreter = rctx.path(python_interpreter) - return python_interpreter - def _get_xcode_location_cflags(rctx): """Query the xcode sdk location to update cflags @@ -230,14 +163,21 @@ def _create_repository_execution_environment(rctx, python_interpreter): cppflags.extend(_get_toolchain_unix_cflags(rctx, python_interpreter)) env = { - "PYTHONPATH": _construct_pypath(rctx), + "PYTHONPATH": pypi_repo_utils.construct_pythonpath( + rctx, + entries = rctx.attr._python_path_entries, + ), _CPPFLAGS: " ".join(cppflags), } return env def _whl_library_impl(rctx): - python_interpreter = _resolve_python_interpreter(rctx) + python_interpreter = pypi_repo_utils.resolve_python_interpreter( + rctx, + python_interpreter = rctx.attr.python_interpreter, + python_interpreter_target = rctx.attr.python_interpreter_target, + ) args = [ python_interpreter, "-m", diff --git a/tests/pypi/parse_requirements/parse_requirements_tests.bzl b/tests/pypi/parse_requirements/parse_requirements_tests.bzl index 5c33dd83b2..1a7143b747 100644 --- a/tests/pypi/parse_requirements/parse_requirements_tests.bzl +++ b/tests/pypi/parse_requirements/parse_requirements_tests.bzl @@ -52,33 +52,17 @@ bar==0.0.1 --hash=sha256:deadb00f _tests = [] -def _test_fail_no_requirements(env): - errors = [] - parse_requirements( - ctx = _mock_ctx(), - fail_fn = errors.append, - ) - env.expect.that_str(errors[0]).equals("""\ -A 'requirements_lock' attribute must be specified, a platform-specific lockfiles via 'requirements_by_platform' or an os-specific lockfiles must be specified via 'requirements_*' attributes""") - -_tests.append(_test_fail_no_requirements) - def _test_simple(env): got = parse_requirements( - ctx = _mock_ctx(), - requirements_lock = "requirements_lock", - ) - got_alternative = parse_requirements( ctx = _mock_ctx(), requirements_by_platform = { - "requirements_lock": "*", + "requirements_lock": ["linux_x86_64", "windows_x86_64"], }, ) env.expect.that_dict(got).contains_exactly({ "foo": [ struct( distribution = "foo", - download = False, extra_pip_args = [], requirement_line = "foo[extra]==0.0.1 --hash=sha256:deadbeef", srcs = struct( @@ -87,13 +71,7 @@ def _test_simple(env): version = "0.0.1", ), target_platforms = [ - "linux_aarch64", - "linux_arm", - "linux_ppc", - "linux_s390x", "linux_x86_64", - "osx_aarch64", - "osx_x86_64", "windows_x86_64", ], whls = [], @@ -102,68 +80,26 @@ def _test_simple(env): ), ], }) - env.expect.that_dict(got).contains_exactly(got_alternative) env.expect.that_str( select_requirement( got["foo"], - platform = "linux_ppc", + platform = "linux_x86_64", ).srcs.version, ).equals("0.0.1") _tests.append(_test_simple) -def _test_platform_markers_with_python_version(env): +def _test_dupe_requirements(env): got = parse_requirements( ctx = _mock_ctx(), requirements_by_platform = { - "requirements_lock": "cp39_linux_*", - }, - ) - got_alternative = parse_requirements( - ctx = _mock_ctx(), - requirements_by_platform = { - "requirements_lock": "linux_*", + "requirements_lock_dupe": ["linux_x86_64"], }, ) env.expect.that_dict(got).contains_exactly({ "foo": [ struct( distribution = "foo", - download = False, - extra_pip_args = [], - requirement_line = "foo[extra]==0.0.1 --hash=sha256:deadbeef", - srcs = struct( - requirement = "foo[extra]==0.0.1", - shas = ["deadbeef"], - version = "0.0.1", - ), - target_platforms = [ - "linux_aarch64", - "linux_arm", - "linux_ppc", - "linux_s390x", - "linux_x86_64", - ], - whls = [], - sdist = None, - is_exposed = True, - ), - ], - }) - env.expect.that_dict(got).contains_exactly(got_alternative) - -_tests.append(_test_platform_markers_with_python_version) - -def _test_dupe_requirements(env): - got = parse_requirements( - ctx = _mock_ctx(), - requirements_lock = "requirements_lock_dupe", - ) - env.expect.that_dict(got).contains_exactly({ - "foo": [ - struct( - distribution = "foo", - download = False, extra_pip_args = [], requirement_line = "foo[extra,extra_2]==0.0.1 --hash=sha256:deadbeef", srcs = struct( @@ -171,16 +107,7 @@ def _test_dupe_requirements(env): shas = ["deadbeef"], version = "0.0.1", ), - target_platforms = [ - "linux_aarch64", - "linux_arm", - "linux_ppc", - "linux_s390x", - "linux_x86_64", - "osx_aarch64", - "osx_x86_64", - "windows_x86_64", - ], + target_platforms = ["linux_x86_64"], whls = [], sdist = None, is_exposed = True, @@ -192,19 +119,10 @@ _tests.append(_test_dupe_requirements) def _test_multi_os(env): got = parse_requirements( - ctx = _mock_ctx(), - requirements_linux = "requirements_linux", - requirements_osx = "requirements_osx", - requirements_windows = "requirements_windows", - ) - - # This is an alternative way to express the same intent - got_alternative = parse_requirements( ctx = _mock_ctx(), requirements_by_platform = { - "requirements_linux": "linux_*", - "requirements_osx": "osx_*", - "requirements_windows": "windows_*", + "requirements_linux": ["linux_x86_64"], + "requirements_windows": ["windows_x86_64"], }, ) @@ -212,7 +130,6 @@ def _test_multi_os(env): "bar": [ struct( distribution = "bar", - download = False, extra_pip_args = [], requirement_line = "bar==0.0.1 --hash=sha256:deadb00f", srcs = struct( @@ -229,7 +146,6 @@ def _test_multi_os(env): "foo": [ struct( distribution = "foo", - download = False, extra_pip_args = [], requirement_line = "foo==0.0.3 --hash=sha256:deadbaaf", srcs = struct( @@ -237,22 +153,13 @@ def _test_multi_os(env): shas = ["deadbaaf"], version = "0.0.3", ), - target_platforms = [ - "linux_aarch64", - "linux_arm", - "linux_ppc", - "linux_s390x", - "linux_x86_64", - "osx_aarch64", - "osx_x86_64", - ], + target_platforms = ["linux_x86_64"], whls = [], sdist = None, is_exposed = True, ), struct( distribution = "foo", - download = False, extra_pip_args = [], requirement_line = "foo[extra]==0.0.2 --hash=sha256:deadbeef", srcs = struct( @@ -267,7 +174,6 @@ def _test_multi_os(env): ), ], }) - env.expect.that_dict(got).contains_exactly(got_alternative) env.expect.that_str( select_requirement( got["foo"], @@ -277,168 +183,27 @@ def _test_multi_os(env): _tests.append(_test_multi_os) -def _test_fail_duplicate_platforms(env): - errors = [] - parse_requirements( - ctx = _mock_ctx(), - requirements_by_platform = { - "requirements_linux": "linux_x86_64", - "requirements_lock": "*", - }, - fail_fn = errors.append, - ) - env.expect.that_collection(errors).has_size(1) - env.expect.that_str(",".join(errors)).equals("Expected the platform 'linux_x86_64' to be map only to a single requirements file, but got multiple: 'requirements_linux', 'requirements_lock'") - -_tests.append(_test_fail_duplicate_platforms) - -def _test_multi_os_download_only_platform(env): - got = parse_requirements( - ctx = _mock_ctx(), - requirements_lock = "requirements_linux", - extra_pip_args = [ - "--platform", - "manylinux_2_27_x86_64", - "--platform=manylinux_2_12_x86_64", - "--platform manylinux_2_5_x86_64", - ], - ) - env.expect.that_dict(got).contains_exactly({ - "foo": [ +def _test_select_requirement_none_platform(env): + got = select_requirement( + [ struct( - distribution = "foo", - download = True, - extra_pip_args = [ - "--platform", - "manylinux_2_27_x86_64", - "--platform=manylinux_2_12_x86_64", - "--platform manylinux_2_5_x86_64", - ], - requirement_line = "foo==0.0.3 --hash=sha256:deadbaaf", - srcs = struct( - requirement = "foo==0.0.3", - shas = ["deadbaaf"], - version = "0.0.3", - ), + some_attr = "foo", target_platforms = ["linux_x86_64"], - whls = [], - sdist = None, - is_exposed = True, ), ], - }) - env.expect.that_str( - select_requirement( - got["foo"], - platform = "windows_x86_64", - ).srcs.version, - ).equals("0.0.3") - -_tests.append(_test_multi_os_download_only_platform) - -def _test_fail_download_only_bad_attr(env): - errors = [] - parse_requirements( - ctx = _mock_ctx(), - requirements_linux = "requirements_linux", - requirements_osx = "requirements_osx", - extra_pip_args = [ - "--platform", - "manylinux_2_27_x86_64", - "--platform=manylinux_2_12_x86_64", - "--platform manylinux_2_5_x86_64", - ], - fail_fn = errors.append, + platform = None, ) - env.expect.that_str(errors[0]).equals("only a single 'requirements_lock' file can be used when using '--platform' pip argument, consider specifying it via 'requirements_lock' attribute") + env.expect.that_str(got.some_attr).equals("foo") -_tests.append(_test_fail_download_only_bad_attr) - -def _test_os_arch_requirements_with_default(env): - got = parse_requirements( - ctx = _mock_ctx(), - requirements_by_platform = { - "requirements_direct": "linux_super_exotic", - "requirements_linux": "linux_x86_64,linux_aarch64", - }, - requirements_lock = "requirements_lock", - ) - env.expect.that_dict(got).contains_exactly({ - "foo": [ - struct( - distribution = "foo", - download = False, - extra_pip_args = [], - requirement_line = "foo==0.0.3 --hash=sha256:deadbaaf", - srcs = struct( - requirement = "foo==0.0.3", - shas = ["deadbaaf"], - version = "0.0.3", - ), - target_platforms = ["linux_aarch64", "linux_x86_64"], - whls = [], - sdist = None, - is_exposed = True, - ), - struct( - distribution = "foo", - download = False, - extra_pip_args = [], - requirement_line = "foo[extra] @ https://some-url", - srcs = struct( - requirement = "foo[extra] @ https://some-url", - shas = [], - version = "", - ), - target_platforms = ["linux_super_exotic"], - whls = [], - sdist = None, - is_exposed = True, - ), - struct( - distribution = "foo", - download = False, - extra_pip_args = [], - requirement_line = "foo[extra]==0.0.1 --hash=sha256:deadbeef", - srcs = struct( - requirement = "foo[extra]==0.0.1", - shas = ["deadbeef"], - version = "0.0.1", - ), - target_platforms = [ - "linux_arm", - "linux_ppc", - "linux_s390x", - "osx_aarch64", - "osx_x86_64", - "windows_x86_64", - ], - whls = [], - sdist = None, - is_exposed = True, - ), - ], - }) - env.expect.that_str( - select_requirement( - got["foo"], - platform = "windows_x86_64", - ).srcs.version, - ).equals("0.0.1") - env.expect.that_str( - select_requirement( - got["foo"], - platform = "linux_x86_64", - ).srcs.version, - ).equals("0.0.3") - -_tests.append(_test_os_arch_requirements_with_default) +_tests.append(_test_select_requirement_none_platform) def _test_fail_no_python_version(env): errors = [] parse_requirements( ctx = _mock_ctx(), - requirements_lock = "requirements_lock", + requirements_by_platform = { + "requirements_lock": [""], + }, get_index_urls = lambda _, __: {}, fail_fn = errors.append, ) 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 0d4c75e3c2..09a06311fc 100644 --- a/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl +++ b/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl @@ -517,7 +517,7 @@ def _test_get_python_versions_from_filenames(env): _tests.append(_test_get_python_versions_from_filenames) -def _test_target_platforms_from_alias_target_platforms(env): +def _test_get_flag_versions_from_alias_target_platforms(env): got = get_whl_flag_versions( aliases = [ whl_alias( @@ -534,7 +534,7 @@ def _test_target_platforms_from_alias_target_platforms(env): version = "3.3", filename = "foo-0.0.0-py3-none-any.whl", target_platforms = [ - "linux_x86_64", + "cp33_linux_x86_64", ], ), ], @@ -548,7 +548,7 @@ def _test_target_platforms_from_alias_target_platforms(env): } env.expect.that_dict(got).contains_exactly(want) -_tests.append(_test_target_platforms_from_alias_target_platforms) +_tests.append(_test_get_flag_versions_from_alias_target_platforms) def _test_config_settings( env, @@ -820,8 +820,8 @@ def _test_multiplatform_whl_aliases_filename(env): filename = "foo-0.0.2-py3-none-any.whl", version = "3.1", target_platforms = [ - "linux_x86_64", - "linux_aarch64", + "cp31_linux_x86_64", + "cp31_linux_aarch64", ], ), ] diff --git a/tests/pypi/requirements_files_by_platform/BUILD.bazel b/tests/pypi/requirements_files_by_platform/BUILD.bazel new file mode 100644 index 0000000000..d78d459f59 --- /dev/null +++ b/tests/pypi/requirements_files_by_platform/BUILD.bazel @@ -0,0 +1,3 @@ +load(":requirements_files_by_platform_tests.bzl", "requirements_files_by_platform_test_suite") + +requirements_files_by_platform_test_suite(name = "requirements_files_by_platform_tests") diff --git a/tests/pypi/requirements_files_by_platform/requirements_files_by_platform_tests.bzl b/tests/pypi/requirements_files_by_platform/requirements_files_by_platform_tests.bzl new file mode 100644 index 0000000000..b729b0eaf0 --- /dev/null +++ b/tests/pypi/requirements_files_by_platform/requirements_files_by_platform_tests.bzl @@ -0,0 +1,205 @@ +# 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:requirements_files_by_platform.bzl", "requirements_files_by_platform") # buildifier: disable=bzl-visibility + +_tests = [] + +def _test_fail_no_requirements(env): + errors = [] + requirements_files_by_platform( + fail_fn = errors.append, + ) + env.expect.that_str(errors[0]).equals("""\ +A 'requirements_lock' attribute must be specified, a platform-specific lockfiles via 'requirements_by_platform' or an os-specific lockfiles must be specified via 'requirements_*' attributes""") + +_tests.append(_test_fail_no_requirements) + +def _test_fail_duplicate_platforms(env): + errors = [] + requirements_files_by_platform( + requirements_by_platform = { + "requirements_linux": "linux_x86_64", + "requirements_lock": "*", + }, + fail_fn = errors.append, + ) + env.expect.that_collection(errors).has_size(1) + env.expect.that_str(",".join(errors)).equals("Expected the platform 'linux_x86_64' to be map only to a single requirements file, but got multiple: 'requirements_linux', 'requirements_lock'") + +_tests.append(_test_fail_duplicate_platforms) + +def _test_fail_download_only_bad_attr(env): + errors = [] + requirements_files_by_platform( + requirements_linux = "requirements_linux", + requirements_osx = "requirements_osx", + extra_pip_args = [ + "--platform", + "manylinux_2_27_x86_64", + "--platform=manylinux_2_12_x86_64", + "--platform manylinux_2_5_x86_64", + ], + fail_fn = errors.append, + ) + env.expect.that_str(errors[0]).equals("only a single 'requirements_lock' file can be used when using '--platform' pip argument, consider specifying it via 'requirements_lock' attribute") + +_tests.append(_test_fail_download_only_bad_attr) + +def _test_simple(env): + for got in [ + requirements_files_by_platform( + requirements_lock = "requirements_lock", + ), + requirements_files_by_platform( + requirements_by_platform = { + "requirements_lock": "*", + }, + ), + ]: + env.expect.that_dict(got).contains_exactly({ + "requirements_lock": [ + "linux_aarch64", + "linux_arm", + "linux_ppc", + "linux_s390x", + "linux_x86_64", + "osx_aarch64", + "osx_x86_64", + "windows_x86_64", + ], + }) + +_tests.append(_test_simple) + +def _test_simple_with_python_version(env): + for got in [ + requirements_files_by_platform( + requirements_lock = "requirements_lock", + python_version = "3.11", + ), + requirements_files_by_platform( + requirements_by_platform = { + "requirements_lock": "*", + }, + python_version = "3.11", + ), + # TODO @aignas 2024-07-15: consider supporting this way of specifying + # the requirements without the need of the `python_version` attribute + # setting. However, this might need more tweaks, hence only leaving a + # comment in the test. + # requirements_files_by_platform( + # requirements_by_platform = { + # "requirements_lock": "cp311_*", + # }, + # ), + ]: + env.expect.that_dict(got).contains_exactly({ + "requirements_lock": [ + "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", + ], + }) + +_tests.append(_test_simple_with_python_version) + +def _test_multi_os(env): + for got in [ + requirements_files_by_platform( + requirements_linux = "requirements_linux", + requirements_osx = "requirements_osx", + requirements_windows = "requirements_windows", + ), + requirements_files_by_platform( + requirements_by_platform = { + "requirements_linux": "linux_*", + "requirements_osx": "osx_*", + "requirements_windows": "windows_*", + }, + ), + ]: + env.expect.that_dict(got).contains_exactly({ + "requirements_linux": [ + "linux_aarch64", + "linux_arm", + "linux_ppc", + "linux_s390x", + "linux_x86_64", + ], + "requirements_osx": [ + "osx_aarch64", + "osx_x86_64", + ], + "requirements_windows": [ + "windows_x86_64", + ], + }) + +_tests.append(_test_multi_os) + +def _test_multi_os_download_only_platform(env): + got = requirements_files_by_platform( + requirements_lock = "requirements_linux", + extra_pip_args = [ + "--platform", + "manylinux_2_27_x86_64", + "--platform=manylinux_2_12_x86_64", + "--platform manylinux_2_5_x86_64", + ], + ) + env.expect.that_dict(got).contains_exactly({ + "requirements_linux": ["linux_x86_64"], + }) + +_tests.append(_test_multi_os_download_only_platform) + +def _test_os_arch_requirements_with_default(env): + got = requirements_files_by_platform( + requirements_by_platform = { + "requirements_exotic": "linux_super_exotic", + "requirements_linux": "linux_x86_64,linux_aarch64", + }, + requirements_lock = "requirements_lock", + ) + env.expect.that_dict(got).contains_exactly({ + "requirements_exotic": ["linux_super_exotic"], + "requirements_linux": ["linux_x86_64", "linux_aarch64"], + "requirements_lock": [ + "linux_arm", + "linux_ppc", + "linux_s390x", + "osx_aarch64", + "osx_x86_64", + "windows_x86_64", + ], + }) + +_tests.append(_test_os_arch_requirements_with_default) + +def requirements_files_by_platform_test_suite(name): + """Create the test suite. + + Args: + name: the name of the test suite + """ + test_suite(name = name, basic_tests = _tests) From bf704297d85cdcf2338715a6f8411e49a679da16 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:56:14 +0900 Subject: [PATCH 126/345] refactor(pypi): split out code for env marker evaluation for reuse (#2068) This is just a small PR to reduce the scope of #2059. This just moves some code from one python file to a separate one. Work towards #260, #1105, #1868. --- python/private/pypi/whl_installer/BUILD.bazel | 1 + .../private/pypi/whl_installer/arguments.py | 4 +- python/private/pypi/whl_installer/platform.py | 302 ++++++++++++++++++ python/private/pypi/whl_installer/wheel.py | 289 +---------------- tests/pypi/whl_installer/BUILD.bazel | 12 + tests/pypi/whl_installer/platform_test.py | 152 +++++++++ tests/pypi/whl_installer/wheel_test.py | 232 ++------------ 7 files changed, 509 insertions(+), 483 deletions(-) create mode 100644 python/private/pypi/whl_installer/platform.py create mode 100644 tests/pypi/whl_installer/platform_test.py diff --git a/python/private/pypi/whl_installer/BUILD.bazel b/python/private/pypi/whl_installer/BUILD.bazel index fc9c0e62b2..5bce1a5bcc 100644 --- a/python/private/pypi/whl_installer/BUILD.bazel +++ b/python/private/pypi/whl_installer/BUILD.bazel @@ -5,6 +5,7 @@ py_library( srcs = [ "arguments.py", "namespace_pkgs.py", + "platform.py", "wheel.py", "wheel_installer.py", ], diff --git a/python/private/pypi/whl_installer/arguments.py b/python/private/pypi/whl_installer/arguments.py index 173d3a39a3..29bea8026e 100644 --- a/python/private/pypi/whl_installer/arguments.py +++ b/python/private/pypi/whl_installer/arguments.py @@ -17,7 +17,7 @@ import pathlib from typing import Any, Dict, Set -from python.private.pypi.whl_installer import wheel +from python.private.pypi.whl_installer.platform import Platform def parser(**kwargs: Any) -> argparse.ArgumentParser: @@ -44,7 +44,7 @@ def parser(**kwargs: Any) -> argparse.ArgumentParser: parser.add_argument( "--platform", action="extend", - type=wheel.Platform.from_string, + type=Platform.from_string, help="Platforms to target dependencies. Can be used multiple times.", ) parser.add_argument( diff --git a/python/private/pypi/whl_installer/platform.py b/python/private/pypi/whl_installer/platform.py new file mode 100644 index 0000000000..83e42b0e46 --- /dev/null +++ b/python/private/pypi/whl_installer/platform.py @@ -0,0 +1,302 @@ +# 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. + +"""Utility class to inspect an extracted wheel directory""" + +import platform +import sys +from dataclasses import dataclass +from enum import Enum +from typing import Any, Dict, Iterator, List, Optional, Union + + +class OS(Enum): + linux = 1 + osx = 2 + windows = 3 + darwin = osx + win32 = windows + + @classmethod + def interpreter(cls) -> "OS": + "Return the interpreter operating system." + return cls[sys.platform.lower()] + + def __str__(self) -> str: + return self.name.lower() + + +class Arch(Enum): + x86_64 = 1 + x86_32 = 2 + aarch64 = 3 + ppc = 4 + s390x = 5 + arm = 6 + amd64 = x86_64 + arm64 = aarch64 + i386 = x86_32 + i686 = x86_32 + x86 = x86_32 + ppc64le = ppc + + @classmethod + def interpreter(cls) -> "Arch": + "Return the currently running interpreter architecture." + # FIXME @aignas 2023-12-13: Hermetic toolchain on Windows 3.11.6 + # is returning an empty string here, so lets default to x86_64 + return cls[platform.machine().lower() or "x86_64"] + + def __str__(self) -> str: + return self.name.lower() + + +def _as_int(value: Optional[Union[OS, Arch]]) -> int: + """Convert one of the enums above to an int for easier sorting algorithms. + + Args: + value: The value of an enum or None. + + Returns: + -1 if we get None, otherwise, the numeric value of the given enum. + """ + if value is None: + return -1 + + return int(value.value) + + +def host_interpreter_minor_version() -> int: + return sys.version_info.minor + + +@dataclass(frozen=True) +class Platform: + os: Optional[OS] = None + arch: Optional[Arch] = None + minor_version: Optional[int] = None + + @classmethod + def all( + cls, + want_os: Optional[OS] = None, + minor_version: Optional[int] = None, + ) -> List["Platform"]: + return sorted( + [ + cls(os=os, arch=arch, minor_version=minor_version) + for os in OS + for arch in Arch + if not want_os or want_os == os + ] + ) + + @classmethod + def host(cls) -> List["Platform"]: + """Use the Python interpreter to detect the platform. + + We extract `os` from sys.platform and `arch` from platform.machine + + Returns: + A list of parsed values which makes the signature the same as + `Platform.all` and `Platform.from_string`. + """ + return [ + Platform( + os=OS.interpreter(), + arch=Arch.interpreter(), + minor_version=host_interpreter_minor_version(), + ) + ] + + def all_specializations(self) -> Iterator["Platform"]: + """Return the platform itself and all its unambiguous specializations. + + For more info about specializations see + https://bazel.build/docs/configurable-attributes + """ + yield self + if self.arch is None: + for arch in Arch: + yield Platform(os=self.os, arch=arch, minor_version=self.minor_version) + if self.os is None: + for os in OS: + yield Platform(os=os, arch=self.arch, minor_version=self.minor_version) + if self.arch is None and self.os is None: + for os in OS: + for arch in Arch: + yield Platform(os=os, arch=arch, minor_version=self.minor_version) + + def __lt__(self, other: Any) -> bool: + """Add a comparison method, so that `sorted` returns the most specialized platforms first.""" + if not isinstance(other, Platform) or other is None: + raise ValueError(f"cannot compare {other} with Platform") + + self_arch, self_os = _as_int(self.arch), _as_int(self.os) + other_arch, other_os = _as_int(other.arch), _as_int(other.os) + + if self_os == other_os: + return self_arch < other_arch + else: + return self_os < other_os + + def __str__(self) -> str: + if self.minor_version is None: + if self.os is None and self.arch is None: + return "//conditions:default" + + if self.arch is None: + return f"@platforms//os:{self.os}" + else: + return f"{self.os}_{self.arch}" + + if self.arch is None and self.os is None: + return f"@//python/config_settings:is_python_3.{self.minor_version}" + + if self.arch is None: + return f"cp3{self.minor_version}_{self.os}_anyarch" + + if self.os is None: + return f"cp3{self.minor_version}_anyos_{self.arch}" + + return f"cp3{self.minor_version}_{self.os}_{self.arch}" + + @classmethod + def from_string(cls, platform: Union[str, List[str]]) -> List["Platform"]: + """Parse a string and return a list of platforms""" + platform = [platform] if isinstance(platform, str) else list(platform) + ret = set() + for p in platform: + if p == "host": + ret.update(cls.host()) + continue + + abi, _, tail = p.partition("_") + if not abi.startswith("cp"): + # The first item is not an abi + tail = p + abi = "" + os, _, arch = tail.partition("_") + arch = arch or "*" + + minor_version = int(abi[len("cp3") :]) if abi else None + + if arch != "*": + ret.add( + cls( + os=OS[os] if os != "*" else None, + arch=Arch[arch], + minor_version=minor_version, + ) + ) + + else: + ret.update( + cls.all( + want_os=OS[os] if os != "*" else None, + minor_version=minor_version, + ) + ) + + return sorted(ret) + + # NOTE @aignas 2023-12-05: below is the minimum number of accessors that are defined in + # https://peps.python.org/pep-0496/ to make rules_python generate dependencies. + # + # WARNING: It may not work in cases where the python implementation is different between + # different platforms. + + # derived from OS + @property + def os_name(self) -> str: + if self.os == OS.linux or self.os == OS.osx: + return "posix" + elif self.os == OS.windows: + return "nt" + else: + return "" + + @property + def sys_platform(self) -> str: + if self.os == OS.linux: + return "linux" + elif self.os == OS.osx: + return "darwin" + elif self.os == OS.windows: + return "win32" + else: + return "" + + @property + def platform_system(self) -> str: + if self.os == OS.linux: + return "Linux" + elif self.os == OS.osx: + return "Darwin" + elif self.os == OS.windows: + return "Windows" + else: + return "" + + # derived from OS and Arch + @property + def platform_machine(self) -> str: + """Guess the target 'platform_machine' marker. + + NOTE @aignas 2023-12-05: this may not work on really new systems, like + Windows if they define the platform markers in a different way. + """ + if self.arch == Arch.x86_64: + return "x86_64" + elif self.arch == Arch.x86_32 and self.os != OS.osx: + return "i386" + elif self.arch == Arch.x86_32: + return "" + elif self.arch == Arch.aarch64 and self.os == OS.linux: + return "aarch64" + elif self.arch == Arch.aarch64: + # Assuming that OSX and Windows use this one since the precedent is set here: + # https://github.com/cgohlke/win_arm64-wheels + return "arm64" + elif self.os != OS.linux: + return "" + elif self.arch == Arch.ppc64le: + return "ppc64le" + elif self.arch == Arch.s390x: + return "s390x" + else: + return "" + + def env_markers(self, extra: str) -> Dict[str, str]: + # If it is None, use the host version + minor_version = self.minor_version or host_interpreter_minor_version() + + return { + "extra": extra, + "os_name": self.os_name, + "sys_platform": self.sys_platform, + "platform_machine": self.platform_machine, + "platform_system": self.platform_system, + "platform_release": "", # unset + "platform_version": "", # unset + "python_version": f"3.{minor_version}", + # FIXME @aignas 2024-01-14: is putting zero last a good idea? Maybe we should + # use `20` or something else to avoid having weird issues where the full version is used for + # matching and the author decides to only support 3.y.5 upwards. + "implementation_version": f"3.{minor_version}.0", + "python_full_version": f"3.{minor_version}.0", + # we assume that the following are the same as the interpreter used to setup the deps: + # "implementation_name": "cpython" + # "platform_python_implementation: "CPython", + } diff --git a/python/private/pypi/whl_installer/wheel.py b/python/private/pypi/whl_installer/wheel.py index c167df9193..0f6bd27cdd 100644 --- a/python/private/pypi/whl_installer/wheel.py +++ b/python/private/pypi/whl_installer/wheel.py @@ -15,299 +15,20 @@ """Utility class to inspect an extracted wheel directory""" import email -import platform import re -import sys from collections import defaultdict from dataclasses import dataclass -from enum import Enum from pathlib import Path -from typing import Any, Dict, Iterator, List, Optional, Set, Tuple, Union +from typing import Dict, List, Optional, Set, Tuple import installer from packaging.requirements import Requirement from pip._vendor.packaging.utils import canonicalize_name - -class OS(Enum): - linux = 1 - osx = 2 - windows = 3 - darwin = osx - win32 = windows - - @classmethod - def interpreter(cls) -> "OS": - "Return the interpreter operating system." - return cls[sys.platform.lower()] - - def __str__(self) -> str: - return self.name.lower() - - -class Arch(Enum): - x86_64 = 1 - x86_32 = 2 - aarch64 = 3 - ppc = 4 - s390x = 5 - arm = 6 - amd64 = x86_64 - arm64 = aarch64 - i386 = x86_32 - i686 = x86_32 - x86 = x86_32 - ppc64le = ppc - - @classmethod - def interpreter(cls) -> "Arch": - "Return the currently running interpreter architecture." - # FIXME @aignas 2023-12-13: Hermetic toolchain on Windows 3.11.6 - # is returning an empty string here, so lets default to x86_64 - return cls[platform.machine().lower() or "x86_64"] - - def __str__(self) -> str: - return self.name.lower() - - -def _as_int(value: Optional[Union[OS, Arch]]) -> int: - """Convert one of the enums above to an int for easier sorting algorithms. - - Args: - value: The value of an enum or None. - - Returns: - -1 if we get None, otherwise, the numeric value of the given enum. - """ - if value is None: - return -1 - - return int(value.value) - - -def host_interpreter_minor_version() -> int: - return sys.version_info.minor - - -@dataclass(frozen=True) -class Platform: - os: Optional[OS] = None - arch: Optional[Arch] = None - minor_version: Optional[int] = None - - @classmethod - def all( - cls, - want_os: Optional[OS] = None, - minor_version: Optional[int] = None, - ) -> List["Platform"]: - return sorted( - [ - cls(os=os, arch=arch, minor_version=minor_version) - for os in OS - for arch in Arch - if not want_os or want_os == os - ] - ) - - @classmethod - def host(cls) -> List["Platform"]: - """Use the Python interpreter to detect the platform. - - We extract `os` from sys.platform and `arch` from platform.machine - - Returns: - A list of parsed values which makes the signature the same as - `Platform.all` and `Platform.from_string`. - """ - return [ - Platform( - os=OS.interpreter(), - arch=Arch.interpreter(), - minor_version=host_interpreter_minor_version(), - ) - ] - - def all_specializations(self) -> Iterator["Platform"]: - """Return the platform itself and all its unambiguous specializations. - - For more info about specializations see - https://bazel.build/docs/configurable-attributes - """ - yield self - if self.arch is None: - for arch in Arch: - yield Platform(os=self.os, arch=arch, minor_version=self.minor_version) - if self.os is None: - for os in OS: - yield Platform(os=os, arch=self.arch, minor_version=self.minor_version) - if self.arch is None and self.os is None: - for os in OS: - for arch in Arch: - yield Platform(os=os, arch=arch, minor_version=self.minor_version) - - def __lt__(self, other: Any) -> bool: - """Add a comparison method, so that `sorted` returns the most specialized platforms first.""" - if not isinstance(other, Platform) or other is None: - raise ValueError(f"cannot compare {other} with Platform") - - self_arch, self_os = _as_int(self.arch), _as_int(self.os) - other_arch, other_os = _as_int(other.arch), _as_int(other.os) - - if self_os == other_os: - return self_arch < other_arch - else: - return self_os < other_os - - def __str__(self) -> str: - if self.minor_version is None: - if self.os is None and self.arch is None: - return "//conditions:default" - - if self.arch is None: - return f"@platforms//os:{self.os}" - else: - return f"{self.os}_{self.arch}" - - if self.arch is None and self.os is None: - return f"@//python/config_settings:is_python_3.{self.minor_version}" - - if self.arch is None: - return f"cp3{self.minor_version}_{self.os}_anyarch" - - if self.os is None: - return f"cp3{self.minor_version}_anyos_{self.arch}" - - return f"cp3{self.minor_version}_{self.os}_{self.arch}" - - @classmethod - def from_string(cls, platform: Union[str, List[str]]) -> List["Platform"]: - """Parse a string and return a list of platforms""" - platform = [platform] if isinstance(platform, str) else list(platform) - ret = set() - for p in platform: - if p == "host": - ret.update(cls.host()) - continue - - abi, _, tail = p.partition("_") - if not abi.startswith("cp"): - # The first item is not an abi - tail = p - abi = "" - os, _, arch = tail.partition("_") - arch = arch or "*" - - minor_version = int(abi[len("cp3") :]) if abi else None - - if arch != "*": - ret.add( - cls( - os=OS[os] if os != "*" else None, - arch=Arch[arch], - minor_version=minor_version, - ) - ) - - else: - ret.update( - cls.all( - want_os=OS[os] if os != "*" else None, - minor_version=minor_version, - ) - ) - - return sorted(ret) - - # NOTE @aignas 2023-12-05: below is the minimum number of accessors that are defined in - # https://peps.python.org/pep-0496/ to make rules_python generate dependencies. - # - # WARNING: It may not work in cases where the python implementation is different between - # different platforms. - - # derived from OS - @property - def os_name(self) -> str: - if self.os == OS.linux or self.os == OS.osx: - return "posix" - elif self.os == OS.windows: - return "nt" - else: - return "" - - @property - def sys_platform(self) -> str: - if self.os == OS.linux: - return "linux" - elif self.os == OS.osx: - return "darwin" - elif self.os == OS.windows: - return "win32" - else: - return "" - - @property - def platform_system(self) -> str: - if self.os == OS.linux: - return "Linux" - elif self.os == OS.osx: - return "Darwin" - elif self.os == OS.windows: - return "Windows" - else: - return "" - - # derived from OS and Arch - @property - def platform_machine(self) -> str: - """Guess the target 'platform_machine' marker. - - NOTE @aignas 2023-12-05: this may not work on really new systems, like - Windows if they define the platform markers in a different way. - """ - if self.arch == Arch.x86_64: - return "x86_64" - elif self.arch == Arch.x86_32 and self.os != OS.osx: - return "i386" - elif self.arch == Arch.x86_32: - return "" - elif self.arch == Arch.aarch64 and self.os == OS.linux: - return "aarch64" - elif self.arch == Arch.aarch64: - # Assuming that OSX and Windows use this one since the precedent is set here: - # https://github.com/cgohlke/win_arm64-wheels - return "arm64" - elif self.os != OS.linux: - return "" - elif self.arch == Arch.ppc64le: - return "ppc64le" - elif self.arch == Arch.s390x: - return "s390x" - else: - return "" - - def env_markers(self, extra: str) -> Dict[str, str]: - # If it is None, use the host version - minor_version = self.minor_version or host_interpreter_minor_version() - - return { - "extra": extra, - "os_name": self.os_name, - "sys_platform": self.sys_platform, - "platform_machine": self.platform_machine, - "platform_system": self.platform_system, - "platform_release": "", # unset - "platform_version": "", # unset - "python_version": f"3.{minor_version}", - # FIXME @aignas 2024-01-14: is putting zero last a good idea? Maybe we should - # use `20` or something else to avoid having weird issues where the full version is used for - # matching and the author decides to only support 3.y.5 upwards. - "implementation_version": f"3.{minor_version}.0", - "python_full_version": f"3.{minor_version}.0", - # we assume that the following are the same as the interpreter used to setup the deps: - # "implementation_name": "cpython" - # "platform_python_implementation: "CPython", - } +from python.private.pypi.whl_installer.platform import ( + Platform, + host_interpreter_minor_version, +) @dataclass(frozen=True) diff --git a/tests/pypi/whl_installer/BUILD.bazel b/tests/pypi/whl_installer/BUILD.bazel index 048a877b65..e25c4a06a4 100644 --- a/tests/pypi/whl_installer/BUILD.bazel +++ b/tests/pypi/whl_installer/BUILD.bazel @@ -27,6 +27,18 @@ py_test( ], ) +py_test( + name = "platform_test", + size = "small", + srcs = [ + "platform_test.py", + ], + data = ["//examples/wheel:minimal_with_py_package"], + deps = [ + ":lib", + ], +) + py_test( name = "wheel_installer_test", size = "small", diff --git a/tests/pypi/whl_installer/platform_test.py b/tests/pypi/whl_installer/platform_test.py new file mode 100644 index 0000000000..7ced1e9826 --- /dev/null +++ b/tests/pypi/whl_installer/platform_test.py @@ -0,0 +1,152 @@ +import unittest +from random import shuffle + +from python.private.pypi.whl_installer.platform import ( + OS, + Arch, + Platform, + host_interpreter_minor_version, +) + + +class MinorVersionTest(unittest.TestCase): + def test_host(self): + host = host_interpreter_minor_version() + self.assertIsNotNone(host) + + +class PlatformTest(unittest.TestCase): + def test_can_get_host(self): + host = Platform.host() + self.assertIsNotNone(host) + self.assertEqual(1, len(Platform.from_string("host"))) + self.assertEqual(host, Platform.from_string("host")) + + def test_can_get_linux_x86_64_without_py_version(self): + got = Platform.from_string("linux_x86_64") + want = Platform(os=OS.linux, arch=Arch.x86_64) + self.assertEqual(want, got[0]) + + def test_can_get_specific_from_string(self): + got = Platform.from_string("cp33_linux_x86_64") + want = Platform(os=OS.linux, arch=Arch.x86_64, minor_version=3) + self.assertEqual(want, got[0]) + + def test_can_get_all_for_py_version(self): + cp39 = Platform.all(minor_version=9) + self.assertEqual(18, len(cp39), f"Got {cp39}") + self.assertEqual(cp39, Platform.from_string("cp39_*")) + + def test_can_get_all_for_os(self): + linuxes = Platform.all(OS.linux, minor_version=9) + self.assertEqual(6, len(linuxes)) + self.assertEqual(linuxes, Platform.from_string("cp39_linux_*")) + + def test_can_get_all_for_os_for_host_python(self): + linuxes = Platform.all(OS.linux) + self.assertEqual(6, len(linuxes)) + self.assertEqual(linuxes, Platform.from_string("linux_*")) + + def test_specific_version_specializations(self): + any_py33 = Platform(minor_version=3) + + # When + all_specializations = list(any_py33.all_specializations()) + + want = ( + [any_py33] + + [ + Platform(arch=arch, minor_version=any_py33.minor_version) + for arch in Arch + ] + + [Platform(os=os, minor_version=any_py33.minor_version) for os in OS] + + Platform.all(minor_version=any_py33.minor_version) + ) + self.assertEqual(want, all_specializations) + + def test_aarch64_specializations(self): + any_aarch64 = Platform(arch=Arch.aarch64) + all_specializations = list(any_aarch64.all_specializations()) + want = [ + Platform(os=None, arch=Arch.aarch64), + Platform(os=OS.linux, arch=Arch.aarch64), + Platform(os=OS.osx, arch=Arch.aarch64), + Platform(os=OS.windows, arch=Arch.aarch64), + ] + self.assertEqual(want, all_specializations) + + def test_linux_specializations(self): + any_linux = Platform(os=OS.linux) + all_specializations = list(any_linux.all_specializations()) + want = [ + Platform(os=OS.linux, arch=None), + Platform(os=OS.linux, arch=Arch.x86_64), + Platform(os=OS.linux, arch=Arch.x86_32), + Platform(os=OS.linux, arch=Arch.aarch64), + Platform(os=OS.linux, arch=Arch.ppc), + Platform(os=OS.linux, arch=Arch.s390x), + Platform(os=OS.linux, arch=Arch.arm), + ] + self.assertEqual(want, all_specializations) + + def test_osx_specializations(self): + any_osx = Platform(os=OS.osx) + all_specializations = list(any_osx.all_specializations()) + # NOTE @aignas 2024-01-14: even though in practice we would only have + # Python on osx aarch64 and osx x86_64, we return all arch posibilities + # to make the code simpler. + want = [ + Platform(os=OS.osx, arch=None), + Platform(os=OS.osx, arch=Arch.x86_64), + Platform(os=OS.osx, arch=Arch.x86_32), + Platform(os=OS.osx, arch=Arch.aarch64), + Platform(os=OS.osx, arch=Arch.ppc), + Platform(os=OS.osx, arch=Arch.s390x), + Platform(os=OS.osx, arch=Arch.arm), + ] + self.assertEqual(want, all_specializations) + + def test_platform_sort(self): + platforms = [ + Platform(os=OS.linux, arch=None), + Platform(os=OS.linux, arch=Arch.x86_64), + Platform(os=OS.osx, arch=None), + Platform(os=OS.osx, arch=Arch.x86_64), + Platform(os=OS.osx, arch=Arch.aarch64), + ] + shuffle(platforms) + platforms.sort() + want = [ + Platform(os=OS.linux, arch=None), + Platform(os=OS.linux, arch=Arch.x86_64), + Platform(os=OS.osx, arch=None), + Platform(os=OS.osx, arch=Arch.x86_64), + Platform(os=OS.osx, arch=Arch.aarch64), + ] + + self.assertEqual(want, platforms) + + def test_wheel_os_alias(self): + self.assertEqual("osx", str(OS.osx)) + self.assertEqual(str(OS.darwin), str(OS.osx)) + + def test_wheel_arch_alias(self): + self.assertEqual("x86_64", str(Arch.x86_64)) + self.assertEqual(str(Arch.amd64), str(Arch.x86_64)) + + def test_wheel_platform_alias(self): + give = Platform( + os=OS.darwin, + arch=Arch.amd64, + ) + alias = Platform( + os=OS.osx, + arch=Arch.x86_64, + ) + + self.assertEqual("osx_x86_64", str(give)) + self.assertEqual(str(alias), str(give)) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/pypi/whl_installer/wheel_test.py b/tests/pypi/whl_installer/wheel_test.py index 76bfe720bc..404218e12b 100644 --- a/tests/pypi/whl_installer/wheel_test.py +++ b/tests/pypi/whl_installer/wheel_test.py @@ -1,8 +1,12 @@ import unittest -from random import shuffle from unittest import mock from python.private.pypi.whl_installer import wheel +from python.private.pypi.whl_installer.platform import OS, Arch, Platform + +_HOST_INTERPRETER_FN = ( + "python.private.pypi.whl_installer.wheel.host_interpreter_minor_version" +) class DepsTest(unittest.TestCase): @@ -25,10 +29,10 @@ def test_can_add_os_specific_deps(self): "win_dep; os_name=='nt'", ], platforms={ - wheel.Platform(os=wheel.OS.linux, arch=wheel.Arch.x86_64), - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.x86_64), - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.aarch64), - wheel.Platform(os=wheel.OS.windows, arch=wheel.Arch.x86_64), + Platform(os=OS.linux, arch=Arch.x86_64), + Platform(os=OS.osx, arch=Arch.x86_64), + Platform(os=OS.osx, arch=Arch.aarch64), + Platform(os=OS.windows, arch=Arch.x86_64), }, ) @@ -54,18 +58,10 @@ def test_can_add_os_specific_deps_with_specific_python_version(self): "win_dep; os_name=='nt'", ], platforms={ - wheel.Platform( - os=wheel.OS.linux, arch=wheel.Arch.x86_64, minor_version=8 - ), - wheel.Platform( - os=wheel.OS.osx, arch=wheel.Arch.x86_64, minor_version=8 - ), - wheel.Platform( - os=wheel.OS.osx, arch=wheel.Arch.aarch64, minor_version=8 - ), - wheel.Platform( - os=wheel.OS.windows, arch=wheel.Arch.x86_64, minor_version=8 - ), + Platform(os=OS.linux, arch=Arch.x86_64, minor_version=8), + Platform(os=OS.osx, arch=Arch.x86_64, minor_version=8), + Platform(os=OS.osx, arch=Arch.aarch64, minor_version=8), + Platform(os=OS.windows, arch=Arch.x86_64, minor_version=8), }, ) @@ -89,8 +85,8 @@ def test_deps_are_added_to_more_specialized_platforms(self): "mac_dep; sys_platform=='darwin'", ], platforms={ - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.x86_64), - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.aarch64), + Platform(os=OS.osx, arch=Arch.x86_64), + Platform(os=OS.osx, arch=Arch.aarch64), }, ).build() @@ -113,8 +109,8 @@ def test_deps_from_more_specialized_platforms_are_propagated(self): "m1_dep; sys_platform=='darwin' and platform_machine=='arm64'", ], platforms={ - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.x86_64), - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.aarch64), + Platform(os=OS.osx, arch=Arch.x86_64), + Platform(os=OS.osx, arch=Arch.aarch64), }, ).build() @@ -136,10 +132,10 @@ def test_non_platform_markers_are_added_to_common_deps(self): "m1_dep; sys_platform=='darwin' and platform_machine=='arm64'", ], platforms={ - wheel.Platform(os=wheel.OS.linux, arch=wheel.Arch.x86_64), - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.x86_64), - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.aarch64), - wheel.Platform(os=wheel.OS.windows, arch=wheel.Arch.x86_64), + Platform(os=OS.linux, arch=Arch.x86_64), + Platform(os=OS.osx, arch=Arch.x86_64), + Platform(os=OS.osx, arch=Arch.aarch64), + Platform(os=OS.windows, arch=Arch.x86_64), }, ).build() @@ -197,18 +193,14 @@ def test_can_get_deps_based_on_specific_python_version(self): "foo", requires_dist=requires_dist, platforms=[ - wheel.Platform( - os=wheel.OS.linux, arch=wheel.Arch.x86_64, minor_version=8 - ), + Platform(os=OS.linux, arch=Arch.x86_64, minor_version=8), ], ).build() py37_deps = wheel.Deps( "foo", requires_dist=requires_dist, platforms=[ - wheel.Platform( - os=wheel.OS.linux, arch=wheel.Arch.x86_64, minor_version=7 - ), + Platform(os=OS.linux, arch=Arch.x86_64, minor_version=7), ], ).build() @@ -217,9 +209,7 @@ def test_can_get_deps_based_on_specific_python_version(self): self.assertEqual(["bar"], py38_deps.deps) self.assertEqual({"@platforms//os:linux": ["posix_dep"]}, py38_deps.deps_select) - @mock.patch( - "python.private.pypi.whl_installer.wheel.host_interpreter_minor_version" - ) + @mock.patch(_HOST_INTERPRETER_FN) def test_no_version_select_when_single_version(self, mock_host_interpreter_version): requires_dist = [ "bar", @@ -236,9 +226,9 @@ def test_no_version_select_when_single_version(self, mock_host_interpreter_versi "foo", requires_dist=requires_dist, platforms=[ - wheel.Platform(os=os, arch=wheel.Arch.x86_64, minor_version=minor) + Platform(os=os, arch=Arch.x86_64, minor_version=minor) for minor in [8] - for os in [wheel.OS.linux, wheel.OS.windows] + for os in [OS.linux, OS.windows] ], ) got = deps.build() @@ -253,9 +243,7 @@ def test_no_version_select_when_single_version(self, mock_host_interpreter_versi got.deps_select, ) - @mock.patch( - "python.private.pypi.whl_installer.wheel.host_interpreter_minor_version" - ) + @mock.patch(_HOST_INTERPRETER_FN) def test_can_get_version_select(self, mock_host_interpreter_version): requires_dist = [ "bar", @@ -273,9 +261,9 @@ def test_can_get_version_select(self, mock_host_interpreter_version): "foo", requires_dist=requires_dist, platforms=[ - wheel.Platform(os=os, arch=wheel.Arch.x86_64, minor_version=minor) + Platform(os=os, arch=Arch.x86_64, minor_version=minor) for minor in [7, 8, 9] - for os in [wheel.OS.linux, wheel.OS.windows] + for os in [OS.linux, OS.windows] ], ) got = deps.build() @@ -307,9 +295,7 @@ def test_can_get_version_select(self, mock_host_interpreter_version): got.deps_select, ) - @mock.patch( - "python.private.pypi.whl_installer.wheel.host_interpreter_minor_version" - ) + @mock.patch(_HOST_INTERPRETER_FN) def test_deps_spanning_all_target_py_versions_are_added_to_common( self, mock_host_version ): @@ -323,16 +309,14 @@ def test_deps_spanning_all_target_py_versions_are_added_to_common( deps = wheel.Deps( "foo", requires_dist=requires_dist, - platforms=wheel.Platform.from_string(["cp37_*", "cp38_*", "cp39_*"]), + platforms=Platform.from_string(["cp37_*", "cp38_*", "cp39_*"]), ) got = deps.build() self.assertEqual(["bar", "baz"], got.deps) self.assertEqual({}, got.deps_select) - @mock.patch( - "python.private.pypi.whl_installer.wheel.host_interpreter_minor_version" - ) + @mock.patch(_HOST_INTERPRETER_FN) def test_deps_are_not_duplicated(self, mock_host_version): mock_host_version.return_value = 7 @@ -352,16 +336,14 @@ def test_deps_are_not_duplicated(self, mock_host_version): deps = wheel.Deps( "foo", requires_dist=requires_dist, - platforms=wheel.Platform.from_string(["cp37_*", "cp310_*"]), + platforms=Platform.from_string(["cp37_*", "cp310_*"]), ) got = deps.build() self.assertEqual(["bar"], got.deps) self.assertEqual({}, got.deps_select) - @mock.patch( - "python.private.pypi.whl_installer.wheel.host_interpreter_minor_version" - ) + @mock.patch(_HOST_INTERPRETER_FN) def test_deps_are_not_duplicated_when_encountering_platform_dep_first( self, mock_host_version ): @@ -377,7 +359,7 @@ def test_deps_are_not_duplicated_when_encountering_platform_dep_first( deps = wheel.Deps( "foo", requires_dist=requires_dist, - platforms=wheel.Platform.from_string(["cp37_*", "cp310_*"]), + platforms=Platform.from_string(["cp37_*", "cp310_*"]), ) got = deps.build() @@ -385,149 +367,5 @@ def test_deps_are_not_duplicated_when_encountering_platform_dep_first( self.assertEqual({}, got.deps_select) -class MinorVersionTest(unittest.TestCase): - def test_host(self): - host = wheel.host_interpreter_minor_version() - self.assertIsNotNone(host) - - -class PlatformTest(unittest.TestCase): - def test_can_get_host(self): - host = wheel.Platform.host() - self.assertIsNotNone(host) - self.assertEqual(1, len(wheel.Platform.from_string("host"))) - self.assertEqual(host, wheel.Platform.from_string("host")) - - def test_can_get_linux_x86_64_without_py_version(self): - got = wheel.Platform.from_string("linux_x86_64") - want = wheel.Platform(os=wheel.OS.linux, arch=wheel.Arch.x86_64) - self.assertEqual(want, got[0]) - - def test_can_get_specific_from_string(self): - got = wheel.Platform.from_string("cp33_linux_x86_64") - want = wheel.Platform( - os=wheel.OS.linux, arch=wheel.Arch.x86_64, minor_version=3 - ) - self.assertEqual(want, got[0]) - - def test_can_get_all_for_py_version(self): - cp39 = wheel.Platform.all(minor_version=9) - self.assertEqual(18, len(cp39), f"Got {cp39}") - self.assertEqual(cp39, wheel.Platform.from_string("cp39_*")) - - def test_can_get_all_for_os(self): - linuxes = wheel.Platform.all(wheel.OS.linux, minor_version=9) - self.assertEqual(6, len(linuxes)) - self.assertEqual(linuxes, wheel.Platform.from_string("cp39_linux_*")) - - def test_can_get_all_for_os_for_host_python(self): - linuxes = wheel.Platform.all(wheel.OS.linux) - self.assertEqual(6, len(linuxes)) - self.assertEqual(linuxes, wheel.Platform.from_string("linux_*")) - - def test_specific_version_specializations(self): - any_py33 = wheel.Platform(minor_version=3) - - # When - all_specializations = list(any_py33.all_specializations()) - - want = ( - [any_py33] - + [ - wheel.Platform(arch=arch, minor_version=any_py33.minor_version) - for arch in wheel.Arch - ] - + [ - wheel.Platform(os=os, minor_version=any_py33.minor_version) - for os in wheel.OS - ] - + wheel.Platform.all(minor_version=any_py33.minor_version) - ) - self.assertEqual(want, all_specializations) - - def test_aarch64_specializations(self): - any_aarch64 = wheel.Platform(arch=wheel.Arch.aarch64) - all_specializations = list(any_aarch64.all_specializations()) - want = [ - wheel.Platform(os=None, arch=wheel.Arch.aarch64), - wheel.Platform(os=wheel.OS.linux, arch=wheel.Arch.aarch64), - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.aarch64), - wheel.Platform(os=wheel.OS.windows, arch=wheel.Arch.aarch64), - ] - self.assertEqual(want, all_specializations) - - def test_linux_specializations(self): - any_linux = wheel.Platform(os=wheel.OS.linux) - all_specializations = list(any_linux.all_specializations()) - want = [ - wheel.Platform(os=wheel.OS.linux, arch=None), - wheel.Platform(os=wheel.OS.linux, arch=wheel.Arch.x86_64), - wheel.Platform(os=wheel.OS.linux, arch=wheel.Arch.x86_32), - wheel.Platform(os=wheel.OS.linux, arch=wheel.Arch.aarch64), - wheel.Platform(os=wheel.OS.linux, arch=wheel.Arch.ppc), - wheel.Platform(os=wheel.OS.linux, arch=wheel.Arch.s390x), - wheel.Platform(os=wheel.OS.linux, arch=wheel.Arch.arm), - ] - self.assertEqual(want, all_specializations) - - def test_osx_specializations(self): - any_osx = wheel.Platform(os=wheel.OS.osx) - all_specializations = list(any_osx.all_specializations()) - # NOTE @aignas 2024-01-14: even though in practice we would only have - # Python on osx aarch64 and osx x86_64, we return all arch posibilities - # to make the code simpler. - want = [ - wheel.Platform(os=wheel.OS.osx, arch=None), - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.x86_64), - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.x86_32), - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.aarch64), - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.ppc), - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.s390x), - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.arm), - ] - self.assertEqual(want, all_specializations) - - def test_platform_sort(self): - platforms = [ - wheel.Platform(os=wheel.OS.linux, arch=None), - wheel.Platform(os=wheel.OS.linux, arch=wheel.Arch.x86_64), - wheel.Platform(os=wheel.OS.osx, arch=None), - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.x86_64), - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.aarch64), - ] - shuffle(platforms) - platforms.sort() - want = [ - wheel.Platform(os=wheel.OS.linux, arch=None), - wheel.Platform(os=wheel.OS.linux, arch=wheel.Arch.x86_64), - wheel.Platform(os=wheel.OS.osx, arch=None), - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.x86_64), - wheel.Platform(os=wheel.OS.osx, arch=wheel.Arch.aarch64), - ] - - self.assertEqual(want, platforms) - - def test_wheel_os_alias(self): - self.assertEqual("osx", str(wheel.OS.osx)) - self.assertEqual(str(wheel.OS.darwin), str(wheel.OS.osx)) - - def test_wheel_arch_alias(self): - self.assertEqual("x86_64", str(wheel.Arch.x86_64)) - self.assertEqual(str(wheel.Arch.amd64), str(wheel.Arch.x86_64)) - - def test_wheel_platform_alias(self): - give = wheel.Platform( - os=wheel.OS.darwin, - arch=wheel.Arch.amd64, - ) - alias = wheel.Platform( - os=wheel.OS.osx, - arch=wheel.Arch.x86_64, - ) - - self.assertEqual("osx_x86_64", str(give)) - self.assertEqual(str(alias), str(give)) - - if __name__ == "__main__": unittest.main() From 1f0765debf6534c6ac60b80b2f498809ecbd058b Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 18 Jul 2024 17:11:46 -0700 Subject: [PATCH 127/345] docs: document some environment variables (#2077) This is so they're more discoverable for both developers and users. --- docs/sphinx/environment-variables.md | 48 ++++++++++++++++++++++++++++ docs/sphinx/index.md | 1 + python/private/pypi/attrs.bzl | 11 +++---- 3 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 docs/sphinx/environment-variables.md diff --git a/docs/sphinx/environment-variables.md b/docs/sphinx/environment-variables.md new file mode 100644 index 0000000000..2a0052923c --- /dev/null +++ b/docs/sphinx/environment-variables.md @@ -0,0 +1,48 @@ +# Environment Variables + +:::{envvar} RULES_PYTHON_REPO_DEBUG + +When `1`, repository rules will print debug information about what they're +doing. This is mostly useful for development to debug errors. +::: + +:::{envvar} RULES_PYTHON_REPO_DEBUG_VERBOSITY + +Determines the verbosity of logging output for repo rules. Valid values: + +* `DEBUG` +* `INFO` +* `TRACE` +::: + +:::{envvar} RULES_PYTHON_PIP_ISOLATED + +Determines if `--isolated` is used with pip. + +Valid values: +* `0` and `false` mean to not use isolated mode +* Other non-empty values mean to use isolated mode. +::: + +:::{envvar} RULES_PYTHON_BZLMOD_DEBUG + +When `1`, bzlmod extensions will print debug information about what they're +doing. This is mostly useful for development to debug errors. +::: + +:::{envvar} RULES_PYTHON_ENABLE_PYSTAR + +When `1`, the rules_python Starlark implementation of the core rules is used +instead of the Bazel-builtin rules. Note this requires Bazel 7+. +::: + +:::{envvar} RULES_PYTHON_BOOTSTRAP_VERBOSE + +When `1`, debug information about bootstrapping of a program is printed to +stderr. +::: + +:::{envvar} VERBOSE_COVERAGE + +When `1`, debug information about coverage behavior is printed to stderr. +::: diff --git a/docs/sphinx/index.md b/docs/sphinx/index.md index 13cfa56aa4..8405eacb31 100644 --- a/docs/sphinx/index.md +++ b/docs/sphinx/index.md @@ -66,6 +66,7 @@ Contributing support Changelog api/index +environment-variables glossary genindex ``` diff --git a/python/private/pypi/attrs.bzl b/python/private/pypi/attrs.bzl index 79ffea54a1..c6132cb6c1 100644 --- a/python/private/pypi/attrs.bzl +++ b/python/private/pypi/attrs.bzl @@ -154,7 +154,7 @@ or empty in the environment), if `"VARNAME"` is listed in the "isolated": attr.bool( doc = """\ Whether or not to pass the [--isolated](https://pip.pypa.io/en/stable/cli/pip/#cmdoption-isolated) flag to -the underlying pip command. Alternatively, the `RULES_PYTHON_PIP_ISOLATED` environment variable can be used +the underlying pip command. Alternatively, the {envvar}`RULES_PYTHON_PIP_ISOLATED` environment variable can be used to control this flag. """, default = True, @@ -185,13 +185,10 @@ python_interpreter. An example value: "@python3_x86_64-unknown-linux-gnu//:pytho doc = """\ If True, suppress printing stdout and stderr output to the terminal. -If you would like to get more diagnostic output, please use: - - RULES_PYTHON_REPO_DEBUG=1 - +If you would like to get more diagnostic output, set +{envvar}`RULES_PYTHON_REPO_DEBUG=1 ` or - - RULES_PYTHON_REPO_DEBUG_VERBOSITY= +{envvar}`RULES_PYTHON_REPO_DEBUG_VERBOSITY= ` """, ), # 600 is documented as default here: https://docs.bazel.build/versions/master/skylark/lib/repository_ctx.html#execute From 6e9a65f401e38b2bd7a274643ad40df4f3947cb1 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 19 Jul 2024 10:29:40 +0900 Subject: [PATCH 128/345] refactor(internal): move the os/arch detection to repo_utils (#2075) This also changes the local_runtime_repo to explicitly check for supported platforms instead of relying on a `None` value returned by the helper method. This makes the behaviour exactly the same to the behaviour before this PR and we can potentially drop the need for the validation in the future if our local_runtime detection is more robust. This also makes the platform detectino in `pypi_repo_utils` not depend on `uname` and only use the `repository_ctx`. Apparently the `module_ctx.watch` throws an error if one attempts to watch files on the system (this is left for `repository_rule` it seems and one can only do `module_ctx.watch` on files within the current workspace. This was surprising, but could have been worked around by just unifying code. This splits out things from #2059 and makes the code more succinct. Work towards #260, #1105, #1868. --- python/private/local_runtime_repo.bzl | 16 ------ python/private/pypi/BUILD.bazel | 4 +- python/private/pypi/extension.bzl | 2 +- python/private/pypi/parse_requirements.bzl | 59 ++-------------------- python/private/pypi/pip_repository.bzl | 2 +- python/private/pypi/pypi_repo_utils.bzl | 21 ++++---- python/private/repo_utils.bzl | 52 ++++++++++++++++--- 7 files changed, 64 insertions(+), 92 deletions(-) diff --git a/python/private/local_runtime_repo.bzl b/python/private/local_runtime_repo.bzl index f6bca6cc2c..a206e6d7dd 100644 --- a/python/private/local_runtime_repo.bzl +++ b/python/private/local_runtime_repo.bzl @@ -45,22 +45,6 @@ def _local_runtime_repo_impl(rctx): logger = repo_utils.logger(rctx) on_failure = rctx.attr.on_failure - platforms_os_name = repo_utils.get_platforms_os_name(rctx) - if not platforms_os_name: - if on_failure == "fail": - fail("Unrecognized host platform '{}': cannot determine OS constraint".format( - rctx.os.name, - )) - - if on_failure == "warn": - logger.warn(lambda: "Unrecognized host platform '{}': cannot determine OS constraint".format( - rctx.os.name, - )) - - # else, on_failure must be skip - rctx.file("BUILD.bazel", _expand_incompatible_template()) - return - result = _resolve_interpreter_path(rctx) if not result.resolved_path: if on_failure == "fail": diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel index 00602b298c..f444287a85 100644 --- a/python/private/pypi/BUILD.bazel +++ b/python/private/pypi/BUILD.bazel @@ -165,6 +165,7 @@ bzl_library( ":requirements_files_by_platform_bzl", ":whl_target_platforms_bzl", "//python/private:normalize_name_bzl", + "//python/private:repo_utils_bzl", ], ) @@ -233,8 +234,7 @@ bzl_library( name = "pypi_repo_utils_bzl", srcs = ["pypi_repo_utils.bzl"], deps = [ - "//python:versions_bzl", - "//python/private:toolchains_repo_bzl", + "//python/private:repo_utils_bzl", ], ) diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index d837d8d50a..95526e4252 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -199,7 +199,7 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s logger = logger, ) - repository_platform = host_platform(module_ctx.os) + 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 diff --git a/python/private/pypi/parse_requirements.bzl b/python/private/pypi/parse_requirements.bzl index 5258153a84..968c486bfb 100644 --- a/python/private/pypi/parse_requirements.bzl +++ b/python/private/pypi/parse_requirements.bzl @@ -27,59 +27,11 @@ behavior. """ load("//python/private:normalize_name.bzl", "normalize_name") +load("//python/private:repo_utils.bzl", "repo_utils") load(":index_sources.bzl", "index_sources") load(":parse_requirements_txt.bzl", "parse_requirements_txt") load(":whl_target_platforms.bzl", "select_whls") -# This includes the vendored _translate_cpu and _translate_os from -# @platforms//host:extension.bzl at version 0.0.9 so that we don't -# force the users to depend on it. - -def _translate_cpu(arch): - if arch in ["i386", "i486", "i586", "i686", "i786", "x86"]: - return "x86_32" - if arch in ["amd64", "x86_64", "x64"]: - return "x86_64" - if arch in ["ppc", "ppc64", "ppc64le"]: - return "ppc" - if arch in ["arm", "armv7l"]: - return "arm" - if arch in ["aarch64"]: - return "aarch64" - if arch in ["s390x", "s390"]: - return "s390x" - if arch in ["mips64el", "mips64"]: - return "mips64" - if arch in ["riscv64"]: - return "riscv64" - return arch - -def _translate_os(os): - if os.startswith("mac os"): - return "osx" - if os.startswith("freebsd"): - return "freebsd" - if os.startswith("openbsd"): - return "openbsd" - if os.startswith("linux"): - return "linux" - if os.startswith("windows"): - return "windows" - return os - -# TODO @aignas 2024-05-13: consider using the same platform tags as are used in -# the //python:versions.bzl -DEFAULT_PLATFORMS = [ - "linux_aarch64", - "linux_arm", - "linux_ppc", - "linux_s390x", - "linux_x86_64", - "osx_aarch64", - "osx_x86_64", - "windows_x86_64", -] - def parse_requirements( ctx, *, @@ -271,20 +223,19 @@ def select_requirement(requirements, *, platform): return maybe_requirement[0] -def host_platform(repository_os): +def host_platform(ctx): """Return a string representation of the repository OS. Args: - repository_os (struct): The `module_ctx.os` or `repository_ctx.os` attribute. - See https://bazel.build/rules/lib/builtins/repository_os.html + ctx (struct): The `module_ctx` or `repository_ctx` attribute. Returns: The string representation of the platform that we can later used in the `pip` machinery. """ return "{}_{}".format( - _translate_os(repository_os.name.lower()), - _translate_cpu(repository_os.arch.lower()), + repo_utils.get_platforms_os_name(ctx), + repo_utils.get_platforms_cpu_name(ctx), ) def _add_dists(requirement, index_urls, python_version, logger = None): diff --git a/python/private/pypi/pip_repository.bzl b/python/private/pypi/pip_repository.bzl index 42622c3c73..992b83f63b 100644 --- a/python/private/pypi/pip_repository.bzl +++ b/python/private/pypi/pip_repository.bzl @@ -84,7 +84,7 @@ def _pip_repository_impl(rctx): ) selected_requirements = {} options = None - repository_platform = host_platform(rctx.os) + repository_platform = host_platform(rctx) for name, requirements in requirements_by_platform.items(): r = select_requirement( requirements, diff --git a/python/private/pypi/pypi_repo_utils.bzl b/python/private/pypi/pypi_repo_utils.bzl index 6e5d93b160..1f9f050893 100644 --- a/python/private/pypi/pypi_repo_utils.bzl +++ b/python/private/pypi/pypi_repo_utils.bzl @@ -14,8 +14,7 @@ "" -load("//python:versions.bzl", "WINDOWS_NAME") -load("//python/private:toolchains_repo.bzl", "get_host_os_arch") +load("//python/private:repo_utils.bzl", "repo_utils") def _get_python_interpreter_attr(ctx, *, python_interpreter = None): """A helper function for getting the `python_interpreter` attribute or it's default @@ -30,7 +29,8 @@ def _get_python_interpreter_attr(ctx, *, python_interpreter = None): if python_interpreter: return python_interpreter - if "win" in ctx.os.name: + os = repo_utils.get_platforms_os_name(ctx) + if "windows" in os: return "python.exe" else: return "python3" @@ -39,7 +39,7 @@ def _resolve_python_interpreter(ctx, *, python_interpreter = None, python_interp """Helper function to find the python interpreter from the common attributes Args: - ctx: Handle to the rule repository context. + ctx: Handle to the rule module_ctx or repository_ctx. python_interpreter: The python interpreter to use. python_interpreter_target: The python interpreter to use after downloading the label. @@ -51,11 +51,11 @@ def _resolve_python_interpreter(ctx, *, python_interpreter = None, python_interp if python_interpreter_target != None: python_interpreter = ctx.path(python_interpreter_target) - (os, _) = get_host_os_arch(ctx) + os = repo_utils.get_platforms_os_name(ctx) # On Windows, the symlink doesn't work because Windows attempts to find # Python DLLs where the symlink is, not where the symlink points. - if os == WINDOWS_NAME: + if "windows" in os: python_interpreter = python_interpreter.realpath elif "/" not in python_interpreter: # It's a plain command, e.g. "python3", to look up in the environment. @@ -67,22 +67,23 @@ def _resolve_python_interpreter(ctx, *, python_interpreter = None, python_interp python_interpreter = ctx.path(python_interpreter) return python_interpreter -def _construct_pypath(rctx, *, entries): +def _construct_pypath(ctx, *, entries): """Helper function to construct a PYTHONPATH. Contains entries for code in this repo as well as packages downloaded from //python/pip_install:repositories.bzl. This allows us to run python code inside repository rule implementations. Args: - rctx: Handle to the repository_context. + ctx: Handle to the module_ctx or repository_ctx. entries: The list of entries to add to PYTHONPATH. Returns: String of the PYTHONPATH. """ - separator = ":" if not "windows" in rctx.os.name.lower() else ";" + os = repo_utils.get_platforms_os_name(ctx) + separator = ";" if "windows" in os else ":" pypath = separator.join([ - str(rctx.path(entry).dirname) + str(ctx.path(entry).dirname) # Use a dict as a way to remove duplicates and then sort it. for entry in sorted({x: None for x in entries}) ]) diff --git a/python/private/repo_utils.bzl b/python/private/repo_utils.bzl index 9d76e19833..18937895f5 100644 --- a/python/private/repo_utils.bzl +++ b/python/private/repo_utils.bzl @@ -341,6 +341,10 @@ def _outputs_to_str(result): lines.append("<{} empty>".format(name)) return "\n".join(lines) +# This includes the vendored _translate_cpu and _translate_os from +# @platforms//host:extension.bzl at version 0.0.9 so that we don't +# force the users to depend on it. + def _get_platforms_os_name(rctx): """Return the name in @platforms//os for the host os. @@ -348,18 +352,49 @@ def _get_platforms_os_name(rctx): rctx: repository_ctx Returns: - `str | None`. The target name if it maps to known platforms - value, otherwise None. + `str`. The target name. """ os = rctx.os.name.lower() - if "linux" in os: - return os - if "windows" in os: - return "windows" - if "mac" in os: + + if os.startswith("mac os"): return "osx" + if os.startswith("freebsd"): + return "freebsd" + if os.startswith("openbsd"): + return "openbsd" + if os.startswith("linux"): + return "linux" + if os.startswith("windows"): + return "windows" + return os + +def _get_platforms_cpu_name(rctx): + """Return the name in @platforms//cpu for the host arch. - return None + Args: + rctx: repository_ctx + + Returns: + `str`. The target name. + """ + arch = rctx.os.arch.lower() + if arch in ["i386", "i486", "i586", "i686", "i786", "x86"]: + return "x86_32" + if arch in ["amd64", "x86_64", "x64"]: + return "x86_64" + if arch in ["ppc", "ppc64", "ppc64le"]: + return "ppc" + if arch in ["arm", "armv7l"]: + return "arm" + if arch in ["aarch64"]: + return "aarch64" + if arch in ["s390x", "s390"]: + return "s390x" + if arch in ["mips64el", "mips64"]: + return "mips64" + if arch in ["riscv64"]: + return "riscv64" + return arch # TODO: Remove after Bazel 6 support dropped def _watch(rctx, *args, **kwargs): @@ -379,6 +414,7 @@ repo_utils = struct( execute_checked = _execute_checked, execute_checked_stdout = _execute_checked_stdout, execute_unchecked = _execute_unchecked, + get_platforms_cpu_name = _get_platforms_cpu_name, get_platforms_os_name = _get_platforms_os_name, getenv = _getenv, is_repo_debug_enabled = _is_repo_debug_enabled, From bd0ca99d7a03c0319ad17785c02561e7d5fccaae Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 19 Jul 2024 10:40:15 +0900 Subject: [PATCH 129/345] fix(uv): fix UV_BIN usage with current_toolchain (#2074) Before this PR the `uv` toolchain could not be used in a `genrule` it seems because the `//python/uv:toolchain` does not have the necessary providers for using the make variables and the re-exporting of the make variables from the `toolchain` in the `current_toolchain` rule did not seem to work. This PR removes the provider construction in the `toolchain` and does that only in the `current_toolchain`. This better mirrors how the Python toolchains are setup (grepping `PYTHON3` is sufficient to get examples). This also splits out work done in #2059 to decrease its scope, so that this can be discussed separately. Work towards #1975 --- .bazelrc | 4 ++-- MODULE.bazel | 14 +++++++++++++ python/uv/BUILD.bazel | 5 ++++- python/uv/private/current_toolchain.bzl | 10 +++++++-- python/uv/toolchain.bzl | 5 ----- tests/uv/toolchain/BUILD.bazel | 22 ++++++++++++++++++++ tests/uv/toolchain/uv_help_test.py | 27 +++++++++++++++++++++++++ 7 files changed, 77 insertions(+), 10 deletions(-) create mode 100644 tests/uv/toolchain/BUILD.bazel create mode 100755 tests/uv/toolchain/uv_help_test.py diff --git a/.bazelrc b/.bazelrc index 0833d8d979..1ca469cd75 100644 --- a/.bazelrc +++ b/.bazelrc @@ -4,8 +4,8 @@ # (Note, we cannot use `common --deleted_packages` because the bazel version command doesn't support it) # To update these lines, execute # `bazel run @rules_bazel_integration_test//tools:update_deleted_packages` -build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered -query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered test --test_output=errors diff --git a/MODULE.bazel b/MODULE.bazel index b6d198ffc1..2e0d06dc5f 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -130,3 +130,17 @@ use_repo( "build_bazel_bazel_rolling", "build_bazel_bazel_self", ) + +# EXPERIMENTAL: This is experimental and may be removed without notice +uv = use_extension( + "//python/uv:extensions.bzl", + "uv", + dev_dependency = True, +) +uv.toolchain(uv_version = "0.2.23") +use_repo(uv, "uv_toolchains") + +register_toolchains( + "@uv_toolchains//:all", + dev_dependency = True, +) diff --git a/python/uv/BUILD.bazel b/python/uv/BUILD.bazel index 3961c908ac..383bdfcc3c 100644 --- a/python/uv/BUILD.bazel +++ b/python/uv/BUILD.bazel @@ -41,7 +41,10 @@ current_toolchain( # even if no toolchain is registered. tags = ["manual"], # EXPERIMENTAL: Visibility is restricted to allow for changes. - visibility = ["@rules_python//examples:__subpackages__"], + visibility = [ + "//:__subpackages__", + "@rules_python//examples:__subpackages__", + ], ) bzl_library( diff --git a/python/uv/private/current_toolchain.bzl b/python/uv/private/current_toolchain.bzl index cd4a5926d2..91a25cb50f 100644 --- a/python/uv/private/current_toolchain.bzl +++ b/python/uv/private/current_toolchain.bzl @@ -30,7 +30,9 @@ def _current_toolchain_impl(ctx): # Bazel requires executable rules to create the executable themselves, # so we create a symlink in this rule so that it appears this rule created its executable. original_uv_executable = toolchain_info.uv_toolchain_info.uv[DefaultInfo].files_to_run.executable - symlink_uv_executable = ctx.actions.declare_file("uv_symlink_{}".format(original_uv_executable.basename)) + + # Use `uv` as the name of the binary to make the help message well formatted + symlink_uv_executable = ctx.actions.declare_file("current_toolchain/uv".format(original_uv_executable.basename)) ctx.actions.symlink(output = symlink_uv_executable, target_file = original_uv_executable) new_default_info = DefaultInfo( @@ -39,10 +41,14 @@ def _current_toolchain_impl(ctx): executable = symlink_uv_executable, ) + template_variable_info = platform_common.TemplateVariableInfo({ + "UV_BIN": symlink_uv_executable.path, + }) + return [ toolchain_info, new_default_info, - toolchain_info.template_variable_info, + template_variable_info, toolchain_info.uv_toolchain_info, ] diff --git a/python/uv/toolchain.bzl b/python/uv/toolchain.bzl index dbfda0b70c..3cd5850acd 100644 --- a/python/uv/toolchain.bzl +++ b/python/uv/toolchain.bzl @@ -31,21 +31,16 @@ def _uv_toolchain_impl(ctx): uv = uv, version = ctx.attr.version, ) - template_variable_info = platform_common.TemplateVariableInfo({ - "UV_BIN": uv[DefaultInfo].files_to_run.executable.path, - }) # Export all the providers inside our ToolchainInfo # so the current_toolchain rule can grab and re-export them. toolchain_info = platform_common.ToolchainInfo( default_info = default_info, - template_variable_info = template_variable_info, uv_toolchain_info = uv_toolchain_info, ) return [ default_info, toolchain_info, - template_variable_info, ] uv_toolchain = rule( diff --git a/tests/uv/toolchain/BUILD.bazel b/tests/uv/toolchain/BUILD.bazel new file mode 100644 index 0000000000..137b4e041f --- /dev/null +++ b/tests/uv/toolchain/BUILD.bazel @@ -0,0 +1,22 @@ +load("//python:py_test.bzl", "py_test") +load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility + +# We only test this feature when `bzlmod` is enabled. +_TARGET_COMPATIBLE_WITH = [] if BZLMOD_ENABLED else ["@platforms//:incompatible"] + +genrule( + name = "uv_help", + outs = ["uv_help.txt"], + cmd = "$(UV_BIN) --python-fetch manual --help >$@", + target_compatible_with = _TARGET_COMPATIBLE_WITH, + toolchains = ["//python/uv:current_toolchain"], +) + +py_test( + name = "uv_help_test", + srcs = ["uv_help_test.py"], + data = [":uv_help"], + env = {"DATA": "$(rlocationpath :uv_help)"}, + target_compatible_with = _TARGET_COMPATIBLE_WITH, + deps = ["//python/runfiles"], +) diff --git a/tests/uv/toolchain/uv_help_test.py b/tests/uv/toolchain/uv_help_test.py new file mode 100755 index 0000000000..be5e755d91 --- /dev/null +++ b/tests/uv/toolchain/uv_help_test.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +import os +import unittest +from pathlib import Path + +from python.runfiles import runfiles + + +class TestUV(unittest.TestCase): + def test_uv_help(self): + rfiles = runfiles.Create() + assert rfiles is not None, "rfiles creation failed" + + data_rpath = os.environ["DATA"] + uv_help_path = rfiles.Rlocation(data_rpath) + assert ( + uv_help_path is not None + ), f"the rlocation path was not found: {data_rpath}" + + uv_help = Path(uv_help_path).read_text() + + self.assertIn("Usage: uv [OPTIONS] ", uv_help) + + +if __name__ == "__main__": + unittest.main() From 9ff6ab7905f79079766c69ff8735542ebf9894bb Mon Sep 17 00:00:00 2001 From: Bruno Beltran <129457302+bruno-digitbio@users.noreply.github.com> Date: Fri, 19 Jul 2024 03:30:46 -0400 Subject: [PATCH 130/345] docs: describe `annotations` attr of `pip_parse` (#1667) My default expectation would be that the keys to the `annotations` dictionary passed to `pip_parse` would use the `normalize_name(...)` convention, as is used elsewhere in the API. However, this does not appear to be the case. I originally was going to file a bug, but maybe just documenting the current behavior is enough? For a minimal repro showing that this capitalization is indeed required, see https://github.com/bruno-digitbio/bug-rules-python-annotation-pyqt In that repo, ```bash $ bazel run //:test_has_comment $ tail $(bazel info output_base)/external/pip_pyqt6/BUILD.bazel $ tail $(bazel info output_base)/external/pip_wheel/BUILD.bazel ``` will both show `# A comment` at the bottom, as requested in the `WORKSPACE` file. However, if you first run ```bash $ bazel run //:requirements.update ``` then the auto-generated requirements file will use lowercase for the requirement specification, breaking the desired behavior. Please let me know if it makes more sense to just check in the docs, include this example (or something similar) as a small test, or something else. Apologies if I missed anything in the contribution guidelines! --- python/private/pypi/pip_repository.bzl | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/python/private/pypi/pip_repository.bzl b/python/private/pypi/pip_repository.bzl index 992b83f63b..137c524e24 100644 --- a/python/private/pypi/pip_repository.bzl +++ b/python/private/pypi/pip_repository.bzl @@ -214,7 +214,12 @@ def _pip_repository_impl(rctx): pip_repository = repository_rule( attrs = dict( annotations = attr.string_dict( - doc = "Optional annotations to apply to packages", + doc = """\ +Optional annotations to apply to packages. Keys should be package names, with +capitalization matching the input requirements file, and values should be +generated using the `package_name` macro. For example usage, see [this WORKSPACE +file](https://github.com/bazelbuild/rules_python/blob/main/examples/pip_repository_annotations/WORKSPACE). +""", ), _template = attr.label( default = ":requirements.bzl.tmpl.workspace", From 990a0538e796f86dcb9a86e0276b7fdf1bf44c18 Mon Sep 17 00:00:00 2001 From: Zhongpeng Lin Date: Fri, 19 Jul 2024 00:49:29 -0700 Subject: [PATCH 131/345] feat!: Following generation mode when generating test targets (#2044) When `python_generation_mode` is `project` or `file` , the generated `py_test` targets are consistent with `py_library`. However, when `python_generation_mode` is `package`, it becomes inconsistent: it requires either `__test__` target or `__test__.py` file to generate `py_test` in package mode, otherwise it will fall back to file mode. This PR relaxes this requirement with a new directive `gazelle:python_generation_mode_per_package_require_test_entry_point`. Whent it's set to false, Gazelle and generates one `py_test` target per package in package mode even without entry points. This allows people to use `gazelle:map_kind` to map `py_test` to a macro that sets a default test runner, such as [rules_python_pytest](https://github.com/caseyduquettesc/rules_python_pytest) or [pytest-bazel](https://pypi.org/project/pytest-bazel/), and generate one test target per package. The behavior when `gazelle:python_generation_mode` is "file" or "project" remains the same. This fixes #1972 for supporting pytest from Gazelle. With this approach, people can define a thin macro like this to use py_pytest_main: ``` load("@aspect_rules_py//py:defs.bzl", "py_pytest_main") def py_test(name, **kwargs): py_pytest_main( name = "__test__", deps = ["@pip_pytest//:pkg"], # change this to the pytest target in your repo. ) deps = kwargs.pop("deps", []) deps.append(":__test__") py_test( name = name, main = ":__test__.py", deps = deps, **kwargs, ) ``` BREAKING CHANGES: Without `gazelle:map_kind` or `__test__` target or `__test__.py`, the package mode will now generate `py_test` without `main` attribute, which may not be runnable. However, this is already an issue with "python_generation_mode:project" before this PR. The default value of `gazelle:python_generation_mode_per_package_require_test_entry_point` is true to preserve the current behavior. We will flip that default value in the future. --------- Co-authored-by: aignas <240938+aignas@users.noreply.github.com> --- CHANGELOG.md | 11 +- gazelle/README.md | 99 +++++++++++------ gazelle/python/configure.go | 9 ++ gazelle/python/generate.go | 7 +- .../BUILD.in | 2 + .../BUILD.out | 18 ++++ .../README.md | 3 + .../WORKSPACE | 1 + .../__init__.py | 0 .../bar_test.py | 24 +++++ .../foo_test.py | 24 +++++ .../test.yaml | 17 +++ gazelle/pythonconfig/pythonconfig.go | 101 ++++++++++-------- 13 files changed, 235 insertions(+), 81 deletions(-) create mode 100644 gazelle/python/testdata/per_package_test_target_without_entry_point/BUILD.in create mode 100644 gazelle/python/testdata/per_package_test_target_without_entry_point/BUILD.out create mode 100644 gazelle/python/testdata/per_package_test_target_without_entry_point/README.md create mode 100644 gazelle/python/testdata/per_package_test_target_without_entry_point/WORKSPACE create mode 100644 gazelle/python/testdata/per_package_test_target_without_entry_point/__init__.py create mode 100644 gazelle/python/testdata/per_package_test_target_without_entry_point/bar_test.py create mode 100644 gazelle/python/testdata/per_package_test_target_without_entry_point/foo_test.py create mode 100644 gazelle/python/testdata/per_package_test_target_without_entry_point/test.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index d924f650ca..560c04ea8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,7 +39,16 @@ A brief description of the categories of changes: containing ">" sign ### Added -* Nothing yet +* (gazelle) Added `python_generation_mode_per_package_require_test_entry_point` + in order to better accommodate users who use a custom macro, + [`pytest-bazel`][pytest_bazel], [rules_python_pytest] or `rules_py` + [py_test_main] in order to integrate with `pytest`. Currently the default + flag value is set to `true` for backwards compatible behaviour, but in the + future the flag will be flipped be `false` by default. + +[rules_python_pytest]: https://github.com/caseyduquettesc/rules_python_pytest +[py_test_main]: https://docs.aspect.build/rulesets/aspect_rules_py/docs/rules/#py_pytest_main +[pytest_bazel]: https://pypi.org/project/pytest-bazel ### Removed * Nothing yet diff --git a/gazelle/README.md b/gazelle/README.md index d68b94de26..c0494d141b 100644 --- a/gazelle/README.md +++ b/gazelle/README.md @@ -172,42 +172,44 @@ Examples of these directives in use can be found in the Python-specific directives are as follows: -| **Directive** | **Default value** | -|--------------------------------------|-------------------| -| `# gazelle:python_extension` | `enabled` | -| Controls whether the Python extension is enabled or not. Sub-packages inherit this value. Can be either "enabled" or "disabled". | | -| [`# gazelle:python_root`](#directive-python_root) | n/a | -| Sets a Bazel package as a Python root. This is used on monorepos with multiple Python projects that don't share the top-level of the workspace as the root. See [Directive: `python_root`](#directive-python_root) below. | | -| `# gazelle:python_manifest_file_name`| `gazelle_python.yaml` | -| Overrides the default manifest file name. | | -| `# gazelle:python_ignore_files` | n/a | -| Controls the files which are ignored from the generated targets. | | -| `# gazelle:python_ignore_dependencies`| n/a | -| Controls the ignored dependencies from the generated targets. | | -| `# gazelle:python_validate_import_statements`| `true` | -| Controls whether the Python import statements should be validated. Can be "true" or "false" | | -| `# gazelle:python_generation_mode`| `package` | -| Controls the target generation mode. Can be "file", "package", or "project" | | -| `# gazelle:python_generation_mode_per_file_include_init`| `false` | -| Controls whether `__init__.py` files are included as srcs in each generated target when target generation mode is "file". Can be "true", or "false" | | -| `# gazelle:python_library_naming_convention`| `$package_name$` | -| Controls the `py_library` naming convention. It interpolates `$package_name$` with the Bazel package name. E.g. if the Bazel package name is `foo`, setting this to `$package_name$_my_lib` would result in a generated target named `foo_my_lib`. | | -| `# gazelle:python_binary_naming_convention` | `$package_name$_bin` | -| Controls the `py_binary` naming convention. Follows the same interpolation rules as `python_library_naming_convention`. | | -| `# gazelle:python_test_naming_convention` | `$package_name$_test` | -| Controls the `py_test` naming convention. Follows the same interpolation rules as `python_library_naming_convention`. | | -| `# gazelle:resolve py ...` | n/a | +| **Directive** | **Default value** | +|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------| +| `# gazelle:python_extension` | `enabled` | +| Controls whether the Python extension is enabled or not. Sub-packages inherit this value. Can be either "enabled" or "disabled". | | +| [`# gazelle:python_root`](#directive-python_root) | n/a | +| Sets a Bazel package as a Python root. This is used on monorepos with multiple Python projects that don't share the top-level of the workspace as the root. See [Directive: `python_root`](#directive-python_root) below. | | +| `# gazelle:python_manifest_file_name` | `gazelle_python.yaml` | +| Overrides the default manifest file name. | | +| `# gazelle:python_ignore_files` | n/a | +| Controls the files which are ignored from the generated targets. | | +| `# gazelle:python_ignore_dependencies` | n/a | +| Controls the ignored dependencies from the generated targets. | | +| `# gazelle:python_validate_import_statements` | `true` | +| Controls whether the Python import statements should be validated. Can be "true" or "false" | | +| `# gazelle:python_generation_mode` | `package` | +| Controls the target generation mode. Can be "file", "package", or "project" | | +| `# gazelle:python_generation_mode_per_file_include_init` | `false` | +| Controls whether `__init__.py` files are included as srcs in each generated target when target generation mode is "file". Can be "true", or "false" | | +| [`# gazelle:python_generation_mode_per_package_require_test_entry_point`](#directive-python_generation_mode_per_package_require_test_entry_point) | `true` | +| Controls whether a file called `__test__.py` or a target called `__test__` is required to generate one test target per package in package mode. || +| `# gazelle:python_library_naming_convention` | `$package_name$` | +| Controls the `py_library` naming convention. It interpolates `$package_name$` with the Bazel package name. E.g. if the Bazel package name is `foo`, setting this to `$package_name$_my_lib` would result in a generated target named `foo_my_lib`. | | +| `# gazelle:python_binary_naming_convention` | `$package_name$_bin` | +| Controls the `py_binary` naming convention. Follows the same interpolation rules as `python_library_naming_convention`. | | +| `# gazelle:python_test_naming_convention` | `$package_name$_test` | +| Controls the `py_test` naming convention. Follows the same interpolation rules as `python_library_naming_convention`. | | +| `# gazelle:resolve py ...` | n/a | | Instructs the plugin what target to add as a dependency to satisfy a given import statement. The syntax is `# gazelle:resolve py import-string label` where `import-string` is the symbol in the python `import` statement, and `label` is the Bazel label that Gazelle should write in `deps`. | | -| [`# gazelle:python_default_visibility labels`](#directive-python_default_visibility) | | -| Instructs gazelle to use these visibility labels on all python targets. `labels` is a comma-separated list of labels (without spaces). | `//$python_root$:__subpackages__` | -| [`# gazelle:python_visibility label`](#directive-python_visibility) | | -| Appends additional visibility labels to each generated target. This directive can be set multiple times. | | -| [`# gazelle:python_test_file_pattern`](#directive-python_test_file_pattern) | `*_test.py,test_*.py` | -| Filenames matching these comma-separated `glob`s will be mapped to `py_test` targets. | -| `# gazelle:python_label_convention` | `$distribution_name$` | -| Defines the format of the distribution name in labels to third-party deps. Useful for using Gazelle plugin with other rules with different repository conventions (e.g. `rules_pycross`). Full label is always prepended with (pip) repository name, e.g. `@pip//numpy`. | -| `# gazelle:python_label_normalization` | `snake_case` | -| Controls how distribution names in labels to third-party deps are normalized. Useful for using Gazelle plugin with other rules with different label conventions (e.g. `rules_pycross` uses PEP-503). Can be "snake_case", "none", or "pep503". | +| [`# gazelle:python_default_visibility labels`](#directive-python_default_visibility) | | +| Instructs gazelle to use these visibility labels on all python targets. `labels` is a comma-separated list of labels (without spaces). | `//$python_root$:__subpackages__` | +| [`# gazelle:python_visibility label`](#directive-python_visibility) | | +| Appends additional visibility labels to each generated target. This directive can be set multiple times. | | +| [`# gazelle:python_test_file_pattern`](#directive-python_test_file_pattern) | `*_test.py,test_*.py` | +| Filenames matching these comma-separated `glob`s will be mapped to `py_test` targets. | +| `# gazelle:python_label_convention` | `$distribution_name$` | +| Defines the format of the distribution name in labels to third-party deps. Useful for using Gazelle plugin with other rules with different repository conventions (e.g. `rules_pycross`). Full label is always prepended with (pip) repository name, e.g. `@pip//numpy`. | +| `# gazelle:python_label_normalization` | `snake_case` | +| Controls how distribution names in labels to third-party deps are normalized. Useful for using Gazelle plugin with other rules with different label conventions (e.g. `rules_pycross` uses PEP-503). Can be "snake_case", "none", or "pep503". | #### Directive: `python_root`: @@ -440,6 +442,33 @@ py_library( [issue-1826]: https://github.com/bazelbuild/rules_python/issues/1826 +#### Directive: `python_generation_mode_per_package_require_test_entry_point`: +When `# gazelle:python_generation_mode package`, whether a file called `__test__.py` or a target called `__test__`, a.k.a., entry point, is required to generate one test target per package. If this is set to true but no entry point is found, Gazelle will fall back to file mode and generate one test target per file. Setting this directive to false forces Gazelle to generate one test target per package even without entry point. However, this means the `main` attribute of the `py_test` will not be set and the target will not be runnable unless either: +1. there happen to be a file in the `srcs` with the same name as the `py_test` target, or +2. a macro populating the `main` attribute of `py_test` is configured with `gazelle:map_kind` to replace `py_test` when Gazelle is generating Python test targets. For example, user can provide such a macro to Gazelle: + +```starlark +load("@rules_python//python:defs.bzl", _py_test="py_test") +load("@aspect_rules_py//py:defs.bzl", "py_pytest_main") + +def py_test(name, main=None, **kwargs): + deps = kwargs.pop("deps", []) + if not main: + py_pytest_main( + name = "__test__", + deps = ["@pip_pytest//:pkg"], # change this to the pytest target in your repo. + ) + + deps.append(":__test__") + main = ":__test__.py" + + _py_test( + name = name, + main = main, + deps = deps, + **kwargs, +) +``` ### Annotations diff --git a/gazelle/python/configure.go b/gazelle/python/configure.go index b82dd81f8f..a369a64b8e 100644 --- a/gazelle/python/configure.go +++ b/gazelle/python/configure.go @@ -61,6 +61,7 @@ func (py *Configurer) KnownDirectives() []string { pythonconfig.ValidateImportStatementsDirective, pythonconfig.GenerationMode, pythonconfig.GenerationModePerFileIncludeInit, + pythonconfig.GenerationModePerPackageRequireTestEntryPoint, pythonconfig.LibraryNamingConvention, pythonconfig.BinaryNamingConvention, pythonconfig.TestNamingConvention, @@ -163,6 +164,14 @@ func (py *Configurer) Configure(c *config.Config, rel string, f *rule.File) { log.Fatal(err) } config.SetPerFileGenerationIncludeInit(v) + case pythonconfig.GenerationModePerPackageRequireTestEntryPoint: + v, err := strconv.ParseBool(strings.TrimSpace(d.Value)) + if err != nil { + log.Printf("invalid value for gazelle:%s in %q: %q", + pythonconfig.GenerationModePerPackageRequireTestEntryPoint, rel, d.Value) + } else { + config.SetPerPackageGenerationRequireTestEntryPoint(v) + } case pythonconfig.LibraryNamingConvention: config.SetLibraryNamingConvention(strings.TrimSpace(d.Value)) case pythonconfig.BinaryNamingConvention: diff --git a/gazelle/python/generate.go b/gazelle/python/generate.go index ef49dd74c4..c563b47bf3 100644 --- a/gazelle/python/generate.go +++ b/gazelle/python/generate.go @@ -421,7 +421,7 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes addResolvedDependencies(annotations.includeDeps). generateImportsAttribute() } - if (hasPyTestEntryPointFile || hasPyTestEntryPointTarget || cfg.CoarseGrainedGeneration()) && !cfg.PerFileGeneration() { + if (!cfg.PerPackageGenerationRequireTestEntryPoint() || hasPyTestEntryPointFile || hasPyTestEntryPointTarget || cfg.CoarseGrainedGeneration()) && !cfg.PerFileGeneration() { // Create one py_test target per package if hasPyTestEntryPointFile { // Only add the pyTestEntrypointFilename to the pyTestFilenames if @@ -441,7 +441,10 @@ func (py *Python) GenerateRules(args language.GenerateArgs) language.GenerateRes setMain(main) } else if hasPyTestEntryPointFile { pyTestTarget.setMain(pyTestEntrypointFilename) - } + } /* else: + main is not set, assuming there is a test file with the same name + as the target name, or there is a macro wrapping py_test and setting its main attribute. + */ pyTestTargets = append(pyTestTargets, pyTestTarget) } } else { diff --git a/gazelle/python/testdata/per_package_test_target_without_entry_point/BUILD.in b/gazelle/python/testdata/per_package_test_target_without_entry_point/BUILD.in new file mode 100644 index 0000000000..27120f3255 --- /dev/null +++ b/gazelle/python/testdata/per_package_test_target_without_entry_point/BUILD.in @@ -0,0 +1,2 @@ +# gazelle:python_generation_mode package +# gazelle:python_generation_mode_per_package_require_test_entry_point false \ No newline at end of file diff --git a/gazelle/python/testdata/per_package_test_target_without_entry_point/BUILD.out b/gazelle/python/testdata/per_package_test_target_without_entry_point/BUILD.out new file mode 100644 index 0000000000..c4ec331583 --- /dev/null +++ b/gazelle/python/testdata/per_package_test_target_without_entry_point/BUILD.out @@ -0,0 +1,18 @@ +load("@rules_python//python:defs.bzl", "py_library", "py_test") + +# gazelle:python_generation_mode package +# gazelle:python_generation_mode_per_package_require_test_entry_point false + +py_library( + name = "per_package_test_target_without_entry_point", + srcs = ["__init__.py"], + visibility = ["//:__subpackages__"], +) + +py_test( + name = "per_package_test_target_without_entry_point_test", + srcs = [ + "bar_test.py", + "foo_test.py", + ], +) diff --git a/gazelle/python/testdata/per_package_test_target_without_entry_point/README.md b/gazelle/python/testdata/per_package_test_target_without_entry_point/README.md new file mode 100644 index 0000000000..8decb00cfa --- /dev/null +++ b/gazelle/python/testdata/per_package_test_target_without_entry_point/README.md @@ -0,0 +1,3 @@ +# One test target per package without entry point + +This test case asserts that one test target is generated per package without entry point when `gazelle:python_generation_mode_per_package_require_test_entry_point false` diff --git a/gazelle/python/testdata/per_package_test_target_without_entry_point/WORKSPACE b/gazelle/python/testdata/per_package_test_target_without_entry_point/WORKSPACE new file mode 100644 index 0000000000..faff6af87a --- /dev/null +++ b/gazelle/python/testdata/per_package_test_target_without_entry_point/WORKSPACE @@ -0,0 +1 @@ +# This is a Bazel workspace for the Gazelle test data. diff --git a/gazelle/python/testdata/per_package_test_target_without_entry_point/__init__.py b/gazelle/python/testdata/per_package_test_target_without_entry_point/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/per_package_test_target_without_entry_point/bar_test.py b/gazelle/python/testdata/per_package_test_target_without_entry_point/bar_test.py new file mode 100644 index 0000000000..9948f1ccd4 --- /dev/null +++ b/gazelle/python/testdata/per_package_test_target_without_entry_point/bar_test.py @@ -0,0 +1,24 @@ +# 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. + +import unittest + + +class BarTest(unittest.TestCase): + def test_foo(self): + pass + + +if __name__ == "__main__": + unittest.main() diff --git a/gazelle/python/testdata/per_package_test_target_without_entry_point/foo_test.py b/gazelle/python/testdata/per_package_test_target_without_entry_point/foo_test.py new file mode 100644 index 0000000000..a128adf67f --- /dev/null +++ b/gazelle/python/testdata/per_package_test_target_without_entry_point/foo_test.py @@ -0,0 +1,24 @@ +# 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. + +import unittest + + +class FooTest(unittest.TestCase): + def test_foo(self): + pass + + +if __name__ == "__main__": + unittest.main() diff --git a/gazelle/python/testdata/per_package_test_target_without_entry_point/test.yaml b/gazelle/python/testdata/per_package_test_target_without_entry_point/test.yaml new file mode 100644 index 0000000000..2410223e59 --- /dev/null +++ b/gazelle/python/testdata/per_package_test_target_without_entry_point/test.yaml @@ -0,0 +1,17 @@ +# 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. + +--- +expect: + exit_code: 0 diff --git a/gazelle/pythonconfig/pythonconfig.go b/gazelle/pythonconfig/pythonconfig.go index 41a470a940..a24a90efeb 100644 --- a/gazelle/pythonconfig/pythonconfig.go +++ b/gazelle/pythonconfig/pythonconfig.go @@ -55,6 +55,10 @@ const ( // the "per_file" GenerationMode by including the package's __init__.py file. // This is a boolean directive. GenerationModePerFileIncludeInit = "python_generation_mode_per_file_include_init" + // GenerationModePerPackageRequireTestEntryPoint represents the directive that + // requires a test entry point to generate test targets in "package" GenerationMode. + // This is a boolean directive. + GenerationModePerPackageRequireTestEntryPoint = "python_generation_mode_per_package_require_test_entry_point" // LibraryNamingConvention represents the directive that controls the // py_library naming convention. It interpolates $package_name$ with the // Bazel package name. E.g. if the Bazel package name is `foo`, setting this @@ -148,21 +152,22 @@ type Config struct { pythonProjectRoot string gazelleManifest *manifest.Manifest - excludedPatterns *singlylinkedlist.List - ignoreFiles map[string]struct{} - ignoreDependencies map[string]struct{} - validateImportStatements bool - coarseGrainedGeneration bool - perFileGeneration bool - perFileGenerationIncludeInit bool - libraryNamingConvention string - binaryNamingConvention string - testNamingConvention string - defaultVisibility []string - visibility []string - testFilePattern []string - labelConvention string - labelNormalization LabelNormalizationType + excludedPatterns *singlylinkedlist.List + ignoreFiles map[string]struct{} + ignoreDependencies map[string]struct{} + validateImportStatements bool + coarseGrainedGeneration bool + perFileGeneration bool + perFileGenerationIncludeInit bool + perPackageGenerationRequireTestEntryPoint bool + libraryNamingConvention string + binaryNamingConvention string + testNamingConvention string + defaultVisibility []string + visibility []string + testFilePattern []string + labelConvention string + labelNormalization LabelNormalizationType } type LabelNormalizationType int @@ -179,24 +184,25 @@ func New( pythonProjectRoot string, ) *Config { return &Config{ - extensionEnabled: true, - repoRoot: repoRoot, - pythonProjectRoot: pythonProjectRoot, - excludedPatterns: singlylinkedlist.New(), - ignoreFiles: make(map[string]struct{}), - ignoreDependencies: make(map[string]struct{}), - validateImportStatements: true, - coarseGrainedGeneration: false, - perFileGeneration: false, - perFileGenerationIncludeInit: false, - libraryNamingConvention: packageNameNamingConventionSubstitution, - binaryNamingConvention: fmt.Sprintf("%s_bin", packageNameNamingConventionSubstitution), - testNamingConvention: fmt.Sprintf("%s_test", packageNameNamingConventionSubstitution), - defaultVisibility: []string{fmt.Sprintf(DefaultVisibilityFmtString, "")}, - visibility: []string{}, - testFilePattern: strings.Split(DefaultTestFilePatternString, ","), - labelConvention: DefaultLabelConvention, - labelNormalization: DefaultLabelNormalizationType, + extensionEnabled: true, + repoRoot: repoRoot, + pythonProjectRoot: pythonProjectRoot, + excludedPatterns: singlylinkedlist.New(), + ignoreFiles: make(map[string]struct{}), + ignoreDependencies: make(map[string]struct{}), + validateImportStatements: true, + coarseGrainedGeneration: false, + perFileGeneration: false, + perFileGenerationIncludeInit: false, + perPackageGenerationRequireTestEntryPoint: true, + libraryNamingConvention: packageNameNamingConventionSubstitution, + binaryNamingConvention: fmt.Sprintf("%s_bin", packageNameNamingConventionSubstitution), + testNamingConvention: fmt.Sprintf("%s_test", packageNameNamingConventionSubstitution), + defaultVisibility: []string{fmt.Sprintf(DefaultVisibilityFmtString, "")}, + visibility: []string{}, + testFilePattern: strings.Split(DefaultTestFilePatternString, ","), + labelConvention: DefaultLabelConvention, + labelNormalization: DefaultLabelNormalizationType, } } @@ -220,14 +226,15 @@ func (c *Config) NewChild() *Config { coarseGrainedGeneration: c.coarseGrainedGeneration, perFileGeneration: c.perFileGeneration, perFileGenerationIncludeInit: c.perFileGenerationIncludeInit, - libraryNamingConvention: c.libraryNamingConvention, - binaryNamingConvention: c.binaryNamingConvention, - testNamingConvention: c.testNamingConvention, - defaultVisibility: c.defaultVisibility, - visibility: c.visibility, - testFilePattern: c.testFilePattern, - labelConvention: c.labelConvention, - labelNormalization: c.labelNormalization, + perPackageGenerationRequireTestEntryPoint: c.perPackageGenerationRequireTestEntryPoint, + libraryNamingConvention: c.libraryNamingConvention, + binaryNamingConvention: c.binaryNamingConvention, + testNamingConvention: c.testNamingConvention, + defaultVisibility: c.defaultVisibility, + visibility: c.visibility, + testFilePattern: c.testFilePattern, + labelConvention: c.labelConvention, + labelNormalization: c.labelNormalization, } } @@ -398,6 +405,14 @@ func (c *Config) PerFileGenerationIncludeInit() bool { return c.perFileGenerationIncludeInit } +func (c *Config) SetPerPackageGenerationRequireTestEntryPoint(perPackageGenerationRequireTestEntryPoint bool) { + c.perPackageGenerationRequireTestEntryPoint = perPackageGenerationRequireTestEntryPoint +} + +func (c *Config) PerPackageGenerationRequireTestEntryPoint() bool { + return c.perPackageGenerationRequireTestEntryPoint +} + // SetLibraryNamingConvention sets the py_library target naming convention. func (c *Config) SetLibraryNamingConvention(libraryNamingConvention string) { c.libraryNamingConvention = libraryNamingConvention @@ -494,9 +509,9 @@ func (c *Config) FormatThirdPartyDependency(repositoryName string, distributionN normConventionalDistributionName = strings.Trim(normConventionalDistributionName, "_") case Pep503LabelNormalizationType: // See https://packaging.python.org/en/latest/specifications/name-normalization/#name-format - normConventionalDistributionName = strings.ToLower(conventionalDistributionName) // ... "should be lowercased" + normConventionalDistributionName = strings.ToLower(conventionalDistributionName) // ... "should be lowercased" normConventionalDistributionName = regexp.MustCompile(`[-_.]+`).ReplaceAllString(normConventionalDistributionName, "-") // ... "all runs of the characters ., -, or _ replaced with a single -" - normConventionalDistributionName = strings.Trim(normConventionalDistributionName, "-") // ... "must start and end with a letter or number" + normConventionalDistributionName = strings.Trim(normConventionalDistributionName, "-") // ... "must start and end with a letter or number" default: fallthrough case NoLabelNormalizationType: From ecad092ffa97ac236fb9a6b33ff7f5af4af80eb6 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Fri, 19 Jul 2024 09:01:02 -0700 Subject: [PATCH 132/345] feat: inherit PYTHONSAFEPATH env var from outer process (#2076) By default, PYTHONSAFEPATH is enabled to help prevent imports being found where they shouldn't be. However, this behavior can't be disabled, which makes it harder to use a py_binary when the non-safe path behavior is explicitly desired. To fix, the bootstrap now respects the caller environment's PYTHONSAFEPATH environment variable, if set. This allows the callers to set `PYTHONSAFEPATH=` (empty string) to override the default behavior that enables it. Fixes https://github.com/bazelbuild/rules_python/issues/2060 --- CHANGELOG.md | 3 ++ python/private/stage1_bootstrap_template.sh | 8 ++- tests/base_rules/BUILD.bazel | 8 +++ tests/base_rules/bin.py | 5 +- .../inherit_pythonsafepath_env_test.sh | 51 +++++++++++++++++++ 5 files changed, 73 insertions(+), 2 deletions(-) create mode 100755 tests/base_rules/inherit_pythonsafepath_env_test.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 560c04ea8a..9ccff79aa7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,9 @@ A brief description of the categories of changes: containing ">" sign ### Added +* (rules) `PYTHONSAFEPATH` is inherited from the calling environment to allow + disabling it (Requires {obj}`--bootstrap_impl=script`) + ([#2060](https://github.com/bazelbuild/rules_python/issues/2060)). * (gazelle) Added `python_generation_mode_per_package_require_test_entry_point` in order to better accommodate users who use a custom macro, [`pytest-bazel`][pytest_bazel], [rules_python_pytest] or `rules_py` diff --git a/python/private/stage1_bootstrap_template.sh b/python/private/stage1_bootstrap_template.sh index 46e33b4837..895793b41f 100644 --- a/python/private/stage1_bootstrap_template.sh +++ b/python/private/stage1_bootstrap_template.sh @@ -105,7 +105,13 @@ declare -a interpreter_args # Don't prepend a potentially unsafe path to sys.path # See: https://docs.python.org/3.11/using/cmdline.html#envvar-PYTHONSAFEPATH # NOTE: Only works for 3.11+ -interpreter_env+=("PYTHONSAFEPATH=1") +# We inherit the value from the outer environment in case the user wants to +# opt-out of using PYTHONSAFEPATH. +# Because empty means false and non-empty means true, we have to distinguish +# between "defined and empty" and "not defined at all". +if [[ -z "${PYTHONSAFEPATH+x}" ]]; then + interpreter_env+=("PYTHONSAFEPATH=${PYTHONSAFEPATH+1}") +fi if [[ "$IS_ZIPFILE" == "1" ]]; then interpreter_args+=("-XRULES_PYTHON_ZIP_DIR=$zip_dir") diff --git a/tests/base_rules/BUILD.bazel b/tests/base_rules/BUILD.bazel index 62d73ac88f..e04d3147fd 100644 --- a/tests/base_rules/BUILD.bazel +++ b/tests/base_rules/BUILD.bazel @@ -51,3 +51,11 @@ sh_py_run_test( sh_src = "run_binary_zip_no_test.sh", target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT, ) + +sh_py_run_test( + name = "inherit_pythonsafepath_env_test", + bootstrap_impl = "script", + py_src = "bin.py", + sh_src = "inherit_pythonsafepath_env_test.sh", + target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT, +) diff --git a/tests/base_rules/bin.py b/tests/base_rules/bin.py index cffb79ba19..c46e43adc8 100644 --- a/tests/base_rules/bin.py +++ b/tests/base_rules/bin.py @@ -11,11 +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. -# + +import os import sys print("Hello") print( "RULES_PYTHON_ZIP_DIR:{}".format(sys._xoptions.get("RULES_PYTHON_ZIP_DIR", "UNSET")) ) +print("PYTHONSAFEPATH:", os.environ.get("PYTHONSAFEPATH", "UNSET") or "EMPTY") +print("sys.flags.safe_path:", sys.flags.safe_path) print("file:", __file__) diff --git a/tests/base_rules/inherit_pythonsafepath_env_test.sh b/tests/base_rules/inherit_pythonsafepath_env_test.sh new file mode 100755 index 0000000000..bf85d26ad2 --- /dev/null +++ b/tests/base_rules/inherit_pythonsafepath_env_test.sh @@ -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. + +# --- 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 + + +function expect_match() { + local expected_pattern=$1 + local actual=$2 + if ! (echo "$actual" | grep "$expected_pattern" ) >/dev/null; then + echo "expected output to match: $expected_pattern" + echo "but got:\n$actual" + return 1 + fi +} + + +actual=$(PYTHONSAFEPATH= $bin 2>&1) +expect_match "sys.flags.safe_path: False" "$actual" +expect_match "PYTHONSAFEPATH: EMPTY" "$actual" + +actual=$(PYTHONSAFEPATH=OUTER $bin 2>&1) +expect_match "sys.flags.safe_path: True" "$actual" +expect_match "PYTHONSAFEPATH: OUTER" "$actual" From ae2eb7075fe12585c55d6bd6522cc688d20db94c Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Fri, 19 Jul 2024 15:20:46 -0700 Subject: [PATCH 133/345] fix: insert user imports before runtime site-packages (#2073) Previously, all the user import paths were put at the end of sys.path. This was done so that user import paths didn't hide stdlib modules. However, a side-effect is that user import paths came after the runtime's site-packages directory. This prevented user imports from overriding non-stdlib modules included in a runtime (e.g. pip). To fix, we look for the runtime site-packages directory, then insert the user import paths before it. A test is used to ensure that the ordering is `[stdlib, user, runtime site-packages]` Also fixes a bug introduced by #2076: safe path was being disabled by default Fixes https://github.com/bazelbuild/rules_python/issues/2064 --- CHANGELOG.md | 3 + python/private/stage1_bootstrap_template.sh | 10 ++- python/private/stage2_bootstrap_template.py | 22 ++++- tests/base_rules/BUILD.bazel | 21 ++++- .../inherit_pythonsafepath_env_test.sh | 22 ++++- tests/base_rules/sys_path_order_test.py | 88 +++++++++++++++++++ tests/support/sh_py_run_test.bzl | 66 ++++++++++---- 7 files changed, 207 insertions(+), 25 deletions(-) create mode 100644 tests/base_rules/sys_path_order_test.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ccff79aa7..8a0792d3a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,9 @@ A brief description of the categories of changes: Windows. See [#1840](https://github.com/bazelbuild/rules_python/issues/1840). * (rules) Fixes Mac + `--build_python_zip` + {obj}`--bootstrap_impl=script` ([#2030](https://github.com/bazelbuild/rules_python/issues/2030)). +* (rules) User dependencies come before runtime site-packages when using + {obj}`--bootstrap_impl=script`. + ([#2064](https://github.com/bazelbuild/rules_python/issues/2064)). * (pip) Fixed pypi parse_simpleapi_html function for feeds with package metadata containing ">" sign diff --git a/python/private/stage1_bootstrap_template.sh b/python/private/stage1_bootstrap_template.sh index 895793b41f..959e7babe6 100644 --- a/python/private/stage1_bootstrap_template.sh +++ b/python/private/stage1_bootstrap_template.sh @@ -106,11 +106,13 @@ declare -a interpreter_args # See: https://docs.python.org/3.11/using/cmdline.html#envvar-PYTHONSAFEPATH # NOTE: Only works for 3.11+ # We inherit the value from the outer environment in case the user wants to -# opt-out of using PYTHONSAFEPATH. -# Because empty means false and non-empty means true, we have to distinguish -# between "defined and empty" and "not defined at all". +# opt-out of using PYTHONSAFEPATH. To opt-out, they have to set +# `PYTHONSAFEPATH=` (empty string). This is because Python treats the empty +# value as false, and any non-empty value as true. +# ${FOO+WORD} expands to empty if $FOO is undefined, and WORD otherwise. if [[ -z "${PYTHONSAFEPATH+x}" ]]; then - interpreter_env+=("PYTHONSAFEPATH=${PYTHONSAFEPATH+1}") + # ${FOO-WORD} expands to WORD if $FOO is undefined, and $FOO otherwise + interpreter_env+=("PYTHONSAFEPATH=${PYTHONSAFEPATH-1}") fi if [[ "$IS_ZIPFILE" == "1" ]]; then diff --git a/python/private/stage2_bootstrap_template.py b/python/private/stage2_bootstrap_template.py index 69c0dec0e5..29f59d2195 100644 --- a/python/private/stage2_bootstrap_template.py +++ b/python/private/stage2_bootstrap_template.py @@ -498,9 +498,29 @@ def main(): 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 - sys.path.extend(python_path_entries) + with _maybe_collect_coverage(enable=cov_tool is not None): # The first arg is this bootstrap, so drop that for the re-invocation. _run_py(main_filename, args=sys.argv[1:]) diff --git a/tests/base_rules/BUILD.bazel b/tests/base_rules/BUILD.bazel index e04d3147fd..cd5771533d 100644 --- a/tests/base_rules/BUILD.bazel +++ b/tests/base_rules/BUILD.bazel @@ -13,7 +13,7 @@ # 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", "sh_py_run_test") +load("//tests/support:sh_py_run_test.bzl", "py_reconfig_test", "sh_py_run_test") _SUPPORTS_BOOTSTRAP_SCRIPT = select({ "@platforms//os:windows": ["@platforms//:incompatible"], @@ -52,6 +52,25 @@ sh_py_run_test( target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT, ) +py_reconfig_test( + name = "sys_path_order_bootstrap_script_test", + srcs = ["sys_path_order_test.py"], + bootstrap_impl = "script", + env = {"BOOTSTRAP": "script"}, + imports = ["./site-packages"], + main = "sys_path_order_test.py", + target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT, +) + +py_reconfig_test( + name = "sys_path_order_bootstrap_system_python_test", + srcs = ["sys_path_order_test.py"], + bootstrap_impl = "system_python", + env = {"BOOTSTRAP": "system_python"}, + imports = ["./site-packages"], + main = "sys_path_order_test.py", +) + sh_py_run_test( name = "inherit_pythonsafepath_env_test", bootstrap_impl = "script", diff --git a/tests/base_rules/inherit_pythonsafepath_env_test.sh b/tests/base_rules/inherit_pythonsafepath_env_test.sh index bf85d26ad2..bc6e2d53f3 100755 --- a/tests/base_rules/inherit_pythonsafepath_env_test.sh +++ b/tests/base_rules/inherit_pythonsafepath_env_test.sh @@ -35,17 +35,35 @@ function expect_match() { local expected_pattern=$1 local actual=$2 if ! (echo "$actual" | grep "$expected_pattern" ) >/dev/null; then - echo "expected output to match: $expected_pattern" - echo "but got:\n$actual" + echo "expected to match: $expected_pattern" + echo "===== actual START =====" + echo "$actual" + echo "===== actual END =====" + echo + touch EXPECTATION_FAILED return 1 fi } +echo "Check inherited and disabled" +# Verify setting it to empty string disables safe path actual=$(PYTHONSAFEPATH= $bin 2>&1) expect_match "sys.flags.safe_path: False" "$actual" expect_match "PYTHONSAFEPATH: EMPTY" "$actual" +echo "Check inherited and propagated" +# Verify setting it to any string enables safe path and that +# value is propagated actual=$(PYTHONSAFEPATH=OUTER $bin 2>&1) expect_match "sys.flags.safe_path: True" "$actual" expect_match "PYTHONSAFEPATH: OUTER" "$actual" + +echo "Check enabled by default" +# Verifying doing nothing leaves safepath enabled by default +actual=$($bin 2>&1) +expect_match "sys.flags.safe_path: True" "$actual" +expect_match "PYTHONSAFEPATH: 1" "$actual" + +# Exit if any of the expects failed +[[ ! -e EXPECTATION_FAILED ]] diff --git a/tests/base_rules/sys_path_order_test.py b/tests/base_rules/sys_path_order_test.py new file mode 100644 index 0000000000..2e33464155 --- /dev/null +++ b/tests/base_rules/sys_path_order_test.py @@ -0,0 +1,88 @@ +# 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.path +import re +import sys +import unittest + + +class SysPathOrderTest(unittest.TestCase): + def test_sys_path_order(self): + last_stdlib = None + first_user = None + first_runtime_site = None + + # Classify paths into the three different types we care about: stdlib, + # user dependency, or the runtime's site-package's directory. + # + # Because they often share common prefixes with one another, and vary + # subtly between platforms, we do this in two passes: first categorize, + # then pick out the indexes. This is just so debugging is easier and + # error messages are more informative. + categorized_paths = [] + 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: + category = "user" + elif value.startswith(sys.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"): + category = "runtime-site" + else: + category = "stdlib" + else: + category = "user" + + categorized_paths.append((category, value)) + + for i, (category, _) in enumerate(categorized_paths): + if category == "stdlib": + last_stdlib = i + elif category == "runtime-site": + if first_runtime_site is None: + first_runtime_site = i + elif category == "user": + if first_user is None: + first_user = i + + sys_path_str = "\n".join( + f"{i}: ({category}) {value}" + for i, (category, value) in enumerate(categorized_paths) + ) + if None in (last_stdlib, first_user, first_runtime_site): + self.fail( + "Failed to find position for one of:\n" + + f"{last_stdlib=} {first_user=} {first_runtime_site=}\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" + + 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.path:\n{sys_path_str}", + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/support/sh_py_run_test.bzl b/tests/support/sh_py_run_test.bzl index 4b3d22d5bb..35be484b0d 100644 --- a/tests/support/sh_py_run_test.bzl +++ b/tests/support/sh_py_run_test.bzl @@ -18,6 +18,7 @@ without the overhead of a bazel-in-bazel integration test. """ load("//python:py_binary.bzl", "py_binary") +load("//python:py_test.bzl", "py_test") def _perform_transition_impl(input_settings, attr): settings = dict(input_settings) @@ -37,7 +38,7 @@ _perform_transition = transition( ], ) -def _transition_impl(ctx): +def _py_reconfig_impl(ctx): default_info = ctx.attr.target[DefaultInfo] exe_ext = default_info.files_to_run.executable.extension if exe_ext: @@ -66,27 +67,58 @@ def _transition_impl(ctx): DefaultInfo( executable = executable, files = depset(default_outputs), - runfiles = default_info.default_runfiles, + # On windows, the other default outputs must also be included + # in runfiles so the exe launcher can find the backing file. + runfiles = ctx.runfiles(default_outputs).merge( + default_info.default_runfiles, + ), ), testing.TestEnvironment( environment = ctx.attr.env, ), ] -transition_binary = rule( - implementation = _transition_impl, - attrs = { - "bootstrap_impl": attr.string(), - "build_python_zip": attr.string(default = "auto"), - "env": attr.string_dict(), - "target": attr.label(executable = True, cfg = "target"), - "_allowlist_function_transition": attr.label( - default = "@bazel_tools//tools/allowlists/function_transition_allowlist", - ), - }, - cfg = _perform_transition, - executable = True, -) +def _make_reconfig_rule(**kwargs): + return rule( + implementation = _py_reconfig_impl, + attrs = { + "bootstrap_impl": attr.string(), + "build_python_zip": attr.string(default = "auto"), + "env": attr.string_dict(), + "target": attr.label(executable = True, cfg = "target"), + "_allowlist_function_transition": attr.label( + default = "@bazel_tools//tools/allowlists/function_transition_allowlist", + ), + }, + cfg = _perform_transition, + **kwargs + ) + +_py_reconfig_binary = _make_reconfig_rule(executable = True) + +_py_reconfig_test = _make_reconfig_rule(test = True) + +def py_reconfig_test(*, name, **kwargs): + """Create a py_test with customized build settings for testing. + + Args: + name: str, name of teset target. + **kwargs: kwargs to pass along to _py_reconfig_test and py_test. + """ + reconfig_kwargs = {} + reconfig_kwargs["bootstrap_impl"] = kwargs.pop("bootstrap_impl") + reconfig_kwargs["env"] = kwargs.get("env") + inner_name = "_{}_inner" + name + _py_reconfig_test( + name = name, + target = inner_name, + **reconfig_kwargs + ) + py_test( + name = inner_name, + tags = ["manual"], + **kwargs + ) def sh_py_run_test(*, name, sh_src, py_src, **kwargs): bin_name = "_{}_bin".format(name) @@ -102,7 +134,7 @@ def sh_py_run_test(*, name, sh_src, py_src, **kwargs): }, ) - transition_binary( + _py_reconfig_binary( name = bin_name, tags = ["manual"], target = "_{}_plain_bin".format(name), From 4a262fae88bad2c4f59c7c60a97360c316e64946 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 20 Jul 2024 14:04:16 +0900 Subject: [PATCH 134/345] fix(pypi): fix the whl selection algorithm after #2069 (#2078) It seems that a few things broke in recent commits: - We are not using the `MODULE.bazel.lock` file and it seems that it is easy to miss when the components in the PyPI extension stop integrating well together. This happened during the switch to `{abi}_{os}_{plat}` target platform passing within the code. - The logger code stopped working in the extension after the recent additions to add the `rule_name`. - `repo_utils.getenv` was always getting `PATH` env var on bazel `6.x`. This PR fixes both cases and updates docs to serve as a better reminder. By fixing the `select_whls` code and we can just rely on target platform triples (ABI, OS, CPU). This gets one step closer to maybe supporting optional `python_version` which would address #1708. Whilst at it we are also adding different status messages for building the wheel from `sdist` vs just extracting or downloading the wheel. Tests: - Added more unit tests and brought them in line with the rest of the code. - Checked manually for differences between the `MODULE.bazel.lock` files in our `rules_python` extension before #2069 and after this PR and there are no differences except in the `experimental_target_platforms` attribute in `whl_library`. Before this PR you would see that we do not select any wheels for e.g. `MarkupSafe` and we are always building from `sdist`. Work towards #260. --- CHANGELOG.md | 3 +- python/private/pypi/extension.bzl | 3 +- python/private/pypi/parse_requirements.bzl | 33 +------ python/private/pypi/whl_library.bzl | 9 +- python/private/pypi/whl_target_platforms.bzl | 41 ++++++-- python/private/repo_utils.bzl | 33 ++++--- .../parse_requirements_tests.bzl | 14 --- .../whl_target_platforms/select_whl_tests.bzl | 93 +++++++++---------- 8 files changed, 110 insertions(+), 119 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a0792d3a5..8c03a79061 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,8 @@ A brief description of the categories of changes: [x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/x.x.x ### Changed -* Nothing yet +* (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. ### Fixed * (rules) Signals are properly received when using {obj}`--bootstrap_impl=script` diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 95526e4252..82e580d3a2 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -99,7 +99,7 @@ You cannot use both the additive_build_content and additive_build_content_file a ) def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, simpleapi_cache, exposed_packages): - logger = repo_utils.logger(module_ctx) + logger = repo_utils.logger(module_ctx, "pypi:create_whl_repos") python_interpreter_target = pip_attr.python_interpreter_target is_hub_reproducible = True @@ -195,7 +195,6 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s logger = logger, ), get_index_urls = get_index_urls, - python_version = major_minor, logger = logger, ) diff --git a/python/private/pypi/parse_requirements.bzl b/python/private/pypi/parse_requirements.bzl index 968c486bfb..0cab1d708a 100644 --- a/python/private/pypi/parse_requirements.bzl +++ b/python/private/pypi/parse_requirements.bzl @@ -38,9 +38,7 @@ def parse_requirements( requirements_by_platform = {}, extra_pip_args = [], get_index_urls = None, - python_version = None, - logger = None, - fail_fn = fail): + logger = None): """Get the requirements with platforms that the requirements apply to. Args: @@ -53,10 +51,7 @@ def parse_requirements( get_index_urls: Callable[[ctx, list[str]], dict], a callable to get all of the distribution URLs from a PyPI index. Accepts ctx and distribution names to query. - python_version: str or None. This is needed when the get_index_urls is - specified. It should be of the form "3.x.x", logger: repo_utils.logger or None, a simple struct to log diagnostic messages. - fail_fn (Callable[[str], None]): A failure function used in testing failure cases. Returns: A tuple where the first element a dict of dicts where the first key is @@ -137,10 +132,6 @@ def parse_requirements( index_urls = {} if get_index_urls: - if not python_version: - fail_fn("'python_version' must be provided") - return None - index_urls = get_index_urls( ctx, # Use list({}) as a way to have a set @@ -168,9 +159,8 @@ def parse_requirements( for r in sorted(reqs.values(), key = lambda r: r.requirement_line): whls, sdist = _add_dists( - r, - index_urls.get(whl_name), - python_version = python_version, + requirement = r, + index_urls = index_urls.get(whl_name), logger = logger, ) @@ -238,7 +228,7 @@ def host_platform(ctx): repo_utils.get_platforms_cpu_name(ctx), ) -def _add_dists(requirement, index_urls, python_version, logger = None): +def _add_dists(*, requirement, index_urls, logger = None): """Populate dists based on the information from the PyPI index. This function will modify the given requirements_by_platform data structure. @@ -246,7 +236,6 @@ def _add_dists(requirement, index_urls, python_version, logger = None): Args: requirement: The result of parse_requirements function. index_urls: The result of simpleapi_download. - python_version: The version of the python interpreter. logger: A logger for printing diagnostic info. """ if not index_urls: @@ -289,18 +278,6 @@ def _add_dists(requirement, index_urls, python_version, logger = None): ])) # Filter out the wheels that are incompatible with the target_platforms. - whls = select_whls( - whls = whls, - want_abis = [ - "none", - "abi3", - "cp" + python_version.replace(".", ""), - # Older python versions have wheels for the `*m` ABI. - "cp" + python_version.replace(".", "") + "m", - ], - want_platforms = requirement.target_platforms, - want_python_version = python_version, - logger = logger, - ) + whls = select_whls(whls = whls, want_platforms = requirement.target_platforms, logger = logger) return whls, sdist diff --git a/python/private/pypi/whl_library.bzl b/python/private/pypi/whl_library.bzl index f453f92ccf..0419926c7a 100644 --- a/python/private/pypi/whl_library.bzl +++ b/python/private/pypi/whl_library.bzl @@ -231,9 +231,16 @@ def _whl_library_impl(rctx): args = _parse_optional_attrs(rctx, args, extra_pip_args) if not whl_path: + if rctx.attr.urls: + op_tmpl = "whl_library.BuildWheelFromSource({name}, {requirement})" + elif rctx.attr.download_only: + op_tmpl = "whl_library.DownloadWheel({name}, {requirement})" + else: + op_tmpl = "whl_library.ResolveRequirement({name}, {requirement})" + repo_utils.execute_checked( rctx, - op = "whl_library.ResolveRequirement({}, {})".format(rctx.attr.name, rctx.attr.requirement), + op = op_tmpl.format(name = rctx.attr.name, requirement = rctx.attr.requirement), arguments = args, environment = environment, quiet = rctx.attr.quiet, diff --git a/python/private/pypi/whl_target_platforms.bzl b/python/private/pypi/whl_target_platforms.bzl index bee795732a..bdc44c697a 100644 --- a/python/private/pypi/whl_target_platforms.bzl +++ b/python/private/pypi/whl_target_platforms.bzl @@ -46,15 +46,13 @@ _OS_PREFIXES = { "win": "windows", } # buildifier: disable=unsorted-dict-items -def select_whls(*, whls, want_python_version = "3.0", want_abis = [], want_platforms = [], logger = None): +def select_whls(*, whls, want_platforms = [], logger = None): """Select a subset of wheels suitable for target platforms from a list. Args: whls(list[struct]): A list of candidates which have a `filename` attribute containing the `whl` filename. - want_python_version(str): An optional parameter to filter whls by python version. Defaults to '3.0'. - want_abis(list[str]): A list of ABIs that are supported. - want_platforms(str): The platforms + want_platforms(str): The platforms in "{abi}_{os}_{cpu}" or "{os}_{cpu}" format. logger: A logger for printing diagnostic messages. Returns: @@ -64,9 +62,34 @@ def select_whls(*, whls, want_python_version = "3.0", want_abis = [], want_platf if not whls: return [] - version_limit = -1 - if want_python_version: - version_limit = int(want_python_version.split(".")[1]) + want_abis = { + "abi3": None, + "none": None, + } + + _want_platforms = {} + version_limit = None + + for p in want_platforms: + if not p.startswith("cp3"): + fail("expected all platforms to start with ABI, but got: {}".format(p)) + + abi, _, os_cpu = p.partition("_") + _want_platforms[os_cpu] = None + _want_platforms[p] = None + + version_limit_candidate = int(abi[3:]) + if not version_limit: + version_limit = version_limit_candidate + if version_limit and version_limit != version_limit_candidate: + fail("Only a single python version is supported for now") + + # For some legacy implementations the wheels may target the `cp3xm` ABI + _want_platforms["{}m_{}".format(abi, os_cpu)] = None + want_abis[abi] = None + want_abis[abi + "m"] = None + + want_platforms = sorted(_want_platforms) candidates = {} for whl in whls: @@ -101,7 +124,7 @@ def select_whls(*, whls, want_python_version = "3.0", want_abis = [], want_platf logger.trace(lambda: "Discarding the whl because the whl abi did not match") continue - if version_limit != -1 and whl_version_min > version_limit: + if whl_version_min > version_limit: if logger: logger.trace(lambda: "Discarding the whl because the whl supported python version is too high") continue @@ -110,7 +133,7 @@ def select_whls(*, whls, want_python_version = "3.0", want_abis = [], want_platf if parsed.platform_tag == "any": compatible = True else: - for p in whl_target_platforms(parsed.platform_tag): + for p in whl_target_platforms(parsed.platform_tag, abi_tag = parsed.abi_tag.strip("m") if parsed.abi_tag.startswith("cp") else None): if p.target_platform in want_platforms: compatible = True break diff --git a/python/private/repo_utils.bzl b/python/private/repo_utils.bzl index 18937895f5..3c07027663 100644 --- a/python/private/repo_utils.bzl +++ b/python/private/repo_utils.bzl @@ -42,22 +42,23 @@ def _debug_print(rctx, message_cb): if _is_repo_debug_enabled(rctx): print(message_cb()) # buildifier: disable=print -def _logger(rctx): +def _logger(ctx, name = None): """Creates a logger instance for printing messages. Args: - rctx: repository_ctx object. If the attribute `_rule_name` is - present, it will be included in log messages. + ctx: repository_ctx or module_ctx object. If the attribute + `_rule_name` is present, it will be included in log messages. + name: name for the logger. Optional for repository_ctx usage. Returns: A struct with attributes logging: trace, debug, info, warn, fail. """ - if _is_repo_debug_enabled(rctx): + if _is_repo_debug_enabled(ctx): verbosity_level = "DEBUG" else: verbosity_level = "WARN" - env_var_verbosity = rctx.os.environ.get(REPO_VERBOSITY_ENV_VAR) + env_var_verbosity = _getenv(ctx, REPO_VERBOSITY_ENV_VAR) verbosity_level = env_var_verbosity or verbosity_level verbosity = { @@ -66,18 +67,23 @@ def _logger(rctx): "TRACE": 3, }.get(verbosity_level, 0) + if hasattr(ctx, "attr"): + # This is `repository_ctx`. + name = name or "{}(@@{})".format(getattr(ctx.attr, "_rule_name", "?"), ctx.name) + elif not name: + fail("The name has to be specified when using the logger with `module_ctx`") + def _log(enabled_on_verbosity, level, message_cb_or_str): if verbosity < enabled_on_verbosity: return - rule_name = getattr(rctx.attr, "_rule_name", "?") + if type(message_cb_or_str) == "string": message = message_cb_or_str else: message = message_cb_or_str() - print("\nrules_python:{}(@@{}) {}:".format( - rule_name, - rctx.name, + print("\nrules_python:{} {}:".format( + name, level.upper(), ), message) # buildifier: disable=print @@ -278,12 +284,9 @@ def _which_describe_failure(binary_name, path): path = path, ) -def _getenv(rctx, name, default = None): - # Bazel 7+ API - if hasattr(rctx, "getenv"): - return rctx.getenv(name, default) - else: - return rctx.os.environ.get("PATH", default) +def _getenv(ctx, name, default = None): + # Bazel 7+ API has ctx.getenv + return getattr(ctx, "getenv", ctx.os.environ.get)(name, default) def _args_to_str(arguments): return " ".join([_arg_repr(a) for a in arguments]) diff --git a/tests/pypi/parse_requirements/parse_requirements_tests.bzl b/tests/pypi/parse_requirements/parse_requirements_tests.bzl index 1a7143b747..280dbd1a6c 100644 --- a/tests/pypi/parse_requirements/parse_requirements_tests.bzl +++ b/tests/pypi/parse_requirements/parse_requirements_tests.bzl @@ -197,20 +197,6 @@ def _test_select_requirement_none_platform(env): _tests.append(_test_select_requirement_none_platform) -def _test_fail_no_python_version(env): - errors = [] - parse_requirements( - ctx = _mock_ctx(), - requirements_by_platform = { - "requirements_lock": [""], - }, - get_index_urls = lambda _, __: {}, - fail_fn = errors.append, - ) - env.expect.that_str(errors[0]).equals("'python_version' must be provided") - -_tests.append(_test_fail_no_python_version) - def parse_requirements_test_suite(name): """Create the test suite. diff --git a/tests/pypi/whl_target_platforms/select_whl_tests.bzl b/tests/pypi/whl_target_platforms/select_whl_tests.bzl index 3fd80e3ee3..2994bd513f 100644 --- a/tests/pypi/whl_target_platforms/select_whl_tests.bzl +++ b/tests/pypi/whl_target_platforms/select_whl_tests.bzl @@ -15,6 +15,7 @@ "" load("@rules_testing//lib:test_suite.bzl", "test_suite") +load("//python/private:repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "REPO_VERBOSITY_ENV_VAR", "repo_utils") # buildifier: disable=bzl-visibility load("//python/private/pypi:whl_target_platforms.bzl", "select_whls") # buildifier: disable=bzl-visibility WHL_LIST = [ @@ -79,7 +80,7 @@ def _match(env, got, *want_filenames): # Check that we pass the original structs env.expect.that_str(got[0].other).equals("dummy") -def _select_whls(whls, **kwargs): +def _select_whls(whls, debug = False, **kwargs): return select_whls( whls = [ struct( @@ -88,6 +89,14 @@ def _select_whls(whls, **kwargs): ) for f in whls ], + logger = repo_utils.logger(struct( + os = struct( + environ = { + REPO_DEBUG_ENV_VAR: "1", + REPO_VERBOSITY_ENV_VAR: "TRACE" if debug else "INFO", + }, + ), + ), "unit-test"), **kwargs ) @@ -100,39 +109,21 @@ def _test_simplest(env): "pkg-0.0.1-py3-abi3-any.whl", "pkg-0.0.1-py3-none-any.whl", ], - want_abis = ["none"], - want_platforms = ["ignored"], + want_platforms = ["cp30_ignored"], ) _match( env, got, + "pkg-0.0.1-py3-abi3-any.whl", "pkg-0.0.1-py3-none-any.whl", ) _tests.append(_test_simplest) -def _test_select_abi3(env): - got = _select_whls( - whls = [ - "pkg-0.0.1-py2.py3-abi3-any.whl", - "pkg-0.0.1-py3-abi3-any.whl", - "pkg-0.0.1-py3-none-any.whl", - ], - want_abis = ["abi3"], - want_platforms = ["ignored"], - ) - _match( - env, - got, - "pkg-0.0.1-py3-abi3-any.whl", - ) - -_tests.append(_test_select_abi3) - def _test_select_by_supported_py_version(env): - for want_python_version, match in { - "3.11": "pkg-0.0.1-py311-abi3-any.whl", - "3.8": "pkg-0.0.1-py3-abi3-any.whl", + for minor_version, match in { + 8: "pkg-0.0.1-py3-abi3-any.whl", + 11: "pkg-0.0.1-py311-abi3-any.whl", }.items(): got = _select_whls( whls = [ @@ -140,18 +131,16 @@ def _test_select_by_supported_py_version(env): "pkg-0.0.1-py3-abi3-any.whl", "pkg-0.0.1-py311-abi3-any.whl", ], - want_abis = ["abi3"], - want_platforms = ["ignored"], - want_python_version = want_python_version, + want_platforms = ["cp3{}_ignored".format(minor_version)], ) _match(env, got, match) _tests.append(_test_select_by_supported_py_version) def _test_select_by_supported_cp_version(env): - for want_python_version, match in { - "3.11": "pkg-0.0.1-cp311-abi3-any.whl", - "3.8": "pkg-0.0.1-py3-abi3-any.whl", + for minor_version, match in { + 11: "pkg-0.0.1-cp311-abi3-any.whl", + 8: "pkg-0.0.1-py3-abi3-any.whl", }.items(): got = _select_whls( whls = [ @@ -160,18 +149,16 @@ def _test_select_by_supported_cp_version(env): "pkg-0.0.1-py311-abi3-any.whl", "pkg-0.0.1-cp311-abi3-any.whl", ], - want_abis = ["abi3"], - want_platforms = ["ignored"], - want_python_version = want_python_version, + want_platforms = ["cp3{}_ignored".format(minor_version)], ) _match(env, got, match) _tests.append(_test_select_by_supported_cp_version) def _test_supported_cp_version_manylinux(env): - for want_python_version, match in { - "3.11": "pkg-0.0.1-cp311-none-manylinux_x86_64.whl", - "3.8": "pkg-0.0.1-py3-none-manylinux_x86_64.whl", + for minor_version, match in { + 8: "pkg-0.0.1-py3-none-manylinux_x86_64.whl", + 11: "pkg-0.0.1-cp311-none-manylinux_x86_64.whl", }.items(): got = _select_whls( whls = [ @@ -180,9 +167,7 @@ def _test_supported_cp_version_manylinux(env): "pkg-0.0.1-py311-none-manylinux_x86_64.whl", "pkg-0.0.1-cp311-none-manylinux_x86_64.whl", ], - want_abis = ["none"], - want_platforms = ["linux_x86_64"], - want_python_version = want_python_version, + want_platforms = ["cp3{}_linux_x86_64".format(minor_version)], ) _match(env, got, match) @@ -193,8 +178,7 @@ def _test_ignore_unsupported(env): whls = [ "pkg-0.0.1-xx3-abi3-any.whl", ], - want_abis = ["abi3"], - want_platforms = ["ignored"], + want_platforms = ["cp30_ignored"], ) _match(env, got) @@ -202,24 +186,28 @@ _tests.append(_test_ignore_unsupported) def _test_match_abi_and_not_py_version(env): # Check we match the ABI and not the py version - got = _select_whls(whls = WHL_LIST, want_abis = ["cp37m"], want_platforms = ["linux_x86_64"], want_python_version = "3.7") + got = _select_whls(whls = WHL_LIST, want_platforms = ["cp37_linux_x86_64"]) _match( env, got, "pkg-0.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", "pkg-0.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", + "pkg-0.0.1-py3-abi3-any.whl", + "pkg-0.0.1-py3-none-any.whl", ) _tests.append(_test_match_abi_and_not_py_version) def _test_select_filename_with_many_tags(env): # Check we can select a filename with many platform tags - got = _select_whls(whls = WHL_LIST, want_abis = ["cp39"], want_platforms = ["linux_x86_32"], want_python_version = "3.9") + got = _select_whls(whls = WHL_LIST, want_platforms = ["cp39_linux_x86_32"]) _match( env, got, "pkg-0.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", "pkg-0.0.1-cp39-cp39-musllinux_1_1_i686.whl", + "pkg-0.0.1-cp39-abi3-any.whl", + "pkg-0.0.1-py3-none-any.whl", ) _tests.append(_test_select_filename_with_many_tags) @@ -228,41 +216,48 @@ def _test_osx_prefer_arch_specific(env): # Check that we prefer the specific wheel got = _select_whls( whls = WHL_LIST, - want_abis = ["cp311"], - want_platforms = ["osx_x86_64", "osx_x86_32"], - want_python_version = "3.11", + want_platforms = ["cp311_osx_x86_64", "cp311_osx_x86_32"], ) _match( env, got, "pkg-0.0.1-cp311-cp311-macosx_10_9_universal2.whl", "pkg-0.0.1-cp311-cp311-macosx_10_9_x86_64.whl", + "pkg-0.0.1-cp39-abi3-any.whl", + "pkg-0.0.1-py3-none-any.whl", ) - got = _select_whls(whls = WHL_LIST, want_abis = ["cp311"], want_platforms = ["osx_aarch64"], want_python_version = "3.11") + got = _select_whls(whls = WHL_LIST, want_platforms = ["cp311_osx_aarch64"]) _match( env, got, "pkg-0.0.1-cp311-cp311-macosx_10_9_universal2.whl", "pkg-0.0.1-cp311-cp311-macosx_11_0_arm64.whl", + "pkg-0.0.1-cp39-abi3-any.whl", + "pkg-0.0.1-py3-none-any.whl", ) _tests.append(_test_osx_prefer_arch_specific) def _test_osx_fallback_to_universal2(env): # Check that we can use the universal2 if the arm wheel is not available - got = _select_whls(whls = [w for w in WHL_LIST if "arm64" not in w], want_abis = ["cp311"], want_platforms = ["osx_aarch64"], want_python_version = "3.11") + got = _select_whls( + whls = [w for w in WHL_LIST if "arm64" not in w], + want_platforms = ["cp311_osx_aarch64"], + ) _match( env, got, "pkg-0.0.1-cp311-cp311-macosx_10_9_universal2.whl", + "pkg-0.0.1-cp39-abi3-any.whl", + "pkg-0.0.1-py3-none-any.whl", ) _tests.append(_test_osx_fallback_to_universal2) def _test_prefer_manylinux_wheels(env): # Check we prefer platform specific wheels - got = _select_whls(whls = WHL_LIST, want_abis = ["none", "abi3", "cp39"], want_platforms = ["linux_x86_64"], want_python_version = "3.9") + got = _select_whls(whls = WHL_LIST, want_platforms = ["cp39_linux_x86_64"]) _match( env, got, From 6c465e6f2cf4c9104b1417c4d6fee0b897412fd1 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 20 Jul 2024 23:23:25 +0900 Subject: [PATCH 135/345] fix(sphinxdocs): use Label in the readthedocs_install macro (#2080) This just makes it possible to use the macro outside `rules_python`. Not adding anything to the CHANGELOG as this is not a documented API. --- sphinxdocs/private/readthedocs.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sphinxdocs/private/readthedocs.bzl b/sphinxdocs/private/readthedocs.bzl index 3cab75b64c..ee8e7aa0e2 100644 --- a/sphinxdocs/private/readthedocs.bzl +++ b/sphinxdocs/private/readthedocs.bzl @@ -43,6 +43,6 @@ def readthedocs_install(name, docs, **kwargs): "$(rlocationpaths {})".format(d) for d in docs ], - deps = ["//python/runfiles"], + deps = [Label("//python/runfiles")], **kwargs ) From 90baa6bcf953ce2f34e517d7cd6c9a0ab4ee6304 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 21 Jul 2024 21:45:13 -0700 Subject: [PATCH 136/345] refactor: use logger in repo_utils.execute_* functions (#2082) This is to unify how it handles printing log messages. This also updates repo rules using repo_utils to create loggers and set the `_rule_name` attribute for the logger to use. * Also removes defunct repo_utils.debug_print * Also makes some functions private that aren't used elsewhere --- python/private/local_runtime_repo.bzl | 1 + python/private/pypi/whl_library.bzl | 15 +++++++++----- python/private/repo_utils.bzl | 29 ++++++++++----------------- python/private/toolchains_repo.bzl | 18 +++++++++++------ python/repositories.bzl | 12 ++++++++++- 5 files changed, 45 insertions(+), 30 deletions(-) diff --git a/python/private/local_runtime_repo.bzl b/python/private/local_runtime_repo.bzl index a206e6d7dd..4e7edde9d8 100644 --- a/python/private/local_runtime_repo.bzl +++ b/python/private/local_runtime_repo.bzl @@ -69,6 +69,7 @@ def _local_runtime_repo_impl(rctx): rctx.path(rctx.attr._get_local_runtime_info), ], quiet = True, + logger = logger, ) if exec_result.return_code != 0: if on_failure == "fail": diff --git a/python/private/pypi/whl_library.bzl b/python/private/pypi/whl_library.bzl index 0419926c7a..c4e1f76897 100644 --- a/python/private/pypi/whl_library.bzl +++ b/python/private/pypi/whl_library.bzl @@ -60,7 +60,7 @@ def _get_xcode_location_cflags(rctx): "-isysroot {}/SDKs/MacOSX.sdk".format(xcode_root), ] -def _get_toolchain_unix_cflags(rctx, python_interpreter): +def _get_toolchain_unix_cflags(rctx, python_interpreter, logger = None): """Gather cflags from a standalone toolchain for unix systems. Pip won't be able to compile c extensions from sdists with the pre built python distributions from indygreg @@ -72,7 +72,7 @@ def _get_toolchain_unix_cflags(rctx, python_interpreter): return [] # Only update the location when using a standalone toolchain. - if not is_standalone_interpreter(rctx, python_interpreter): + if not is_standalone_interpreter(rctx, python_interpreter, logger = logger): return [] stdout = repo_utils.execute_checked_stdout( @@ -147,12 +147,13 @@ def _parse_optional_attrs(rctx, args, extra_pip_args = None): return args -def _create_repository_execution_environment(rctx, python_interpreter): +def _create_repository_execution_environment(rctx, python_interpreter, logger = None): """Create a environment dictionary for processes we spawn with rctx.execute. Args: rctx (repository_ctx): The repository context. python_interpreter (path): The resolved python interpreter. + logger: Optional logger to use for operations. Returns: Dictionary of environment variable suitable to pass to rctx.execute. """ @@ -160,7 +161,7 @@ def _create_repository_execution_environment(rctx, python_interpreter): # Gather any available CPPFLAGS values cppflags = [] cppflags.extend(_get_xcode_location_cflags(rctx)) - cppflags.extend(_get_toolchain_unix_cflags(rctx, python_interpreter)) + cppflags.extend(_get_toolchain_unix_cflags(rctx, python_interpreter, logger = logger)) env = { "PYTHONPATH": pypi_repo_utils.construct_pythonpath( @@ -173,6 +174,7 @@ def _create_repository_execution_environment(rctx, python_interpreter): return env def _whl_library_impl(rctx): + logger = repo_utils.logger(rctx) python_interpreter = pypi_repo_utils.resolve_python_interpreter( rctx, python_interpreter = rctx.attr.python_interpreter, @@ -189,7 +191,7 @@ def _whl_library_impl(rctx): extra_pip_args.extend(rctx.attr.extra_pip_args) # Manually construct the PYTHONPATH since we cannot use the toolchain here - environment = _create_repository_execution_environment(rctx, python_interpreter) + environment = _create_repository_execution_environment(rctx, python_interpreter, logger = logger) whl_path = None if rctx.attr.whl_file: @@ -245,6 +247,7 @@ def _whl_library_impl(rctx): environment = environment, quiet = rctx.attr.quiet, timeout = rctx.attr.timeout, + logger = logger, ) whl_path = rctx.path(json.decode(rctx.read("whl_file.json"))["whl_file"]) @@ -292,6 +295,7 @@ def _whl_library_impl(rctx): environment = environment, quiet = rctx.attr.quiet, timeout = rctx.attr.timeout, + logger = logger, ) metadata = json.decode(rctx.read("metadata.json")) @@ -440,6 +444,7 @@ attr makes `extra_pip_args` and `download_only` ignored.""", for repo in all_repo_names ], ), + "_rule_name": attr.string(default = "whl_library"), }, **ATTRS) whl_library_attrs.update(AUTH_ATTRS) diff --git a/python/private/repo_utils.bzl b/python/private/repo_utils.bzl index 3c07027663..1c50ac6bf4 100644 --- a/python/private/repo_utils.bzl +++ b/python/private/repo_utils.bzl @@ -31,17 +31,6 @@ def _is_repo_debug_enabled(rctx): """ return _getenv(rctx, REPO_DEBUG_ENV_VAR) == "1" -def _debug_print(rctx, message_cb): - """Prints a message if repo debugging is enabled. - - Args: - rctx: repository_ctx - message_cb: Callable that returns the string to print. Takes - no arguments. - """ - if _is_repo_debug_enabled(rctx): - print(message_cb()) # buildifier: disable=print - def _logger(ctx, name = None): """Creates a logger instance for printing messages. @@ -73,7 +62,7 @@ def _logger(ctx, name = None): elif not name: fail("The name has to be specified when using the logger with `module_ctx`") - def _log(enabled_on_verbosity, level, message_cb_or_str): + def _log(enabled_on_verbosity, level, message_cb_or_str, printer = print): if verbosity < enabled_on_verbosity: return @@ -82,7 +71,8 @@ def _logger(ctx, name = None): else: message = message_cb_or_str() - print("\nrules_python:{} {}:".format( + # NOTE: printer may be the `fail` function. + printer("\nrules_python:{} {}:".format( name, level.upper(), ), message) # buildifier: disable=print @@ -92,6 +82,7 @@ def _logger(ctx, name = None): debug = lambda message_cb: _log(2, "DEBUG", message_cb), info = lambda message_cb: _log(1, "INFO", message_cb), warn = lambda message_cb: _log(0, "WARNING", message_cb), + fail = lambda message_cb: _log(-1, "FAIL", message_cb, fail), ) def _execute_internal( @@ -101,6 +92,7 @@ def _execute_internal( fail_on_error = False, arguments, environment = {}, + logger = None, **kwargs): """Execute a subprocess with debugging instrumentation. @@ -114,12 +106,15 @@ def _execute_internal( arguments: list of arguments; see rctx.execute#arguments. environment: optional dict of the environment to run the command in; see rctx.execute#environment. + logger: optional `Logger` to use for logging execution details. If + not specified, a default will be created. **kwargs: additional kwargs to pass onto rctx.execute Returns: exec_result object, see repository_ctx.execute return type. """ - _debug_print(rctx, lambda: ( + logger = logger or _logger(rctx) + logger.debug(lambda: ( "repo.execute: {op}: start\n" + " command: {cmd}\n" + " working dir: {cwd}\n" + @@ -137,7 +132,7 @@ def _execute_internal( result = rctx.execute(arguments, environment = environment, **kwargs) if fail_on_error and result.return_code != 0: - fail(( + logger.fail(( "repo.execute: {op}: end: failure:\n" + " command: {cmd}\n" + " return code: {return_code}\n" + @@ -155,8 +150,7 @@ def _execute_internal( output = _outputs_to_str(result), )) elif _is_repo_debug_enabled(rctx): - # buildifier: disable=print - print(( + logger.debug(( "repo.execute: {op}: end: {status}\n" + " return code: {return_code}\n" + "{output}" @@ -413,7 +407,6 @@ def _watch_tree(rctx, *args, **kwargs): repo_utils = struct( # keep sorted - debug_print = _debug_print, execute_checked = _execute_checked, execute_checked_stdout = _execute_checked_stdout, execute_unchecked = _execute_unchecked, diff --git a/python/private/toolchains_repo.bzl b/python/private/toolchains_repo.bzl index dd59e477d8..df16fb8cf7 100644 --- a/python/private/toolchains_repo.bzl +++ b/python/private/toolchains_repo.bzl @@ -120,9 +120,10 @@ toolchains_repo = repository_rule( ) def _toolchain_aliases_impl(rctx): - (os_name, arch) = get_host_os_arch(rctx) + logger = repo_utils.logger(rctx) + (os_name, arch) = _get_host_os_arch(rctx, logger) - host_platform = get_host_platform(os_name, arch) + 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" @@ -236,14 +237,15 @@ actions.""", ) 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) - host_platform = get_host_platform(os_name, arch) + (os_name, arch) = _get_host_os_arch(rctx, logger) + host_platform = _get_host_platform(os_name, arch) repo = "@@{py_repository}_{host_platform}".format( py_repository = rctx.attr.name[:-len("_host")], host_platform = host_platform, @@ -320,6 +322,7 @@ this repo causes an eager fetch of the toolchain for the host platform. mandatory = True, doc = "The base name for all created repositories, like 'python38'.", ), + "_rule_name": attr.string(default = "host_toolchain"), "_rules_python_workspace": attr.label(default = Label("//:WORKSPACE")), }, ) @@ -384,7 +387,7 @@ multi_toolchain_aliases = repository_rule( def sanitize_platform_name(platform): return platform.replace("-", "_") -def get_host_platform(os_name, arch): +def _get_host_platform(os_name, arch): """Gets the host platform. Args: @@ -401,11 +404,13 @@ def get_host_platform(os_name, arch): fail("No platform declared for host OS {} on arch {}".format(os_name, arch)) return host_platform -def get_host_os_arch(rctx): +def _get_host_os_arch(rctx, logger): """Infer the host OS name and arch from a repository context. Args: rctx: Bazel's repository_ctx. + logger: Logger to use for operations. + Returns: A tuple with the host OS name and arch. """ @@ -423,6 +428,7 @@ def get_host_os_arch(rctx): rctx, op = "GetUname", arguments = [repo_utils.which_checked(rctx, "uname"), "-m"], + logger = logger, ).stdout.strip() # Normalize the os_name. diff --git a/python/repositories.bzl b/python/repositories.bzl index d58feefd31..baa5f5ba70 100644 --- a/python/repositories.bzl +++ b/python/repositories.bzl @@ -76,12 +76,13 @@ def py_repositories(): STANDALONE_INTERPRETER_FILENAME = "STANDALONE_INTERPRETER" -def is_standalone_interpreter(rctx, python_interpreter_path): +def is_standalone_interpreter(rctx, python_interpreter_path, *, logger = None): """Query a python interpreter target for whether or not it's a rules_rust provided toolchain Args: rctx (repository_ctx): The repository rule's context object. python_interpreter_path (path): A path representing the interpreter. + logger: Optional logger to use for operations. Returns: bool: Whether or not the target is from a rules_python generated toolchain. @@ -102,6 +103,7 @@ def is_standalone_interpreter(rctx, python_interpreter_path): STANDALONE_INTERPRETER_FILENAME, ), ], + logger = logger, ).return_code == 0 def _python_repository_impl(rctx): @@ -110,6 +112,8 @@ def _python_repository_impl(rctx): if bool(rctx.attr.url) == bool(rctx.attr.urls): fail("Exactly one of (url, urls) must be set.") + logger = repo_utils.logger(rctx) + platform = rctx.attr.platform python_version = rctx.attr.python_version python_version_info = python_version.split(".") @@ -145,6 +149,7 @@ def _python_repository_impl(rctx): timeout = 600, quiet = True, working_directory = working_directory, + logger = logger, ) zstd = "{working_directory}/zstd".format(working_directory = working_directory) unzstd = "./unzstd" @@ -160,6 +165,7 @@ def _python_repository_impl(rctx): "--use-compress-program={unzstd}".format(unzstd = unzstd), "--file={}".format(release_filename), ], + logger = logger, ) else: rctx.download_and_extract( @@ -197,11 +203,13 @@ def _python_repository_impl(rctx): rctx, op = "python_repository.MakeReadOnly", arguments = [repo_utils.which_checked(rctx, "chmod"), "-R", "ugo-w", lib_dir], + logger = logger, ) exec_result = repo_utils.execute_unchecked( rctx, op = "python_repository.TestReadOnly", arguments = [repo_utils.which_checked(rctx, "touch"), "{}/.test".format(lib_dir)], + logger = logger, ) # The issue with running as root is the installation is no longer @@ -211,6 +219,7 @@ def _python_repository_impl(rctx): rctx, op = "python_repository.GetUserId", arguments = [repo_utils.which_checked(rctx, "id"), "-u"], + logger = logger, ) uid = int(stdout.strip()) if uid == 0: @@ -529,6 +538,7 @@ For more information see the official bazel docs "zstd_version": attr.string( default = "1.5.2", ), + "_rule_name": attr.string(default = "python_repository"), }, environ = [REPO_DEBUG_ENV_VAR], ) From e722d075be509fa33954ad29c6ea2d2808dbbcc6 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Mon, 22 Jul 2024 08:01:51 -0700 Subject: [PATCH 137/345] refactor: move python/repositories.bzl implementation under python/private (#2083) This is mostly for consistency with other code, but in doing so, it looks like there are several symbols that have public visibility that _probably_ weren't meant to be public. Cleaning that up is left for another PR in the future. --- python/BUILD.bazel | 11 +- python/private/BUILD.bazel | 17 + python/private/pypi/whl_library.bzl | 2 +- python/private/python_repositories.bzl | 733 ++++++++++++++++++++++++ python/repositories.bzl | 737 +------------------------ 5 files changed, 773 insertions(+), 727 deletions(-) create mode 100644 python/private/python_repositories.bzl diff --git a/python/BUILD.bazel b/python/BUILD.bazel index e83b79c914..878d20b57d 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -211,16 +211,7 @@ bzl_library( name = "repositories_bzl", srcs = ["repositories.bzl"], deps = [ - ":versions_bzl", - "//python/private:auth_bzl", - "//python/private:bazel_tools_bzl", - "//python/private:bzlmod_enabled_bzl", - "//python/private:coverage_deps_bzl", - "//python/private:full_version_bzl", - "//python/private:internal_config_repo_bzl", - "//python/private:repo_utils_bzl", - "//python/private:toolchains_repo_bzl", - "//python/private/pypi:deps_bzl", + "//python/private:python_repositories_bzl", ], ) diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index c5da4e31e3..3b97a02ed9 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -139,6 +139,23 @@ bzl_library( ], ) +bzl_library( + name = "python_repositories_bzl", + srcs = ["python_repositories.bzl"], + deps = [ + "//python:versions_bzl", + "//python/private:auth_bzl", + "//python/private:bazel_tools_bzl", + "//python/private:bzlmod_enabled_bzl", + "//python/private:coverage_deps_bzl", + "//python/private:full_version_bzl", + "//python/private:internal_config_repo_bzl", + "//python/private:repo_utils_bzl", + "//python/private:toolchains_repo_bzl", + "//python/private/pypi:deps_bzl", + ], +) + bzl_library( name = "pythons_hub_bzl", srcs = ["pythons_hub.bzl"], diff --git a/python/private/pypi/whl_library.bzl b/python/private/pypi/whl_library.bzl index c4e1f76897..777aadda6b 100644 --- a/python/private/pypi/whl_library.bzl +++ b/python/private/pypi/whl_library.bzl @@ -14,9 +14,9 @@ "" -load("//python:repositories.bzl", "is_standalone_interpreter") load("//python/private:auth.bzl", "AUTH_ATTRS", "get_auth") load("//python/private:envsubst.bzl", "envsubst") +load("//python/private:python_repositories.bzl", "is_standalone_interpreter") load("//python/private:repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") load(":attrs.bzl", "ATTRS", "use_isolated") load(":deps.bzl", "all_repo_names") diff --git a/python/private/python_repositories.bzl b/python/private/python_repositories.bzl new file mode 100644 index 0000000000..ea3dd3533f --- /dev/null +++ b/python/private/python_repositories.bzl @@ -0,0 +1,733 @@ +# 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. + +"""This file contains macros to be called during WORKSPACE evaluation. + +For historic reasons, pip_repositories() is defined in //python:pip.bzl. +""" + +load("@bazel_tools//tools/build_defs/repo:http.bzl", _http_archive = "http_archive") +load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") +load( + "//python:versions.bzl", + "DEFAULT_RELEASE_BASE_URL", + "PLATFORMS", + "TOOL_VERSIONS", + "get_release_info", +) +load("//python/private/pypi:deps.bzl", "pypi_deps") +load(":auth.bzl", "get_auth") +load(":bzlmod_enabled.bzl", "BZLMOD_ENABLED") +load(":coverage_deps.bzl", "coverage_dep") +load(":full_version.bzl", "full_version") +load(":internal_config_repo.bzl", "internal_config_repo") +load(":repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") +load( + ":toolchains_repo.bzl", + "host_toolchain", + "multi_toolchain_aliases", + "toolchain_aliases", + "toolchains_repo", +) + +def http_archive(**kwargs): + maybe(_http_archive, **kwargs) + +def py_repositories(): + """Runtime dependencies that users must install. + + This function should be loaded and called in the user's WORKSPACE. + With bzlmod enabled, this function is not needed since MODULE.bazel handles transitive deps. + """ + maybe( + internal_config_repo, + name = "rules_python_internal", + ) + http_archive( + name = "bazel_skylib", + sha256 = "74d544d96f4a5bb630d465ca8bbcfe231e3594e5aae57e1edbf17a6eb3ca2506", + 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", + ], + ) + 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", + ) + pypi_deps() + +######## +# Remaining content of the file is only used to support toolchains. +######## + +STANDALONE_INTERPRETER_FILENAME = "STANDALONE_INTERPRETER" + +def is_standalone_interpreter(rctx, python_interpreter_path, *, logger = None): + """Query a python interpreter target for whether or not it's a rules_rust provided toolchain + + Args: + rctx (repository_ctx): The repository rule's context object. + python_interpreter_path (path): A path representing the interpreter. + logger: Optional logger to use for operations. + + Returns: + bool: Whether or not the target is from a rules_python generated toolchain. + """ + + # Only update the location when using a hermetic toolchain. + if not python_interpreter_path: + return False + + # This is a rules_python provided toolchain. + return repo_utils.execute_unchecked( + rctx, + op = "IsStandaloneInterpreter", + arguments = [ + "ls", + "{}/{}".format( + python_interpreter_path.dirname, + STANDALONE_INTERPRETER_FILENAME, + ), + ], + logger = logger, + ).return_code == 0 + +def _python_repository_impl(rctx): + if rctx.attr.distutils and rctx.attr.distutils_content: + fail("Only one of (distutils, distutils_content) should be set.") + if bool(rctx.attr.url) == bool(rctx.attr.urls): + fail("Exactly one of (url, urls) must be set.") + + logger = repo_utils.logger(rctx) + + 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 + urls = rctx.attr.urls or [rctx.attr.url] + auth = get_auth(rctx, urls) + + if release_filename.endswith(".zst"): + rctx.download( + url = urls, + sha256 = rctx.attr.sha256, + output = release_filename, + 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, + sha256 = rctx.attr.sha256, + stripPrefix = rctx.attr.strip_prefix, + auth = auth, + ) + + patches = rctx.attr.patches + if patches: + for patch in patches: + # Should take the strip as an attr, but this is fine for the moment + rctx.patch(patch, strip = 1) + + # Write distutils.cfg to the Python installation. + if "windows" in platform: + distutils_path = "Lib/distutils/distutils.cfg" + else: + distutils_path = "lib/python{}/distutils/distutils.cfg".format(python_short_version) + if rctx.attr.distutils: + rctx.file(distutils_path, rctx.read(rctx.attr.distutils)) + elif rctx.attr.distutils_content: + rctx.file(distutils_path, rctx.attr.distutils_content) + + # Make the Python installation read-only. This is to prevent issues due to + # pycs being generated at runtime: + # * The pycs are not deterministic (they contain timestamps) + # * Multiple processes trying to write the same pycs can result in errors. + if not rctx.attr.ignore_root_user_error: + if "windows" not in platform: + lib_dir = "lib" if "windows" not in platform else "Lib" + + repo_utils.execute_checked( + rctx, + op = "python_repository.MakeReadOnly", + arguments = [repo_utils.which_checked(rctx, "chmod"), "-R", "ugo-w", lib_dir], + logger = logger, + ) + exec_result = repo_utils.execute_unchecked( + rctx, + op = "python_repository.TestReadOnly", + arguments = [repo_utils.which_checked(rctx, "touch"), "{}/.test".format(lib_dir)], + logger = logger, + ) + + # The issue with running as root is the installation is no longer + # read-only, so the problems due to pyc can resurface. + if exec_result.return_code == 0: + stdout = repo_utils.execute_checked_stdout( + rctx, + op = "python_repository.GetUserId", + arguments = [repo_utils.which_checked(rctx, "id"), "-u"], + logger = logger, + ) + uid = int(stdout.strip()) + if uid == 0: + fail("The current user is root, please run as non-root when using the hermetic Python interpreter. See https://github.com/bazelbuild/rules_python/pull/713.") + else: + fail("The current user has CAP_DAC_OVERRIDE set, please drop this capability when using the hermetic Python interpreter. See https://github.com/bazelbuild/rules_python/pull/713.") + + python_bin = "python.exe" if ("windows" in platform) else "bin/python3" + + glob_include = [] + glob_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{python_version}.so".format(python_version = python_short_version), + # static libraries + "lib/**/*.a", + # tests for the standard libraries. + "lib/python{python_version}/**/test/**".format(python_version = python_short_version), + "lib/python{python_version}/**/tests/**".format(python_version = python_short_version), + "**/__pycache__/*.pyc.*", # During pyc creation, temp files named *.pyc.NNN are created + ] + + if "linux" in platform: + # Workaround around https://github.com/indygreg/python-build-standalone/issues/231 + for url in urls: + head_and_release, _, _ = url.rpartition("/") + _, _, release = head_and_release.rpartition("/") + if not release.isdigit(): + # Maybe this is some custom toolchain, so skip this + break + + if int(release) >= 20240224: + # Starting with this release the Linux toolchains have infinite symlink loop + # on host platforms that are not Linux. Delete the files no + # matter the host platform so that the cross-built artifacts + # are the same irrespective of the host platform we are + # building on. + # + # Link to the first affected release: + # https://github.com/indygreg/python-build-standalone/releases/tag/20240224 + rctx.delete("share/terminfo") + break + + if rctx.attr.ignore_root_user_error or "windows" in platform: + glob_exclude += [ + # These pycache files are created on first use of the associated python files. + # Exclude them from the glob because otherwise between the first time and second time a python toolchain is used," + # the definition of this filegroup will change, and depending rules will get invalidated." + # See https://github.com/bazelbuild/rules_python/issues/1008 for unconditionally adding these to toolchains so we can stop ignoring them." + "**/__pycache__/*.pyc", + "**/__pycache__/*.pyo", + ] + + if "windows" in platform: + glob_include += [ + "*.exe", + "*.dll", + "bin/**", + "DLLs/**", + "extensions/**", + "include/**", + "Lib/**", + "libs/**", + "Scripts/**", + "share/**", + "tcl/**", + ] + else: + glob_include += [ + "bin/**", + "extensions/**", + "include/**", + "lib/**", + "libs/**", + "share/**", + ] + + if rctx.attr.coverage_tool: + if "windows" in platform: + coverage_tool = None + else: + coverage_tool = '"{}"'.format(rctx.attr.coverage_tool) + + coverage_attr_text = """\ + coverage_tool = select({{ + ":coverage_enabled": {coverage_tool}, + "//conditions:default": None + }}), +""".format(coverage_tool = coverage_tool) + else: + coverage_attr_text = " # coverage_tool attribute not supported by this Bazel version" + + build_content = """\ +# Generated by python/repositories.bzl + +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") +load("@rules_python//python/private:py_exec_tools_toolchain.bzl", "py_exec_tools_toolchain") + +package(default_visibility = ["//visibility:public"]) + +filegroup( + name = "files", + srcs = glob( + include = {glob_include}, + # Platform-agnostic filegroup can't match on all patterns. + allow_empty = True, + exclude = {glob_exclude}, + ), +) + +cc_import( + name = "interface", + interface_library = "libs/python{python_version_nodot}.lib", + system_provided = True, +) + +filegroup( + name = "includes", + srcs = glob(["include/**/*.h"]), +) + +cc_library( + name = "python_headers", + deps = select({{ + "@bazel_tools//src/conditions:windows": [":interface"], + "//conditions:default": None, + }}), + hdrs = [":includes"], + includes = [ + "include", + "include/python{python_version}", + "include/python{python_version}m", + ], +) + +cc_library( + name = "libpython", + hdrs = [":includes"], + srcs = select({{ + "@platforms//os:windows": ["python3.dll", "libs/python{python_version_nodot}.lib"], + "@platforms//os:macos": ["lib/libpython{python_version}.dylib"], + "@platforms//os:linux": ["lib/libpython{python_version}.so", "lib/libpython{python_version}.so.1.0"], + }}), +) + +exports_files(["python", "{python_path}"]) + +# Used to only download coverage toolchain when the coverage is collected by +# bazel. +config_setting( + name = "coverage_enabled", + values = {{"collect_code_coverage": "true"}}, + visibility = ["//visibility:private"], +) + +py_runtime( + name = "py3_runtime", + files = [":files"], +{coverage_attr} + interpreter = "{python_path}", + interpreter_version_info = {{ + "major": "{interpreter_version_info_major}", + "minor": "{interpreter_version_info_minor}", + "micro": "{interpreter_version_info_micro}", + }}, + python_version = "PY3", + implementation_name = 'cpython', + pyc_tag = "cpython-{interpreter_version_info_major}{interpreter_version_info_minor}", +) + +py_runtime_pair( + name = "python_runtimes", + py2_runtime = None, + py3_runtime = ":py3_runtime", +) + +py_cc_toolchain( + name = "py_cc_toolchain", + headers = ":python_headers", + libs = ":libpython", + python_version = "{python_version}", +) + +py_exec_tools_toolchain( + name = "py_exec_tools_toolchain", + precompiler = "@rules_python//tools/precompiler:precompiler", +) +""".format( + glob_exclude = repr(glob_exclude), + glob_include = repr(glob_include), + python_path = python_bin, + python_version = python_short_version, + python_version_nodot = python_short_version.replace(".", ""), + coverage_attr = coverage_attr_text, + interpreter_version_info_major = python_version_info[0], + interpreter_version_info_minor = python_version_info[1], + interpreter_version_info_micro = python_version_info[2], + ) + rctx.delete("python") + rctx.symlink(python_bin, "python") + rctx.file(STANDALONE_INTERPRETER_FILENAME, "# File intentionally left blank. Indicates that this is an interpreter repo created by rules_python.") + rctx.file("BUILD.bazel", build_content) + + attrs = { + "auth_patterns": rctx.attr.auth_patterns, + "coverage_tool": rctx.attr.coverage_tool, + "distutils": rctx.attr.distutils, + "distutils_content": rctx.attr.distutils_content, + "ignore_root_user_error": rctx.attr.ignore_root_user_error, + "name": rctx.attr.name, + "netrc": rctx.attr.netrc, + "patches": rctx.attr.patches, + "platform": platform, + "python_version": python_version, + "release_filename": release_filename, + "sha256": rctx.attr.sha256, + "strip_prefix": rctx.attr.strip_prefix, + } + + if rctx.attr.url: + attrs["url"] = rctx.attr.url + else: + attrs["urls"] = urls + + return attrs + +python_repository = repository_rule( + _python_repository_impl, + doc = "Fetches the external tools needed for the Python toolchain.", + attrs = { + "auth_patterns": attr.string_dict( + doc = "Override mapping of hostnames to authorization patterns; mirrors the eponymous attribute from http_archive", + ), + "coverage_tool": attr.string( + # Mirrors the definition at + # https://github.com/bazelbuild/bazel/blob/master/src/main/starlark/builtins_bzl/common/python/py_runtime_rule.bzl + doc = """ +This is a target to use for collecting code coverage information from `py_binary` +and `py_test` targets. + +If set, the target must either produce a single file or be an executable target. +The path to the single file, or the executable if the target is executable, +determines the entry point for the python coverage tool. The target and its +runfiles will be added to the runfiles when coverage is enabled. + +The entry point for the tool must be loadable by a Python interpreter (e.g. a +`.py` or `.pyc` file). It must accept the command line arguments +of coverage.py (https://coverage.readthedocs.io), at least including +the `run` and `lcov` subcommands. + +The target is accepted as a string by the python_repository and evaluated within +the context of the toolchain repository. + +For more information see the official bazel docs +(https://bazel.build/reference/be/python#py_runtime.coverage_tool). +""", + ), + "distutils": attr.label( + allow_single_file = True, + doc = "A distutils.cfg file to be included in the Python installation. " + + "Either distutils or distutils_content can be specified, but not both.", + mandatory = False, + ), + "distutils_content": attr.string( + doc = "A distutils.cfg file content to be included in the Python installation. " + + "Either distutils or distutils_content can be specified, but not both.", + mandatory = False, + ), + "ignore_root_user_error": attr.bool( + default = False, + doc = "Whether the check for root should be ignored or not. This causes cache misses with .pyc files.", + mandatory = False, + ), + "netrc": attr.string( + doc = ".netrc file to use for authentication; mirrors the eponymous attribute from http_archive", + ), + "patches": attr.label_list( + doc = "A list of patch files to apply to the unpacked interpreter", + mandatory = False, + ), + "platform": attr.string( + doc = "The platform name for the Python interpreter tarball.", + mandatory = True, + values = PLATFORMS.keys(), + ), + "python_version": attr.string( + doc = "The Python version.", + mandatory = True, + ), + "release_filename": attr.string( + doc = "The filename of the interpreter to be downloaded", + mandatory = True, + ), + "sha256": attr.string( + doc = "The SHA256 integrity hash for the Python interpreter tarball.", + mandatory = True, + ), + "strip_prefix": attr.string( + doc = "A directory prefix to strip from the extracted files.", + ), + "url": attr.string( + doc = "The URL of the interpreter to download. Exactly one of url and urls must be set.", + ), + "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], +) + +# Wrapper macro around everything above, this is the primary API. +def python_register_toolchains( + name, + python_version, + distutils = None, + distutils_content = None, + register_toolchains = True, + register_coverage_tool = False, + set_python_version_constraint = False, + tool_versions = TOOL_VERSIONS, + **kwargs): + """Convenience macro for users which does typical setup. + + - Create a repository for each built-in platform like "python_linux_amd64" - + this repository is lazily fetched when Python is needed for that platform. + - Create a repository exposing toolchains for each platform like + "python_platforms". + - Register a toolchain pointing at each platform. + Users can avoid this macro and do these steps themselves, if they want more + control. + Args: + name: base name for all created repos, like "python38". + python_version: the Python version. + distutils: see the distutils attribute in the python_repository repository rule. + distutils_content: see the distutils_content attribute in the python_repository repository rule. + register_toolchains: Whether or not to register the downloaded toolchains. + register_coverage_tool: Whether or not to register the downloaded coverage tool to the toolchains. + NOTE: Coverage support using the toolchain is only supported in Bazel 6 and higher. + + set_python_version_constraint: When set to true, target_compatible_with for the toolchains will include a version constraint. + tool_versions: a dict containing a mapping of version with SHASUM and platform info. If not supplied, the defaults + in python/versions.bzl will be used. + **kwargs: passed to each python_repositories call. + """ + + if BZLMOD_ENABLED: + # you cannot used native.register_toolchains when using bzlmod. + register_toolchains = False + + base_url = kwargs.pop("base_url", DEFAULT_RELEASE_BASE_URL) + + python_version = full_version(python_version) + + toolchain_repo_name = "{name}_toolchains".format(name = name) + + # When using unreleased Bazel versions, the version is an empty string + if native.bazel_version: + bazel_major = int(native.bazel_version.split(".")[0]) + if bazel_major < 6: + if register_coverage_tool: + # buildifier: disable=print + print(( + "WARNING: ignoring register_coverage_tool=True when " + + "registering @{name}: Bazel 6+ required, got {version}" + ).format( + name = name, + version = native.bazel_version, + )) + register_coverage_tool = False + + loaded_platforms = [] + for platform in PLATFORMS.keys(): + sha256 = tool_versions[python_version]["sha256"].get(platform, None) + if not sha256: + continue + + loaded_platforms.append(platform) + (release_filename, urls, strip_prefix, patches) = get_release_info(platform, python_version, base_url, tool_versions) + + # allow passing in a tool version + coverage_tool = None + coverage_tool = tool_versions[python_version].get("coverage_tool", {}).get(platform, None) + if register_coverage_tool and coverage_tool == None: + coverage_tool = coverage_dep( + name = "{name}_{platform}_coverage".format( + name = name, + platform = platform, + ), + python_version = python_version, + platform = platform, + visibility = ["@{name}_{platform}//:__subpackages__".format( + name = name, + platform = platform, + )], + ) + + python_repository( + name = "{name}_{platform}".format( + name = name, + platform = platform, + ), + sha256 = sha256, + patches = patches, + platform = platform, + python_version = python_version, + release_filename = release_filename, + urls = urls, + distutils = distutils, + distutils_content = distutils_content, + strip_prefix = strip_prefix, + coverage_tool = coverage_tool, + **kwargs + ) + if register_toolchains: + native.register_toolchains("@{toolchain_repo_name}//:{platform}_toolchain".format( + toolchain_repo_name = toolchain_repo_name, + platform = platform, + )) + native.register_toolchains("@{toolchain_repo_name}//:{platform}_py_cc_toolchain".format( + toolchain_repo_name = toolchain_repo_name, + platform = platform, + )) + native.register_toolchains("@{toolchain_repo_name}//:{platform}_py_exec_tools_toolchain".format( + toolchain_repo_name = toolchain_repo_name, + platform = platform, + )) + + host_toolchain( + name = name + "_host", + python_version = python_version, + user_repository_name = name, + platforms = loaded_platforms, + ) + + toolchain_aliases( + name = name, + python_version = python_version, + user_repository_name = name, + platforms = loaded_platforms, + ) + + # in bzlmod we write out our own toolchain repos + if BZLMOD_ENABLED: + return + + toolchains_repo( + name = toolchain_repo_name, + python_version = python_version, + set_python_version_constraint = set_python_version_constraint, + user_repository_name = name, + ) + +def python_register_multi_toolchains( + name, + python_versions, + default_version = None, + **kwargs): + """Convenience macro for registering multiple Python toolchains. + + Args: + name: base name for each name in python_register_toolchains call. + python_versions: the Python version. + default_version: the default Python version. If not set, the first version in + python_versions is used. + **kwargs: passed to each python_register_toolchains call. + """ + if len(python_versions) == 0: + fail("python_versions must not be empty") + + if not default_version: + default_version = python_versions.pop(0) + for python_version in python_versions: + if python_version == default_version: + # We register the default version lastly so that it's not picked first when --platforms + # is set with a constraint during toolchain resolution. This is due to the fact that + # Bazel will match the unconstrained toolchain if we register it before the constrained + # ones. + continue + python_register_toolchains( + name = name + "_" + python_version.replace(".", "_"), + python_version = python_version, + set_python_version_constraint = True, + **kwargs + ) + python_register_toolchains( + name = name + "_" + default_version.replace(".", "_"), + python_version = default_version, + set_python_version_constraint = False, + **kwargs + ) + + multi_toolchain_aliases( + name = name, + python_versions = { + python_version: name + "_" + python_version.replace(".", "_") + for python_version in (python_versions + [default_version]) + }, + ) diff --git a/python/repositories.bzl b/python/repositories.bzl index baa5f5ba70..cf8723405c 100644 --- a/python/repositories.bzl +++ b/python/repositories.bzl @@ -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. @@ -13,721 +13,26 @@ # limitations under the License. """This file contains macros to be called during WORKSPACE evaluation. - -For historic reasons, pip_repositories() is defined in //python:pip.bzl. """ -load("@bazel_tools//tools/build_defs/repo:http.bzl", _http_archive = "http_archive") -load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") -load("//python/private:auth.bzl", "get_auth") -load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") -load("//python/private:coverage_deps.bzl", "coverage_dep") -load("//python/private:full_version.bzl", "full_version") -load("//python/private:internal_config_repo.bzl", "internal_config_repo") -load("//python/private:repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") -load( - "//python/private:toolchains_repo.bzl", - "host_toolchain", - "multi_toolchain_aliases", - "toolchain_aliases", - "toolchains_repo", -) -load("//python/private/pypi:deps.bzl", "pypi_deps") load( - ":versions.bzl", - "DEFAULT_RELEASE_BASE_URL", - "PLATFORMS", - "TOOL_VERSIONS", - "get_release_info", -) - -def http_archive(**kwargs): - maybe(_http_archive, **kwargs) - -def py_repositories(): - """Runtime dependencies that users must install. - - This function should be loaded and called in the user's WORKSPACE. - With bzlmod enabled, this function is not needed since MODULE.bazel handles transitive deps. - """ - maybe( - internal_config_repo, - name = "rules_python_internal", - ) - http_archive( - name = "bazel_skylib", - sha256 = "74d544d96f4a5bb630d465ca8bbcfe231e3594e5aae57e1edbf17a6eb3ca2506", - 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", - ], - ) - 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", - ) - pypi_deps() - -######## -# Remaining content of the file is only used to support toolchains. -######## - -STANDALONE_INTERPRETER_FILENAME = "STANDALONE_INTERPRETER" - -def is_standalone_interpreter(rctx, python_interpreter_path, *, logger = None): - """Query a python interpreter target for whether or not it's a rules_rust provided toolchain - - Args: - rctx (repository_ctx): The repository rule's context object. - python_interpreter_path (path): A path representing the interpreter. - logger: Optional logger to use for operations. - - Returns: - bool: Whether or not the target is from a rules_python generated toolchain. - """ - - # Only update the location when using a hermetic toolchain. - if not python_interpreter_path: - return False - - # This is a rules_python provided toolchain. - return repo_utils.execute_unchecked( - rctx, - op = "IsStandaloneInterpreter", - arguments = [ - "ls", - "{}/{}".format( - python_interpreter_path.dirname, - STANDALONE_INTERPRETER_FILENAME, - ), - ], - logger = logger, - ).return_code == 0 - -def _python_repository_impl(rctx): - if rctx.attr.distutils and rctx.attr.distutils_content: - fail("Only one of (distutils, distutils_content) should be set.") - if bool(rctx.attr.url) == bool(rctx.attr.urls): - fail("Exactly one of (url, urls) must be set.") - - logger = repo_utils.logger(rctx) - - 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 - urls = rctx.attr.urls or [rctx.attr.url] - auth = get_auth(rctx, urls) - - if release_filename.endswith(".zst"): - rctx.download( - url = urls, - sha256 = rctx.attr.sha256, - output = release_filename, - 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, - sha256 = rctx.attr.sha256, - stripPrefix = rctx.attr.strip_prefix, - auth = auth, - ) - - patches = rctx.attr.patches - if patches: - for patch in patches: - # Should take the strip as an attr, but this is fine for the moment - rctx.patch(patch, strip = 1) - - # Write distutils.cfg to the Python installation. - if "windows" in platform: - distutils_path = "Lib/distutils/distutils.cfg" - else: - distutils_path = "lib/python{}/distutils/distutils.cfg".format(python_short_version) - if rctx.attr.distutils: - rctx.file(distutils_path, rctx.read(rctx.attr.distutils)) - elif rctx.attr.distutils_content: - rctx.file(distutils_path, rctx.attr.distutils_content) - - # Make the Python installation read-only. This is to prevent issues due to - # pycs being generated at runtime: - # * The pycs are not deterministic (they contain timestamps) - # * Multiple processes trying to write the same pycs can result in errors. - if not rctx.attr.ignore_root_user_error: - if "windows" not in platform: - lib_dir = "lib" if "windows" not in platform else "Lib" - - repo_utils.execute_checked( - rctx, - op = "python_repository.MakeReadOnly", - arguments = [repo_utils.which_checked(rctx, "chmod"), "-R", "ugo-w", lib_dir], - logger = logger, - ) - exec_result = repo_utils.execute_unchecked( - rctx, - op = "python_repository.TestReadOnly", - arguments = [repo_utils.which_checked(rctx, "touch"), "{}/.test".format(lib_dir)], - logger = logger, - ) - - # The issue with running as root is the installation is no longer - # read-only, so the problems due to pyc can resurface. - if exec_result.return_code == 0: - stdout = repo_utils.execute_checked_stdout( - rctx, - op = "python_repository.GetUserId", - arguments = [repo_utils.which_checked(rctx, "id"), "-u"], - logger = logger, - ) - uid = int(stdout.strip()) - if uid == 0: - fail("The current user is root, please run as non-root when using the hermetic Python interpreter. See https://github.com/bazelbuild/rules_python/pull/713.") - else: - fail("The current user has CAP_DAC_OVERRIDE set, please drop this capability when using the hermetic Python interpreter. See https://github.com/bazelbuild/rules_python/pull/713.") - - python_bin = "python.exe" if ("windows" in platform) else "bin/python3" - - glob_include = [] - glob_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{python_version}.so".format(python_version = python_short_version), - # static libraries - "lib/**/*.a", - # tests for the standard libraries. - "lib/python{python_version}/**/test/**".format(python_version = python_short_version), - "lib/python{python_version}/**/tests/**".format(python_version = python_short_version), - "**/__pycache__/*.pyc.*", # During pyc creation, temp files named *.pyc.NNN are created - ] - - if "linux" in platform: - # Workaround around https://github.com/indygreg/python-build-standalone/issues/231 - for url in urls: - head_and_release, _, _ = url.rpartition("/") - _, _, release = head_and_release.rpartition("/") - if not release.isdigit(): - # Maybe this is some custom toolchain, so skip this - break - - if int(release) >= 20240224: - # Starting with this release the Linux toolchains have infinite symlink loop - # on host platforms that are not Linux. Delete the files no - # matter the host platform so that the cross-built artifacts - # are the same irrespective of the host platform we are - # building on. - # - # Link to the first affected release: - # https://github.com/indygreg/python-build-standalone/releases/tag/20240224 - rctx.delete("share/terminfo") - break - - if rctx.attr.ignore_root_user_error or "windows" in platform: - glob_exclude += [ - # These pycache files are created on first use of the associated python files. - # Exclude them from the glob because otherwise between the first time and second time a python toolchain is used," - # the definition of this filegroup will change, and depending rules will get invalidated." - # See https://github.com/bazelbuild/rules_python/issues/1008 for unconditionally adding these to toolchains so we can stop ignoring them." - "**/__pycache__/*.pyc", - "**/__pycache__/*.pyo", - ] - - if "windows" in platform: - glob_include += [ - "*.exe", - "*.dll", - "bin/**", - "DLLs/**", - "extensions/**", - "include/**", - "Lib/**", - "libs/**", - "Scripts/**", - "share/**", - "tcl/**", - ] - else: - glob_include += [ - "bin/**", - "extensions/**", - "include/**", - "lib/**", - "libs/**", - "share/**", - ] - - if rctx.attr.coverage_tool: - if "windows" in platform: - coverage_tool = None - else: - coverage_tool = '"{}"'.format(rctx.attr.coverage_tool) - - coverage_attr_text = """\ - coverage_tool = select({{ - ":coverage_enabled": {coverage_tool}, - "//conditions:default": None - }}), -""".format(coverage_tool = coverage_tool) - else: - coverage_attr_text = " # coverage_tool attribute not supported by this Bazel version" - - build_content = """\ -# Generated by python/repositories.bzl - -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") -load("@rules_python//python/private:py_exec_tools_toolchain.bzl", "py_exec_tools_toolchain") - -package(default_visibility = ["//visibility:public"]) - -filegroup( - name = "files", - srcs = glob( - include = {glob_include}, - # Platform-agnostic filegroup can't match on all patterns. - allow_empty = True, - exclude = {glob_exclude}, - ), -) - -cc_import( - name = "interface", - interface_library = "libs/python{python_version_nodot}.lib", - system_provided = True, -) - -filegroup( - name = "includes", - srcs = glob(["include/**/*.h"]), -) - -cc_library( - name = "python_headers", - deps = select({{ - "@bazel_tools//src/conditions:windows": [":interface"], - "//conditions:default": None, - }}), - hdrs = [":includes"], - includes = [ - "include", - "include/python{python_version}", - "include/python{python_version}m", - ], -) - -cc_library( - name = "libpython", - hdrs = [":includes"], - srcs = select({{ - "@platforms//os:windows": ["python3.dll", "libs/python{python_version_nodot}.lib"], - "@platforms//os:macos": ["lib/libpython{python_version}.dylib"], - "@platforms//os:linux": ["lib/libpython{python_version}.so", "lib/libpython{python_version}.so.1.0"], - }}), -) - -exports_files(["python", "{python_path}"]) - -# Used to only download coverage toolchain when the coverage is collected by -# bazel. -config_setting( - name = "coverage_enabled", - values = {{"collect_code_coverage": "true"}}, - visibility = ["//visibility:private"], -) - -py_runtime( - name = "py3_runtime", - files = [":files"], -{coverage_attr} - interpreter = "{python_path}", - interpreter_version_info = {{ - "major": "{interpreter_version_info_major}", - "minor": "{interpreter_version_info_minor}", - "micro": "{interpreter_version_info_micro}", - }}, - python_version = "PY3", - implementation_name = 'cpython', - pyc_tag = "cpython-{interpreter_version_info_major}{interpreter_version_info_minor}", -) - -py_runtime_pair( - name = "python_runtimes", - py2_runtime = None, - py3_runtime = ":py3_runtime", -) - -py_cc_toolchain( - name = "py_cc_toolchain", - headers = ":python_headers", - libs = ":libpython", - python_version = "{python_version}", -) - -py_exec_tools_toolchain( - name = "py_exec_tools_toolchain", - precompiler = "@rules_python//tools/precompiler:precompiler", -) -""".format( - glob_exclude = repr(glob_exclude), - glob_include = repr(glob_include), - python_path = python_bin, - python_version = python_short_version, - python_version_nodot = python_short_version.replace(".", ""), - coverage_attr = coverage_attr_text, - interpreter_version_info_major = python_version_info[0], - interpreter_version_info_minor = python_version_info[1], - interpreter_version_info_micro = python_version_info[2], - ) - rctx.delete("python") - rctx.symlink(python_bin, "python") - rctx.file(STANDALONE_INTERPRETER_FILENAME, "# File intentionally left blank. Indicates that this is an interpreter repo created by rules_python.") - rctx.file("BUILD.bazel", build_content) - - attrs = { - "auth_patterns": rctx.attr.auth_patterns, - "coverage_tool": rctx.attr.coverage_tool, - "distutils": rctx.attr.distutils, - "distutils_content": rctx.attr.distutils_content, - "ignore_root_user_error": rctx.attr.ignore_root_user_error, - "name": rctx.attr.name, - "netrc": rctx.attr.netrc, - "patches": rctx.attr.patches, - "platform": platform, - "python_version": python_version, - "release_filename": release_filename, - "sha256": rctx.attr.sha256, - "strip_prefix": rctx.attr.strip_prefix, - } - - if rctx.attr.url: - attrs["url"] = rctx.attr.url - else: - attrs["urls"] = urls - - return attrs - -python_repository = repository_rule( - _python_repository_impl, - doc = "Fetches the external tools needed for the Python toolchain.", - attrs = { - "auth_patterns": attr.string_dict( - doc = "Override mapping of hostnames to authorization patterns; mirrors the eponymous attribute from http_archive", - ), - "coverage_tool": attr.string( - # Mirrors the definition at - # https://github.com/bazelbuild/bazel/blob/master/src/main/starlark/builtins_bzl/common/python/py_runtime_rule.bzl - doc = """ -This is a target to use for collecting code coverage information from `py_binary` -and `py_test` targets. - -If set, the target must either produce a single file or be an executable target. -The path to the single file, or the executable if the target is executable, -determines the entry point for the python coverage tool. The target and its -runfiles will be added to the runfiles when coverage is enabled. - -The entry point for the tool must be loadable by a Python interpreter (e.g. a -`.py` or `.pyc` file). It must accept the command line arguments -of coverage.py (https://coverage.readthedocs.io), at least including -the `run` and `lcov` subcommands. - -The target is accepted as a string by the python_repository and evaluated within -the context of the toolchain repository. - -For more information see the official bazel docs -(https://bazel.build/reference/be/python#py_runtime.coverage_tool). -""", - ), - "distutils": attr.label( - allow_single_file = True, - doc = "A distutils.cfg file to be included in the Python installation. " + - "Either distutils or distutils_content can be specified, but not both.", - mandatory = False, - ), - "distutils_content": attr.string( - doc = "A distutils.cfg file content to be included in the Python installation. " + - "Either distutils or distutils_content can be specified, but not both.", - mandatory = False, - ), - "ignore_root_user_error": attr.bool( - default = False, - doc = "Whether the check for root should be ignored or not. This causes cache misses with .pyc files.", - mandatory = False, - ), - "netrc": attr.string( - doc = ".netrc file to use for authentication; mirrors the eponymous attribute from http_archive", - ), - "patches": attr.label_list( - doc = "A list of patch files to apply to the unpacked interpreter", - mandatory = False, - ), - "platform": attr.string( - doc = "The platform name for the Python interpreter tarball.", - mandatory = True, - values = PLATFORMS.keys(), - ), - "python_version": attr.string( - doc = "The Python version.", - mandatory = True, - ), - "release_filename": attr.string( - doc = "The filename of the interpreter to be downloaded", - mandatory = True, - ), - "sha256": attr.string( - doc = "The SHA256 integrity hash for the Python interpreter tarball.", - mandatory = True, - ), - "strip_prefix": attr.string( - doc = "A directory prefix to strip from the extracted files.", - ), - "url": attr.string( - doc = "The URL of the interpreter to download. Exactly one of url and urls must be set.", - ), - "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], -) - -# Wrapper macro around everything above, this is the primary API. -def python_register_toolchains( - name, - python_version, - distutils = None, - distutils_content = None, - register_toolchains = True, - register_coverage_tool = False, - set_python_version_constraint = False, - tool_versions = TOOL_VERSIONS, - **kwargs): - """Convenience macro for users which does typical setup. - - - Create a repository for each built-in platform like "python_linux_amd64" - - this repository is lazily fetched when Python is needed for that platform. - - Create a repository exposing toolchains for each platform like - "python_platforms". - - Register a toolchain pointing at each platform. - Users can avoid this macro and do these steps themselves, if they want more - control. - Args: - name: base name for all created repos, like "python38". - python_version: the Python version. - distutils: see the distutils attribute in the python_repository repository rule. - distutils_content: see the distutils_content attribute in the python_repository repository rule. - register_toolchains: Whether or not to register the downloaded toolchains. - register_coverage_tool: Whether or not to register the downloaded coverage tool to the toolchains. - NOTE: Coverage support using the toolchain is only supported in Bazel 6 and higher. - - set_python_version_constraint: When set to true, target_compatible_with for the toolchains will include a version constraint. - tool_versions: a dict containing a mapping of version with SHASUM and platform info. If not supplied, the defaults - in python/versions.bzl will be used. - **kwargs: passed to each python_repositories call. - """ - - if BZLMOD_ENABLED: - # you cannot used native.register_toolchains when using bzlmod. - register_toolchains = False - - base_url = kwargs.pop("base_url", DEFAULT_RELEASE_BASE_URL) - - python_version = full_version(python_version) - - toolchain_repo_name = "{name}_toolchains".format(name = name) - - # When using unreleased Bazel versions, the version is an empty string - if native.bazel_version: - bazel_major = int(native.bazel_version.split(".")[0]) - if bazel_major < 6: - if register_coverage_tool: - # buildifier: disable=print - print(( - "WARNING: ignoring register_coverage_tool=True when " + - "registering @{name}: Bazel 6+ required, got {version}" - ).format( - name = name, - version = native.bazel_version, - )) - register_coverage_tool = False - - loaded_platforms = [] - for platform in PLATFORMS.keys(): - sha256 = tool_versions[python_version]["sha256"].get(platform, None) - if not sha256: - continue - - loaded_platforms.append(platform) - (release_filename, urls, strip_prefix, patches) = get_release_info(platform, python_version, base_url, tool_versions) - - # allow passing in a tool version - coverage_tool = None - coverage_tool = tool_versions[python_version].get("coverage_tool", {}).get(platform, None) - if register_coverage_tool and coverage_tool == None: - coverage_tool = coverage_dep( - name = "{name}_{platform}_coverage".format( - name = name, - platform = platform, - ), - python_version = python_version, - platform = platform, - visibility = ["@{name}_{platform}//:__subpackages__".format( - name = name, - platform = platform, - )], - ) - - python_repository( - name = "{name}_{platform}".format( - name = name, - platform = platform, - ), - sha256 = sha256, - patches = patches, - platform = platform, - python_version = python_version, - release_filename = release_filename, - urls = urls, - distutils = distutils, - distutils_content = distutils_content, - strip_prefix = strip_prefix, - coverage_tool = coverage_tool, - **kwargs - ) - if register_toolchains: - native.register_toolchains("@{toolchain_repo_name}//:{platform}_toolchain".format( - toolchain_repo_name = toolchain_repo_name, - platform = platform, - )) - native.register_toolchains("@{toolchain_repo_name}//:{platform}_py_cc_toolchain".format( - toolchain_repo_name = toolchain_repo_name, - platform = platform, - )) - native.register_toolchains("@{toolchain_repo_name}//:{platform}_py_exec_tools_toolchain".format( - toolchain_repo_name = toolchain_repo_name, - platform = platform, - )) - - host_toolchain( - name = name + "_host", - python_version = python_version, - user_repository_name = name, - platforms = loaded_platforms, - ) - - toolchain_aliases( - name = name, - python_version = python_version, - user_repository_name = name, - platforms = loaded_platforms, - ) - - # in bzlmod we write out our own toolchain repos - if BZLMOD_ENABLED: - return - - toolchains_repo( - name = toolchain_repo_name, - python_version = python_version, - set_python_version_constraint = set_python_version_constraint, - user_repository_name = name, - ) - -def python_register_multi_toolchains( - name, - python_versions, - default_version = None, - **kwargs): - """Convenience macro for registering multiple Python toolchains. - - Args: - name: base name for each name in python_register_toolchains call. - python_versions: the Python version. - default_version: the default Python version. If not set, the first version in - python_versions is used. - **kwargs: passed to each python_register_toolchains call. - """ - if len(python_versions) == 0: - fail("python_versions must not be empty") - - if not default_version: - default_version = python_versions.pop(0) - for python_version in python_versions: - if python_version == default_version: - # We register the default version lastly so that it's not picked first when --platforms - # is set with a constraint during toolchain resolution. This is due to the fact that - # Bazel will match the unconstrained toolchain if we register it before the constrained - # ones. - continue - python_register_toolchains( - name = name + "_" + python_version.replace(".", "_"), - python_version = python_version, - set_python_version_constraint = True, - **kwargs - ) - python_register_toolchains( - name = name + "_" + default_version.replace(".", "_"), - python_version = default_version, - set_python_version_constraint = False, - **kwargs - ) - - multi_toolchain_aliases( - name = name, - python_versions = { - python_version: name + "_" + python_version.replace(".", "_") - for python_version in (python_versions + [default_version]) - }, - ) + "//python/private:python_repositories.bzl", + _STANDALONE_INTERPRETER_FILENAME = "STANDALONE_INTERPRETER_FILENAME", + _http_archive = "http_archive", + _is_standalone_interpreter = "is_standalone_interpreter", + _py_repositories = "py_repositories", + _python_register_multi_toolchains = "python_register_multi_toolchains", + _python_register_toolchains = "python_register_toolchains", + _python_repository = "python_repository", +) + +py_repositories = _py_repositories +python_register_multi_toolchains = _python_register_multi_toolchains +python_register_toolchains = _python_register_toolchains + +# These symbols are of questionable public visibility. They were probably +# not intended to be actually public. +STANDALONE_INTERPRETER_FILENAME = _STANDALONE_INTERPRETER_FILENAME +http_archive = _http_archive +is_standalone_interpreter = _is_standalone_interpreter +python_repository = _python_repository From eef1d81b0c047b3e8848eeb0eac2483d33b7fa54 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jul 2024 11:22:24 +0900 Subject: [PATCH 138/345] build(deps): bump sphinxcontrib-htmlhelp from 2.0.5 to 2.0.6 in /docs/sphinx (#2084) Bumps [sphinxcontrib-htmlhelp](https://github.com/sphinx-doc/sphinxcontrib-htmlhelp) from 2.0.5 to 2.0.6.
Release notes

Sourced from sphinxcontrib-htmlhelp's releases.

sphinxcontrib-htmlhelp 2.0.6

Changelog: https://www.sphinx-doc.org/en/master/changes.html

Changelog

Sourced from sphinxcontrib-htmlhelp's changelog.

Release 2.0.6 (2024-07-20)

  • Fix tests for Sphinx 7.4 and later.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sphinxcontrib-htmlhelp&package-manager=pip&previous-version=2.0.5&new-version=2.0.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/sphinx/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/sphinx/requirements.txt b/docs/sphinx/requirements.txt index af6763f682..ae7521e971 100644 --- a/docs/sphinx/requirements.txt +++ b/docs/sphinx/requirements.txt @@ -311,9 +311,9 @@ sphinxcontrib-devhelp==1.0.6 \ --hash=sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f \ --hash=sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3 # via sphinx -sphinxcontrib-htmlhelp==2.0.5 \ - --hash=sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015 \ - --hash=sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04 +sphinxcontrib-htmlhelp==2.0.6 \ + --hash=sha256:1b9af5a2671a61410a868fce050cab7ca393c218e6205cbc7f590136f207395c \ + --hash=sha256:c6597da06185f0e3b4dc952777a04200611ef563882e0c244d27a15ee22afa73 # via sphinx sphinxcontrib-jquery==4.1 \ --hash=sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a \ From 59bb4a88783cca738394cb3cb91bc8243df5e18d Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 23 Jul 2024 19:21:27 -0700 Subject: [PATCH 139/345] fix: add missing +x to runtime env toolchain interpreter script (#2086) The `runtime_env_toolchain_interpreter.sh` file was missing the executable bit, which prevented the file from actually be runnable later. To fix, just `chmod +x` it. I also added tests to actually run using it and verify that it is the toolchain used by the test. Fixes https://github.com/bazelbuild/rules_python/issues/2085 --- CHANGELOG.md | 3 + .../runtime_env_toolchain_interpreter.sh | 0 tests/runtime_env_toolchain/BUILD.bazel | 16 +++++ .../toolchain_runs_test.py | 28 ++++++++ tests/support/BUILD.bazel | 9 +++ tests/support/sh_py_run_test.bzl | 68 ++++++++++++++++--- 6 files changed, 114 insertions(+), 10 deletions(-) mode change 100644 => 100755 python/private/runtime_env_toolchain_interpreter.sh create mode 100644 tests/runtime_env_toolchain/toolchain_runs_test.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c03a79061..7fa1cd2170 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,9 @@ A brief description of the categories of changes: ([#2064](https://github.com/bazelbuild/rules_python/issues/2064)). * (pip) Fixed pypi parse_simpleapi_html function for feeds with package metadata containing ">" sign +* (toolchains) Added missing executable permission to + `//python/runtime_env_toolchains` interpreter script so that it is runnable. + ([#2085](https://github.com/bazelbuild/rules_python/issues/2085)). ### Added * (rules) `PYTHONSAFEPATH` is inherited from the calling environment to allow diff --git a/python/private/runtime_env_toolchain_interpreter.sh b/python/private/runtime_env_toolchain_interpreter.sh old mode 100644 new mode 100755 diff --git a/tests/runtime_env_toolchain/BUILD.bazel b/tests/runtime_env_toolchain/BUILD.bazel index ebcdbaf017..99bdbab101 100644 --- a/tests/runtime_env_toolchain/BUILD.bazel +++ b/tests/runtime_env_toolchain/BUILD.bazel @@ -12,6 +12,22 @@ # 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(":runtime_env_toolchain_tests.bzl", "runtime_env_toolchain_test_suite") runtime_env_toolchain_test_suite(name = "runtime_env_toolchain_tests") + +py_reconfig_test( + name = "toolchain_runs_test", + srcs = ["toolchain_runs_test.py"], + data = [ + "//tests/support:current_build_settings", + ], + extra_toolchains = [ + "//python/runtime_env_toolchains:all", + # Necessary for RBE CI + "//tests/cc:all", + ], + main = "toolchain_runs_test.py", + deps = ["//python/runfiles"], +) diff --git a/tests/runtime_env_toolchain/toolchain_runs_test.py b/tests/runtime_env_toolchain/toolchain_runs_test.py new file mode 100644 index 0000000000..7be2472e8b --- /dev/null +++ b/tests/runtime_env_toolchain/toolchain_runs_test.py @@ -0,0 +1,28 @@ +import json +import pathlib +import platform +import unittest + +from python.runfiles import runfiles + + +class RunTest(unittest.TestCase): + def test_ran(self): + rf = runfiles.Create() + settings_path = rf.Rlocation( + "rules_python/tests/support/current_build_settings.json" + ) + settings = json.loads(pathlib.Path(settings_path).read_text()) + if platform.system() == "Windows": + self.assertEqual( + "/_magic_pyruntime_sentinel_do_not_use", settings["interpreter_path"] + ) + else: + self.assertIn( + "runtime_env_toolchain_interpreter.sh", + settings["interpreter"]["short_path"], + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/support/BUILD.bazel b/tests/support/BUILD.bazel index e5d5189a3b..58c74d6d48 100644 --- a/tests/support/BUILD.bazel +++ b/tests/support/BUILD.bazel @@ -20,6 +20,11 @@ load("//python:py_runtime.bzl", "py_runtime") load("//python:py_runtime_pair.bzl", "py_runtime_pair") +load(":sh_py_run_test.bzl", "current_build_settings") + +package( + default_visibility = ["//:__subpackages__"], +) platform( name = "mac", @@ -104,3 +109,7 @@ toolchain( toolchain = ":platform_runtime_pair", toolchain_type = "//python:toolchain_type", ) + +current_build_settings( + name = "current_build_settings", +) diff --git a/tests/support/sh_py_run_test.bzl b/tests/support/sh_py_run_test.bzl index 35be484b0d..183122a6ba 100644 --- a/tests/support/sh_py_run_test.bzl +++ b/tests/support/sh_py_run_test.bzl @@ -19,21 +19,28 @@ without the overhead of a bazel-in-bazel integration test. load("//python:py_binary.bzl", "py_binary") load("//python:py_test.bzl", "py_test") +load("//python/private:toolchain_types.bzl", "TARGET_TOOLCHAIN_TYPE") # buildifier: disable=bzl-visibility def _perform_transition_impl(input_settings, attr): settings = dict(input_settings) settings["//command_line_option:build_python_zip"] = attr.build_python_zip if attr.bootstrap_impl: settings["//python/config_settings:bootstrap_impl"] = attr.bootstrap_impl + if attr.extra_toolchains: + settings["//command_line_option:extra_toolchains"] = attr.extra_toolchains + else: + settings["//command_line_option:extra_toolchains"] = input_settings["//command_line_option:extra_toolchains"] return settings _perform_transition = transition( implementation = _perform_transition_impl, inputs = [ "//python/config_settings:bootstrap_impl", + "//command_line_option:extra_toolchains", ], outputs = [ "//command_line_option:build_python_zip", + "//command_line_option:extra_toolchains", "//python/config_settings:bootstrap_impl", ], ) @@ -79,17 +86,27 @@ def _py_reconfig_impl(ctx): ] def _make_reconfig_rule(**kwargs): + attrs = { + "bootstrap_impl": attr.string(), + "build_python_zip": attr.string(default = "auto"), + "env": attr.string_dict(), + "extra_toolchains": attr.string_list( + doc = """ +Value for the --extra_toolchains flag. + +NOTE: You'll likely have to also specify //tests/cc:all (or some CC toolchain) +to make the RBE presubmits happy, which disable auto-detection of a CC +toolchain. +""", + ), + "target": attr.label(executable = True, cfg = "target"), + "_allowlist_function_transition": attr.label( + default = "@bazel_tools//tools/allowlists/function_transition_allowlist", + ), + } return rule( implementation = _py_reconfig_impl, - attrs = { - "bootstrap_impl": attr.string(), - "build_python_zip": attr.string(default = "auto"), - "env": attr.string_dict(), - "target": attr.label(executable = True, cfg = "target"), - "_allowlist_function_transition": attr.label( - default = "@bazel_tools//tools/allowlists/function_transition_allowlist", - ), - }, + attrs = attrs, cfg = _perform_transition, **kwargs ) @@ -106,7 +123,8 @@ def py_reconfig_test(*, name, **kwargs): **kwargs: kwargs to pass along to _py_reconfig_test and py_test. """ reconfig_kwargs = {} - reconfig_kwargs["bootstrap_impl"] = kwargs.pop("bootstrap_impl") + reconfig_kwargs["bootstrap_impl"] = kwargs.pop("bootstrap_impl", None) + reconfig_kwargs["extra_toolchains"] = kwargs.pop("extra_toolchains", None) reconfig_kwargs["env"] = kwargs.get("env") inner_name = "_{}_inner" + name _py_reconfig_test( @@ -147,3 +165,33 @@ def sh_py_run_test(*, name, sh_src, py_src, **kwargs): main = py_src, tags = ["manual"], ) + +def _current_build_settings_impl(ctx): + info = ctx.actions.declare_file(ctx.label.name + ".json") + toolchain = ctx.toolchains[TARGET_TOOLCHAIN_TYPE] + runtime = toolchain.py3_runtime + files = [info] + ctx.actions.write( + output = info, + content = json.encode({ + "interpreter": { + "short_path": runtime.interpreter.short_path if runtime.interpreter else None, + }, + "interpreter_path": runtime.interpreter_path, + }), + ) + return [DefaultInfo( + files = depset(files), + )] + +current_build_settings = rule( + doc = """ +Writes information about the current build config to JSON for testing. + +This is so tests can verify information about the build config used for them. +""", + implementation = _current_build_settings_impl, + toolchains = [ + TARGET_TOOLCHAIN_TYPE, + ], +) From 6f9082fda020a9970d624e54ad3d964d64957f21 Mon Sep 17 00:00:00 2001 From: Chris Chua Date: Fri, 26 Jul 2024 11:55:03 +0800 Subject: [PATCH 140/345] fix: use downloaded archive in sdist (#2091) Before this PR the extra arguments added by the `experimental_index_url` code paths were not used and the `sdist` was being redownloaded every time we would build from `sdist`. This PR fixes the code to not ignore the extra args added in https://github.com/bazelbuild/rules_python/pull/2091/files#diff-c007ed21502bf8ea19b98b3f1b402e7071615f8520e4291b00a71bca2cd451e8R231 Fixes #2090 --------- Co-authored-by: aignas <240938+aignas@users.noreply.github.com> --- CHANGELOG.md | 3 +++ python/private/pypi/whl_library.bzl | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fa1cd2170..91c19678b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,9 @@ A brief description of the categories of changes: * (toolchains) Added missing executable permission to `//python/runtime_env_toolchains` interpreter script so that it is runnable. ([#2085](https://github.com/bazelbuild/rules_python/issues/2085)). +* (pip) Correctly use the `sdist` downloaded by the bazel downloader when using + `experimental_index_url` feature. Fixes + [#2091](https://github.com/bazelbuild/rules_python/issues/2090). ### Added * (rules) `PYTHONSAFEPATH` is inherited from the calling environment to allow diff --git a/python/private/pypi/whl_library.bzl b/python/private/pypi/whl_library.bzl index 777aadda6b..2300eb3598 100644 --- a/python/private/pypi/whl_library.bzl +++ b/python/private/pypi/whl_library.bzl @@ -123,7 +123,7 @@ def _parse_optional_attrs(rctx, args, extra_pip_args = None): "--extra_pip_args", json.encode(struct(arg = [ envsubst(pip_arg, rctx.attr.envsubst, getenv) - for pip_arg in rctx.attr.extra_pip_args + for pip_arg in extra_pip_args ])), ] From 014ad58aefe1c41b059bb7bf10b0022ff096e5af Mon Sep 17 00:00:00 2001 From: hunshcn Date: Fri, 26 Jul 2024 12:25:29 +0800 Subject: [PATCH 141/345] feat(gazelle): simplify gazelle_python.yaml (#2048) Simplify and make gazelle_python.yaml have only top level package name. It would work well in cases to reduce merge conflicts. Resolve https://github.com/bazelbuild/rules_python/issues/1890 This is a compatible change and seems to have no side effects, so no options are provided. --------- Signed-off-by: hunshcn Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> --- CHANGELOG.md | 2 + .../build_file_generation/gazelle_python.yaml | 792 +-------- .../gazelle_python.yaml | 553 ------ gazelle/manifest/manifest_test.go | 10 +- gazelle/manifest/testdata/gazelle_python.yaml | 10 +- gazelle/modules_mapping/generator.py | 21 +- .../BUILD.in | 0 .../BUILD.out | 18 + .../README.md | 4 + .../WORKSPACE | 1 + .../__init__.py | 15 + .../__main__.py | 16 + .../gazelle_python.yaml | 19 + .../test.yaml | 15 + .../gazelle_python.yaml | 1520 +---------------- gazelle/pythonconfig/pythonconfig.go | 25 +- 16 files changed, 130 insertions(+), 2891 deletions(-) create mode 100644 gazelle/python/testdata/different_packages_in_same_namespace/BUILD.in create mode 100644 gazelle/python/testdata/different_packages_in_same_namespace/BUILD.out create mode 100644 gazelle/python/testdata/different_packages_in_same_namespace/README.md create mode 100644 gazelle/python/testdata/different_packages_in_same_namespace/WORKSPACE create mode 100644 gazelle/python/testdata/different_packages_in_same_namespace/__init__.py create mode 100644 gazelle/python/testdata/different_packages_in_same_namespace/__main__.py create mode 100644 gazelle/python/testdata/different_packages_in_same_namespace/gazelle_python.yaml create mode 100644 gazelle/python/testdata/different_packages_in_same_namespace/test.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index 91c19678b0..ec0682a65e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,8 @@ A brief description of the categories of changes: ### Changed * (whl_library) A better log message when the wheel is built from an sdist or when the wheel is downloaded using `download_only` feature to aid debugging. +* (gazelle): Simplify and make gazelle_python.yaml have only top level package name. + It would work well in cases to reduce merge conflicts. ### Fixed * (rules) Signals are properly received when using {obj}`--bootstrap_impl=script` diff --git a/examples/build_file_generation/gazelle_python.yaml b/examples/build_file_generation/gazelle_python.yaml index 6761b8dacf..cd5904dcba 100644 --- a/examples/build_file_generation/gazelle_python.yaml +++ b/examples/build_file_generation/gazelle_python.yaml @@ -6,822 +6,32 @@ manifest: modules_mapping: alabaster: alabaster - alabaster.support: alabaster babel: Babel - babel.core: Babel - babel.dates: Babel - babel.languages: Babel - babel.lists: Babel - babel.localedata: Babel - babel.localtime: Babel - babel.messages: Babel - babel.messages.catalog: Babel - babel.messages.checkers: Babel - babel.messages.extract: Babel - babel.messages.frontend: Babel - babel.messages.jslexer: Babel - babel.messages.mofile: Babel - babel.messages.plurals: Babel - babel.messages.pofile: Babel - babel.numbers: Babel - babel.plural: Babel - babel.support: Babel - babel.units: Babel - babel.util: Babel certifi: certifi - certifi.core: certifi charset_normalizer: charset_normalizer - charset_normalizer.api: charset_normalizer - charset_normalizer.cd: charset_normalizer - charset_normalizer.cli: charset_normalizer - charset_normalizer.constant: charset_normalizer - charset_normalizer.legacy: charset_normalizer - charset_normalizer.md: charset_normalizer - charset_normalizer.md__mypyc: charset_normalizer - charset_normalizer.models: charset_normalizer - charset_normalizer.utils: charset_normalizer - charset_normalizer.version: charset_normalizer click: click - click.core: click - click.decorators: click - click.exceptions: click - click.formatting: click - click.globals: click - click.parser: click - click.shell_completion: click - click.termui: click - click.testing: click - click.types: click - click.utils: click docutils: docutils - docutils.core: docutils - docutils.examples: docutils - docutils.frontend: docutils - docutils.io: docutils - docutils.languages: docutils - docutils.languages.af: docutils - docutils.languages.ar: docutils - docutils.languages.ca: docutils - docutils.languages.cs: docutils - docutils.languages.da: docutils - docutils.languages.de: docutils - docutils.languages.en: docutils - docutils.languages.eo: docutils - docutils.languages.es: docutils - docutils.languages.fa: docutils - docutils.languages.fi: docutils - docutils.languages.fr: docutils - docutils.languages.gl: docutils - docutils.languages.he: docutils - docutils.languages.it: docutils - docutils.languages.ja: docutils - docutils.languages.ko: docutils - docutils.languages.lt: docutils - docutils.languages.lv: docutils - docutils.languages.nl: docutils - docutils.languages.pl: docutils - docutils.languages.pt_br: docutils - docutils.languages.ru: docutils - docutils.languages.sk: docutils - docutils.languages.sv: docutils - docutils.languages.uk: docutils - docutils.languages.zh_cn: docutils - docutils.languages.zh_tw: docutils - docutils.nodes: docutils - docutils.parsers: docutils - docutils.parsers.commonmark_wrapper: docutils - docutils.parsers.null: docutils - docutils.parsers.recommonmark_wrapper: docutils - docutils.parsers.rst: docutils - docutils.parsers.rst.directives: docutils - docutils.parsers.rst.directives.admonitions: docutils - docutils.parsers.rst.directives.body: docutils - docutils.parsers.rst.directives.html: docutils - docutils.parsers.rst.directives.images: docutils - docutils.parsers.rst.directives.misc: docutils - docutils.parsers.rst.directives.parts: docutils - docutils.parsers.rst.directives.references: docutils - docutils.parsers.rst.directives.tables: docutils - docutils.parsers.rst.languages: docutils - docutils.parsers.rst.languages.af: docutils - docutils.parsers.rst.languages.ar: docutils - docutils.parsers.rst.languages.ca: docutils - docutils.parsers.rst.languages.cs: docutils - docutils.parsers.rst.languages.da: docutils - docutils.parsers.rst.languages.de: docutils - docutils.parsers.rst.languages.en: docutils - docutils.parsers.rst.languages.eo: docutils - docutils.parsers.rst.languages.es: docutils - docutils.parsers.rst.languages.fa: docutils - docutils.parsers.rst.languages.fi: docutils - docutils.parsers.rst.languages.fr: docutils - docutils.parsers.rst.languages.gl: docutils - docutils.parsers.rst.languages.he: docutils - docutils.parsers.rst.languages.it: docutils - docutils.parsers.rst.languages.ja: docutils - docutils.parsers.rst.languages.ko: docutils - docutils.parsers.rst.languages.lt: docutils - docutils.parsers.rst.languages.lv: docutils - docutils.parsers.rst.languages.nl: docutils - docutils.parsers.rst.languages.pl: docutils - docutils.parsers.rst.languages.pt_br: docutils - docutils.parsers.rst.languages.ru: docutils - docutils.parsers.rst.languages.sk: docutils - docutils.parsers.rst.languages.sv: docutils - docutils.parsers.rst.languages.uk: docutils - docutils.parsers.rst.languages.zh_cn: docutils - docutils.parsers.rst.languages.zh_tw: docutils - docutils.parsers.rst.roles: docutils - docutils.parsers.rst.states: docutils - docutils.parsers.rst.tableparser: docutils - docutils.readers: docutils - docutils.readers.doctree: docutils - docutils.readers.pep: docutils - docutils.readers.standalone: docutils - docutils.statemachine: docutils - docutils.transforms: docutils - docutils.transforms.components: docutils - docutils.transforms.frontmatter: docutils - docutils.transforms.misc: docutils - docutils.transforms.parts: docutils - docutils.transforms.peps: docutils - docutils.transforms.references: docutils - docutils.transforms.universal: docutils - docutils.transforms.writer_aux: docutils - docutils.utils: docutils - docutils.utils.code_analyzer: docutils - docutils.utils.error_reporting: docutils - docutils.utils.math: docutils - docutils.utils.math.latex2mathml: docutils - docutils.utils.math.math2html: docutils - docutils.utils.math.tex2mathml_extern: docutils - docutils.utils.math.tex2unichar: docutils - docutils.utils.math.unichar2tex: docutils - docutils.utils.punctuation_chars: docutils - docutils.utils.roman: docutils - docutils.utils.smartquotes: docutils - docutils.utils.urischemes: docutils - docutils.writers: docutils - docutils.writers.docutils_xml: docutils - docutils.writers.html4css1: docutils - docutils.writers.html5_polyglot: docutils - docutils.writers.latex2e: docutils - docutils.writers.manpage: docutils - docutils.writers.null: docutils - docutils.writers.odf_odt: docutils - docutils.writers.odf_odt.prepstyles: docutils - docutils.writers.odf_odt.pygmentsformatter: docutils - docutils.writers.pep_html: docutils - docutils.writers.pseudoxml: docutils - docutils.writers.s5_html: docutils - docutils.writers.xetex: docutils flask: Flask - flask.app: Flask - flask.blueprints: Flask - flask.cli: Flask - flask.config: Flask - flask.ctx: Flask - flask.debughelpers: Flask - flask.globals: Flask - flask.helpers: Flask - flask.json: Flask - flask.json.provider: Flask - flask.json.tag: Flask - flask.logging: Flask - flask.scaffold: Flask - flask.sessions: Flask - flask.signals: Flask - flask.templating: Flask - flask.testing: Flask - flask.typing: Flask - flask.views: Flask - flask.wrappers: Flask idna: idna - idna.codec: idna - idna.compat: idna - idna.core: idna - idna.idnadata: idna - idna.intranges: idna - idna.package_data: idna - idna.uts46data: idna imagesize: imagesize - imagesize.imagesize: imagesize importlib_metadata: importlib_metadata itsdangerous: itsdangerous - itsdangerous.encoding: itsdangerous - itsdangerous.exc: itsdangerous - itsdangerous.serializer: itsdangerous - itsdangerous.signer: itsdangerous - itsdangerous.timed: itsdangerous - itsdangerous.url_safe: itsdangerous jinja2: Jinja2 - jinja2.async_utils: Jinja2 - jinja2.bccache: Jinja2 - jinja2.compiler: Jinja2 - jinja2.constants: Jinja2 - jinja2.debug: Jinja2 - jinja2.defaults: Jinja2 - jinja2.environment: Jinja2 - jinja2.exceptions: Jinja2 - jinja2.ext: Jinja2 - jinja2.filters: Jinja2 - jinja2.idtracking: Jinja2 - jinja2.lexer: Jinja2 - jinja2.loaders: Jinja2 - jinja2.meta: Jinja2 - jinja2.nativetypes: Jinja2 - jinja2.nodes: Jinja2 - jinja2.optimizer: Jinja2 - jinja2.parser: Jinja2 - jinja2.runtime: Jinja2 - jinja2.sandbox: Jinja2 - jinja2.utils: Jinja2 - jinja2.visitor: Jinja2 markupsafe: MarkupSafe packaging: packaging - packaging.markers: packaging - packaging.metadata: packaging - packaging.requirements: packaging - packaging.specifiers: packaging - packaging.tags: packaging - packaging.utils: packaging - packaging.version: packaging pygments: Pygments - pygments.cmdline: Pygments - pygments.console: Pygments - pygments.filter: Pygments - pygments.filters: Pygments - pygments.formatter: Pygments - pygments.formatters: Pygments - pygments.formatters.bbcode: Pygments - pygments.formatters.groff: Pygments - pygments.formatters.html: Pygments - pygments.formatters.img: Pygments - pygments.formatters.irc: Pygments - pygments.formatters.latex: Pygments - pygments.formatters.other: Pygments - pygments.formatters.pangomarkup: Pygments - pygments.formatters.rtf: Pygments - pygments.formatters.svg: Pygments - pygments.formatters.terminal: Pygments - pygments.formatters.terminal256: Pygments - pygments.lexer: Pygments - pygments.lexers: Pygments - pygments.lexers.actionscript: Pygments - pygments.lexers.ada: Pygments - pygments.lexers.agile: Pygments - pygments.lexers.algebra: Pygments - pygments.lexers.ambient: Pygments - pygments.lexers.amdgpu: Pygments - pygments.lexers.ampl: Pygments - pygments.lexers.apdlexer: Pygments - pygments.lexers.apl: Pygments - pygments.lexers.archetype: Pygments - pygments.lexers.arrow: Pygments - pygments.lexers.arturo: Pygments - pygments.lexers.asc: Pygments - pygments.lexers.asm: Pygments - pygments.lexers.asn1: Pygments - pygments.lexers.automation: Pygments - pygments.lexers.bare: Pygments - pygments.lexers.basic: Pygments - pygments.lexers.bdd: Pygments - pygments.lexers.berry: Pygments - pygments.lexers.bibtex: Pygments - pygments.lexers.blueprint: Pygments - pygments.lexers.boa: Pygments - pygments.lexers.bqn: Pygments - pygments.lexers.business: Pygments - pygments.lexers.c_cpp: Pygments - pygments.lexers.c_like: Pygments - pygments.lexers.capnproto: Pygments - pygments.lexers.carbon: Pygments - pygments.lexers.cddl: Pygments - pygments.lexers.chapel: Pygments - pygments.lexers.clean: Pygments - pygments.lexers.comal: Pygments - pygments.lexers.compiled: Pygments - pygments.lexers.configs: Pygments - pygments.lexers.console: Pygments - pygments.lexers.cplint: Pygments - pygments.lexers.crystal: Pygments - pygments.lexers.csound: Pygments - pygments.lexers.css: Pygments - pygments.lexers.d: Pygments - pygments.lexers.dalvik: Pygments - pygments.lexers.data: Pygments - pygments.lexers.dax: Pygments - pygments.lexers.devicetree: Pygments - pygments.lexers.diff: Pygments - pygments.lexers.dns: Pygments - pygments.lexers.dotnet: Pygments - pygments.lexers.dsls: Pygments - pygments.lexers.dylan: Pygments - pygments.lexers.ecl: Pygments - pygments.lexers.eiffel: Pygments - pygments.lexers.elm: Pygments - pygments.lexers.elpi: Pygments - pygments.lexers.email: Pygments - pygments.lexers.erlang: Pygments - pygments.lexers.esoteric: Pygments - pygments.lexers.ezhil: Pygments - pygments.lexers.factor: Pygments - pygments.lexers.fantom: Pygments - pygments.lexers.felix: Pygments - pygments.lexers.fift: Pygments - pygments.lexers.floscript: Pygments - pygments.lexers.forth: Pygments - pygments.lexers.fortran: Pygments - pygments.lexers.foxpro: Pygments - pygments.lexers.freefem: Pygments - pygments.lexers.func: Pygments - pygments.lexers.functional: Pygments - pygments.lexers.futhark: Pygments - pygments.lexers.gcodelexer: Pygments - pygments.lexers.gdscript: Pygments - pygments.lexers.go: Pygments - pygments.lexers.grammar_notation: Pygments - pygments.lexers.graph: Pygments - pygments.lexers.graphics: Pygments - pygments.lexers.graphql: Pygments - pygments.lexers.graphviz: Pygments - pygments.lexers.gsql: Pygments - pygments.lexers.haskell: Pygments - pygments.lexers.haxe: Pygments - pygments.lexers.hdl: Pygments - pygments.lexers.hexdump: Pygments - pygments.lexers.html: Pygments - pygments.lexers.idl: Pygments - pygments.lexers.igor: Pygments - pygments.lexers.inferno: Pygments - pygments.lexers.installers: Pygments - pygments.lexers.int_fiction: Pygments - pygments.lexers.iolang: Pygments - pygments.lexers.j: Pygments - pygments.lexers.javascript: Pygments - pygments.lexers.jmespath: Pygments - pygments.lexers.jslt: Pygments - pygments.lexers.jsonnet: Pygments - pygments.lexers.julia: Pygments - pygments.lexers.jvm: Pygments - pygments.lexers.kuin: Pygments - pygments.lexers.lilypond: Pygments - pygments.lexers.lisp: Pygments - pygments.lexers.macaulay2: Pygments - pygments.lexers.make: Pygments - pygments.lexers.markup: Pygments - pygments.lexers.math: Pygments - pygments.lexers.matlab: Pygments - pygments.lexers.maxima: Pygments - pygments.lexers.meson: Pygments - pygments.lexers.mime: Pygments - pygments.lexers.minecraft: Pygments - pygments.lexers.mips: Pygments - pygments.lexers.ml: Pygments - pygments.lexers.modeling: Pygments - pygments.lexers.modula2: Pygments - pygments.lexers.monte: Pygments - pygments.lexers.mosel: Pygments - pygments.lexers.ncl: Pygments - pygments.lexers.nimrod: Pygments - pygments.lexers.nit: Pygments - pygments.lexers.nix: Pygments - pygments.lexers.oberon: Pygments - pygments.lexers.objective: Pygments - pygments.lexers.ooc: Pygments - pygments.lexers.openscad: Pygments - pygments.lexers.other: Pygments - pygments.lexers.parasail: Pygments - pygments.lexers.parsers: Pygments - pygments.lexers.pascal: Pygments - pygments.lexers.pawn: Pygments - pygments.lexers.perl: Pygments - pygments.lexers.phix: Pygments - pygments.lexers.php: Pygments - pygments.lexers.pointless: Pygments - pygments.lexers.pony: Pygments - pygments.lexers.praat: Pygments - pygments.lexers.procfile: Pygments - pygments.lexers.prolog: Pygments - pygments.lexers.promql: Pygments - pygments.lexers.ptx: Pygments - pygments.lexers.python: Pygments - pygments.lexers.q: Pygments - pygments.lexers.qlik: Pygments - pygments.lexers.qvt: Pygments - pygments.lexers.r: Pygments - pygments.lexers.rdf: Pygments - pygments.lexers.rebol: Pygments - pygments.lexers.resource: Pygments - pygments.lexers.ride: Pygments - pygments.lexers.rita: Pygments - pygments.lexers.rnc: Pygments - pygments.lexers.roboconf: Pygments - pygments.lexers.robotframework: Pygments - pygments.lexers.ruby: Pygments - pygments.lexers.rust: Pygments - pygments.lexers.sas: Pygments - pygments.lexers.savi: Pygments - pygments.lexers.scdoc: Pygments - pygments.lexers.scripting: Pygments - pygments.lexers.sgf: Pygments - pygments.lexers.shell: Pygments - pygments.lexers.sieve: Pygments - pygments.lexers.slash: Pygments - pygments.lexers.smalltalk: Pygments - pygments.lexers.smithy: Pygments - pygments.lexers.smv: Pygments - pygments.lexers.snobol: Pygments - pygments.lexers.solidity: Pygments - pygments.lexers.sophia: Pygments - pygments.lexers.special: Pygments - pygments.lexers.spice: Pygments - pygments.lexers.sql: Pygments - pygments.lexers.srcinfo: Pygments - pygments.lexers.stata: Pygments - pygments.lexers.supercollider: Pygments - pygments.lexers.tal: Pygments - pygments.lexers.tcl: Pygments - pygments.lexers.teal: Pygments - pygments.lexers.templates: Pygments - pygments.lexers.teraterm: Pygments - pygments.lexers.testing: Pygments - pygments.lexers.text: Pygments - pygments.lexers.textedit: Pygments - pygments.lexers.textfmts: Pygments - pygments.lexers.theorem: Pygments - pygments.lexers.thingsdb: Pygments - pygments.lexers.tlb: Pygments - pygments.lexers.tls: Pygments - pygments.lexers.tnt: Pygments - pygments.lexers.trafficscript: Pygments - pygments.lexers.typoscript: Pygments - pygments.lexers.ul4: Pygments - pygments.lexers.unicon: Pygments - pygments.lexers.urbi: Pygments - pygments.lexers.usd: Pygments - pygments.lexers.varnish: Pygments - pygments.lexers.verification: Pygments - pygments.lexers.verifpal: Pygments - pygments.lexers.web: Pygments - pygments.lexers.webassembly: Pygments - pygments.lexers.webidl: Pygments - pygments.lexers.webmisc: Pygments - pygments.lexers.wgsl: Pygments - pygments.lexers.whiley: Pygments - pygments.lexers.wowtoc: Pygments - pygments.lexers.wren: Pygments - pygments.lexers.x10: Pygments - pygments.lexers.xorg: Pygments - pygments.lexers.yang: Pygments - pygments.lexers.yara: Pygments - pygments.lexers.zig: Pygments - pygments.modeline: Pygments - pygments.plugin: Pygments - pygments.regexopt: Pygments - pygments.scanner: Pygments - pygments.sphinxext: Pygments - pygments.style: Pygments - pygments.styles: Pygments - pygments.styles.abap: Pygments - pygments.styles.algol: Pygments - pygments.styles.algol_nu: Pygments - pygments.styles.arduino: Pygments - pygments.styles.autumn: Pygments - pygments.styles.borland: Pygments - pygments.styles.bw: Pygments - pygments.styles.colorful: Pygments - pygments.styles.default: Pygments - pygments.styles.dracula: Pygments - pygments.styles.emacs: Pygments - pygments.styles.friendly: Pygments - pygments.styles.friendly_grayscale: Pygments - pygments.styles.fruity: Pygments - pygments.styles.gh_dark: Pygments - pygments.styles.gruvbox: Pygments - pygments.styles.igor: Pygments - pygments.styles.inkpot: Pygments - pygments.styles.lightbulb: Pygments - pygments.styles.lilypond: Pygments - pygments.styles.lovelace: Pygments - pygments.styles.manni: Pygments - pygments.styles.material: Pygments - pygments.styles.monokai: Pygments - pygments.styles.murphy: Pygments - pygments.styles.native: Pygments - pygments.styles.nord: Pygments - pygments.styles.onedark: Pygments - pygments.styles.paraiso_dark: Pygments - pygments.styles.paraiso_light: Pygments - pygments.styles.pastie: Pygments - pygments.styles.perldoc: Pygments - pygments.styles.rainbow_dash: Pygments - pygments.styles.rrt: Pygments - pygments.styles.sas: Pygments - pygments.styles.solarized: Pygments - pygments.styles.staroffice: Pygments - pygments.styles.stata_dark: Pygments - pygments.styles.stata_light: Pygments - pygments.styles.tango: Pygments - pygments.styles.trac: Pygments - pygments.styles.vim: Pygments - pygments.styles.vs: Pygments - pygments.styles.xcode: Pygments - pygments.styles.zenburn: Pygments - pygments.token: Pygments - pygments.unistring: Pygments - pygments.util: Pygments requests: requests - requests.adapters: requests - requests.api: requests - requests.auth: requests - requests.certs: requests - requests.compat: requests - requests.cookies: requests - requests.exceptions: requests - requests.help: requests - requests.hooks: requests - requests.models: requests - requests.packages: requests - requests.sessions: requests - requests.status_codes: requests - requests.structures: requests - requests.utils: requests snowballstemmer: snowballstemmer - snowballstemmer.among: snowballstemmer - snowballstemmer.arabic_stemmer: snowballstemmer - snowballstemmer.armenian_stemmer: snowballstemmer - snowballstemmer.basestemmer: snowballstemmer - snowballstemmer.basque_stemmer: snowballstemmer - snowballstemmer.catalan_stemmer: snowballstemmer - snowballstemmer.danish_stemmer: snowballstemmer - snowballstemmer.dutch_stemmer: snowballstemmer - snowballstemmer.english_stemmer: snowballstemmer - snowballstemmer.finnish_stemmer: snowballstemmer - snowballstemmer.french_stemmer: snowballstemmer - snowballstemmer.german_stemmer: snowballstemmer - snowballstemmer.greek_stemmer: snowballstemmer - snowballstemmer.hindi_stemmer: snowballstemmer - snowballstemmer.hungarian_stemmer: snowballstemmer - snowballstemmer.indonesian_stemmer: snowballstemmer - snowballstemmer.irish_stemmer: snowballstemmer - snowballstemmer.italian_stemmer: snowballstemmer - snowballstemmer.lithuanian_stemmer: snowballstemmer - snowballstemmer.nepali_stemmer: snowballstemmer - snowballstemmer.norwegian_stemmer: snowballstemmer - snowballstemmer.porter_stemmer: snowballstemmer - snowballstemmer.portuguese_stemmer: snowballstemmer - snowballstemmer.romanian_stemmer: snowballstemmer - snowballstemmer.russian_stemmer: snowballstemmer - snowballstemmer.serbian_stemmer: snowballstemmer - snowballstemmer.spanish_stemmer: snowballstemmer - snowballstemmer.swedish_stemmer: snowballstemmer - snowballstemmer.tamil_stemmer: snowballstemmer - snowballstemmer.turkish_stemmer: snowballstemmer - snowballstemmer.yiddish_stemmer: snowballstemmer sphinx: sphinx - sphinx.addnodes: sphinx - sphinx.application: sphinx - sphinx.builders: sphinx - sphinx.builders.changes: sphinx - sphinx.builders.dirhtml: sphinx - sphinx.builders.dummy: sphinx - sphinx.builders.epub3: sphinx - sphinx.builders.gettext: sphinx - sphinx.builders.html: sphinx - sphinx.builders.html.transforms: sphinx - sphinx.builders.latex: sphinx - sphinx.builders.latex.constants: sphinx - sphinx.builders.latex.nodes: sphinx - sphinx.builders.latex.theming: sphinx - sphinx.builders.latex.transforms: sphinx - sphinx.builders.latex.util: sphinx - sphinx.builders.linkcheck: sphinx - sphinx.builders.manpage: sphinx - sphinx.builders.singlehtml: sphinx - sphinx.builders.texinfo: sphinx - sphinx.builders.text: sphinx - sphinx.builders.xml: sphinx - sphinx.cmd: sphinx - sphinx.cmd.build: sphinx - sphinx.cmd.make_mode: sphinx - sphinx.cmd.quickstart: sphinx - sphinx.config: sphinx - sphinx.deprecation: sphinx - sphinx.directives: sphinx - sphinx.directives.code: sphinx - sphinx.directives.other: sphinx - sphinx.directives.patches: sphinx - sphinx.domains: sphinx - sphinx.domains.c: sphinx - sphinx.domains.changeset: sphinx - sphinx.domains.citation: sphinx - sphinx.domains.cpp: sphinx - sphinx.domains.index: sphinx - sphinx.domains.javascript: sphinx - sphinx.domains.math: sphinx - sphinx.domains.python: sphinx - sphinx.domains.rst: sphinx - sphinx.domains.std: sphinx - sphinx.environment: sphinx - sphinx.environment.adapters: sphinx - sphinx.environment.adapters.asset: sphinx - sphinx.environment.adapters.indexentries: sphinx - sphinx.environment.adapters.toctree: sphinx - sphinx.environment.collectors: sphinx - sphinx.environment.collectors.asset: sphinx - sphinx.environment.collectors.dependencies: sphinx - sphinx.environment.collectors.metadata: sphinx - sphinx.environment.collectors.title: sphinx - sphinx.environment.collectors.toctree: sphinx - sphinx.errors: sphinx - sphinx.events: sphinx - sphinx.ext: sphinx - sphinx.ext.apidoc: sphinx - sphinx.ext.autodoc: sphinx - sphinx.ext.autodoc.directive: sphinx - sphinx.ext.autodoc.importer: sphinx - sphinx.ext.autodoc.mock: sphinx - sphinx.ext.autodoc.preserve_defaults: sphinx - sphinx.ext.autodoc.type_comment: sphinx - sphinx.ext.autodoc.typehints: sphinx - sphinx.ext.autosectionlabel: sphinx - sphinx.ext.autosummary: sphinx - sphinx.ext.autosummary.generate: sphinx - sphinx.ext.coverage: sphinx - sphinx.ext.doctest: sphinx - sphinx.ext.duration: sphinx - sphinx.ext.extlinks: sphinx - sphinx.ext.githubpages: sphinx - sphinx.ext.graphviz: sphinx - sphinx.ext.ifconfig: sphinx - sphinx.ext.imgconverter: sphinx - sphinx.ext.imgmath: sphinx - sphinx.ext.inheritance_diagram: sphinx - sphinx.ext.intersphinx: sphinx - sphinx.ext.linkcode: sphinx - sphinx.ext.mathjax: sphinx - sphinx.ext.napoleon: sphinx - sphinx.ext.napoleon.docstring: sphinx - sphinx.ext.todo: sphinx - sphinx.ext.viewcode: sphinx - sphinx.extension: sphinx - sphinx.highlighting: sphinx - sphinx.io: sphinx - sphinx.jinja2glue: sphinx - sphinx.locale: sphinx - sphinx.parsers: sphinx - sphinx.project: sphinx - sphinx.pycode: sphinx - sphinx.pycode.ast: sphinx - sphinx.pycode.parser: sphinx - sphinx.pygments_styles: sphinx - sphinx.registry: sphinx - sphinx.roles: sphinx - sphinx.search: sphinx - sphinx.search.da: sphinx - sphinx.search.de: sphinx - sphinx.search.en: sphinx - sphinx.search.es: sphinx - sphinx.search.fi: sphinx - sphinx.search.fr: sphinx - sphinx.search.hu: sphinx - sphinx.search.it: sphinx - sphinx.search.ja: sphinx - sphinx.search.nl: sphinx - sphinx.search.no: sphinx - sphinx.search.pt: sphinx - sphinx.search.ro: sphinx - sphinx.search.ru: sphinx - sphinx.search.sv: sphinx - sphinx.search.tr: sphinx - sphinx.search.zh: sphinx - sphinx.testing: sphinx - sphinx.testing.fixtures: sphinx - sphinx.testing.path: sphinx - sphinx.testing.restructuredtext: sphinx - sphinx.testing.util: sphinx - sphinx.theming: sphinx - sphinx.transforms: sphinx - sphinx.transforms.compact_bullet_list: sphinx - sphinx.transforms.i18n: sphinx - sphinx.transforms.post_transforms: sphinx - sphinx.transforms.post_transforms.code: sphinx - sphinx.transforms.post_transforms.images: sphinx - sphinx.transforms.references: sphinx - sphinx.util: sphinx - sphinx.util.build_phase: sphinx - sphinx.util.cfamily: sphinx - sphinx.util.console: sphinx - sphinx.util.display: sphinx - sphinx.util.docfields: sphinx - sphinx.util.docstrings: sphinx - sphinx.util.docutils: sphinx - sphinx.util.exceptions: sphinx - sphinx.util.fileutil: sphinx - sphinx.util.http_date: sphinx - sphinx.util.i18n: sphinx - sphinx.util.images: sphinx - sphinx.util.index_entries: sphinx - sphinx.util.inspect: sphinx - sphinx.util.inventory: sphinx - sphinx.util.logging: sphinx - sphinx.util.matching: sphinx - sphinx.util.math: sphinx - sphinx.util.nodes: sphinx - sphinx.util.osutil: sphinx - sphinx.util.parallel: sphinx - sphinx.util.png: sphinx - sphinx.util.requests: sphinx - sphinx.util.rst: sphinx - sphinx.util.tags: sphinx - sphinx.util.template: sphinx - sphinx.util.texescape: sphinx - sphinx.util.typing: sphinx - sphinx.versioning: sphinx - sphinx.writers: sphinx - sphinx.writers.html: sphinx - sphinx.writers.html5: sphinx - sphinx.writers.latex: sphinx - sphinx.writers.manpage: sphinx - sphinx.writers.texinfo: sphinx - sphinx.writers.text: sphinx - sphinx.writers.xml: sphinx sphinxcontrib.applehelp: sphinxcontrib_applehelp sphinxcontrib.devhelp: sphinxcontrib_devhelp sphinxcontrib.htmlhelp: sphinxcontrib_htmlhelp sphinxcontrib.jsmath: sphinxcontrib_jsmath - sphinxcontrib.jsmath.version: sphinxcontrib_jsmath sphinxcontrib.qthelp: sphinxcontrib_qthelp sphinxcontrib.serializinghtml: sphinxcontrib_serializinghtml - sphinxcontrib.serializinghtml.jsonimpl: sphinxcontrib_serializinghtml urllib3: urllib3 - urllib3.connection: urllib3 - urllib3.connectionpool: urllib3 - urllib3.contrib: urllib3 - urllib3.contrib.pyopenssl: urllib3 - urllib3.contrib.securetransport: urllib3 - urllib3.contrib.socks: urllib3 - urllib3.exceptions: urllib3 - urllib3.fields: urllib3 - urllib3.filepost: urllib3 - urllib3.poolmanager: urllib3 - urllib3.response: urllib3 - urllib3.util: urllib3 - urllib3.util.connection: urllib3 - urllib3.util.proxy: urllib3 - urllib3.util.request: urllib3 - urllib3.util.response: urllib3 - urllib3.util.retry: urllib3 - urllib3.util.ssl_: urllib3 - urllib3.util.ssl_match_hostname: urllib3 - urllib3.util.ssltransport: urllib3 - urllib3.util.timeout: urllib3 - urllib3.util.url: urllib3 - urllib3.util.util: urllib3 - urllib3.util.wait: urllib3 werkzeug: Werkzeug - werkzeug.datastructures: Werkzeug - werkzeug.debug: Werkzeug - werkzeug.debug.console: Werkzeug - werkzeug.debug.repr: Werkzeug - werkzeug.debug.tbtools: Werkzeug - werkzeug.exceptions: Werkzeug - werkzeug.formparser: Werkzeug - werkzeug.http: Werkzeug - werkzeug.local: Werkzeug - werkzeug.middleware: Werkzeug - werkzeug.middleware.dispatcher: Werkzeug - werkzeug.middleware.http_proxy: Werkzeug - werkzeug.middleware.lint: Werkzeug - werkzeug.middleware.profiler: Werkzeug - werkzeug.middleware.proxy_fix: Werkzeug - werkzeug.middleware.shared_data: Werkzeug - werkzeug.routing: Werkzeug - werkzeug.routing.converters: Werkzeug - werkzeug.routing.exceptions: Werkzeug - werkzeug.routing.map: Werkzeug - werkzeug.routing.matcher: Werkzeug - werkzeug.routing.rules: Werkzeug - werkzeug.sansio: Werkzeug - werkzeug.sansio.http: Werkzeug - werkzeug.sansio.multipart: Werkzeug - werkzeug.sansio.request: Werkzeug - werkzeug.sansio.response: Werkzeug - werkzeug.sansio.utils: Werkzeug - werkzeug.security: Werkzeug - werkzeug.serving: Werkzeug - werkzeug.test: Werkzeug - werkzeug.testapp: Werkzeug - werkzeug.urls: Werkzeug - werkzeug.user_agent: Werkzeug - werkzeug.utils: Werkzeug - werkzeug.wrappers: Werkzeug - werkzeug.wrappers.request: Werkzeug - werkzeug.wrappers.response: Werkzeug - werkzeug.wsgi: Werkzeug zipp: zipp - zipp.py310compat: zipp pip_repository: name: pip -integrity: 4658c69530ba1ee117da0c963c9c671041e1c470d938c31cdbbfccc21dd259cb +integrity: 19c0e03a9cf1d6bbb2dfe301325fefc59a30c3f967f84c2f1baaf915c2805da7 diff --git a/examples/bzlmod_build_file_generation/gazelle_python.yaml b/examples/bzlmod_build_file_generation/gazelle_python.yaml index ef0146012a..d0d322446e 100644 --- a/examples/bzlmod_build_file_generation/gazelle_python.yaml +++ b/examples/bzlmod_build_file_generation/gazelle_python.yaml @@ -6,583 +6,30 @@ manifest: modules_mapping: S3: s3cmd - S3.ACL: s3cmd - S3.AccessLog: s3cmd - S3.BidirMap: s3cmd - S3.CloudFront: s3cmd - S3.Config: s3cmd - S3.ConnMan: s3cmd - S3.Crypto: s3cmd - S3.Custom_httplib27: s3cmd - S3.Custom_httplib3x: s3cmd - S3.Exceptions: s3cmd - S3.ExitCodes: s3cmd - S3.FileDict: s3cmd - S3.FileLists: s3cmd - S3.HashCache: s3cmd - S3.MultiPart: s3cmd - S3.PkgInfo: s3cmd - S3.Progress: s3cmd - S3.S3: s3cmd - S3.S3Uri: s3cmd - S3.SortedDict: s3cmd - S3.Utils: s3cmd astroid: astroid - astroid.arguments: astroid - astroid.astroid_manager: astroid - astroid.bases: astroid - astroid.brain: astroid - astroid.brain.brain_argparse: astroid - astroid.brain.brain_attrs: astroid - astroid.brain.brain_boto3: astroid - astroid.brain.brain_builtin_inference: astroid - astroid.brain.brain_collections: astroid - astroid.brain.brain_crypt: astroid - astroid.brain.brain_ctypes: astroid - astroid.brain.brain_curses: astroid - astroid.brain.brain_dataclasses: astroid - astroid.brain.brain_dateutil: astroid - astroid.brain.brain_fstrings: astroid - astroid.brain.brain_functools: astroid - astroid.brain.brain_gi: astroid - astroid.brain.brain_hashlib: astroid - astroid.brain.brain_http: astroid - astroid.brain.brain_hypothesis: astroid - astroid.brain.brain_io: astroid - astroid.brain.brain_mechanize: astroid - astroid.brain.brain_multiprocessing: astroid - astroid.brain.brain_namedtuple_enum: astroid - astroid.brain.brain_nose: astroid - astroid.brain.brain_numpy_core_einsumfunc: astroid - astroid.brain.brain_numpy_core_fromnumeric: astroid - astroid.brain.brain_numpy_core_function_base: astroid - astroid.brain.brain_numpy_core_multiarray: astroid - astroid.brain.brain_numpy_core_numeric: astroid - astroid.brain.brain_numpy_core_numerictypes: astroid - astroid.brain.brain_numpy_core_umath: astroid - astroid.brain.brain_numpy_ma: astroid - astroid.brain.brain_numpy_ndarray: astroid - astroid.brain.brain_numpy_random_mtrand: astroid - astroid.brain.brain_numpy_utils: astroid - astroid.brain.brain_pathlib: astroid - astroid.brain.brain_pkg_resources: astroid - astroid.brain.brain_pytest: astroid - astroid.brain.brain_qt: astroid - astroid.brain.brain_random: astroid - astroid.brain.brain_re: astroid - astroid.brain.brain_responses: astroid - astroid.brain.brain_scipy_signal: astroid - astroid.brain.brain_signal: astroid - astroid.brain.brain_six: astroid - astroid.brain.brain_sqlalchemy: astroid - astroid.brain.brain_ssl: astroid - astroid.brain.brain_subprocess: astroid - astroid.brain.brain_threading: astroid - astroid.brain.brain_type: astroid - astroid.brain.brain_typing: astroid - astroid.brain.brain_unittest: astroid - astroid.brain.brain_uuid: astroid - astroid.brain.helpers: astroid - astroid.builder: astroid - astroid.const: astroid - astroid.context: astroid - astroid.decorators: astroid - astroid.exceptions: astroid - astroid.filter_statements: astroid - astroid.helpers: astroid - astroid.inference: astroid - astroid.inference_tip: astroid - astroid.interpreter: astroid - astroid.interpreter.dunder_lookup: astroid - astroid.interpreter.objectmodel: astroid - astroid.manager: astroid - astroid.mixins: astroid - astroid.modutils: astroid - astroid.node_classes: astroid - astroid.nodes: astroid - astroid.nodes.as_string: astroid - astroid.nodes.const: astroid - astroid.nodes.node_classes: astroid - astroid.nodes.node_ng: astroid - astroid.nodes.scoped_nodes: astroid - astroid.nodes.scoped_nodes.mixin: astroid - astroid.nodes.scoped_nodes.scoped_nodes: astroid - astroid.nodes.scoped_nodes.utils: astroid - astroid.nodes.utils: astroid - astroid.objects: astroid - astroid.protocols: astroid - astroid.raw_building: astroid - astroid.rebuilder: astroid - astroid.scoped_nodes: astroid - astroid.test_utils: astroid - astroid.transforms: astroid - astroid.typing: astroid - astroid.util: astroid certifi: certifi - certifi.core: certifi chardet: chardet - chardet.big5freq: chardet - chardet.big5prober: chardet - chardet.chardistribution: chardet - chardet.charsetgroupprober: chardet - chardet.charsetprober: chardet - chardet.cli: chardet - chardet.cli.chardetect: chardet - chardet.codingstatemachine: chardet - chardet.compat: chardet - chardet.cp949prober: chardet - chardet.enums: chardet - chardet.escprober: chardet - chardet.escsm: chardet - chardet.eucjpprober: chardet - chardet.euckrfreq: chardet - chardet.euckrprober: chardet - chardet.euctwfreq: chardet - chardet.euctwprober: chardet - chardet.gb2312freq: chardet - chardet.gb2312prober: chardet - chardet.hebrewprober: chardet - chardet.jisfreq: chardet - chardet.jpcntx: chardet - chardet.langbulgarianmodel: chardet - chardet.langgreekmodel: chardet - chardet.langhebrewmodel: chardet - chardet.langhungarianmodel: chardet - chardet.langrussianmodel: chardet - chardet.langthaimodel: chardet - chardet.langturkishmodel: chardet - chardet.latin1prober: chardet - chardet.mbcharsetprober: chardet - chardet.mbcsgroupprober: chardet - chardet.mbcssm: chardet - chardet.metadata: chardet - chardet.metadata.languages: chardet - chardet.sbcharsetprober: chardet - chardet.sbcsgroupprober: chardet - chardet.sjisprober: chardet - chardet.universaldetector: chardet - chardet.utf8prober: chardet - chardet.version: chardet dateutil: python_dateutil - dateutil.easter: python_dateutil - dateutil.parser: python_dateutil - dateutil.parser.isoparser: python_dateutil - dateutil.relativedelta: python_dateutil - dateutil.rrule: python_dateutil - dateutil.tz: python_dateutil - dateutil.tz.tz: python_dateutil - dateutil.tz.win: python_dateutil - dateutil.tzwin: python_dateutil - dateutil.utils: python_dateutil - dateutil.zoneinfo: python_dateutil - dateutil.zoneinfo.rebuild: python_dateutil dill: dill - dill.detect: dill - dill.logger: dill - dill.objtypes: dill - dill.pointers: dill - dill.session: dill - dill.settings: dill - dill.source: dill - dill.temp: dill idna: idna - idna.codec: idna - idna.compat: idna - idna.core: idna - idna.idnadata: idna - idna.intranges: idna - idna.package_data: idna - idna.uts46data: idna isort: isort - isort.api: isort - isort.comments: isort - isort.core: isort - isort.deprecated: isort - isort.deprecated.finders: isort - isort.exceptions: isort - isort.files: isort - isort.format: isort - isort.hooks: isort - isort.identify: isort - isort.io: isort - isort.literal: isort - isort.logo: isort - isort.main: isort - isort.output: isort - isort.parse: isort - isort.place: isort - isort.profiles: isort - isort.pylama_isort: isort - isort.sections: isort - isort.settings: isort - isort.setuptools_commands: isort - isort.sorting: isort - isort.stdlibs: isort - isort.stdlibs.all: isort - isort.stdlibs.py2: isort - isort.stdlibs.py27: isort - isort.stdlibs.py3: isort - isort.stdlibs.py310: isort - isort.stdlibs.py311: isort - isort.stdlibs.py36: isort - isort.stdlibs.py37: isort - isort.stdlibs.py38: isort - isort.stdlibs.py39: isort - isort.utils: isort - isort.wrap: isort - isort.wrap_modes: isort lazy_object_proxy: lazy_object_proxy - lazy_object_proxy.compat: lazy_object_proxy - lazy_object_proxy.simple: lazy_object_proxy - lazy_object_proxy.slots: lazy_object_proxy - lazy_object_proxy.utils: lazy_object_proxy magic: python_magic - magic.compat: python_magic - magic.loader: python_magic mccabe: mccabe pathspec: pathspec - pathspec.gitignore: pathspec - pathspec.pathspec: pathspec - pathspec.pattern: pathspec - pathspec.patterns: pathspec - pathspec.patterns.gitwildmatch: pathspec - pathspec.util: pathspec pkg_resources: setuptools - pkg_resources.extern: setuptools platformdirs: platformdirs - platformdirs.android: platformdirs - platformdirs.api: platformdirs - platformdirs.macos: platformdirs - platformdirs.unix: platformdirs - platformdirs.version: platformdirs - platformdirs.windows: platformdirs pylint: pylint - pylint.checkers: pylint - pylint.checkers.async: pylint - pylint.checkers.base: pylint - pylint.checkers.base.basic_checker: pylint - pylint.checkers.base.basic_error_checker: pylint - pylint.checkers.base.comparison_checker: pylint - pylint.checkers.base.docstring_checker: pylint - pylint.checkers.base.name_checker: pylint - pylint.checkers.base.name_checker.checker: pylint - pylint.checkers.base.name_checker.naming_style: pylint - pylint.checkers.base.pass_checker: pylint - pylint.checkers.base_checker: pylint - pylint.checkers.classes: pylint - pylint.checkers.classes.class_checker: pylint - pylint.checkers.classes.special_methods_checker: pylint - pylint.checkers.deprecated: pylint - pylint.checkers.design_analysis: pylint - pylint.checkers.dunder_methods: pylint - pylint.checkers.ellipsis_checker: pylint - pylint.checkers.exceptions: pylint - pylint.checkers.format: pylint - pylint.checkers.imports: pylint - pylint.checkers.lambda_expressions: pylint - pylint.checkers.logging: pylint - pylint.checkers.mapreduce_checker: pylint - pylint.checkers.method_args: pylint - pylint.checkers.misc: pylint - pylint.checkers.modified_iterating_checker: pylint - pylint.checkers.newstyle: pylint - pylint.checkers.non_ascii_names: pylint - pylint.checkers.raw_metrics: pylint - pylint.checkers.refactoring: pylint - pylint.checkers.refactoring.implicit_booleaness_checker: pylint - pylint.checkers.refactoring.not_checker: pylint - pylint.checkers.refactoring.recommendation_checker: pylint - pylint.checkers.refactoring.refactoring_checker: pylint - pylint.checkers.similar: pylint - pylint.checkers.spelling: pylint - pylint.checkers.stdlib: pylint - pylint.checkers.strings: pylint - pylint.checkers.threading_checker: pylint - pylint.checkers.typecheck: pylint - pylint.checkers.unicode: pylint - pylint.checkers.unsupported_version: pylint - pylint.checkers.utils: pylint - pylint.checkers.variables: pylint - pylint.config: pylint - pylint.config.argument: pylint - pylint.config.arguments_manager: pylint - pylint.config.arguments_provider: pylint - pylint.config.callback_actions: pylint - pylint.config.config_file_parser: pylint - pylint.config.config_initialization: pylint - pylint.config.configuration_mixin: pylint - pylint.config.deprecation_actions: pylint - pylint.config.environment_variable: pylint - pylint.config.exceptions: pylint - pylint.config.find_default_config_files: pylint - pylint.config.help_formatter: pylint - pylint.config.option: pylint - pylint.config.option_manager_mixin: pylint - pylint.config.option_parser: pylint - pylint.config.options_provider_mixin: pylint - pylint.config.utils: pylint - pylint.constants: pylint - pylint.epylint: pylint - pylint.exceptions: pylint - pylint.extensions: pylint - pylint.extensions.bad_builtin: pylint - pylint.extensions.broad_try_clause: pylint - pylint.extensions.check_elif: pylint - pylint.extensions.code_style: pylint - pylint.extensions.comparetozero: pylint - pylint.extensions.comparison_placement: pylint - pylint.extensions.confusing_elif: pylint - pylint.extensions.consider_ternary_expression: pylint - pylint.extensions.docparams: pylint - pylint.extensions.docstyle: pylint - pylint.extensions.empty_comment: pylint - pylint.extensions.emptystring: pylint - pylint.extensions.eq_without_hash: pylint - pylint.extensions.for_any_all: pylint - pylint.extensions.mccabe: pylint - pylint.extensions.no_self_use: pylint - pylint.extensions.overlapping_exceptions: pylint - pylint.extensions.private_import: pylint - pylint.extensions.redefined_loop_name: pylint - pylint.extensions.redefined_variable_type: pylint - pylint.extensions.set_membership: pylint - pylint.extensions.typing: pylint - pylint.extensions.while_used: pylint - pylint.graph: pylint - pylint.interfaces: pylint - pylint.lint: pylint - pylint.lint.base_options: pylint - pylint.lint.caching: pylint - pylint.lint.expand_modules: pylint - pylint.lint.message_state_handler: pylint - pylint.lint.parallel: pylint - pylint.lint.pylinter: pylint - pylint.lint.report_functions: pylint - pylint.lint.run: pylint - pylint.lint.utils: pylint - pylint.message: pylint - pylint.message.message: pylint - pylint.message.message_definition: pylint - pylint.message.message_definition_store: pylint - pylint.message.message_id_store: pylint - pylint.pyreverse: pylint - pylint.pyreverse.diadefslib: pylint - pylint.pyreverse.diagrams: pylint - pylint.pyreverse.dot_printer: pylint - pylint.pyreverse.inspector: pylint - pylint.pyreverse.main: pylint - pylint.pyreverse.mermaidjs_printer: pylint - pylint.pyreverse.plantuml_printer: pylint - pylint.pyreverse.printer: pylint - pylint.pyreverse.printer_factory: pylint - pylint.pyreverse.utils: pylint - pylint.pyreverse.vcg_printer: pylint - pylint.pyreverse.writer: pylint - pylint.reporters: pylint - pylint.reporters.base_reporter: pylint - pylint.reporters.collecting_reporter: pylint - pylint.reporters.json_reporter: pylint - pylint.reporters.multi_reporter: pylint - pylint.reporters.reports_handler_mix_in: pylint - pylint.reporters.text: pylint - pylint.reporters.ureports: pylint - pylint.reporters.ureports.base_writer: pylint - pylint.reporters.ureports.nodes: pylint - pylint.reporters.ureports.text_writer: pylint - pylint.testutils: pylint - pylint.testutils.checker_test_case: pylint - pylint.testutils.configuration_test: pylint - pylint.testutils.constants: pylint - pylint.testutils.decorator: pylint - pylint.testutils.functional: pylint - pylint.testutils.functional.find_functional_tests: pylint - pylint.testutils.functional.lint_module_output_update: pylint - pylint.testutils.functional.test_file: pylint - pylint.testutils.functional_test_file: pylint - pylint.testutils.get_test_info: pylint - pylint.testutils.global_test_linter: pylint - pylint.testutils.lint_module_test: pylint - pylint.testutils.output_line: pylint - pylint.testutils.pyreverse: pylint - pylint.testutils.reporter_for_tests: pylint - pylint.testutils.tokenize_str: pylint - pylint.testutils.unittest_linter: pylint - pylint.testutils.utils: pylint - pylint.typing: pylint - pylint.utils: pylint - pylint.utils.ast_walker: pylint - pylint.utils.docs: pylint - pylint.utils.file_state: pylint - pylint.utils.linterstats: pylint - pylint.utils.pragma_parser: pylint - pylint.utils.utils: pylint requests: requests - requests.adapters: requests - requests.api: requests - requests.auth: requests - requests.certs: requests - requests.compat: requests - requests.cookies: requests - requests.exceptions: requests - requests.help: requests - requests.hooks: requests - requests.models: requests - requests.packages: requests - requests.sessions: requests - requests.status_codes: requests - requests.structures: requests - requests.utils: requests setuptools: setuptools - setuptools.archive_util: setuptools - setuptools.build_meta: setuptools - setuptools.command: setuptools - setuptools.command.alias: setuptools - setuptools.command.bdist_egg: setuptools - setuptools.command.bdist_rpm: setuptools - setuptools.command.build: setuptools - setuptools.command.build_clib: setuptools - setuptools.command.build_ext: setuptools - setuptools.command.build_py: setuptools - setuptools.command.develop: setuptools - setuptools.command.dist_info: setuptools - setuptools.command.easy_install: setuptools - setuptools.command.editable_wheel: setuptools - setuptools.command.egg_info: setuptools - setuptools.command.install: setuptools - setuptools.command.install_egg_info: setuptools - setuptools.command.install_lib: setuptools - setuptools.command.install_scripts: setuptools - setuptools.command.py36compat: setuptools - setuptools.command.register: setuptools - setuptools.command.rotate: setuptools - setuptools.command.saveopts: setuptools - setuptools.command.sdist: setuptools - setuptools.command.setopt: setuptools - setuptools.command.test: setuptools - setuptools.command.upload: setuptools - setuptools.command.upload_docs: setuptools - setuptools.config: setuptools - setuptools.config.expand: setuptools - setuptools.config.pyprojecttoml: setuptools - setuptools.config.setupcfg: setuptools - setuptools.dep_util: setuptools - setuptools.depends: setuptools - setuptools.discovery: setuptools - setuptools.dist: setuptools - setuptools.errors: setuptools - setuptools.extension: setuptools - setuptools.extern: setuptools - setuptools.glob: setuptools - setuptools.installer: setuptools - setuptools.launch: setuptools - setuptools.logging: setuptools - setuptools.monkey: setuptools - setuptools.msvc: setuptools - setuptools.namespaces: setuptools - setuptools.package_index: setuptools - setuptools.py34compat: setuptools - setuptools.sandbox: setuptools - setuptools.unicode_utils: setuptools - setuptools.version: setuptools - setuptools.wheel: setuptools - setuptools.windows_support: setuptools six: six tabulate: tabulate - tabulate.version: tabulate tomli: tomli tomlkit: tomlkit - tomlkit.api: tomlkit - tomlkit.container: tomlkit - tomlkit.exceptions: tomlkit - tomlkit.items: tomlkit - tomlkit.parser: tomlkit - tomlkit.source: tomlkit - tomlkit.toml_char: tomlkit - tomlkit.toml_document: tomlkit - tomlkit.toml_file: tomlkit typing_extensions: typing_extensions urllib3: urllib3 - urllib3.connection: urllib3 - urllib3.connectionpool: urllib3 - urllib3.contrib: urllib3 - urllib3.contrib.appengine: urllib3 - urllib3.contrib.ntlmpool: urllib3 - urllib3.contrib.pyopenssl: urllib3 - urllib3.contrib.securetransport: urllib3 - urllib3.contrib.socks: urllib3 - urllib3.exceptions: urllib3 - urllib3.fields: urllib3 - urllib3.filepost: urllib3 - urllib3.packages: urllib3 - urllib3.packages.backports: urllib3 - urllib3.packages.backports.makefile: urllib3 - urllib3.packages.six: urllib3 - urllib3.poolmanager: urllib3 - urllib3.request: urllib3 - urllib3.response: urllib3 - urllib3.util: urllib3 - urllib3.util.connection: urllib3 - urllib3.util.proxy: urllib3 - urllib3.util.queue: urllib3 - urllib3.util.request: urllib3 - urllib3.util.response: urllib3 - urllib3.util.retry: urllib3 - urllib3.util.ssl_: urllib3 - urllib3.util.ssl_match_hostname: urllib3 - urllib3.util.ssltransport: urllib3 - urllib3.util.timeout: urllib3 - urllib3.util.url: urllib3 - urllib3.util.wait: urllib3 wrapt: wrapt - wrapt.arguments: wrapt - wrapt.decorators: wrapt - wrapt.importer: wrapt - wrapt.wrappers: wrapt yaml: PyYAML - yaml.composer: PyYAML - yaml.constructor: PyYAML - yaml.cyaml: PyYAML - yaml.dumper: PyYAML - yaml.emitter: PyYAML - yaml.error: PyYAML - yaml.events: PyYAML - yaml.loader: PyYAML - yaml.nodes: PyYAML - yaml.parser: PyYAML - yaml.reader: PyYAML - yaml.representer: PyYAML - yaml.resolver: PyYAML - yaml.scanner: PyYAML - yaml.serializer: PyYAML - yaml.tokens: PyYAML yamllint: yamllint - yamllint.cli: yamllint - yamllint.config: yamllint - yamllint.linter: yamllint - yamllint.parser: yamllint - yamllint.rules: yamllint - yamllint.rules.braces: yamllint - yamllint.rules.brackets: yamllint - yamllint.rules.colons: yamllint - yamllint.rules.commas: yamllint - yamllint.rules.comments: yamllint - yamllint.rules.comments_indentation: yamllint - yamllint.rules.common: yamllint - yamllint.rules.document_end: yamllint - yamllint.rules.document_start: yamllint - yamllint.rules.empty_lines: yamllint - yamllint.rules.empty_values: yamllint - yamllint.rules.float_values: yamllint - yamllint.rules.hyphens: yamllint - yamllint.rules.indentation: yamllint - yamllint.rules.key_duplicates: yamllint - yamllint.rules.key_ordering: yamllint - yamllint.rules.line_length: yamllint - yamllint.rules.new_line_at_end_of_file: yamllint - yamllint.rules.new_lines: yamllint - yamllint.rules.octal_values: yamllint - yamllint.rules.quoted_strings: yamllint - yamllint.rules.trailing_spaces: yamllint - yamllint.rules.truthy: yamllint pip_repository: name: pip diff --git a/gazelle/manifest/manifest_test.go b/gazelle/manifest/manifest_test.go index 2749733704..e80c7fcccc 100644 --- a/gazelle/manifest/manifest_test.go +++ b/gazelle/manifest/manifest_test.go @@ -26,15 +26,7 @@ import ( ) var modulesMapping = manifest.ModulesMapping{ - "arrow": "arrow", - "arrow.__init__": "arrow", - "arrow.api": "arrow", - "arrow.arrow": "arrow", - "arrow.factory": "arrow", - "arrow.formatter": "arrow", - "arrow.locales": "arrow", - "arrow.parser": "arrow", - "arrow.util": "arrow", + "arrow": "arrow", } const pipDepsRepositoryName = "test_repository_name" diff --git a/gazelle/manifest/testdata/gazelle_python.yaml b/gazelle/manifest/testdata/gazelle_python.yaml index 70f7aff19a..1f3e03dc37 100644 --- a/gazelle/manifest/testdata/gazelle_python.yaml +++ b/gazelle/manifest/testdata/gazelle_python.yaml @@ -1,13 +1,5 @@ manifest: modules_mapping: arrow: arrow - arrow.__init__: arrow - arrow.api: arrow - arrow.arrow: arrow - arrow.factory: arrow - arrow.formatter: arrow - arrow.locales: arrow - arrow.parser: arrow - arrow.util: arrow pip_deps_repository_name: test_repository_name -integrity: eedf187f8b7ec27cdfc682feee4206e063b51d13d78f77c05d3a30ec11bd7411 +integrity: 96be4e5a31aa39b52e2591c00ffd9265c5a96ece99a7687c21ff7732a38da6dc diff --git a/gazelle/modules_mapping/generator.py b/gazelle/modules_mapping/generator.py index be57eac3bc..bbd579d416 100644 --- a/gazelle/modules_mapping/generator.py +++ b/gazelle/modules_mapping/generator.py @@ -45,6 +45,23 @@ def dig_wheel(self, whl): else: self.module_for_path(path, whl) + def simplify(self): + simplified = {} + for module, wheel_name in sorted(self.mapping.items(), key=lambda x: x[0]): + mod = module + while True: + if mod in simplified: + if simplified[mod] != wheel_name: + break + wheel_name = "" + break + if mod.count(".") == 0: + break + mod = mod.rsplit(".", 1)[0] + if wheel_name: + simplified[module] = wheel_name + self.mapping = simplified + def module_for_path(self, path, whl): ext = pathlib.Path(path).suffix if ext == ".py" or ext == ".so": @@ -70,7 +87,8 @@ def module_for_path(self, path, whl): ext = "".join(pathlib.Path(root).suffixes) module = root[: -len(ext)].replace("/", ".") if not self.is_excluded(module): - self.mapping[module] = wheel_name + if not self.is_excluded(module): + self.mapping[module] = wheel_name def is_excluded(self, module): for pattern in self.excluded_patterns: @@ -86,6 +104,7 @@ def run(self, wheels): except AssertionError as error: print(error, file=self.stderr) return 1 + self.simplify() mapping_json = json.dumps(self.mapping) with open(self.output_file, "w") as f: f.write(mapping_json) diff --git a/gazelle/python/testdata/different_packages_in_same_namespace/BUILD.in b/gazelle/python/testdata/different_packages_in_same_namespace/BUILD.in new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/different_packages_in_same_namespace/BUILD.out b/gazelle/python/testdata/different_packages_in_same_namespace/BUILD.out new file mode 100644 index 0000000000..2ee0b532c6 --- /dev/null +++ b/gazelle/python/testdata/different_packages_in_same_namespace/BUILD.out @@ -0,0 +1,18 @@ +load("@rules_python//python:defs.bzl", "py_binary", "py_library") + +py_library( + name = "different_packages_in_same_namespace", + srcs = ["__init__.py"], + visibility = ["//:__subpackages__"], +) + +py_binary( + name = "different_packages_in_same_namespace_bin", + srcs = ["__main__.py"], + main = "__main__.py", + visibility = ["//:__subpackages__"], + deps = [ + "@gazelle_python_test//arrow", + "@gazelle_python_test//arrow_plugin", + ], +) diff --git a/gazelle/python/testdata/different_packages_in_same_namespace/README.md b/gazelle/python/testdata/different_packages_in_same_namespace/README.md new file mode 100644 index 0000000000..dcaebb7923 --- /dev/null +++ b/gazelle/python/testdata/different_packages_in_same_namespace/README.md @@ -0,0 +1,4 @@ +# Different Packages in Same Namespace + +This test case asserts that +importing `arrow.plugin` correctly adds arrow_plugin to the deps. \ No newline at end of file diff --git a/gazelle/python/testdata/different_packages_in_same_namespace/WORKSPACE b/gazelle/python/testdata/different_packages_in_same_namespace/WORKSPACE new file mode 100644 index 0000000000..faff6af87a --- /dev/null +++ b/gazelle/python/testdata/different_packages_in_same_namespace/WORKSPACE @@ -0,0 +1 @@ +# This is a Bazel workspace for the Gazelle test data. diff --git a/gazelle/python/testdata/different_packages_in_same_namespace/__init__.py b/gazelle/python/testdata/different_packages_in_same_namespace/__init__.py new file mode 100644 index 0000000000..730755995d --- /dev/null +++ b/gazelle/python/testdata/different_packages_in_same_namespace/__init__.py @@ -0,0 +1,15 @@ +# 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. + +# For test purposes only. diff --git a/gazelle/python/testdata/different_packages_in_same_namespace/__main__.py b/gazelle/python/testdata/different_packages_in_same_namespace/__main__.py new file mode 100644 index 0000000000..e378628026 --- /dev/null +++ b/gazelle/python/testdata/different_packages_in_same_namespace/__main__.py @@ -0,0 +1,16 @@ +# 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. + +import arrow +import arrow.plugin diff --git a/gazelle/python/testdata/different_packages_in_same_namespace/gazelle_python.yaml b/gazelle/python/testdata/different_packages_in_same_namespace/gazelle_python.yaml new file mode 100644 index 0000000000..a2ef070a72 --- /dev/null +++ b/gazelle/python/testdata/different_packages_in_same_namespace/gazelle_python.yaml @@ -0,0 +1,19 @@ +# 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. + +manifest: + modules_mapping: + arrow: arrow + arrow.plugin: arrow_plugin + pip_deps_repository_name: gazelle_python_test diff --git a/gazelle/python/testdata/different_packages_in_same_namespace/test.yaml b/gazelle/python/testdata/different_packages_in_same_namespace/test.yaml new file mode 100644 index 0000000000..fcea77710f --- /dev/null +++ b/gazelle/python/testdata/different_packages_in_same_namespace/test.yaml @@ -0,0 +1,15 @@ +# 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. + +--- diff --git a/gazelle/python/testdata/with_third_party_requirements_from_imports/gazelle_python.yaml b/gazelle/python/testdata/with_third_party_requirements_from_imports/gazelle_python.yaml index 8b5694b2d7..d3ce6ee243 100644 --- a/gazelle/python/testdata/with_third_party_requirements_from_imports/gazelle_python.yaml +++ b/gazelle/python/testdata/with_third_party_requirements_from_imports/gazelle_python.yaml @@ -15,1511 +15,49 @@ manifest: modules_mapping: cachetools: cachetools - cachetools.__init__: cachetools - cachetools.func: cachetools - cachetools.keys: cachetools certifi: certifi - certifi.__init__: certifi - certifi.__main__: certifi - certifi.core: certifi charset_normalizer: charset_normalizer - charset_normalizer.__init__: charset_normalizer - charset_normalizer.api: charset_normalizer - charset_normalizer.assets: charset_normalizer - charset_normalizer.assets.__init__: charset_normalizer - charset_normalizer.cd: charset_normalizer - charset_normalizer.cli: charset_normalizer - charset_normalizer.cli.__init__: charset_normalizer - charset_normalizer.cli.normalizer: charset_normalizer - charset_normalizer.constant: charset_normalizer - charset_normalizer.legacy: charset_normalizer - charset_normalizer.md: charset_normalizer - charset_normalizer.models: charset_normalizer - charset_normalizer.utils: charset_normalizer - charset_normalizer.version: charset_normalizer dateutil: python_dateutil - dateutil.__init__: python_dateutil - dateutil._common: python_dateutil - dateutil._version: python_dateutil - dateutil.easter: python_dateutil - dateutil.parser: python_dateutil - dateutil.parser.__init__: python_dateutil - dateutil.parser._parser: python_dateutil - dateutil.parser.isoparser: python_dateutil - dateutil.relativedelta: python_dateutil - dateutil.rrule: python_dateutil - dateutil.tz: python_dateutil - dateutil.tz.__init__: python_dateutil - dateutil.tz._common: python_dateutil - dateutil.tz._factories: python_dateutil - dateutil.tz.tz: python_dateutil - dateutil.tz.win: python_dateutil - dateutil.tzwin: python_dateutil - dateutil.utils: python_dateutil - dateutil.zoneinfo: python_dateutil - dateutil.zoneinfo.__init__: python_dateutil - dateutil.zoneinfo.rebuild: python_dateutil docs.conf: google_cloud_resource_manager - google._async_resumable_media: google_resumable_media - google._async_resumable_media.__init__: google_resumable_media - google._async_resumable_media._download: google_resumable_media - google._async_resumable_media._helpers: google_resumable_media - google._async_resumable_media._upload: google_resumable_media - google._async_resumable_media.requests: google_resumable_media - google._async_resumable_media.requests.__init__: google_resumable_media - google._async_resumable_media.requests._request_helpers: google_resumable_media - google._async_resumable_media.requests.download: google_resumable_media - google._async_resumable_media.requests.upload: google_resumable_media google.api: googleapis_common_protos - google.api.__init__: googleapis_common_protos - google.api.annotations_pb2: googleapis_common_protos - google.api.auth_pb2: googleapis_common_protos - google.api.backend_pb2: googleapis_common_protos - google.api.billing_pb2: googleapis_common_protos - google.api.client_pb2: googleapis_common_protos - google.api.config_change_pb2: googleapis_common_protos - google.api.consumer_pb2: googleapis_common_protos - google.api.context_pb2: googleapis_common_protos - google.api.control_pb2: googleapis_common_protos - google.api.distribution_pb2: googleapis_common_protos - google.api.documentation_pb2: googleapis_common_protos - google.api.endpoint_pb2: googleapis_common_protos - google.api.error_reason_pb2: googleapis_common_protos - google.api.field_behavior_pb2: googleapis_common_protos - google.api.http_pb2: googleapis_common_protos - google.api.httpbody_pb2: googleapis_common_protos - google.api.label_pb2: googleapis_common_protos - google.api.launch_stage_pb2: googleapis_common_protos - google.api.log_pb2: googleapis_common_protos - google.api.logging_pb2: googleapis_common_protos - google.api.metric_pb2: googleapis_common_protos - google.api.monitored_resource_pb2: googleapis_common_protos - google.api.monitoring_pb2: googleapis_common_protos - google.api.quota_pb2: googleapis_common_protos - google.api.resource_pb2: googleapis_common_protos - google.api.routing_pb2: googleapis_common_protos - google.api.service_pb2: googleapis_common_protos - google.api.source_info_pb2: googleapis_common_protos - google.api.system_parameter_pb2: googleapis_common_protos - google.api.usage_pb2: googleapis_common_protos - google.api.visibility_pb2: googleapis_common_protos google.api_core: google_api_core - google.api_core.__init__: google_api_core - google.api_core.bidi: google_api_core - google.api_core.client_info: google_api_core - google.api_core.client_options: google_api_core - google.api_core.datetime_helpers: google_api_core - google.api_core.exceptions: google_api_core - google.api_core.extended_operation: google_api_core - google.api_core.future: google_api_core - google.api_core.future.__init__: google_api_core - google.api_core.future._helpers: google_api_core - google.api_core.future.async_future: google_api_core - google.api_core.future.base: google_api_core - google.api_core.future.polling: google_api_core - google.api_core.gapic_v1: google_api_core - google.api_core.gapic_v1.__init__: google_api_core - google.api_core.gapic_v1.client_info: google_api_core - google.api_core.gapic_v1.config: google_api_core - google.api_core.gapic_v1.config_async: google_api_core - google.api_core.gapic_v1.method: google_api_core - google.api_core.gapic_v1.method_async: google_api_core - google.api_core.gapic_v1.routing_header: google_api_core - google.api_core.general_helpers: google_api_core - google.api_core.grpc_helpers: google_api_core - google.api_core.grpc_helpers_async: google_api_core - google.api_core.iam: google_api_core - google.api_core.operation: google_api_core - google.api_core.operation_async: google_api_core - google.api_core.operations_v1: google_api_core - google.api_core.operations_v1.__init__: google_api_core - google.api_core.operations_v1.abstract_operations_client: google_api_core - google.api_core.operations_v1.operations_async_client: google_api_core - google.api_core.operations_v1.operations_client: google_api_core - google.api_core.operations_v1.operations_client_config: google_api_core - google.api_core.operations_v1.pagers: google_api_core - google.api_core.operations_v1.transports: google_api_core - google.api_core.operations_v1.transports.__init__: google_api_core - google.api_core.operations_v1.transports.base: google_api_core - google.api_core.operations_v1.transports.rest: google_api_core - google.api_core.page_iterator: google_api_core - google.api_core.page_iterator_async: google_api_core - google.api_core.path_template: google_api_core - google.api_core.protobuf_helpers: google_api_core - google.api_core.rest_helpers: google_api_core - google.api_core.rest_streaming: google_api_core - google.api_core.retry: google_api_core - google.api_core.retry_async: google_api_core - google.api_core.timeout: google_api_core - google.api_core.version: google_api_core google.auth: google_auth - google.auth.__init__: google_auth - google.auth._cloud_sdk: google_auth - google.auth._credentials_async: google_auth - google.auth._default: google_auth - google.auth._default_async: google_auth - google.auth._helpers: google_auth - google.auth._jwt_async: google_auth - google.auth._oauth2client: google_auth - google.auth._service_account_info: google_auth - google.auth.app_engine: google_auth - google.auth.aws: google_auth - google.auth.compute_engine: google_auth - google.auth.compute_engine.__init__: google_auth - google.auth.compute_engine._metadata: google_auth - google.auth.compute_engine.credentials: google_auth - google.auth.credentials: google_auth - google.auth.crypt: google_auth - google.auth.crypt.__init__: google_auth - google.auth.crypt._cryptography_rsa: google_auth - google.auth.crypt._helpers: google_auth - google.auth.crypt._python_rsa: google_auth - google.auth.crypt.base: google_auth - google.auth.crypt.es256: google_auth - google.auth.crypt.rsa: google_auth - google.auth.downscoped: google_auth - google.auth.environment_vars: google_auth - google.auth.exceptions: google_auth - google.auth.external_account: google_auth - google.auth.iam: google_auth - google.auth.identity_pool: google_auth - google.auth.impersonated_credentials: google_auth - google.auth.jwt: google_auth - google.auth.transport: google_auth - google.auth.transport.__init__: google_auth - google.auth.transport._aiohttp_requests: google_auth - google.auth.transport._http_client: google_auth - google.auth.transport._mtls_helper: google_auth - google.auth.transport.grpc: google_auth - google.auth.transport.mtls: google_auth - google.auth.transport.requests: google_auth - google.auth.transport.urllib3: google_auth - google.auth.version: google_auth - google.cloud._helpers: google_cloud_core - google.cloud._helpers.__init__: google_cloud_core - google.cloud._http: google_cloud_core - google.cloud._http.__init__: google_cloud_core - google.cloud._testing: google_cloud_core - google.cloud._testing.__init__: google_cloud_core google.cloud.aiplatform: google_cloud_aiplatform - google.cloud.aiplatform.__init__: google_cloud_aiplatform - google.cloud.aiplatform._matching_engine: google_cloud_aiplatform - google.cloud.aiplatform._matching_engine.__init__: google_cloud_aiplatform - google.cloud.aiplatform._matching_engine.match_service_pb2: google_cloud_aiplatform - google.cloud.aiplatform._matching_engine.match_service_pb2_grpc: google_cloud_aiplatform - google.cloud.aiplatform._matching_engine.matching_engine_index: google_cloud_aiplatform - google.cloud.aiplatform._matching_engine.matching_engine_index_config: google_cloud_aiplatform - google.cloud.aiplatform._matching_engine.matching_engine_index_endpoint: google_cloud_aiplatform - google.cloud.aiplatform.base: google_cloud_aiplatform - google.cloud.aiplatform.compat: google_cloud_aiplatform - google.cloud.aiplatform.compat.__init__: google_cloud_aiplatform - google.cloud.aiplatform.compat.services: google_cloud_aiplatform - google.cloud.aiplatform.compat.services.__init__: google_cloud_aiplatform - google.cloud.aiplatform.compat.types: google_cloud_aiplatform - google.cloud.aiplatform.compat.types.__init__: google_cloud_aiplatform - google.cloud.aiplatform.constants: google_cloud_aiplatform - google.cloud.aiplatform.constants.__init__: google_cloud_aiplatform - google.cloud.aiplatform.constants.base: google_cloud_aiplatform - google.cloud.aiplatform.constants.prediction: google_cloud_aiplatform - google.cloud.aiplatform.datasets: google_cloud_aiplatform - google.cloud.aiplatform.datasets.__init__: google_cloud_aiplatform - google.cloud.aiplatform.datasets._datasources: google_cloud_aiplatform - google.cloud.aiplatform.datasets.column_names_dataset: google_cloud_aiplatform - google.cloud.aiplatform.datasets.dataset: google_cloud_aiplatform - google.cloud.aiplatform.datasets.image_dataset: google_cloud_aiplatform - google.cloud.aiplatform.datasets.tabular_dataset: google_cloud_aiplatform - google.cloud.aiplatform.datasets.text_dataset: google_cloud_aiplatform - google.cloud.aiplatform.datasets.time_series_dataset: google_cloud_aiplatform - google.cloud.aiplatform.datasets.video_dataset: google_cloud_aiplatform - google.cloud.aiplatform.explain: google_cloud_aiplatform - google.cloud.aiplatform.explain.__init__: google_cloud_aiplatform - google.cloud.aiplatform.explain.lit: google_cloud_aiplatform - google.cloud.aiplatform.explain.metadata: google_cloud_aiplatform - google.cloud.aiplatform.explain.metadata.__init__: google_cloud_aiplatform - google.cloud.aiplatform.explain.metadata.metadata_builder: google_cloud_aiplatform - google.cloud.aiplatform.explain.metadata.tf: google_cloud_aiplatform - google.cloud.aiplatform.explain.metadata.tf.__init__: google_cloud_aiplatform - google.cloud.aiplatform.explain.metadata.tf.v1: google_cloud_aiplatform - google.cloud.aiplatform.explain.metadata.tf.v1.__init__: google_cloud_aiplatform - google.cloud.aiplatform.explain.metadata.tf.v1.saved_model_metadata_builder: google_cloud_aiplatform - google.cloud.aiplatform.explain.metadata.tf.v2: google_cloud_aiplatform - google.cloud.aiplatform.explain.metadata.tf.v2.__init__: google_cloud_aiplatform - google.cloud.aiplatform.explain.metadata.tf.v2.saved_model_metadata_builder: google_cloud_aiplatform - google.cloud.aiplatform.featurestore: google_cloud_aiplatform - google.cloud.aiplatform.featurestore.__init__: google_cloud_aiplatform - google.cloud.aiplatform.featurestore.entity_type: google_cloud_aiplatform - google.cloud.aiplatform.featurestore.feature: google_cloud_aiplatform - google.cloud.aiplatform.featurestore.featurestore: google_cloud_aiplatform - google.cloud.aiplatform.gapic: google_cloud_aiplatform - google.cloud.aiplatform.gapic.__init__: google_cloud_aiplatform - google.cloud.aiplatform.gapic.schema: google_cloud_aiplatform - google.cloud.aiplatform.gapic.schema.__init__: google_cloud_aiplatform - google.cloud.aiplatform.helpers: google_cloud_aiplatform - google.cloud.aiplatform.helpers.__init__: google_cloud_aiplatform - google.cloud.aiplatform.helpers.container_uri_builders: google_cloud_aiplatform - google.cloud.aiplatform.hyperparameter_tuning: google_cloud_aiplatform - google.cloud.aiplatform.initializer: google_cloud_aiplatform - google.cloud.aiplatform.jobs: google_cloud_aiplatform - google.cloud.aiplatform.metadata: google_cloud_aiplatform - google.cloud.aiplatform.metadata.__init__: google_cloud_aiplatform - google.cloud.aiplatform.metadata.artifact: google_cloud_aiplatform - google.cloud.aiplatform.metadata.constants: google_cloud_aiplatform - google.cloud.aiplatform.metadata.context: google_cloud_aiplatform - google.cloud.aiplatform.metadata.execution: google_cloud_aiplatform - google.cloud.aiplatform.metadata.metadata: google_cloud_aiplatform - google.cloud.aiplatform.metadata.metadata_store: google_cloud_aiplatform - google.cloud.aiplatform.metadata.resource: google_cloud_aiplatform - google.cloud.aiplatform.model_evaluation: google_cloud_aiplatform - google.cloud.aiplatform.model_evaluation.__init__: google_cloud_aiplatform - google.cloud.aiplatform.model_evaluation.model_evaluation: google_cloud_aiplatform - google.cloud.aiplatform.models: google_cloud_aiplatform - google.cloud.aiplatform.pipeline_jobs: google_cloud_aiplatform - google.cloud.aiplatform.schema: google_cloud_aiplatform - google.cloud.aiplatform.tensorboard: google_cloud_aiplatform - google.cloud.aiplatform.tensorboard.__init__: google_cloud_aiplatform - google.cloud.aiplatform.tensorboard.plugins.tf_profiler.profile_uploader: google_cloud_aiplatform - google.cloud.aiplatform.tensorboard.tensorboard_resource: google_cloud_aiplatform - google.cloud.aiplatform.tensorboard.uploader: google_cloud_aiplatform - google.cloud.aiplatform.tensorboard.uploader_main: google_cloud_aiplatform - google.cloud.aiplatform.tensorboard.uploader_utils: google_cloud_aiplatform - google.cloud.aiplatform.training_jobs: google_cloud_aiplatform - google.cloud.aiplatform.training_utils: google_cloud_aiplatform - google.cloud.aiplatform.training_utils.__init__: google_cloud_aiplatform - google.cloud.aiplatform.training_utils.cloud_profiler: google_cloud_aiplatform - google.cloud.aiplatform.training_utils.cloud_profiler.__init__: google_cloud_aiplatform - google.cloud.aiplatform.training_utils.cloud_profiler.cloud_profiler_utils: google_cloud_aiplatform - google.cloud.aiplatform.training_utils.cloud_profiler.initializer: google_cloud_aiplatform - google.cloud.aiplatform.training_utils.cloud_profiler.plugins.base_plugin: google_cloud_aiplatform - google.cloud.aiplatform.training_utils.cloud_profiler.plugins.tensorflow.tensorboard_api: google_cloud_aiplatform - google.cloud.aiplatform.training_utils.cloud_profiler.plugins.tensorflow.tf_profiler: google_cloud_aiplatform - google.cloud.aiplatform.training_utils.cloud_profiler.webserver: google_cloud_aiplatform - google.cloud.aiplatform.training_utils.cloud_profiler.wsgi_types: google_cloud_aiplatform - google.cloud.aiplatform.training_utils.environment_variables: google_cloud_aiplatform - google.cloud.aiplatform.utils: google_cloud_aiplatform - google.cloud.aiplatform.utils.__init__: google_cloud_aiplatform - google.cloud.aiplatform.utils.column_transformations_utils: google_cloud_aiplatform - google.cloud.aiplatform.utils.console_utils: google_cloud_aiplatform - google.cloud.aiplatform.utils.enhanced_library: google_cloud_aiplatform - google.cloud.aiplatform.utils.enhanced_library.__init__: google_cloud_aiplatform - google.cloud.aiplatform.utils.enhanced_library._decorators: google_cloud_aiplatform - google.cloud.aiplatform.utils.enhanced_library.value_converter: google_cloud_aiplatform - google.cloud.aiplatform.utils.featurestore_utils: google_cloud_aiplatform - google.cloud.aiplatform.utils.gcs_utils: google_cloud_aiplatform - google.cloud.aiplatform.utils.pipeline_utils: google_cloud_aiplatform - google.cloud.aiplatform.utils.resource_manager_utils: google_cloud_aiplatform - google.cloud.aiplatform.utils.source_utils: google_cloud_aiplatform - google.cloud.aiplatform.utils.tensorboard_utils: google_cloud_aiplatform - google.cloud.aiplatform.utils.worker_spec_utils: google_cloud_aiplatform - google.cloud.aiplatform.utils.yaml_utils: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.instance: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.instance.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.instance_v1: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.instance_v1.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.instance_v1.types: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.instance_v1.types.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.instance_v1.types.image_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.instance_v1.types.image_object_detection: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.instance_v1.types.image_segmentation: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.instance_v1.types.text_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.instance_v1.types.text_extraction: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.instance_v1.types.text_sentiment: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.instance_v1.types.video_action_recognition: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.instance_v1.types.video_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.instance_v1.types.video_object_tracking: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.params: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.params.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.params_v1: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.params_v1.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.params_v1.types: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.params_v1.types.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.params_v1.types.image_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.params_v1.types.image_object_detection: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.params_v1.types.image_segmentation: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.params_v1.types.video_action_recognition: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.params_v1.types.video_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.params_v1.types.video_object_tracking: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.prediction: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.prediction.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.prediction_v1: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.prediction_v1.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.prediction_v1.types: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.prediction_v1.types.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.prediction_v1.types.classification: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.prediction_v1.types.image_object_detection: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.prediction_v1.types.image_segmentation: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.prediction_v1.types.tabular_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.prediction_v1.types.tabular_regression: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.prediction_v1.types.text_extraction: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.prediction_v1.types.text_sentiment: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.prediction_v1.types.video_action_recognition: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.prediction_v1.types.video_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.predict.prediction_v1.types.video_object_tracking: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.definition: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.definition.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.definition_v1: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.definition_v1.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.definition_v1.types: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.definition_v1.types.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.definition_v1.types.automl_image_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.definition_v1.types.automl_image_object_detection: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.definition_v1.types.automl_image_segmentation: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.definition_v1.types.automl_tables: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.definition_v1.types.automl_text_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.definition_v1.types.automl_text_extraction: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.definition_v1.types.automl_text_sentiment: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.definition_v1.types.automl_video_action_recognition: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.definition_v1.types.automl_video_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.definition_v1.types.automl_video_object_tracking: google_cloud_aiplatform - google.cloud.aiplatform.v1.schema.trainingjob.definition_v1.types.export_evaluated_data_items_config: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.instance: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.instance.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.instance_v1beta1: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.instance_v1beta1.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.instance_v1beta1.types: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.instance_v1beta1.types.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.instance_v1beta1.types.image_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.instance_v1beta1.types.image_object_detection: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.instance_v1beta1.types.image_segmentation: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.instance_v1beta1.types.text_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.instance_v1beta1.types.text_extraction: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.instance_v1beta1.types.text_sentiment: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.instance_v1beta1.types.video_action_recognition: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.instance_v1beta1.types.video_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.instance_v1beta1.types.video_object_tracking: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.params: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.params.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.params_v1beta1: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.params_v1beta1.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.params_v1beta1.types: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.params_v1beta1.types.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.params_v1beta1.types.image_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.params_v1beta1.types.image_object_detection: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.params_v1beta1.types.image_segmentation: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.params_v1beta1.types.video_action_recognition: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.params_v1beta1.types.video_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.params_v1beta1.types.video_object_tracking: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.prediction: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.prediction.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.prediction_v1beta1: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.prediction_v1beta1.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.prediction_v1beta1.types: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.prediction_v1beta1.types.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.prediction_v1beta1.types.classification: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.prediction_v1beta1.types.image_object_detection: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.prediction_v1beta1.types.image_segmentation: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.prediction_v1beta1.types.tabular_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.prediction_v1beta1.types.tabular_regression: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.prediction_v1beta1.types.text_extraction: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.prediction_v1beta1.types.text_sentiment: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.prediction_v1beta1.types.time_series_forecasting: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.prediction_v1beta1.types.video_action_recognition: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.prediction_v1beta1.types.video_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.predict.prediction_v1beta1.types.video_object_tracking: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition_v1beta1: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition_v1beta1.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition_v1beta1.types: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition_v1beta1.types.__init__: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition_v1beta1.types.automl_forecasting: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition_v1beta1.types.automl_image_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition_v1beta1.types.automl_image_object_detection: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition_v1beta1.types.automl_image_segmentation: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition_v1beta1.types.automl_tables: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition_v1beta1.types.automl_text_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition_v1beta1.types.automl_text_extraction: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition_v1beta1.types.automl_text_sentiment: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition_v1beta1.types.automl_time_series_forecasting: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition_v1beta1.types.automl_video_action_recognition: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition_v1beta1.types.automl_video_classification: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition_v1beta1.types.automl_video_object_tracking: google_cloud_aiplatform - google.cloud.aiplatform.v1beta1.schema.trainingjob.definition_v1beta1.types.export_evaluated_data_items_config: google_cloud_aiplatform - google.cloud.aiplatform.version: google_cloud_aiplatform google.cloud.aiplatform_v1: google_cloud_aiplatform - google.cloud.aiplatform_v1.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.dataset_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.dataset_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.dataset_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.dataset_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.dataset_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.dataset_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.dataset_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.dataset_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.dataset_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.dataset_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.endpoint_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.endpoint_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.endpoint_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.endpoint_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.endpoint_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.endpoint_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.endpoint_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.endpoint_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.endpoint_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.endpoint_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_online_serving_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_online_serving_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_online_serving_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_online_serving_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_online_serving_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_online_serving_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_online_serving_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_online_serving_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_online_serving_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.featurestore_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_endpoint_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_endpoint_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_endpoint_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_endpoint_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_endpoint_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_endpoint_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_endpoint_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_endpoint_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_endpoint_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_endpoint_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.index_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.job_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.job_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.job_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.job_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.job_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.job_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.job_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.job_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.job_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.job_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.metadata_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.metadata_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.metadata_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.metadata_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.metadata_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.metadata_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.metadata_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.metadata_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.metadata_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.metadata_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.migration_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.migration_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.migration_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.migration_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.migration_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.migration_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.migration_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.migration_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.migration_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.migration_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.model_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.model_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.model_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.model_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.model_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.model_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.model_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.model_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.model_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.model_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.pipeline_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.pipeline_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.pipeline_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.pipeline_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.pipeline_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.pipeline_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.pipeline_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.pipeline_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.pipeline_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.pipeline_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.prediction_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.prediction_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.prediction_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.prediction_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.prediction_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.prediction_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.prediction_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.prediction_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.prediction_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.specialist_pool_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.specialist_pool_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.specialist_pool_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.specialist_pool_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.specialist_pool_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.specialist_pool_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.specialist_pool_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.specialist_pool_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.specialist_pool_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.specialist_pool_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.tensorboard_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.tensorboard_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.tensorboard_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.tensorboard_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.tensorboard_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.tensorboard_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.tensorboard_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.tensorboard_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.tensorboard_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.tensorboard_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.vizier_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.vizier_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.vizier_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.vizier_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.vizier_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.vizier_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.vizier_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.vizier_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.vizier_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1.services.vizier_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1.types: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.accelerator_type: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.annotation: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.annotation_spec: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.artifact: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.batch_prediction_job: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.completion_stats: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.context: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.custom_job: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.data_item: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.data_labeling_job: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.dataset: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.dataset_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.deployed_index_ref: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.deployed_model_ref: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.encryption_spec: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.endpoint: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.endpoint_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.entity_type: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.env_var: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.event: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.execution: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.explanation: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.explanation_metadata: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.feature: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.feature_monitoring_stats: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.feature_selector: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.featurestore: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.featurestore_monitoring: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.featurestore_online_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.featurestore_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.hyperparameter_tuning_job: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.index: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.index_endpoint: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.index_endpoint_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.index_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.io: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.job_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.job_state: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.lineage_subgraph: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.machine_resources: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.manual_batch_tuning_parameters: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.metadata_schema: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.metadata_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.metadata_store: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.migratable_resource: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.migration_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.model: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.model_deployment_monitoring_job: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.model_evaluation: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.model_evaluation_slice: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.model_monitoring: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.model_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.operation: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.pipeline_job: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.pipeline_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.pipeline_state: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.prediction_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.specialist_pool: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.specialist_pool_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.study: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.tensorboard: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.tensorboard_data: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.tensorboard_experiment: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.tensorboard_run: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.tensorboard_service: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.tensorboard_time_series: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.training_pipeline: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.types: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.unmanaged_container_model: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.user_action_reference: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.value: google_cloud_aiplatform - google.cloud.aiplatform_v1.types.vizier_service: google_cloud_aiplatform google.cloud.aiplatform_v1beta1: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.dataset_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.dataset_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.dataset_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.dataset_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.dataset_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.dataset_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.dataset_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.dataset_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.dataset_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.dataset_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.endpoint_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.endpoint_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.endpoint_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.endpoint_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.endpoint_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.endpoint_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.endpoint_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.endpoint_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.endpoint_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.endpoint_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_online_serving_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_online_serving_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_online_serving_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_online_serving_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_online_serving_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_online_serving_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_online_serving_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_online_serving_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_online_serving_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.featurestore_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_endpoint_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_endpoint_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_endpoint_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_endpoint_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_endpoint_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_endpoint_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_endpoint_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_endpoint_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_endpoint_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_endpoint_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.index_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.job_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.job_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.job_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.job_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.job_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.job_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.job_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.job_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.job_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.job_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.metadata_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.metadata_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.metadata_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.metadata_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.metadata_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.metadata_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.metadata_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.metadata_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.metadata_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.metadata_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.migration_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.migration_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.migration_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.migration_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.migration_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.migration_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.migration_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.migration_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.migration_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.migration_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.model_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.model_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.model_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.model_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.model_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.model_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.model_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.model_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.model_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.model_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.pipeline_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.pipeline_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.pipeline_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.pipeline_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.pipeline_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.pipeline_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.pipeline_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.pipeline_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.pipeline_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.pipeline_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.prediction_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.prediction_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.prediction_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.prediction_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.prediction_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.prediction_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.prediction_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.prediction_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.prediction_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.specialist_pool_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.specialist_pool_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.specialist_pool_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.specialist_pool_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.specialist_pool_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.specialist_pool_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.specialist_pool_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.specialist_pool_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.specialist_pool_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.specialist_pool_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.tensorboard_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.tensorboard_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.tensorboard_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.tensorboard_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.tensorboard_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.tensorboard_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.tensorboard_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.tensorboard_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.tensorboard_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.tensorboard_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.vizier_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.vizier_service.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.vizier_service.async_client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.vizier_service.client: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.vizier_service.pagers: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.vizier_service.transports: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.vizier_service.transports.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.vizier_service.transports.base: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.vizier_service.transports.grpc: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.services.vizier_service.transports.grpc_asyncio: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.__init__: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.accelerator_type: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.annotation: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.annotation_spec: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.artifact: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.batch_prediction_job: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.completion_stats: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.context: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.custom_job: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.data_item: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.data_labeling_job: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.dataset: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.dataset_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.deployed_index_ref: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.deployed_model_ref: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.encryption_spec: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.endpoint: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.endpoint_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.entity_type: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.env_var: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.event: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.execution: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.explanation: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.explanation_metadata: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.feature: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.feature_monitoring_stats: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.feature_selector: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.featurestore: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.featurestore_monitoring: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.featurestore_online_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.featurestore_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.hyperparameter_tuning_job: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.index: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.index_endpoint: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.index_endpoint_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.index_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.io: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.job_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.job_state: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.lineage_subgraph: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.machine_resources: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.manual_batch_tuning_parameters: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.metadata_schema: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.metadata_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.metadata_store: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.migratable_resource: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.migration_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.model: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.model_deployment_monitoring_job: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.model_evaluation: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.model_evaluation_slice: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.model_monitoring: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.model_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.operation: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.pipeline_job: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.pipeline_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.pipeline_state: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.prediction_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.specialist_pool: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.specialist_pool_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.study: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.tensorboard: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.tensorboard_data: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.tensorboard_experiment: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.tensorboard_run: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.tensorboard_service: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.tensorboard_time_series: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.training_pipeline: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.types: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.unmanaged_container_model: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.user_action_reference: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.value: google_cloud_aiplatform - google.cloud.aiplatform_v1beta1.types.vizier_service: google_cloud_aiplatform google.cloud.bigquery: google_cloud_bigquery - google.cloud.bigquery.__init__: google_cloud_bigquery - google.cloud.bigquery._helpers: google_cloud_bigquery - google.cloud.bigquery._http: google_cloud_bigquery - google.cloud.bigquery._pandas_helpers: google_cloud_bigquery - google.cloud.bigquery._tqdm_helpers: google_cloud_bigquery - google.cloud.bigquery.client: google_cloud_bigquery - google.cloud.bigquery.dataset: google_cloud_bigquery - google.cloud.bigquery.dbapi: google_cloud_bigquery - google.cloud.bigquery.dbapi.__init__: google_cloud_bigquery - google.cloud.bigquery.dbapi._helpers: google_cloud_bigquery - google.cloud.bigquery.dbapi.connection: google_cloud_bigquery - google.cloud.bigquery.dbapi.cursor: google_cloud_bigquery - google.cloud.bigquery.dbapi.exceptions: google_cloud_bigquery - google.cloud.bigquery.dbapi.types: google_cloud_bigquery - google.cloud.bigquery.encryption_configuration: google_cloud_bigquery - google.cloud.bigquery.enums: google_cloud_bigquery - google.cloud.bigquery.exceptions: google_cloud_bigquery - google.cloud.bigquery.external_config: google_cloud_bigquery - google.cloud.bigquery.format_options: google_cloud_bigquery - google.cloud.bigquery.iam: google_cloud_bigquery - google.cloud.bigquery.job: google_cloud_bigquery - google.cloud.bigquery.job.__init__: google_cloud_bigquery - google.cloud.bigquery.job.base: google_cloud_bigquery - google.cloud.bigquery.job.copy_: google_cloud_bigquery - google.cloud.bigquery.job.extract: google_cloud_bigquery - google.cloud.bigquery.job.load: google_cloud_bigquery - google.cloud.bigquery.job.query: google_cloud_bigquery - google.cloud.bigquery.magics: google_cloud_bigquery - google.cloud.bigquery.magics.__init__: google_cloud_bigquery - google.cloud.bigquery.magics.line_arg_parser: google_cloud_bigquery - google.cloud.bigquery.magics.line_arg_parser.__init__: google_cloud_bigquery - google.cloud.bigquery.magics.line_arg_parser.exceptions: google_cloud_bigquery - google.cloud.bigquery.magics.line_arg_parser.lexer: google_cloud_bigquery - google.cloud.bigquery.magics.line_arg_parser.parser: google_cloud_bigquery - google.cloud.bigquery.magics.line_arg_parser.visitors: google_cloud_bigquery - google.cloud.bigquery.magics.magics: google_cloud_bigquery - google.cloud.bigquery.model: google_cloud_bigquery - google.cloud.bigquery.opentelemetry_tracing: google_cloud_bigquery - google.cloud.bigquery.query: google_cloud_bigquery - google.cloud.bigquery.retry: google_cloud_bigquery - google.cloud.bigquery.routine: google_cloud_bigquery - google.cloud.bigquery.routine.__init__: google_cloud_bigquery - google.cloud.bigquery.routine.routine: google_cloud_bigquery - google.cloud.bigquery.schema: google_cloud_bigquery - google.cloud.bigquery.table: google_cloud_bigquery - google.cloud.bigquery.version: google_cloud_bigquery google.cloud.bigquery_v2: google_cloud_bigquery - google.cloud.bigquery_v2.__init__: google_cloud_bigquery - google.cloud.bigquery_v2.types: google_cloud_bigquery - google.cloud.bigquery_v2.types.__init__: google_cloud_bigquery - google.cloud.bigquery_v2.types.encryption_config: google_cloud_bigquery - google.cloud.bigquery_v2.types.model: google_cloud_bigquery - google.cloud.bigquery_v2.types.model_reference: google_cloud_bigquery - google.cloud.bigquery_v2.types.standard_sql: google_cloud_bigquery - google.cloud.bigquery_v2.types.table_reference: google_cloud_bigquery google.cloud.client: google_cloud_core - google.cloud.client.__init__: google_cloud_core google.cloud.environment_vars: google_cloud_core - google.cloud.environment_vars.__init__: google_cloud_core google.cloud.exceptions: google_cloud_core - google.cloud.exceptions.__init__: google_cloud_core google.cloud.extended_operations_pb2: googleapis_common_protos google.cloud.location.locations_pb2: googleapis_common_protos google.cloud.obsolete: google_cloud_core - google.cloud.obsolete.__init__: google_cloud_core google.cloud.operation: google_cloud_core - google.cloud.operation.__init__: google_cloud_core google.cloud.resourcemanager: google_cloud_resource_manager - google.cloud.resourcemanager.__init__: google_cloud_resource_manager google.cloud.resourcemanager_v3: google_cloud_resource_manager - google.cloud.resourcemanager_v3.__init__: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.__init__: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.folders: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.folders.__init__: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.folders.async_client: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.folders.client: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.folders.pagers: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.folders.transports: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.folders.transports.__init__: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.folders.transports.base: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.folders.transports.grpc: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.folders.transports.grpc_asyncio: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.organizations: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.organizations.__init__: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.organizations.async_client: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.organizations.client: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.organizations.pagers: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.organizations.transports: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.organizations.transports.__init__: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.organizations.transports.base: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.organizations.transports.grpc: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.organizations.transports.grpc_asyncio: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.projects: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.projects.__init__: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.projects.async_client: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.projects.client: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.projects.pagers: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.projects.transports: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.projects.transports.__init__: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.projects.transports.base: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.projects.transports.grpc: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.projects.transports.grpc_asyncio: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_bindings: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_bindings.__init__: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_bindings.async_client: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_bindings.client: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_bindings.pagers: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_bindings.transports: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_bindings.transports.__init__: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_bindings.transports.base: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_bindings.transports.grpc: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_bindings.transports.grpc_asyncio: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_keys: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_keys.__init__: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_keys.async_client: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_keys.client: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_keys.pagers: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_keys.transports: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_keys.transports.__init__: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_keys.transports.base: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_keys.transports.grpc: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_keys.transports.grpc_asyncio: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_values: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_values.__init__: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_values.async_client: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_values.client: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_values.pagers: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_values.transports: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_values.transports.__init__: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_values.transports.base: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_values.transports.grpc: google_cloud_resource_manager - google.cloud.resourcemanager_v3.services.tag_values.transports.grpc_asyncio: google_cloud_resource_manager - google.cloud.resourcemanager_v3.types: google_cloud_resource_manager - google.cloud.resourcemanager_v3.types.__init__: google_cloud_resource_manager - google.cloud.resourcemanager_v3.types.folders: google_cloud_resource_manager - google.cloud.resourcemanager_v3.types.organizations: google_cloud_resource_manager - google.cloud.resourcemanager_v3.types.projects: google_cloud_resource_manager - google.cloud.resourcemanager_v3.types.tag_bindings: google_cloud_resource_manager - google.cloud.resourcemanager_v3.types.tag_keys: google_cloud_resource_manager - google.cloud.resourcemanager_v3.types.tag_values: google_cloud_resource_manager google.cloud.storage: google_cloud_storage - google.cloud.storage.__init__: google_cloud_storage - google.cloud.storage._helpers: google_cloud_storage - google.cloud.storage._http: google_cloud_storage - google.cloud.storage._signing: google_cloud_storage - google.cloud.storage.acl: google_cloud_storage - google.cloud.storage.batch: google_cloud_storage - google.cloud.storage.blob: google_cloud_storage - google.cloud.storage.bucket: google_cloud_storage - google.cloud.storage.client: google_cloud_storage - google.cloud.storage.constants: google_cloud_storage - google.cloud.storage.fileio: google_cloud_storage - google.cloud.storage.hmac_key: google_cloud_storage - google.cloud.storage.iam: google_cloud_storage - google.cloud.storage.notification: google_cloud_storage - google.cloud.storage.retry: google_cloud_storage - google.cloud.storage.version: google_cloud_storage google.cloud.version: google_cloud_core google.gapic.metadata: googleapis_common_protos - google.gapic.metadata.__init__: googleapis_common_protos - google.gapic.metadata.gapic_metadata_pb2: googleapis_common_protos google.iam.v1: grpc_google_iam_v1 - google.iam.v1.__init__: grpc_google_iam_v1 - google.iam.v1.iam_policy_pb2: grpc_google_iam_v1 - google.iam.v1.iam_policy_pb2_grpc: grpc_google_iam_v1 - google.iam.v1.logging: grpc_google_iam_v1 - google.iam.v1.logging.__init__: grpc_google_iam_v1 - google.iam.v1.logging.audit_data_pb2: grpc_google_iam_v1 - google.iam.v1.options_pb2: grpc_google_iam_v1 - google.iam.v1.options_pb2_grpc: grpc_google_iam_v1 - google.iam.v1.policy_pb2: grpc_google_iam_v1 - google.iam.v1.policy_pb2_grpc: grpc_google_iam_v1 google.logging.type: googleapis_common_protos - google.logging.type.__init__: googleapis_common_protos - google.logging.type.http_request_pb2: googleapis_common_protos - google.logging.type.log_severity_pb2: googleapis_common_protos google.longrunning: googleapis_common_protos - google.longrunning.__init__: googleapis_common_protos - google.longrunning.operations_grpc: googleapis_common_protos - google.longrunning.operations_grpc_pb2: googleapis_common_protos - google.longrunning.operations_pb2: googleapis_common_protos - google.longrunning.operations_pb2_grpc: googleapis_common_protos - google.longrunning.operations_proto: googleapis_common_protos - google.longrunning.operations_proto_pb2: googleapis_common_protos google.oauth2: google_auth - google.oauth2.__init__: google_auth - google.oauth2._client: google_auth - google.oauth2._client_async: google_auth - google.oauth2._credentials_async: google_auth - google.oauth2._id_token_async: google_auth - google.oauth2._reauth_async: google_auth - google.oauth2._service_account_async: google_auth - google.oauth2.challenges: google_auth - google.oauth2.credentials: google_auth - google.oauth2.id_token: google_auth - google.oauth2.reauth: google_auth - google.oauth2.service_account: google_auth - google.oauth2.sts: google_auth - google.oauth2.utils: google_auth google.protobuf: protobuf - google.protobuf.__init__: protobuf - google.protobuf.any_pb2: protobuf - google.protobuf.api_pb2: protobuf - google.protobuf.compiler: protobuf - google.protobuf.compiler.__init__: protobuf - google.protobuf.compiler.plugin_pb2: protobuf - google.protobuf.descriptor: protobuf - google.protobuf.descriptor_database: protobuf - google.protobuf.descriptor_pb2: protobuf - google.protobuf.descriptor_pool: protobuf - google.protobuf.duration_pb2: protobuf - google.protobuf.empty_pb2: protobuf - google.protobuf.field_mask_pb2: protobuf - google.protobuf.internal: protobuf - google.protobuf.internal.__init__: protobuf - google.protobuf.internal._api_implementation: protobuf - google.protobuf.internal.api_implementation: protobuf - google.protobuf.internal.builder: protobuf - google.protobuf.internal.containers: protobuf - google.protobuf.internal.decoder: protobuf - google.protobuf.internal.encoder: protobuf - google.protobuf.internal.enum_type_wrapper: protobuf - google.protobuf.internal.extension_dict: protobuf - google.protobuf.internal.message_listener: protobuf - google.protobuf.internal.python_message: protobuf - google.protobuf.internal.type_checkers: protobuf - google.protobuf.internal.well_known_types: protobuf - google.protobuf.internal.wire_format: protobuf - google.protobuf.json_format: protobuf - google.protobuf.message: protobuf - google.protobuf.message_factory: protobuf - google.protobuf.proto_builder: protobuf - google.protobuf.pyext: protobuf - google.protobuf.pyext.__init__: protobuf - google.protobuf.pyext._message: protobuf - google.protobuf.pyext.cpp_message: protobuf - google.protobuf.reflection: protobuf - google.protobuf.service: protobuf - google.protobuf.service_reflection: protobuf - google.protobuf.source_context_pb2: protobuf - google.protobuf.struct_pb2: protobuf - google.protobuf.symbol_database: protobuf - google.protobuf.text_encoding: protobuf - google.protobuf.text_format: protobuf - google.protobuf.timestamp_pb2: protobuf - google.protobuf.type_pb2: protobuf - google.protobuf.util: protobuf - google.protobuf.util.__init__: protobuf - google.protobuf.util.json_format_pb2: protobuf - google.protobuf.util.json_format_proto3_pb2: protobuf - google.protobuf.wrappers_pb2: protobuf google.resumable_media: google_resumable_media - google.resumable_media.__init__: google_resumable_media - google.resumable_media._download: google_resumable_media - google.resumable_media._helpers: google_resumable_media - google.resumable_media._upload: google_resumable_media - google.resumable_media.common: google_resumable_media - google.resumable_media.requests: google_resumable_media - google.resumable_media.requests.__init__: google_resumable_media - google.resumable_media.requests._request_helpers: google_resumable_media - google.resumable_media.requests.download: google_resumable_media - google.resumable_media.requests.upload: google_resumable_media google.rpc: googleapis_common_protos - google.rpc.__init__: googleapis_common_protos - google.rpc.code_pb2: googleapis_common_protos - google.rpc.context: googleapis_common_protos - google.rpc.context.__init__: googleapis_common_protos - google.rpc.context.attribute_context_pb2: googleapis_common_protos - google.rpc.error_details_pb2: googleapis_common_protos - google.rpc.status_pb2: googleapis_common_protos google.type: googleapis_common_protos - google.type.__init__: googleapis_common_protos - google.type.calendar_period_pb2: googleapis_common_protos - google.type.color_pb2: googleapis_common_protos - google.type.date_pb2: googleapis_common_protos - google.type.datetime_pb2: googleapis_common_protos - google.type.dayofweek_pb2: googleapis_common_protos - google.type.decimal_pb2: googleapis_common_protos - google.type.expr_pb2: googleapis_common_protos - google.type.fraction_pb2: googleapis_common_protos - google.type.interval_pb2: googleapis_common_protos - google.type.latlng_pb2: googleapis_common_protos - google.type.localized_text_pb2: googleapis_common_protos - google.type.money_pb2: googleapis_common_protos - google.type.month_pb2: googleapis_common_protos - google.type.phone_number_pb2: googleapis_common_protos - google.type.postal_address_pb2: googleapis_common_protos - google.type.quaternion_pb2: googleapis_common_protos - google.type.timeofday_pb2: googleapis_common_protos google_crc32c: google_crc32c - google_crc32c.__config__: google_crc32c - google_crc32c.__init__: google_crc32c - google_crc32c._checksum: google_crc32c - google_crc32c._crc32c: google_crc32c - google_crc32c.cext: google_crc32c - google_crc32c.libs.libcrc32c-672e1704: google_crc32c - google_crc32c.python: google_crc32c grpc: grpcio - grpc.__init__: grpcio - grpc._auth: grpcio - grpc._channel: grpcio - grpc._common: grpcio - grpc._compression: grpcio - grpc._cython: grpcio - grpc._cython.__init__: grpcio - grpc._cython._cygrpc: grpcio - grpc._cython._cygrpc.__init__: grpcio - grpc._cython.cygrpc: grpcio - grpc._grpcio_metadata: grpcio - grpc._interceptor: grpcio - grpc._plugin_wrapping: grpcio - grpc._runtime_protos: grpcio - grpc._server: grpcio - grpc._simple_stubs: grpcio - grpc._utilities: grpcio - grpc.aio: grpcio - grpc.aio.__init__: grpcio - grpc.aio._base_call: grpcio - grpc.aio._base_channel: grpcio - grpc.aio._base_server: grpcio - grpc.aio._call: grpcio - grpc.aio._channel: grpcio - grpc.aio._interceptor: grpcio - grpc.aio._metadata: grpcio - grpc.aio._server: grpcio - grpc.aio._typing: grpcio - grpc.aio._utils: grpcio - grpc.beta: grpcio - grpc.beta.__init__: grpcio - grpc.beta._client_adaptations: grpcio - grpc.beta._metadata: grpcio - grpc.beta._server_adaptations: grpcio - grpc.beta.implementations: grpcio - grpc.beta.interfaces: grpcio - grpc.beta.utilities: grpcio - grpc.experimental: grpcio - grpc.experimental.__init__: grpcio - grpc.experimental.aio: grpcio - grpc.experimental.aio.__init__: grpcio - grpc.experimental.gevent: grpcio - grpc.experimental.session_cache: grpcio - grpc.framework: grpcio - grpc.framework.__init__: grpcio - grpc.framework.common: grpcio - grpc.framework.common.__init__: grpcio - grpc.framework.common.cardinality: grpcio - grpc.framework.common.style: grpcio - grpc.framework.foundation: grpcio - grpc.framework.foundation.__init__: grpcio - grpc.framework.foundation.abandonment: grpcio - grpc.framework.foundation.callable_util: grpcio - grpc.framework.foundation.future: grpcio - grpc.framework.foundation.logging_pool: grpcio - grpc.framework.foundation.stream: grpcio - grpc.framework.foundation.stream_util: grpcio - grpc.framework.interfaces: grpcio - grpc.framework.interfaces.__init__: grpcio - grpc.framework.interfaces.base: grpcio - grpc.framework.interfaces.base.__init__: grpcio - grpc.framework.interfaces.base.base: grpcio - grpc.framework.interfaces.base.utilities: grpcio - grpc.framework.interfaces.face: grpcio - grpc.framework.interfaces.face.__init__: grpcio - grpc.framework.interfaces.face.face: grpcio - grpc.framework.interfaces.face.utilities: grpcio grpc_status: grpcio_status - grpc_status.__init__: grpcio_status - grpc_status._async: grpcio_status - grpc_status._common: grpcio_status - grpc_status.rpc_status: grpcio_status idna: idna - idna.__init__: idna - idna.codec: idna - idna.compat: idna - idna.core: idna - idna.idnadata: idna - idna.intranges: idna - idna.package_data: idna - idna.uts46data: idna packaging: packaging - packaging.__about__: packaging - packaging.__init__: packaging - packaging._manylinux: packaging - packaging._musllinux: packaging - packaging._structures: packaging - packaging.markers: packaging - packaging.requirements: packaging - packaging.specifiers: packaging - packaging.tags: packaging - packaging.utils: packaging - packaging.version: packaging proto: proto_plus - proto.__init__: proto_plus - proto._file_info: proto_plus - proto._package_info: proto_plus - proto.datetime_helpers: proto_plus - proto.enums: proto_plus - proto.fields: proto_plus - proto.marshal: proto_plus - proto.marshal.__init__: proto_plus - proto.marshal.collections: proto_plus - proto.marshal.collections.__init__: proto_plus - proto.marshal.collections.maps: proto_plus - proto.marshal.collections.repeated: proto_plus - proto.marshal.compat: proto_plus - proto.marshal.marshal: proto_plus - proto.marshal.rules: proto_plus - proto.marshal.rules.__init__: proto_plus - proto.marshal.rules.bytes: proto_plus - proto.marshal.rules.dates: proto_plus - proto.marshal.rules.enums: proto_plus - proto.marshal.rules.message: proto_plus - proto.marshal.rules.stringy_numbers: proto_plus - proto.marshal.rules.struct: proto_plus - proto.marshal.rules.wrappers: proto_plus - proto.message: proto_plus - proto.modules: proto_plus - proto.primitives: proto_plus - proto.utils: proto_plus pyasn1: pyasn1 - pyasn1.__init__: pyasn1 - pyasn1.codec: pyasn1 - pyasn1.codec.__init__: pyasn1 - pyasn1.codec.ber: pyasn1 - pyasn1.codec.ber.__init__: pyasn1 - pyasn1.codec.ber.decoder: pyasn1 - pyasn1.codec.ber.encoder: pyasn1 - pyasn1.codec.ber.eoo: pyasn1 - pyasn1.codec.cer: pyasn1 - pyasn1.codec.cer.__init__: pyasn1 - pyasn1.codec.cer.decoder: pyasn1 - pyasn1.codec.cer.encoder: pyasn1 - pyasn1.codec.der: pyasn1 - pyasn1.codec.der.__init__: pyasn1 - pyasn1.codec.der.decoder: pyasn1 - pyasn1.codec.der.encoder: pyasn1 - pyasn1.codec.native: pyasn1 - pyasn1.codec.native.__init__: pyasn1 - pyasn1.codec.native.decoder: pyasn1 - pyasn1.codec.native.encoder: pyasn1 - pyasn1.compat: pyasn1 - pyasn1.compat.__init__: pyasn1 - pyasn1.compat.binary: pyasn1 - pyasn1.compat.calling: pyasn1 - pyasn1.compat.dateandtime: pyasn1 - pyasn1.compat.integer: pyasn1 - pyasn1.compat.octets: pyasn1 - pyasn1.compat.string: pyasn1 - pyasn1.debug: pyasn1 - pyasn1.error: pyasn1 - pyasn1.type: pyasn1 - pyasn1.type.__init__: pyasn1 - pyasn1.type.base: pyasn1 - pyasn1.type.char: pyasn1 - pyasn1.type.constraint: pyasn1 - pyasn1.type.error: pyasn1 - pyasn1.type.namedtype: pyasn1 - pyasn1.type.namedval: pyasn1 - pyasn1.type.opentype: pyasn1 - pyasn1.type.tag: pyasn1 - pyasn1.type.tagmap: pyasn1 - pyasn1.type.univ: pyasn1 - pyasn1.type.useful: pyasn1 pyasn1_modules: pyasn1_modules - pyasn1_modules.__init__: pyasn1_modules - pyasn1_modules.pem: pyasn1_modules - pyasn1_modules.rfc1155: pyasn1_modules - pyasn1_modules.rfc1157: pyasn1_modules - pyasn1_modules.rfc1901: pyasn1_modules - pyasn1_modules.rfc1902: pyasn1_modules - pyasn1_modules.rfc1905: pyasn1_modules - pyasn1_modules.rfc2251: pyasn1_modules - pyasn1_modules.rfc2314: pyasn1_modules - pyasn1_modules.rfc2315: pyasn1_modules - pyasn1_modules.rfc2437: pyasn1_modules - pyasn1_modules.rfc2459: pyasn1_modules - pyasn1_modules.rfc2511: pyasn1_modules - pyasn1_modules.rfc2560: pyasn1_modules - pyasn1_modules.rfc2631: pyasn1_modules - pyasn1_modules.rfc2634: pyasn1_modules - pyasn1_modules.rfc2985: pyasn1_modules - pyasn1_modules.rfc2986: pyasn1_modules - pyasn1_modules.rfc3114: pyasn1_modules - pyasn1_modules.rfc3161: pyasn1_modules - pyasn1_modules.rfc3274: pyasn1_modules - pyasn1_modules.rfc3279: pyasn1_modules - pyasn1_modules.rfc3280: pyasn1_modules - pyasn1_modules.rfc3281: pyasn1_modules - pyasn1_modules.rfc3412: pyasn1_modules - pyasn1_modules.rfc3414: pyasn1_modules - pyasn1_modules.rfc3447: pyasn1_modules - pyasn1_modules.rfc3560: pyasn1_modules - pyasn1_modules.rfc3565: pyasn1_modules - pyasn1_modules.rfc3709: pyasn1_modules - pyasn1_modules.rfc3770: pyasn1_modules - pyasn1_modules.rfc3779: pyasn1_modules - pyasn1_modules.rfc3852: pyasn1_modules - pyasn1_modules.rfc4043: pyasn1_modules - pyasn1_modules.rfc4055: pyasn1_modules - pyasn1_modules.rfc4073: pyasn1_modules - pyasn1_modules.rfc4108: pyasn1_modules - pyasn1_modules.rfc4210: pyasn1_modules - pyasn1_modules.rfc4211: pyasn1_modules - pyasn1_modules.rfc4334: pyasn1_modules - pyasn1_modules.rfc4985: pyasn1_modules - pyasn1_modules.rfc5035: pyasn1_modules - pyasn1_modules.rfc5083: pyasn1_modules - pyasn1_modules.rfc5084: pyasn1_modules - pyasn1_modules.rfc5208: pyasn1_modules - pyasn1_modules.rfc5280: pyasn1_modules - pyasn1_modules.rfc5480: pyasn1_modules - pyasn1_modules.rfc5649: pyasn1_modules - pyasn1_modules.rfc5652: pyasn1_modules - pyasn1_modules.rfc5751: pyasn1_modules - pyasn1_modules.rfc5755: pyasn1_modules - pyasn1_modules.rfc5913: pyasn1_modules - pyasn1_modules.rfc5914: pyasn1_modules - pyasn1_modules.rfc5915: pyasn1_modules - pyasn1_modules.rfc5916: pyasn1_modules - pyasn1_modules.rfc5917: pyasn1_modules - pyasn1_modules.rfc5924: pyasn1_modules - pyasn1_modules.rfc5934: pyasn1_modules - pyasn1_modules.rfc5940: pyasn1_modules - pyasn1_modules.rfc5958: pyasn1_modules - pyasn1_modules.rfc5990: pyasn1_modules - pyasn1_modules.rfc6010: pyasn1_modules - pyasn1_modules.rfc6019: pyasn1_modules - pyasn1_modules.rfc6031: pyasn1_modules - pyasn1_modules.rfc6032: pyasn1_modules - pyasn1_modules.rfc6120: pyasn1_modules - pyasn1_modules.rfc6170: pyasn1_modules - pyasn1_modules.rfc6187: pyasn1_modules - pyasn1_modules.rfc6210: pyasn1_modules - pyasn1_modules.rfc6211: pyasn1_modules - pyasn1_modules.rfc6402: pyasn1_modules - pyasn1_modules.rfc6402-1: pyasn1_modules - pyasn1_modules.rfc6482: pyasn1_modules - pyasn1_modules.rfc6486: pyasn1_modules - pyasn1_modules.rfc6487: pyasn1_modules - pyasn1_modules.rfc6664: pyasn1_modules - pyasn1_modules.rfc6955: pyasn1_modules - pyasn1_modules.rfc6960: pyasn1_modules - pyasn1_modules.rfc7030: pyasn1_modules - pyasn1_modules.rfc7191: pyasn1_modules - pyasn1_modules.rfc7229: pyasn1_modules - pyasn1_modules.rfc7292: pyasn1_modules - pyasn1_modules.rfc7296: pyasn1_modules - pyasn1_modules.rfc7508: pyasn1_modules - pyasn1_modules.rfc7585: pyasn1_modules - pyasn1_modules.rfc7633: pyasn1_modules - pyasn1_modules.rfc7773: pyasn1_modules - pyasn1_modules.rfc7894: pyasn1_modules - pyasn1_modules.rfc7894-1: pyasn1_modules - pyasn1_modules.rfc7906: pyasn1_modules - pyasn1_modules.rfc7914: pyasn1_modules - pyasn1_modules.rfc8017: pyasn1_modules - pyasn1_modules.rfc8018: pyasn1_modules - pyasn1_modules.rfc8103: pyasn1_modules - pyasn1_modules.rfc8209: pyasn1_modules - pyasn1_modules.rfc8226: pyasn1_modules - pyasn1_modules.rfc8358: pyasn1_modules - pyasn1_modules.rfc8360: pyasn1_modules - pyasn1_modules.rfc8398: pyasn1_modules - pyasn1_modules.rfc8410: pyasn1_modules - pyasn1_modules.rfc8418: pyasn1_modules - pyasn1_modules.rfc8419: pyasn1_modules - pyasn1_modules.rfc8479: pyasn1_modules - pyasn1_modules.rfc8494: pyasn1_modules - pyasn1_modules.rfc8520: pyasn1_modules - pyasn1_modules.rfc8619: pyasn1_modules - pyasn1_modules.rfc8649: pyasn1_modules pyparsing: pyparsing - pyparsing.__init__: pyparsing - pyparsing.actions: pyparsing - pyparsing.common: pyparsing - pyparsing.core: pyparsing - pyparsing.diagram: pyparsing - pyparsing.diagram.__init__: pyparsing - pyparsing.exceptions: pyparsing - pyparsing.helpers: pyparsing - pyparsing.results: pyparsing - pyparsing.testing: pyparsing - pyparsing.unicode: pyparsing - pyparsing.util: pyparsing requests: requests - requests.__init__: requests - requests.__version__: requests - requests._internal_utils: requests - requests.adapters: requests - requests.api: requests - requests.auth: requests - requests.certs: requests - requests.compat: requests - requests.cookies: requests - requests.exceptions: requests - requests.help: requests - requests.hooks: requests - requests.models: requests - requests.packages: requests - requests.sessions: requests - requests.status_codes: requests - requests.structures: requests - requests.utils: requests rsa: rsa - rsa.__init__: rsa - rsa._compat: rsa - rsa.asn1: rsa - rsa.cli: rsa - rsa.common: rsa - rsa.core: rsa - rsa.key: rsa - rsa.parallel: rsa - rsa.pem: rsa - rsa.pkcs1: rsa - rsa.pkcs1_v2: rsa - rsa.prime: rsa - rsa.randnum: rsa - rsa.transform: rsa - rsa.util: rsa samples.generated_samples.cloudresourcemanager_v3_generated_folders_create_folder_async: google_cloud_resource_manager samples.generated_samples.cloudresourcemanager_v3_generated_folders_create_folder_sync: google_cloud_resource_manager samples.generated_samples.cloudresourcemanager_v3_generated_folders_delete_folder_async: google_cloud_resource_manager @@ -1616,63 +154,7 @@ manifest: scripts.readme-gen.readme_gen: google_cloud_resource_manager six: six tests: google_cloud_resource_manager - tests.__init__: google_cloud_resource_manager - tests.unit: google_cloud_resource_manager - tests.unit.__init__: google_cloud_resource_manager - tests.unit.gapic: google_cloud_resource_manager - tests.unit.gapic.__init__: google_cloud_resource_manager - tests.unit.gapic.resourcemanager_v3: google_cloud_resource_manager - tests.unit.gapic.resourcemanager_v3.__init__: google_cloud_resource_manager - tests.unit.gapic.resourcemanager_v3.test_folders: google_cloud_resource_manager - tests.unit.gapic.resourcemanager_v3.test_organizations: google_cloud_resource_manager - tests.unit.gapic.resourcemanager_v3.test_projects: google_cloud_resource_manager - tests.unit.gapic.resourcemanager_v3.test_tag_bindings: google_cloud_resource_manager - tests.unit.gapic.resourcemanager_v3.test_tag_keys: google_cloud_resource_manager - tests.unit.gapic.resourcemanager_v3.test_tag_values: google_cloud_resource_manager urllib3: urllib3 - urllib3.__init__: urllib3 - urllib3._collections: urllib3 - urllib3._version: urllib3 - urllib3.connection: urllib3 - urllib3.connectionpool: urllib3 - urllib3.contrib: urllib3 - urllib3.contrib.__init__: urllib3 - urllib3.contrib._appengine_environ: urllib3 - urllib3.contrib._securetransport: urllib3 - urllib3.contrib._securetransport.__init__: urllib3 - urllib3.contrib._securetransport.bindings: urllib3 - urllib3.contrib._securetransport.low_level: urllib3 - urllib3.contrib.appengine: urllib3 - urllib3.contrib.ntlmpool: urllib3 - urllib3.contrib.pyopenssl: urllib3 - urllib3.contrib.securetransport: urllib3 - urllib3.contrib.socks: urllib3 - urllib3.exceptions: urllib3 - urllib3.fields: urllib3 - urllib3.filepost: urllib3 - urllib3.packages: urllib3 - urllib3.packages.__init__: urllib3 - urllib3.packages.backports: urllib3 - urllib3.packages.backports.__init__: urllib3 - urllib3.packages.backports.makefile: urllib3 - urllib3.packages.six: urllib3 - urllib3.poolmanager: urllib3 - urllib3.request: urllib3 - urllib3.response: urllib3 - urllib3.util: urllib3 - urllib3.util.__init__: urllib3 - urllib3.util.connection: urllib3 - urllib3.util.proxy: urllib3 - urllib3.util.queue: urllib3 - urllib3.util.request: urllib3 - urllib3.util.response: urllib3 - urllib3.util.retry: urllib3 - urllib3.util.ssl_: urllib3 - urllib3.util.ssl_match_hostname: urllib3 - urllib3.util.ssltransport: urllib3 - urllib3.util.timeout: urllib3 - urllib3.util.url: urllib3 - urllib3.util.wait: urllib3 pip_repository: name: gazelle_python_test -integrity: 32e38932043eca090a64ca741758d8e4a5817c2cd7dc821fc927914c32fb3114 +integrity: 366852b36882c766f23173b8673e934a1f84685f529dc06aabab837f697ba9f8 diff --git a/gazelle/pythonconfig/pythonconfig.go b/gazelle/pythonconfig/pythonconfig.go index a24a90efeb..166b575046 100644 --- a/gazelle/pythonconfig/pythonconfig.go +++ b/gazelle/pythonconfig/pythonconfig.go @@ -282,16 +282,23 @@ func (c *Config) FindThirdPartyDependency(modName string) (string, bool) { for currentCfg := c; currentCfg != nil; currentCfg = currentCfg.parent { if currentCfg.gazelleManifest != nil { gazelleManifest := currentCfg.gazelleManifest - if distributionName, ok := gazelleManifest.ModulesMapping[modName]; ok { - var distributionRepositoryName string - if gazelleManifest.PipDepsRepositoryName != "" { - distributionRepositoryName = gazelleManifest.PipDepsRepositoryName - } else if gazelleManifest.PipRepository != nil { - distributionRepositoryName = gazelleManifest.PipRepository.Name + for { + if distributionName, ok := gazelleManifest.ModulesMapping[modName]; ok { + var distributionRepositoryName string + if gazelleManifest.PipDepsRepositoryName != "" { + distributionRepositoryName = gazelleManifest.PipDepsRepositoryName + } else if gazelleManifest.PipRepository != nil { + distributionRepositoryName = gazelleManifest.PipRepository.Name + } + + lbl := currentCfg.FormatThirdPartyDependency(distributionRepositoryName, distributionName) + return lbl.String(), true } - - lbl := currentCfg.FormatThirdPartyDependency(distributionRepositoryName, distributionName) - return lbl.String(), true + i := strings.LastIndex(modName, ".") + if i == -1 { + break + } + modName = modName[:i] } } } From ff1dfeda76a7843b6018bd2d702ba6ad2492c90b Mon Sep 17 00:00:00 2001 From: betaboon Date: Wed, 31 Jul 2024 13:55:14 +0200 Subject: [PATCH 142/345] chore: bump toolchain versions (#2102) Bump toolchain versions to use the latest available releases. * `3.12 -> 3.12.4` * Use release `20240726` to pick up dependency updates --- CHANGELOG.md | 8 ++++- python/versions.bzl | 75 ++++++++++++++++++++++++++------------------- 2 files changed, 51 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec0682a65e..47c6d762d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,10 @@ A brief description of the categories of changes: * (pip) Correctly use the `sdist` downloaded by the bazel downloader when using `experimental_index_url` feature. Fixes [#2091](https://github.com/bazelbuild/rules_python/issues/2090). +* (toolchains): Change some old toochain versions to use [20240726] release to + include dependency updates `3.8.19`, `3.9.19`, `3.10.14`, `3.11.9` +* (toolchains): Bump default toolchain versions to: + * `3.12 -> 3.12.4` ### Added * (rules) `PYTHONSAFEPATH` is inherited from the calling environment to allow @@ -60,10 +64,12 @@ A brief description of the categories of changes: [py_test_main] in order to integrate with `pytest`. Currently the default flag value is set to `true` for backwards compatible behaviour, but in the future the flag will be flipped be `false` by default. +* (toolchains) New Python versions available: `3.12.4` using the [20240726] release. [rules_python_pytest]: https://github.com/caseyduquettesc/rules_python_pytest [py_test_main]: https://docs.aspect.build/rulesets/aspect_rules_py/docs/rules/#py_pytest_main [pytest_bazel]: https://pypi.org/project/pytest-bazel +[20240726]: https://github.com/indygreg/python-build-standalone/releases/tag/20240726 ### Removed * Nothing yet @@ -116,7 +122,7 @@ A brief description of the categories of changes: ### Added * (toolchains) {obj}`//python/runtime_env_toolchains:all`, which is a drop-in replacement for the "autodetecting" toolchain. -* (gazelle) Added new `python_label_convention` and `python_label_normalization` directives. These directive +* (gazelle) Added new `python_label_convention` and `python_label_normalization` directives. These directive allows altering default Gazelle label format to third-party dependencies useful for re-using Gazelle plugin with other rules, including `rules_pycross`. See [#1939](https://github.com/bazelbuild/rules_python/issues/1939). diff --git a/python/versions.bzl b/python/versions.bzl index fd385cd1d5..2cf9b39e96 100644 --- a/python/versions.bzl +++ b/python/versions.bzl @@ -120,13 +120,13 @@ TOOL_VERSIONS = { "strip_prefix": "python", }, "3.8.19": { - "url": "20240415/cpython-{python_version}+20240415-{platform}-{build}.tar.gz", + "url": "20240726/cpython-{python_version}+20240726-{platform}-{build}.tar.gz", "sha256": { - "aarch64-apple-darwin": "eae09ed83ee66353c0cee435ea2d3e4868bd0537214803fb256a1a2928710bc0", - "aarch64-unknown-linux-gnu": "5bde36c53a9a511a1618f159abed77264392eb054edeb57bb5740f6335db34a3", - "x86_64-apple-darwin": "05f0c488d84f7590afb6f5d192f071df80584339dda581b6186effc6cd690f6b", - "x86_64-pc-windows-msvc": "ee95c27e5d9de165e77c280ad4d7b51b0dab9567e7e233fc3acf72363870a168", - "x86_64-unknown-linux-gnu": "b33feb5ce0d7f9c4aca8621a9d231dfd9d2f6e26eccb56b63f07041ff573d5a5", + "aarch64-apple-darwin": "fe4af1b6bc59478d027ede43f6249cf7b9143558e171bdf8711247337623af57", + "aarch64-unknown-linux-gnu": "8dc598aca7ad43ea20119324af98862d198d8990151c734a69f0fc9d16384b46", + "x86_64-apple-darwin": "4bc990b35384c83b5b0b3071e91455ec203517e569f29f691b159f1a6b2a19b2", + "x86_64-pc-windows-msvc": "4e8e9ddda82062d6e111108ab72f439acac4ba41b77d694548ef5dbf6b2b3319", + "x86_64-unknown-linux-gnu": "e81ea4dd16e6057c8121bdbcb7b64e2956068ca019f244c814bc3ad907cb2765", }, "strip_prefix": "python", }, @@ -213,15 +213,15 @@ TOOL_VERSIONS = { "strip_prefix": "python", }, "3.9.19": { - "url": "20240415/cpython-{python_version}+20240415-{platform}-{build}.tar.gz", + "url": "20240726/cpython-{python_version}+20240726-{platform}-{build}.tar.gz", "sha256": { - "aarch64-apple-darwin": "2671bb4ffd036f03076c8aa41e3828c4c16a602e93e2249a8e7b28fd83fdde51", - "aarch64-unknown-linux-gnu": "b18ad819f04c5b2cff6ffa95dd59263d00dcd6f5633d11e43685b4017469cb1c", - "ppc64le-unknown-linux-gnu": "2521ebe9eef273ab718670ed6c6c11760214cdc2e34b7609674179629659a6cd", - "s390x-unknown-linux-gnu": "8f83b8f357031cd6788ca253b1ac29020b73c8b41d0e5fb09a554d0d6c04ae83", - "x86_64-apple-darwin": "627d903588c0e69ed8b941ba9f91e070e38105a627c5b8c730267744760dca84", - "x86_64-pc-windows-msvc": "9b46faee13e37d8bfa4c02de3775ca3d5dec9378697d755b750fd37788179286", - "x86_64-unknown-linux-gnu": "00f698873804863dedc0e2b2c2cc4303b49ab0703af2e5883e11340cb8079d0f", + "aarch64-apple-darwin": "0e5a7aae57c53d7a849bc7f67764a947b626e3fe8d4d41a8eed11d9e4be0b1c6", + "aarch64-unknown-linux-gnu": "05ec896db9a9d4fe8004b4e4b6a6fdc588a015fedbddb475490885b0d9c7d9b3", + "ppc64le-unknown-linux-gnu": "bfff0e3d536b2f0c315e85926cc317b7b756701b6de781a8972cefbdbc991ca2", + "s390x-unknown-linux-gnu": "059ec97080b205ea5f1ddf71c18e22b691e8d68192bd37d13ad8f4359915299d", + "x86_64-apple-darwin": "f2ae9fcac044a329739b8c1676245e8cb6b3094416220e71823d2673bdea0bdb", + "x86_64-pc-windows-msvc": "a8df6a00140055c9accb0be632e7add951d587bbe3d63c40827bbd5145d8f557", + "x86_64-unknown-linux-gnu": "cbf94cb1c9d4b5501d9b3652f6e8400c2cab7c41dfea48d344d9e7f29692b91b", }, "strip_prefix": "python", }, @@ -319,15 +319,15 @@ TOOL_VERSIONS = { "strip_prefix": "python", }, "3.10.14": { - "url": "20240415/cpython-{python_version}+20240415-{platform}-{build}.tar.gz", + "url": "20240726/cpython-{python_version}+20240726-{platform}-{build}.tar.gz", "sha256": { - "aarch64-apple-darwin": "389da793b7666e9310908b4fe3ddcf0a20b55727fcb384c7c49b01bb21716f89", - "aarch64-unknown-linux-gnu": "2f9f26c430df19d6d2a25ac3f2a8e74106d32b9951b85f95218ceeb13d52e952", - "ppc64le-unknown-linux-gnu": "9f178c19850567391188c2f9de87ce3c9fce698a23f5f3470be03745a03d1daa", - "s390x-unknown-linux-gnu": "648aa520de74ee426231e4a5349598990abe42a97c347ce6240b166f23ee5903", - "x86_64-apple-darwin": "8e27ec6f27b3a27be892c7a9db1e278c858acd9d90c1114013fe5587cd6fc5e6", - "x86_64-pc-windows-msvc": "186b5632fb2fa5b5e6eee4110ce9bbb0349f52bb2163d2a1f5188b1d8eb1b5f3", - "x86_64-unknown-linux-gnu": "c83c5485659250ef4e4fedb8e7f7b97bc99cc8cf5a1b11d0d1a98d347a43411d", + "aarch64-apple-darwin": "164d89f0df2feb689981864ecc1dffb19e6aa3696c8880166de555494fe92607", + "aarch64-unknown-linux-gnu": "39bcd46b4d70e40da177c55259be16d5c2be7a3f7f93f1e3bde47e71b4833f29", + "ppc64le-unknown-linux-gnu": "549d38b9ef59cba9ab2990025255231bfa1cb32b4bc5eac321667640fdee19d1", + "s390x-unknown-linux-gnu": "de4bc878a8666c734f983db971610980870148f333bda8b0c34abfaeae88d7ec", + "x86_64-apple-darwin": "1a1455838cd1e8ed0da14a152a2d559a2fd3a6047ba7013e841db4a35a228c1d", + "x86_64-pc-windows-msvc": "7f68821a8b5445267eca480660364ebd06ec84632b336770c6e39de07ac0f6c3", + "x86_64-unknown-linux-gnu": "32b34cd13d9d745b3db3f3b8398ab2c07de74544829915dbebd8dce39bdc405e", }, "strip_prefix": "python", }, @@ -420,15 +420,15 @@ TOOL_VERSIONS = { "strip_prefix": "python", }, "3.11.9": { - "url": "20240415/cpython-{python_version}+20240415-{platform}-{build}.tar.gz", + "url": "20240726/cpython-{python_version}+20240726-{platform}-{build}.tar.gz", "sha256": { - "aarch64-apple-darwin": "7af7058f7c268b4d87ed7e08c2c7844ef8460863b3e679db3afdce8bb1eedfae", - "aarch64-unknown-linux-gnu": "b3a7199ac2615d75fb906e5ba556432efcf24baf8651fc70370d9f052d4069ee", - "ppc64le-unknown-linux-gnu": "03f62d1e2d400c9662cdd12ae33a6f328c34ae8e2b872f8563a144834742bd6a", - "s390x-unknown-linux-gnu": "3f7a0dd64fa292977c4da09e865ee504a48e55dbc2dbfd9ff4b991af891e4446", - "x86_64-apple-darwin": "9afd734f63a23783cf0257bef25c9231ffc80e7747486dc54cf72f325213fd15", - "x86_64-pc-windows-msvc": "368474c69f476e7de4adaf50b61d9fcf6ec8b4db88cc43c5f71c860b3cd29c69", - "x86_64-unknown-linux-gnu": "78b1c16a9fd032997ba92a60f46a64f795cd18ff335659dfdf6096df277b24d5", + "aarch64-apple-darwin": "cbdac9462bab9671c8e84650e425d3f43b775752a930a2ef954a0d457d5c00c3", + "aarch64-unknown-linux-gnu": "4d17cf988abe24449d649aad3ef974091ab76807904d41839907061925b4c9e3", + "ppc64le-unknown-linux-gnu": "fc4f3c9ef9bfac2ed0282126ff376e544697ad04a5408d6429d46899d7d3bf21", + "s390x-unknown-linux-gnu": "e69b66e53e926460df044f44846eef3fea642f630e829719e1a4112fc370dc56", + "x86_64-apple-darwin": "dc3174666a30f4c38d04e79a80c3159b4b3aa69597c4676701c8386696811611", + "x86_64-pc-windows-msvc": "f694be48bdfec1dace6d69a19906b6083f4dd7c7c61f1138ba520e433e5598f8", + "x86_64-unknown-linux-gnu": "f6e955dc9ddfcad74e77abe6f439dac48ebca14b101ed7c85a5bf3206ed2c53d", }, "strip_prefix": "python", }, @@ -484,6 +484,19 @@ TOOL_VERSIONS = { }, "strip_prefix": "python", }, + "3.12.4": { + "url": "20240726/cpython-{python_version}+20240726-{platform}-{build}.tar.gz", + "sha256": { + "aarch64-apple-darwin": "1801025e825c04b3907e4ef6220a13607bc0397628c9485897073110ef7fde15", + "aarch64-unknown-linux-gnu": "a098b18b7e9fea0c66867b76c0124fce9465765017572b2e7b522154c87c78d7", + "ppc64le-unknown-linux-gnu": "04011c4c5b7fe34b0b895edf4ad8748e410686c1d69aaee11d6688d481023bcb", + "s390x-unknown-linux-gnu": "8f8f3e29cf0c2facdbcfee70660939fda7667ac24fee8656d3388fc72f3acc7c", + "x86_64-apple-darwin": "4c325838c1b0ed13698506fcd515be25c73dcbe195f8522cf98f9148a97601ed", + "x86_64-pc-windows-msvc": "74309b0f322716409883d38c621743ea7fa0376eb00927b8ee1e1671d3aff450", + "x86_64-unknown-linux-gnu": "e133dd6fc6a2d0033e2658637cc22e9c95f9d7073b80115037ee1f16417a54ac", + }, + "strip_prefix": "python", + }, } # buildifier: disable=unsorted-dict-items @@ -492,7 +505,7 @@ MINOR_MAPPING = { "3.9": "3.9.19", "3.10": "3.10.14", "3.11": "3.11.9", - "3.12": "3.12.3", + "3.12": "3.12.4", } PLATFORMS = { From dbc6c0431b074f6d9953c565266f73c68a444b6f Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 31 Jul 2024 20:58:00 -0700 Subject: [PATCH 143/345] tests: make toolchain tests run in the same build instead of bazel-in-bazel integration tests (#2095) This changes the //tests/toolchains tests to run in the same Bazel build instance instead of being bazel-in-bazel integration tests. This is done by using a transition to set the python version to match the desired toolchain. This makes running the tests **much** cheaper -- there were 37 sub-bazel processes being started (one for each python version), which was very expensive. Debugging is also much easier because they aren't part of a bazel-in-bazel invocation. --- MODULE.bazel | 9 + WORKSPACE | 5 +- python/private/python.bzl | 51 ++++- tests/support/sh_py_run_test.bzl | 14 +- tests/toolchains/BUILD.bazel | 9 +- tests/toolchains/defs.bzl | 212 +++--------------- tests/toolchains/python_toolchain_test.py | 28 +++ tests/toolchains/run_acceptance_test.py.tmpl | 90 -------- tests/toolchains/versions_test.bzl | 51 ----- .../toolchains/workspace_template/BUILD.bazel | 6 - .../workspace_template/BUILD.bazel.tmpl | 9 - .../workspace_template/MODULE.bazel.tmpl | 19 -- tests/toolchains/workspace_template/README.md | 4 - .../workspace_template/WORKSPACE.tmpl | 41 ---- .../workspace_template/python_version_test.py | 26 --- 15 files changed, 133 insertions(+), 441 deletions(-) create mode 100644 tests/toolchains/python_toolchain_test.py delete mode 100644 tests/toolchains/run_acceptance_test.py.tmpl delete mode 100644 tests/toolchains/versions_test.bzl delete mode 100644 tests/toolchains/workspace_template/BUILD.bazel delete mode 100644 tests/toolchains/workspace_template/BUILD.bazel.tmpl delete mode 100644 tests/toolchains/workspace_template/MODULE.bazel.tmpl delete mode 100644 tests/toolchains/workspace_template/README.md delete mode 100644 tests/toolchains/workspace_template/WORKSPACE.tmpl delete mode 100644 tests/toolchains/workspace_template/python_version_test.py diff --git a/MODULE.bazel b/MODULE.bazel index 2e0d06dc5f..457d8cc0fa 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -76,6 +76,15 @@ bazel_dep(name = "rules_testing", version = "0.6.0", dev_dependency = True) 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") +dev_python = use_extension( + "//python/extensions:python.bzl", + "python", + dev_dependency = True, +) +dev_python.rules_python_private_testing( + register_all_versions = True, +) + dev_pip = use_extension( "//python/private/pypi:pip.bzl", "pip_internal", diff --git a/WORKSPACE b/WORKSPACE index 90e9305684..6c1ab4f9af 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -42,12 +42,13 @@ load("//:internal_setup.bzl", "rules_python_internal_setup") rules_python_internal_setup() load("//python:repositories.bzl", "python_register_multi_toolchains") -load("//python:versions.bzl", "MINOR_MAPPING") +load("//python:versions.bzl", "MINOR_MAPPING", "TOOL_VERSIONS") python_register_multi_toolchains( name = "python", default_version = MINOR_MAPPING.values()[-2], - python_versions = MINOR_MAPPING.values(), + # Integration tests verify each version, so register all of them. + python_versions = TOOL_VERSIONS.keys(), ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file") diff --git a/python/private/python.bzl b/python/private/python.bzl index 2791ae9e38..ce00a7bb74 100644 --- a/python/private/python.bzl +++ b/python/private/python.bzl @@ -16,6 +16,7 @@ load("@bazel_features//:features.bzl", "bazel_features") load("//python:repositories.bzl", "python_register_toolchains") +load("//python:versions.bzl", "TOOL_VERSIONS") load(":pythons_hub.bzl", "hub_repo") load(":text_util.bzl", "render") load(":toolchains_repo.bzl", "multi_toolchain_aliases") @@ -78,7 +79,9 @@ def _python_impl(module_ctx): for mod in module_ctx.modules: module_toolchain_versions = [] - for toolchain_attr in mod.tags.toolchain: + toolchain_attr_structs = _create_toolchain_attr_structs(mod) + + for toolchain_attr in toolchain_attr_structs: toolchain_version = toolchain_attr.python_version toolchain_name = "python_" + toolchain_version.replace(".", "_") @@ -95,9 +98,7 @@ def _python_impl(module_ctx): # * rules_python needs to set a soft default in case the root module doesn't, # e.g. if the root module doesn't use Python itself. # * The root module is allowed to override the rules_python default. - - # A single toolchain is treated as the default because it's unambiguous. - is_default = toolchain_attr.is_default or len(mod.tags.toolchain) == 1 + is_default = toolchain_attr.is_default # Also only the root module should be able to decide ignore_root_user_error. # Modules being depended upon don't know the final environment, so they aren't @@ -251,6 +252,43 @@ def _fail_multiple_default_toolchains(first, second): second = second, )) +def _create_toolchain_attr_structs(mod): + arg_structs = [] + seen_versions = {} + for tag in mod.tags.toolchain: + arg_structs.append(_create_toolchain_attrs_struct(tag = tag, toolchain_tag_count = len(mod.tags.toolchain))) + seen_versions[tag.python_version] = True + + if mod.is_root: + register_all = False + for tag in mod.tags.rules_python_private_testing: + if tag.register_all_versions: + register_all = True + break + if register_all: + arg_structs.extend([ + _create_toolchain_attrs_struct(python_version = v) + for v in TOOL_VERSIONS.keys() + if v not in seen_versions + ]) + return arg_structs + +def _create_toolchain_attrs_struct(*, tag = None, python_version = None, toolchain_tag_count = None): + if tag and python_version: + fail("Only one of tag and python version can be specified") + if tag: + # A single toolchain is treated as the default because it's unambiguous. + is_default = tag.is_default or toolchain_tag_count == 1 + else: + is_default = False + + return struct( + is_default = is_default, + python_version = python_version if python_version else tag.python_version, + configure_coverage_tool = getattr(tag, "configure_coverage_tool", False), + ignore_root_user_error = getattr(tag, "ignore_root_user_error", False), + ) + def _get_bazel_version_specific_kwargs(): kwargs = {} @@ -264,6 +302,11 @@ python = module_extension( """, implementation = _python_impl, tag_classes = { + "rules_python_private_testing": tag_class( + attrs = { + "register_all_versions": attr.bool(default = False), + }, + ), "toolchain": tag_class( doc = """Tag class used to register Python toolchains. Use this tag class to register one or more Python toolchains. This class diff --git a/tests/support/sh_py_run_test.bzl b/tests/support/sh_py_run_test.bzl index 183122a6ba..455f64e49f 100644 --- a/tests/support/sh_py_run_test.bzl +++ b/tests/support/sh_py_run_test.bzl @@ -20,16 +20,18 @@ without the overhead of a bazel-in-bazel integration test. load("//python:py_binary.bzl", "py_binary") load("//python:py_test.bzl", "py_test") load("//python/private:toolchain_types.bzl", "TARGET_TOOLCHAIN_TYPE") # buildifier: disable=bzl-visibility +load("//tests/support:support.bzl", "VISIBLE_FOR_TESTING") def _perform_transition_impl(input_settings, attr): settings = dict(input_settings) + settings[VISIBLE_FOR_TESTING] = True settings["//command_line_option:build_python_zip"] = attr.build_python_zip if attr.bootstrap_impl: settings["//python/config_settings:bootstrap_impl"] = attr.bootstrap_impl if attr.extra_toolchains: settings["//command_line_option:extra_toolchains"] = attr.extra_toolchains - else: - settings["//command_line_option:extra_toolchains"] = input_settings["//command_line_option:extra_toolchains"] + if attr.python_version: + settings["//python/config_settings:python_version"] = attr.python_version return settings _perform_transition = transition( @@ -37,11 +39,14 @@ _perform_transition = transition( inputs = [ "//python/config_settings:bootstrap_impl", "//command_line_option:extra_toolchains", + "//python/config_settings:python_version", ], outputs = [ "//command_line_option:build_python_zip", "//command_line_option:extra_toolchains", "//python/config_settings:bootstrap_impl", + "//python/config_settings:python_version", + VISIBLE_FOR_TESTING, ], ) @@ -99,6 +104,7 @@ to make the RBE presubmits happy, which disable auto-detection of a CC toolchain. """, ), + "python_version": attr.string(), "target": attr.label(executable = True, cfg = "target"), "_allowlist_function_transition": attr.label( default = "@bazel_tools//tools/allowlists/function_transition_allowlist", @@ -125,7 +131,10 @@ def py_reconfig_test(*, name, **kwargs): reconfig_kwargs = {} reconfig_kwargs["bootstrap_impl"] = kwargs.pop("bootstrap_impl", None) reconfig_kwargs["extra_toolchains"] = kwargs.pop("extra_toolchains", None) + reconfig_kwargs["python_version"] = kwargs.pop("python_version", None) reconfig_kwargs["env"] = kwargs.get("env") + reconfig_kwargs["target_compatible_with"] = kwargs.get("target_compatible_with") + inner_name = "_{}_inner" + name _py_reconfig_test( name = name, @@ -178,6 +187,7 @@ def _current_build_settings_impl(ctx): "short_path": runtime.interpreter.short_path if runtime.interpreter else None, }, "interpreter_path": runtime.interpreter_path, + "toolchain_label": str(getattr(toolchain, "toolchain_label", None)), }), ) return [DefaultInfo( diff --git a/tests/toolchains/BUILD.bazel b/tests/toolchains/BUILD.bazel index 2f804a4ca0..c55dc92a7d 100644 --- a/tests/toolchains/BUILD.bazel +++ b/tests/toolchains/BUILD.bazel @@ -12,9 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -load(":defs.bzl", "acceptance_tests") -load(":versions_test.bzl", "versions_test_suite") +load(":defs.bzl", "define_toolchain_tests") -versions_test_suite(name = "versions_test") - -acceptance_tests() +define_toolchain_tests( + name = "toolchain_tests", +) diff --git a/tests/toolchains/defs.bzl b/tests/toolchains/defs.bzl index 723272d212..076e6b42eb 100644 --- a/tests/toolchains/defs.bzl +++ b/tests/toolchains/defs.bzl @@ -12,192 +12,40 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""This module contains the definition for the toolchains testing rules. -""" +"" load("//python:versions.bzl", "PLATFORMS", "TOOL_VERSIONS") -load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility -load("//python/private:toolchain_types.bzl", "TARGET_TOOLCHAIN_TYPE") # buildifier: disable=bzl-visibility +load("//tests/support:sh_py_run_test.bzl", "py_reconfig_test") -_WINDOWS_RUNNER_TEMPLATE = """\ -@ECHO OFF -set PATHEXT=.COM;.EXE;.BAT -powershell.exe -c "& ./{interpreter_path} {run_acceptance_test_py}" -""" +def define_toolchain_tests(name): + """Define the toolchain tests. -def _acceptance_test_impl(ctx): - files = [] - - if BZLMOD_ENABLED: - module_bazel = ctx.actions.declare_file("/".join([ctx.attr.python_version, "MODULE.bazel"])) - ctx.actions.expand_template( - template = ctx.file._module_bazel_tmpl, - output = module_bazel, - substitutions = {"%python_version%": ctx.attr.python_version}, - ) - files.append(module_bazel) - - workspace = ctx.actions.declare_file("/".join([ctx.attr.python_version, "WORKSPACE"])) - ctx.actions.write(workspace, "") - files.append(workspace) - else: - workspace = ctx.actions.declare_file("/".join([ctx.attr.python_version, "WORKSPACE"])) - ctx.actions.expand_template( - template = ctx.file._workspace_tmpl, - output = workspace, - substitutions = {"%python_version%": ctx.attr.python_version}, + Args: + name: Only present to satisfy tooling. + """ + for platform_key, platform_info in PLATFORMS.items(): + native.config_setting( + name = "_is_{}".format(platform_key), + constraint_values = platform_info.compatible_with, ) - files.append(workspace) - - build_bazel = ctx.actions.declare_file("/".join([ctx.attr.python_version, "BUILD.bazel"])) - ctx.actions.expand_template( - template = ctx.file._build_bazel_tmpl, - output = build_bazel, - substitutions = {"%python_version%": ctx.attr.python_version}, - ) - files.append(build_bazel) - - python_version_test = ctx.actions.declare_file("/".join([ctx.attr.python_version, "python_version_test.py"])) - ctx.actions.symlink( - target_file = ctx.file._python_version_test, - output = python_version_test, - ) - files.append(python_version_test) - - run_acceptance_test_py = ctx.actions.declare_file("/".join([ctx.attr.python_version, "run_acceptance_test.py"])) - ctx.actions.expand_template( - template = ctx.file._run_acceptance_test_tmpl, - output = run_acceptance_test_py, - substitutions = { - "%is_bzlmod%": str(BZLMOD_ENABLED), - "%is_windows%": str(ctx.attr.is_windows), - "%python_version%": ctx.attr.python_version, - "%test_location%": "/".join([ctx.attr.test_location, ctx.attr.python_version]), - }, - ) - files.append(run_acceptance_test_py) - toolchain = ctx.toolchains[TARGET_TOOLCHAIN_TYPE] - py3_runtime = toolchain.py3_runtime - interpreter_path = py3_runtime.interpreter_path - if not interpreter_path: - interpreter_path = py3_runtime.interpreter.short_path - - if ctx.attr.is_windows: - executable = ctx.actions.declare_file("run_test_{}.bat".format(ctx.attr.python_version)) - ctx.actions.write( - output = executable, - content = _WINDOWS_RUNNER_TEMPLATE.format( - interpreter_path = interpreter_path.replace("../", "external/"), - run_acceptance_test_py = run_acceptance_test_py.short_path, - ), - is_executable = True, - ) - else: - executable = ctx.actions.declare_file("run_test_{}.sh".format(ctx.attr.python_version)) - ctx.actions.write( - output = executable, - content = "exec '{interpreter_path}' '{run_acceptance_test_py}'".format( - interpreter_path = interpreter_path, - run_acceptance_test_py = run_acceptance_test_py.short_path, - ), - is_executable = True, + for python_version, meta in TOOL_VERSIONS.items(): + target_compatible_with = { + "//conditions:default": ["@platforms//:incompatible"], + } + for platform_key in meta["sha256"].keys(): + is_platform = "_is_{}".format(platform_key) + target_compatible_with[is_platform] = [] + + py_reconfig_test( + name = "python_{}_test".format(python_version), + srcs = ["python_toolchain_test.py"], + main = "python_toolchain_test.py", + python_version = python_version, + env = { + "EXPECT_PYTHON_VERSION": python_version, + }, + deps = ["//python/runfiles"], + data = ["//tests/support:current_build_settings"], + target_compatible_with = select(target_compatible_with), ) - files.append(executable) - files.extend(ctx.files._distribution) - - return [DefaultInfo( - executable = executable, - files = depset( - direct = files, - transitive = [py3_runtime.files], - ), - runfiles = ctx.runfiles( - files = files, - transitive_files = py3_runtime.files, - ), - )] - -_acceptance_test = rule( - implementation = _acceptance_test_impl, - doc = "A rule for the toolchain acceptance tests.", - attrs = { - "is_windows": attr.bool( - doc = "(Provided by the macro) Whether this is running under Windows or not.", - mandatory = True, - ), - "python_version": attr.string( - doc = "The Python version to be used when requesting the toolchain.", - mandatory = True, - ), - "test_location": attr.string( - doc = "(Provided by the macro) The value of native.package_name().", - mandatory = True, - ), - "_build_bazel_tmpl": attr.label( - doc = "The BUILD.bazel template.", - allow_single_file = True, - default = Label("//tests/toolchains/workspace_template:BUILD.bazel.tmpl"), - ), - "_distribution": attr.label( - doc = "The rules_python source distribution.", - default = Label("//:distribution"), - ), - "_module_bazel_tmpl": attr.label( - doc = "The MODULE.bazel template.", - allow_single_file = True, - default = Label("//tests/toolchains/workspace_template:MODULE.bazel.tmpl"), - ), - "_python_version_test": attr.label( - doc = "The python_version_test.py used to test the Python version.", - allow_single_file = True, - default = Label("//tests/toolchains/workspace_template:python_version_test.py"), - ), - "_run_acceptance_test_tmpl": attr.label( - doc = "The run_acceptance_test.py template.", - allow_single_file = True, - default = Label("//tests/toolchains:run_acceptance_test.py.tmpl"), - ), - "_workspace_tmpl": attr.label( - doc = "The WORKSPACE template.", - allow_single_file = True, - default = Label("//tests/toolchains/workspace_template:WORKSPACE.tmpl"), - ), - }, - test = True, - toolchains = [TARGET_TOOLCHAIN_TYPE], -) - -def acceptance_test(python_version, **kwargs): - _acceptance_test( - is_windows = select({ - "@bazel_tools//src/conditions:host_windows": True, - "//conditions:default": False, - }), - python_version = python_version, - test_location = native.package_name(), - **kwargs - ) - -# buildifier: disable=unnamed-macro -def acceptance_tests(): - """Creates a matrix of acceptance_test targets for all the toolchains. - """ - for python_version in TOOL_VERSIONS.keys(): - for platform, meta in PLATFORMS.items(): - if platform not in TOOL_VERSIONS[python_version]["sha256"]: - continue - acceptance_test( - name = "python_{python_version}_{platform}_test".format( - python_version = python_version.replace(".", "_"), - platform = platform, - ), - python_version = python_version, - target_compatible_with = meta.compatible_with, - tags = [ - "acceptance-test", - # For some inexplicable reason, these fail locally with - # sandboxing enabled, but not on CI. - "no-sandbox", - ], - ) diff --git a/tests/toolchains/python_toolchain_test.py b/tests/toolchains/python_toolchain_test.py new file mode 100644 index 0000000000..371b252a4a --- /dev/null +++ b/tests/toolchains/python_toolchain_test.py @@ -0,0 +1,28 @@ +import json +import os +import pathlib +import sys +import unittest + +from python.runfiles import runfiles + + +class PythonToolchainTest(unittest.TestCase): + def test_expected_toolchain_matches(self): + expect_version = os.environ["EXPECT_PYTHON_VERSION"] + + rf = runfiles.Create() + settings_path = rf.Rlocation( + "rules_python/tests/support/current_build_settings.json" + ) + settings = json.loads(pathlib.Path(settings_path).read_text()) + + expected = "python_{}".format(expect_version.replace(".", "_")) + self.assertIn(expected, settings["toolchain_label"], str(settings)) + + actual = "{v.major}.{v.minor}.{v.micro}".format(v=sys.version_info) + self.assertEqual(actual, expect_version) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/toolchains/run_acceptance_test.py.tmpl b/tests/toolchains/run_acceptance_test.py.tmpl deleted file mode 100644 index c52e078a32..0000000000 --- a/tests/toolchains/run_acceptance_test.py.tmpl +++ /dev/null @@ -1,90 +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. - -import os -import subprocess -import unittest -import pathlib - -class TestPythonVersion(unittest.TestCase): - @classmethod - def setUpClass(cls): - os.chdir("%test_location%") - test_srcdir = os.environ["TEST_SRCDIR"] - # When bzlmod is enabled, the name of the directory in runfiles changes - # to _main instead of rules_python - if os.path.exists(os.path.join(test_srcdir, "_main")): - rules_python_path = os.path.join(test_srcdir, "_main") - else: - rules_python_path = os.path.join(test_srcdir, "rules_python") - - test_tmpdir = os.environ["TEST_TMPDIR"] - if %is_windows%: - home = os.path.join(test_tmpdir, "HOME") - os.mkdir(home) - os.environ["HOME"] = home - - local_app_data = os.path.join(test_tmpdir, "LocalAppData") - os.mkdir(local_app_data) - os.environ["LocalAppData"] = local_app_data - - # Bazelisk requires a cache directory be set - os.environ["XDG_CACHE_HOME"] = os.path.join(test_tmpdir, "xdg-cache-home") - - # Unset this so this works when called by Bazel's latest Bazel build - # pipeline. It sets the following combination, which interfere with each other: - # * --sandbox_tmpfs_path=/tmp - # * --test_env=USE_BAZEL_VERSION - # * USE_BAZEL_VERSION=/tmp/ - os.environ.pop("USE_BAZEL_VERSION", None) - - bazelrc_lines = [ - "build --test_output=errors", - ] - - if %is_bzlmod%: - bazelrc_lines.extend( - [ - 'build --override_module rules_python="{}"'.format( - rules_python_path.replace("\\", "/") - ), - "common --enable_bzlmod", - ] - ) - else: - bazelrc_lines.extend( - [ - 'build --override_repository rules_python="{}"'.format( - rules_python_path.replace("\\", "/") - ), - "common --noexperimental_enable_bzlmod", - ] - ) - - bazelrc = pathlib.Path(".bazelrc") - bazelrc.write_text(os.linesep.join(bazelrc_lines)) - - def test_match_toolchain(self): - output = subprocess.check_output( - f"bazel run --announce_rc @python//:python3 -- --version", - shell = True, # Shell needed to look up via PATH - text=True, - ).strip() - self.assertEqual(output, "Python %python_version%") - - subprocess.run("bazel test --announce_rc //...", shell=True, check=True) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/toolchains/versions_test.bzl b/tests/toolchains/versions_test.bzl deleted file mode 100644 index b885d228a0..0000000000 --- a/tests/toolchains/versions_test.bzl +++ /dev/null @@ -1,51 +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. - -"""Unit tests for starlark helpers -See https://docs.bazel.build/versions/main/skylark/testing.html#for-testing-starlark-utilities -""" - -load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest") -load("//python:versions.bzl", "MINOR_MAPPING", "TOOL_VERSIONS") - -required_platforms = [ - "x86_64-apple-darwin", - "x86_64-unknown-linux-gnu", -] - -def _smoke_test_impl(ctx): - env = unittest.begin(ctx) - for version in TOOL_VERSIONS.keys(): - platforms = TOOL_VERSIONS[version]["sha256"] - for required_platform in required_platforms: - asserts.true( - env, - required_platform in platforms.keys(), - "Missing platform {} for version {}".format(required_platform, version), - ) - for minor in MINOR_MAPPING: - version = MINOR_MAPPING[minor] - asserts.true( - env, - version in TOOL_VERSIONS.keys(), - "Missing version {} in TOOL_VERSIONS".format(version), - ) - return unittest.end(env) - -# The unittest library requires that we export the test cases as named test rules, -# but their names are arbitrary and don't appear anywhere. -_t0_test = unittest.make(_smoke_test_impl) - -def versions_test_suite(name): - unittest.suite(name, _t0_test) diff --git a/tests/toolchains/workspace_template/BUILD.bazel b/tests/toolchains/workspace_template/BUILD.bazel deleted file mode 100644 index 7f3e7b0370..0000000000 --- a/tests/toolchains/workspace_template/BUILD.bazel +++ /dev/null @@ -1,6 +0,0 @@ -exports_files([ - "BUILD.bazel.tmpl", - "MODULE.bazel.tmpl", - "WORKSPACE.tmpl", - "python_version_test.py", -]) diff --git a/tests/toolchains/workspace_template/BUILD.bazel.tmpl b/tests/toolchains/workspace_template/BUILD.bazel.tmpl deleted file mode 100644 index 4a452096a7..0000000000 --- a/tests/toolchains/workspace_template/BUILD.bazel.tmpl +++ /dev/null @@ -1,9 +0,0 @@ -load("@rules_python//python:defs.bzl", "py_test") - -py_test( - name = "python_version_test", - srcs = ["python_version_test.py"], - env = { - "PYTHON_VERSION": "%python_version%", - }, -) diff --git a/tests/toolchains/workspace_template/MODULE.bazel.tmpl b/tests/toolchains/workspace_template/MODULE.bazel.tmpl deleted file mode 100644 index 9e3a844fa6..0000000000 --- a/tests/toolchains/workspace_template/MODULE.bazel.tmpl +++ /dev/null @@ -1,19 +0,0 @@ -module( - name = "module_test", - version = "0.0.0", - compatibility_level = 1, -) - -bazel_dep(name = "bazel_skylib", version = "1.3.0") -bazel_dep(name = "rules_python", version = "0.0.0") -local_path_override( - module_name = "rules_python", - path = "", -) - -python = use_extension("@rules_python//python/extensions:python.bzl", "python") -python.toolchain( - is_default = True, - python_version = "%python_version%", -) -use_repo(python, "python_versions", python = "python_%python_version%".replace(".", "_")) diff --git a/tests/toolchains/workspace_template/README.md b/tests/toolchains/workspace_template/README.md deleted file mode 100644 index b4d6e6ac41..0000000000 --- a/tests/toolchains/workspace_template/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Toolchains testing WORKSPACE template - -This directory contains templates for generating acceptance tests for the -toolchains. diff --git a/tests/toolchains/workspace_template/WORKSPACE.tmpl b/tests/toolchains/workspace_template/WORKSPACE.tmpl deleted file mode 100644 index 3335f4b063..0000000000 --- a/tests/toolchains/workspace_template/WORKSPACE.tmpl +++ /dev/null @@ -1,41 +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. - -workspace(name = "workspace_test") - -local_repository( - name = "rules_python", - path = "", -) - -load("@rules_python//python:repositories.bzl", "python_register_toolchains", "py_repositories") - -py_repositories() - -python_register_toolchains( - name = "python", - python_version = "%python_version%", -) - -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -http_archive( - name = "bazel_skylib", - urls = [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.1.1/bazel-skylib-1.1.1.tar.gz", - "https://github.com/bazelbuild/bazel-skylib/releases/download/1.1.1/bazel-skylib-1.1.1.tar.gz", - ], - sha256 = "c6966ec828da198c5d9adbaa94c05e3a1c7f21bd012a0b29ba8ddbccb2c93b0d", -) -load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") -bazel_skylib_workspace() diff --git a/tests/toolchains/workspace_template/python_version_test.py b/tests/toolchains/workspace_template/python_version_test.py deleted file mode 100644 index c82611cdab..0000000000 --- a/tests/toolchains/workspace_template/python_version_test.py +++ /dev/null @@ -1,26 +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. - -import os -import platform -import unittest - - -class TestPythonVersion(unittest.TestCase): - def test_match_toolchain(self): - self.assertEqual(platform.python_version(), os.getenv("PYTHON_VERSION")) - - -if __name__ == "__main__": - unittest.main() From 7064f6bef41833533d0b7c3a933b2d62902639b9 Mon Sep 17 00:00:00 2001 From: hunshcn Date: Thu, 1 Aug 2024 16:21:22 +0800 Subject: [PATCH 144/345] fix(gazelle): make gazelle_python_manifest.genrule manual (#2097) Fix https://github.com/bazelbuild/rules_python/issues/2096 --------- Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> --- CHANGELOG.md | 10 ++++++---- gazelle/manifest/defs.bzl | 4 +++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47c6d762d4..a2e60f70db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,10 @@ A brief description of the categories of changes: when the wheel is downloaded using `download_only` feature to aid debugging. * (gazelle): Simplify and make gazelle_python.yaml have only top level package name. It would work well in cases to reduce merge conflicts. +* (toolchains): Change some old toochain versions to use [20240726] release to + include dependency updates `3.8.19`, `3.9.19`, `3.10.14`, `3.11.9` +* (toolchains): Bump default toolchain versions to: + * `3.12 -> 3.12.4` ### Fixed * (rules) Signals are properly received when using {obj}`--bootstrap_impl=script` @@ -49,10 +53,8 @@ A brief description of the categories of changes: * (pip) Correctly use the `sdist` downloaded by the bazel downloader when using `experimental_index_url` feature. Fixes [#2091](https://github.com/bazelbuild/rules_python/issues/2090). -* (toolchains): Change some old toochain versions to use [20240726] release to - include dependency updates `3.8.19`, `3.9.19`, `3.10.14`, `3.11.9` -* (toolchains): Bump default toolchain versions to: - * `3.12 -> 3.12.4` +* (gazelle) Make `gazelle_python_manifest.update` manual to avoid unnecessary + network behavior. ### Added * (rules) `PYTHONSAFEPATH` is inherited from the calling environment to allow diff --git a/gazelle/manifest/defs.bzl b/gazelle/manifest/defs.bzl index 5211b71aab..eacf1c18cf 100644 --- a/gazelle/manifest/defs.bzl +++ b/gazelle/manifest/defs.bzl @@ -95,6 +95,7 @@ def gazelle_python_manifest( modules_mapping, manifest_generator_hash, ] + ([requirements] if requirements else []), + tags = ["manual"], ) py_binary( @@ -109,7 +110,8 @@ def gazelle_python_manifest( generated_manifest, manifest, ], - **kwargs + tags = kwargs.get("tags", []) + ["manual"], + **{k: v for k, v in kwargs.items() if k != "tags"} ) if requirements: From cc76ce06e2c57ddb7e81ef326470e719cebad990 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 12:06:54 +0300 Subject: [PATCH 145/345] build(deps): bump sphinxcontrib-qthelp from 1.0.7 to 2.0.0 in /docs/sphinx (#2101) Bumps [sphinxcontrib-qthelp](https://github.com/sphinx-doc/sphinxcontrib-qthelp) from 1.0.7 to 2.0.0.
Release notes

Sourced from sphinxcontrib-qthelp's releases.

sphinxcontrib-qthelp 2.0.0

Changelog: https://github.com/sphinx-doc/sphinxcontrib-qthelp/blob/master/CHANGES.rst

sphinxcontrib-qthelp 1.0.8

Changelog: https://www.sphinx-doc.org/en/master/changes.html

Changelog

Sourced from sphinxcontrib-qthelp's changelog.

Release 2.0.0 (2024-07-28)

  • Adopt Ruff
  • Tighten MyPy settings
  • Update GitHub actions versions

Release 1.0.8 (2024-07-20)

  • Fix tests for Sphinx 7.4 and later.
Commits
  • 783caf5 Bump to 2.0.0
  • bd5e685 Update CHANGES links
  • 0f81faf Rename LICENSE to LICENCE.rst
  • 882d53f Rename CHANGES to CHANGES.rst
  • 1fe2948 Run CI with Python 3.12 releases
  • 7d2d940 Run mypy without command-line options
  • cce4542 Use the latest GitHub actions versions
  • cfbca5f Enable GitHub's dependabot package update service
  • b49ad58 Adopt Ruff and use stricter MyPy settings
  • dc9a501 Update .gitignore
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sphinxcontrib-qthelp&package-manager=pip&previous-version=1.0.7&new-version=2.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/sphinx/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/sphinx/requirements.txt b/docs/sphinx/requirements.txt index ae7521e971..23c2dd5d2c 100644 --- a/docs/sphinx/requirements.txt +++ b/docs/sphinx/requirements.txt @@ -323,9 +323,9 @@ sphinxcontrib-jsmath==1.0.1 \ --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 \ --hash=sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8 # via sphinx -sphinxcontrib-qthelp==1.0.7 \ - --hash=sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6 \ - --hash=sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182 +sphinxcontrib-qthelp==2.0.0 \ + --hash=sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab \ + --hash=sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb # via sphinx sphinxcontrib-serializinghtml==1.1.10 \ --hash=sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7 \ From fa13b0138924245c55f79922509e4688f252ff71 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 2 Aug 2024 11:35:46 +0300 Subject: [PATCH 146/345] test(toolchain): use flag_values in test platform defs (#2106) This PR uses the `flag_values` from the platform definitions for the toolchains so that in the future we can distinguish between `musl` and `glibc` toolchains in our tests. For now the change is no-op. As part of this change we are also registering the coverage tools so that we can run `bazel coverage` with no errors. See comment on #2095. --- tests/toolchains/defs.bzl | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/toolchains/defs.bzl b/tests/toolchains/defs.bzl index 076e6b42eb..fbb70820c9 100644 --- a/tests/toolchains/defs.bzl +++ b/tests/toolchains/defs.bzl @@ -26,6 +26,7 @@ def define_toolchain_tests(name): for platform_key, platform_info in PLATFORMS.items(): native.config_setting( name = "_is_{}".format(platform_key), + flag_values = platform_info.flag_values, constraint_values = platform_info.compatible_with, ) From 79478def6ed362f18aadeb5996773f73f1289a67 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Tue, 6 Aug 2024 19:33:20 +0300 Subject: [PATCH 147/345] fix(bzlmod): silence duplicate version registrations (#2111) Before this PR we would warn when non-root modules register interpreter versions and the owners of root modules would have no way to silence the warning except for patching rules_python. This PR reduces the default verbosity of the warning to INFO to avoid spamming users by default. Fixes #1818. --- CHANGELOG.md | 4 ++++ python/private/BUILD.bazel | 1 + python/private/python.bzl | 18 +++++++++--------- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2e60f70db..5f11f7d2cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,10 @@ A brief description of the categories of changes: [#2091](https://github.com/bazelbuild/rules_python/issues/2090). * (gazelle) Make `gazelle_python_manifest.update` manual to avoid unnecessary network behavior. +* (bzlmod): The conflicting toolchains during `python` extension will no longer + cause warnings by default. In order to see the warnings for diagnostic purposes + set the env var `RULES_PYTHON_REPO_DEBUG_VERBOSITY` to one of `INFO`, `DEBUG` or `TRACE`. + Fixes [#1818](https://github.com/bazelbuild/rules_python/issues/1818). ### Added * (rules) `PYTHONSAFEPATH` is inherited from the calling environment to allow diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 3b97a02ed9..146e934654 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -132,6 +132,7 @@ bzl_library( srcs = ["python.bzl"], deps = [ ":pythons_hub_bzl", + ":repo_utils_bzl", ":toolchains_repo_bzl", ":util_bzl", "//python:repositories_bzl", diff --git a/python/private/python.bzl b/python/private/python.bzl index ce00a7bb74..6a265d1395 100644 --- a/python/private/python.bzl +++ b/python/private/python.bzl @@ -17,6 +17,7 @@ load("@bazel_features//:features.bzl", "bazel_features") load("//python:repositories.bzl", "python_register_toolchains") load("//python:versions.bzl", "TOOL_VERSIONS") +load("//python/private:repo_utils.bzl", "repo_utils") load(":pythons_hub.bzl", "hub_repo") load(":text_util.bzl", "render") load(":toolchains_repo.bzl", "multi_toolchain_aliases") @@ -27,12 +28,6 @@ load(":util.bzl", "IS_BAZEL_6_4_OR_HIGHER") _MAX_NUM_TOOLCHAINS = 9999 _TOOLCHAIN_INDEX_PAD_LENGTH = len(str(_MAX_NUM_TOOLCHAINS)) -# Printing a warning msg not debugging, so we have to disable -# the buildifier check. -# buildifier: disable=print -def _print_warn(msg): - print("WARNING:", msg) - def _python_register_toolchains(name, toolchain_attr, module, ignore_root_user_error): """Calls python_register_toolchains and returns a struct used to collect the toolchains. """ @@ -71,6 +66,8 @@ def _python_impl(module_ctx): ignore_root_user_error = None + logger = repo_utils.logger(module_ctx, "python") + # if the root module does not register any toolchain then the # ignore_root_user_error takes its default value: False if not module_ctx.modules[0].tags.toolchain: @@ -131,11 +128,14 @@ def _python_impl(module_ctx): # version that rules_python provides as default. first = global_toolchain_versions[toolchain_version] if mod.name != "rules_python" or not first.module.is_root: + # The warning can be enabled by setting the verbosity: + # env RULES_PYTHON_REPO_DEBUG_VERBOSITY=INFO bazel build //... _warn_duplicate_global_toolchain_version( toolchain_version, first = first, second_toolchain_name = toolchain_name, second_module_name = mod.name, + logger = logger, ) toolchain_info = None else: @@ -231,11 +231,11 @@ def _fail_duplicate_module_toolchain_version(version, module): module = module, )) -def _warn_duplicate_global_toolchain_version(version, first, second_toolchain_name, second_module_name): - _print_warn(( +def _warn_duplicate_global_toolchain_version(version, first, second_toolchain_name, second_module_name, logger): + logger.info(lambda: ( "Ignoring toolchain '{second_toolchain}' from module '{second_module}': " + "Toolchain '{first_toolchain}' from module '{first_module}' " + - "already registered Python version {version} and has precedence" + "already registered Python version {version} and has precedence." ).format( first_toolchain = first.name, first_module = first.module.name, From 3b183bfedd3dd6a5bb42c77531079e347165441d Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sat, 10 Aug 2024 15:35:33 -0700 Subject: [PATCH 148/345] docs: docgen underlying rules for macro-wrapped rules (#2107) Rules that have a wrapper macro don't currently show all their attributes because the macro hides the rule from stardoc. This also generates docs for the underlying rules and has the macro reference them so that users can find all the attributes the rule accepts. --------- Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> --- docs/sphinx/BUILD.bazel | 4 ++++ python/private/common/py_runtime_rule.bzl | 2 +- python/py_binary.bzl | 15 +++++++++++++-- python/py_library.bzl | 14 ++++++++++++-- python/py_runtime.bzl | 15 +++++++++++++-- python/py_test.bzl | 15 +++++++++++++-- 6 files changed, 56 insertions(+), 9 deletions(-) diff --git a/docs/sphinx/BUILD.bazel b/docs/sphinx/BUILD.bazel index f82d43a45a..fe0da1f3bd 100644 --- a/docs/sphinx/BUILD.bazel +++ b/docs/sphinx/BUILD.bazel @@ -86,6 +86,10 @@ sphinx_stardocs( "api/python/entry_points/py_console_script_binary.md": "//python/entry_points:py_console_script_binary_bzl", "api/python/packaging.md": "//python:packaging_bzl", "api/python/pip.md": "//python:pip_bzl", + "api/python/private/common/py_binary_rule_bazel.md": "//python/private/common:py_binary_rule_bazel_bzl", + "api/python/private/common/py_library_rule_bazel.md": "//python/private/common:py_library_rule_bazel_bzl", + "api/python/private/common/py_runtime_rule.md": "//python/private/common:py_runtime_rule_bzl", + "api/python/private/common/py_test_rule_bazel.md": "//python/private/common:py_test_rule_bazel_bzl", "api/python/py_binary.md": "//python:py_binary_bzl", "api/python/py_cc_link_params_info.md": "//python:py_cc_link_params_info_bzl", "api/python/py_library.md": "//python:py_library_bzl", diff --git a/python/private/common/py_runtime_rule.bzl b/python/private/common/py_runtime_rule.bzl index a7eeb7e3ec..e0b5fb2313 100644 --- a/python/private/common/py_runtime_rule.bzl +++ b/python/private/common/py_runtime_rule.bzl @@ -160,7 +160,7 @@ in-build runtime may or may not be hermetic, depending on whether it points to a checked-in interpreter or a wrapper script that accesses the system interpreter. -# Example +Example ``` load("@rules_python//python:py_runtime.bzl", "py_runtime") diff --git a/python/py_binary.bzl b/python/py_binary.bzl index ed63ebefed..f7f68e6045 100644 --- a/python/py_binary.bzl +++ b/python/py_binary.bzl @@ -23,10 +23,21 @@ load("//python/private/common:py_binary_macro_bazel.bzl", _starlark_py_binary = _py_binary_impl = _starlark_py_binary if config.enable_pystar else native.py_binary def py_binary(**attrs): - """See the Bazel core [py_binary](https://docs.bazel.build/versions/master/be/python.html#py_binary) documentation. + """Creates an executable Python program. + + This is the public macro wrapping the underlying rule. Args are forwarded + on as-is unless otherwise specified. See + the underlying {bzl:obj}`py_binary rule` + for detailed attribute documentation. + + This macro affects the following args: + * `python_version`: cannot be `PY2` + * `srcs_version`: cannot be `PY2` or `PY2ONLY` + * `tags`: May have special marker values added, if not already present. Args: - **attrs: Rule attributes + **attrs: Rule attributes forwarded onto the underlying + {bzl:obj}`py_binary rule` """ if attrs.get("python_version") == "PY2": fail("Python 2 is no longer supported: https://github.com/bazelbuild/rules_python/issues/886") diff --git a/python/py_library.bzl b/python/py_library.bzl index 2aa797a13e..3b9ddd1aa4 100644 --- a/python/py_library.bzl +++ b/python/py_library.bzl @@ -23,10 +23,20 @@ load("//python/private/common:py_library_macro_bazel.bzl", _starlark_py_library _py_library_impl = _starlark_py_library if config.enable_pystar else native.py_library def py_library(**attrs): - """See the Bazel core [py_library](https://docs.bazel.build/versions/master/be/python.html#py_library) documentation. + """Creates an executable Python program. + + This is the public macro wrapping the underlying rule. Args are forwarded + on as-is unless otherwise specified. See + {bzl:obj}`py_library ` + for detailed attribute documentation. + + This macro affects the following args: + * `srcs_version`: cannot be `PY2` or `PY2ONLY` + * `tags`: May have special marker values added, if not already present. Args: - **attrs: Rule attributes + **attrs: Rule attributes forwarded onto + {bzl:obj}`py_library ` """ if attrs.get("srcs_version") in ("PY2", "PY2ONLY"): fail("Python 2 is no longer supported: https://github.com/bazelbuild/rules_python/issues/886") diff --git a/python/py_runtime.bzl b/python/py_runtime.bzl index d4b913df2e..9c8cd00dd9 100644 --- a/python/py_runtime.bzl +++ b/python/py_runtime.bzl @@ -21,10 +21,21 @@ load("//python/private/common:py_runtime_macro.bzl", _starlark_py_runtime = "py_ _py_runtime_impl = _starlark_py_runtime if IS_BAZEL_6_OR_HIGHER else native.py_runtime def py_runtime(**attrs): - """See the Bazel core [py_runtime](https://docs.bazel.build/versions/master/be/python.html#py_runtime) documentation. + """Creates an executable Python program. + + This is the public macro wrapping the underlying rule. Args are forwarded + on as-is unless otherwise specified. See + {bzl:obj}`py_runtime ` + for detailed attribute documentation. + + This macro affects the following args: + * `python_version`: cannot be `PY2` + * `srcs_version`: cannot be `PY2` or `PY2ONLY` + * `tags`: May have special marker values added, if not already present. Args: - **attrs: Rule attributes + **attrs: Rule attributes forwarded onto + {bzl:obj}`py_runtime ` """ if attrs.get("python_version") == "PY2": fail("Python 2 is no longer supported: see https://github.com/bazelbuild/rules_python/issues/886") diff --git a/python/py_test.bzl b/python/py_test.bzl index f58f067e30..8f93b270ff 100644 --- a/python/py_test.bzl +++ b/python/py_test.bzl @@ -23,10 +23,21 @@ load("//python/private/common:py_test_macro_bazel.bzl", _starlark_py_test = "py_ _py_test_impl = _starlark_py_test if config.enable_pystar else native.py_test def py_test(**attrs): - """See the Bazel core [py_test](https://docs.bazel.build/versions/master/be/python.html#py_test) documentation. + """Creates an executable Python program. + + This is the public macro wrapping the underlying rule. Args are forwarded + on as-is unless otherwise specified. See + {bzl:obj}`py_test ` + for detailed attribute documentation. + + This macro affects the following args: + * `python_version`: cannot be `PY2` + * `srcs_version`: cannot be `PY2` or `PY2ONLY` + * `tags`: May have special marker values added, if not already present. Args: - **attrs: Rule attributes + **attrs: Rule attributes forwarded onto + {bzl:obj}`py_test ` """ if attrs.get("python_version") == "PY2": fail("Python 2 is no longer supported: https://github.com/bazelbuild/rules_python/issues/886") From 825acde67a1416d13a08aba4a0d72a9b2e3c2ab0 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 11 Aug 2024 02:57:53 -0700 Subject: [PATCH 149/345] fix: make versioned rules return both builtin and rules_python providers (#2116) This makes the versioned rules return both the `@builtin` and `@rules_python` provider objects. This makes the versioned rules more compatible with the non-versioned rules. Fixes https://github.com/bazelbuild/rules_python/issues/2114 --- CHANGELOG.md | 3 ++ python/config_settings/transition.bzl | 28 ++++++------------- .../transition/multi_version_tests.bzl | 8 ++++-- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f11f7d2cc..a1ff57277a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,9 @@ A brief description of the categories of changes: * (rules) User dependencies come before runtime site-packages when using {obj}`--bootstrap_impl=script`. ([#2064](https://github.com/bazelbuild/rules_python/issues/2064)). +* (rules) Version-aware rules now return both `@_builtins` and `@rules_python` + providers instead of only one. + ([#2114](https://github.com/bazelbuild/rules_python/issues/2114)). * (pip) Fixed pypi parse_simpleapi_html function for feeds with package metadata containing ">" sign * (toolchains) Added missing executable permission to diff --git a/python/config_settings/transition.bzl b/python/config_settings/transition.bzl index da48a1fdb3..7ac41f881f 100644 --- a/python/config_settings/transition.bzl +++ b/python/config_settings/transition.bzl @@ -81,31 +81,12 @@ def _transition_py_impl(ctx): for k, v in ctx.attr.env.items(): env[k] = ctx.expand_location(v) - if PyInfo in target: - py_info = target[PyInfo] - elif BuiltinPyInfo in target: - py_info = target[BuiltinPyInfo] - else: - fail("target {} does not have rules_python PyInfo or builtin PyInfo".format(target)) - - if PyRuntimeInfo in target: - py_runtime_info = target[PyRuntimeInfo] - elif BuiltinPyRuntimeInfo in target: - py_runtime_info = target[BuiltinPyRuntimeInfo] - else: - fail( - "target {} does not have rules_python PyRuntimeInfo or builtin PyRuntimeInfo. ".format(target) + - "There is likely no toolchain being matched to your configuration, use --toolchain_resolution_debug parameter to get more information", - ) - providers = [ DefaultInfo( executable = executable, files = depset(default_outputs, transitive = [target[DefaultInfo].files]), runfiles = ctx.runfiles(default_outputs).merge(target[DefaultInfo].default_runfiles), ), - py_info, - py_runtime_info, # Ensure that the binary we're wrapping is included in code coverage. coverage_common.instrumented_files_info( ctx, @@ -118,6 +99,15 @@ def _transition_py_impl(ctx): # https://github.com/bazelbuild/bazel/commit/dbdfa07e92f99497be9c14265611ad2920161483 testing.TestEnvironment(env), ] + if PyInfo in target: + providers.append(target[PyInfo]) + if BuiltinPyInfo in target and PyInfo != BuiltinPyInfo: + providers.append(target[BuiltinPyInfo]) + + if PyRuntimeInfo in target: + providers.append(target[PyRuntimeInfo]) + if BuiltinPyRuntimeInfo in target and PyRuntimeInfo != BuiltinPyRuntimeInfo: + providers.append(target[BuiltinPyRuntimeInfo]) return providers _COMMON_ATTRS = { diff --git a/tests/config_settings/transition/multi_version_tests.bzl b/tests/config_settings/transition/multi_version_tests.bzl index e35590bbb6..6659da574c 100644 --- a/tests/config_settings/transition/multi_version_tests.bzl +++ b/tests/config_settings/transition/multi_version_tests.bzl @@ -16,7 +16,9 @@ load("@rules_testing//lib:analysis_test.bzl", "analysis_test") load("@rules_testing//lib:test_suite.bzl", "test_suite") load("@rules_testing//lib:util.bzl", "TestingAspectInfo", rt_util = "util") +load("//python:py_info.bzl", "PyInfo") load("//python/config_settings:transition.bzl", py_binary_transitioned = "py_binary", py_test_transitioned = "py_test") +load("//python/private:reexports.bzl", "BuiltinPyInfo") # buildifier: disable=bzl-visibility load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility # NOTE @aignas 2024-06-04: we are using here something that is registered in the MODULE.Bazel @@ -45,7 +47,8 @@ def _test_py_test_with_transition(name): def _test_py_test_with_transition_impl(env, target): # Nothing to assert; we just want to make sure it builds - _ = env, target # @unused + env.expect.that_target(target).has_provider(PyInfo) + env.expect.that_target(target).has_provider(BuiltinPyInfo) _tests.append(_test_py_test_with_transition) @@ -65,7 +68,8 @@ def _test_py_binary_with_transition(name): def _test_py_binary_with_transition_impl(env, target): # Nothing to assert; we just want to make sure it builds - _ = env, target # @unused + env.expect.that_target(target).has_provider(PyInfo) + env.expect.that_target(target).has_provider(BuiltinPyInfo) _tests.append(_test_py_binary_with_transition) From 5d2782970cef1b2b2cae9a82620ad7a1f3d27782 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 13 Aug 2024 13:00:31 -0700 Subject: [PATCH 150/345] tests: fix example bzlmod coverage test for latest Bazel (#2119) Bazel is changing its separate character from tilde (`~`) to plus (`+`) to address a performance issue on Windows. The test was using tilde to help match files of interest. To fix, have the test look for either tilde or plus. Fixes https://github.com/bazelbuild/rules_python/issues/2105 --- examples/bzlmod/test.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/bzlmod/test.py b/examples/bzlmod/test.py index 950c002919..24be3ba3fe 100644 --- a/examples/bzlmod/test.py +++ b/examples/bzlmod/test.py @@ -71,10 +71,10 @@ def test_coverage_sys_path(self): first_coverage_index = None last_user_dep_index = None for i, path in enumerate(sys.path): - if re.search("rules_python.*~pip~", path): + if re.search("rules_python.*[~+]pip[~+]", path): last_user_dep_index = i if first_coverage_index is None and re.search( - ".*rules_python.*~python~.*coverage.*", path + ".*rules_python.*[~+]python[~+].*coverage.*", path ): first_coverage_index = i @@ -85,8 +85,8 @@ def test_coverage_sys_path(self): + f"it was not found.\nsys.path:\n{all_paths}", ) self.assertIsNotNone( - first_coverage_index, - "Expected to find at least one uiser dep, " + last_user_dep_index, + "Expected to find at least one user dep, " + "but none were found.\nsys.path:\n{all_paths}", ) # we are running under the 'bazel coverage :test' From 4f97f1a4fcb86410e078c020397a139b1912a31b Mon Sep 17 00:00:00 2001 From: Nicholas Junge Date: Wed, 14 Aug 2024 21:32:01 +0200 Subject: [PATCH 151/345] fix: Fix up search path of bootstrapped Python toolchain dylib (#2089) Previously, `//tests/cc/current_py_cc_libs::python_libs_linking_test` failed on macOS because the bootstrapped toolchain's dylib had an incorrect LC_ID_DYLIB field set, pointing to a local directory on the Python standalone build host machine. To fix, add a small conditional to the Python repository rule patching the LC_ID_DYLIB field of the bootstrapped Python's dylib with its fully qualified file system path. Patching is carried out with macOS's own `install_name_tool`, which is part of the standard macOS dynamic linking toolchain. Qualifies the mentioned test as executable on Mac, now only Windows linker errors are left to fix. --- CHANGELOG.md | 4 ++++ python/private/python_repositories.bzl | 16 ++++++++++++++++ tests/cc/current_py_cc_libs/BUILD.bazel | 12 +++++++----- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1ff57277a..edf01f798f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,10 @@ A brief description of the categories of changes: * `3.12 -> 3.12.4` ### Fixed +* (rules) Fixes build targets linking against `@rules_python//python/cc:current_py_cc_libs` + in host platform builds on macOS, by editing the `LC_ID_DYLIB` field of the hermetic interpreter's + `libpython3.x.dylib` using `install_name_tool`, setting it to its absolute path under Bazel's + execroot. * (rules) Signals are properly received when using {obj}`--bootstrap_impl=script` (for non-zip builds). ([#2043](https://github.com/bazelbuild/rules_python/issues/2043)) diff --git a/python/private/python_repositories.bzl b/python/private/python_repositories.bzl index ea3dd3533f..25d8a96b79 100644 --- a/python/private/python_repositories.bzl +++ b/python/private/python_repositories.bzl @@ -191,6 +191,22 @@ def _python_repository_impl(rctx): elif rctx.attr.distutils_content: rctx.file(distutils_path, rctx.attr.distutils_content) + if "darwin" in platform and "osx" == repo_utils.get_platforms_os_name(rctx): + # Fix up the Python distribution's LC_ID_DYLIB field. + # It points to a build directory local to the GitHub Actions + # host machine used in the Python standalone build, which causes + # dyld lookup errors. To fix, set the full path to the dylib as + # it appears in the Bazel workspace as its LC_ID_DYLIB using + # the `install_name_tool` bundled with macOS. + dylib = "lib/libpython{}.dylib".format(python_short_version) + full_dylib_path = rctx.path(dylib) + repo_utils.execute_checked( + rctx, + op = "python_repository.FixUpDyldIdPath", + arguments = [repo_utils.which_checked(rctx, "install_name_tool"), "-id", full_dylib_path, dylib], + logger = logger, + ) + # Make the Python installation read-only. This is to prevent issues due to # pycs being generated at runtime: # * The pycs are not deterministic (they contain timestamps) diff --git a/tests/cc/current_py_cc_libs/BUILD.bazel b/tests/cc/current_py_cc_libs/BUILD.bazel index fb61435d37..218055532e 100644 --- a/tests/cc/current_py_cc_libs/BUILD.bazel +++ b/tests/cc/current_py_cc_libs/BUILD.bazel @@ -20,12 +20,14 @@ current_py_cc_libs_test_suite(name = "current_py_cc_libs_tests") cc_test( name = "python_libs_linking_test", srcs = ["python_libs_linking_test.cc"], - # Mac and Windows fail with linking errors, but its not clear why; someone - # with more C + Mac/Windows experience will have to figure it out. + # 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 = [ - "@platforms//os:linux", - ], + 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", From d69559de837771c8d5c72bf8aef3846e8f40b3ab Mon Sep 17 00:00:00 2001 From: WSUFan Date: Thu, 15 Aug 2024 02:13:40 -0700 Subject: [PATCH 152/345] fix: correctly handle absolute URLs in parse_simpleapi_html.bzl (#2112) This PR addresses a typo and improves the handling of absolute URLs in the `parse_simpleapi_html.bzl` file and corrects a minor issue in the `simpleapi_download.bzl` file. Summary: 1. parse_simpleapi_html.bzl: - Introduced a new private function `_get_root_directory(url)` to extract the root directory from a given URL. - Enhanced `_absolute_url` function to correctly handle absolute URLs by utilizing the `_get_root_directory` function. This ensures that URLs starting with a "/" are correctly resolved to their full path, avoiding potential incorrect concatenation. 2. simpleapi_download.bzl: Corrected the handling of the `real_url` variable in the `_read_simpleapi` function, ensuring that the correct URL is passed to `_read_index_result` when using non-blocking downloads. --- CHANGELOG.md | 1 + python/private/pypi/parse_simpleapi_html.bzl | 18 ++++++++++ python/private/pypi/simpleapi_download.bzl | 4 +-- .../parse_simpleapi_html_tests.bzl | 34 +++++++++++++++++++ 4 files changed, 55 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index edf01f798f..c87e76e5be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ A brief description of the categories of changes: * `3.12 -> 3.12.4` ### Fixed +* (rules) correctly handle absolute URLs in parse_simpleapi_html.bzl. * (rules) Fixes build targets linking against `@rules_python//python/cc:current_py_cc_libs` in host platform builds on macOS, by editing the `LC_ID_DYLIB` field of the hermetic interpreter's `libpython3.x.dylib` using `install_name_tool`, setting it to its absolute path under Bazel's diff --git a/python/private/pypi/parse_simpleapi_html.bzl b/python/private/pypi/parse_simpleapi_html.bzl index 248846922f..81ee385f86 100644 --- a/python/private/pypi/parse_simpleapi_html.bzl +++ b/python/private/pypi/parse_simpleapi_html.bzl @@ -96,7 +96,25 @@ def parse_simpleapi_html(*, url, content): whls = whls, ) +def _get_root_directory(url): + scheme_end = url.find("://") + if scheme_end == -1: + fail("Invalid URL format") + + scheme = url[:scheme_end] + host_end = url.find("/", scheme_end + 3) + if host_end == -1: + host_end = len(url) + host = url[scheme_end + 3:host_end] + + return "{}://{}".format(scheme, host) + def _absolute_url(index_url, candidate): + if candidate.startswith("/"): + # absolute url + root_directory = _get_root_directory(index_url) + return "{}{}".format(root_directory, candidate) + if not candidate.startswith(".."): return candidate diff --git a/python/private/pypi/simpleapi_download.bzl b/python/private/pypi/simpleapi_download.bzl index b258fef07a..c730c20439 100644 --- a/python/private/pypi/simpleapi_download.bzl +++ b/python/private/pypi/simpleapi_download.bzl @@ -185,10 +185,10 @@ def _read_simpleapi(ctx, url, attr, cache, **download_kwargs): if download_kwargs.get("block") == False: # Simulate the same API as ctx.download has return struct( - wait = lambda: _read_index_result(ctx, download.wait(), output, url, cache, cache_key), + wait = lambda: _read_index_result(ctx, download.wait(), output, real_url, cache, cache_key), ) - return _read_index_result(ctx, download, output, url, cache, cache_key) + return _read_index_result(ctx, download, output, real_url, cache, cache_key) def _read_index_result(ctx, result, output, url, cache, cache_key): if not result.success: diff --git a/tests/pypi/parse_simpleapi_html/parse_simpleapi_html_tests.bzl b/tests/pypi/parse_simpleapi_html/parse_simpleapi_html_tests.bzl index a532e878a7..aa735b83d8 100644 --- a/tests/pypi/parse_simpleapi_html/parse_simpleapi_html_tests.bzl +++ b/tests/pypi/parse_simpleapi_html/parse_simpleapi_html_tests.bzl @@ -221,6 +221,40 @@ def _test_whls(env): yanked = False, ), ), + ( + struct( + attrs = [ + 'href="/whl/torch-2.0.0-cp38-cp38-manylinux2014_aarch64.whl#sha256=deadbeef"', + ], + filename = "torch-2.0.0-cp38-cp38-manylinux2014_aarch64.whl", + url = "https://download.pytorch.org/whl/cpu/torch", + ), + struct( + filename = "torch-2.0.0-cp38-cp38-manylinux2014_aarch64.whl", + metadata_sha256 = "", + metadata_url = "", + sha256 = "deadbeef", + url = "https://download.pytorch.org/whl/torch-2.0.0-cp38-cp38-manylinux2014_aarch64.whl", + yanked = False, + ), + ), + ( + struct( + attrs = [ + 'href="/whl/torch-2.0.0-cp38-cp38-manylinux2014_aarch64.whl#sha256=notdeadbeef"', + ], + filename = "torch-2.0.0-cp38-cp38-manylinux2014_aarch64.whl", + url = "http://download.pytorch.org/whl/cpu/torch", + ), + struct( + filename = "torch-2.0.0-cp38-cp38-manylinux2014_aarch64.whl", + metadata_sha256 = "", + metadata_url = "", + sha256 = "notdeadbeef", + url = "http://download.pytorch.org/whl/torch-2.0.0-cp38-cp38-manylinux2014_aarch64.whl", + yanked = False, + ), + ), ] for (input, want) in tests: From 905af697d68e4a87d037a721b385f4d26f8ba848 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 15 Aug 2024 02:14:12 -0700 Subject: [PATCH 153/345] docs: move Sphinx object inventory for Bazel under sphinxdocs (#2117) This moves the inventory file for Bazel objects under the sphinxdocs directory. Inventory files are the manifest of things that can be cross referenced from some external source. They're moved under sphinxdocs since these are about Bazel in general and aren't specific to rules_python. --- docs/sphinx/BUILD.bazel | 10 ++------- sphinxdocs/inventories/BUILD.bazel | 22 +++++++++++++++++++ .../inventories}/bazel_inventory.txt | 2 +- sphinxdocs/tests/sphinx_stardoc/BUILD.bazel | 2 +- 4 files changed, 26 insertions(+), 10 deletions(-) create mode 100644 sphinxdocs/inventories/BUILD.bazel rename {docs/sphinx => sphinxdocs/inventories}/bazel_inventory.txt (97%) diff --git a/docs/sphinx/BUILD.bazel b/docs/sphinx/BUILD.bazel index fe0da1f3bd..b582606ab6 100644 --- a/docs/sphinx/BUILD.bazel +++ b/docs/sphinx/BUILD.bazel @@ -17,7 +17,7 @@ load("//python:pip.bzl", "compile_pip_requirements") load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility load("//sphinxdocs:readthedocs.bzl", "readthedocs_install") -load("//sphinxdocs:sphinx.bzl", "sphinx_build_binary", "sphinx_docs", "sphinx_inventory") +load("//sphinxdocs:sphinx.bzl", "sphinx_build_binary", "sphinx_docs") load("//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardocs") # We only build for Linux and Mac because: @@ -38,7 +38,6 @@ _TARGET_COMPATIBLE_WITH = select({ sphinx_docs( name = "docs", srcs = [ - ":bazel_inventory", ":bzl_api_docs", ] + glob( include = [ @@ -60,6 +59,7 @@ sphinx_docs( renamed_srcs = { "//:CHANGELOG.md": "changelog.md", "//:CONTRIBUTING.md": "contributing.md", + "//sphinxdocs/inventories:bazel_inventory": "bazel_inventory.inv", }, sphinx = ":sphinx-build", strip_prefix = package_name() + "/", @@ -67,12 +67,6 @@ sphinx_docs( target_compatible_with = _TARGET_COMPATIBLE_WITH, ) -sphinx_inventory( - name = "bazel_inventory", - src = "bazel_inventory.txt", - visibility = ["//:__subpackages__"], -) - sphinx_stardocs( name = "bzl_api_docs", docs = { diff --git a/sphinxdocs/inventories/BUILD.bazel b/sphinxdocs/inventories/BUILD.bazel new file mode 100644 index 0000000000..9ed7698cdf --- /dev/null +++ b/sphinxdocs/inventories/BUILD.bazel @@ -0,0 +1,22 @@ +# 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("//sphinxdocs:sphinx.bzl", "sphinx_inventory") + +# Inventory for the current Bazel version +sphinx_inventory( + name = "bazel_inventory", + src = "bazel_inventory.txt", + visibility = ["//visibility:public"], +) diff --git a/docs/sphinx/bazel_inventory.txt b/sphinxdocs/inventories/bazel_inventory.txt similarity index 97% rename from docs/sphinx/bazel_inventory.txt rename to sphinxdocs/inventories/bazel_inventory.txt index c4aaabc074..a7f0222324 100644 --- a/docs/sphinx/bazel_inventory.txt +++ b/sphinxdocs/inventories/bazel_inventory.txt @@ -10,7 +10,7 @@ bool bzl:type 1 rules/lib/bool - int bzl:type 1 rules/lib/int - depset bzl:type 1 rules/lib/depset - dict bzl:type 1 rules/lib/dict - -label bzl:type 1 concepts/labels - +label bzl:doc 1 concepts/labels - attr.bool bzl:type 1 rules/lib/toplevel/attr#bool - attr.int bzl:type 1 rules/lib/toplevel/attr#int - attr.label bzl:type 1 rules/lib/toplevel/attr#label - diff --git a/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel b/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel index b03561b9ba..b141e5f0fc 100644 --- a/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel +++ b/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel @@ -15,7 +15,7 @@ sphinx_docs( "html", ], renamed_srcs = { - "//docs/sphinx:bazel_inventory": "bazel_inventory.inv", + "//sphinxdocs/inventories:bazel_inventory": "bazel_inventory.inv", }, sphinx = ":sphinx-build", strip_prefix = package_name() + "/", From 519574ca7fb9892524d86b6acaac5b550a7b6df5 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Thu, 15 Aug 2024 22:11:50 +0300 Subject: [PATCH 154/345] feat(pypi): support env markers in requirements files (#2059) Before this change the `all_requirements` and related constants will have packages that need to be installed only on specific platforms and will mean that users relying on those constants (e.g. `gazelle`) will need to do extra work to exclude platform-specific packages. The package managers that that support outputting such files now include `uv` and `pdm`. This might be also useful in cases where we attempt to handle non-requirements lock files. Note, that the best way to handle this would be to move all of the requirements parsing code to Python, but that may cause regressions as it is a much bigger change. This is only changing the code so that we are doing extra processing for the requirement lines that have env markers. The lines that have no markers will not see any change in the code execution paths and the python interpreter will not be downloaded. We also use the `*_ctx.watch` API where available to correctly re-evaluate the markers if the `packaging` Python sources for this change. Extra changes that are included in this PR: - Extend the `repo_utils` to have a method for `arch` getting from the `ctx`. - Change the `local_runtime_repo` to perform the validation not relying on the implementation detail of the `get_platforms_os_name`. - Add `$(UV)` make variable for the `uv:current_toolchain` so that we can generate the requirements for `sphinx` using `uv`. - Swap the requirement generation using `genrule` and `uv` for `sphinx` and co so that we can test the `requirement` marker code. Note, the `requirement` markers are not working well with the `requirement_cycles`. Fixes #1105. Fixes #1868. Work towards #260, #1975. Related #1663. --------- Co-authored-by: Richard Levasseur --- .bazelrc | 4 +- CHANGELOG.md | 7 +- MODULE.bazel | 14 +-- WORKSPACE | 10 -- docs/sphinx/BUILD.bazel | 70 ++++++++++- docs/sphinx/requirements.txt | 54 ++++---- python/private/pypi/BUILD.bazel | 11 ++ python/private/pypi/evaluate_markers.bzl | 77 ++++++++++++ python/private/pypi/extension.bzl | 30 +++++ python/private/pypi/parse_requirements.bzl | 30 ++++- python/private/pypi/pip_repository.bzl | 15 +++ python/private/pypi/pypi_repo_utils.bzl | 75 ++++++++--- .../pypi/requirements_parser/BUILD.bazel | 0 .../resolve_target_platforms.py | 63 ++++++++++ python/private/repo_utils.bzl | 116 ++++++++++-------- tests/pypi/evaluate_markers/BUILD.bazel | 7 ++ .../parse_requirements_tests.bzl | 65 ++++++++++ 17 files changed, 515 insertions(+), 133 deletions(-) create mode 100644 python/private/pypi/evaluate_markers.bzl create mode 100644 python/private/pypi/requirements_parser/BUILD.bazel create mode 100755 python/private/pypi/requirements_parser/resolve_target_platforms.py create mode 100644 tests/pypi/evaluate_markers/BUILD.bazel diff --git a/.bazelrc b/.bazelrc index 1ca469cd75..b484751c3c 100644 --- a/.bazelrc +++ b/.bazelrc @@ -4,8 +4,8 @@ # (Note, we cannot use `common --deleted_packages` because the bazel version command doesn't support it) # To update these lines, execute # `bazel run @rules_bazel_integration_test//tools:update_deleted_packages` -build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered -query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered test --test_output=errors diff --git a/CHANGELOG.md b/CHANGELOG.md index c87e76e5be..118af045c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,7 +62,7 @@ A brief description of the categories of changes: `experimental_index_url` feature. Fixes [#2091](https://github.com/bazelbuild/rules_python/issues/2090). * (gazelle) Make `gazelle_python_manifest.update` manual to avoid unnecessary - network behavior. + network behavior. * (bzlmod): The conflicting toolchains during `python` extension will no longer cause warnings by default. In order to see the warnings for diagnostic purposes set the env var `RULES_PYTHON_REPO_DEBUG_VERBOSITY` to one of `INFO`, `DEBUG` or `TRACE`. @@ -79,6 +79,11 @@ A brief description of the categories of changes: flag value is set to `true` for backwards compatible behaviour, but in the future the flag will be flipped be `false` by default. * (toolchains) New Python versions available: `3.12.4` using the [20240726] release. +* (pypi) Support env markers in requirements files. Note, that this means that + if your requirements files contain env markers, the Python interpreter will + need to be run during bzlmod phase to evaluate them. This may incur + downloading an interpreter (for hermetic-based builds) or cause non-hermetic + behavior (if using a system Python). [rules_python_pytest]: https://github.com/caseyduquettesc/rules_python_pytest [py_test_main]: https://docs.aspect.build/rulesets/aspect_rules_py/docs/rules/#py_pytest_main diff --git a/MODULE.bazel b/MODULE.bazel index 457d8cc0fa..c4d0e5f48d 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -91,21 +91,9 @@ dev_pip = use_extension( dev_dependency = True, ) dev_pip.parse( - experimental_requirement_cycles = { - "sphinx": [ - "sphinx", - "sphinxcontrib-serializinghtml", - "sphinxcontrib-qthelp", - "sphinxcontrib-htmlhelp", - "sphinxcontrib-devhelp", - "sphinxcontrib-applehelp", - ], - }, hub_name = "dev_pip", python_version = "3.11", - requirements_by_platform = { - "//docs/sphinx:requirements.txt": "linux_*,osx_*", - }, + requirements_lock = "//docs/sphinx:requirements.txt", ) dev_pip.parse( hub_name = "pypiserver", diff --git a/WORKSPACE b/WORKSPACE index 6c1ab4f9af..695b0e94e9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -121,16 +121,6 @@ install_pypiserver() pip_parse( name = "dev_pip", - experimental_requirement_cycles = { - "sphinx": [ - "sphinx", - "sphinxcontrib-serializinghtml", - "sphinxcontrib-qthelp", - "sphinxcontrib-htmlhelp", - "sphinxcontrib-devhelp", - "sphinxcontrib-applehelp", - ], - }, python_interpreter_target = interpreter, requirements_lock = "//docs/sphinx:requirements.txt", ) diff --git a/docs/sphinx/BUILD.bazel b/docs/sphinx/BUILD.bazel index b582606ab6..947ebbae15 100644 --- a/docs/sphinx/BUILD.bazel +++ b/docs/sphinx/BUILD.bazel @@ -12,8 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +load("@bazel_skylib//rules:write_file.bzl", "write_file") load("@dev_pip//:requirements.bzl", "requirement") -load("//python:pip.bzl", "compile_pip_requirements") +load("//python:py_binary.bzl", "py_binary") load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility load("//sphinxdocs:readthedocs.bzl", "readthedocs_install") @@ -125,10 +126,69 @@ sphinx_build_binary( ], ) +_REQUIREMENTS_TARGET_COMPATIBLE_WITH = select({ + "@platforms//os:linux": [], + "@platforms//os:macos": [], + "@platforms//os:windows": [], + "//conditions:default": ["@platforms//:incompatible"], +}) if BZLMOD_ENABLED else ["@platforms//:incompatible"] + # Run bazel run //docs/sphinx:requirements.update -compile_pip_requirements( +genrule( name = "requirements", - src = "pyproject.toml", - requirements_txt = "requirements.txt", - target_compatible_with = _TARGET_COMPATIBLE_WITH, + srcs = ["pyproject.toml"], + outs = ["_requirements.txt"], + cmd = "$(UV_BIN) pip compile " + " ".join([ + "--custom-compile-command='bazel run //docs/sphinx:requirements.update'", + "--generate-hashes", + "--universal", + "--emit-index-url", + "--no-strip-extras", + "--no-build", + "--python=$(PYTHON3)", + "$<", + "--output-file=$@", + # Always try upgrading + "--upgrade", + ]), + tags = [ + "local", + "manual", + "no-cache", + ], + target_compatible_with = _REQUIREMENTS_TARGET_COMPATIBLE_WITH, + toolchains = [ + "//python/uv:current_toolchain", + "//python:current_py_toolchain", + ], +) + +# Write a script that can be used for updating the in-tree version of the +# requirements file +write_file( + name = "gen_update_requirements", + out = "requirements.update.py", + content = [ + "from os import environ", + "from pathlib import Path", + "from sys import stderr", + "", + 'src = Path(environ["REQUIREMENTS_FILE"])', + 'dst = Path(environ["BUILD_WORKSPACE_DIRECTORY"]) / "docs" / "sphinx" / "requirements.txt"', + 'print(f"Writing requirements contents from {src} to {dst}", file=stderr)', + "dst.write_text(src.read_text())", + 'print("Success!", file=stderr)', + ], + target_compatible_with = _REQUIREMENTS_TARGET_COMPATIBLE_WITH, +) + +py_binary( + name = "requirements.update", + srcs = ["requirements.update.py"], + data = [":requirements"], + env = { + "REQUIREMENTS_FILE": "$(location :requirements)", + }, + tags = ["manual"], + target_compatible_with = _REQUIREMENTS_TARGET_COMPATIBLE_WITH, ) diff --git a/docs/sphinx/requirements.txt b/docs/sphinx/requirements.txt index 23c2dd5d2c..e0d3bba4ff 100644 --- a/docs/sphinx/requirements.txt +++ b/docs/sphinx/requirements.txt @@ -1,13 +1,11 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# +# This file was autogenerated by uv via the following command: # bazel run //docs/sphinx:requirements.update -# +--index-url https://pypi.org/simple + absl-py==2.1.0 \ --hash=sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308 \ --hash=sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff - # via rules_python_docs (docs/sphinx/pyproject.toml) + # via rules-python-docs (docs/sphinx/pyproject.toml) alabaster==0.7.16 \ --hash=sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65 \ --hash=sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92 @@ -112,6 +110,10 @@ charset-normalizer==3.3.2 \ --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 # via requests +colorama==0.4.6 ; sys_platform == 'win32' \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + # via sphinx docutils==0.20.1 \ --hash=sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 \ --hash=sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b @@ -213,7 +215,7 @@ mdurl==0.1.2 \ myst-parser==3.0.1 \ --hash=sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1 \ --hash=sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87 - # via rules_python_docs (docs/sphinx/pyproject.toml) + # via rules-python-docs (docs/sphinx/pyproject.toml) packaging==24.1 \ --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 @@ -280,7 +282,7 @@ pyyaml==6.0.1 \ readthedocs-sphinx-ext==2.2.5 \ --hash=sha256:ee5fd5b99db9f0c180b2396cbce528aa36671951b9526bb0272dbfce5517bd27 \ --hash=sha256:f8c56184ea011c972dd45a90122568587cc85b0127bc9cf064d17c68bc809daa - # via rules_python_docs (docs/sphinx/pyproject.toml) + # via rules-python-docs (docs/sphinx/pyproject.toml) requests==2.32.3 \ --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 @@ -291,29 +293,29 @@ snowballstemmer==2.2.0 \ --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 \ --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a # via sphinx -sphinx==7.3.7 \ - --hash=sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3 \ - --hash=sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc +sphinx==7.4.7 \ + --hash=sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe \ + --hash=sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239 # via + # rules-python-docs (docs/sphinx/pyproject.toml) # myst-parser - # rules_python_docs (docs/sphinx/pyproject.toml) # sphinx-rtd-theme # sphinxcontrib-jquery sphinx-rtd-theme==2.0.0 \ --hash=sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b \ --hash=sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586 - # via rules_python_docs (docs/sphinx/pyproject.toml) -sphinxcontrib-applehelp==1.0.8 \ - --hash=sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619 \ - --hash=sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4 + # via rules-python-docs (docs/sphinx/pyproject.toml) +sphinxcontrib-applehelp==2.0.0 \ + --hash=sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1 \ + --hash=sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5 # via sphinx -sphinxcontrib-devhelp==1.0.6 \ - --hash=sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f \ - --hash=sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3 +sphinxcontrib-devhelp==2.0.0 \ + --hash=sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad \ + --hash=sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2 # via sphinx -sphinxcontrib-htmlhelp==2.0.6 \ - --hash=sha256:1b9af5a2671a61410a868fce050cab7ca393c218e6205cbc7f590136f207395c \ - --hash=sha256:c6597da06185f0e3b4dc952777a04200611ef563882e0c244d27a15ee22afa73 +sphinxcontrib-htmlhelp==2.1.0 \ + --hash=sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8 \ + --hash=sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9 # via sphinx sphinxcontrib-jquery==4.1 \ --hash=sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a \ @@ -327,14 +329,14 @@ sphinxcontrib-qthelp==2.0.0 \ --hash=sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab \ --hash=sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb # via sphinx -sphinxcontrib-serializinghtml==1.1.10 \ - --hash=sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7 \ - --hash=sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f +sphinxcontrib-serializinghtml==2.0.0 \ + --hash=sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331 \ + --hash=sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d # via sphinx typing-extensions==4.12.2 \ --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 - # via rules_python_docs (docs/sphinx/pyproject.toml) + # via rules-python-docs (docs/sphinx/pyproject.toml) urllib3==2.2.2 \ --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel index f444287a85..3b11dbe7f8 100644 --- a/python/private/pypi/BUILD.bazel +++ b/python/private/pypi/BUILD.bazel @@ -61,6 +61,7 @@ bzl_library( ":attrs_bzl", ":hub_repository_bzl", ":parse_requirements_bzl", + ":evaluate_markers_bzl", ":parse_whl_name_bzl", ":pip_repository_attrs_bzl", ":simpleapi_download_bzl", @@ -89,6 +90,14 @@ bzl_library( ], ) +bzl_library( + name = "evaluate_markers_bzl", + srcs = ["evaluate_markers.bzl"], + deps = [ + ":pypi_repo_utils_bzl", + ], +) + bzl_library( name = "flags_bzl", srcs = ["flags.bzl"], @@ -215,6 +224,7 @@ bzl_library( srcs = ["pip_repository.bzl"], deps = [ ":attrs_bzl", + ":evaluate_markers_bzl", ":parse_requirements_bzl", ":pip_repository_attrs_bzl", ":render_pkg_aliases_bzl", @@ -235,6 +245,7 @@ bzl_library( srcs = ["pypi_repo_utils.bzl"], deps = [ "//python/private:repo_utils_bzl", + "@bazel_skylib//lib:types", ], ) diff --git a/python/private/pypi/evaluate_markers.bzl b/python/private/pypi/evaluate_markers.bzl new file mode 100644 index 0000000000..c805fd7a59 --- /dev/null +++ b/python/private/pypi/evaluate_markers.bzl @@ -0,0 +1,77 @@ +# 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 function that evaluates markers using a python interpreter.""" + +load(":pypi_repo_utils.bzl", "pypi_repo_utils") + +# Used as a default value in a rule to ensure we fetch the dependencies. +SRCS = [ + # When the version, or any of the files in `packaging` package changes, + # this file will change as well. + Label("@pypi__packaging//:packaging-24.0.dist-info/RECORD"), + Label("//python/private/pypi/requirements_parser:resolve_target_platforms.py"), + Label("//python/private/pypi/whl_installer:platform.py"), +] + +def evaluate_markers(mrctx, *, requirements, python_interpreter, python_interpreter_target, srcs, logger = None): + """Return the list of supported platforms per requirements line. + + Args: + mrctx: repository_ctx or module_ctx. + requirements: list[str] of the requirement file lines to evaluate. + python_interpreter: str, path to the python_interpreter to use to + evaluate the env markers in the given requirements files. It will + be only called if the requirements files have env markers. This + should be something that is in your PATH or an absolute path. + python_interpreter_target: Label, same as python_interpreter, but in a + label format. + srcs: list[Label], the value of SRCS passed from the `rctx` or `mctx` to this function. + logger: repo_utils.logger or None, a simple struct to log diagnostic + messages. Defaults to None. + + Returns: + dict of string lists with target platforms + """ + if not requirements: + return {} + + in_file = mrctx.path("requirements_with_markers.in.json") + out_file = mrctx.path("requirements_with_markers.out.json") + mrctx.file(in_file, json.encode(requirements)) + + pypi_repo_utils.execute_checked( + mrctx, + op = "ResolveRequirementEnvMarkers({})".format(in_file), + arguments = [ + pypi_repo_utils.resolve_python_interpreter( + mrctx, + python_interpreter = python_interpreter, + python_interpreter_target = python_interpreter_target, + ), + "-m", + "python.private.pypi.requirements_parser.resolve_target_platforms", + in_file, + out_file, + ], + srcs = srcs, + environment = { + "PYTHONPATH": [ + Label("@pypi__packaging//:BUILD.bazel"), + Label("//:BUILD.bazel"), + ], + }, + logger = logger, + ) + return json.decode(mrctx.read(out_file)) diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 82e580d3a2..1bc8f15149 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -21,6 +21,7 @@ load("//python/private:normalize_name.bzl", "normalize_name") load("//python/private:repo_utils.bzl", "repo_utils") 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(":parse_whl_name.bzl", "parse_whl_name") @@ -195,6 +196,28 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s logger = logger, ), get_index_urls = get_index_urls, + # NOTE @aignas 2024-08-02: , we will execute any interpreter that we find either + # in the PATH or if specified as a label. We will configure the env + # markers when evaluating the requirement lines based on the output + # from the `requirements_files_by_platform` which should have something + # similar to: + # { + # "//:requirements.txt": ["cp311_linux_x86_64", ...] + # } + # + # We know the target python versions that we need to evaluate the + # markers for and thus we don't need to use multiple python interpreter + # instances to perform this manipulation. This function should be executed + # only once by the underlying code to minimize the overhead needed to + # spin up a Python interpreter. + evaluate_markers = lambda module_ctx, requirements: evaluate_markers( + module_ctx, + requirements = requirements, + python_interpreter = pip_attr.python_interpreter, + python_interpreter_target = python_interpreter_target, + srcs = pip_attr._evaluate_markers_srcs, + logger = logger, + ), logger = logger, ) @@ -623,6 +646,13 @@ a corresponding `python.toolchain()` configured. doc = """\ A dict of labels to wheel names that is typically generated by the whl_modifications. The labels are JSON config files describing the modifications. +""", + ), + "_evaluate_markers_srcs": attr.label_list( + default = EVALUATE_MARKERS_SRCS, + doc = """\ +The list of labels to use as SRCS for the marker evaluation code. This ensures that the +code will be re-evaluated when any of files in the default changes. """, ), }, **ATTRS) diff --git a/python/private/pypi/parse_requirements.bzl b/python/private/pypi/parse_requirements.bzl index 0cab1d708a..eee97d7019 100644 --- a/python/private/pypi/parse_requirements.bzl +++ b/python/private/pypi/parse_requirements.bzl @@ -38,6 +38,7 @@ def parse_requirements( requirements_by_platform = {}, extra_pip_args = [], get_index_urls = None, + evaluate_markers = lambda *_: {}, logger = None): """Get the requirements with platforms that the requirements apply to. @@ -51,6 +52,11 @@ def parse_requirements( get_index_urls: Callable[[ctx, list[str]], dict], a callable to get all of the distribution URLs from a PyPI index. Accepts ctx and distribution names to query. + evaluate_markers: A function to use to evaluate the requirements. + Accepts the ctx and a dict where keys are requirement lines to + evaluate against the platforms stored as values in the input dict. + Returns the same dict, but with values being platforms that are + compatible with the requirements line. logger: repo_utils.logger or None, a simple struct to log diagnostic messages. Returns: @@ -109,6 +115,7 @@ def parse_requirements( options[plat] = pip_args requirements_by_platform = {} + reqs_with_env_markers = {} for target_platform, reqs_ in requirements.items(): extra_pip_args = options[target_platform] @@ -118,6 +125,9 @@ def parse_requirements( {}, ) + if ";" in requirement_line: + reqs_with_env_markers.setdefault(requirement_line, []).append(target_platform) + for_req = for_whl.setdefault( (requirement_line, ",".join(extra_pip_args)), struct( @@ -130,6 +140,20 @@ def parse_requirements( ) for_req.target_platforms.append(target_platform) + # This may call to Python, so execute it early (before calling to the + # internet below) and ensure that we call it only once. + # + # NOTE @aignas 2024-07-13: in the future, if this is something that we want + # to do, we could use Python to parse the requirement lines and infer the + # URL of the files to download things from. This should be important for + # VCS package references. + env_marker_target_platforms = evaluate_markers(ctx, reqs_with_env_markers) + if logger: + logger.debug(lambda: "Evaluated env markers from:\n{}\n\nTo:\n{}".format( + reqs_with_env_markers, + env_marker_target_platforms, + )) + index_urls = {} if get_index_urls: index_urls = get_index_urls( @@ -146,7 +170,8 @@ def parse_requirements( for whl_name, reqs in requirements_by_platform.items(): requirement_target_platforms = {} for r in reqs.values(): - for p in r.target_platforms: + target_platforms = env_marker_target_platforms.get(r.requirement_line, r.target_platforms) + for p in target_platforms: requirement_target_platforms[p] = None is_exposed = len(requirement_target_platforms) == len(requirements) @@ -164,12 +189,13 @@ def parse_requirements( logger = logger, ) + target_platforms = env_marker_target_platforms.get(r.requirement_line, r.target_platforms) ret.setdefault(whl_name, []).append( struct( distribution = r.distribution, srcs = r.srcs, requirement_line = r.requirement_line, - target_platforms = sorted(r.target_platforms), + target_platforms = sorted(target_platforms), extra_pip_args = r.extra_pip_args, whls = whls, sdist = sdist, diff --git a/python/private/pypi/pip_repository.bzl b/python/private/pypi/pip_repository.bzl index 137c524e24..0c9e300a4d 100644 --- a/python/private/pypi/pip_repository.bzl +++ b/python/private/pypi/pip_repository.bzl @@ -18,6 +18,7 @@ load("@bazel_skylib//lib:sets.bzl", "sets") load("//python/private:normalize_name.bzl", "normalize_name") load("//python/private:repo_utils.bzl", "REPO_DEBUG_ENV_VAR") load("//python/private:text_util.bzl", "render") +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") @@ -81,6 +82,13 @@ def _pip_repository_impl(rctx): extra_pip_args = rctx.attr.extra_pip_args, ), extra_pip_args = rctx.attr.extra_pip_args, + evaluate_markers = lambda rctx, requirements: evaluate_markers( + rctx, + requirements = requirements, + python_interpreter = rctx.attr.python_interpreter, + python_interpreter_target = rctx.attr.python_interpreter_target, + srcs = rctx.attr._evaluate_markers_srcs, + ), ) selected_requirements = {} options = None @@ -224,6 +232,13 @@ file](https://github.com/bazelbuild/rules_python/blob/main/examples/pip_reposito _template = attr.label( default = ":requirements.bzl.tmpl.workspace", ), + _evaluate_markers_srcs = attr.label_list( + default = EVALUATE_MARKERS_SRCS, + doc = """\ +The list of labels to use as SRCS for the marker evaluation code. This ensures that the +code will be re-evaluated when any of files in the default changes. +""", + ), **ATTRS ), doc = """Accepts a locked/compiled requirements file and installs the dependencies listed within. diff --git a/python/private/pypi/pypi_repo_utils.bzl b/python/private/pypi/pypi_repo_utils.bzl index 1f9f050893..da449b4b50 100644 --- a/python/private/pypi/pypi_repo_utils.bzl +++ b/python/private/pypi/pypi_repo_utils.bzl @@ -14,13 +14,14 @@ "" +load("@bazel_skylib//lib:types.bzl", "types") load("//python/private:repo_utils.bzl", "repo_utils") -def _get_python_interpreter_attr(ctx, *, python_interpreter = None): +def _get_python_interpreter_attr(mrctx, *, python_interpreter = None): """A helper function for getting the `python_interpreter` attribute or it's default Args: - ctx (repository_ctx): Handle to the rule repository context. + mrctx (module_ctx or repository_ctx): Handle to the rule repository context. python_interpreter (str): The python interpreter override. Returns: @@ -29,29 +30,30 @@ def _get_python_interpreter_attr(ctx, *, python_interpreter = None): if python_interpreter: return python_interpreter - os = repo_utils.get_platforms_os_name(ctx) + os = repo_utils.get_platforms_os_name(mrctx) if "windows" in os: return "python.exe" else: return "python3" -def _resolve_python_interpreter(ctx, *, python_interpreter = None, python_interpreter_target = None): +def _resolve_python_interpreter(mrctx, *, python_interpreter = None, python_interpreter_target = None): """Helper function to find the python interpreter from the common attributes Args: - ctx: Handle to the rule module_ctx or repository_ctx. - python_interpreter: The python interpreter to use. - python_interpreter_target: The python interpreter to use after downloading the label. + mrctx: Handle to the module_ctx or repository_ctx. + python_interpreter: str, the python interpreter to use. + python_interpreter_target: Label, the python interpreter to use after + downloading the label. Returns: `path` object, for the resolved path to the Python interpreter. """ - python_interpreter = _get_python_interpreter_attr(ctx, python_interpreter = python_interpreter) + python_interpreter = _get_python_interpreter_attr(mrctx, python_interpreter = python_interpreter) if python_interpreter_target != None: - python_interpreter = ctx.path(python_interpreter_target) + python_interpreter = mrctx.path(python_interpreter_target) - os = repo_utils.get_platforms_os_name(ctx) + os = repo_utils.get_platforms_os_name(mrctx) # On Windows, the symlink doesn't work because Windows attempts to find # Python DLLs where the symlink is, not where the symlink points. @@ -59,37 +61,70 @@ def _resolve_python_interpreter(ctx, *, python_interpreter = None, python_interp python_interpreter = python_interpreter.realpath elif "/" not in python_interpreter: # It's a plain command, e.g. "python3", to look up in the environment. - found_python_interpreter = ctx.which(python_interpreter) - if not found_python_interpreter: - fail("python interpreter `{}` not found in PATH".format(python_interpreter)) - python_interpreter = found_python_interpreter + python_interpreter = repo_utils.which_checked(mrctx, python_interpreter) else: - python_interpreter = ctx.path(python_interpreter) + python_interpreter = mrctx.path(python_interpreter) return python_interpreter -def _construct_pypath(ctx, *, entries): +def _construct_pypath(mrctx, *, entries): """Helper function to construct a PYTHONPATH. Contains entries for code in this repo as well as packages downloaded from //python/pip_install:repositories.bzl. This allows us to run python code inside repository rule implementations. Args: - ctx: Handle to the module_ctx or repository_ctx. + mrctx: Handle to the module_ctx or repository_ctx. entries: The list of entries to add to PYTHONPATH. Returns: String of the PYTHONPATH. """ - os = repo_utils.get_platforms_os_name(ctx) + if not entries: + return None + + os = repo_utils.get_platforms_os_name(mrctx) separator = ";" if "windows" in os else ":" pypath = separator.join([ - str(ctx.path(entry).dirname) + str(mrctx.path(entry).dirname) # Use a dict as a way to remove duplicates and then sort it. for entry in sorted({x: None for x in entries}) ]) return pypath +def _execute_checked(mrctx, *, srcs, **kwargs): + """Helper function to run a python script and modify the PYTHONPATH to include external deps. + + Args: + mrctx: Handle to the module_ctx or repository_ctx. + srcs: The src files that the script depends on. This is important to + ensure that the Bazel repository cache or the bzlmod lock file gets + invalidated when any one file changes. It is advisable to use + `RECORD` files for external deps and the list of srcs from the + rules_python repo for any scripts. + **kwargs: Arguments forwarded to `repo_utils.execute_checked`. If + the `environment` has a value `PYTHONPATH` and it is a list, then + it will be passed to `construct_pythonpath` function. + """ + + for src in srcs: + # This will ensure that we will re-evaluate the bzlmod extension or + # refetch the repository_rule when the srcs change. This should work on + # Bazel versions without `mrctx.watch` as well. + repo_utils.watch(mrctx.path(src)) + + env = kwargs.pop("environment", {}) + pythonpath = env.get("PYTHONPATH", "") + if pythonpath and not types.is_string(pythonpath): + env["PYTHONPATH"] = _construct_pypath(mrctx, entries = pythonpath) + + return repo_utils.execute_checked( + mrctx, + environment = env, + **kwargs + ) + pypi_repo_utils = struct( - resolve_python_interpreter = _resolve_python_interpreter, construct_pythonpath = _construct_pypath, + execute_checked = _execute_checked, + resolve_python_interpreter = _resolve_python_interpreter, ) diff --git a/python/private/pypi/requirements_parser/BUILD.bazel b/python/private/pypi/requirements_parser/BUILD.bazel new file mode 100644 index 0000000000..e69de29bb2 diff --git a/python/private/pypi/requirements_parser/resolve_target_platforms.py b/python/private/pypi/requirements_parser/resolve_target_platforms.py new file mode 100755 index 0000000000..c899a943cc --- /dev/null +++ b/python/private/pypi/requirements_parser/resolve_target_platforms.py @@ -0,0 +1,63 @@ +"""A CLI to evaluate env markers for requirements files. + +A simple script to evaluate the `requirements.txt` files. Currently it is only +handling environment markers in the requirements files, but in the future it +may handle more things. We require a `python` interpreter that can run on the +host platform and then we depend on the [packaging] PyPI wheel. + +In order to be able to resolve requirements files for any platform, we are +re-using the same code that is used in the `whl_library` installer. See +[here](../whl_installer/wheel.py). + +Requirements for the code are: +- Depends only on `packaging` and core Python. +- Produces the same result irrespective of the Python interpreter platform or version. + +[packaging]: https://packaging.pypa.io/en/stable/ +""" + +import argparse +import json +import pathlib + +from packaging.requirements import Requirement + +from python.private.pypi.whl_installer.platform import Platform + +INPUT_HELP = """\ +Input path to read the requirements as a json file, the keys in the dictionary +are the requirements lines and the values are strings of target platforms. +""" +OUTPUT_HELP = """\ +Output to write the requirements as a json filepath, the keys in the dictionary +are the requirements lines and the values are strings of target platforms, which +got changed based on the evaluated markers. +""" + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("input_path", type=pathlib.Path, help=INPUT_HELP.strip()) + parser.add_argument("output_path", type=pathlib.Path, help=OUTPUT_HELP.strip()) + args = parser.parse_args() + + with args.input_path.open() as f: + reqs = json.load(f) + + response = {} + for requirement_line, target_platforms in reqs.items(): + entry, prefix, hashes = requirement_line.partition("--hash") + hashes = prefix + hashes + + req = Requirement(entry) + for p in target_platforms: + (platform,) = Platform.from_string(p) + if not req.marker or req.marker.evaluate(platform.env_markers("")): + response.setdefault(requirement_line, []).append(p) + + with args.output_path.open("w") as f: + json.dump(response, f) + + +if __name__ == "__main__": + main() diff --git a/python/private/repo_utils.bzl b/python/private/repo_utils.bzl index 1c50ac6bf4..aab0325a49 100644 --- a/python/private/repo_utils.bzl +++ b/python/private/repo_utils.bzl @@ -20,34 +20,34 @@ This code should only be loaded and used during the repository phase. REPO_DEBUG_ENV_VAR = "RULES_PYTHON_REPO_DEBUG" REPO_VERBOSITY_ENV_VAR = "RULES_PYTHON_REPO_DEBUG_VERBOSITY" -def _is_repo_debug_enabled(rctx): +def _is_repo_debug_enabled(mrctx): """Tells if debbugging output is requested during repo operatiosn. Args: - rctx: repository_ctx object + mrctx: repository_ctx or module_ctx object Returns: True if enabled, False if not. """ - return _getenv(rctx, REPO_DEBUG_ENV_VAR) == "1" + return _getenv(mrctx, REPO_DEBUG_ENV_VAR) == "1" -def _logger(ctx, name = None): +def _logger(mrctx, name = None): """Creates a logger instance for printing messages. Args: - ctx: repository_ctx or module_ctx object. If the attribute + mrctx: repository_ctx or module_ctx object. If the attribute `_rule_name` is present, it will be included in log messages. name: name for the logger. Optional for repository_ctx usage. Returns: A struct with attributes logging: trace, debug, info, warn, fail. """ - if _is_repo_debug_enabled(ctx): + if _is_repo_debug_enabled(mrctx): verbosity_level = "DEBUG" else: verbosity_level = "WARN" - env_var_verbosity = _getenv(ctx, REPO_VERBOSITY_ENV_VAR) + env_var_verbosity = _getenv(mrctx, REPO_VERBOSITY_ENV_VAR) verbosity_level = env_var_verbosity or verbosity_level verbosity = { @@ -56,9 +56,9 @@ def _logger(ctx, name = None): "TRACE": 3, }.get(verbosity_level, 0) - if hasattr(ctx, "attr"): - # This is `repository_ctx`. - name = name or "{}(@@{})".format(getattr(ctx.attr, "_rule_name", "?"), ctx.name) + if hasattr(mrctx, "attr"): + rctx = mrctx # This is `repository_ctx`. + name = name or "{}(@@{})".format(getattr(rctx.attr, "_rule_name", "?"), rctx.name) elif not name: fail("The name has to be specified when using the logger with `module_ctx`") @@ -86,7 +86,7 @@ def _logger(ctx, name = None): ) def _execute_internal( - rctx, + mrctx, *, op, fail_on_error = False, @@ -97,23 +97,31 @@ def _execute_internal( """Execute a subprocess with debugging instrumentation. Args: - rctx: repository_ctx object + mrctx: module_ctx or repository_ctx object op: string, brief description of the operation this command represents. Used to succintly describe it in logging and error messages. fail_on_error: bool, True if fail() should be called if the command fails (non-zero exit code), False if not. - arguments: list of arguments; see rctx.execute#arguments. + arguments: list of arguments; see module_ctx.execute#arguments or + repository_ctx#arguments. environment: optional dict of the environment to run the command - in; see rctx.execute#environment. - logger: optional `Logger` to use for logging execution details. If - not specified, a default will be created. + in; see module_ctx.execute#environment or + repository_ctx.execute#environment. + logger: optional `Logger` to use for logging execution details. Must be + specified when using module_ctx. If not specified, a default will + be created. **kwargs: additional kwargs to pass onto rctx.execute Returns: exec_result object, see repository_ctx.execute return type. """ - logger = logger or _logger(rctx) + if not logger and hasattr(mrctx, "attr"): + rctx = mrctx + logger = _logger(rctx) + elif not logger: + fail("logger must be specified when using 'module_ctx'") + logger.debug(lambda: ( "repo.execute: {op}: start\n" + " command: {cmd}\n" + @@ -123,13 +131,13 @@ def _execute_internal( ).format( op = op, cmd = _args_to_str(arguments), - cwd = _cwd_to_str(rctx, kwargs), + cwd = _cwd_to_str(mrctx, kwargs), timeout = _timeout_to_str(kwargs), env_str = _env_to_str(environment), )) - rctx.report_progress("Running {}".format(op)) - result = rctx.execute(arguments, environment = environment, **kwargs) + mrctx.report_progress("Running {}".format(op)) + result = mrctx.execute(arguments, environment = environment, **kwargs) if fail_on_error and result.return_code != 0: logger.fail(( @@ -144,12 +152,12 @@ def _execute_internal( op = op, cmd = _args_to_str(arguments), return_code = result.return_code, - cwd = _cwd_to_str(rctx, kwargs), + cwd = _cwd_to_str(mrctx, kwargs), timeout = _timeout_to_str(kwargs), env_str = _env_to_str(environment), output = _outputs_to_str(result), )) - elif _is_repo_debug_enabled(rctx): + elif _is_repo_debug_enabled(mrctx): logger.debug(( "repo.execute: {op}: end: {status}\n" + " return code: {return_code}\n" + @@ -167,7 +175,7 @@ def _execute_internal( op = op, arguments = arguments, result = result, - rctx = rctx, + mrctx = mrctx, kwargs = kwargs, environment = environment, ), @@ -207,7 +215,7 @@ def _execute_checked_stdout(*args, **kwargs): """Calls execute_checked, but only returns the stdout value.""" return _execute_checked(*args, **kwargs).stdout -def _execute_describe_failure(*, op, arguments, result, rctx, kwargs, environment): +def _execute_describe_failure(*, op, arguments, result, mrctx, kwargs, environment): return ( "repo.execute: {op}: failure:\n" + " command: {cmd}\n" + @@ -220,35 +228,35 @@ def _execute_describe_failure(*, op, arguments, result, rctx, kwargs, environmen op = op, cmd = _args_to_str(arguments), return_code = result.return_code, - cwd = _cwd_to_str(rctx, kwargs), + cwd = _cwd_to_str(mrctx, kwargs), timeout = _timeout_to_str(kwargs), env_str = _env_to_str(environment), output = _outputs_to_str(result), ) -def _which_checked(rctx, binary_name): +def _which_checked(mrctx, binary_name): """Tests to see if a binary exists, and otherwise fails with a message. Args: binary_name: name of the binary to find. - rctx: repository context. + mrctx: module_ctx or repository_ctx. Returns: - rctx.Path for the binary. + mrctx.Path for the binary. """ - result = _which_unchecked(rctx, binary_name) + result = _which_unchecked(mrctx, binary_name) if result.binary == None: fail(result.describe_failure()) return result.binary -def _which_unchecked(rctx, binary_name): +def _which_unchecked(mrctx, binary_name): """Tests to see if a binary exists. This is also watch the `PATH` environment variable. Args: binary_name: name of the binary to find. - rctx: repository context. + mrctx: repository context. Returns: `struct` with attributes: @@ -256,10 +264,10 @@ def _which_unchecked(rctx, binary_name): * `describe_failure`: `Callable | None`; takes no args. If the binary couldn't be found, provides a detailed error description. """ - path = _getenv(rctx, "PATH", "") - binary = rctx.which(binary_name) + path = _getenv(mrctx, "PATH", "") + binary = mrctx.which(binary_name) if binary: - _watch(rctx, binary) + _watch(mrctx, binary) describe_failure = None else: describe_failure = lambda: _which_describe_failure(binary_name, path) @@ -278,9 +286,9 @@ def _which_describe_failure(binary_name, path): path = path, ) -def _getenv(ctx, name, default = None): - # Bazel 7+ API has ctx.getenv - return getattr(ctx, "getenv", ctx.os.environ.get)(name, default) +def _getenv(mrctx, name, default = None): + # Bazel 7+ API has (repository|module)_ctx.getenv + return getattr(mrctx, "getenv", mrctx.os.environ.get)(name, default) def _args_to_str(arguments): return " ".join([_arg_repr(a) for a in arguments]) @@ -294,17 +302,17 @@ def _arg_repr(value): _SPECIAL_SHELL_CHARS = [" ", "'", '"', "{", "$", "("] def _arg_should_be_quoted(value): - # `value` may be non-str, such as ctx.path objects + # `value` may be non-str, such as mrctx.path objects value_str = str(value) for char in _SPECIAL_SHELL_CHARS: if char in value_str: return True return False -def _cwd_to_str(rctx, kwargs): +def _cwd_to_str(mrctx, kwargs): cwd = kwargs.get("working_directory") if not cwd: - cwd = "".format(rctx.path("")) + cwd = "".format(mrctx.path("")) return cwd def _env_to_str(environment): @@ -342,16 +350,16 @@ def _outputs_to_str(result): # @platforms//host:extension.bzl at version 0.0.9 so that we don't # force the users to depend on it. -def _get_platforms_os_name(rctx): +def _get_platforms_os_name(mrctx): """Return the name in @platforms//os for the host os. Args: - rctx: repository_ctx + mrctx: module_ctx or repository_ctx. Returns: `str`. The target name. """ - os = rctx.os.name.lower() + os = mrctx.os.name.lower() if os.startswith("mac os"): return "osx" @@ -365,16 +373,16 @@ def _get_platforms_os_name(rctx): return "windows" return os -def _get_platforms_cpu_name(rctx): +def _get_platforms_cpu_name(mrctx): """Return the name in @platforms//cpu for the host arch. Args: - rctx: repository_ctx + mrctx: module_ctx or repository_ctx. Returns: `str`. The target name. """ - arch = rctx.os.arch.lower() + arch = mrctx.os.arch.lower() if arch in ["i386", "i486", "i586", "i686", "i786", "x86"]: return "x86_32" if arch in ["amd64", "x86_64", "x64"]: @@ -394,16 +402,16 @@ def _get_platforms_cpu_name(rctx): return arch # TODO: Remove after Bazel 6 support dropped -def _watch(rctx, *args, **kwargs): - """Calls rctx.watch, if available.""" - if hasattr(rctx, "watch"): - rctx.watch(*args, **kwargs) +def _watch(mrctx, *args, **kwargs): + """Calls mrctx.watch, if available.""" + if hasattr(mrctx, "watch"): + mrctx.watch(*args, **kwargs) # TODO: Remove after Bazel 6 support dropped -def _watch_tree(rctx, *args, **kwargs): - """Calls rctx.watch_tree, if available.""" - if hasattr(rctx, "watch_tree"): - rctx.watch_tree(*args, **kwargs) +def _watch_tree(mrctx, *args, **kwargs): + """Calls mrctx.watch_tree, if available.""" + if hasattr(mrctx, "watch_tree"): + mrctx.watch_tree(*args, **kwargs) repo_utils = struct( # keep sorted diff --git a/tests/pypi/evaluate_markers/BUILD.bazel b/tests/pypi/evaluate_markers/BUILD.bazel new file mode 100644 index 0000000000..aba9264953 --- /dev/null +++ b/tests/pypi/evaluate_markers/BUILD.bazel @@ -0,0 +1,7 @@ +load("@bazel_skylib//rules:build_test.bzl", "build_test") +load("@dev_pip//:requirements.bzl", "all_whl_requirements") + +build_test( + name = "all_dev_wheels", + targets = all_whl_requirements, +) diff --git a/tests/pypi/parse_requirements/parse_requirements_tests.bzl b/tests/pypi/parse_requirements/parse_requirements_tests.bzl index 280dbd1a6c..25d2961a34 100644 --- a/tests/pypi/parse_requirements/parse_requirements_tests.bzl +++ b/tests/pypi/parse_requirements/parse_requirements_tests.bzl @@ -32,6 +32,10 @@ foo[extra]==0.0.1 --hash=sha256:deadbeef foo[extra,extra_2]==0.0.1 --hash=sha256:deadbeef foo==0.0.1 --hash=sha256:deadbeef foo[extra]==0.0.1 --hash=sha256:deadbeef +""", + "requirements_marker": """\ +foo[extra]==0.0.1 ;marker --hash=sha256:deadbeef +bar==0.0.1 --hash=sha256:deadbeef """, "requirements_osx": """\ foo==0.0.3 --hash=sha256:deadbaaf @@ -197,6 +201,67 @@ def _test_select_requirement_none_platform(env): _tests.append(_test_select_requirement_none_platform) +def _test_env_marker_resolution(env): + def _mock_eval_markers(_, input): + ret = { + "foo[extra]==0.0.1 ;marker --hash=sha256:deadbeef": ["cp311_windows_x86_64"], + } + + env.expect.that_collection(input.keys()).contains_exactly(ret.keys()) + env.expect.that_collection(input.values()[0]).contains_exactly(["cp311_linux_super_exotic", "cp311_windows_x86_64"]) + return ret + + got = parse_requirements( + ctx = _mock_ctx(), + requirements_by_platform = { + "requirements_marker": ["cp311_linux_super_exotic", "cp311_windows_x86_64"], + }, + evaluate_markers = _mock_eval_markers, + ) + env.expect.that_dict(got).contains_exactly({ + "bar": [ + struct( + distribution = "bar", + extra_pip_args = [], + is_exposed = True, + requirement_line = "bar==0.0.1 --hash=sha256:deadbeef", + sdist = None, + srcs = struct( + requirement = "bar==0.0.1", + shas = ["deadbeef"], + version = "0.0.1", + ), + target_platforms = ["cp311_linux_super_exotic", "cp311_windows_x86_64"], + whls = [], + ), + ], + "foo": [ + struct( + distribution = "foo", + extra_pip_args = [], + # This is not exposed because we also have `linux_super_exotic` in the platform list + is_exposed = False, + requirement_line = "foo[extra]==0.0.1 ;marker --hash=sha256:deadbeef", + sdist = None, + srcs = struct( + requirement = "foo[extra]==0.0.1 ;marker", + shas = ["deadbeef"], + version = "0.0.1", + ), + target_platforms = ["cp311_windows_x86_64"], + whls = [], + ), + ], + }) + env.expect.that_str( + select_requirement( + got["foo"], + platform = "windows_x86_64", + ).srcs.version, + ).equals("0.0.1") + +_tests.append(_test_env_marker_resolution) + def parse_requirements_test_suite(name): """Create the test suite. From 0d6d8f303a5d8cbd1f0a94984395725eb5642473 Mon Sep 17 00:00:00 2001 From: Fabian Meumertzheim Date: Thu, 15 Aug 2024 21:22:41 +0200 Subject: [PATCH 155/345] fix: support `runfiles.CurrentRepository` with non-hermetic `sys.path` (#1634) When using Python 3.10 or earlier, the first `sys.path` entry is the directory containing the script. This can result in modules being loaded from the source root rather than the runfiles root, which the runfiles library previously didn't support. Fixes #1631 --------- Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Co-authored-by: Richard Levasseur --- CHANGELOG.md | 4 ++++ python/runfiles/runfiles.py | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 118af045c2..8d52bace11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,10 @@ A brief description of the categories of changes: cause warnings by default. In order to see the warnings for diagnostic purposes set the env var `RULES_PYTHON_REPO_DEBUG_VERBOSITY` to one of `INFO`, `DEBUG` or `TRACE`. Fixes [#1818](https://github.com/bazelbuild/rules_python/issues/1818). +* (runfiles) Make runfiles lookups work for the situation of Bazel 7, + Python 3.9 (or earlier, where safepath isn't present), and the Rlocation call + in the same directory as the main file. + Fixes [#1631](https://github.com/bazelbuild/rules_python/issues/1631). ### Added * (rules) `PYTHONSAFEPATH` is inherited from the calling environment to allow diff --git a/python/runfiles/runfiles.py b/python/runfiles/runfiles.py index ffa2473f5c..6d47d249b4 100644 --- a/python/runfiles/runfiles.py +++ b/python/runfiles/runfiles.py @@ -247,6 +247,20 @@ def CurrentRepository(self, frame: int = 1) -> str: raise ValueError("failed to determine caller's file path") from exc caller_runfiles_path = os.path.relpath(caller_path, self._python_runfiles_root) if caller_runfiles_path.startswith(".." + os.path.sep): + # With Python 3.10 and earlier, sys.path contains the directory + # of the script, which can result in a module being loaded from + # outside the runfiles tree. In this case, assume that the module is + # located in the main repository. + # With Python 3.11 and higher, the Python launcher sets + # PYTHONSAFEPATH, which prevents this behavior. + # TODO: This doesn't cover the case of a script being run from an + # external repository, which could be heuristically detected + # by parsing the script's path. + if ( + sys.version_info.minor <= 10 + and sys.path[0] != self._python_runfiles_root + ): + return "" raise ValueError( "{} does not lie under the runfiles root {}".format( caller_path, self._python_runfiles_root From e923f9e86c29dde355ffbef80420e5de843a79e7 Mon Sep 17 00:00:00 2001 From: Cal Jacobson Date: Thu, 15 Aug 2024 15:36:51 -0400 Subject: [PATCH 156/345] feat: update `compile_pip_requirements` to support multiple input files (#1067) `pip-compile` can compile multiple input files into a single output file, but `rules_python`'s `compile_pip_requirements` doesn't currently support this. With this change, the `requirements_in` argument to `compile_pip_requirements` can now accept a list of strings (in addition to the previously accepted argument types). In order to support a variable number of input files, my coworker (@lpulley) and I updated `dependency_resolver.py` to use the `click` CLI library. We felt this was acceptable since `pip-compile` already requires `click` to run, so we're not adding a new dependency. We also made changes to the script to avoid mutating `sys.argv`, instead opting to build a new list (`argv`) from scratch that'll be passed to the `pip-compile` CLI. While subjective, I feel this improves readability, since it's not immediately obvious what's in `sys.argv`, but it's clear that `argv` begins empty, and is added to over the course of the program's execution. --------- Co-authored-by: Logan Pulley Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Co-authored-by: Richard Levasseur --- CHANGELOG.md | 4 ++ .../dependency_resolver.py | 19 +++++---- python/private/pypi/pip_compile.bzl | 39 ++++++++++++------- tests/multiple_inputs/BUILD.bazel | 30 ++++++++++++++ tests/multiple_inputs/README.md | 3 ++ tests/multiple_inputs/a/pyproject.toml | 5 +++ tests/multiple_inputs/b/pyproject.toml | 5 +++ tests/multiple_inputs/multiple_inputs.txt | 18 +++++++++ .../multiple_pyproject_toml.txt | 14 +++++++ .../multiple_requirements_in.txt | 14 +++++++ tests/multiple_inputs/requirements_1.in | 1 + tests/multiple_inputs/requirements_2.in | 1 + 12 files changed, 130 insertions(+), 23 deletions(-) create mode 100644 tests/multiple_inputs/BUILD.bazel create mode 100644 tests/multiple_inputs/README.md create mode 100644 tests/multiple_inputs/a/pyproject.toml create mode 100644 tests/multiple_inputs/b/pyproject.toml create mode 100644 tests/multiple_inputs/multiple_inputs.txt create mode 100644 tests/multiple_inputs/multiple_pyproject_toml.txt create mode 100644 tests/multiple_inputs/multiple_requirements_in.txt create mode 100644 tests/multiple_inputs/requirements_1.in create mode 100644 tests/multiple_inputs/requirements_2.in diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d52bace11..23d910ce3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,9 @@ A brief description of the categories of changes: * `3.12 -> 3.12.4` ### Fixed +* (rules) `compile_pip_requirements` now sets the `USERPROFILE` env variable on + Windows to work around an issue where `setuptools` fails to locate the user's + home directory. * (rules) correctly handle absolute URLs in parse_simpleapi_html.bzl. * (rules) Fixes build targets linking against `@rules_python//python/cc:current_py_cc_libs` in host platform builds on macOS, by editing the `LC_ID_DYLIB` field of the hermetic interpreter's @@ -73,6 +76,7 @@ A brief description of the categories of changes: Fixes [#1631](https://github.com/bazelbuild/rules_python/issues/1631). ### Added +* (rules) `compile_pip_requirements` supports multiple requirements input files as `srcs`. * (rules) `PYTHONSAFEPATH` is inherited from the calling environment to allow disabling it (Requires {obj}`--bootstrap_impl=script`) ([#2060](https://github.com/bazelbuild/rules_python/issues/2060)). diff --git a/python/private/pypi/dependency_resolver/dependency_resolver.py b/python/private/pypi/dependency_resolver/dependency_resolver.py index afe5076b4f..0ff9b2fb7c 100644 --- a/python/private/pypi/dependency_resolver/dependency_resolver.py +++ b/python/private/pypi/dependency_resolver/dependency_resolver.py @@ -80,7 +80,7 @@ def _locate(bazel_runfiles, file): @click.command(context_settings={"ignore_unknown_options": True}) -@click.argument("requirements_in") +@click.option("--src", "srcs", multiple=True, required=True) @click.argument("requirements_txt") @click.argument("update_target_label") @click.option("--requirements-linux") @@ -88,7 +88,7 @@ def _locate(bazel_runfiles, file): @click.option("--requirements-windows") @click.argument("extra_args", nargs=-1, type=click.UNPROCESSED) def main( - requirements_in: str, + srcs: Tuple[str, ...], requirements_txt: str, update_target_label: str, requirements_linux: Optional[str], @@ -105,7 +105,7 @@ def main( requirements_windows=requirements_windows, ) - resolved_requirements_in = _locate(bazel_runfiles, requirements_in) + resolved_srcs = [_locate(bazel_runfiles, src) for src in srcs] resolved_requirements_file = _locate(bazel_runfiles, requirements_file) # Files in the runfiles directory has the following naming schema: @@ -118,11 +118,11 @@ def main( : -(len(requirements_file) - len(repository_prefix)) ] - # As requirements_in might contain references to generated files we want to + # As srcs might contain references to generated files we want to # use the runfiles file first. Thus, we need to compute the relative path # from the execution root. # Note: Windows cannot reference generated files without runfiles support enabled. - requirements_in_relative = requirements_in[len(repository_prefix) :] + srcs_relative = [src[len(repository_prefix) :] for src in srcs] requirements_file_relative = requirements_file[len(repository_prefix) :] # Before loading click, set the locale for its parser. @@ -162,10 +162,9 @@ def main( argv.append( f"--output-file={requirements_file_relative if UPDATE else requirements_out}" ) - argv.append( - requirements_in_relative - if Path(requirements_in_relative).exists() - else resolved_requirements_in + argv.extend( + (src_relative if Path(src_relative).exists() else resolved_src) + for src_relative, resolved_src in zip(srcs_relative, resolved_srcs) ) argv.extend(extra_args) @@ -200,7 +199,7 @@ def main( print( "pip-compile exited with code 2. This means that pip-compile found " "incompatible requirements or could not find a version that matches " - f"the install requirement in {requirements_in_relative}.", + f"the install requirement in one of {srcs_relative}.", file=sys.stderr, ) sys.exit(1) diff --git a/python/private/pypi/pip_compile.bzl b/python/private/pypi/pip_compile.bzl index f284a00f68..a6cabf70c1 100644 --- a/python/private/pypi/pip_compile.bzl +++ b/python/private/pypi/pip_compile.bzl @@ -23,6 +23,7 @@ load("//python:defs.bzl", _py_binary = "py_binary", _py_test = "py_test") def pip_compile( name, + srcs = None, src = None, extra_args = [], extra_deps = [], @@ -53,6 +54,11 @@ def pip_compile( Args: name: base name for generated targets, typically "requirements". + srcs: a list of files containing inputs to dependency resolution. If not specified, + defaults to `["pyproject.toml"]`. Supported formats are: + * a requirements text file, usually named `requirements.in` + * A `.toml` file, where the `project.dependencies` list is used as per + [PEP621](https://peps.python.org/pep-0621/). src: file containing inputs to dependency resolution. If not specified, defaults to `pyproject.toml`. Supported formats are: * a requirements text file, usually named `requirements.in` @@ -63,7 +69,7 @@ def pip_compile( generate_hashes: whether to put hashes in the requirements_txt file. py_binary: the py_binary rule to be used. py_test: the py_test rule to be used. - requirements_in: file expressing desired dependencies. Deprecated, use src instead. + requirements_in: file expressing desired dependencies. Deprecated, use src or srcs instead. requirements_txt: result of "compiling" the requirements.in file. requirements_linux: File of linux specific resolve output to check validate if requirement.in has changes. requirements_darwin: File of darwin specific resolve output to check validate if requirement.in has changes. @@ -72,10 +78,15 @@ def pip_compile( visibility: passed to both the _test and .update rules. **kwargs: other bazel attributes passed to the "_test" rule. """ - if requirements_in and src: - fail("Only one of 'src' and 'requirements_in' attributes can be used") + if len([x for x in [srcs, src, requirements_in] if x != None]) > 1: + fail("At most one of 'srcs', 'src', and 'requirements_in' attributes may be provided") + + if requirements_in: + srcs = [requirements_in] + elif src: + srcs = [src] else: - src = requirements_in or src or "pyproject.toml" + srcs = srcs or ["pyproject.toml"] requirements_txt = name + ".txt" if requirements_txt == None else requirements_txt @@ -88,7 +99,7 @@ def pip_compile( visibility = visibility, ) - data = [name, requirements_txt, src] + [f for f in (requirements_linux, requirements_darwin, requirements_windows) if f != None] + data = [name, requirements_txt] + srcs + [f for f in (requirements_linux, requirements_darwin, requirements_windows) if f != None] # Use the Label constructor so this is expanded in the context of the file # where it appears, which is to say, in @rules_python @@ -96,8 +107,7 @@ def pip_compile( loc = "$(rlocationpath {})" - args = [ - loc.format(src), + args = ["--src=%s" % loc.format(src) for src in srcs] + [ loc.format(requirements_txt), "//%s:%s.update" % (native.package_name(), name), "--resolver=backtracking", @@ -144,12 +154,15 @@ def pip_compile( "visibility": visibility, } - # cheap way to detect the bazel version - _bazel_version_4_or_greater = "propeller_optimize" in dir(native) - - # Bazel 4.0 added the "env" attribute to py_test/py_binary - if _bazel_version_4_or_greater: - attrs["env"] = kwargs.pop("env", {}) + # setuptools (the default python build tool) attempts to find user + # configuration in the user's home direcotory. This seems to work fine on + # linux and macOS, but fails on Windows, so we conditionally provide a fake + # USERPROFILE env variable to allow setuptools to proceed without finding + # user-provided configuration. + kwargs["env"] = select({ + "@@platforms//os:windows": {"USERPROFILE": "Z:\\FakeSetuptoolsHomeDirectoryHack"}, + "//conditions:default": {}, + }) | kwargs.get("env", {}) py_binary( name = name + ".update", diff --git a/tests/multiple_inputs/BUILD.bazel b/tests/multiple_inputs/BUILD.bazel new file mode 100644 index 0000000000..3e3cab83ca --- /dev/null +++ b/tests/multiple_inputs/BUILD.bazel @@ -0,0 +1,30 @@ +load("@rules_python//python:pip.bzl", "compile_pip_requirements") + +compile_pip_requirements( + name = "multiple_requirements_in", + srcs = [ + "requirements_1.in", + "requirements_2.in", + ], + requirements_txt = "multiple_requirements_in.txt", +) + +compile_pip_requirements( + name = "multiple_pyproject_toml", + srcs = [ + "a/pyproject.toml", + "b/pyproject.toml", + ], + requirements_txt = "multiple_pyproject_toml.txt", +) + +compile_pip_requirements( + name = "multiple_inputs", + srcs = [ + "a/pyproject.toml", + "b/pyproject.toml", + "requirements_1.in", + "requirements_2.in", + ], + requirements_txt = "multiple_inputs.txt", +) diff --git a/tests/multiple_inputs/README.md b/tests/multiple_inputs/README.md new file mode 100644 index 0000000000..7b6bade122 --- /dev/null +++ b/tests/multiple_inputs/README.md @@ -0,0 +1,3 @@ +# multiple_inputs + +Test that `compile_pip_requirements` works as intended when using more than one input file. diff --git a/tests/multiple_inputs/a/pyproject.toml b/tests/multiple_inputs/a/pyproject.toml new file mode 100644 index 0000000000..91efec3821 --- /dev/null +++ b/tests/multiple_inputs/a/pyproject.toml @@ -0,0 +1,5 @@ +[project] +name = "multiple_inputs_1" +version = "0.0.0" + +dependencies = ["urllib3"] diff --git a/tests/multiple_inputs/b/pyproject.toml b/tests/multiple_inputs/b/pyproject.toml new file mode 100644 index 0000000000..a461f4ed98 --- /dev/null +++ b/tests/multiple_inputs/b/pyproject.toml @@ -0,0 +1,5 @@ +[project] +name = "multiple_inputs_2" +version = "0.0.0" + +dependencies = ["attrs"] diff --git a/tests/multiple_inputs/multiple_inputs.txt b/tests/multiple_inputs/multiple_inputs.txt new file mode 100644 index 0000000000..a036c3f33d --- /dev/null +++ b/tests/multiple_inputs/multiple_inputs.txt @@ -0,0 +1,18 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# bazel run //tests/multiple_inputs:multiple_inputs.update +# +attrs==23.1.0 \ + --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ + --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 + # via + # -r tests/multiple_inputs/requirements_2.in + # multiple_inputs_2 (tests/multiple_inputs/b/pyproject.toml) +urllib3==2.0.7 \ + --hash=sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84 \ + --hash=sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e + # via + # -r tests/multiple_inputs/requirements_1.in + # multiple_inputs_1 (tests/multiple_inputs/a/pyproject.toml) diff --git a/tests/multiple_inputs/multiple_pyproject_toml.txt b/tests/multiple_inputs/multiple_pyproject_toml.txt new file mode 100644 index 0000000000..b8af28ac10 --- /dev/null +++ b/tests/multiple_inputs/multiple_pyproject_toml.txt @@ -0,0 +1,14 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# bazel run //tests/multiple_inputs:multiple_pyproject_toml.update +# +attrs==23.1.0 \ + --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ + --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 + # via multiple_inputs_2 (tests/multiple_inputs/b/pyproject.toml) +urllib3==2.0.7 \ + --hash=sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84 \ + --hash=sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e + # via multiple_inputs_1 (tests/multiple_inputs/a/pyproject.toml) diff --git a/tests/multiple_inputs/multiple_requirements_in.txt b/tests/multiple_inputs/multiple_requirements_in.txt new file mode 100644 index 0000000000..63edfe9f53 --- /dev/null +++ b/tests/multiple_inputs/multiple_requirements_in.txt @@ -0,0 +1,14 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# bazel run //tests/multiple_inputs:multiple_requirements_in.update +# +attrs==23.1.0 \ + --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ + --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 + # via -r tests/multiple_inputs/requirements_2.in +urllib3==2.0.7 \ + --hash=sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84 \ + --hash=sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e + # via -r tests/multiple_inputs/requirements_1.in diff --git a/tests/multiple_inputs/requirements_1.in b/tests/multiple_inputs/requirements_1.in new file mode 100644 index 0000000000..a42590bebe --- /dev/null +++ b/tests/multiple_inputs/requirements_1.in @@ -0,0 +1 @@ +urllib3 diff --git a/tests/multiple_inputs/requirements_2.in b/tests/multiple_inputs/requirements_2.in new file mode 100644 index 0000000000..04cb10228e --- /dev/null +++ b/tests/multiple_inputs/requirements_2.in @@ -0,0 +1 @@ +attrs From 425dfb0b225e4037978b32707534095daa6205dc Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 15 Aug 2024 13:13:09 -0700 Subject: [PATCH 157/345] chore: update changelog for 0.35.0 release (#2124) Updates the changelog to have 0.35.0 headers in prep for release --- CHANGELOG.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23d910ce3d..1b457c411d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,19 @@ A brief description of the categories of changes: [x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/x.x.x +### Changed +* Nothing yet + +### Added +* Nothing yet + +### Removed +* Nothing yet + +## [0.35.0] - 2024-08-15 + +[0.35.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.35.0 + ### Changed * (whl_library) A better log message when the wheel is built from an sdist or when the wheel is downloaded using `download_only` feature to aid debugging. @@ -33,6 +46,9 @@ A brief description of the categories of changes: include dependency updates `3.8.19`, `3.9.19`, `3.10.14`, `3.11.9` * (toolchains): Bump default toolchain versions to: * `3.12 -> 3.12.4` +* (rules) `PYTHONSAFEPATH` is inherited from the calling environment to allow + disabling it (Requires {obj}`--bootstrap_impl=script`) + ([#2060](https://github.com/bazelbuild/rules_python/issues/2060)). ### Fixed * (rules) `compile_pip_requirements` now sets the `USERPROFILE` env variable on @@ -98,8 +114,6 @@ A brief description of the categories of changes: [pytest_bazel]: https://pypi.org/project/pytest-bazel [20240726]: https://github.com/indygreg/python-build-standalone/releases/tag/20240726 -### Removed -* Nothing yet ## [0.34.0] - 2024-07-04 From 13ce1927b4ae03eb9b09542cd04ef2f5f0c1fd3e Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Mon, 19 Aug 2024 11:08:38 -0700 Subject: [PATCH 158/345] sphinxdocs: add docs; support sources from other directories (#2128) Documents how to use Sphinx syntax when writing docs. There's a variety of features the `sphinx_bzl` plugin enables, but without docs, they're somewhat hard to discover and figure out how to use. Because sphinxdocs is almost entirely separate, adding its docs under `//sphinxdocs/docs` is a more natural fit. Unfortunately, this became very verbose, repetitive, and tedious, for two reasons: 1. The only way `sphinx_docs` could accept files from other directories was using the `rename_srcs` arg and manually renaming files one-by-one. 2. Similarly, `sphinx_stardocs` required a one-by-one mapping of each bzl file to its output file, which then had to be repeated in `rename_srcs`. To fix (1), the `sphinx_docs.deps` attribute and `sphinx_docs_library` rule are added. The library targets collect files, and `sphinx_docs` moves then into the final Sphinx sources directory. To fix (2), the `sphinx_stardoc.srcs` attribute is added, which accepts `bzl_library` targets. I noticed that, in almost all cases, the output name was simply the input name with the `.md` extension, so the rule now does that by default. For special cases, the `sphinx_stardoc` (singular) rule can be called directly. Also: * Adds `bzl:rule` as a cross reference lookup role * Removes some defunct stuff relating to the stardoc template files that aren't used anymore. * Disables warnings from the autosectionlabel extension. These were spamming warnings because CHANGELOG.md has many headers with the same name. * Adds more entries to bazel inventory (all of native and ctx) --- docs/sphinx/BUILD.bazel | 81 +++--- docs/sphinx/_stardoc_footer.md | 15 - docs/sphinx/conf.py | 7 +- docs/sphinx/index.md | 1 + sphinxdocs/BUILD.bazel | 6 + sphinxdocs/docs/BUILD.bazel | 55 ++++ sphinxdocs/docs/api/sphinxdocs/index.md | 29 ++ .../docs/api/sphinxdocs/inventories/index.md | 11 + sphinxdocs/docs/index.md | 20 ++ sphinxdocs/docs/sphinx-bzl.md | 203 ++++++++++++++ sphinxdocs/docs/starlark-docgen.md | 75 +++++ sphinxdocs/inventories/bazel_inventory.txt | 50 +++- sphinxdocs/private/BUILD.bazel | 31 ++- sphinxdocs/private/readthedocs.bzl | 8 +- sphinxdocs/private/sphinx.bzl | 256 +++++++++++------- sphinxdocs/private/sphinx_docs_library.bzl | 51 ++++ .../private/sphinx_docs_library_info.bzl | 30 ++ .../private/sphinx_docs_library_macro.bzl | 13 + sphinxdocs/private/sphinx_stardoc.bzl | 213 +++++++++++++-- sphinxdocs/sphinx.bzl | 2 +- sphinxdocs/sphinx_docs_library.bzl | 5 + sphinxdocs/sphinx_stardoc.bzl | 3 +- sphinxdocs/src/sphinx_bzl/bzl.py | 1 + sphinxdocs/tests/sphinx_stardoc/BUILD.bazel | 77 ++++-- 24 files changed, 1030 insertions(+), 213 deletions(-) delete mode 100644 docs/sphinx/_stardoc_footer.md create mode 100644 sphinxdocs/docs/BUILD.bazel create mode 100644 sphinxdocs/docs/api/sphinxdocs/index.md create mode 100644 sphinxdocs/docs/api/sphinxdocs/inventories/index.md create mode 100644 sphinxdocs/docs/index.md create mode 100644 sphinxdocs/docs/sphinx-bzl.md create mode 100644 sphinxdocs/docs/starlark-docgen.md create mode 100644 sphinxdocs/private/sphinx_docs_library.bzl create mode 100644 sphinxdocs/private/sphinx_docs_library_info.bzl create mode 100644 sphinxdocs/private/sphinx_docs_library_macro.bzl create mode 100644 sphinxdocs/sphinx_docs_library.bzl diff --git a/docs/sphinx/BUILD.bazel b/docs/sphinx/BUILD.bazel index 947ebbae15..03c0e446b8 100644 --- a/docs/sphinx/BUILD.bazel +++ b/docs/sphinx/BUILD.bazel @@ -19,7 +19,7 @@ load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: dis load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility load("//sphinxdocs:readthedocs.bzl", "readthedocs_install") load("//sphinxdocs:sphinx.bzl", "sphinx_build_binary", "sphinx_docs") -load("//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardocs") +load("//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardoc", "sphinx_stardocs") # We only build for Linux and Mac because: # 1. The actual doc process only runs on Linux @@ -38,9 +38,7 @@ _TARGET_COMPATIBLE_WITH = select({ # * `ibazel build //docs/sphinx:docs` to automatically rebuild docs sphinx_docs( name = "docs", - srcs = [ - ":bzl_api_docs", - ] + glob( + srcs = glob( include = [ "*.md", "**/*.md", @@ -66,43 +64,56 @@ sphinx_docs( strip_prefix = package_name() + "/", tags = ["docs"], target_compatible_with = _TARGET_COMPATIBLE_WITH, + deps = [ + ":bzl_api_docs", + "//sphinxdocs/docs:docs_lib", + ], ) sphinx_stardocs( name = "bzl_api_docs", - docs = { - "api/python/cc/py_cc_toolchain.md": dict( - dep = "//python/private:py_cc_toolchain_bzl", - input = "//python/private:py_cc_toolchain_rule.bzl", - public_load_path = "//python/cc:py_cc_toolchain.bzl", - ), - "api/python/cc/py_cc_toolchain_info.md": "//python/cc:py_cc_toolchain_info_bzl", - "api/python/defs.md": "//python:defs_bzl", - "api/python/entry_points/py_console_script_binary.md": "//python/entry_points:py_console_script_binary_bzl", - "api/python/packaging.md": "//python:packaging_bzl", - "api/python/pip.md": "//python:pip_bzl", - "api/python/private/common/py_binary_rule_bazel.md": "//python/private/common:py_binary_rule_bazel_bzl", - "api/python/private/common/py_library_rule_bazel.md": "//python/private/common:py_library_rule_bazel_bzl", - "api/python/private/common/py_runtime_rule.md": "//python/private/common:py_runtime_rule_bzl", - "api/python/private/common/py_test_rule_bazel.md": "//python/private/common:py_test_rule_bazel_bzl", - "api/python/py_binary.md": "//python:py_binary_bzl", - "api/python/py_cc_link_params_info.md": "//python:py_cc_link_params_info_bzl", - "api/python/py_library.md": "//python:py_library_bzl", - "api/python/py_runtime.md": "//python:py_runtime_bzl", - "api/python/py_runtime_info.md": "//python:py_runtime_info_bzl", - "api/python/py_runtime_pair.md": dict( - dep = "//python/private:py_runtime_pair_rule_bzl", - input = "//python/private:py_runtime_pair_rule.bzl", - public_load_path = "//python:py_runtime_pair.bzl", - ), - "api/python/py_test.md": "//python:py_test_bzl", - } | ({ + srcs = [ + "//python:defs_bzl", + "//python:packaging_bzl", + "//python:pip_bzl", + "//python:py_binary_bzl", + "//python:py_cc_link_params_info_bzl", + "//python:py_library_bzl", + "//python:py_runtime_bzl", + "//python:py_runtime_info_bzl", + "//python:py_test_bzl", + "//python/cc:py_cc_toolchain_info_bzl", + "//python/entry_points:py_console_script_binary_bzl", + "//python/private/common:py_binary_rule_bazel_bzl", + "//python/private/common:py_library_rule_bazel_bzl", + "//python/private/common:py_runtime_rule_bzl", + "//python/private/common:py_test_rule_bazel_bzl", + ] + ([ # Bazel 6 + Stardoc isn't able to parse something about the python bzlmod extension - "api/python/extensions/python.md": "//python/extensions:python_bzl", - } if IS_BAZEL_7_OR_HIGHER else {}) | ({ + "//python/extensions:python_bzl", + ] if IS_BAZEL_7_OR_HIGHER else []) + ([ # This depends on @pythons_hub, which is only created under bzlmod, - "api/python/extensions/pip.md": "//python/extensions:pip_bzl", - } if IS_BAZEL_7_OR_HIGHER and BZLMOD_ENABLED else {}), + "//python/extensions:pip_bzl", + ] if IS_BAZEL_7_OR_HIGHER and BZLMOD_ENABLED else []), + prefix = "api/", + tags = ["docs"], + target_compatible_with = _TARGET_COMPATIBLE_WITH, +) + +sphinx_stardoc( + name = "py_cc_toolchain", + src = "//python/private:py_cc_toolchain_rule.bzl", + prefix = "api/", + public_load_path = "//python/cc:py_cc_toolchain.bzl", + tags = ["docs"], + target_compatible_with = _TARGET_COMPATIBLE_WITH, + deps = ["//python/cc:py_cc_toolchain_bzl"], +) + +sphinx_stardoc( + name = "py_runtime_pair", + src = "//python/private:py_runtime_pair_rule_bzl", + public_load_path = "//python:py_runtime_pair.bzl", tags = ["docs"], target_compatible_with = _TARGET_COMPATIBLE_WITH, ) diff --git a/docs/sphinx/_stardoc_footer.md b/docs/sphinx/_stardoc_footer.md deleted file mode 100644 index 7aa33f778f..0000000000 --- a/docs/sphinx/_stardoc_footer.md +++ /dev/null @@ -1,15 +0,0 @@ - -[`Action`]: https://bazel.build/rules/lib/Action -[`bool`]: https://bazel.build/rules/lib/bool -[`depset`]: https://bazel.build/rules/lib/depset -[`dict`]: https://bazel.build/rules/lib/dict -[`File`]: https://bazel.build/rules/lib/File -[`Label`]: https://bazel.build/rules/lib/Label -[`list`]: https://bazel.build/rules/lib/list -[`str`]: https://bazel.build/rules/lib/string -[str]: https://bazel.build/rules/lib/string -[`int`]: https://bazel.build/rules/lib/int -[`struct`]: https://bazel.build/rules/lib/builtins/struct -[`Target`]: https://bazel.build/rules/lib/Target -[target-name]: https://bazel.build/concepts/labels#target-names -[attr-label]: https://bazel.build/concepts/labels diff --git a/docs/sphinx/conf.py b/docs/sphinx/conf.py index b3155778e6..3200466efc 100644 --- a/docs/sphinx/conf.py +++ b/docs/sphinx/conf.py @@ -144,7 +144,12 @@ # -- Options for EPUB output epub_show_urls = "footnote" -suppress_warnings = [] +suppress_warnings = [ + # The autosectionlabel extension turns header titles into referencable + # names. Unfortunately, CHANGELOG.md has many duplicate header titles, + # which creates lots of warning spam. Just ignore them. + "autosectionlabel.*" +] def setup(app): diff --git a/docs/sphinx/index.md b/docs/sphinx/index.md index 8405eacb31..445cf20268 100644 --- a/docs/sphinx/index.md +++ b/docs/sphinx/index.md @@ -67,6 +67,7 @@ support Changelog api/index environment-variables +Sphinxdocs glossary genindex ``` diff --git a/sphinxdocs/BUILD.bazel b/sphinxdocs/BUILD.bazel index 6cb69ba881..9ad1e1eef9 100644 --- a/sphinxdocs/BUILD.bazel +++ b/sphinxdocs/BUILD.bazel @@ -47,6 +47,12 @@ bzl_library( deps = ["//sphinxdocs/private:sphinx_bzl"], ) +bzl_library( + name = "sphinx_docs_library_bzl", + srcs = ["sphinx_docs_library.bzl"], + deps = ["//sphinxdocs/private:sphinx_docs_library_macro_bzl"], +) + bzl_library( name = "sphinx_stardoc_bzl", srcs = ["sphinx_stardoc.bzl"], diff --git a/sphinxdocs/docs/BUILD.bazel b/sphinxdocs/docs/BUILD.bazel new file mode 100644 index 0000000000..a85155b0ef --- /dev/null +++ b/sphinxdocs/docs/BUILD.bazel @@ -0,0 +1,55 @@ +load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility +load("//sphinxdocs:sphinx_docs_library.bzl", "sphinx_docs_library") +load("//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardocs") + +package(default_visibility = ["//:__subpackages__"]) + +# 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_library( + name = "docs_lib", + deps = [ + ":artisian_api_docs", + ":artisian_docs", + ":bzl_docs", + ], +) + +sphinx_docs_library( + name = "artisian_docs", + srcs = glob( + ["**/*.md"], + exclude = ["api/**"], + ), + prefix = "sphinxdocs/", +) + +sphinx_docs_library( + name = "artisian_api_docs", + srcs = glob( + ["api/**/*.md"], + ), +) + +sphinx_stardocs( + name = "bzl_docs", + srcs = [ + "//sphinxdocs:readthedocs_bzl", + "//sphinxdocs:sphinx_bzl", + "//sphinxdocs:sphinx_docs_library_bzl", + "//sphinxdocs:sphinx_stardoc_bzl", + "//sphinxdocs/private:sphinx_docs_library_bzl", + ], + prefix = "api/", + target_compatible_with = _TARGET_COMPATIBLE_WITH, +) diff --git a/sphinxdocs/docs/api/sphinxdocs/index.md b/sphinxdocs/docs/api/sphinxdocs/index.md new file mode 100644 index 0000000000..bd4e9b6eec --- /dev/null +++ b/sphinxdocs/docs/api/sphinxdocs/index.md @@ -0,0 +1,29 @@ +:::{bzl:currentfile} //sphinxdocs:BUILD.bazel +::: + +# //sphinxdocs + +:::{bzl:flag} extra_defines +Additional `-D` values to add to every Sphinx build. + +This is a list flag. Multiple uses are accumulated. + +This is most useful for overriding e.g. the version when performing +release builds. +::: + +:::{bzl:flag} extra_env +Additional environment variables to for every Sphinx build. + +This is a list flag. Multiple uses are accumulated. Values are `key=value` +format. +::: + +:::{bzl:flag} quiet +Whether to add the `-q` arg to Sphinx invocations. + +This is a boolean flag. + +This is useful for debugging invocations or developing extensions. The Sphinx +`-q` flag causes sphinx to produce additional output on stdout. +::: diff --git a/sphinxdocs/docs/api/sphinxdocs/inventories/index.md b/sphinxdocs/docs/api/sphinxdocs/inventories/index.md new file mode 100644 index 0000000000..a03645ed44 --- /dev/null +++ b/sphinxdocs/docs/api/sphinxdocs/inventories/index.md @@ -0,0 +1,11 @@ +:::{bzl:currentfile} //sphinxdocs/inventories:BUILD.bazel +::: + +# //sphinxdocs/inventories + +:::{bzl:target} bazel_inventory +A Sphinx inventory of Bazel objects. + +By including this target in your Sphinx build and enabling intersphinx, cross +references to builtin Bazel objects can be written. +::: diff --git a/sphinxdocs/docs/index.md b/sphinxdocs/docs/index.md new file mode 100644 index 0000000000..ac857d625b --- /dev/null +++ b/sphinxdocs/docs/index.md @@ -0,0 +1,20 @@ +# Docgen using Sphinx with Bazel + +The `sphinxdocs` project allows using Bazel to run Sphinx to generate +documentation. It comes with: + +* Rules for running Sphinx +* Rules for generating documentation for Starlark code. +* A Sphinx plugin for documenting Starlark and Bazel objects. +* Rules for readthedocs build integration. + +While it is primarily oriented towards docgen for Starlark code, the core of it +is agnostic as to what is being documented. + + +```{toctree} +:hidden: + +starlark-docgen +sphinx-bzl +``` diff --git a/sphinxdocs/docs/sphinx-bzl.md b/sphinxdocs/docs/sphinx-bzl.md new file mode 100644 index 0000000000..c6dc430dd6 --- /dev/null +++ b/sphinxdocs/docs/sphinx-bzl.md @@ -0,0 +1,203 @@ +# Bazel plugin for Sphinx + +The `sphinx_bzl` Python package is a Sphinx plugin that defines a custom domain +("bzl") in the Sphinx system. This provides first-class integration with Sphinx +and allows code comments to provide rich information and allows manually writing +docs for objects that aren't directly representable in bzl source code. For +example, the fields of a provider can use `:type:` to indicate the type of a +field, or manually written docs can use the `{bzl:target}` directive to document +a well known target. + +## Configuring Sphinx + +To enable the plugin in Sphinx, depend on +`@rules_python//sphinxdocs/src/sphinx_bzl` and enable it in `conf.py`: + +``` +extensions = [ + "sphinx_bzl.bzl", +] +``` + +## Brief introduction to Sphinx terminology + +To aid understanding how to write docs, lets define a few common terms: + +* **Role**: A role is the "bzl:obj" part when writing ``{bzl:obj}`ref` ``. + Roles mark inline text as needing special processing. There's generally + two types of processing: creating cross references, or role-specific custom + rendering. For example `{bzl:obj}` will create a cross references, while + `{bzl:default-value}` indicates the default value of an argument. +* **Directive**: A directive is indicated with `:::` and allows defining an + entire object and its parts. For example, to describe a function and its + arguments, the `:::{bzl:function}` directive is used. +* **Directive Option**: A directive option is the "type" part when writing + `:type:` within a directive. Directive options are how directives are told + the meaning of certain values, such as the type of a provider field. Depending + on the object being documented, a directive option may be used instead of + special role to indicate semantic values. + +Most often, you'll be using roles to refer other objects or indicate special +values in doc strings. For directives, you're likely to only use them when +manually writing docs to document flags, targets, or other objects that +`sphinx_stardoc` generates for you. + +## MyST vs RST + +By default, Sphinx uses ReStructured Text (RST) syntax for its documents. +Unfortunately, RST syntax is very different than the popular Markdown syntax. To +bridge the gap, MyST translates Markdown-style syntax into the RST equivalents. +This allows easily using Markdown in bzl files. + +While MyST isn't required for the core `sphinx_bzl` plugin to work, this +document uses MyST syntax because `sphinx_stardoc` bzl doc gen rule requires +MyST. + +## Type expressions + +Several roles or fields accept type expressions. Type expressions use +Python-style annotation syntax to describe data types. For example `None | list[str]` +describes a type of "None or a list of strings". Each component of the +expression is parsed and cross reference to its associated type definition. + +## Cross references + +In brief, to reference bzl objects, use the `bzl:obj` role and use the +Bazel label string you would use to refer to the object in Bazel (using `%` to +denote names within a file). For example, to unambiguously refer to `py_binary`: + +``` +{bzl:obj}`@rules_python//python:py_binary.bzl%py_binary` +``` + +The above is pretty long, so shorter names are also supported, and `sphinx_bzl` +will try to find something that matches. Additionally, in `.bzl` code, the +`bzl:` prefix is set as the default. The above can then be shortened to: + +``` +{obj}`py_binary` +``` + +The text that is displayed by be customized by putting the reference string in +chevrons (`<>`): + +``` +{obj}`the binary rule ` +``` + +Finally, specific types of objects (rules, functions, providers, etc) can be +specified to help disambiguate short names: + +``` +{function}`py_binary` # Refers to the wrapping macro +{rule}`py_binary` # Refers to the underlying rule +``` + +Those are the basics of cross referencing. Sphinx has several additional +syntaxes for finding and referencing objects; see +[the MyST docs for supported +syntaxes](https://myst-parser.readthedocs.io/en/latest/syntax/cross-referencing.html#reference-roles) + + +### Cross reference roles + +A cross reference role is the `obj` portion of `{bzl:obj}`. It affects what is +searched and matched. Supported cross reference roles are: + +* `{bzl:arg}`: Refer to a function argument. +* `{bzl:attr}`: Refer to a rule attribute. +* `{bzl:obj}`: Refer to any type of Bazel object +* `{bzl:rule}`: Refer to a rule. +* `{bzl:target}`: Refer to a target. +* `{bzl:type}`: Refer to a type or type expression; can also be used in argument + documentation. + +## Special roles + +There are several special roles that can be used to annotate parts of objects, +such as the type of arguments or their default values. + +### Role bzl:default-value + +Indicate the default value for a function argument or rule attribute. Use it in +the Args doc of a function or the doc text of an attribute. + +``` +def func(arg=1): + """Do stuff + + Args: + foo: {default-value}`1` the arg + +my_rule = rule(attrs = { + "foo": attr.string(doc="{default-value}`bar`) +}) + +``` + +### Role bzl:return-type + +Indicates the return type for a function. Use it in the Returns doc of a +function. + +``` +def func(): + """Do stuff + + Returns: + {return-type}`int` + """ + return 1 +``` + +### Role bzl:type + +Indicates the type of an argument for a function. Use it in the Args doc of +a function. + +``` +def func(arg): + """Do stuff + + Args: + arg: {type}`int` + """ + print(arg + 1) +``` + +## Directives + +Most directives are automatically generated by `sphinx_stardoc`. Here, we only +document ones that must be manually written. + +To write a directive, a line starts with 3 to 6 colons (`:`), followed by the +directive name in braces (`{}`), and eventually ended by the same number of +colons on their own line. For example: + +``` +:::{bzl:target} //my:target + +Doc about target +::: +``` + +### Directive bzl:currentfile + +This directive indicates the Bazel file that objects defined in the current +documentation file are in. This is required for any page that defines Bazel +objects. + +### Directive bzl:target + +Documents a target. It takes no directive options + +``` +:::{bzl:target} //foo:target + +My docs +::: +``` + +### Directive bzl:flag + +Documents a flag. It has the same format as `bzl:target` diff --git a/sphinxdocs/docs/starlark-docgen.md b/sphinxdocs/docs/starlark-docgen.md new file mode 100644 index 0000000000..d131607c8e --- /dev/null +++ b/sphinxdocs/docs/starlark-docgen.md @@ -0,0 +1,75 @@ +# Starlark docgen + +Using the `sphinx_stardoc` rule, API documentation can be generated from bzl +source code. This rule requires both MyST-based markdown and the `sphinx_bzl` +Sphinx extension are enabled. This allows source code to use Markdown and +Sphinx syntax to create rich documentation with cross references, types, and +more. + + +## Configuring Sphinx + +While the `sphinx_stardoc` rule doesn't require Sphinx itself, the source +it generates requires some additional Sphinx plugins and config settings. + +When defining the `sphinx_build_binary` target, also depend on: +* `@rules_python//sphinxdocs/src/sphinx_bzl:sphinx_bzl` +* `myst_parser` (e.g. `@pypi//myst_parser`) +* `typing_extensions` (e.g. `@pypi//myst_parser`) + +``` +sphinx_build_binary( + name = "sphinx-build", + deps = [ + "@rules_python//sphinxdocs/src/sphinx_bzl", + "@pypi//myst_parser", + "@pypi//typing_extensions", + ... + ] +) +``` + +In `conf.py`, enable the `sphinx_bzl` extension, `myst_parser` extension, +and the `colon_fence` MyST extension. + +``` +extensions = [ + "myst_parser", + "sphinx_bzl.bzl", +] + +myst_enable_extensions = [ + "colon_fence", +] +``` + +## Generating docs from bzl files + +To convert the bzl code to Sphinx doc sources, `sphinx_stardocs` is the primary +rule to do so. It takes a list of `bzl_library` targets or files and generates docs for +each. When a `bzl_library` target is passed, the `bzl_library.srcs` value can only +have a single file. + +Example: + +``` +sphinx_stardocs( + name = "my_docs", + srcs = [ + ":binary_bzl", + ":library_bzl", + ] +) + +bzl_library( + name = "binary_bzl", + srcs = ["binary.bzl"], + deps = ... +) + +bzl_library( + name = "library_bzl", + srcs = ["library.bzl"], + deps = ... +) +``` diff --git a/sphinxdocs/inventories/bazel_inventory.txt b/sphinxdocs/inventories/bazel_inventory.txt index a7f0222324..445f0f71f4 100644 --- a/sphinxdocs/inventories/bazel_inventory.txt +++ b/sphinxdocs/inventories/bazel_inventory.txt @@ -1,16 +1,50 @@ # Sphinx inventory version 2 # Project: Bazel -# Version: 7.0.0 +# Version: 7.3.0 # The remainder of this file is compressed using zlib Action bzl:type 1 rules/lib/Action - File bzl:type 1 rules/lib/File - Label bzl:type 1 rules/lib/Label - Target bzl:type 1 rules/lib/builtins/Target - bool bzl:type 1 rules/lib/bool - +ctx.actions bzl:obj 1 rules/lib/builtins/ctx#actions - +ctx.aspect_ids bzl:obj 1 rules/lib/builtins/ctx#aspect_ids - +ctx.attr bzl:obj 1 rules/lib/builtins/ctx#attr - +ctx.bin_dir bzl:obj 1 rules/lib/builtins/ctx#bin_dir - +ctx.build_file_path bzl:obj 1 rules/lib/builtins/ctx#build_file_path - +ctx.build_setting_value bzl:obj 1 rules/lib/builtins/ctx#build_setting_value - +ctx.configuration bzl:obj 1 rules/lib/builtins/ctx#configuration - +ctx.coverage_instrumented bzl:function 1 rules/lib/builtins/ctx#coverage_instrumented - +ctx.created_actions bzl:function 1 rules/lib/builtins/ctx#created_actions - +ctx.disabled_features bzl:obj 1 rules/lib/builtins/ctx#disabled_features - +ctx.exec_groups bzl:obj 1 rules/lib/builtins/ctx#exec_groups - +ctx.executable bzl:obj 1 rules/lib/builtins/ctx#executable - +ctx.expand_location bzl:function 1 rules/lib/builtins/ctx#expand_location - +ctx.expand_location bzl:function 1 rules/lib/builtins/ctx#expand_location - - +ctx.expand_make_variables bzl:function 1 rules/lib/builtins/ctx#expand_make_variables - +ctx.features bzl:obj 1 rules/lib/builtins/ctx#features - +ctx.file bzl:obj 1 rules/lib/builtins/ctx#file - +ctx.files bzl:obj 1 rules/lib/builtins/ctx#files - +ctx.fragments bzl:obj 1 rules/lib/builtins/ctx#fragments - +ctx.genfiles_dir bzl:obj 1 rules/lib/builtins/ctx#genfiles_dir - +ctx.info_file bzl:obj 1 rules/lib/builtins/ctx#info_file - +ctx.label bzl:obj 1 rules/lib/builtins/ctx#label - +ctx.outputs bzl:obj 1 rules/lib/builtins/ctx#outputs - +ctx.resolve_command bzl:function 1 rules/lib/builtins/ctx#resolve_command - +ctx.resolve_tools bzl:function 1 rules/lib/builtins/ctx#resolve_tools - +ctx.rule bzl:obj 1 rules/lib/builtins/ctx#rule - +ctx.runfiles bzl:function 1 rules/lib/builtins/ctx#runfiles - +ctx.split_attr bzl:obj 1 rules/lib/builtins/ctx#split_attr - +ctx.super bzl:obj 1 rules/lib/builtins/ctx#super - +ctx.target_platform_has_constraint bzl:function 1 rules/lib/builtins/ctx#target_platform_has_constraint - +ctx.toolchains bzl:obj 1 rules/lib/builtins/ctx#toolchains - +ctx.var bzl:obj 1 rules/lib/builtins/ctx#var - +ctx.version_file bzl:obj 1 rules/lib/builtins/ctx#version_file - +ctx.workspace_name bzl:obj 1 rules/lib/builtins/ctx#workspace_name - int bzl:type 1 rules/lib/int - depset bzl:type 1 rules/lib/depset - dict bzl:type 1 rules/lib/dict - -label bzl:doc 1 concepts/labels - +label bzl:type 1 concepts/labels - attr.bool bzl:type 1 rules/lib/toplevel/attr#bool - attr.int bzl:type 1 rules/lib/toplevel/attr#int - attr.label bzl:type 1 rules/lib/toplevel/attr#label - @@ -18,7 +52,17 @@ attr.label_list bzl:type 1 rules/lib/toplevel/attr#label_list - attr.string bzl:type 1 rules/lib/toplevel/attr#string - attr.string_list bzl:type 1 rules/lib/toplevel/attr#string_list - list bzl:type 1 rules/lib/list - -python bzl:doc 1 reference/be/python - +native.existing_rule bzl:function 1 rules/lib/toplevel/native#existing_rule - +native.existing_rules bzl:function 1 rules/lib/toplevel/native#existing_rules - +native.exports_files bzl:function 1 rules/lib/toplevel/native#exports_files - +native.glob bzl:function 1 rules/lib/toplevel/native#glob - +native.module_name bzl:function 1 rules/lib/toplevel/native#module_name - +native.module_version bzl:function 1 rules/lib/toplevel/native#module_version - +native.package_group bzl:function 1 rules/lib/toplevel/native#package_group - +native.package_name bzl:function 1 rules/lib/toplevel/native#package_name - +native.package_relative_label bzl:function 1 rules/lib/toplevel/native#package_relative_label - +native.repo_name bzl:function 1 rules/lib/toplevel/native#repo_name - +native.repository_name bzl:function 1 rules/lib/toplevel/native#repository_name - str bzl:type 1 rules/lib/string - struct bzl:type 1 rules/lib/builtins/struct - Name bzl:type 1 concepts/labels#target-names - diff --git a/sphinxdocs/private/BUILD.bazel b/sphinxdocs/private/BUILD.bazel index ec6a945ac5..d91e048e8f 100644 --- a/sphinxdocs/private/BUILD.bazel +++ b/sphinxdocs/private/BUILD.bazel @@ -26,25 +26,44 @@ package( # referenced by the //sphinxdocs macros. exports_files( [ - "func_template.vm", - "header_template.vm", - "provider_template.vm", "readthedocs_install.py", - "rule_template.vm", "sphinx_build.py", "sphinx_server.py", ], visibility = ["//visibility:public"], ) +bzl_library( + name = "sphinx_docs_library_macro_bzl", + srcs = ["sphinx_docs_library_macro.bzl"], + deps = [ + ":sphinx_docs_library_bzl", + "//python/private:util_bzl", + ], +) + +bzl_library( + name = "sphinx_docs_library_bzl", + srcs = ["sphinx_docs_library.bzl"], + deps = [":sphinx_docs_library_info_bzl"], +) + +bzl_library( + name = "sphinx_docs_library_info_bzl", + srcs = ["sphinx_docs_library_info.bzl"], +) + bzl_library( name = "sphinx_bzl", srcs = ["sphinx.bzl"], deps = [ + ":sphinx_docs_library_info_bzl", "//python:py_binary_bzl", + "@bazel_skylib//:bzl_library", "@bazel_skylib//lib:paths", "@bazel_skylib//lib:types", "@bazel_skylib//rules:build_test", + "@bazel_skylib//rules:common_settings", "@io_bazel_stardoc//stardoc:stardoc_lib", ], ) @@ -53,7 +72,11 @@ bzl_library( name = "sphinx_stardoc_bzl", srcs = ["sphinx_stardoc.bzl"], deps = [ + ":sphinx_docs_library_macro_bzl", "//python/private:util_bzl", + "//sphinxdocs:sphinx_bzl", + "@bazel_skylib//:bzl_library", + "@bazel_skylib//lib:paths", "@bazel_skylib//lib:types", "@bazel_skylib//rules:build_test", "@io_bazel_stardoc//stardoc:stardoc_lib", diff --git a/sphinxdocs/private/readthedocs.bzl b/sphinxdocs/private/readthedocs.bzl index ee8e7aa0e2..a62c51b86a 100644 --- a/sphinxdocs/private/readthedocs.bzl +++ b/sphinxdocs/private/readthedocs.bzl @@ -27,11 +27,11 @@ def readthedocs_install(name, docs, **kwargs): for more information. Args: - name: (str) name of the installer - docs: (label list) list of targets that generate directories to copy + name: {type}`Name` name of the installer + docs: {type}`list[label]` list of targets that generate directories to copy into the directories readthedocs expects final output in. This - is typically a single `sphinx_stardocs` target. - **kwargs: (dict) additional kwargs to pass onto the installer + is typically a single {obj}`sphinx_stardocs` target. + **kwargs: {type}`dict` additional kwargs to pass onto the installer """ add_tag(kwargs, "@rules_python//sphinxdocs:readthedocs_install") py_binary( diff --git a/sphinxdocs/private/sphinx.bzl b/sphinxdocs/private/sphinx.bzl index a5ac83152e..a198291a88 100644 --- a/sphinxdocs/private/sphinx.bzl +++ b/sphinxdocs/private/sphinx.bzl @@ -15,13 +15,26 @@ """Implementation of sphinx rules.""" load("@bazel_skylib//lib:paths.bzl", "paths") +load("@bazel_skylib//rules:build_test.bzl", "build_test") load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("//python:py_binary.bzl", "py_binary") load("//python/private:util.bzl", "add_tag", "copy_propagating_kwargs") # buildifier: disable=bzl-visibility +load(":sphinx_docs_library_info.bzl", "SphinxDocsLibraryInfo") _SPHINX_BUILD_MAIN_SRC = Label("//sphinxdocs/private:sphinx_build.py") _SPHINX_SERVE_MAIN_SRC = Label("//sphinxdocs/private:sphinx_server.py") +_SphinxSourceTreeInfo = provider( + doc = "Information about source tree for Sphinx to build.", + fields = { + "source_root": """ +:type: str + +Path of the root directory for the source files (which are in DefaultInfo.files) +""", + }, +) + def sphinx_build_binary(name, py_binary_rule = py_binary, **kwargs): """Create an executable with the sphinx-build command line interface. @@ -29,13 +42,13 @@ def sphinx_build_binary(name, py_binary_rule = py_binary, **kwargs): needs at runtime. Args: - name: (str) name of the target. The name "sphinx-build" is the + name: {type}`str` name of the target. The name "sphinx-build" is the conventional name to match what Sphinx itself uses. - py_binary_rule: (optional callable) A `py_binary` compatible callable + py_binary_rule: {type}`callable` A `py_binary` compatible callable for creating the target. If not set, the regular `py_binary` rule is used. This allows using the version-aware rules, or other alternative implementations. - **kwargs: Additional kwargs to pass onto `py_binary`. The `srcs` and + **kwargs: {type}`dict` Additional kwargs to pass onto `py_binary`. The `srcs` and `main` attributes must not be specified. """ add_tag(kwargs, "@rules_python//sphinxdocs:sphinx_build_binary") @@ -50,6 +63,7 @@ def sphinx_docs( name, *, srcs = [], + deps = [], renamed_srcs = {}, sphinx, config, @@ -61,53 +75,61 @@ def sphinx_docs( """Generate docs using Sphinx. This generates three public targets: - * ``: The output of this target is a directory for each - format Sphinx creates. This target also has a separate output - group for each format. e.g. `--output_group=html` will only build - the "html" format files. - * `_define`: A multi-string flag to add additional `-D` - arguments to the Sphinx invocation. This is useful for overriding - the version information in the config file for builds. - * `.serve`: A binary that locally serves the HTML output. This - allows previewing docs during development. + * ``: The output of this target is a directory for each + format Sphinx creates. This target also has a separate output + group for each format. e.g. `--output_group=html` will only build + the "html" format files. + * `_define`: A multi-string flag to add additional `-D` + arguments to the Sphinx invocation. This is useful for overriding + the version information in the config file for builds. + * `.serve`: A binary that locally serves the HTML output. This + allows previewing docs during development. Args: - name: (str) name of the docs rule. - srcs: (label list) The source files for Sphinx to process. - renamed_srcs: (label_keyed_string_dict) Doc source files for Sphinx that + name: {type}`Name` name of the docs rule. + srcs: {type}`list[label]` The source files for Sphinx to process. + deps: {type}`list[label]` of {obj}`sphinx_docs_library` targets. + renamed_srcs: {type}`dict[label, dict]` Doc source files for Sphinx that are renamed. This is typically used for files elsewhere, such as top level files in the repo. - sphinx: (label) the Sphinx tool to use for building + sphinx: {type}`label` the Sphinx tool to use for building documentation. Because Sphinx supports various plugins, you must construct your own binary with the necessary dependencies. The - `sphinx_build_binary` rule can be used to define such a binary, but + {obj}`sphinx_build_binary` rule can be used to define such a binary, but any executable supporting the `sphinx-build` command line interface can be used (typically some `py_binary` program). - config: (label) the Sphinx config file (`conf.py`) to use. + config: {type}`label` the Sphinx config file (`conf.py`) to use. formats: (list of str) the formats (`-b` flag) to generate documentation in. Each format will become an output group. - strip_prefix: (str) A prefix to remove from the file paths of the - source files. e.g., given `//docs:foo.md`, stripping `docs/` - makes Sphinx see `foo.md` in its generated source directory. - extra_opts: (list[str]) Additional options to pass onto Sphinx building. + strip_prefix: {type}`str` A prefix to remove from the file paths of the + source files. e.g., given `//docs:foo.md`, stripping `docs/` makes + Sphinx see `foo.md` in its generated source directory. If not + specified, then {any}`native.package_name` is used. + extra_opts: {type}`list[str]` Additional options to pass onto Sphinx building. On each provided option, a location expansion is performed. - See `ctx.expand_location()`. - tools: (list[label]) Additional tools that are used by Sphinx and its plugins. + See {any}`ctx.expand_location`. + tools: {type}`list[label]` Additional tools that are used by Sphinx and its plugins. This just makes the tools available during Sphinx execution. To locate - them, use `extra_opts` and `$(location)`. - **kwargs: (dict) Common attributes to pass onto rules. + them, use {obj}`extra_opts` and `$(location)`. + **kwargs: {type}`dict` Common attributes to pass onto rules. """ add_tag(kwargs, "@rules_python//sphinxdocs:sphinx_docs") common_kwargs = copy_propagating_kwargs(kwargs) - _sphinx_docs( - name = name, + _sphinx_source_tree( + name = name + "/_sources", srcs = srcs, + deps = deps, renamed_srcs = renamed_srcs, - sphinx = sphinx, config = config, - formats = formats, strip_prefix = strip_prefix, + **common_kwargs + ) + _sphinx_docs( + name = name, + sphinx = sphinx, + formats = formats, + source_tree = name + "/_sources", extra_opts = extra_opts, tools = tools, **kwargs @@ -132,8 +154,15 @@ def sphinx_docs( **common_kwargs ) + build_test( + name = name + "_build_test", + targets = [name], + **kwargs # kwargs used to pick up target_compatible_with + ) + def _sphinx_docs_impl(ctx): - source_dir_path, _, inputs = _create_sphinx_source_tree(ctx) + source_dir_path = ctx.attr.source_tree[_SphinxSourceTreeInfo].source_root + inputs = ctx.attr.source_tree[DefaultInfo].files outputs = {} for format in ctx.attr.formats: @@ -156,21 +185,14 @@ def _sphinx_docs_impl(ctx): _sphinx_docs = rule( implementation = _sphinx_docs_impl, attrs = { - "config": attr.label( - allow_single_file = True, - mandatory = True, - doc = "Config file for Sphinx", - ), "extra_opts": attr.string_list( doc = "Additional options to pass onto Sphinx. These are added after " + "other options, but before the source/output args.", ), "formats": attr.string_list(doc = "Output formats for Sphinx to create."), - "renamed_srcs": attr.label_keyed_string_dict( - allow_files = True, - doc = "Doc source files for Sphinx that are renamed. This is " + - "typically used for files elsewhere, such as top level " + - "files in the repo.", + "source_tree": attr.label( + doc = "Directory of files for Sphinx to process.", + providers = [_SphinxSourceTreeInfo], ), "sphinx": attr.label( executable = True, @@ -178,11 +200,6 @@ _sphinx_docs = rule( mandatory = True, doc = "Sphinx binary to generate documentation.", ), - "srcs": attr.label_list( - allow_files = True, - doc = "Doc source files for Sphinx.", - ), - "strip_prefix": attr.string(doc = "Prefix to remove from input file paths."), "tools": attr.label_list( cfg = "exec", doc = "Additional tools that are used by Sphinx and its plugins.", @@ -193,55 +210,6 @@ _sphinx_docs = rule( }, ) -def _create_sphinx_source_tree(ctx): - # Sphinx only accepts a single directory to read its doc sources from. - # Because plain files and generated files are in different directories, - # we need to merge the two into a single directory. - source_prefix = paths.join(ctx.label.name, "_sources") - sphinx_source_files = [] - - def _symlink_source(orig): - source_rel_path = orig.short_path - if source_rel_path.startswith(ctx.attr.strip_prefix): - source_rel_path = source_rel_path[len(ctx.attr.strip_prefix):] - - sphinx_source = ctx.actions.declare_file(paths.join(source_prefix, source_rel_path)) - ctx.actions.symlink( - output = sphinx_source, - target_file = orig, - progress_message = "Symlinking Sphinx source %{input} to %{output}", - ) - sphinx_source_files.append(sphinx_source) - return sphinx_source - - # Though Sphinx has a -c flag, we move the config file into the sources - # directory to make the config more intuitive because some configuration - # options are relative to the config location, not the sources directory. - source_conf_file = _symlink_source(ctx.file.config) - sphinx_source_dir_path = paths.dirname(source_conf_file.path) - - for orig_file in ctx.files.srcs: - _symlink_source(orig_file) - - for src_target, dest in ctx.attr.renamed_srcs.items(): - src_files = src_target.files.to_list() - if len(src_files) != 1: - fail("A single file must be specified to be renamed. Target {} " + - "generate {} files: {}".format( - src_target, - len(src_files), - src_files, - )) - sphinx_src = ctx.actions.declare_file(paths.join(source_prefix, dest)) - ctx.actions.symlink( - output = sphinx_src, - target_file = src_files[0], - progress_message = "Symlinking (renamed) Sphinx source %{input} to %{output}", - ) - sphinx_source_files.append(sphinx_src) - - return sphinx_source_dir_path, source_conf_file, sphinx_source_files - def _run_sphinx(ctx, format, source_path, inputs, output_prefix): output_dir = ctx.actions.declare_directory(paths.join(output_prefix, format)) @@ -281,6 +249,93 @@ def _run_sphinx(ctx, format, source_path, inputs, output_prefix): ) return output_dir +def _sphinx_source_tree_impl(ctx): + # Sphinx only accepts a single directory to read its doc sources from. + # Because plain files and generated files are in different directories, + # we need to merge the two into a single directory. + source_prefix = ctx.label.name + sphinx_source_files = [] + + # Materialize a file under the `_sources` dir + 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)) + ctx.actions.symlink( + output = dest_file, + target_file = source_file, + progress_message = "Symlinking Sphinx source %{input} to %{output}", + ) + sphinx_source_files.append(dest_file) + return dest_file + + # Though Sphinx has a -c flag, we move the config file into the sources + # directory to make the config more intuitive because some configuration + # options are relative to the config location, not the sources directory. + source_conf_file = _relocate(ctx.file.config) + sphinx_source_dir_path = paths.dirname(source_conf_file.path) + + for src in ctx.attr.srcs: + if SphinxDocsLibraryInfo in src: + fail(( + "In attribute srcs: target {src} is misplaced here: " + + "sphinx_docs_library targets belong in the deps attribute." + ).format(src = src)) + + for orig_file in ctx.files.srcs: + _relocate(orig_file) + + for src_target, dest in ctx.attr.renamed_srcs.items(): + src_files = src_target.files.to_list() + if len(src_files) != 1: + fail("A single file must be specified to be renamed. Target {} " + + "generate {} files: {}".format( + src_target, + len(src_files), + src_files, + )) + _relocate(src_files[0], dest) + + for t in ctx.attr.deps: + info = t[SphinxDocsLibraryInfo] + for entry in info.transitive.to_list(): + for original in entry.files: + new_path = entry.prefix + original.short_path.removeprefix(entry.strip_prefix) + _relocate(original, new_path) + + return [ + DefaultInfo( + files = depset(sphinx_source_files), + ), + _SphinxSourceTreeInfo( + source_root = sphinx_source_dir_path, + ), + ] + +_sphinx_source_tree = rule( + implementation = _sphinx_source_tree_impl, + attrs = { + "config": attr.label( + allow_single_file = True, + mandatory = True, + doc = "Config file for Sphinx", + ), + "deps": attr.label_list( + providers = [SphinxDocsLibraryInfo], + ), + "renamed_srcs": attr.label_keyed_string_dict( + allow_files = True, + doc = "Doc source files for Sphinx that are renamed. This is " + + "typically used for files elsewhere, such as top level " + + "files in the repo.", + ), + "srcs": attr.label_list( + allow_files = True, + doc = "Doc source files for Sphinx.", + ), + "strip_prefix": attr.string(doc = "Prefix to remove from input file paths."), + }, +) _FlagInfo = provider( doc = "Provider for a flag value", fields = ["value"], @@ -294,7 +349,7 @@ repeated_string_list_flag = rule( build_setting = config.string_list(flag = True, repeatable = True), ) -def sphinx_inventory(name, src, **kwargs): +def sphinx_inventory(*, name, src, **kwargs): """Creates a compressed inventory file from an uncompressed on. The Sphinx inventory format isn't formally documented, but is understood @@ -324,11 +379,14 @@ def sphinx_inventory(name, src, **kwargs): * `display name` is a string. It can contain spaces, or simply be the value `-` to indicate it is the same as `name` + :::{seealso} + {bzl:obj}`//sphinxdocs/inventories` for inventories of Bazel objects. + ::: Args: - name: [`target-name`] name of the target. - src: [`label`] Uncompressed inventory text file. - **kwargs: additional kwargs of common attributes. + name: {type}`Name` name of the target. + src: {type}`label` Uncompressed inventory text file. + **kwargs: {type}`dict` additional kwargs of common attributes. """ _sphinx_inventory(name = name, src = src, **kwargs) diff --git a/sphinxdocs/private/sphinx_docs_library.bzl b/sphinxdocs/private/sphinx_docs_library.bzl new file mode 100644 index 0000000000..076ed72254 --- /dev/null +++ b/sphinxdocs/private/sphinx_docs_library.bzl @@ -0,0 +1,51 @@ +"""Implementation of sphinx_docs_library.""" + +load(":sphinx_docs_library_info.bzl", "SphinxDocsLibraryInfo") + +def _sphinx_docs_library_impl(ctx): + strip_prefix = ctx.attr.strip_prefix or (ctx.label.package + "/") + direct_entries = [] + if ctx.files.srcs: + entry = struct( + strip_prefix = strip_prefix, + prefix = ctx.attr.prefix, + files = ctx.files.srcs, + ) + direct_entries.append(entry) + + return [ + SphinxDocsLibraryInfo( + strip_prefix = strip_prefix, + prefix = ctx.attr.prefix, + files = ctx.files.srcs, + transitive = depset( + direct = direct_entries, + transitive = [t[SphinxDocsLibraryInfo].transitive for t in ctx.attr.deps], + ), + ), + DefaultInfo( + files = depset(ctx.files.srcs), + ), + ] + +sphinx_docs_library = rule( + implementation = _sphinx_docs_library_impl, + attrs = { + "deps": attr.label_list( + doc = """ +Additional `sphinx_docs_library` targets to include. They do not have the +`prefix` and `strip_prefix` attributes applied to them.""", + providers = [SphinxDocsLibraryInfo], + ), + "prefix": attr.string( + doc = "Prefix to prepend to file paths. Added after `strip_prefix` is removed.", + ), + "srcs": attr.label_list( + allow_files = True, + doc = "Files that are part of the library.", + ), + "strip_prefix": attr.string( + doc = "Prefix to remove from file paths. Removed before `prefix` is prepended.", + ), + }, +) diff --git a/sphinxdocs/private/sphinx_docs_library_info.bzl b/sphinxdocs/private/sphinx_docs_library_info.bzl new file mode 100644 index 0000000000..de40d8deed --- /dev/null +++ b/sphinxdocs/private/sphinx_docs_library_info.bzl @@ -0,0 +1,30 @@ +"""Provider for collecting doc files as libraries.""" + +SphinxDocsLibraryInfo = provider( + doc = "Information about a collection of doc files.", + fields = { + "files": """ +:type: depset[File] + +The documentation files for the library. +""", + "prefix": """ +:type: str + +Prefix to prepend to file paths in `files`. It is added after `strip_prefix` +is removed. +""", + "strip_prefix": """ +:type: str + +Prefix to remove from file paths in `files`. It is removed before `prefix` +is prepended. +""", + "transitive": """ +:type: depset[struct] + +Depset of transitive library information. Each entry in the depset is a struct +with fields matching the fields of this provider. +""", + }, +) diff --git a/sphinxdocs/private/sphinx_docs_library_macro.bzl b/sphinxdocs/private/sphinx_docs_library_macro.bzl new file mode 100644 index 0000000000..095b3769ca --- /dev/null +++ b/sphinxdocs/private/sphinx_docs_library_macro.bzl @@ -0,0 +1,13 @@ +"""Implementation of sphinx_docs_library macro.""" + +load("//python/private:util.bzl", "add_tag") # buildifier: disable=bzl-visibility +load(":sphinx_docs_library.bzl", _sphinx_docs_library = "sphinx_docs_library") + +def sphinx_docs_library(**kwargs): + """Collection of doc files for use by `sphinx_docs`. + + Args: + **kwargs: Args passed onto underlying {bzl:rule}`sphinx_docs_library` rule + """ + add_tag(kwargs, "@rules_python//sphinxdocs:sphinx_docs_library") + _sphinx_docs_library(**kwargs) diff --git a/sphinxdocs/private/sphinx_stardoc.bzl b/sphinxdocs/private/sphinx_stardoc.bzl index e2b1756e12..d5869b0bc4 100644 --- a/sphinxdocs/private/sphinx_stardoc.bzl +++ b/sphinxdocs/private/sphinx_stardoc.bzl @@ -14,12 +14,34 @@ """Rules to generate Sphinx-compatible documentation for bzl files.""" +load("@bazel_skylib//:bzl_library.bzl", "StarlarkLibraryInfo") +load("@bazel_skylib//lib:paths.bzl", "paths") load("@bazel_skylib//lib:types.bzl", "types") load("@bazel_skylib//rules:build_test.bzl", "build_test") load("@io_bazel_stardoc//stardoc:stardoc.bzl", "stardoc") load("//python/private:util.bzl", "add_tag", "copy_propagating_kwargs") # buildifier: disable=bzl-visibility +load("//sphinxdocs/private:sphinx_docs_library_macro.bzl", "sphinx_docs_library") -def sphinx_stardocs(name, docs, **kwargs): +_StardocInputHelperInfo = provider( + doc = "Extracts the single source file from a bzl library.", + fields = { + "file": """ +:type: File + +The sole output file from the wrapped target. +""", + }, +) + +def sphinx_stardocs( + *, + name, + srcs = [], + deps = [], + docs = {}, + prefix = None, + strip_prefix = None, + **kwargs): """Generate Sphinx-friendly Markdown docs using Stardoc for bzl libraries. A `build_test` for the docs is also generated to ensure Stardoc is able @@ -28,8 +50,12 @@ def sphinx_stardocs(name, docs, **kwargs): NOTE: This generates MyST-flavored Markdown. Args: - name: `str`, the name of the resulting file group with the generated docs. - docs: `dict[str output, source]` of the bzl files to generate documentation + name: {type}`Name`, the name of the resulting file group with the generated docs. + srcs: {type}`list[label]` Each source is either the bzl file to process + or a `bzl_library` target with one source file of the bzl file to + process. + deps: {type}`list[label]` Targets that provide files loaded by `src` + docs: {type}`dict[str, str|dict]` of the bzl files to generate documentation for. The `output` key is the path of the output filename, e.g., `foo/bar.md`. The `source` values can be either of: * A `str` label that points to a `bzl_library` target. The target @@ -39,10 +65,17 @@ def sphinx_stardocs(name, docs, **kwargs): * A `dict` with keys `input` and `dep`. The `input` key is a string label to the bzl file to generate docs for. The `dep` key is a string label to a `bzl_library` providing the necessary dependencies. + prefix: {type}`str` Prefix to add to the output file path. It is prepended + after `strip_prefix` is removed. + strip_prefix: {type}`str | None` Prefix to remove from the input file path; + it is removed before `prefix` is prepended. If not specified, then + {any}`native.package_name` is used. **kwargs: Additional kwargs to pass onto each `sphinx_stardoc` target """ + internal_name = "_{}".format(name) add_tag(kwargs, "@rules_python//sphinxdocs:sphinx_stardocs") common_kwargs = copy_propagating_kwargs(kwargs) + common_kwargs["target_compatible_with"] = kwargs.get("target_compatible_with") stardocs = [] for out_name, entry in docs.items(): @@ -51,50 +84,165 @@ def sphinx_stardocs(name, docs, **kwargs): if types.is_string(entry): stardoc_kwargs["deps"] = [entry] - stardoc_kwargs["input"] = entry.replace("_bzl", ".bzl") + stardoc_kwargs["src"] = entry.replace("_bzl", ".bzl") else: stardoc_kwargs.update(entry) + + # input is accepted for backwards compatiblity. Remove when ready. + if "src" not in stardoc_kwargs and "input" in stardoc_kwargs: + stardoc_kwargs["src"] = stardoc_kwargs.pop("input") stardoc_kwargs["deps"] = [stardoc_kwargs.pop("dep")] - doc_name = "_{}_{}".format(name.lstrip("_"), out_name.replace("/", "_")) - _sphinx_stardoc( + doc_name = "{}_{}".format(internal_name, _name_from_label(out_name)) + sphinx_stardoc( name = doc_name, - out = out_name, + output = out_name, + create_test = False, **stardoc_kwargs ) stardocs.append(doc_name) - native.filegroup( + for label in srcs: + doc_name = "{}_{}".format(internal_name, _name_from_label(label)) + sphinx_stardoc( + name = doc_name, + src = label, + # NOTE: We set prefix/strip_prefix here instead of + # on the sphinx_docs_library so that building the + # target produces markdown files in the expected location, which + # is convenient. + prefix = prefix, + strip_prefix = strip_prefix, + deps = deps, + create_test = False, + **common_kwargs + ) + stardocs.append(doc_name) + + sphinx_docs_library( name = name, - srcs = stardocs, + deps = stardocs, **common_kwargs ) - build_test( - name = name + "_build_test", - targets = stardocs, + if stardocs: + build_test( + name = name + "_build_test", + targets = stardocs, + **common_kwargs + ) + +def sphinx_stardoc( + name, + src, + deps = [], + public_load_path = None, + prefix = None, + strip_prefix = None, + create_test = True, + output = None, + **kwargs): + """Generate Sphinx-friendly Markdown for a single bzl file. + + Args: + name: {type}`Name` name for the target. + src: {type}`label` The bzl file to process, or a `bzl_library` + target with one source file of the bzl file to process. + deps: {type}`list[label]` Targets that provide files loaded by `src` + public_load_path: {type}`str | None` override the file name that + is reported as the file being. + prefix: {type}`str | None` prefix to add to the output file path + strip_prefix: {type}`str | None` Prefix to remove from the input file path. + If not specified, then {any}`native.package_name` is used. + create_test: {type}`bool` True if a test should be defined to verify the + docs are buildable, False if not. + output: {type}`str | None` Optional explicit output file to use. If + not set, the output name will be derived from `src`. + **kwargs: {type}`dict` common args passed onto rules. + """ + internal_name = "_{}".format(name.lstrip("_")) + add_tag(kwargs, "@rules_python//sphinxdocs:sphinx_stardoc") + common_kwargs = copy_propagating_kwargs(kwargs) + common_kwargs["target_compatible_with"] = kwargs.get("target_compatible_with") + + input_helper_name = internal_name + ".primary_bzl_src" + _stardoc_input_helper( + name = input_helper_name, + target = src, **common_kwargs ) -def _sphinx_stardoc(*, name, out, public_load_path = None, **kwargs): - stardoc_name = "_{}_stardoc".format(name.lstrip("_")) - stardoc_pb = stardoc_name + ".binaryproto" + stardoc_name = internal_name + "_stardoc" - if not public_load_path: - public_load_path = str(kwargs["input"]) + # NOTE: The .binaryproto suffix is an optimization. It makes the stardoc() + # call avoid performing a copy of the output to the desired name. + stardoc_pb = stardoc_name + ".binaryproto" stardoc( name = stardoc_name, + input = input_helper_name, out = stardoc_pb, format = "proto", - **kwargs + deps = [src] + deps, + **common_kwargs ) + pb2md_name = internal_name + "_pb2md" _stardoc_proto_to_markdown( - name = name, + name = pb2md_name, src = stardoc_pb, - output = out, + output = output, + output_name_from = input_helper_name if not output else None, public_load_path = public_load_path, + strip_prefix = strip_prefix, + prefix = prefix, + **common_kwargs + ) + sphinx_docs_library( + name = name, + srcs = [pb2md_name], + **common_kwargs ) + if create_test: + build_test( + name = name + "_build_test", + targets = [name], + **common_kwargs + ) + +def _stardoc_input_helper_impl(ctx): + target = ctx.attr.target + if StarlarkLibraryInfo in target: + files = ctx.attr.target[StarlarkLibraryInfo].srcs + else: + files = target[DefaultInfo].files.to_list() + + if len(files) == 0: + fail("Target {} produces no files, but must produce exactly 1 file".format( + ctx.attr.target.label, + )) + elif len(files) == 1: + primary = files[0] + else: + fail("Target {} produces {} files, but must produce exactly 1 file.".format( + ctx.attr.target.label, + len(files), + )) + + return [ + DefaultInfo( + files = depset([primary]), + ), + _StardocInputHelperInfo( + file = primary, + ), + ] + +_stardoc_input_helper = rule( + implementation = _stardoc_input_helper_impl, + attrs = { + "target": attr.label(allow_files = True), + }, +) def _stardoc_proto_to_markdown_impl(ctx): args = ctx.actions.args() @@ -103,7 +251,16 @@ def _stardoc_proto_to_markdown_impl(ctx): inputs = [ctx.file.src] args.add("--proto", ctx.file.src) - args.add("--output", ctx.outputs.output) + + if not ctx.outputs.output: + output_name = ctx.attr.output_name_from[_StardocInputHelperInfo].file.short_path + output_name = paths.replace_extension(output_name, ".md") + output_name = ctx.attr.prefix + output_name.removeprefix(ctx.attr.strip_prefix) + output = ctx.actions.declare_file(output_name) + else: + output = ctx.outputs.output + + args.add("--output", output) if ctx.attr.public_load_path: args.add("--public-load-path={}".format(ctx.attr.public_load_path)) @@ -112,17 +269,23 @@ def _stardoc_proto_to_markdown_impl(ctx): executable = ctx.executable._proto_to_markdown, arguments = [args], inputs = inputs, - outputs = [ctx.outputs.output], + outputs = [output], mnemonic = "SphinxStardocProtoToMd", progress_message = "SphinxStardoc: converting proto to markdown: %{input} -> %{output}", ) + return [DefaultInfo( + files = depset([output]), + )] _stardoc_proto_to_markdown = rule( implementation = _stardoc_proto_to_markdown_impl, attrs = { - "output": attr.output(mandatory = True), + "output": attr.output(mandatory = False), + "output_name_from": attr.label(), + "prefix": attr.string(), "public_load_path": attr.string(), "src": attr.label(allow_single_file = True, mandatory = True), + "strip_prefix": attr.string(), "_proto_to_markdown": attr.label( default = "//sphinxdocs/private:proto_to_markdown", executable = True, @@ -130,3 +293,7 @@ _stardoc_proto_to_markdown = rule( ), }, ) + +def _name_from_label(label): + label = label.lstrip("/").lstrip(":").replace(":", "/") + return label diff --git a/sphinxdocs/sphinx.bzl b/sphinxdocs/sphinx.bzl index d9385bda3f..3c9dc6b515 100644 --- a/sphinxdocs/sphinx.bzl +++ b/sphinxdocs/sphinx.bzl @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""# Rules to generate Sphinx documentation. +"""Rules to generate Sphinx documentation. The general usage of the Sphinx rules requires two pieces: diff --git a/sphinxdocs/sphinx_docs_library.bzl b/sphinxdocs/sphinx_docs_library.bzl new file mode 100644 index 0000000000..e86432996b --- /dev/null +++ b/sphinxdocs/sphinx_docs_library.bzl @@ -0,0 +1,5 @@ +"""Library-like rule to collect docs.""" + +load("//sphinxdocs/private:sphinx_docs_library_macro.bzl", _sphinx_docs_library = "sphinx_docs_library") + +sphinx_docs_library = _sphinx_docs_library diff --git a/sphinxdocs/sphinx_stardoc.bzl b/sphinxdocs/sphinx_stardoc.bzl index 623bc64d0c..991396435b 100644 --- a/sphinxdocs/sphinx_stardoc.bzl +++ b/sphinxdocs/sphinx_stardoc.bzl @@ -14,6 +14,7 @@ """Rules to generate Sphinx-compatible documentation for bzl files.""" -load("//sphinxdocs/private:sphinx_stardoc.bzl", _sphinx_stardocs = "sphinx_stardocs") +load("//sphinxdocs/private:sphinx_stardoc.bzl", _sphinx_stardoc = "sphinx_stardoc", _sphinx_stardocs = "sphinx_stardocs") sphinx_stardocs = _sphinx_stardocs +sphinx_stardoc = _sphinx_stardoc diff --git a/sphinxdocs/src/sphinx_bzl/bzl.py b/sphinxdocs/src/sphinx_bzl/bzl.py index be38d8a7ca..d09914b318 100644 --- a/sphinxdocs/src/sphinx_bzl/bzl.py +++ b/sphinxdocs/src/sphinx_bzl/bzl.py @@ -1413,6 +1413,7 @@ class _BzlDomain(domains.Domain): "obj": roles.XRefRole(), "required-providers": _RequiredProvidersRole(), "return-type": _ReturnTypeRole(), + "rule": roles.XRefRole(), "target": roles.XRefRole(), "type": _TypeRole(), } diff --git a/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel b/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel index b141e5f0fc..e2837ff78f 100644 --- a/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel +++ b/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel @@ -1,7 +1,19 @@ load("@bazel_skylib//:bzl_library.bzl", "bzl_library") load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility load("//sphinxdocs:sphinx.bzl", "sphinx_build_binary", "sphinx_docs") -load("//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardocs") +load("//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardoc", "sphinx_stardocs") + +# 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", @@ -9,7 +21,7 @@ sphinx_docs( include = [ "*.md", ], - ) + [":bzl_docs"], + ), config = "conf.py", formats = [ "html", @@ -19,37 +31,48 @@ sphinx_docs( }, sphinx = ":sphinx-build", strip_prefix = package_name() + "/", - # We only develop the docs using Linux/Mac, and there are deps that - # don't work for Windows, so just skip Windows. - target_compatible_with = select({ - "@platforms//os:linux": [], - "@platforms//os:macos": [], - "//conditions:default": ["@platforms//:incompatible"], - }) if IS_BAZEL_7_OR_HIGHER else ["@platforms//:incompatible"], + target_compatible_with = _TARGET_COMPATIBLE_WITH, + deps = [ + ":bzl_function", + ":bzl_providers", + ":simple_bzl_docs", + ], ) sphinx_stardocs( - name = "bzl_docs", - docs = { - "bzl_function.md": dict( - dep = ":all_bzl", - input = "//sphinxdocs/tests/sphinx_stardoc:bzl_function.bzl", - ), - "bzl_providers.md": dict( - dep = ":all_bzl", - input = "//sphinxdocs/tests/sphinx_stardoc:bzl_providers.bzl", - ), - "bzl_rule.md": dict( - dep = ":all_bzl", - input = "//sphinxdocs/tests/sphinx_stardoc:bzl_rule.bzl", - ), - }, - target_compatible_with = [] if IS_BAZEL_7_OR_HIGHER else ["@platforms//:incompatible"], + name = "simple_bzl_docs", + srcs = [":bzl_rule_bzl"], + target_compatible_with = _TARGET_COMPATIBLE_WITH, +) + +sphinx_stardoc( + name = "bzl_function", + src = ":bzl_function.bzl", + target_compatible_with = _TARGET_COMPATIBLE_WITH, + deps = [":func_and_providers_bzl"], +) + +sphinx_stardoc( + name = "bzl_providers", + src = ":bzl_providers.bzl", + prefix = "addprefix_", + target_compatible_with = _TARGET_COMPATIBLE_WITH, + deps = [":func_and_providers_bzl"], +) + +# A bzl_library with multiple sources +bzl_library( + name = "func_and_providers_bzl", + srcs = [ + "bzl_function.bzl", + "bzl_providers.bzl", + ], ) bzl_library( - name = "all_bzl", - srcs = glob(["*.bzl"]), + name = "bzl_rule_bzl", + srcs = ["bzl_rule.bzl"], + deps = [":func_and_providers_bzl"], ) sphinx_build_binary( From 79ca4a4eb52e73de462c67d1b65dc5b2001b885d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Aug 2024 09:47:19 -0700 Subject: [PATCH 159/345] build(deps): bump myst-parser from 3.0.1 to 4.0.0 in /docs/sphinx (#2109) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [myst-parser](https://github.com/executablebooks/MyST-Parser) from 3.0.1 to 4.0.0.
Release notes

Sourced from myst-parser's releases.

v4.0.0

What's Changed

New Contributors

Full Changelog: https://github.com/executablebooks/MyST-Parser/compare/v3.0.1...v4.0.0

Changelog

Sourced from myst-parser's changelog.

4.0.0 - 2024-08-05

This release bumps the supported versions of:

  • Python to 3.10 and greater
  • Sphinx to >=7,<9
  • Docutils to >=0.19,<0.22

Additionally, footnotes are now parsed similar to the corresponding reStructuredText, in that resolution (between definitions and references) and ordering is now deferred to transforms on the doctree (in gh-pr:931).

This allows for the proper interaction with other docutils/sphinx transforms, including those that perform translations, and logging of warnings for duplicate/unreferenced footnote definitions and also for footnote references with no definitions.

See the footnotes guide for more information.

Full Changelog: v3.0.1...v4.0.0

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=myst-parser&package-manager=pip&previous-version=3.0.1&new-version=4.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/sphinx/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/sphinx/requirements.txt b/docs/sphinx/requirements.txt index e0d3bba4ff..0bce54e720 100644 --- a/docs/sphinx/requirements.txt +++ b/docs/sphinx/requirements.txt @@ -212,9 +212,9 @@ mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba # via markdown-it-py -myst-parser==3.0.1 \ - --hash=sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1 \ - --hash=sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87 +myst-parser==4.0.0 \ + --hash=sha256:851c9dfb44e36e56d15d05e72f02b80da21a9e0d07cba96baf5e2d476bb91531 \ + --hash=sha256:b9317997552424448c6096c2558872fdb6f81d3ecb3a40ce84a7518798f3f28d # via rules-python-docs (docs/sphinx/pyproject.toml) packaging==24.1 \ --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ From d7d2ce7307bad1bf076b48e4fa18715918f57cdd Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 20 Aug 2024 17:07:22 -0700 Subject: [PATCH 160/345] refactor: move docs/sphinx -> docs (#2130) The sphinx sub-dir was only temporary as the sphinx-based docgen was implemented. With that done, the files can be moved up into the regular docs directory. --- .github/dependabot.yml | 2 +- .readthedocs.yml | 2 +- CONTRIBUTING.md | 2 +- MODULE.bazel | 2 +- WORKSPACE | 2 +- docs/BUILD.bazel | 203 ++++++++++++++++- docs/{sphinx => }/README.md | 10 +- .../_includes/py_console_script_binary.md | 0 docs/{sphinx => }/_static/css/custom.css | 0 docs/{sphinx => }/api/index.md | 0 docs/{sphinx => }/api/python/cc/index.md | 0 .../api/python/config_settings/index.md | 0 docs/{sphinx => }/api/python/index.md | 0 .../python/runtime_env_toolchains/index.md | 0 .../api/tools/precompiler/index.md | 0 docs/{sphinx => }/conf.py | 4 +- docs/{sphinx => }/coverage.md | 0 docs/{sphinx => }/environment-variables.md | 0 docs/{sphinx => }/gazelle.md | 0 docs/{sphinx => }/getting-started.md | 0 docs/{sphinx => }/glossary.md | 0 docs/{sphinx => }/index.md | 0 docs/{sphinx => }/pip.md | 0 docs/{sphinx => }/precompiling.md | 0 docs/{sphinx => }/pypi-dependencies.md | 2 +- docs/{sphinx => }/pyproject.toml | 0 docs/{sphinx => }/readthedocs_build.sh | 2 +- docs/{sphinx => }/requirements.txt | 14 +- docs/sphinx/BUILD.bazel | 205 ------------------ docs/{sphinx => }/support.md | 0 docs/{sphinx => }/toolchains.md | 0 31 files changed, 219 insertions(+), 231 deletions(-) rename docs/{sphinx => }/README.md (90%) rename docs/{sphinx => }/_includes/py_console_script_binary.md (100%) rename docs/{sphinx => }/_static/css/custom.css (100%) rename docs/{sphinx => }/api/index.md (100%) rename docs/{sphinx => }/api/python/cc/index.md (100%) rename docs/{sphinx => }/api/python/config_settings/index.md (100%) rename docs/{sphinx => }/api/python/index.md (100%) rename docs/{sphinx => }/api/python/runtime_env_toolchains/index.md (100%) rename docs/{sphinx => }/api/tools/precompiler/index.md (100%) rename docs/{sphinx => }/conf.py (98%) rename docs/{sphinx => }/coverage.md (100%) rename docs/{sphinx => }/environment-variables.md (100%) rename docs/{sphinx => }/gazelle.md (100%) rename docs/{sphinx => }/getting-started.md (100%) rename docs/{sphinx => }/glossary.md (100%) rename docs/{sphinx => }/index.md (100%) rename docs/{sphinx => }/pip.md (100%) rename docs/{sphinx => }/precompiling.md (100%) rename docs/{sphinx => }/pypi-dependencies.md (99%) rename docs/{sphinx => }/pyproject.toml (100%) rename docs/{sphinx => }/readthedocs_build.sh (92%) rename docs/{sphinx => }/requirements.txt (98%) delete mode 100644 docs/sphinx/BUILD.bazel rename docs/{sphinx => }/support.md (100%) rename docs/{sphinx => }/toolchains.md (100%) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9632f4e3d3..5733fc1d6d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -10,7 +10,7 @@ updates: - package-ecosystem: "pip" directories: # Maintain dependencies for our tools - - "/docs/sphinx" + - "/docs" - "/tools/publish" schedule: interval: "weekly" diff --git a/.readthedocs.yml b/.readthedocs.yml index f68ccc8396..6613d49e66 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -11,4 +11,4 @@ build: - bazel version # Put the actual build behind a shell script because its easier to modify than # the yaml config. - - docs/sphinx/readthedocs_build.sh + - docs/readthedocs_build.sh diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cb123bfee0..33b296fa64 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -148,7 +148,7 @@ merged: * **requirements lock files**: These are usually generated by a `compile_pip_requirements` update target, which is usually in the same directory. - e.g. `bazel run //docs/sphinx:requirements.update` + e.g. `bazel run //docs:requirements.update` ## Core rules diff --git a/MODULE.bazel b/MODULE.bazel index c4d0e5f48d..9ac3e7a04c 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -93,7 +93,7 @@ dev_pip = use_extension( dev_pip.parse( hub_name = "dev_pip", python_version = "3.11", - requirements_lock = "//docs/sphinx:requirements.txt", + requirements_lock = "//docs:requirements.txt", ) dev_pip.parse( hub_name = "pypiserver", diff --git a/WORKSPACE b/WORKSPACE index 695b0e94e9..02b3b6e926 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -122,7 +122,7 @@ install_pypiserver() pip_parse( name = "dev_pip", python_interpreter_target = interpreter, - requirements_lock = "//docs/sphinx:requirements.txt", + requirements_lock = "//docs:requirements.txt", ) load("@dev_pip//:requirements.bzl", docs_install_deps = "install_deps") diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index c334fbcada..56bca8838f 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -1,10 +1,10 @@ -# Copyright 2017 The Bazel Authors. All rights reserved. +# 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 +# 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, @@ -13,10 +13,199 @@ # limitations under the License. load("@bazel_skylib//:bzl_library.bzl", "bzl_library") +load("@bazel_skylib//rules:write_file.bzl", "write_file") +load("@dev_pip//:requirements.bzl", "requirement") +load("//python:py_binary.bzl", "py_binary") +load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility +load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility +load("//sphinxdocs:readthedocs.bzl", "readthedocs_install") +load("//sphinxdocs:sphinx.bzl", "sphinx_build_binary", "sphinx_docs") +load("//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardoc", "sphinx_stardocs") -# NOTE: Only public visibility for historical reasons. -# This package is only for rules_python to generate its own docs. -package(default_visibility = ["//visibility:public"]) +package(default_visibility = ["//:__subpackages__"]) + +# 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"] + +# See README.md for instructions. Short version: +# * `bazel run //docs:docs.serve` in a separate terminal +# * `ibazel build //docs:docs` to automatically rebuild docs +sphinx_docs( + name = "docs", + srcs = glob( + include = [ + "*.md", + "**/*.md", + "_static/**", + "_includes/**", + ], + exclude = [ + "README.md", + "_*", + "*.inv*", + ], + ), + config = "conf.py", + formats = [ + "html", + ], + renamed_srcs = { + "//:CHANGELOG.md": "changelog.md", + "//:CONTRIBUTING.md": "contributing.md", + "//sphinxdocs/inventories:bazel_inventory": "bazel_inventory.inv", + }, + sphinx = ":sphinx-build", + strip_prefix = package_name() + "/", + tags = ["docs"], + target_compatible_with = _TARGET_COMPATIBLE_WITH, + deps = [ + ":bzl_api_docs", + "//sphinxdocs/docs:docs_lib", + ], +) + +sphinx_stardocs( + name = "bzl_api_docs", + srcs = [ + "//python:defs_bzl", + "//python:packaging_bzl", + "//python:pip_bzl", + "//python:py_binary_bzl", + "//python:py_cc_link_params_info_bzl", + "//python:py_library_bzl", + "//python:py_runtime_bzl", + "//python:py_runtime_info_bzl", + "//python:py_test_bzl", + "//python/cc:py_cc_toolchain_info_bzl", + "//python/entry_points:py_console_script_binary_bzl", + "//python/private/common:py_binary_rule_bazel_bzl", + "//python/private/common:py_library_rule_bazel_bzl", + "//python/private/common:py_runtime_rule_bzl", + "//python/private/common:py_test_rule_bazel_bzl", + ] + ([ + # Bazel 6 + Stardoc isn't able to parse something about the python bzlmod extension + "//python/extensions:python_bzl", + ] if IS_BAZEL_7_OR_HIGHER else []) + ([ + # This depends on @pythons_hub, which is only created under bzlmod, + "//python/extensions:pip_bzl", + ] if IS_BAZEL_7_OR_HIGHER and BZLMOD_ENABLED else []), + prefix = "api/", + tags = ["docs"], + target_compatible_with = _TARGET_COMPATIBLE_WITH, +) + +sphinx_stardoc( + name = "py_cc_toolchain", + src = "//python/private:py_cc_toolchain_rule.bzl", + prefix = "api/", + public_load_path = "//python/cc:py_cc_toolchain.bzl", + tags = ["docs"], + target_compatible_with = _TARGET_COMPATIBLE_WITH, + deps = ["//python/cc:py_cc_toolchain_bzl"], +) + +sphinx_stardoc( + name = "py_runtime_pair", + src = "//python/private:py_runtime_pair_rule_bzl", + public_load_path = "//python:py_runtime_pair.bzl", + tags = ["docs"], + target_compatible_with = _TARGET_COMPATIBLE_WITH, +) + +readthedocs_install( + name = "readthedocs_install", + docs = [":docs"], + target_compatible_with = _TARGET_COMPATIBLE_WITH, +) + +sphinx_build_binary( + name = "sphinx-build", + target_compatible_with = _TARGET_COMPATIBLE_WITH, + deps = [ + requirement("sphinx"), + requirement("sphinx_rtd_theme"), + requirement("myst_parser"), + requirement("readthedocs_sphinx_ext"), + requirement("typing_extensions"), + "//sphinxdocs/src/sphinx_bzl", + ], +) + +_REQUIREMENTS_TARGET_COMPATIBLE_WITH = select({ + "@platforms//os:linux": [], + "@platforms//os:macos": [], + "@platforms//os:windows": [], + "//conditions:default": ["@platforms//:incompatible"], +}) if BZLMOD_ENABLED else ["@platforms//:incompatible"] + +# Run bazel run //docs:requirements.update +genrule( + name = "requirements", + srcs = ["pyproject.toml"], + outs = ["_requirements.txt"], + cmd = "$(UV_BIN) pip compile " + " ".join([ + "--custom-compile-command='bazel run //docs:requirements.update'", + "--generate-hashes", + "--universal", + "--emit-index-url", + "--no-strip-extras", + "--no-build", + "--python=$(PYTHON3)", + "$<", + "--output-file=$@", + # Always try upgrading + "--upgrade", + ]), + tags = [ + "local", + "manual", + "no-cache", + ], + target_compatible_with = _REQUIREMENTS_TARGET_COMPATIBLE_WITH, + toolchains = [ + "//python/uv:current_toolchain", + "//python:current_py_toolchain", + ], +) + +# Write a script that can be used for updating the in-tree version of the +# requirements file +write_file( + name = "gen_update_requirements", + out = "requirements.update.py", + content = [ + "from os import environ", + "from pathlib import Path", + "from sys import stderr", + "", + 'src = Path(environ["REQUIREMENTS_FILE"])', + 'dst = Path(environ["BUILD_WORKSPACE_DIRECTORY"]) / "docs" / "requirements.txt"', + 'print(f"Writing requirements contents from {src} to {dst}", file=stderr)', + "dst.write_text(src.read_text())", + 'print("Success!", file=stderr)', + ], + target_compatible_with = _REQUIREMENTS_TARGET_COMPATIBLE_WITH, +) + +py_binary( + name = "requirements.update", + srcs = ["requirements.update.py"], + data = [":requirements"], + env = { + "REQUIREMENTS_FILE": "$(location :requirements)", + }, + tags = ["manual"], + target_compatible_with = _REQUIREMENTS_TARGET_COMPATIBLE_WITH, +) licenses(["notice"]) # Apache 2.0 @@ -26,18 +215,21 @@ alias( name = "defs", actual = "//python:defs_bzl", deprecation = "Use //python:defs_bzl instead; targets under //docs are internal.", + visibility = ["//visibility:public"], ) alias( name = "bazel_repo_tools", actual = "//python/private:bazel_tools_bzl", deprecation = "Use @bazel_tools//tools:bzl_srcs instead; targets under //docs are internal.", + visibility = ["//visibility:public"], ) bzl_library( name = "pip_install_bzl", deprecation = "Use //python:pip_bzl or //python/pip_install:pip_repository_bzl instead; " + "targets under //docs are internal.", + visibility = ["//visibility:public"], deps = [ "//python:pip_bzl", "//python/pip_install:pip_repository_bzl", @@ -49,4 +241,5 @@ alias( actual = "//python/pip_install:pip_repository_bzl", deprecation = "Use //python/pip_install:pip_repository_bzl instead; Both the requirements " + "parser and targets under //docs are internal", + visibility = ["//visibility:public"], ) diff --git a/docs/sphinx/README.md b/docs/README.md similarity index 90% rename from docs/sphinx/README.md rename to docs/README.md index 98420e4d59..d98be41232 100644 --- a/docs/sphinx/README.md +++ b/docs/README.md @@ -18,8 +18,8 @@ server to serve the generated HTML, and re-generating the HTML when sources change. The quick start is: ``` -bazel run //docs/sphinx:docs.serve # Run in separate terminal -ibazel build //docs/sphinx:docs # Automatically rebuilds docs +bazel run //docs:docs.serve # Run in separate terminal +ibazel build //docs:docs # Automatically rebuilds docs ``` This will build the docs and start a local webserver at http://localhost:8000 @@ -47,14 +47,14 @@ integrates with Sphinx functionality such as automatic cross references, creating indexes, and using concise markup to generate rich documentation. MyST features and behaviors are controlled by the Sphinx configuration file, -`docs/sphinx/conf.py`. For more info, see https://myst-parser.readthedocs.io. +`docs/conf.py`. For more info, see https://myst-parser.readthedocs.io. ## Sphinx configuration The Sphinx-specific configuration files and input doc files live in -docs/sphinx. +docs/. -The Sphinx configuration is `docs/sphinx/conf.py`. See +The Sphinx configuration is `docs/conf.py`. See https://www.sphinx-doc.org/ for details about the configuration file. ## Readthedocs configuration diff --git a/docs/sphinx/_includes/py_console_script_binary.md b/docs/_includes/py_console_script_binary.md similarity index 100% rename from docs/sphinx/_includes/py_console_script_binary.md rename to docs/_includes/py_console_script_binary.md diff --git a/docs/sphinx/_static/css/custom.css b/docs/_static/css/custom.css similarity index 100% rename from docs/sphinx/_static/css/custom.css rename to docs/_static/css/custom.css diff --git a/docs/sphinx/api/index.md b/docs/api/index.md similarity index 100% rename from docs/sphinx/api/index.md rename to docs/api/index.md diff --git a/docs/sphinx/api/python/cc/index.md b/docs/api/python/cc/index.md similarity index 100% rename from docs/sphinx/api/python/cc/index.md rename to docs/api/python/cc/index.md diff --git a/docs/sphinx/api/python/config_settings/index.md b/docs/api/python/config_settings/index.md similarity index 100% rename from docs/sphinx/api/python/config_settings/index.md rename to docs/api/python/config_settings/index.md diff --git a/docs/sphinx/api/python/index.md b/docs/api/python/index.md similarity index 100% rename from docs/sphinx/api/python/index.md rename to docs/api/python/index.md diff --git a/docs/sphinx/api/python/runtime_env_toolchains/index.md b/docs/api/python/runtime_env_toolchains/index.md similarity index 100% rename from docs/sphinx/api/python/runtime_env_toolchains/index.md rename to docs/api/python/runtime_env_toolchains/index.md diff --git a/docs/sphinx/api/tools/precompiler/index.md b/docs/api/tools/precompiler/index.md similarity index 100% rename from docs/sphinx/api/tools/precompiler/index.md rename to docs/api/tools/precompiler/index.md diff --git a/docs/sphinx/conf.py b/docs/conf.py similarity index 98% rename from docs/sphinx/conf.py rename to docs/conf.py index 3200466efc..be428a6eb8 100644 --- a/docs/sphinx/conf.py +++ b/docs/conf.py @@ -16,7 +16,7 @@ # for more settings # Any extensions here not built into Sphinx must also be added to -# the dependencies of //docs/sphinx:sphinx-builder +# the dependencies of //docs:sphinx-builder extensions = [ "sphinx.ext.autodoc", "sphinx.ext.autosectionlabel", @@ -114,7 +114,7 @@ "READTHEDOCS": False, "PRODUCTION_DOMAIN": "readthedocs.org", # This is the path to a page's source (after the github user/repo/commit) - "conf_py_path": "/docs/sphinx/", + "conf_py_path": "/docs/", "github_user": "bazelbuild", "github_repo": "rules_python", # The git version that was checked out, e.g. the tag or branch name diff --git a/docs/sphinx/coverage.md b/docs/coverage.md similarity index 100% rename from docs/sphinx/coverage.md rename to docs/coverage.md diff --git a/docs/sphinx/environment-variables.md b/docs/environment-variables.md similarity index 100% rename from docs/sphinx/environment-variables.md rename to docs/environment-variables.md diff --git a/docs/sphinx/gazelle.md b/docs/gazelle.md similarity index 100% rename from docs/sphinx/gazelle.md rename to docs/gazelle.md diff --git a/docs/sphinx/getting-started.md b/docs/getting-started.md similarity index 100% rename from docs/sphinx/getting-started.md rename to docs/getting-started.md diff --git a/docs/sphinx/glossary.md b/docs/glossary.md similarity index 100% rename from docs/sphinx/glossary.md rename to docs/glossary.md diff --git a/docs/sphinx/index.md b/docs/index.md similarity index 100% rename from docs/sphinx/index.md rename to docs/index.md diff --git a/docs/sphinx/pip.md b/docs/pip.md similarity index 100% rename from docs/sphinx/pip.md rename to docs/pip.md diff --git a/docs/sphinx/precompiling.md b/docs/precompiling.md similarity index 100% rename from docs/sphinx/precompiling.md rename to docs/precompiling.md diff --git a/docs/sphinx/pypi-dependencies.md b/docs/pypi-dependencies.md similarity index 99% rename from docs/sphinx/pypi-dependencies.md rename to docs/pypi-dependencies.md index db017d249f..636fefb33d 100644 --- a/docs/sphinx/pypi-dependencies.md +++ b/docs/pypi-dependencies.md @@ -324,7 +324,7 @@ the {gh-path}`examples/bzlmod/MODULE.bazel` example. When using this feature during the `pip` extension evaluation you will see the accessed indexes similar to below: ```console Loading: 0 packages loaded - currently loading: docs/sphinx + currently loading: docs/ Fetching module extension pip in @@//python/extensions:pip.bzl; starting Fetching https://pypi.org/simple/twine/ ``` diff --git a/docs/sphinx/pyproject.toml b/docs/pyproject.toml similarity index 100% rename from docs/sphinx/pyproject.toml rename to docs/pyproject.toml diff --git a/docs/sphinx/readthedocs_build.sh b/docs/readthedocs_build.sh similarity index 92% rename from docs/sphinx/readthedocs_build.sh rename to docs/readthedocs_build.sh index c611b7c4fb..3f67310197 100755 --- a/docs/sphinx/readthedocs_build.sh +++ b/docs/readthedocs_build.sh @@ -17,4 +17,4 @@ bazel run \ --config=rtd \ "--//sphinxdocs:extra_defines=version=$READTHEDOCS_VERSION" \ "${extra_env[@]}" \ - //docs/sphinx:readthedocs_install + //docs:readthedocs_install diff --git a/docs/sphinx/requirements.txt b/docs/requirements.txt similarity index 98% rename from docs/sphinx/requirements.txt rename to docs/requirements.txt index 0bce54e720..7cd03296fe 100644 --- a/docs/sphinx/requirements.txt +++ b/docs/requirements.txt @@ -1,11 +1,11 @@ # This file was autogenerated by uv via the following command: -# bazel run //docs/sphinx:requirements.update +# bazel run //docs:requirements.update --index-url https://pypi.org/simple absl-py==2.1.0 \ --hash=sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308 \ --hash=sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff - # via rules-python-docs (docs/sphinx/pyproject.toml) + # via rules-python-docs (docs/pyproject.toml) alabaster==0.7.16 \ --hash=sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65 \ --hash=sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92 @@ -215,7 +215,7 @@ mdurl==0.1.2 \ myst-parser==4.0.0 \ --hash=sha256:851c9dfb44e36e56d15d05e72f02b80da21a9e0d07cba96baf5e2d476bb91531 \ --hash=sha256:b9317997552424448c6096c2558872fdb6f81d3ecb3a40ce84a7518798f3f28d - # via rules-python-docs (docs/sphinx/pyproject.toml) + # via rules-python-docs (docs/pyproject.toml) packaging==24.1 \ --hash=sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002 \ --hash=sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124 @@ -282,7 +282,7 @@ pyyaml==6.0.1 \ readthedocs-sphinx-ext==2.2.5 \ --hash=sha256:ee5fd5b99db9f0c180b2396cbce528aa36671951b9526bb0272dbfce5517bd27 \ --hash=sha256:f8c56184ea011c972dd45a90122568587cc85b0127bc9cf064d17c68bc809daa - # via rules-python-docs (docs/sphinx/pyproject.toml) + # via rules-python-docs (docs/pyproject.toml) requests==2.32.3 \ --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 @@ -297,14 +297,14 @@ sphinx==7.4.7 \ --hash=sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe \ --hash=sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239 # via - # rules-python-docs (docs/sphinx/pyproject.toml) + # rules-python-docs (docs/pyproject.toml) # myst-parser # sphinx-rtd-theme # sphinxcontrib-jquery sphinx-rtd-theme==2.0.0 \ --hash=sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b \ --hash=sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586 - # via rules-python-docs (docs/sphinx/pyproject.toml) + # via rules-python-docs (docs/pyproject.toml) sphinxcontrib-applehelp==2.0.0 \ --hash=sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1 \ --hash=sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5 @@ -336,7 +336,7 @@ sphinxcontrib-serializinghtml==2.0.0 \ typing-extensions==4.12.2 \ --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 - # via rules-python-docs (docs/sphinx/pyproject.toml) + # via rules-python-docs (docs/pyproject.toml) urllib3==2.2.2 \ --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 diff --git a/docs/sphinx/BUILD.bazel b/docs/sphinx/BUILD.bazel deleted file mode 100644 index 03c0e446b8..0000000000 --- a/docs/sphinx/BUILD.bazel +++ /dev/null @@ -1,205 +0,0 @@ -# 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. - -load("@bazel_skylib//rules:write_file.bzl", "write_file") -load("@dev_pip//:requirements.bzl", "requirement") -load("//python:py_binary.bzl", "py_binary") -load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility -load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility -load("//sphinxdocs:readthedocs.bzl", "readthedocs_install") -load("//sphinxdocs:sphinx.bzl", "sphinx_build_binary", "sphinx_docs") -load("//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardoc", "sphinx_stardocs") - -# 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"] - -# See README.md for instructions. Short version: -# * `bazel run //docs/sphinx:docs.serve` in a separate terminal -# * `ibazel build //docs/sphinx:docs` to automatically rebuild docs -sphinx_docs( - name = "docs", - srcs = glob( - include = [ - "*.md", - "**/*.md", - "_static/**", - "_includes/**", - ], - exclude = [ - "README.md", - "_*", - "*.inv*", - ], - ), - config = "conf.py", - formats = [ - "html", - ], - renamed_srcs = { - "//:CHANGELOG.md": "changelog.md", - "//:CONTRIBUTING.md": "contributing.md", - "//sphinxdocs/inventories:bazel_inventory": "bazel_inventory.inv", - }, - sphinx = ":sphinx-build", - strip_prefix = package_name() + "/", - tags = ["docs"], - target_compatible_with = _TARGET_COMPATIBLE_WITH, - deps = [ - ":bzl_api_docs", - "//sphinxdocs/docs:docs_lib", - ], -) - -sphinx_stardocs( - name = "bzl_api_docs", - srcs = [ - "//python:defs_bzl", - "//python:packaging_bzl", - "//python:pip_bzl", - "//python:py_binary_bzl", - "//python:py_cc_link_params_info_bzl", - "//python:py_library_bzl", - "//python:py_runtime_bzl", - "//python:py_runtime_info_bzl", - "//python:py_test_bzl", - "//python/cc:py_cc_toolchain_info_bzl", - "//python/entry_points:py_console_script_binary_bzl", - "//python/private/common:py_binary_rule_bazel_bzl", - "//python/private/common:py_library_rule_bazel_bzl", - "//python/private/common:py_runtime_rule_bzl", - "//python/private/common:py_test_rule_bazel_bzl", - ] + ([ - # Bazel 6 + Stardoc isn't able to parse something about the python bzlmod extension - "//python/extensions:python_bzl", - ] if IS_BAZEL_7_OR_HIGHER else []) + ([ - # This depends on @pythons_hub, which is only created under bzlmod, - "//python/extensions:pip_bzl", - ] if IS_BAZEL_7_OR_HIGHER and BZLMOD_ENABLED else []), - prefix = "api/", - tags = ["docs"], - target_compatible_with = _TARGET_COMPATIBLE_WITH, -) - -sphinx_stardoc( - name = "py_cc_toolchain", - src = "//python/private:py_cc_toolchain_rule.bzl", - prefix = "api/", - public_load_path = "//python/cc:py_cc_toolchain.bzl", - tags = ["docs"], - target_compatible_with = _TARGET_COMPATIBLE_WITH, - deps = ["//python/cc:py_cc_toolchain_bzl"], -) - -sphinx_stardoc( - name = "py_runtime_pair", - src = "//python/private:py_runtime_pair_rule_bzl", - public_load_path = "//python:py_runtime_pair.bzl", - tags = ["docs"], - target_compatible_with = _TARGET_COMPATIBLE_WITH, -) - -readthedocs_install( - name = "readthedocs_install", - docs = [":docs"], - target_compatible_with = _TARGET_COMPATIBLE_WITH, -) - -sphinx_build_binary( - name = "sphinx-build", - target_compatible_with = _TARGET_COMPATIBLE_WITH, - deps = [ - requirement("sphinx"), - requirement("sphinx_rtd_theme"), - requirement("myst_parser"), - requirement("readthedocs_sphinx_ext"), - requirement("typing_extensions"), - "//sphinxdocs/src/sphinx_bzl", - ], -) - -_REQUIREMENTS_TARGET_COMPATIBLE_WITH = select({ - "@platforms//os:linux": [], - "@platforms//os:macos": [], - "@platforms//os:windows": [], - "//conditions:default": ["@platforms//:incompatible"], -}) if BZLMOD_ENABLED else ["@platforms//:incompatible"] - -# Run bazel run //docs/sphinx:requirements.update -genrule( - name = "requirements", - srcs = ["pyproject.toml"], - outs = ["_requirements.txt"], - cmd = "$(UV_BIN) pip compile " + " ".join([ - "--custom-compile-command='bazel run //docs/sphinx:requirements.update'", - "--generate-hashes", - "--universal", - "--emit-index-url", - "--no-strip-extras", - "--no-build", - "--python=$(PYTHON3)", - "$<", - "--output-file=$@", - # Always try upgrading - "--upgrade", - ]), - tags = [ - "local", - "manual", - "no-cache", - ], - target_compatible_with = _REQUIREMENTS_TARGET_COMPATIBLE_WITH, - toolchains = [ - "//python/uv:current_toolchain", - "//python:current_py_toolchain", - ], -) - -# Write a script that can be used for updating the in-tree version of the -# requirements file -write_file( - name = "gen_update_requirements", - out = "requirements.update.py", - content = [ - "from os import environ", - "from pathlib import Path", - "from sys import stderr", - "", - 'src = Path(environ["REQUIREMENTS_FILE"])', - 'dst = Path(environ["BUILD_WORKSPACE_DIRECTORY"]) / "docs" / "sphinx" / "requirements.txt"', - 'print(f"Writing requirements contents from {src} to {dst}", file=stderr)', - "dst.write_text(src.read_text())", - 'print("Success!", file=stderr)', - ], - target_compatible_with = _REQUIREMENTS_TARGET_COMPATIBLE_WITH, -) - -py_binary( - name = "requirements.update", - srcs = ["requirements.update.py"], - data = [":requirements"], - env = { - "REQUIREMENTS_FILE": "$(location :requirements)", - }, - tags = ["manual"], - target_compatible_with = _REQUIREMENTS_TARGET_COMPATIBLE_WITH, -) diff --git a/docs/sphinx/support.md b/docs/support.md similarity index 100% rename from docs/sphinx/support.md rename to docs/support.md diff --git a/docs/sphinx/toolchains.md b/docs/toolchains.md similarity index 100% rename from docs/sphinx/toolchains.md rename to docs/toolchains.md From bdcf53a7a0a09d3b73ff4b0096523799f10bd341 Mon Sep 17 00:00:00 2001 From: Tobias Slettemoen Kongsvik Date: Wed, 21 Aug 2024 15:21:47 +0200 Subject: [PATCH 161/345] fix: formatting directive bugs in test (#2134) I'm getting a build error in my builds because nogo complains about this bug. I guess I could configure my nogo to no check this code, but I think it should be fixed. --------- Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> --- CHANGELOG.md | 3 +++ gazelle/manifest/test/test.go | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b457c411d..91554c4984 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,9 @@ A brief description of the categories of changes: ### Changed * Nothing yet +### Fixed +* (gazelle): Fix incorrect use of `t.Fatal`/`t.Fatalf` in tests. + ### Added * Nothing yet diff --git a/gazelle/manifest/test/test.go b/gazelle/manifest/test/test.go index 506c7d2074..a7647f3f7c 100644 --- a/gazelle/manifest/test/test.go +++ b/gazelle/manifest/test/test.go @@ -33,12 +33,12 @@ import ( func TestGazelleManifestIsUpdated(t *testing.T) { requirementsPath := os.Getenv("_TEST_REQUIREMENTS") if requirementsPath == "" { - t.Fatalf("_TEST_REQUIREMENTS must be set") + t.Fatal("_TEST_REQUIREMENTS must be set") } manifestPath := os.Getenv("_TEST_MANIFEST") if manifestPath == "" { - t.Fatalf("_TEST_MANIFEST must be set") + t.Fatal("_TEST_MANIFEST must be set") } manifestFile := new(manifest.File) @@ -53,7 +53,7 @@ func TestGazelleManifestIsUpdated(t *testing.T) { manifestGeneratorHashPath, err := runfiles.Rlocation( os.Getenv("_TEST_MANIFEST_GENERATOR_HASH")) if err != nil { - t.Fatal("failed to resolve runfiles path of manifest: %v", err) + t.Fatalf("failed to resolve runfiles path of manifest: %v", err) } manifestGeneratorHash, err := os.Open(manifestGeneratorHashPath) From 04e2f32be4b2ada889c6483ddcd458790968e1ef Mon Sep 17 00:00:00 2001 From: Alex Torok Date: Wed, 21 Aug 2024 10:56:54 -0400 Subject: [PATCH 162/345] feat(gazelle): Update resolve.go to provide more human-friendly error output (#2120) Update the Resolver error messages in resolve.go to be easier to read. While enabling gazelle in an existing repo, I found it somewhat difficult to skim the error messages. This PR: 1. Adds a bit of whitespace to spread different pieces of information out 2. Provides an additional remediation action for ambiguous import resolution 3. Moves the filename and line number where the error is to the front of the line. 4. Provides more concrete "gazelle:resolve py" directive examples for each errored dep resolution. Additionally, update a testcase to showcase the ambiguous import resolution error case. See the `test.yaml` file diff for an example of the old vs new error output. --- CHANGELOG.md | 2 +- gazelle/python/resolve.go | 17 +++++++++-------- .../invalid_imported_module/__init__.py | 4 +++- .../invalid_imported_module/foo/BUILD.in | 11 +++++++++++ .../testdata/invalid_imported_module/foo/bar.py | 0 .../testdata/invalid_imported_module/test.yaml | 17 +++++++++++++++-- 6 files changed, 39 insertions(+), 12 deletions(-) create mode 100644 gazelle/python/testdata/invalid_imported_module/foo/BUILD.in create mode 100644 gazelle/python/testdata/invalid_imported_module/foo/bar.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 91554c4984..f703269884 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ A brief description of the categories of changes: [x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/x.x.x ### Changed -* Nothing yet +* (gazelle): Update error messages when unable to resolve a dependency to be more human-friendly. ### Fixed * (gazelle): Fix incorrect use of `t.Fatal`/`t.Fatalf` in tests. diff --git a/gazelle/python/resolve.go b/gazelle/python/resolve.go index ca306c3db8..a7b716a829 100644 --- a/gazelle/python/resolve.go +++ b/gazelle/python/resolve.go @@ -206,11 +206,11 @@ func (py *Resolver) Resolve( continue MODULES_LOOP } else if cfg.ValidateImportStatements() { err := fmt.Errorf( - "%[1]q at line %[2]d from %[3]q is an invalid dependency: possible solutions:\n"+ + "%[1]q, line %[2]d: %[3]q is an invalid dependency: possible solutions:\n"+ "\t1. Add it as a dependency in the requirements.txt file.\n"+ - "\t2. Instruct Gazelle to resolve to a known dependency using the gazelle:resolve directive.\n"+ - "\t3. Ignore it with a comment '# gazelle:ignore %[1]s' in the Python file.\n", - moduleName, mod.LineNumber, mod.Filepath, + "\t2. Use the '# gazelle:resolve py %[3]s TARGET_LABEL' BUILD file directive to resolve to a known dependency.\n"+ + "\t3. Ignore it with a comment '# gazelle:ignore %[3]s' in the Python file.\n", + mod.Filepath, mod.LineNumber, moduleName, ) errs = append(errs, err) continue POSSIBLE_MODULE_LOOP @@ -236,9 +236,10 @@ func (py *Resolver) Resolve( } if len(sameRootMatches) != 1 { err := fmt.Errorf( - "multiple targets (%s) may be imported with %q at line %d in %q "+ - "- this must be fixed using the \"gazelle:resolve\" directive", - targetListFromResults(filteredMatches), moduleName, mod.LineNumber, mod.Filepath) + "%[1]q, line %[2]d: multiple targets (%[3]s) may be imported with %[4]q: possible solutions:\n"+ + "\t1. Disambiguate the above multiple targets by removing duplicate srcs entries.\n"+ + "\t2. Use the '# gazelle:resolve py %[4]s TARGET_LABEL' BUILD file directive to resolve to one of the above targets.\n", + mod.Filepath, mod.LineNumber, targetListFromResults(filteredMatches), moduleName) errs = append(errs, err) continue POSSIBLE_MODULE_LOOP } @@ -263,7 +264,7 @@ func (py *Resolver) Resolve( for _, err := range errs { joinedErrs = fmt.Sprintf("%s%s\n", joinedErrs, err) } - log.Printf("ERROR: failed to validate dependencies for target %q: %v\n", from.String(), joinedErrs) + log.Printf("ERROR: failed to validate dependencies for target %q:\n\n%v", from.String(), joinedErrs) hasFatalError = true } } diff --git a/gazelle/python/testdata/invalid_imported_module/__init__.py b/gazelle/python/testdata/invalid_imported_module/__init__.py index dc6fb8519e..40b5848788 100644 --- a/gazelle/python/testdata/invalid_imported_module/__init__.py +++ b/gazelle/python/testdata/invalid_imported_module/__init__.py @@ -12,6 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +import foo.bar + try: import grpc @@ -19,4 +21,4 @@ except ImportError: grpc_available = False -_ = grpc +_ = bar(grpc) diff --git a/gazelle/python/testdata/invalid_imported_module/foo/BUILD.in b/gazelle/python/testdata/invalid_imported_module/foo/BUILD.in new file mode 100644 index 0000000000..4f598e905c --- /dev/null +++ b/gazelle/python/testdata/invalid_imported_module/foo/BUILD.in @@ -0,0 +1,11 @@ +load("@rules_python//python:defs.bzl", "py_library") + +py_library( + name = "bar_1", + srcs = ["bar.py"], +) + +py_library( + name = "bar_2", + srcs = ["bar.py"], +) diff --git a/gazelle/python/testdata/invalid_imported_module/foo/bar.py b/gazelle/python/testdata/invalid_imported_module/foo/bar.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/invalid_imported_module/test.yaml b/gazelle/python/testdata/invalid_imported_module/test.yaml index 6bcea39d2e..0085523dbd 100644 --- a/gazelle/python/testdata/invalid_imported_module/test.yaml +++ b/gazelle/python/testdata/invalid_imported_module/test.yaml @@ -16,7 +16,20 @@ expect: exit_code: 1 stderr: | - gazelle: ERROR: failed to validate dependencies for target "//:invalid_imported_module": "grpc" at line 16 from "__init__.py" is an invalid dependency: possible solutions: + gazelle: ERROR: failed to validate dependencies for target "//:invalid_imported_module": + + "__init__.py", line 15: multiple targets (//foo:bar_1, //foo:bar_2) may be imported with "foo.bar": possible solutions: + 1. Disambiguate the above multiple targets by removing duplicate srcs entries. + 2. Use the '# gazelle:resolve py foo.bar TARGET_LABEL' BUILD file directive to resolve to one of the above targets. + + "__init__.py", line 15: "foo" is an invalid dependency: possible solutions: + 1. Add it as a dependency in the requirements.txt file. + 2. Use the '# gazelle:resolve py foo TARGET_LABEL' BUILD file directive to resolve to a known dependency. + 3. Ignore it with a comment '# gazelle:ignore foo' in the Python file. + + gazelle: ERROR: failed to validate dependencies for target "//:invalid_imported_module": + + "__init__.py", line 18: "grpc" is an invalid dependency: possible solutions: 1. Add it as a dependency in the requirements.txt file. - 2. Instruct Gazelle to resolve to a known dependency using the gazelle:resolve directive. + 2. Use the '# gazelle:resolve py grpc TARGET_LABEL' BUILD file directive to resolve to a known dependency. 3. Ignore it with a comment '# gazelle:ignore grpc' in the Python file. From dac8a5fb78645ba20b0332f22621c1a004cbe85a Mon Sep 17 00:00:00 2001 From: "Elvis M. Wianda" <7077790+ewianda@users.noreply.github.com> Date: Thu, 22 Aug 2024 07:57:38 -0400 Subject: [PATCH 163/345] fix: Exclude external directory when generating python report (#2136) This PR will reduce the time it take to run `bazel coverage` *Before this fix,* ``` bazel coverage --cache_test_results=no //... Elapsed time: 7.054s, Critical Path: 6.87s ``` [lcov --list bazel-out/_coverage/_coverage_report.dat](https://github.com/user-attachments/files/16681828/lcov.log) *After* ``` bazel coverage --cache_test_results=no //... Elapsed time: 2.474s, Critical Path: 1.18s $ lcov --list bazel-out/_coverage/_coverage_report.dat Reading tracefile bazel-out/_coverage/_coverage_report.dat |Lines |Functions |Branches Filename |Rate Num|Rate Num|Rate Num ================================================================================ [/home/ewianda/.cache/bazel/_bazel_ewianda/da4b4cc49e0e621570c9e24d6f1eab95/execroot/_main/bazel-out/k8-fastbuild/bin/benchsci/ml/nlp/] test_tokenizer_stage2_bootstrap.py | 6.0% 250| - 0| - 0 [benchsci/] devtools/python/pytest_helper.py |90.5% 21| - 0| - 0 ml/nlp/test_tokenizer.py | 100% 13| - 0| - 0 ml/nlp/tokenizer.py |61.8% 76| - 0| - 0 ================================================================================ Total:|26.1% 360| - 0| - 0 ``` Related to https://github.com/bazelbuild/rules_python/issues/1434 --------- Co-authored-by: aignas <240938+aignas@users.noreply.github.com> --- CHANGELOG.md | 2 ++ python/private/stage2_bootstrap_template.py | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f703269884..2e29017535 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,8 @@ A brief description of the categories of changes: ### Fixed * (gazelle): Fix incorrect use of `t.Fatal`/`t.Fatalf` in tests. +* (toolchain) Omit third-party python packages from coverage reports from + stage2 bootstrap template. ### Added * Nothing yet diff --git a/python/private/stage2_bootstrap_template.py b/python/private/stage2_bootstrap_template.py index 29f59d2195..f66c28bd51 100644 --- a/python/private/stage2_bootstrap_template.py +++ b/python/private/stage2_bootstrap_template.py @@ -364,6 +364,14 @@ def _maybe_collect_coverage(enable): # Pipes can't be read back later, which can cause coverage to # throw an error when trying to get its source code. "/dev/fd/*", + # The mechanism for finding third-party packages in coverage-py + # only works for installed packages, not for runfiles. e.g: + #'$HOME/.local/lib/python3.10/site-packages', + # '/usr/lib/python', + # '/usr/lib/python3.10/site-packages', + # '/usr/local/lib/python3.10/dist-packages' + # see https://github.com/nedbat/coveragepy/blob/bfb0c708fdd8182b2a9f0fc403596693ef65e475/coverage/inorout.py#L153-L164 + "*/external/*", ], ) cov.start() From 5eff339f75ea663151b9df7e68c18c417ea91d62 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Thu, 22 Aug 2024 18:39:32 +0300 Subject: [PATCH 164/345] fix(bzlmod): keep the lockfile platform independent when resolving python (#2135) Before this PR the lockfile would become platform dependent when the `requirements` file would have env markers. This was not caught because we do not have MODULE.bazel.lock checked into the `rules_python` repository because the CI is running against many versions and the lock file is different, therefore we would not be able to run with `bazel build --lockfile_mode=error`. With this change we use the label to `BUILD.bazel` which is living next to the `python` symlink and since the `BUILD.bazel` is the same on all platforms, the lockfile will remain the same. Summary * refactor(uv): create a reusable macro for using uv for locking reqs. * test(bzlmod): enable testing the MODULE.bazel.lock breakage across platforms. * test(bzlmod): use a universal requirements file for 3.9. This breaks the CI, because the python interpreter file hash is added to the lock file. * fix(bzlmod): keep the lockfile platform independent when resolving python Fixes #1105 and #1868 for real this time. Implements an additional helper for #1975. --- .bazelci/presubmit.yml | 6 + .gitignore | 1 + CHANGELOG.md | 6 + docs/BUILD.bazel | 68 +- examples/BUILD.bazel | 10 + examples/bzlmod/.bazelrc | 4 + examples/bzlmod/BUILD.bazel | 12 +- examples/bzlmod/MODULE.bazel | 25 +- examples/bzlmod/MODULE.bazel.lock | 8551 ++++++++++++++++++ examples/bzlmod/requirements_lock_3_9.txt | 68 +- examples/bzlmod/requirements_windows_3_9.txt | 489 - python/private/pypi/pypi_repo_utils.bzl | 17 +- python/private/repo_utils.bzl | 6 + python/uv/private/lock.bzl | 121 + 14 files changed, 8771 insertions(+), 613 deletions(-) create mode 100644 examples/bzlmod/MODULE.bazel.lock delete mode 100644 examples/bzlmod/requirements_windows_3_9.txt create mode 100644 python/uv/private/lock.bzl diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index b778ac49a4..43c52f4114 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -223,6 +223,12 @@ tasks: name: "examples/bzlmod: Ubuntu, minimum Bazel" working_directory: examples/bzlmod platform: ubuntu2004 + build_flags: + - "--lockfile_mode=update" + test_flags: + - "--lockfile_mode=update" + coverage_flags: + - "--lockfile_mode=update" integration_test_bzlmod_ubuntu: <<: *reusable_build_test_all <<: *coverage_targets_example_bzlmod diff --git a/.gitignore b/.gitignore index 863b0e9c3f..92b5801a52 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,4 @@ user.bazelrc # 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/CHANGELOG.md b/CHANGELOG.md index 2e29017535..029de8ae11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,12 @@ A brief description of the categories of changes: * (gazelle): Update error messages when unable to resolve a dependency to be more human-friendly. ### Fixed +* (bzlmod) get the path to the host python interpreter in a way that results in + platform non-dependent hashes in the lock file when the requirement markers need + to be evaluated. +* (bzlmod) correctly watch sources used for evaluating requirement markers for + any changes so that the repository rule or module extensions can be + re-evaluated when the said files change. * (gazelle): Fix incorrect use of `t.Fatal`/`t.Fatalf` in tests. * (toolchain) Omit third-party python packages from coverage reports from stage2 bootstrap template. diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index 56bca8838f..0c815940ba 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -13,11 +13,10 @@ # limitations under the License. load("@bazel_skylib//:bzl_library.bzl", "bzl_library") -load("@bazel_skylib//rules:write_file.bzl", "write_file") load("@dev_pip//:requirements.bzl", "requirement") -load("//python:py_binary.bzl", "py_binary") load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility +load("//python/uv/private:lock.bzl", "lock") # buildifier: disable=bzl-visibility load("//sphinxdocs:readthedocs.bzl", "readthedocs_install") load("//sphinxdocs:sphinx.bzl", "sphinx_build_binary", "sphinx_docs") load("//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardoc", "sphinx_stardocs") @@ -140,71 +139,12 @@ sphinx_build_binary( ], ) -_REQUIREMENTS_TARGET_COMPATIBLE_WITH = select({ - "@platforms//os:linux": [], - "@platforms//os:macos": [], - "@platforms//os:windows": [], - "//conditions:default": ["@platforms//:incompatible"], -}) if BZLMOD_ENABLED else ["@platforms//:incompatible"] - # Run bazel run //docs:requirements.update -genrule( +lock( name = "requirements", srcs = ["pyproject.toml"], - outs = ["_requirements.txt"], - cmd = "$(UV_BIN) pip compile " + " ".join([ - "--custom-compile-command='bazel run //docs:requirements.update'", - "--generate-hashes", - "--universal", - "--emit-index-url", - "--no-strip-extras", - "--no-build", - "--python=$(PYTHON3)", - "$<", - "--output-file=$@", - # Always try upgrading - "--upgrade", - ]), - tags = [ - "local", - "manual", - "no-cache", - ], - target_compatible_with = _REQUIREMENTS_TARGET_COMPATIBLE_WITH, - toolchains = [ - "//python/uv:current_toolchain", - "//python:current_py_toolchain", - ], -) - -# Write a script that can be used for updating the in-tree version of the -# requirements file -write_file( - name = "gen_update_requirements", - out = "requirements.update.py", - content = [ - "from os import environ", - "from pathlib import Path", - "from sys import stderr", - "", - 'src = Path(environ["REQUIREMENTS_FILE"])', - 'dst = Path(environ["BUILD_WORKSPACE_DIRECTORY"]) / "docs" / "requirements.txt"', - 'print(f"Writing requirements contents from {src} to {dst}", file=stderr)', - "dst.write_text(src.read_text())", - 'print("Success!", file=stderr)', - ], - target_compatible_with = _REQUIREMENTS_TARGET_COMPATIBLE_WITH, -) - -py_binary( - name = "requirements.update", - srcs = ["requirements.update.py"], - data = [":requirements"], - env = { - "REQUIREMENTS_FILE": "$(location :requirements)", - }, - tags = ["manual"], - target_compatible_with = _REQUIREMENTS_TARGET_COMPATIBLE_WITH, + out = "requirements.txt", + upgrade = True, ) licenses(["notice"]) # Apache 2.0 diff --git a/examples/BUILD.bazel b/examples/BUILD.bazel index f6372eabec..92ca8e7199 100644 --- a/examples/BUILD.bazel +++ b/examples/BUILD.bazel @@ -12,4 +12,14 @@ # See the License for the specific language governing permissions and # limitations under the License. +# The following is experimental API and currently not intended for use outside this example. +load("@rules_python//python/uv/private:lock.bzl", "lock") # buildifier: disable=bzl-visibility + licenses(["notice"]) # Apache 2.0 + +lock( + name = "bzlmod_requirements_3_9", + srcs = ["bzlmod/requirements.in"], + out = "bzlmod/requirements_lock_3_9.txt", + python_version = "3.9.19", +) diff --git a/examples/bzlmod/.bazelrc b/examples/bzlmod/.bazelrc index 578342d7ee..64e17c3175 100644 --- a/examples/bzlmod/.bazelrc +++ b/examples/bzlmod/.bazelrc @@ -1,5 +1,9 @@ common --enable_bzlmod +# Update the lockfile by running: +# bazel mod deps --lockfile_mode=update +common --lockfile_mode=error + coverage --java_runtime_version=remotejdk_11 test --test_output=errors --enable_runfiles diff --git a/examples/bzlmod/BUILD.bazel b/examples/bzlmod/BUILD.bazel index bb16f98a6f..d684b9c31d 100644 --- a/examples/bzlmod/BUILD.bazel +++ b/examples/bzlmod/BUILD.bazel @@ -9,20 +9,10 @@ load("@bazel_skylib//rules:build_test.bzl", "build_test") load("@pip//:requirements.bzl", "all_data_requirements", "all_requirements", "all_whl_requirements", "requirement") load("@python_3_9//:defs.bzl", py_test_with_transition = "py_test") load("@python_versions//3.10:defs.bzl", compile_pip_requirements_3_10 = "compile_pip_requirements") -load("@python_versions//3.9:defs.bzl", compile_pip_requirements_3_9 = "compile_pip_requirements") load("@rules_python//python:defs.bzl", "py_binary", "py_library", "py_test") # This stanza calls a rule that generates targets for managing pip dependencies -# with pip-compile. -compile_pip_requirements_3_9( - name = "requirements_3_9", - src = "requirements.in", - requirements_txt = "requirements_lock_3_9.txt", - requirements_windows = "requirements_windows_3_9.txt", -) - -# This stanza calls a rule that generates targets for managing pip dependencies -# with pip-compile. +# with pip-compile for a particular python version. compile_pip_requirements_3_10( name = "requirements_3_10", timeout = "moderate", diff --git a/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel index 3da17a6eb2..b7b46b7dba 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -135,17 +135,7 @@ pip.parse( ], hub_name = "pip", python_version = "3.9", - # The requirements files for each platform that we want to support. - requirements_by_platform = { - # Default requirements file for needs to explicitly provide the platforms - "//:requirements_lock_3_9.txt": "linux_*,osx_*", - # This API allows one to specify additional platforms that the users - # configure the toolchains for themselves. In this example we add - # `windows_aarch64` to illustrate that `rules_python` won't fail to - # process the value, but it does not mean that this example will work - # on Windows ARM. - "//:requirements_windows_3_9.txt": "windows_x86_64,windows_aarch64", - }, + requirements_lock = "requirements_lock_3_9.txt", # These modifications were created above and we # are providing pip.parse with the label of the mod # and the name of the wheel. @@ -179,8 +169,17 @@ pip.parse( ], hub_name = "pip", python_version = "3.10", - requirements_lock = "//:requirements_lock_3_10.txt", - requirements_windows = "//:requirements_windows_3_10.txt", + # The requirements files for each platform that we want to support. + requirements_by_platform = { + # Default requirements file for needs to explicitly provide the platforms + "//:requirements_lock_3_10.txt": "linux_*,osx_*", + # This API allows one to specify additional platforms that the users + # configure the toolchains for themselves. In this example we add + # `windows_aarch64` to illustrate that `rules_python` won't fail to + # process the value, but it does not mean that this example will work + # on Windows ARM. + "//:requirements_windows_3_10.txt": "windows_x86_64,windows_aarch64", + }, # These modifications were created above and we # are providing pip.parse with the label of the mod # and the name of the wheel. diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock new file mode 100644 index 0000000000..e542f43b0a --- /dev/null +++ b/examples/bzlmod/MODULE.bazel.lock @@ -0,0 +1,8551 @@ +{ + "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.11.0/source.json": "c9320aa53cd1c441d24bd6b716da087ad7e4ff0d9742a9884587596edfe53015", + "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.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.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/platforms/0.0.9/source.json": "cd74d854bf16a9e002fb2ca7b1a421f4403cda29f824a765acd3a8c56f8d43e6", + "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/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.1/source.json": "5abb45cc9beb27b77aec6a65a11855ef2b55d95dfdc358e9f312b78ae0ba32d5", + "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/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.5.3/source.json": "cd53fe968dc8cd98197c052db3db6d82562960c87b61e7a90ee96f8e4e0dda97", + "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": "meSzxn3DUCcYEhq4HQwExWkWtU4EjriRBQLsZN+Q0SU=", + "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": "4ijz6uc3T4E+d+U8LQv4EAt+8OqZNVY/lzvhLx3y1yg=", + "usagesDigest": "WfVTcbopbu3jyxPgDWx1iqIv1QV6L/T7utvDxAj5k84=", + "recordedFileInputs": { + "@@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", + "https://maven.google.com/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" + } + }, + "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", + "https://maven.google.com/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" + } + }, + "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" + } + }, + "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", + "https://maven.google.com/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" + } + }, + "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" + } + }, + "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", + "https://maven.google.com/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" + } + }, + "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" + } + }, + "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", + "https://maven.google.com/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_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", + "https://maven.google.com/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" + } + }, + "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": "pX61d12AFioOtqChQDmxvlNGDYT69e5MrKT2E/S6TeQ=", + "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": "iJtgc0fsxL6yWzjazyklge5csIWtbgQ8+wgW8P4jfL0=", + "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": "c421a2c2f3f428d2685a16eb9cc3fb8662605aba4ef151a87a356678bb7e866d", + "@@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\"}]" + }, + "default_version": "3.9", + "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\"}]" + }, + "default_version": "3.9", + "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": "vTGpUAA3aBLYLx1iJ020kpJsuvO9GLbl11swsDXNKRI=", + "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", + "recordedFileInputs": { + "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", + "@@rules_python~//tools/publish/requirements_windows.txt": "15472d5a28e068d31ba9e2dc389459698afaff366e9db06e15890283a3ea252e", + "@@rules_python~//tools/publish/requirements_darwin.txt": "61cf602ff33b58c5f42a6cee30112985e9b502209605314e313157f8aad679f9" + }, + "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_idna_py3_none_any_82fee1fc": { + "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.7-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "idna==3.7", + "sha256": "82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0", + "urls": [ + "https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_certifi_py3_none_any_c198e21b": { + "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.7.4-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "certifi==2024.7.4", + "sha256": "c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90", + "urls": [ + "https://files.pythonhosted.org/packages/1c/d5/c84e1a17bf61d4df64ca866a1c9a913874b4e9bdc131ec689a0ad013fb36/certifi-2024.7.4-py3-none-any.whl" + ] + } + }, + "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_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_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_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_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_certifi_sdist_5a1e7645": { + "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.7.4.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "certifi==2024.7.4", + "sha256": "5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", + "urls": [ + "https://files.pythonhosted.org/packages/c2/02/a95f2b11e207f68bc64d7aae9666fed2e2b3f307748d5123dffb72a1bbea/certifi-2024.7.4.tar.gz" + ] + } + }, + "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", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_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", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_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_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_idna_sdist_028ff3aa": { + "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.7.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "idna==3.7", + "sha256": "028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", + "urls": [ + "https://files.pythonhosted.org/packages/21/ed/f86a79a07470cb07819390452f178b3bef1d375f2ec021ecfc709fc7cf07/idna-3.7.tar.gz" + ] + } + }, + "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.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\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"idna-3.7-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_idna_py3_none_any_82fee1fc\",\"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.7.tar.gz\",\"repo\":\"rules_python_publish_deps_311_idna_sdist_028ff3aa\",\"target_platforms\":[\"cp311_osx_aarch64\",\"cp311_osx_x86_64\",\"cp311_windows_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.7.4-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_certifi_py3_none_any_c198e21b\",\"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.7.4.tar.gz\",\"repo\":\"rules_python_publish_deps_311_certifi_sdist_5a1e7645\",\"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\":null,\"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\":null,\"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\"}]" + }, + "default_version": "3.9", + "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/requirements_lock_3_9.txt b/examples/bzlmod/requirements_lock_3_9.txt index e6aaa992fb..bfabfd5fa5 100644 --- a/examples/bzlmod/requirements_lock_3_9.txt +++ b/examples/bzlmod/requirements_lock_3_9.txt @@ -1,9 +1,6 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# bazel run //:requirements_3_9.update -# +# This file was autogenerated by uv via the following command: +# bazel run //examples:bzlmod_requirements_3_9.update +--index-url https://pypi.org/simple --extra-index-url https://pypi.org/simple/ alabaster==0.7.13 \ @@ -29,7 +26,10 @@ chardet==4.0.0 \ colorama==0.4.6 \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 - # via -r requirements.in + # via + # -r examples/bzlmod/requirements.in + # pylint + # sphinx dill==0.3.6 \ --hash=sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0 \ --hash=sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373 @@ -46,9 +46,9 @@ imagesize==1.4.1 \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a # via sphinx -importlib-metadata==6.8.0 \ - --hash=sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb \ - --hash=sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743 +importlib-metadata==8.4.0 ; python_version < '3.10' \ + --hash=sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1 \ + --hash=sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5 # via sphinx isort==5.11.4 \ --hash=sha256:6db30c5ded9815d813932c04c2f85a360bcdd35fed496f4d8f35495ef0a261b6 \ @@ -183,17 +183,17 @@ pylint==2.15.9 \ --hash=sha256:18783cca3cfee5b83c6c5d10b3cdb66c6594520ffae61890858fe8d932e1c6b4 \ --hash=sha256:349c8cd36aede4d50a0754a8c0218b43323d13d5d88f4b2952ddfe3e169681eb # via - # -r requirements.in + # -r examples/bzlmod/requirements.in # pylint-print pylint-print==1.0.1 \ --hash=sha256:30aa207e9718ebf4ceb47fb87012092e6d8743aab932aa07aa14a73e750ad3d0 \ --hash=sha256:a2b2599e7887b93e551db2624c523c1e6e9e58c3be8416cd98d41e4427e2669b - # via -r requirements.in + # via -r examples/bzlmod/requirements.in python-dateutil==2.8.2 \ --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 # via - # -r requirements.in + # -r examples/bzlmod/requirements.in # s3cmd python-magic==0.4.27 \ --hash=sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b \ @@ -256,12 +256,18 @@ requests==2.25.1 \ --hash=sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804 \ --hash=sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e # via - # -r requirements.in + # -r examples/bzlmod/requirements.in # sphinx s3cmd==2.1.0 \ --hash=sha256:49cd23d516b17974b22b611a95ce4d93fe326feaa07320bd1d234fed68cbccfa \ --hash=sha256:966b0a494a916fc3b4324de38f089c86c70ee90e8e1cae6d59102103a4c0cc03 - # via -r requirements.in + # via -r examples/bzlmod/requirements.in +setuptools==65.6.3 \ + --hash=sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54 \ + --hash=sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75 + # via + # babel + # yamllint six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 @@ -274,7 +280,7 @@ sphinx==7.2.6 \ --hash=sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560 \ --hash=sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5 # via - # -r requirements.in + # -r examples/bzlmod/requirements.in # sphinxcontrib-applehelp # sphinxcontrib-devhelp # sphinxcontrib-htmlhelp @@ -304,13 +310,13 @@ sphinxcontrib-serializinghtml==1.1.9 \ --hash=sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54 \ --hash=sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1 # via - # -r requirements.in + # -r examples/bzlmod/requirements.in # sphinx tabulate==0.9.0 \ --hash=sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c \ --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f - # via -r requirements.in -tomli==2.0.1 \ + # via -r examples/bzlmod/requirements.in +tomli==2.0.1 ; python_version < '3.11' \ --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f # via pylint @@ -318,9 +324,9 @@ tomlkit==0.11.6 \ --hash=sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b \ --hash=sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73 # via pylint -typing-extensions==4.4.0 \ - --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ - --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e +typing-extensions==4.12.2 ; python_version < '3.10' \ + --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ + --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 # via # astroid # pylint @@ -399,11 +405,11 @@ websockets==11.0.3 \ --hash=sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74 \ --hash=sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0 \ --hash=sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564 - # via -r requirements.in + # via -r examples/bzlmod/requirements.in wheel==0.40.0 \ --hash=sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873 \ --hash=sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247 - # via -r requirements.in + # via -r examples/bzlmod/requirements.in wrapt==1.14.1 \ --hash=sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3 \ --hash=sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b \ @@ -473,14 +479,8 @@ wrapt==1.14.1 \ yamllint==1.28.0 \ --hash=sha256:89bb5b5ac33b1ade059743cf227de73daa34d5e5a474b06a5e17fc16583b0cf2 \ --hash=sha256:9e3d8ddd16d0583214c5fdffe806c9344086721f107435f68bad990e5a88826b - # via -r requirements.in -zipp==3.17.0 \ - --hash=sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 \ - --hash=sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0 + # via -r examples/bzlmod/requirements.in +zipp==3.20.0 ; python_version < '3.10' \ + --hash=sha256:0145e43d89664cfe1a2e533adc75adafed82fe2da404b4bbb6b026c0157bdb31 \ + --hash=sha256:58da6168be89f0be59beb194da1250516fdaa062ccebd30127ac65d30045e10d # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -setuptools==65.6.3 \ - --hash=sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54 \ - --hash=sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75 - # via yamllint diff --git a/examples/bzlmod/requirements_windows_3_9.txt b/examples/bzlmod/requirements_windows_3_9.txt deleted file mode 100644 index 636b4dfc3e..0000000000 --- a/examples/bzlmod/requirements_windows_3_9.txt +++ /dev/null @@ -1,489 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# bazel run //:requirements_3_9.update -# ---extra-index-url https://pypi.org/simple/ - -alabaster==0.7.13 \ - --hash=sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3 \ - --hash=sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2 - # via sphinx -astroid==2.12.13 \ - --hash=sha256:10e0ad5f7b79c435179d0d0f0df69998c4eef4597534aae44910db060baeb907 \ - --hash=sha256:1493fe8bd3dfd73dc35bd53c9d5b6e49ead98497c47b2307662556a5692d29d7 - # via pylint -babel==2.13.1 \ - --hash=sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900 \ - --hash=sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed - # via sphinx -certifi==2023.7.22 \ - --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ - --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 - # via requests -chardet==4.0.0 \ - --hash=sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa \ - --hash=sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5 - # via requests -colorama==0.4.6 \ - --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ - --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 - # via - # -r requirements.in - # pylint - # sphinx -dill==0.3.6 \ - --hash=sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0 \ - --hash=sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373 - # via pylint -docutils==0.20.1 \ - --hash=sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 \ - --hash=sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b - # via sphinx -idna==2.10 \ - --hash=sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6 \ - --hash=sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0 - # via requests -imagesize==1.4.1 \ - --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ - --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a - # via sphinx -importlib-metadata==6.8.0 \ - --hash=sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb \ - --hash=sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743 - # via sphinx -isort==5.11.4 \ - --hash=sha256:6db30c5ded9815d813932c04c2f85a360bcdd35fed496f4d8f35495ef0a261b6 \ - --hash=sha256:c033fd0edb91000a7f09527fe5c75321878f98322a77ddcc81adbd83724afb7b - # via pylint -jinja2==3.1.4 \ - --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ - --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d - # via sphinx -lazy-object-proxy==1.10.0 \ - --hash=sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56 \ - --hash=sha256:02c83f957782cbbe8136bee26416686a6ae998c7b6191711a04da776dc9e47d4 \ - --hash=sha256:0aefc7591920bbd360d57ea03c995cebc204b424524a5bd78406f6e1b8b2a5d8 \ - --hash=sha256:127a789c75151db6af398b8972178afe6bda7d6f68730c057fbbc2e96b08d282 \ - --hash=sha256:18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757 \ - --hash=sha256:217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424 \ - --hash=sha256:2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b \ - --hash=sha256:2fc0a92c02fa1ca1e84fc60fa258458e5bf89d90a1ddaeb8ed9cc3147f417255 \ - --hash=sha256:30b339b2a743c5288405aa79a69e706a06e02958eab31859f7f3c04980853b70 \ - --hash=sha256:366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94 \ - --hash=sha256:3ad54b9ddbe20ae9f7c1b29e52f123120772b06dbb18ec6be9101369d63a4074 \ - --hash=sha256:5ad9e6ed739285919aa9661a5bbed0aaf410aa60231373c5579c6b4801bd883c \ - --hash=sha256:5faf03a7d8942bb4476e3b62fd0f4cf94eaf4618e304a19865abf89a35c0bbee \ - --hash=sha256:75fc59fc450050b1b3c203c35020bc41bd2695ed692a392924c6ce180c6f1dc9 \ - --hash=sha256:76a095cfe6045c7d0ca77db9934e8f7b71b14645f0094ffcd842349ada5c5fb9 \ - --hash=sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69 \ - --hash=sha256:782e2c9b2aab1708ffb07d4bf377d12901d7a1d99e5e410d648d892f8967ab1f \ - --hash=sha256:7ab7004cf2e59f7c2e4345604a3e6ea0d92ac44e1c2375527d56492014e690c3 \ - --hash=sha256:80b39d3a151309efc8cc48675918891b865bdf742a8616a337cb0090791a0de9 \ - --hash=sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d \ - --hash=sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977 \ - --hash=sha256:92f09ff65ecff3108e56526f9e2481b8116c0b9e1425325e13245abfd79bdb1b \ - --hash=sha256:952c81d415b9b80ea261d2372d2a4a2332a3890c2b83e0535f263ddfe43f0d43 \ - --hash=sha256:9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658 \ - --hash=sha256:9e4ed0518a14dd26092614412936920ad081a424bdcb54cc13349a8e2c6d106a \ - --hash=sha256:a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd \ - --hash=sha256:b1f711e2c6dcd4edd372cf5dec5c5a30d23bba06ee012093267b3376c079ec83 \ - --hash=sha256:b4f87d4ed9064b2628da63830986c3d2dca7501e6018347798313fcf028e2fd4 \ - --hash=sha256:cb73507defd385b7705c599a94474b1d5222a508e502553ef94114a143ec6696 \ - --hash=sha256:dc0d2fc424e54c70c4bc06787e4072c4f3b1aa2f897dfdc34ce1013cf3ceef05 \ - --hash=sha256:e221060b701e2aa2ea991542900dd13907a5c90fa80e199dbf5a03359019e7a3 \ - --hash=sha256:e271058822765ad5e3bca7f05f2ace0de58a3f4e62045a8c90a0dfd2f8ad8cc6 \ - --hash=sha256:e2adb09778797da09d2b5ebdbceebf7dd32e2c96f79da9052b2e87b6ea495895 \ - --hash=sha256:e333e2324307a7b5d86adfa835bb500ee70bfcd1447384a822e96495796b0ca4 \ - --hash=sha256:e98c8af98d5707dcdecc9ab0863c0ea6e88545d42ca7c3feffb6b4d1e370c7ba \ - --hash=sha256:edb45bb8278574710e68a6b021599a10ce730d156e5b254941754a9cc0b17d03 \ - --hash=sha256:fec03caabbc6b59ea4a638bee5fce7117be8e99a4103d9d5ad77f15d6f81020c - # via astroid -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 - # via jinja2 -mccabe==0.7.0 \ - --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ - --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e - # via pylint -packaging==23.2 \ - --hash=sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5 \ - --hash=sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7 - # via sphinx -pathspec==0.10.3 \ - --hash=sha256:3c95343af8b756205e2aba76e843ba9520a24dd84f68c22b9f93251507509dd6 \ - --hash=sha256:56200de4077d9d0791465aa9095a01d421861e405b5096955051deefd697d6f6 - # via yamllint -platformdirs==2.6.0 \ - --hash=sha256:1a89a12377800c81983db6be069ec068eee989748799b946cce2a6e80dcc54ca \ - --hash=sha256:b46ffafa316e6b83b47489d240ce17173f123a9b9c83282141c3daf26ad9ac2e - # via pylint -pygments==2.16.1 \ - --hash=sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692 \ - --hash=sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29 - # via sphinx -pylint==2.15.9 \ - --hash=sha256:18783cca3cfee5b83c6c5d10b3cdb66c6594520ffae61890858fe8d932e1c6b4 \ - --hash=sha256:349c8cd36aede4d50a0754a8c0218b43323d13d5d88f4b2952ddfe3e169681eb - # via - # -r requirements.in - # pylint-print -pylint-print==1.0.1 \ - --hash=sha256:30aa207e9718ebf4ceb47fb87012092e6d8743aab932aa07aa14a73e750ad3d0 \ - --hash=sha256:a2b2599e7887b93e551db2624c523c1e6e9e58c3be8416cd98d41e4427e2669b - # via -r requirements.in -python-dateutil==2.8.2 \ - --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ - --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 - # via - # -r requirements.in - # s3cmd -python-magic==0.4.27 \ - --hash=sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b \ - --hash=sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3 - # via s3cmd -pyyaml==6.0.1 \ - --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ - --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ - --hash=sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df \ - --hash=sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741 \ - --hash=sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206 \ - --hash=sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27 \ - --hash=sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595 \ - --hash=sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62 \ - --hash=sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98 \ - --hash=sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696 \ - --hash=sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290 \ - --hash=sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9 \ - --hash=sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d \ - --hash=sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6 \ - --hash=sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867 \ - --hash=sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47 \ - --hash=sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486 \ - --hash=sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6 \ - --hash=sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3 \ - --hash=sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 \ - --hash=sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938 \ - --hash=sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0 \ - --hash=sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c \ - --hash=sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735 \ - --hash=sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d \ - --hash=sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28 \ - --hash=sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4 \ - --hash=sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba \ - --hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \ - --hash=sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef \ - --hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \ - --hash=sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd \ - --hash=sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3 \ - --hash=sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0 \ - --hash=sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515 \ - --hash=sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c \ - --hash=sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c \ - --hash=sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924 \ - --hash=sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 \ - --hash=sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43 \ - --hash=sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859 \ - --hash=sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 \ - --hash=sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54 \ - --hash=sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a \ - --hash=sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b \ - --hash=sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab \ - --hash=sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa \ - --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \ - --hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \ - --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ - --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f - # via yamllint -requests==2.25.1 \ - --hash=sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804 \ - --hash=sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e - # via - # -r requirements.in - # sphinx -s3cmd==2.1.0 \ - --hash=sha256:49cd23d516b17974b22b611a95ce4d93fe326feaa07320bd1d234fed68cbccfa \ - --hash=sha256:966b0a494a916fc3b4324de38f089c86c70ee90e8e1cae6d59102103a4c0cc03 - # via -r requirements.in -six==1.16.0 \ - --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ - --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 - # via python-dateutil -snowballstemmer==2.2.0 \ - --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 \ - --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a - # via sphinx -sphinx==7.2.6 \ - --hash=sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560 \ - --hash=sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5 - # via - # -r requirements.in - # sphinxcontrib-applehelp - # sphinxcontrib-devhelp - # sphinxcontrib-htmlhelp - # sphinxcontrib-qthelp - # sphinxcontrib-serializinghtml -sphinxcontrib-applehelp==1.0.7 \ - --hash=sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d \ - --hash=sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa - # via sphinx -sphinxcontrib-devhelp==1.0.5 \ - --hash=sha256:63b41e0d38207ca40ebbeabcf4d8e51f76c03e78cd61abe118cf4435c73d4212 \ - --hash=sha256:fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f - # via sphinx -sphinxcontrib-htmlhelp==2.0.4 \ - --hash=sha256:6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a \ - --hash=sha256:8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9 - # via sphinx -sphinxcontrib-jsmath==1.0.1 \ - --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 \ - --hash=sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8 - # via sphinx -sphinxcontrib-qthelp==1.0.6 \ - --hash=sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d \ - --hash=sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4 - # via sphinx -sphinxcontrib-serializinghtml==1.1.9 \ - --hash=sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54 \ - --hash=sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1 - # via - # -r requirements.in - # sphinx -tabulate==0.9.0 \ - --hash=sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c \ - --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f - # via -r requirements.in -tomli==2.0.1 \ - --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ - --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f - # via pylint -tomlkit==0.11.6 \ - --hash=sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b \ - --hash=sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73 - # via pylint -typing-extensions==4.4.0 \ - --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ - --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e - # via - # astroid - # pylint -urllib3==1.26.18 \ - --hash=sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07 \ - --hash=sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0 - # via requests -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 - # via -r requirements.in -wheel==0.40.0 \ - --hash=sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873 \ - --hash=sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247 - # via -r requirements.in -wrapt==1.14.1 \ - --hash=sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3 \ - --hash=sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b \ - --hash=sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4 \ - --hash=sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2 \ - --hash=sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656 \ - --hash=sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3 \ - --hash=sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff \ - --hash=sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310 \ - --hash=sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a \ - --hash=sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57 \ - --hash=sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069 \ - --hash=sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383 \ - --hash=sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe \ - --hash=sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87 \ - --hash=sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d \ - --hash=sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b \ - --hash=sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907 \ - --hash=sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f \ - --hash=sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0 \ - --hash=sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28 \ - --hash=sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1 \ - --hash=sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853 \ - --hash=sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc \ - --hash=sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3 \ - --hash=sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3 \ - --hash=sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164 \ - --hash=sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1 \ - --hash=sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c \ - --hash=sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1 \ - --hash=sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7 \ - --hash=sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1 \ - --hash=sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320 \ - --hash=sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed \ - --hash=sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1 \ - --hash=sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248 \ - --hash=sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c \ - --hash=sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456 \ - --hash=sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77 \ - --hash=sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef \ - --hash=sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1 \ - --hash=sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7 \ - --hash=sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86 \ - --hash=sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4 \ - --hash=sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d \ - --hash=sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d \ - --hash=sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8 \ - --hash=sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5 \ - --hash=sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471 \ - --hash=sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00 \ - --hash=sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68 \ - --hash=sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3 \ - --hash=sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d \ - --hash=sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735 \ - --hash=sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d \ - --hash=sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569 \ - --hash=sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7 \ - --hash=sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59 \ - --hash=sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5 \ - --hash=sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb \ - --hash=sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b \ - --hash=sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f \ - --hash=sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462 \ - --hash=sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015 \ - --hash=sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af - # via astroid -yamllint==1.28.0 \ - --hash=sha256:89bb5b5ac33b1ade059743cf227de73daa34d5e5a474b06a5e17fc16583b0cf2 \ - --hash=sha256:9e3d8ddd16d0583214c5fdffe806c9344086721f107435f68bad990e5a88826b - # via -r requirements.in -zipp==3.17.0 \ - --hash=sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 \ - --hash=sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0 - # via importlib-metadata - -# The following packages are considered to be unsafe in a requirements file: -setuptools==65.6.3 \ - --hash=sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54 \ - --hash=sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75 - # via yamllint diff --git a/python/private/pypi/pypi_repo_utils.bzl b/python/private/pypi/pypi_repo_utils.bzl index da449b4b50..196431636f 100644 --- a/python/private/pypi/pypi_repo_utils.bzl +++ b/python/private/pypi/pypi_repo_utils.bzl @@ -51,7 +51,20 @@ def _resolve_python_interpreter(mrctx, *, python_interpreter = None, python_inte python_interpreter = _get_python_interpreter_attr(mrctx, python_interpreter = python_interpreter) if python_interpreter_target != None: - python_interpreter = mrctx.path(python_interpreter_target) + # The following line would make the MODULE.bazel.lock platform + # independent, because the lock file will then contain a hash of the + # file so that the lock file can be recalculated, hence the best way is + # to add this directory to PATH. + # + # hence we add the root BUILD.bazel file and get the directory of that + # and construct the path differently. At the end of the day we don't + # want the hash of the interpreter to end up in the lock file. + if hasattr(python_interpreter_target, "same_package_label"): + root_build_bazel = python_interpreter_target.same_package_label("BUILD.bazel") + else: + root_build_bazel = python_interpreter_target.relative(":BUILD.bazel") + + python_interpreter = mrctx.path(root_build_bazel).dirname.get_child(python_interpreter_target.name) os = repo_utils.get_platforms_os_name(mrctx) @@ -110,7 +123,7 @@ def _execute_checked(mrctx, *, srcs, **kwargs): # This will ensure that we will re-evaluate the bzlmod extension or # refetch the repository_rule when the srcs change. This should work on # Bazel versions without `mrctx.watch` as well. - repo_utils.watch(mrctx.path(src)) + repo_utils.watch(mrctx, mrctx.path(src)) env = kwargs.pop("environment", {}) pythonpath = env.get("PYTHONPATH", "") diff --git a/python/private/repo_utils.bzl b/python/private/repo_utils.bzl index aab0325a49..e0bf69acac 100644 --- a/python/private/repo_utils.bzl +++ b/python/private/repo_utils.bzl @@ -404,12 +404,18 @@ def _get_platforms_cpu_name(mrctx): # TODO: Remove after Bazel 6 support dropped def _watch(mrctx, *args, **kwargs): """Calls mrctx.watch, if available.""" + if not args and not kwargs: + fail("'watch' needs at least a single argument.") + if hasattr(mrctx, "watch"): mrctx.watch(*args, **kwargs) # TODO: Remove after Bazel 6 support dropped def _watch_tree(mrctx, *args, **kwargs): """Calls mrctx.watch_tree, if available.""" + if not args and not kwargs: + fail("'watch_tree' needs at least a single argument.") + if hasattr(mrctx, "watch_tree"): mrctx.watch_tree(*args, **kwargs) diff --git a/python/uv/private/lock.bzl b/python/uv/private/lock.bzl new file mode 100644 index 0000000000..f0a66a1a93 --- /dev/null +++ b/python/uv/private/lock.bzl @@ -0,0 +1,121 @@ +# 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. +""" + +load("@bazel_skylib//rules:write_file.bzl", "write_file") +load("//python:py_binary.bzl", "py_binary") +load("//python/config_settings:transition.bzl", transition_py_binary = "py_binary") +load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: disable=bzl-visibility + +visibility(["//..."]) + +_REQUIREMENTS_TARGET_COMPATIBLE_WITH = [] if BZLMOD_ENABLED else ["@platforms//:incompatible"] + +def lock(*, name, srcs, out, upgrade = False, universal = True, python_version = None): + """Pin the requirements based on the src files. + + Args: + name: The name of the target to run for updating the requirements. + srcs: The srcs to use as inputs. + out: The output file. + upgrade: Tell `uv` to always upgrade the dependencies instead of + keeping them as they are. + 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. + + Differences with the current pip-compile rule: + - This is implemented in shell and uv. + - This does not error out if the output file does not exist yet. + - Supports transitions out of the box. + """ + pkg = native.package_name() + update_target = name + ".update" + + args = [ + "--custom-compile-command='bazel run //{}:{}'".format(pkg, update_target), + "--generate-hashes", + "--emit-index-url", + "--no-strip-extras", + "--python=$(PYTHON3)", + ] + [ + "$(location {})".format(src) + for src in srcs + ] + if upgrade: + args.append("--upgrade") + if universal: + args.append("--universal") + args.append("--output-file=$@") + cmd = "$(UV_BIN) pip compile " + " ".join(args) + + # 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 + # we are just running the command. + if native.glob([out]): + cmd = "cp -v $(location {}) $@; {}".format(out, cmd) + srcs.append(out) + + native.genrule( + name = name, + srcs = srcs, + outs = [out + ".new"], + cmd_bash = cmd, + tags = [ + "local", + "manual", + "no-cache", + ], + target_compatible_with = _REQUIREMENTS_TARGET_COMPATIBLE_WITH, + toolchains = [ + Label("//python/uv:current_toolchain"), + Label("//python:current_py_toolchain"), + ], + ) + if python_version: + py_binary_rule = lambda *args, **kwargs: transition_py_binary(python_version = python_version, *args, **kwargs) + else: + py_binary_rule = py_binary + + # Write a script that can be used for updating the in-tree version of the + # requirements file + write_file( + name = name + ".update_gen", + out = update_target + ".py", + content = [ + "from os import environ", + "from pathlib import Path", + "from sys import stderr", + "", + 'src = Path(environ["REQUIREMENTS_FILE"])', + 'assert src.exists(), f"the {src} file does not exist"', + 'dst = Path(environ["BUILD_WORKSPACE_DIRECTORY"]) / "{}" / "{}"'.format(pkg, out), + 'print(f"Writing requirements contents\\n from {src.absolute()}\\n to {dst.absolute()}", file=stderr)', + "dst.write_text(src.read_text())", + 'print("Success!", file=stderr)', + ], + ) + + py_binary_rule( + name = update_target, + srcs = [update_target + ".py"], + main = update_target + ".py", + data = [name], + env = { + "REQUIREMENTS_FILE": "$(rootpath {})".format(name), + }, + tags = ["manual"], + ) From b679a794c01c97a82deb2857c374474e32d4c263 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 22 Aug 2024 15:05:55 -0700 Subject: [PATCH 165/345] docs: turn a couple mentions of flags into cross references (#2146) I found turning these into clickable links made browsing the docs to understand behavior easier. * Also adds `{flag}` as a valid reference role. --- python/private/common/attributes.bzl | 6 +++--- python/private/common/py_executable.bzl | 4 ++-- sphinxdocs/docs/sphinx-bzl.md | 1 + sphinxdocs/src/sphinx_bzl/bzl.py | 1 + 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/python/private/common/attributes.bzl b/python/private/common/attributes.bzl index 503578b78c..1878284f3a 100644 --- a/python/private/common/attributes.bzl +++ b/python/private/common/attributes.bzl @@ -280,11 +280,11 @@ attribute. doc = """ Whether py source files should be precompiled. -See also: `--precompile` flag, which can override this attribute in some cases. +See also: {flag}`--precompile` flag, which can override this attribute in some cases. Values: -* `inherit`: Determine the value from the --precompile flag. +* `inherit`: Determine the value from the {flag}`--precompile` flag. * `enabled`: Compile Python source files at build time. Note that --precompile_add_to_runfiles affects how the compiled files are included into a downstream binary. @@ -333,7 +333,7 @@ runtime when the code actually runs. Determines, when a source file is compiled, if the source file is kept in the resulting output or not. Valid values are: -* `inherit`: Inherit the value from the `--precompile_source_retention` flag. +* `inherit`: Inherit the value from the {flag}`--precompile_source_retention` flag. * `keep_source`: Include the original Python source. * `omit_source`: Don't include the original py source. * `omit_if_generated_source`: Keep the original source if it's a regular source diff --git a/python/private/common/py_executable.bzl b/python/private/common/py_executable.bzl index 2b4a9397c8..d1cbea978c 100644 --- a/python/private/common/py_executable.bzl +++ b/python/private/common/py_executable.bzl @@ -96,14 +96,14 @@ filename in `srcs`, `main` must be specified. doc = """ Determines whether pyc files from dependencies should be manually included. -NOTE: This setting is only useful with `--precompile_add_to_runfiles=decided_elsewhere`. +NOTE: This setting is only useful with {flag}`--precompile_add_to_runfiles=decided_elsewhere`. Valid values are: * `include_pyc`: Add pyc files from dependencies in the binary (from `PyInfo.transitive_pyc_files`. * `disabled`: Don't explicitly add pyc files from dependencies. Note that pyc files may still come from dependencies if a target includes them as - part of their runfiles (such as when `--precompile_add_to_runfiles=always` + part of their runfiles (such as when {obj}`--precompile_add_to_runfiles=always` is used). """, ), diff --git a/sphinxdocs/docs/sphinx-bzl.md b/sphinxdocs/docs/sphinx-bzl.md index c6dc430dd6..331e04acd4 100644 --- a/sphinxdocs/docs/sphinx-bzl.md +++ b/sphinxdocs/docs/sphinx-bzl.md @@ -106,6 +106,7 @@ searched and matched. Supported cross reference roles are: * `{bzl:arg}`: Refer to a function argument. * `{bzl:attr}`: Refer to a rule attribute. +* `{bzl:flag}`: Refer to a flag. * `{bzl:obj}`: Refer to any type of Bazel object * `{bzl:rule}`: Refer to a rule. * `{bzl:target}`: Refer to a target. diff --git a/sphinxdocs/src/sphinx_bzl/bzl.py b/sphinxdocs/src/sphinx_bzl/bzl.py index d09914b318..ad2fd289db 100644 --- a/sphinxdocs/src/sphinx_bzl/bzl.py +++ b/sphinxdocs/src/sphinx_bzl/bzl.py @@ -1410,6 +1410,7 @@ class _BzlDomain(domains.Domain): "arg": roles.XRefRole(), "attr": roles.XRefRole(), "default-value": _DefaultValueRole(), + "flag": roles.XRefRole(), "obj": roles.XRefRole(), "required-providers": _RequiredProvidersRole(), "return-type": _ReturnTypeRole(), From b99bb612bbffe2259b6ecd2d41995df7a6f78fde Mon Sep 17 00:00:00 2001 From: "Elvis M. Wianda" <7077790+ewianda@users.noreply.github.com> Date: Sat, 24 Aug 2024 05:07:36 -0400 Subject: [PATCH 166/345] fix(whl_library): remove `--no-index` and add `--no-build-isolation` when build sdist (#2126) Building sdist results in `Could not find a version that satisfies the requirement setuptool` this regressed when a fix in parameter handling got introduced in #2091. Before this change the building from sdist when using `experimental_index_url` would break because `--no-index` is passed to `pip`. This means that `pip` would fail to locate build time dependencies needed for the packages and would just not work. In `whl_library` we setup `PYTHONPATH` to have some build dependencies available (like `setuptools`) and we could use them during building from `sdist` and to do so we need to add `--no-build-isolation` flag. However, for some cases we need to also add other build-time dependencies (e.g. `flit_core`) so that the building of the wheel in the `repository_rule` context is successfuly. Removing `--no-index` allows `pip` to silently fetch the needed build dependencies from PyPI if they are missing and continue with the build. This is not a perfect solution, but it does unblock users to use the `sdist` distributions with the experimental feature enabled by using `experimental_index_url` (see #260 for tracking of the completion). Fixes #2118 Fixes #2152 --------- Co-authored-by: aignas <240938+aignas@users.noreply.github.com> --- CHANGELOG.md | 3 +++ examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/whl_library.bzl | 6 ++++-- tests/pypi/evaluate_markers/BUILD.bazel | 7 ------- tests/pypi/integration/BUILD.bazel | 20 ++++++++++++++++++++ tests/pypi/integration/transitions.bzl | 24 ++++++++++++++++++++++++ 6 files changed, 53 insertions(+), 11 deletions(-) delete mode 100644 tests/pypi/evaluate_markers/BUILD.bazel create mode 100644 tests/pypi/integration/BUILD.bazel create mode 100644 tests/pypi/integration/transitions.bzl diff --git a/CHANGELOG.md b/CHANGELOG.md index 029de8ae11..9e59564b94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,9 @@ A brief description of the categories of changes: * (gazelle): Update error messages when unable to resolve a dependency to be more human-friendly. ### Fixed +* (whl_library): Remove `--no-index` and add `--no-build-isolation` to the + `pip install` command when installing a wheel from a local file, which happens + when `experimental_index_url` flag is used. * (bzlmod) get the path to the host python interpreter in a way that results in platform non-dependent hashes in the lock file when the requirement markers need to be evaluated. diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index e542f43b0a..4deef01be4 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1231,7 +1231,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "iJtgc0fsxL6yWzjazyklge5csIWtbgQ8+wgW8P4jfL0=", + "bzlTransitiveDigest": "eWzi4IV0AzQ+cpVkMkdU/wOc7BUQdo0hAAQcCh8C4uU=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6140,7 +6140,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "vTGpUAA3aBLYLx1iJ020kpJsuvO9GLbl11swsDXNKRI=", + "bzlTransitiveDigest": "RyEJxfGmNQVzqInjjGrR29yqfFPKe9DKgODI1mxd8wA=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/python/private/pypi/whl_library.bzl b/python/private/pypi/whl_library.bzl index 2300eb3598..5b14151be6 100644 --- a/python/private/pypi/whl_library.bzl +++ b/python/private/pypi/whl_library.bzl @@ -227,8 +227,10 @@ def _whl_library_impl(rctx): whl_path = rctx.path(rctx.attr.filename) else: # It is an sdist and we need to tell PyPI to use a file in this directory - # and not use any indexes. - extra_pip_args.extend(["--no-index", "--find-links", "."]) + # 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", "."]) args = _parse_optional_attrs(rctx, args, extra_pip_args) diff --git a/tests/pypi/evaluate_markers/BUILD.bazel b/tests/pypi/evaluate_markers/BUILD.bazel deleted file mode 100644 index aba9264953..0000000000 --- a/tests/pypi/evaluate_markers/BUILD.bazel +++ /dev/null @@ -1,7 +0,0 @@ -load("@bazel_skylib//rules:build_test.bzl", "build_test") -load("@dev_pip//:requirements.bzl", "all_whl_requirements") - -build_test( - name = "all_dev_wheels", - targets = all_whl_requirements, -) diff --git a/tests/pypi/integration/BUILD.bazel b/tests/pypi/integration/BUILD.bazel new file mode 100644 index 0000000000..f846bfb124 --- /dev/null +++ b/tests/pypi/integration/BUILD.bazel @@ -0,0 +1,20 @@ +load("@bazel_skylib//rules:build_test.bzl", "build_test") +load("@dev_pip//:requirements.bzl", "all_requirements") +load(":transitions.bzl", "transition_rule") + +build_test( + name = "all_requirements_build_test", + targets = all_requirements, +) + +# Rule that transitions dependencies to be built from sdist +transition_rule( + name = "all_requirements_from_sdist", + testonly = True, + deps = all_requirements, +) + +build_test( + name = "all_requirements_from_sdist_build_test", + targets = ["all_requirements_from_sdist"], +) diff --git a/tests/pypi/integration/transitions.bzl b/tests/pypi/integration/transitions.bzl new file mode 100644 index 0000000000..b121446bb0 --- /dev/null +++ b/tests/pypi/integration/transitions.bzl @@ -0,0 +1,24 @@ +""" Define a custom transition that sets the pip_whl flag to no """ + +def _flag_transition_impl(_settings, _ctx): + return {"//python/config_settings:pip_whl": "no"} + +flag_transition = transition( + implementation = _flag_transition_impl, + inputs = [], + outputs = ["//python/config_settings:pip_whl"], +) + +# Define a rule that applies the transition to dependencies +def _transition_rule_impl(_ctx): + return [DefaultInfo()] + +transition_rule = rule( + implementation = _transition_rule_impl, + attrs = { + "deps": attr.label_list(cfg = flag_transition), + "_allowlist_function_transition": attr.label( + default = "@bazel_tools//tools/allowlists/function_transition_allowlist", + ), + }, +) From e331afe70524e8ad46d9da6097db1f9c0bfc95c1 Mon Sep 17 00:00:00 2001 From: Will Morrison Date: Sat, 24 Aug 2024 22:51:51 +0200 Subject: [PATCH 167/345] fix: Handle relative paths properly in _absolute_url (#2153) This updates the simpleapi parser to handle indexes where wheel and sdist may be an index_url relative path. It also organises the conditionals with fewer negations so they're easier to read Fixes: #2150 --- CHANGELOG.md | 1 + examples/bzlmod/MODULE.bazel.lock | 4 +-- python/private/pypi/parse_simpleapi_html.bzl | 33 +++++++++++++----- .../parse_simpleapi_html_tests.bzl | 34 +++++++++++++++++++ 4 files changed, 61 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e59564b94..59dfbe481b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ A brief description of the categories of changes: * (gazelle): Fix incorrect use of `t.Fatal`/`t.Fatalf` in tests. * (toolchain) Omit third-party python packages from coverage reports from stage2 bootstrap template. +* (bzlmod) Properly handle relative path URLs in parse_simpleapi_html.bzl ### Added * Nothing yet diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 4deef01be4..8d02256e95 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1231,7 +1231,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "eWzi4IV0AzQ+cpVkMkdU/wOc7BUQdo0hAAQcCh8C4uU=", + "bzlTransitiveDigest": "9hiLCuWaaaU7Q+l2ONVr1A0NcG1JfSihv1UYeA1SpNY=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6140,7 +6140,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "RyEJxfGmNQVzqInjjGrR29yqfFPKe9DKgODI1mxd8wA=", + "bzlTransitiveDigest": "VoK/T0JkBdcomCHnDIYkX+stkywdxrh1MVM16e8D4sE=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/python/private/pypi/parse_simpleapi_html.bzl b/python/private/pypi/parse_simpleapi_html.bzl index 81ee385f86..b4e7dd8330 100644 --- a/python/private/pypi/parse_simpleapi_html.bzl +++ b/python/private/pypi/parse_simpleapi_html.bzl @@ -78,7 +78,7 @@ def parse_simpleapi_html(*, url, content): url = _absolute_url(url, dist_url), sha256 = sha256, metadata_sha256 = metadata_sha256, - metadata_url = _absolute_url(url, metadata_url), + metadata_url = _absolute_url(url, metadata_url) if metadata_url else "", yanked = yanked, ) else: @@ -109,18 +109,33 @@ def _get_root_directory(url): return "{}://{}".format(scheme, host) +def _is_downloadable(url): + """Checks if the URL would be accepted by the Bazel downloader. + + This is based on Bazel's HttpUtils::isUrlSupportedByDownloader + """ + return url.startswith("http://") or url.startswith("https://") or url.startswith("file://") + def _absolute_url(index_url, candidate): + if candidate == "": + return candidate + + if _is_downloadable(candidate): + return candidate + if candidate.startswith("/"): - # absolute url + # absolute path root_directory = _get_root_directory(index_url) return "{}{}".format(root_directory, candidate) - if not candidate.startswith(".."): - return candidate + if candidate.startswith(".."): + # relative path with up references + candidate_parts = candidate.split("..") + last = candidate_parts[-1] + for _ in range(len(candidate_parts) - 1): + index_url, _, _ = index_url.rstrip("/").rpartition("/") - candidate_parts = candidate.split("..") - last = candidate_parts[-1] - for _ in range(len(candidate_parts) - 1): - index_url, _, _ = index_url.rstrip("/").rpartition("/") + return "{}/{}".format(index_url, last.strip("/")) - return "{}/{}".format(index_url, last.strip("/")) + # relative path without up-references + return "{}/{}".format(index_url, candidate) diff --git a/tests/pypi/parse_simpleapi_html/parse_simpleapi_html_tests.bzl b/tests/pypi/parse_simpleapi_html/parse_simpleapi_html_tests.bzl index aa735b83d8..d3c42a8864 100644 --- a/tests/pypi/parse_simpleapi_html/parse_simpleapi_html_tests.bzl +++ b/tests/pypi/parse_simpleapi_html/parse_simpleapi_html_tests.bzl @@ -255,6 +255,40 @@ def _test_whls(env): yanked = False, ), ), + ( + struct( + attrs = [ + 'href="1.0.0/mypy_extensions-1.0.0-py3-none-any.whl#sha256=deadbeef"', + ], + filename = "mypy_extensions-1.0.0-py3-none-any.whl", + url = "https://example.org/simple/mypy_extensions", + ), + struct( + filename = "mypy_extensions-1.0.0-py3-none-any.whl", + metadata_sha256 = "", + metadata_url = "", + sha256 = "deadbeef", + url = "https://example.org/simple/mypy_extensions/1.0.0/mypy_extensions-1.0.0-py3-none-any.whl", + yanked = False, + ), + ), + ( + struct( + attrs = [ + 'href="unknown://example.com/mypy_extensions-1.0.0-py3-none-any.whl#sha256=deadbeef"', + ], + filename = "mypy_extensions-1.0.0-py3-none-any.whl", + url = "https://example.org/simple/mypy_extensions", + ), + struct( + filename = "mypy_extensions-1.0.0-py3-none-any.whl", + metadata_sha256 = "", + metadata_url = "", + sha256 = "deadbeef", + url = "https://example.org/simple/mypy_extensions/unknown://example.com/mypy_extensions-1.0.0-py3-none-any.whl", + yanked = False, + ), + ), ] for (input, want) in tests: From 2f4687347f601cd3be2d4bacd63d2e261ebb29cd Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 25 Aug 2024 19:10:30 -0700 Subject: [PATCH 168/345] docs: docgen python apis (#2149) Uses autodoc2 to generate Python documentation for runfiles and sphinx_bzl. This provides some basic API doc for our Python code. They don't look particularly great, yet, but we can work on how they look in another PR. Also: * Fixes position of license rule and extra space in license text * Forces sphinx_rtd_theme >= 2.0. uv kept trying to downgrade it for some reason. * Use directives markup to document the sphinx_bzl directives * Add `sphinx_run` rule to make it easier to run Sphinx interactively for debugging --- docs/BUILD.bazel | 21 +- docs/api/index.md | 3 +- docs/api/rules_python/index.md | 8 + .../api/{ => rules_python}/python/cc/index.md | 0 .../python/config_settings/index.md | 0 docs/api/{ => rules_python}/python/index.md | 0 .../python/runtime_env_toolchains/index.md | 0 .../tools/precompiler/index.md | 0 docs/conf.py | 67 ++++++- docs/pyproject.toml | 6 +- docs/requirements.txt | 135 +++++++------ sphinxdocs/docs/BUILD.bazel | 15 +- sphinxdocs/docs/api/index.md | 8 + sphinxdocs/docs/sphinx-bzl.md | 88 ++++++-- sphinxdocs/private/BUILD.bazel | 1 + sphinxdocs/private/sphinx.bzl | 189 ++++++++++++++++-- sphinxdocs/private/sphinx_run_template.sh | 36 ++++ sphinxdocs/sphinx.bzl | 2 + 18 files changed, 468 insertions(+), 111 deletions(-) create mode 100644 docs/api/rules_python/index.md rename docs/api/{ => rules_python}/python/cc/index.md (100%) rename docs/api/{ => rules_python}/python/config_settings/index.md (100%) rename docs/api/{ => rules_python}/python/index.md (100%) rename docs/api/{ => rules_python}/python/runtime_env_toolchains/index.md (100%) rename docs/api/{ => rules_python}/tools/precompiler/index.md (100%) create mode 100644 sphinxdocs/docs/api/index.md create mode 100644 sphinxdocs/private/sphinx_run_template.sh diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index 0c815940ba..aa1345aa08 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -19,10 +19,13 @@ load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable load("//python/uv/private:lock.bzl", "lock") # buildifier: disable=bzl-visibility load("//sphinxdocs:readthedocs.bzl", "readthedocs_install") load("//sphinxdocs:sphinx.bzl", "sphinx_build_binary", "sphinx_docs") +load("//sphinxdocs:sphinx_docs_library.bzl", "sphinx_docs_library") load("//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardoc", "sphinx_stardocs") package(default_visibility = ["//:__subpackages__"]) +licenses(["notice"]) # Apache 2.0 + # 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 @@ -68,6 +71,7 @@ sphinx_docs( target_compatible_with = _TARGET_COMPATIBLE_WITH, deps = [ ":bzl_api_docs", + ":py_api_srcs", "//sphinxdocs/docs:docs_lib", ], ) @@ -97,7 +101,7 @@ sphinx_stardocs( # This depends on @pythons_hub, which is only created under bzlmod, "//python/extensions:pip_bzl", ] if IS_BAZEL_7_OR_HIGHER and BZLMOD_ENABLED else []), - prefix = "api/", + prefix = "api/rules_python/", tags = ["docs"], target_compatible_with = _TARGET_COMPATIBLE_WITH, ) @@ -105,7 +109,7 @@ sphinx_stardocs( sphinx_stardoc( name = "py_cc_toolchain", src = "//python/private:py_cc_toolchain_rule.bzl", - prefix = "api/", + prefix = "api/rules_python/", public_load_path = "//python/cc:py_cc_toolchain.bzl", tags = ["docs"], target_compatible_with = _TARGET_COMPATIBLE_WITH, @@ -115,11 +119,20 @@ sphinx_stardoc( sphinx_stardoc( name = "py_runtime_pair", src = "//python/private:py_runtime_pair_rule_bzl", + prefix = "api/rules_python", public_load_path = "//python:py_runtime_pair.bzl", tags = ["docs"], target_compatible_with = _TARGET_COMPATIBLE_WITH, ) +sphinx_docs_library( + name = "py_api_srcs", + srcs = [ + "//python/runfiles", + ], + strip_prefix = "python/", +) + readthedocs_install( name = "readthedocs_install", docs = [":docs"], @@ -135,6 +148,8 @@ sphinx_build_binary( requirement("myst_parser"), requirement("readthedocs_sphinx_ext"), requirement("typing_extensions"), + requirement("sphinx_autodoc2"), + requirement("sphinx_reredirects"), "//sphinxdocs/src/sphinx_bzl", ], ) @@ -147,8 +162,6 @@ lock( upgrade = True, ) -licenses(["notice"]) # Apache 2.0 - # Temporary compatibility aliases for some other projects depending on the old # bzl_library targets. alias( diff --git a/docs/api/index.md b/docs/api/index.md index 028fab7f84..87e17e1a8f 100644 --- a/docs/api/index.md +++ b/docs/api/index.md @@ -2,5 +2,6 @@ ```{toctree} :glob: -** +* +*/index ``` diff --git a/docs/api/rules_python/index.md b/docs/api/rules_python/index.md new file mode 100644 index 0000000000..7e4d1ff336 --- /dev/null +++ b/docs/api/rules_python/index.md @@ -0,0 +1,8 @@ +# rules_python Bazel APIs + +API documentation for rules_python Bazel objects. + +```{toctree} +:glob: +** +``` diff --git a/docs/api/python/cc/index.md b/docs/api/rules_python/python/cc/index.md similarity index 100% rename from docs/api/python/cc/index.md rename to docs/api/rules_python/python/cc/index.md diff --git a/docs/api/python/config_settings/index.md b/docs/api/rules_python/python/config_settings/index.md similarity index 100% rename from docs/api/python/config_settings/index.md rename to docs/api/rules_python/python/config_settings/index.md diff --git a/docs/api/python/index.md b/docs/api/rules_python/python/index.md similarity index 100% rename from docs/api/python/index.md rename to docs/api/rules_python/python/index.md diff --git a/docs/api/python/runtime_env_toolchains/index.md b/docs/api/rules_python/python/runtime_env_toolchains/index.md similarity index 100% rename from docs/api/python/runtime_env_toolchains/index.md rename to docs/api/rules_python/python/runtime_env_toolchains/index.md diff --git a/docs/api/tools/precompiler/index.md b/docs/api/rules_python/tools/precompiler/index.md similarity index 100% rename from docs/api/tools/precompiler/index.md rename to docs/api/rules_python/tools/precompiler/index.md diff --git a/docs/conf.py b/docs/conf.py index be428a6eb8..ba628b6fc1 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,9 +18,8 @@ # Any extensions here not built into Sphinx must also be added to # the dependencies of //docs:sphinx-builder extensions = [ - "sphinx.ext.autodoc", + "autodoc2", "sphinx.ext.autosectionlabel", - "sphinx.ext.autosummary", "sphinx.ext.doctest", "sphinx.ext.duration", "sphinx.ext.extlinks", @@ -28,8 +27,72 @@ "myst_parser", "sphinx_rtd_theme", # Necessary to get jquery to make flyout work "sphinx_bzl.bzl", + "sphinx_reredirects", ] +autodoc2_packages = [ + "sphinx_bzl", + "runfiles", +] + +autodoc2_output_dir = "api/py" +autodoc2_sort_names = True +autodoc2_class_docstring = "both" +autodoc2_index_template = """ +Python APIs +==================== + +This page contains auto-generated API reference documentation [#f1]_. + +.. toctree:: + :titlesonly: + +{% for package in top_level %} + {{ package }} +{%- endfor %} + +.. [#f1] Created with `sphinx-autodoc2 `_ + +""" + + +autodoc2_docstring_parser_regexes = [ + (".*", "myst"), +] + +# NOTE: The redirects generation will clobber existing files. +redirects = { + "api/tools/precompiler/index": "/api/rules_python/tools/precompiler/index.html", + "api/python/py_library": "/api/rules_python/python/py_library.html", + "api/python/py_binary": "/api/rules_python/python/py_binary.html", + "api/python/py_test": "/api/rules_python/python/py_test.html", + "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/common/py_library_rule_bazel.html", + "api/python/private/common/py_test_rule_bazel": "/api/rules_python/python/private/common/py_test_rule_bazel.html", + "api/python/private/common/py_binary_rule_bazel": "/api/rules_python/python/private/common/py_binary_rule_bazel.html", + "api/python/private/common/py_runtime_rule": "/api/rules_python/python/private/common/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", + "api/python/entry_points/py_console_script_binary": "/api/rules_python/python/entry_points/py_console_script_binary.html", + "api/python/cc/py_cc_toolchain_info": "/api/rules_python/python/cc/py_cc_toolchain_info.html", + "api/python/cc/index": "/api/rules_python/python/cc/index.html", + "api/python/py_cc_link_params_info": "/api/rules_python/python/py_cc_link_params_info.html", + "api/python/runtime_env_toolchains/index": "/api/rules_python/python/runtime_env_toolchains/index.html", + "api/python/pip": "/api/rules_python/python/pip.html", + "api/python/config_settings/index": "/api/rules_python/python/config_settings/index.html", + "api/python/packaging": "/api/rules_python/python/packaging.html", + "api/python/py_runtime": "/api/rules_python/python/py_runtime.html", + "api/sphinxdocs/sphinx": "/api/sphinxdocs/sphinxdocs/sphinx.html", + "api/sphinxdocs/sphinx_stardoc": "/api/sphinxdocs/sphinxdocs/sphinx_stardoc.html", + "api/sphinxdocs/readthedocs": "/api/sphinxdocs/sphinxdocs/readthedocs.html", + "api/sphinxdocs/index": "/api/sphinxdocs/sphinxdocs/index.html", + "api/sphinxdocs/private/sphinx_docs_library": "/api/sphinxdocs/sphinxdocs/private/sphinx_docs_library.html", + "api/sphinxdocs/sphinx_docs_library": "/api/sphinxdocs/sphinxdocs/sphinx_docs_library.html", + "api/sphinxdocs/inventories/index": "/api/sphinxdocs/sphinxdocs/inventories/index.html", +} + # 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": diff --git a/docs/pyproject.toml b/docs/pyproject.toml index 03279c56e3..2bcb31bfc2 100644 --- a/docs/pyproject.toml +++ b/docs/pyproject.toml @@ -5,10 +5,12 @@ version = "0.0.0" dependencies = [ # NOTE: This is only used as input to create the resolved requirements.txt # file, which is what builds, both Bazel and Readthedocs, both use. + "sphinx-autodoc2", "sphinx", "myst-parser", - "sphinx_rtd_theme", + "sphinx_rtd_theme >=2.0", # uv insists on downgrading for some reason "readthedocs-sphinx-ext", "absl-py", - "typing-extensions" + "typing-extensions", + "sphinx-reredirects" ] diff --git a/docs/requirements.txt b/docs/requirements.txt index 7cd03296fe..19affcb02a 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -10,9 +10,13 @@ alabaster==0.7.16 \ --hash=sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65 \ --hash=sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92 # via sphinx -babel==2.15.0 \ - --hash=sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb \ - --hash=sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413 +astroid==3.3.2 \ + --hash=sha256:99e9b5b602cbb005434084309213d6af32bf7a9b743c836749168b8e2b330cbd \ + --hash=sha256:9f8136ce9770e0f912401b25a0f15d5c2ec20b50e99b1b413ac0778fe53ff6f1 + # via sphinx-autodoc2 +babel==2.16.0 \ + --hash=sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b \ + --hash=sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316 # via sphinx certifi==2024.7.4 \ --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ @@ -121,9 +125,9 @@ docutils==0.20.1 \ # myst-parser # sphinx # sphinx-rtd-theme -idna==3.7 \ - --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ - --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 +idna==3.8 \ + --hash=sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac \ + --hash=sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603 # via requests imagesize==1.4.1 \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ @@ -226,58 +230,60 @@ pygments==2.18.0 \ --hash=sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199 \ --hash=sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a # via sphinx -pyyaml==6.0.1 \ - --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ - --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ - --hash=sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df \ - --hash=sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741 \ - --hash=sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206 \ - --hash=sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27 \ - --hash=sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595 \ - --hash=sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62 \ - --hash=sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98 \ - --hash=sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696 \ - --hash=sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290 \ - --hash=sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9 \ - --hash=sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d \ - --hash=sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6 \ - --hash=sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867 \ - --hash=sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47 \ - --hash=sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486 \ - --hash=sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6 \ - --hash=sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3 \ - --hash=sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007 \ - --hash=sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938 \ - --hash=sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0 \ - --hash=sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c \ - --hash=sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735 \ - --hash=sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d \ - --hash=sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28 \ - --hash=sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4 \ - --hash=sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba \ - --hash=sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8 \ - --hash=sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef \ - --hash=sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5 \ - --hash=sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd \ - --hash=sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3 \ - --hash=sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0 \ - --hash=sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515 \ - --hash=sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c \ - --hash=sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c \ - --hash=sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924 \ - --hash=sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34 \ - --hash=sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43 \ - --hash=sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859 \ - --hash=sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673 \ - --hash=sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54 \ - --hash=sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a \ - --hash=sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b \ - --hash=sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab \ - --hash=sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa \ - --hash=sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c \ - --hash=sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585 \ - --hash=sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d \ - --hash=sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f +pyyaml==6.0.2 \ + --hash=sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff \ + --hash=sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48 \ + --hash=sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086 \ + --hash=sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e \ + --hash=sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133 \ + --hash=sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5 \ + --hash=sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484 \ + --hash=sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee \ + --hash=sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5 \ + --hash=sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68 \ + --hash=sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a \ + --hash=sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf \ + --hash=sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99 \ + --hash=sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8 \ + --hash=sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85 \ + --hash=sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19 \ + --hash=sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc \ + --hash=sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a \ + --hash=sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1 \ + --hash=sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317 \ + --hash=sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c \ + --hash=sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631 \ + --hash=sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d \ + --hash=sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652 \ + --hash=sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5 \ + --hash=sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e \ + --hash=sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b \ + --hash=sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8 \ + --hash=sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476 \ + --hash=sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706 \ + --hash=sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563 \ + --hash=sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237 \ + --hash=sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b \ + --hash=sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083 \ + --hash=sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180 \ + --hash=sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425 \ + --hash=sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e \ + --hash=sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f \ + --hash=sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725 \ + --hash=sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183 \ + --hash=sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab \ + --hash=sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774 \ + --hash=sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725 \ + --hash=sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e \ + --hash=sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5 \ + --hash=sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d \ + --hash=sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290 \ + --hash=sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44 \ + --hash=sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed \ + --hash=sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4 \ + --hash=sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba \ + --hash=sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12 \ + --hash=sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4 # via myst-parser readthedocs-sphinx-ext==2.2.5 \ --hash=sha256:ee5fd5b99db9f0c180b2396cbce528aa36671951b9526bb0272dbfce5517bd27 \ @@ -299,8 +305,17 @@ sphinx==7.4.7 \ # via # rules-python-docs (docs/pyproject.toml) # myst-parser + # sphinx-reredirects # sphinx-rtd-theme # sphinxcontrib-jquery +sphinx-autodoc2==0.5.0 \ + --hash=sha256:7d76044aa81d6af74447080182b6868c7eb066874edc835e8ddf810735b6565a \ + --hash=sha256:e867013b1512f9d6d7e6f6799f8b537d6884462acd118ef361f3f619a60b5c9e + # via rules-python-docs (docs/pyproject.toml) +sphinx-reredirects==0.1.5 \ + --hash=sha256:444ae1438fba4418242ca76d6a6de3eaee82aaf0d8f2b0cac71a15d32ce6eba2 \ + --hash=sha256:cfa753b441020a22708ce8eb17d4fd553a28fc87a609330092917ada2a6da0d8 + # via rules-python-docs (docs/pyproject.toml) sphinx-rtd-theme==2.0.0 \ --hash=sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b \ --hash=sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586 @@ -336,7 +351,9 @@ sphinxcontrib-serializinghtml==2.0.0 \ typing-extensions==4.12.2 \ --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 - # via rules-python-docs (docs/pyproject.toml) + # via + # rules-python-docs (docs/pyproject.toml) + # sphinx-autodoc2 urllib3==2.2.2 \ --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 diff --git a/sphinxdocs/docs/BUILD.bazel b/sphinxdocs/docs/BUILD.bazel index a85155b0ef..6af908dc4c 100644 --- a/sphinxdocs/docs/BUILD.bazel +++ b/sphinxdocs/docs/BUILD.bazel @@ -20,13 +20,14 @@ sphinx_docs_library( name = "docs_lib", deps = [ ":artisian_api_docs", - ":artisian_docs", ":bzl_docs", + ":py_api_srcs", + ":regular_docs", ], ) sphinx_docs_library( - name = "artisian_docs", + name = "regular_docs", srcs = glob( ["**/*.md"], exclude = ["api/**"], @@ -39,6 +40,8 @@ sphinx_docs_library( srcs = glob( ["api/**/*.md"], ), + prefix = "api/sphinxdocs/", + strip_prefix = "sphinxdocs/docs/api/", ) sphinx_stardocs( @@ -50,6 +53,12 @@ sphinx_stardocs( "//sphinxdocs:sphinx_stardoc_bzl", "//sphinxdocs/private:sphinx_docs_library_bzl", ], - prefix = "api/", + prefix = "api/sphinxdocs/", target_compatible_with = _TARGET_COMPATIBLE_WITH, ) + +sphinx_docs_library( + name = "py_api_srcs", + srcs = ["//sphinxdocs/src/sphinx_bzl"], + strip_prefix = "sphinxdocs/src/", +) diff --git a/sphinxdocs/docs/api/index.md b/sphinxdocs/docs/api/index.md new file mode 100644 index 0000000000..3420b9180d --- /dev/null +++ b/sphinxdocs/docs/api/index.md @@ -0,0 +1,8 @@ +# sphinxdocs Bazel APIs + +API documentation for sphinxdocs Bazel objects. + +```{toctree} +:glob: +** +``` diff --git a/sphinxdocs/docs/sphinx-bzl.md b/sphinxdocs/docs/sphinx-bzl.md index 331e04acd4..0edd3202b6 100644 --- a/sphinxdocs/docs/sphinx-bzl.md +++ b/sphinxdocs/docs/sphinx-bzl.md @@ -53,6 +53,11 @@ While MyST isn't required for the core `sphinx_bzl` plugin to work, this document uses MyST syntax because `sphinx_stardoc` bzl doc gen rule requires MyST. +The main difference in syntax is: +* MyST directives use `:::{name}` with closing `:::` instead of `.. name::` with + indented content. +* MyST roles use `{role:name}` instead of `:role:name:` + ## Type expressions Several roles or fields accept type expressions. Type expressions use @@ -78,7 +83,7 @@ will try to find something that matches. Additionally, in `.bzl` code, the {obj}`py_binary` ``` -The text that is displayed by be customized by putting the reference string in +The text that is displayed can be customized by putting the reference string in chevrons (`<>`): ``` @@ -102,23 +107,52 @@ syntaxes](https://myst-parser.readthedocs.io/en/latest/syntax/cross-referencing. ### Cross reference roles A cross reference role is the `obj` portion of `{bzl:obj}`. It affects what is -searched and matched. Supported cross reference roles are: +searched and matched. + +:::{note} +The documentation renders using RST notation (`:foo:role:`), not +MyST notation (`{foo:role}`. +::: + +:::{rst:role} bzl:arg +Refer to a function argument. +::: + +:::{rst:role} bzl:attr +Refer to a rule attribute. +::: + +:::{rst:role} bzl:flag +Refer to a flag. +::: + +:::{rst:role} bzl:obj +Refer to any type of Bazel object +::: + +:::{rst:role} bzl:rule +Refer to a rule. +::: + +:::{rst:role} bzl:target +Refer to a target. +::: -* `{bzl:arg}`: Refer to a function argument. -* `{bzl:attr}`: Refer to a rule attribute. -* `{bzl:flag}`: Refer to a flag. -* `{bzl:obj}`: Refer to any type of Bazel object -* `{bzl:rule}`: Refer to a rule. -* `{bzl:target}`: Refer to a target. -* `{bzl:type}`: Refer to a type or type expression; can also be used in argument - documentation. +:::{rst:role} bzl:type +Refer to a type or type expression; can also be used in argument documentation. +::: ## Special roles There are several special roles that can be used to annotate parts of objects, such as the type of arguments or their default values. -### Role bzl:default-value +:::{note} +The documentation renders using RST notation (`:foo:role:`), not +MyST notation (`{foo:role}`. +::: + +:::{rst:role} bzl:default-value Indicate the default value for a function argument or rule attribute. Use it in the Args doc of a function or the doc text of an attribute. @@ -135,8 +169,9 @@ my_rule = rule(attrs = { }) ``` +::: -### Role bzl:return-type +:::{rst:role} bzl:return-type Indicates the return type for a function. Use it in the Returns doc of a function. @@ -150,8 +185,9 @@ def func(): """ return 1 ``` +::: -### Role bzl:type +:::{rst:role} bzl:type Indicates the type of an argument for a function. Use it in the Args doc of a function. @@ -165,6 +201,7 @@ def func(arg): """ print(arg + 1) ``` +::: ## Directives @@ -182,15 +219,26 @@ Doc about target ::: ``` -### Directive bzl:currentfile +:::{note} +The documentation renders using RST notation (`.. directive::`), not +MyST notation. +::: + +:::{rst:directive} .. bzl:currentfile:: file This directive indicates the Bazel file that objects defined in the current documentation file are in. This is required for any page that defines Bazel -objects. +objects. The format of `file` is Bazel label syntax, e.g. `//foo:bar.bzl` for bzl +files, and `//foo:BUILD.bazel` for things in BUILD files. + +::: -### Directive bzl:target -Documents a target. It takes no directive options +:::{rst:directive} .. bzl:target:: target + +Documents a target. It takes no directive options. The format of `target` +can either be a fully qualified label (`//foo:bar`), or the base target name +relative to `{bzl:currentfile}`. ``` :::{bzl:target} //foo:target @@ -199,6 +247,8 @@ My docs ::: ``` -### Directive bzl:flag +:::{rst:directive} .. bzl:flag:: target + +Documents a flag. It has the same format as `{bzl:target}` +::: -Documents a flag. It has the same format as `bzl:target` diff --git a/sphinxdocs/private/BUILD.bazel b/sphinxdocs/private/BUILD.bazel index d91e048e8f..c4246ed0de 100644 --- a/sphinxdocs/private/BUILD.bazel +++ b/sphinxdocs/private/BUILD.bazel @@ -29,6 +29,7 @@ exports_files( "readthedocs_install.py", "sphinx_build.py", "sphinx_server.py", + "sphinx_run_template.sh", ], visibility = ["//visibility:public"], ) diff --git a/sphinxdocs/private/sphinx.bzl b/sphinxdocs/private/sphinx.bzl index a198291a88..5724be856d 100644 --- a/sphinxdocs/private/sphinx.bzl +++ b/sphinxdocs/private/sphinx.bzl @@ -4,7 +4,7 @@ # 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 +# 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, @@ -27,10 +27,43 @@ _SPHINX_SERVE_MAIN_SRC = Label("//sphinxdocs/private:sphinx_server.py") _SphinxSourceTreeInfo = provider( doc = "Information about source tree for Sphinx to build.", fields = { + "source_dir_runfiles_path": """ +:type: str + +Runfiles-root relative path of the root directory for the source files. +""", "source_root": """ :type: str -Path of the root directory for the source files (which are in DefaultInfo.files) +Exec-root relative path of the root directory for the source files (which are in DefaultInfo.files) +""", + }, +) + +_SphinxRunInfo = provider( + doc = "Information for running the underlying Sphinx command directly", + fields = { + "per_format_args": """ +:type: dict[str, struct] + +A dict keyed by output format name. The values are a struct with attributes: +* args: a `list[str]` of args to run this format's build +* env: a `dict[str, str]` of environment variables to set for this format's build +""", + "source_tree": """ +:type: Target + +Target with the source tree files +""", + "sphinx": """ +:type: Target + +The sphinx-build binary to run. +""", + "tools": """ +:type: list[Target] + +Additional tools Sphinx needs """, }, ) @@ -74,16 +107,15 @@ def sphinx_docs( **kwargs): """Generate docs using Sphinx. - This generates three public targets: + Generates targets: * ``: The output of this target is a directory for each format Sphinx creates. This target also has a separate output group for each format. e.g. `--output_group=html` will only build the "html" format files. - * `_define`: A multi-string flag to add additional `-D` - arguments to the Sphinx invocation. This is useful for overriding - the version information in the config file for builds. * `.serve`: A binary that locally serves the HTML output. This allows previewing docs during development. + * `.run`: A binary that directly runs the underlying Sphinx command + to build the docs. This is a debugging aid. Args: name: {type}`Name` name of the docs rule. @@ -116,8 +148,10 @@ def sphinx_docs( add_tag(kwargs, "@rules_python//sphinxdocs:sphinx_docs") common_kwargs = copy_propagating_kwargs(kwargs) + internal_name = "_{}".format(name.lstrip("_")) + _sphinx_source_tree( - name = name + "/_sources", + name = internal_name + "/_sources", srcs = srcs, deps = deps, renamed_srcs = renamed_srcs, @@ -129,13 +163,13 @@ def sphinx_docs( name = name, sphinx = sphinx, formats = formats, - source_tree = name + "/_sources", + source_tree = internal_name + "/_sources", extra_opts = extra_opts, tools = tools, **kwargs ) - html_name = "_{}_html".format(name.lstrip("_")) + html_name = internal_name + "_html" native.filegroup( name = html_name, srcs = [name], @@ -153,6 +187,10 @@ def sphinx_docs( ], **common_kwargs ) + sphinx_run( + name = name + ".run", + docs = name, + ) build_test( name = name + "_build_test", @@ -161,12 +199,14 @@ def sphinx_docs( ) def _sphinx_docs_impl(ctx): - source_dir_path = ctx.attr.source_tree[_SphinxSourceTreeInfo].source_root + source_tree_info = ctx.attr.source_tree[_SphinxSourceTreeInfo] + source_dir_path = source_tree_info.source_root inputs = ctx.attr.source_tree[DefaultInfo].files + per_format_args = {} outputs = {} for format in ctx.attr.formats: - output_dir = _run_sphinx( + output_dir, args_env = _run_sphinx( ctx = ctx, format = format, source_path = source_dir_path, @@ -174,12 +214,19 @@ def _sphinx_docs_impl(ctx): inputs = inputs, ) outputs[format] = output_dir + per_format_args[format] = args_env return [ DefaultInfo(files = depset(outputs.values())), OutputGroupInfo(**{ format: depset([output]) for format, output in outputs.items() }), + _SphinxRunInfo( + sphinx = ctx.attr.sphinx, + source_tree = ctx.attr.source_tree, + tools = ctx.attr.tools, + per_format_args = per_format_args, + ), ] _sphinx_docs = rule( @@ -213,18 +260,35 @@ _sphinx_docs = rule( def _run_sphinx(ctx, format, source_path, inputs, output_prefix): output_dir = ctx.actions.declare_directory(paths.join(output_prefix, format)) - args = ctx.actions.args() - args.add("-T") # Full tracebacks on error - args.add("-b", format) + run_args = [] # Copy of the args to forward along to debug runner + args = ctx.actions.args() # Args passed to the action + + args.add("--show-traceback") # Full tracebacks on error + run_args.append("--show-traceback") + args.add("--builder", format) + run_args.extend(("--builder", format)) if ctx.attr._quiet_flag[BuildSettingInfo].value: - args.add("-q") # Suppress stdout informational text - args.add("-j", "auto") # Build in parallel, if possible - args.add("-E") # Don't try to use cache files. Bazel can't make use of them. - args.add("-a") # Write all files; don't try to detect "changed" files + # Not added to run_args because run_args is for debugging + args.add("--quiet") # Suppress stdout informational text + + args.add("--jobs", "auto") # Build in parallel, if possible + run_args.extend(("--jobs", "auto")) + args.add("--fresh-env") # Don't try to use cache files. Bazel can't make use of them. + run_args.append("--fresh-env") + args.add("--write-all") # Write all files; don't try to detect "changed" files + run_args.append("--write-all") + for opt in ctx.attr.extra_opts: - args.add(ctx.expand_location(opt)) - args.add_all(ctx.attr._extra_defines_flag[_FlagInfo].value, before_each = "-D") + expanded = ctx.expand_location(opt) + args.add(expanded) + run_args.append(expanded) + + extra_defines = ctx.attr._extra_defines_flag[_FlagInfo].value + args.add_all(extra_defines, before_each = "--define") + for define in extra_defines: + run_args.extend(("--define", define)) + args.add(source_path) args.add(output_dir.path) @@ -247,7 +311,7 @@ def _run_sphinx(ctx, format, source_path, inputs, output_prefix): progress_message = "Sphinx building {} for %{{label}}".format(format), env = env, ) - return output_dir + return output_dir, struct(args = run_args, env = env) def _sphinx_source_tree_impl(ctx): # Sphinx only accepts a single directory to read its doc sources from. @@ -309,6 +373,7 @@ def _sphinx_source_tree_impl(ctx): ), _SphinxSourceTreeInfo( source_root = sphinx_source_dir_path, + source_dir_runfiles_path = paths.dirname(source_conf_file.short_path), ), ] @@ -414,3 +479,85 @@ _sphinx_inventory = rule( ), }, ) + +def _sphinx_run_impl(ctx): + run_info = ctx.attr.docs[_SphinxRunInfo] + + builder = ctx.attr.builder + + if builder not in run_info.per_format_args: + builder = run_info.per_format_args.keys()[0] + + args_info = run_info.per_format_args.get(builder) + if not args_info: + fail("Format {} not built by {}".format( + builder, + ctx.attr.docs.label, + )) + + args_str = [] + args_str.extend(args_info.args) + args_str = "\n".join(["args+=('{}')".format(value) for value in args_info.args]) + if not args_str: + args_str = "# empty custom args" + + env_str = "\n".join([ + "sphinx_env+=({}='{}')".format(*item) + for item in args_info.env.items() + ]) + if not env_str: + env_str = "# empty custom env" + + executable = ctx.actions.declare_file(ctx.label.name) + sphinx = run_info.sphinx + ctx.actions.expand_template( + template = ctx.file._template, + output = executable, + substitutions = { + "%SETUP_ARGS%": args_str, + "%SETUP_ENV%": env_str, + "%SOURCE_DIR_EXEC_PATH%": run_info.source_tree[_SphinxSourceTreeInfo].source_root, + "%SOURCE_DIR_RUNFILES_PATH%": run_info.source_tree[_SphinxSourceTreeInfo].source_dir_runfiles_path, + "%SPHINX_EXEC_PATH%": sphinx[DefaultInfo].files_to_run.executable.path, + "%SPHINX_RUNFILES_PATH%": sphinx[DefaultInfo].files_to_run.executable.short_path, + }, + is_executable = True, + ) + runfiles = ctx.runfiles( + transitive_files = run_info.source_tree[DefaultInfo].files, + ).merge(sphinx[DefaultInfo].default_runfiles).merge_all([ + tool[DefaultInfo].default_runfiles + for tool in run_info.tools + ]) + return [ + DefaultInfo( + executable = executable, + runfiles = runfiles, + ), + ] + +sphinx_run = rule( + implementation = _sphinx_run_impl, + doc = """ +Directly run the underlying Sphinx command `sphinx_docs` uses. + +This is primarily a debugging tool. It's useful for directly running the +Sphinx command so that debuggers can be attached or output more directly +inspected without Bazel interference. +""", + attrs = { + "builder": attr.string( + doc = "The output format to make runnable.", + default = "html", + ), + "docs": attr.label( + doc = "The {obj}`sphinx_docs` target to make directly runnable.", + providers = [_SphinxRunInfo], + ), + "_template": attr.label( + allow_single_file = True, + default = "//sphinxdocs/private:sphinx_run_template.sh", + ), + }, + executable = True, +) diff --git a/sphinxdocs/private/sphinx_run_template.sh b/sphinxdocs/private/sphinx_run_template.sh new file mode 100644 index 0000000000..4a1f1e4410 --- /dev/null +++ b/sphinxdocs/private/sphinx_run_template.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +declare -a args +%SETUP_ARGS% + +declare -a sphinx_env +%SETUP_ENV% + +for path in "%SOURCE_DIR_RUNFILES_PATH%" "%SOURCE_DIR_EXEC_PATH%"; do + if [[ -e $path ]]; then + source_dir=$path + break + fi +done + +if [[ -z "$source_dir" ]]; then + echo "Could not find source dir" + exit 1 +fi + +for path in "%SPHINX_RUNFILES_PATH%" "%SPHINX_EXEC_PATH%"; do + if [[ -e $path ]]; then + sphinx=$path + break + fi +done + +if [[ -z $sphinx ]]; then + echo "Could not find sphinx" + exit 1 +fi + +output_dir=${SPHINX_OUT:-/tmp/sphinx-out} + +set -x +exec env "${sphinx_env[@]}" -- "$sphinx" "${args[@]}" "$@" "$source_dir" "$output_dir" diff --git a/sphinxdocs/sphinx.bzl b/sphinxdocs/sphinx.bzl index 3c9dc6b515..6cae80ed5c 100644 --- a/sphinxdocs/sphinx.bzl +++ b/sphinxdocs/sphinx.bzl @@ -32,8 +32,10 @@ load( _sphinx_build_binary = "sphinx_build_binary", _sphinx_docs = "sphinx_docs", _sphinx_inventory = "sphinx_inventory", + _sphinx_run = "sphinx_run", ) sphinx_build_binary = _sphinx_build_binary sphinx_docs = _sphinx_docs sphinx_inventory = _sphinx_inventory +sphinx_run = _sphinx_run From 636105772e5264ed2564b627ff4d09b40532f3c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 18:49:46 -0700 Subject: [PATCH 169/345] build(deps): bump docutils from 0.20.1 to 0.21.2 in /docs (#2158) Bumps [docutils](https://docutils.sourceforge.io) from 0.20.1 to 0.21.2. [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=docutils&package-manager=pip&previous-version=0.20.1&new-version=0.21.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 19affcb02a..cedefa9474 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -118,9 +118,9 @@ colorama==0.4.6 ; sys_platform == 'win32' \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 # via sphinx -docutils==0.20.1 \ - --hash=sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 \ - --hash=sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b +docutils==0.21.2 \ + --hash=sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f \ + --hash=sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 # via # myst-parser # sphinx From 2a5ba18d60b25e10b99d0fa87b1da51f40d9f0d3 Mon Sep 17 00:00:00 2001 From: Alex Torok Date: Wed, 28 Aug 2024 04:12:49 -0400 Subject: [PATCH 170/345] fix(gazelle): Correctly resolve deps that have top-level module overlap with a gazelle_python.yaml dep module (#2160) In https://github.com/bazelbuild/rules_python/pull/2048, `FindThirdPartyDependency` was updated to walk up the module import path to try to find a match in gazelle_python.yaml. This is unnecessary, as the main resolve loop will accomplish the same task. Additionally, the change broke the ability to configure a more specific resolve override or resolve more specific indexed libraries. For a real-world example of where this is a problem, `pytype` has a `third_party` module at its top-level. In a repo that also has a `third_party` directory, we can no longer resolve our indexed libraries in `third_party`. When the resolve loop tried to resolve `third_party.foo.bar`, `FindThirdPartyDependency` will immediately match `third_party` and not give the resolve loop a chance to look in the rule index for `third_party.foo.bar`. The same issue appears for providing overrides that are more specific (see the updated testcase). This PR reverts the change to FindThirdPartyDependency and updates the testcases to ensure that we can still resolve specific indexed packages, explicit resolve overrides, and third party modules even when there is an overlap in the top-level module name. --- CHANGELOG.md | 1 + .../dependency_resolution_order/BUILD.in | 1 + .../dependency_resolution_order/BUILD.out | 4 +++ .../dependency_resolution_order/__init__.py | 8 ++++++ .../gazelle_python.yaml | 1 + .../third_party/BUILD.in | 0 .../third_party/BUILD.out | 7 ++++++ .../third_party/baz.py | 17 +++++++++++++ gazelle/pythonconfig/pythonconfig.go | 25 +++++++------------ 9 files changed, 48 insertions(+), 16 deletions(-) create mode 100644 gazelle/python/testdata/dependency_resolution_order/third_party/BUILD.in create mode 100644 gazelle/python/testdata/dependency_resolution_order/third_party/BUILD.out create mode 100644 gazelle/python/testdata/dependency_resolution_order/third_party/baz.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 59dfbe481b..387b55b0c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,7 @@ A brief description of the categories of changes: * (toolchain) Omit third-party python packages from coverage reports from stage2 bootstrap template. * (bzlmod) Properly handle relative path URLs in parse_simpleapi_html.bzl +* (gazelle) Correctly resolve deps that have top-level module overlap with a gazelle_python.yaml dep module ### Added * Nothing yet diff --git a/gazelle/python/testdata/dependency_resolution_order/BUILD.in b/gazelle/python/testdata/dependency_resolution_order/BUILD.in index 71a5c5adda..aaf45f4045 100644 --- a/gazelle/python/testdata/dependency_resolution_order/BUILD.in +++ b/gazelle/python/testdata/dependency_resolution_order/BUILD.in @@ -1 +1,2 @@ # gazelle:resolve py bar //somewhere/bar +# gazelle:resolve py third_party.foo //third_party/foo diff --git a/gazelle/python/testdata/dependency_resolution_order/BUILD.out b/gazelle/python/testdata/dependency_resolution_order/BUILD.out index eebe6c3524..58fd266999 100644 --- a/gazelle/python/testdata/dependency_resolution_order/BUILD.out +++ b/gazelle/python/testdata/dependency_resolution_order/BUILD.out @@ -1,6 +1,7 @@ load("@rules_python//python:defs.bzl", "py_library") # gazelle:resolve py bar //somewhere/bar +# gazelle:resolve py third_party.foo //third_party/foo py_library( name = "dependency_resolution_order", @@ -9,6 +10,9 @@ py_library( deps = [ "//baz", "//somewhere/bar", + "//third_party", + "//third_party/foo", + "@gazelle_python_test//other_pip_dep", "@gazelle_python_test//some_foo", ], ) diff --git a/gazelle/python/testdata/dependency_resolution_order/__init__.py b/gazelle/python/testdata/dependency_resolution_order/__init__.py index d9c6504deb..e2d0a8a979 100644 --- a/gazelle/python/testdata/dependency_resolution_order/__init__.py +++ b/gazelle/python/testdata/dependency_resolution_order/__init__.py @@ -18,6 +18,14 @@ import baz import foo +# Ensure that even though @gazelle_python_test//other_pip_dep provides "third_party", +# we can still override "third_party.foo.bar" +import third_party.foo.bar + +from third_party import baz + +import third_party + _ = sys _ = bar _ = baz diff --git a/gazelle/python/testdata/dependency_resolution_order/gazelle_python.yaml b/gazelle/python/testdata/dependency_resolution_order/gazelle_python.yaml index 8615181c91..e62ad33479 100644 --- a/gazelle/python/testdata/dependency_resolution_order/gazelle_python.yaml +++ b/gazelle/python/testdata/dependency_resolution_order/gazelle_python.yaml @@ -15,4 +15,5 @@ manifest: modules_mapping: foo: some_foo + third_party: other_pip_dep pip_deps_repository_name: gazelle_python_test diff --git a/gazelle/python/testdata/dependency_resolution_order/third_party/BUILD.in b/gazelle/python/testdata/dependency_resolution_order/third_party/BUILD.in new file mode 100644 index 0000000000..e69de29bb2 diff --git a/gazelle/python/testdata/dependency_resolution_order/third_party/BUILD.out b/gazelle/python/testdata/dependency_resolution_order/third_party/BUILD.out new file mode 100644 index 0000000000..2c130d7b0e --- /dev/null +++ b/gazelle/python/testdata/dependency_resolution_order/third_party/BUILD.out @@ -0,0 +1,7 @@ +load("@rules_python//python:defs.bzl", "py_library") + +py_library( + name = "third_party", + srcs = ["baz.py"], + visibility = ["//:__subpackages__"], +) diff --git a/gazelle/python/testdata/dependency_resolution_order/third_party/baz.py b/gazelle/python/testdata/dependency_resolution_order/third_party/baz.py new file mode 100644 index 0000000000..e01d49c118 --- /dev/null +++ b/gazelle/python/testdata/dependency_resolution_order/third_party/baz.py @@ -0,0 +1,17 @@ +# 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 + +_ = os diff --git a/gazelle/pythonconfig/pythonconfig.go b/gazelle/pythonconfig/pythonconfig.go index 166b575046..a24a90efeb 100644 --- a/gazelle/pythonconfig/pythonconfig.go +++ b/gazelle/pythonconfig/pythonconfig.go @@ -282,23 +282,16 @@ func (c *Config) FindThirdPartyDependency(modName string) (string, bool) { for currentCfg := c; currentCfg != nil; currentCfg = currentCfg.parent { if currentCfg.gazelleManifest != nil { gazelleManifest := currentCfg.gazelleManifest - for { - if distributionName, ok := gazelleManifest.ModulesMapping[modName]; ok { - var distributionRepositoryName string - if gazelleManifest.PipDepsRepositoryName != "" { - distributionRepositoryName = gazelleManifest.PipDepsRepositoryName - } else if gazelleManifest.PipRepository != nil { - distributionRepositoryName = gazelleManifest.PipRepository.Name - } - - lbl := currentCfg.FormatThirdPartyDependency(distributionRepositoryName, distributionName) - return lbl.String(), true + if distributionName, ok := gazelleManifest.ModulesMapping[modName]; ok { + var distributionRepositoryName string + if gazelleManifest.PipDepsRepositoryName != "" { + distributionRepositoryName = gazelleManifest.PipDepsRepositoryName + } else if gazelleManifest.PipRepository != nil { + distributionRepositoryName = gazelleManifest.PipRepository.Name } - i := strings.LastIndex(modName, ".") - if i == -1 { - break - } - modName = modName[:i] + + lbl := currentCfg.FormatThirdPartyDependency(distributionRepositoryName, distributionName) + return lbl.String(), true } } } From 4761c2581a02c7fc0ca4404b05198133ea73502e Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 29 Aug 2024 01:44:47 -0700 Subject: [PATCH 171/345] docs: document the exec tools toolchain pieces (#2163) This makes it easier to know how to manually define `py_exec_tools_toolchain()`. Also doc the `inherit` value for the `pyc_collection` attribute. --- docs/BUILD.bazel | 2 ++ docs/api/rules_python/python/config_settings/index.md | 2 +- python/private/BUILD.bazel | 7 +++++++ python/private/common/py_executable.bzl | 3 ++- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index aa1345aa08..4210876be3 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -90,6 +90,8 @@ sphinx_stardocs( "//python:py_test_bzl", "//python/cc:py_cc_toolchain_info_bzl", "//python/entry_points:py_console_script_binary_bzl", + "//python/private:py_exec_tools_info_bzl", + "//python/private:py_exec_tools_toolchain_bzl", "//python/private/common:py_binary_rule_bazel_bzl", "//python/private/common:py_library_rule_bazel_bzl", "//python/private/common:py_runtime_rule_bzl", diff --git a/docs/api/rules_python/python/config_settings/index.md b/docs/api/rules_python/python/config_settings/index.md index 50647abb8d..2a2b39c53a 100644 --- a/docs/api/rules_python/python/config_settings/index.md +++ b/docs/api/rules_python/python/config_settings/index.md @@ -30,7 +30,7 @@ Values: Determines if Python source files should be compiled at build time. :::{note} -The flag value is overridden by the target level `precompile` attribute, +The flag value is overridden by the target level {attr}`precompile` attribute, except for the case of `force_enabled` and `forced_disabled`. ::: diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 146e934654..488862ff7a 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -203,12 +203,19 @@ bzl_library( ], ) +bzl_library( + name = "py_exec_tools_info_bzl", + srcs = ["py_exec_tools_info.bzl"], +) + bzl_library( name = "py_exec_tools_toolchain_bzl", srcs = ["py_exec_tools_toolchain.bzl"], deps = [ + ":py_exec_tools_info_bzl", ":toolchain_types_bzl", "//python/private/common:providers_bzl", + "@bazel_skylib//lib:paths", "@bazel_skylib//rules:common_settings", ], ) diff --git a/python/private/common/py_executable.bzl b/python/private/common/py_executable.bzl index d1cbea978c..9b8c77cf00 100644 --- a/python/private/common/py_executable.bzl +++ b/python/private/common/py_executable.bzl @@ -99,8 +99,9 @@ Determines whether pyc files from dependencies should be manually included. NOTE: This setting is only useful with {flag}`--precompile_add_to_runfiles=decided_elsewhere`. Valid values are: +* `inherit`: Inherit the value from {flag}`--pyc_collection`. * `include_pyc`: Add pyc files from dependencies in the binary (from - `PyInfo.transitive_pyc_files`. + {obj}`PyInfo.transitive_pyc_files`. * `disabled`: Don't explicitly add pyc files from dependencies. Note that pyc files may still come from dependencies if a target includes them as part of their runfiles (such as when {obj}`--precompile_add_to_runfiles=always` From 31e4771c52c212111d99dfa806e33f25536b5067 Mon Sep 17 00:00:00 2001 From: Oleh Prypin Date: Thu, 29 Aug 2024 18:36:17 +0200 Subject: [PATCH 172/345] fix: correctly check the arg count in precompiler.py (#2165) This is supposed to check that all argument counts are equal, but due to an incorrect inversion of the conditional, it was checking that *any* pair of argument counts is equal --- tools/precompiler/precompiler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/precompiler/precompiler.py b/tools/precompiler/precompiler.py index d1b17132e7..ae7339abfe 100644 --- a/tools/precompiler/precompiler.py +++ b/tools/precompiler/precompiler.py @@ -48,7 +48,7 @@ def _compile(options: "argparse.Namespace") -> None: f"Unknown PycInvalidationMode: {options.invalidation_mode}" ) from e - if len(options.srcs) != len(options.src_names) != len(options.pycs): + if not (len(options.srcs) == len(options.src_names) == len(options.pycs)): raise AssertionError( "Mismatched number of --src, --src_name, and/or --pyc args" ) From e15fc162ec048ebf2bbd398d78235d05ca076eaf Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Fri, 30 Aug 2024 22:15:38 -0700 Subject: [PATCH 173/345] refactor: move bootstrap tests to their own directory (#2168) Move the bootstrap tests to their own directory. This is a bit for code cleanliness (it was a bit awkward having a bunch of non-analysis tests in the middle of the analysis tests), but also to make importing the base_tests directory into Google easier. --- tests/base_rules/BUILD.bazel | 67 ---------------- tests/bootstrap_impls/BUILD.bazel | 80 +++++++++++++++++++ tests/{base_rules => bootstrap_impls}/bin.py | 0 .../inherit_pythonsafepath_env_test.sh | 0 .../run_binary_zip_no_test.sh | 0 .../run_binary_zip_yes_test.sh | 0 .../run_zip_test.sh | 0 .../sys_path_order_test.py | 0 8 files changed, 80 insertions(+), 67 deletions(-) create mode 100644 tests/bootstrap_impls/BUILD.bazel rename tests/{base_rules => bootstrap_impls}/bin.py (100%) rename tests/{base_rules => bootstrap_impls}/inherit_pythonsafepath_env_test.sh (100%) rename tests/{base_rules => bootstrap_impls}/run_binary_zip_no_test.sh (100%) rename tests/{base_rules => bootstrap_impls}/run_binary_zip_yes_test.sh (100%) rename tests/{base_rules => bootstrap_impls}/run_zip_test.sh (100%) rename tests/{base_rules => bootstrap_impls}/sys_path_order_test.py (100%) diff --git a/tests/base_rules/BUILD.bazel b/tests/base_rules/BUILD.bazel index cd5771533d..aa21042e25 100644 --- a/tests/base_rules/BUILD.bazel +++ b/tests/base_rules/BUILD.bazel @@ -11,70 +11,3 @@ # 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"] - -sh_py_run_test( - name = "run_binary_zip_no_test", - build_python_zip = "no", - py_src = "bin.py", - sh_src = "run_binary_zip_no_test.sh", -) - -sh_py_run_test( - name = "run_binary_zip_yes_test", - build_python_zip = "yes", - py_src = "bin.py", - sh_src = "run_binary_zip_yes_test.sh", -) - -sh_py_run_test( - name = "run_binary_bootstrap_script_zip_yes_test", - bootstrap_impl = "script", - build_python_zip = "yes", - py_src = "bin.py", - sh_src = "run_binary_zip_yes_test.sh", - target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT, -) - -sh_py_run_test( - name = "run_binary_bootstrap_script_zip_no_test", - bootstrap_impl = "script", - build_python_zip = "no", - py_src = "bin.py", - sh_src = "run_binary_zip_no_test.sh", - target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT, -) - -py_reconfig_test( - name = "sys_path_order_bootstrap_script_test", - srcs = ["sys_path_order_test.py"], - bootstrap_impl = "script", - env = {"BOOTSTRAP": "script"}, - imports = ["./site-packages"], - main = "sys_path_order_test.py", - target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT, -) - -py_reconfig_test( - name = "sys_path_order_bootstrap_system_python_test", - srcs = ["sys_path_order_test.py"], - bootstrap_impl = "system_python", - env = {"BOOTSTRAP": "system_python"}, - imports = ["./site-packages"], - main = "sys_path_order_test.py", -) - -sh_py_run_test( - name = "inherit_pythonsafepath_env_test", - bootstrap_impl = "script", - py_src = "bin.py", - sh_src = "inherit_pythonsafepath_env_test.sh", - target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT, -) diff --git a/tests/bootstrap_impls/BUILD.bazel b/tests/bootstrap_impls/BUILD.bazel new file mode 100644 index 0000000000..cd5771533d --- /dev/null +++ b/tests/bootstrap_impls/BUILD.bazel @@ -0,0 +1,80 @@ +# 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. + +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"] + +sh_py_run_test( + name = "run_binary_zip_no_test", + build_python_zip = "no", + py_src = "bin.py", + sh_src = "run_binary_zip_no_test.sh", +) + +sh_py_run_test( + name = "run_binary_zip_yes_test", + build_python_zip = "yes", + py_src = "bin.py", + sh_src = "run_binary_zip_yes_test.sh", +) + +sh_py_run_test( + name = "run_binary_bootstrap_script_zip_yes_test", + bootstrap_impl = "script", + build_python_zip = "yes", + py_src = "bin.py", + sh_src = "run_binary_zip_yes_test.sh", + target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT, +) + +sh_py_run_test( + name = "run_binary_bootstrap_script_zip_no_test", + bootstrap_impl = "script", + build_python_zip = "no", + py_src = "bin.py", + sh_src = "run_binary_zip_no_test.sh", + target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT, +) + +py_reconfig_test( + name = "sys_path_order_bootstrap_script_test", + srcs = ["sys_path_order_test.py"], + bootstrap_impl = "script", + env = {"BOOTSTRAP": "script"}, + imports = ["./site-packages"], + main = "sys_path_order_test.py", + target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT, +) + +py_reconfig_test( + name = "sys_path_order_bootstrap_system_python_test", + srcs = ["sys_path_order_test.py"], + bootstrap_impl = "system_python", + env = {"BOOTSTRAP": "system_python"}, + imports = ["./site-packages"], + main = "sys_path_order_test.py", +) + +sh_py_run_test( + name = "inherit_pythonsafepath_env_test", + bootstrap_impl = "script", + py_src = "bin.py", + sh_src = "inherit_pythonsafepath_env_test.sh", + target_compatible_with = _SUPPORTS_BOOTSTRAP_SCRIPT, +) diff --git a/tests/base_rules/bin.py b/tests/bootstrap_impls/bin.py similarity index 100% rename from tests/base_rules/bin.py rename to tests/bootstrap_impls/bin.py diff --git a/tests/base_rules/inherit_pythonsafepath_env_test.sh b/tests/bootstrap_impls/inherit_pythonsafepath_env_test.sh similarity index 100% rename from tests/base_rules/inherit_pythonsafepath_env_test.sh rename to tests/bootstrap_impls/inherit_pythonsafepath_env_test.sh diff --git a/tests/base_rules/run_binary_zip_no_test.sh b/tests/bootstrap_impls/run_binary_zip_no_test.sh similarity index 100% rename from tests/base_rules/run_binary_zip_no_test.sh rename to tests/bootstrap_impls/run_binary_zip_no_test.sh diff --git a/tests/base_rules/run_binary_zip_yes_test.sh b/tests/bootstrap_impls/run_binary_zip_yes_test.sh similarity index 100% rename from tests/base_rules/run_binary_zip_yes_test.sh rename to tests/bootstrap_impls/run_binary_zip_yes_test.sh diff --git a/tests/base_rules/run_zip_test.sh b/tests/bootstrap_impls/run_zip_test.sh similarity index 100% rename from tests/base_rules/run_zip_test.sh rename to tests/bootstrap_impls/run_zip_test.sh diff --git a/tests/base_rules/sys_path_order_test.py b/tests/bootstrap_impls/sys_path_order_test.py similarity index 100% rename from tests/base_rules/sys_path_order_test.py rename to tests/bootstrap_impls/sys_path_order_test.py From 4f2dd2f049dcc3656b6bc6e0995fbe0c6bd6d61b Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Fri, 30 Aug 2024 22:20:24 -0700 Subject: [PATCH 174/345] refactor: allow py_library to accept additional fragments (#2170) This allows the Google fork to pass additional fragment names. --- python/private/common/py_library.bzl | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/python/private/common/py_library.bzl b/python/private/common/py_library.bzl index 673beedd2a..fd534908d0 100644 --- a/python/private/common/py_library.bzl +++ b/python/private/common/py_library.bzl @@ -127,14 +127,16 @@ def create_py_library_rule(*, attrs = {}, **kwargs): # Within Google, the doc attribute is overridden kwargs.setdefault("doc", _DEFAULT_PY_LIBRARY_DOC) + + # TODO: b/253818097 - fragments=py is only necessary so that + # RequiredConfigFragmentsTest passes + fragments = kwargs.pop("fragments", None) or [] return rule( attrs = dicts.add(LIBRARY_ATTRS, attrs), toolchains = [ config_common.toolchain_type(TOOLCHAIN_TYPE, mandatory = False), config_common.toolchain_type(EXEC_TOOLS_TOOLCHAIN_TYPE, mandatory = False), ], - # TODO(b/253818097): fragments=py is only necessary so that - # RequiredConfigFragmentsTest passes - fragments = ["py"], + fragments = fragments + ["py"], **kwargs ) From 54c9fab03af56869ac5b36fb2ab614a63a40a7ab Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sat, 31 Aug 2024 07:19:47 -0700 Subject: [PATCH 175/345] refactor(flags): return FeatureFlagInfo in --python_version flag (#2167) Make the `--python_version` flag also return the `FeatureFlagInfo` provider. There are two reasons to also return the FeatureFlagInfo provider: First, it allows the flag implementation to change the value and have that value respected by config_setting() later. This allows, for example, the rule to use custom logic (and information from things it depends on) to determine the effective flag value. Secondly, it makes the flag compatible with the Google fork of this rule, which is implemented using FeatureFlagInfo, to help eventually converge them. Along the way, add config_common to the Sphinx Bazel inventory. --- CHANGELOG.md | 2 ++ python/private/config_settings.bzl | 36 ++++++++++++++++++++-- sphinxdocs/inventories/bazel_inventory.txt | 3 ++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 387b55b0c9..ee71951b44 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,8 @@ A brief description of the categories of changes: ### Changed * (gazelle): Update error messages when unable to resolve a dependency to be more human-friendly. +* (flags) The {obj}`--python_version` flag now also returns + {obj}`config_common.FeatureFlagInfo`. ### Fixed * (whl_library): Remove `--no-index` and add `--no-build-isolation` to the diff --git a/python/private/config_settings.bzl b/python/private/config_settings.bzl index 0537655a47..99b8b94adf 100644 --- a/python/private/config_settings.bzl +++ b/python/private/config_settings.bzl @@ -16,7 +16,7 @@ """ load("@bazel_skylib//lib:selects.bzl", "selects") -load("@bazel_skylib//rules:common_settings.bzl", "string_flag") +load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("//python:versions.bzl", "MINOR_MAPPING", "TOOL_VERSIONS") _PYTHON_VERSION_FLAG = str(Label("//python/config_settings:python_version")) @@ -170,7 +170,7 @@ def construct_config_settings(name = None): # buildifier: disable=function-docs Args: name(str): A dummy name value that is no-op for now. """ - string_flag( + _python_version_flag( name = "python_version", # TODO: The default here should somehow match the MODULE config. Until # then, use the empty string to indicate an unknown version. This @@ -200,3 +200,35 @@ def construct_config_settings(name = None): # buildifier: disable=function-docs }, visibility = ["//visibility:public"], ) + +def _python_version_flag_impl(ctx): + value = ctx.build_setting_value + if value not in ctx.attr.values: + fail(( + "Invalid --python_version value: {actual}\nAllowed values {allowed}" + ).format( + actual = value, + allowed = ", ".join(sorted(ctx.attr.values)), + )) + + return [ + # BuildSettingInfo is the original provider returned, so continue to + # return it for compatibility + BuildSettingInfo(value = value), + # FeatureFlagInfo is returned so that config_setting respects the value + # as returned by this rule instead of as originally seen on the command + # line. + # It is also for Google compatibility, which expects the FeatureFlagInfo + # provider. + config_common.FeatureFlagInfo(value = value), + ] + +_python_version_flag = rule( + implementation = _python_version_flag_impl, + build_setting = config.string(flag = True), + attrs = { + "values": attr.string_list( + doc = "Allowed values.", + ), + }, +) diff --git a/sphinxdocs/inventories/bazel_inventory.txt b/sphinxdocs/inventories/bazel_inventory.txt index 445f0f71f4..caf5866d8a 100644 --- a/sphinxdocs/inventories/bazel_inventory.txt +++ b/sphinxdocs/inventories/bazel_inventory.txt @@ -7,6 +7,8 @@ File bzl:type 1 rules/lib/File - Label bzl:type 1 rules/lib/Label - Target bzl:type 1 rules/lib/builtins/Target - bool bzl:type 1 rules/lib/bool - +config_common.FeatureFlagInfo bzl:type 1 rules/lib/toplevel/config_common#FeatureFlagInfo - +config_common.toolchain_type bzl:function 1 rules/lib/toplevel/config_common#toolchain_type - ctx.actions bzl:obj 1 rules/lib/builtins/ctx#actions - ctx.aspect_ids bzl:obj 1 rules/lib/builtins/ctx#aspect_ids - ctx.attr bzl:obj 1 rules/lib/builtins/ctx#attr - @@ -65,6 +67,7 @@ native.repo_name bzl:function 1 rules/lib/toplevel/native#repo_name - native.repository_name bzl:function 1 rules/lib/toplevel/native#repository_name - str bzl:type 1 rules/lib/string - struct bzl:type 1 rules/lib/builtins/struct - +toolchain_type bzl:type 1 ules/lib/builtins/toolchain_type.html - Name bzl:type 1 concepts/labels#target-names - CcInfo bzl:provider 1 rules/lib/providers/CcInfo - CcInfo.linking_context bzl:provider-field 1 rules/lib/providers/CcInfo#linking_context - From b97a5d61138666a434ed69b480a175e5c03d9356 Mon Sep 17 00:00:00 2001 From: UebelAndre Date: Sat, 31 Aug 2024 14:58:59 -0700 Subject: [PATCH 176/345] fix(py_wheel): Avoid reliance on bash in `py_wheel` macro. (#2171) While trying to modernize an older repo I tried building wheels on windows and ran into a failure: ``` Windows Subsystem for Linux has no installed distributions. Use 'wsl.exe --list --online' to list available distributions and 'wsl.exe --install ' to install. Distributions can also be installed by visiting the Microsoft Store: https://aka.ms/wlstore Errorcode: Bash/Service/CreateInstance/GetDefaultDistro/WSL_E_DEFAULT_DISTRO_NOT_FOUND ``` This appears to be caused by the `py_wheel_dist` rule which gets caught by `//...`. This target should be considered a side-effect/optional target of `py_wheel`. To fix: 1. Mark the target as `manual`, so it's only built when explicitly requested. 2. Implement copying to the directory with a Python program instead of shell, so bash isn't required. --- CHANGELOG.md | 3 +- python/packaging.bzl | 80 ++++++++++++++++++++++----------- python/private/BUILD.bazel | 6 +++ python/private/py_wheel_dist.py | 41 +++++++++++++++++ 4 files changed, 103 insertions(+), 27 deletions(-) create mode 100644 python/private/py_wheel_dist.py diff --git a/CHANGELOG.md b/CHANGELOG.md index ee71951b44..bca643f32a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,7 +46,8 @@ A brief description of the categories of changes: * (gazelle) Correctly resolve deps that have top-level module overlap with a gazelle_python.yaml dep module ### Added -* Nothing yet +* (py_wheel) Removed use of bash to avoid failures on Windows machines which do not + have it installed. ### Removed * Nothing yet diff --git a/python/packaging.bzl b/python/packaging.bzl index a5ac25b292..17f72a7d67 100644 --- a/python/packaging.bzl +++ b/python/packaging.bzl @@ -35,25 +35,28 @@ This rule is intended to be used as data dependency to py_wheel rule. attrs = py_package_lib.attrs, ) -# Based on https://github.com/aspect-build/bazel-lib/tree/main/lib/private/copy_to_directory.bzl -# Avoiding a bazelbuild -> aspect-build dependency :( def _py_wheel_dist_impl(ctx): - dir = ctx.actions.declare_directory(ctx.attr.out) + out = ctx.actions.declare_directory(ctx.attr.out) name_file = ctx.attr.wheel[PyWheelInfo].name_file - cmds = [ - "mkdir -p \"%s\"" % dir.path, - """cp "{}" "{}/$(cat "{}")" """.format(ctx.files.wheel[0].path, dir.path, name_file.path), - ] - ctx.actions.run_shell( - inputs = ctx.files.wheel + [name_file], - outputs = [dir], - command = "\n".join(cmds), - mnemonic = "CopyToDirectory", - progress_message = "Copying files to directory", - use_default_shell_env = True, + wheel = ctx.attr.wheel[PyWheelInfo].wheel + + args = ctx.actions.args() + args.add("--wheel", wheel) + args.add("--name_file", name_file) + args.add("--output", out.path) + + ctx.actions.run( + mnemonic = "PyWheelDistDir", + executable = ctx.executable._copier, + inputs = [wheel, name_file], + outputs = [out], + arguments = [args], ) return [ - DefaultInfo(files = depset([dir]), runfiles = ctx.runfiles([dir])), + DefaultInfo( + files = depset([out]), + runfiles = ctx.runfiles([out]), + ), ] py_wheel_dist = rule( @@ -67,12 +70,28 @@ This also has the advantage that stamping information is included in the wheel's """, implementation = _py_wheel_dist_impl, attrs = { - "out": attr.string(doc = "name of the resulting directory", mandatory = True), - "wheel": attr.label(doc = "a [py_wheel target](#py_wheel)", providers = [PyWheelInfo]), + "out": attr.string( + doc = "name of the resulting directory", + mandatory = True, + ), + "wheel": attr.label( + doc = "a [py_wheel target](#py_wheel)", + providers = [PyWheelInfo], + ), + "_copier": attr.label( + cfg = "exec", + executable = True, + default = Label("//python/private:py_wheel_dist"), + ), }, ) -def py_wheel(name, twine = None, twine_binary = Label("//tools/publish:twine") if BZLMOD_ENABLED else None, publish_args = [], **kwargs): +def py_wheel( + name, + twine = None, + twine_binary = Label("//tools/publish:twine") if BZLMOD_ENABLED else None, + publish_args = [], + **kwargs): """Builds a Python Wheel. Wheels are Python distribution format defined in https://www.python.org/dev/peps/pep-0427/. @@ -153,24 +172,31 @@ def py_wheel(name, twine = None, twine_binary = Label("//tools/publish:twine") i Note that you can also pass additional args to the bazel run command as in the example above. **kwargs: other named parameters passed to the underlying [py_wheel rule](#py_wheel_rule) """ - _dist_target = "{}.dist".format(name) + tags = kwargs.pop("tags", []) + manual_tags = depset(tags + ["manual"]).to_list() + + dist_target = "{}.dist".format(name) py_wheel_dist( - name = _dist_target, + name = dist_target, wheel = name, out = kwargs.pop("dist_folder", "{}_dist".format(name)), + tags = manual_tags, **copy_propagating_kwargs(kwargs) ) - _py_wheel(name = name, **kwargs) + _py_wheel( + name = name, + tags = tags, + **kwargs + ) twine_args = [] if twine or twine_binary: twine_args = ["upload"] twine_args.extend(publish_args) - twine_args.append("$(rootpath :{})/*".format(_dist_target)) + twine_args.append("$(rootpath :{})/*".format(dist_target)) if twine_binary: - twine_kwargs = {"tags": ["manual"]} native_binary( name = "{}.publish".format(name), src = twine_binary, @@ -179,9 +205,10 @@ def py_wheel(name, twine = None, twine_binary = Label("//tools/publish:twine") i "//conditions:default": "{}.publish_script".format(name), }), args = twine_args, - data = [_dist_target], + data = [dist_target], + tags = manual_tags, visibility = kwargs.get("visibility"), - **copy_propagating_kwargs(kwargs, twine_kwargs) + **copy_propagating_kwargs(kwargs) ) elif twine: if not twine.endswith(":pkg"): @@ -193,10 +220,11 @@ def py_wheel(name, twine = None, twine_binary = Label("//tools/publish:twine") i name = "{}.publish".format(name), srcs = [twine_main], args = twine_args, - data = [_dist_target], + data = [dist_target], imports = ["."], main = twine_main, deps = [twine], + tags = manual_tags, visibility = kwargs.get("visibility"), **copy_propagating_kwargs(kwargs) ) diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 488862ff7a..7362a4cbad 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -440,6 +440,12 @@ py_binary( ], ) +py_binary( + name = "py_wheel_dist", + srcs = ["py_wheel_dist.py"], + visibility = ["//visibility:public"], +) + py_library( name = "py_console_script_gen_lib", srcs = ["py_console_script_gen.py"], diff --git a/python/private/py_wheel_dist.py b/python/private/py_wheel_dist.py new file mode 100644 index 0000000000..3af3345ef9 --- /dev/null +++ b/python/private/py_wheel_dist.py @@ -0,0 +1,41 @@ +"""A utility for generating the output directory for `py_wheel_dist`.""" + +import argparse +import shutil +from pathlib import Path + + +def parse_args() -> argparse.Namespace: + """Parse command line arguments.""" + parser = argparse.ArgumentParser() + + parser.add_argument( + "--wheel", type=Path, required=True, help="The path to a wheel." + ) + parser.add_argument( + "--name_file", + type=Path, + required=True, + help="A file containing the sanitized name of the wheel.", + ) + parser.add_argument( + "--output", + type=Path, + required=True, + help="The output location to copy the wheel to.", + ) + + return parser.parse_args() + + +def main() -> None: + """The main entrypoint.""" + args = parse_args() + + wheel_name = args.name_file.read_text(encoding="utf-8").strip() + args.output.mkdir(exist_ok=True, parents=True) + shutil.copyfile(args.wheel, args.output / wheel_name) + + +if __name__ == "__main__": + main() From 36bb556220458d4692cf84c504fa9563b7bebb79 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 1 Sep 2024 20:42:08 -0700 Subject: [PATCH 177/345] feat(rules): add PyExecutableInfo (#2166) The PyExecutableInfo provider exposes executable-specific information that isn't easily accessible outside the target. The main purpose of this provider is to facilitate packaging a binary or deriving a new binary based upon the original. Within rules_python, this will be used to pull the zip-building logic out of executables and into separate rules. Within Google, this will be used for a similar "package a binary" tool. Along the way: * Add runfiles references to sphinx inventory --- CHANGELOG.md | 3 + docs/BUILD.bazel | 1 + python/BUILD.bazel | 6 ++ python/private/BUILD.bazel | 5 ++ python/private/common/BUILD.bazel | 2 + python/private/common/py_executable.bzl | 38 +++++++--- python/private/py_executable_info.bzl | 35 ++++++++++ python/py_executable_info.bzl | 12 ++++ sphinxdocs/inventories/bazel_inventory.txt | 7 ++ tests/base_rules/py_executable_base_tests.bzl | 12 +++- tests/support/py_executable_info_subject.bzl | 70 +++++++++++++++++++ 11 files changed, 180 insertions(+), 11 deletions(-) create mode 100644 python/private/py_executable_info.bzl create mode 100644 python/py_executable_info.bzl create mode 100644 tests/support/py_executable_info_subject.bzl diff --git a/CHANGELOG.md b/CHANGELOG.md index bca643f32a..dcd8576b98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,9 @@ A brief description of the categories of changes: * (gazelle) Correctly resolve deps that have top-level module overlap with a gazelle_python.yaml dep module ### Added +* (rules) Executables provide {obj}`PyExecutableInfo`, which contains + executable-specific information useful for packaging an executable or + or deriving a new one from the original. * (py_wheel) Removed use of bash to avoid failures on Windows machines which do not have it installed. diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index 4210876be3..f7f226ae0e 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -84,6 +84,7 @@ sphinx_stardocs( "//python:pip_bzl", "//python:py_binary_bzl", "//python:py_cc_link_params_info_bzl", + "//python:py_executable_info_bzl", "//python:py_library_bzl", "//python:py_runtime_bzl", "//python:py_runtime_info_bzl", diff --git a/python/BUILD.bazel b/python/BUILD.bazel index 878d20b57d..40880a1495 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -139,6 +139,12 @@ bzl_library( ], ) +bzl_library( + name = "py_executable_info_bzl", + srcs = ["py_executable_info.bzl"], + deps = ["//python/private:py_executable_info_bzl"], +) + bzl_library( name = "py_import_bzl", srcs = ["py_import.bzl"], diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 7362a4cbad..8ddcc09df2 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -220,6 +220,11 @@ bzl_library( ], ) +bzl_library( + name = "py_executable_info_bzl", + srcs = ["py_executable_info.bzl"], +) + bzl_library( name = "py_interpreter_program_bzl", srcs = ["py_interpreter_program.bzl"], diff --git a/python/private/common/BUILD.bazel b/python/private/common/BUILD.bazel index a415e0587e..805c00226d 100644 --- a/python/private/common/BUILD.bazel +++ b/python/private/common/BUILD.bazel @@ -132,9 +132,11 @@ bzl_library( ":providers_bzl", ":py_internal_bzl", "//python/private:flags_bzl", + "//python/private:py_executable_info_bzl", "//python/private:rules_cc_srcs_bzl", "//python/private:toolchain_types_bzl", "@bazel_skylib//lib:dicts", + "@bazel_skylib//lib:structs", "@bazel_skylib//rules:common_settings", ], ) diff --git a/python/private/common/py_executable.bzl b/python/private/common/py_executable.bzl index 9b8c77cf00..1437e2eb1d 100644 --- a/python/private/common/py_executable.bzl +++ b/python/private/common/py_executable.bzl @@ -14,9 +14,11 @@ """Common functionality between test/binary executables.""" 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("//python/private:flags.bzl", "PrecompileAddToRunfilesFlag") +load("//python/private:py_executable_info.bzl", "PyExecutableInfo") load("//python/private:reexports.bzl", "BuiltinPyRuntimeInfo") load( "//python/private:toolchain_types.bzl", @@ -221,10 +223,14 @@ def py_executable_base_impl(ctx, *, semantics, is_test, inherited_environment = extra_exec_runfiles = exec_result.extra_runfiles.merge( ctx.runfiles(transitive_files = exec_result.extra_files_to_build), ) - runfiles_details = struct( - default_runfiles = runfiles_details.default_runfiles.merge(extra_exec_runfiles), - data_runfiles = runfiles_details.data_runfiles.merge(extra_exec_runfiles), - ) + + # Copy any existing fields in case of company patches. + runfiles_details = struct(**( + structs.to_dict(runfiles_details) | dict( + default_runfiles = runfiles_details.default_runfiles.merge(extra_exec_runfiles), + data_runfiles = runfiles_details.data_runfiles.merge(extra_exec_runfiles), + ) + )) return _create_providers( ctx = ctx, @@ -400,8 +406,8 @@ def _get_base_runfiles_for_binary( semantics): """Returns the set of runfiles necessary prior to executable creation. - NOTE: The term "common runfiles" refers to the runfiles that both the - default and data runfiles have in common. + NOTE: The term "common runfiles" refers to the runfiles that are common to + runfiles_without_exe, default_runfiles, and data_runfiles. Args: ctx: The rule ctx. @@ -418,6 +424,8 @@ def _get_base_runfiles_for_binary( struct with attributes: * default_runfiles: The default runfiles * data_runfiles: The data runfiles + * runfiles_without_exe: The default runfiles, but without the executable + or files specific to the original program/executable. """ common_runfiles_depsets = [main_py_files] @@ -431,7 +439,6 @@ def _get_base_runfiles_for_binary( common_runfiles_depsets.append(dep[PyInfo].transitive_pyc_files) common_runfiles = collect_runfiles(ctx, depset( - direct = [executable], transitive = common_runfiles_depsets, )) if extra_deps: @@ -447,22 +454,27 @@ def _get_base_runfiles_for_binary( runfiles = common_runfiles, ) + # Don't include build_data.txt in the non-exe runfiles. The build data + # may contain program-specific content (e.g. target name). + runfiles_with_exe = common_runfiles.merge(ctx.runfiles([executable])) + # Don't include build_data.txt in data runfiles. This allows binaries to # contain other binaries while still using the same fixed location symlink # for the build_data.txt file. Really, the fixed location symlink should be # removed and another way found to locate the underlying build data file. - data_runfiles = common_runfiles + data_runfiles = runfiles_with_exe if is_stamping_enabled(ctx, semantics) and semantics.should_include_build_data(ctx): - default_runfiles = common_runfiles.merge(_create_runfiles_with_build_data( + default_runfiles = runfiles_with_exe.merge(_create_runfiles_with_build_data( ctx, semantics.get_central_uncachable_version_file(ctx), semantics.get_extra_write_build_data_env(ctx), )) else: - default_runfiles = common_runfiles + default_runfiles = runfiles_with_exe return struct( + runfiles_without_exe = common_runfiles, default_runfiles = default_runfiles, data_runfiles = data_runfiles, ) @@ -814,6 +826,11 @@ def _create_providers( ), create_instrumented_files_info(ctx), _create_run_environment_info(ctx, inherited_environment), + PyExecutableInfo( + main = main_py, + runfiles_without_exe = runfiles_details.runfiles_without_exe, + interpreter_path = runtime_details.executable_interpreter_path, + ), ] # TODO(b/265840007): Make this non-conditional once Google enables @@ -904,6 +921,7 @@ def create_base_executable_rule(*, attrs, fragments = [], **kwargs): if "py" not in fragments: # The list might be frozen, so use concatentation fragments = fragments + ["py"] + kwargs.setdefault("provides", []).append(PyExecutableInfo) return rule( # TODO: add ability to remove attrs, i.e. for imports attr attrs = dicts.add(EXECUTABLE_ATTRS, attrs), diff --git a/python/private/py_executable_info.bzl b/python/private/py_executable_info.bzl new file mode 100644 index 0000000000..7fa2f18308 --- /dev/null +++ b/python/private/py_executable_info.bzl @@ -0,0 +1,35 @@ +"""Implementation of PyExecutableInfo provider.""" + +PyExecutableInfo = provider( + doc = """ +Information about an executable. + +This provider is for executable-specific information (e.g. tests and binaries). + +:::{versionadded} 0.36.0 +::: +""", + fields = { + "interpreter_path": """ +:type: None | str + +Path to the Python interpreter to use for running the executable itself (not the +bootstrap script). Either an absolute path (which means it is +platform-specific), or a runfiles-relative path (which means the interpreter +should be within `runtime_files`) +""", + "main": """ +:type: File + +The user-level entry point file. Usually a `.py` file, but may also be `.pyc` +file if precompiling is enabled. +""", + "runfiles_without_exe": """ +:type: runfiles + +The runfiles the program needs, but without the original executable, +files only added to support the original executable, or files specific to the +original program. +""", + }, +) diff --git a/python/py_executable_info.bzl b/python/py_executable_info.bzl new file mode 100644 index 0000000000..59c0bb2488 --- /dev/null +++ b/python/py_executable_info.bzl @@ -0,0 +1,12 @@ +"""Provider for executable-specific information. + +The `PyExecutableInfo` provider contains information about an executable that +isn't otherwise available from its public attributes or other providers. + +It exposes information primarily useful for consumers to package the executable, +or derive a new executable from the base binary. +""" + +load("//python/private:py_executable_info.bzl", _PyExecutableInfo = "PyExecutableInfo") + +PyExecutableInfo = _PyExecutableInfo diff --git a/sphinxdocs/inventories/bazel_inventory.txt b/sphinxdocs/inventories/bazel_inventory.txt index caf5866d8a..0daafb47ce 100644 --- a/sphinxdocs/inventories/bazel_inventory.txt +++ b/sphinxdocs/inventories/bazel_inventory.txt @@ -65,6 +65,13 @@ native.package_name bzl:function 1 rules/lib/toplevel/native#package_name - native.package_relative_label bzl:function 1 rules/lib/toplevel/native#package_relative_label - native.repo_name bzl:function 1 rules/lib/toplevel/native#repo_name - native.repository_name bzl:function 1 rules/lib/toplevel/native#repository_name - +runfiles bzl:type 1 rules/lib/builtins/runfiles - +runfiles.empty_filenames bzl:type 1 rules/lib/builtins/runfiles#empty_filenames - +runfiles.files bzl:type 1 rules/lib/builtins/runfiles#files - +runfiles.merge bzl:type 1 rules/lib/builtins/runfiles#merge - +runfiles.merge_all bzl:type 1 rules/lib/builtins/runfiles#merge_all - +runfiles.root_symlinks bzl:type 1 rules/lib/builtins/runfiles#root_symlinks - +runfiles.symlinks bzl:type 1 rules/lib/builtins/runfiles#symlinks - str bzl:type 1 rules/lib/string - struct bzl:type 1 rules/lib/builtins/struct - toolchain_type bzl:type 1 ules/lib/builtins/toolchain_type.html - diff --git a/tests/base_rules/py_executable_base_tests.bzl b/tests/base_rules/py_executable_base_tests.bzl index eb1a1b6c07..1f805cb153 100644 --- a/tests/base_rules/py_executable_base_tests.bzl +++ b/tests/base_rules/py_executable_base_tests.bzl @@ -18,9 +18,11 @@ load("@rules_python_internal//:rules_python_config.bzl", rp_config = "config") load("@rules_testing//lib:analysis_test.bzl", "analysis_test") load("@rules_testing//lib:truth.bzl", "matching") load("@rules_testing//lib:util.bzl", rt_util = "util") +load("//python:py_executable_info.bzl", "PyExecutableInfo") load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility load("//tests/base_rules:base_tests.bzl", "create_base_tests") load("//tests/base_rules:util.bzl", "WINDOWS_ATTR", pt_util = "util") +load("//tests/support:py_executable_info_subject.bzl", "PyExecutableInfoSubject") load("//tests/support:support.bzl", "LINUX_X86_64", "WINDOWS_X86_64") _BuiltinPyRuntimeInfo = PyRuntimeInfo @@ -132,11 +134,19 @@ def _test_executable_in_runfiles_impl(env, target): exe = ".exe" else: exe = "" - env.expect.that_target(target).runfiles().contains_at_least([ "{workspace}/{package}/{test_name}_subject" + exe, ]) + if rp_config.enable_pystar: + py_exec_info = env.expect.that_target(target).provider(PyExecutableInfo, factory = PyExecutableInfoSubject.new) + py_exec_info.main().path().contains("_subject.py") + py_exec_info.interpreter_path().contains("python") + py_exec_info.runfiles_without_exe().contains_none_of([ + "{workspace}/{package}/{test_name}_subject" + exe, + "{workspace}/{package}/{test_name}_subject", + ]) + def _test_default_main_can_be_generated(name, config): rt_util.helper_target( config.rule, diff --git a/tests/support/py_executable_info_subject.bzl b/tests/support/py_executable_info_subject.bzl new file mode 100644 index 0000000000..97216eceff --- /dev/null +++ b/tests/support/py_executable_info_subject.bzl @@ -0,0 +1,70 @@ +# 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. +"""PyExecutableInfo testing subject.""" + +load("@rules_testing//lib:truth.bzl", "subjects") + +def _py_executable_info_subject_new(info, *, meta): + """Creates a new `PyExecutableInfoSubject` for a PyExecutableInfo provider instance. + + Method: PyExecutableInfoSubject.new + + Args: + info: The PyExecutableInfo object + meta: ExpectMeta object. + + Returns: + A `PyExecutableInfoSubject` struct + """ + + # buildifier: disable=uninitialized + public = struct( + # go/keep-sorted start + actual = info, + interpreter_path = lambda *a, **k: _py_executable_info_subject_interpreter_path(self, *a, **k), + main = lambda *a, **k: _py_executable_info_subject_main(self, *a, **k), + runfiles_without_exe = lambda *a, **k: _py_executable_info_subject_runfiles_without_exe(self, *a, **k), + # go/keep-sorted end + ) + self = struct( + actual = info, + meta = meta, + ) + return public + +def _py_executable_info_subject_interpreter_path(self): + """Returns a subject for `PyExecutableInfo.interpreter_path`.""" + return subjects.str( + self.actual.interpreter_path, + meta = self.meta.derive("interpreter_path()"), + ) + +def _py_executable_info_subject_main(self): + """Returns a subject for `PyExecutableInfo.main`.""" + return subjects.file( + self.actual.main, + meta = self.meta.derive("main()"), + ) + +def _py_executable_info_subject_runfiles_without_exe(self): + """Returns a subject for `PyExecutableInfo.runfiles_without_exe`.""" + return subjects.runfiles( + self.actual.runfiles_without_exe, + meta = self.meta.derive("runfiles_without_exe()"), + ) + +# buildifier: disable=name-conventions +PyExecutableInfoSubject = struct( + new = _py_executable_info_subject_new, +) From 50f6ce749eb20fc53ace644d3bc91d50829e6c2d Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Mon, 2 Sep 2024 06:14:51 -0700 Subject: [PATCH 178/345] refactor(sphinxdocs): use bazel label format for internal object tracking (#2174) This changes the way objects are tracked to use Bazel label format instead of dotted notation. The dotted notation was problematic because it was ambiguous. For example, `foo.bar.baz` could mean `@foo//bar:baz` or `@foo//:bar.bzl%baz`. It also required various internal hacks to try and "unparse" the dotted notation into the "meaningful" part of an object to use in various contexts. For example, `//foo:bar` usually means `bar` is the key term to show, and `//foo:bar.bzl%baz.qux` usually means `qux` or `baz.qux` is the meaningful part. Also: * Make referring to things by the bzl-relative symbol names work. e.g. `baz.qux` can be used to reference `//foo:bar.bzl%baz.qux` * Fix the name/referencing of runtime_env_toolchains (it was using singular in the docs) * Add some more references to bazel inventory * Omit `--jobs=auto` for `sphinx_run`; multi-job invocations of Sphinx make it difficult to interactively run Sphinx for debugging, which is the point of `sphinx_run` * Add a basic test of cross-references * Make xrefs for `--name` format force looking in the flag object type. This avoids finding objects of a matching name of another object type; e.g "precompile" is both a flag and attribute name. * Cleanup the index entries: now the base name is displayed instead of the full name; e.g. "foo (target in //bar)" instead of "//foo:bar (target in //bar:BUILD.bazel)" --- docs/api/rules_python/python/index.md | 2 +- .../python/runtime_env_toolchains/index.md | 4 +- sphinxdocs/inventories/bazel_inventory.txt | 1 + sphinxdocs/private/sphinx.bzl | 5 +- sphinxdocs/src/sphinx_bzl/bzl.py | 246 +++++++++++------- sphinxdocs/tests/sphinx_stardoc/BUILD.bazel | 8 + sphinxdocs/tests/sphinx_stardoc/bzl_rule.bzl | 2 +- sphinxdocs/tests/sphinx_stardoc/index.md | 2 +- .../sphinx_stardoc/sphinx_output_test.py | 73 ++++++ sphinxdocs/tests/sphinx_stardoc/xrefs.md | 19 +- 10 files changed, 239 insertions(+), 123 deletions(-) create mode 100644 sphinxdocs/tests/sphinx_stardoc/sphinx_output_test.py diff --git a/docs/api/rules_python/python/index.md b/docs/api/rules_python/python/index.md index 6c794475ac..d1e633fc03 100644 --- a/docs/api/rules_python/python/index.md +++ b/docs/api/rules_python/python/index.md @@ -30,7 +30,7 @@ Legacy toolchain; despite its name, it doesn't autodetect anything. :::{deprecated} 0.34.0 -Use {obj}`@rules_python//python/runtime_env_toolchain:all` instead. +Use {obj}`@rules_python//python/runtime_env_toolchains:all` instead. ::: :::: diff --git a/docs/api/rules_python/python/runtime_env_toolchains/index.md b/docs/api/rules_python/python/runtime_env_toolchains/index.md index ef31f086d7..7d6e1fbf6e 100644 --- a/docs/api/rules_python/python/runtime_env_toolchains/index.md +++ b/docs/api/rules_python/python/runtime_env_toolchains/index.md @@ -1,9 +1,9 @@ :::{default-domain} bzl ::: -:::{bzl:currentfile} //python/runtime_env_toolchain:BUILD.bazel +:::{bzl:currentfile} //python/runtime_env_toolchains:BUILD.bazel ::: -# //python/runtime_env_toolchain +# //python/runtime_env_toolchains ::::{target} all diff --git a/sphinxdocs/inventories/bazel_inventory.txt b/sphinxdocs/inventories/bazel_inventory.txt index 0daafb47ce..7cf772f6ad 100644 --- a/sphinxdocs/inventories/bazel_inventory.txt +++ b/sphinxdocs/inventories/bazel_inventory.txt @@ -7,6 +7,7 @@ File bzl:type 1 rules/lib/File - Label bzl:type 1 rules/lib/Label - Target bzl:type 1 rules/lib/builtins/Target - bool bzl:type 1 rules/lib/bool - +callable bzl:type 1 rules/lib/core/function - config_common.FeatureFlagInfo bzl:type 1 rules/lib/toplevel/config_common#FeatureFlagInfo - config_common.toolchain_type bzl:function 1 rules/lib/toplevel/config_common#toolchain_type - ctx.actions bzl:obj 1 rules/lib/builtins/ctx#actions - diff --git a/sphinxdocs/private/sphinx.bzl b/sphinxdocs/private/sphinx.bzl index 5724be856d..2ee6cfccf1 100644 --- a/sphinxdocs/private/sphinx.bzl +++ b/sphinxdocs/private/sphinx.bzl @@ -272,8 +272,9 @@ def _run_sphinx(ctx, format, source_path, inputs, output_prefix): # Not added to run_args because run_args is for debugging args.add("--quiet") # Suppress stdout informational text - args.add("--jobs", "auto") # Build in parallel, if possible - run_args.extend(("--jobs", "auto")) + # Build in parallel, if possible + # Don't add to run_args: parallel building breaks interactive debugging + args.add("--jobs", "auto") args.add("--fresh-env") # Don't try to use cache files. Bazel can't make use of them. run_args.append("--fresh-env") args.add("--write-all") # Write all files; don't try to detect "changed" files diff --git a/sphinxdocs/src/sphinx_bzl/bzl.py b/sphinxdocs/src/sphinx_bzl/bzl.py index ad2fd289db..6d98e16898 100644 --- a/sphinxdocs/src/sphinx_bzl/bzl.py +++ b/sphinxdocs/src/sphinx_bzl/bzl.py @@ -1,3 +1,16 @@ +# 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. """Sphinx extension for documenting Bazel/Starlark objects.""" import ast @@ -54,35 +67,6 @@ def _position_iter(values: Collection[_T]) -> tuple[bool, bool, _T]: yield i == 0, i == last_i, value -# TODO: Remove this. Use @repo//pkg:file.bzl%symbol to identify things instead -# of dots. This more directly reflects the bzl concept and avoids issues with -# e.g. repos, directories, or files containing dots themselves. -def _label_to_dotted_name(label: str) -> str: - """Convert an absolute label to a dotted name. - - Args: - label: Absolute label with optional repo prefix, e.g. `@a//b:c.bzl` - or `//b:c.bzl` - - Returns: - Label converted to a dotted notation for easier writing of object - references. - """ - if label.endswith(".bzl"): - label = label[: -len(".bzl")] - elif ":BUILD" in label: - label = label[: label.find(":BUILD")] - else: - raise InvalidValueError( - f"Malformed label: Label must end with .bzl or :BUILD*, got {label}" - ) - - # Make a //foo:bar.bzl convert to foo.bar, not .foo.bar - if label.startswith("//"): - label = label.lstrip("/") - return label.replace("@", "").replace("//", "/").replace(":", "/").replace("/", ".") - - class InvalidValueError(Exception): """Generic error for an invalid value instead of ValueError. @@ -153,14 +137,21 @@ def _index_node_tuple( class _BzlObjectId: + """Identifies an object defined by a directive. + + This object is returned by `handle_signature()` and passed onto + `add_target_and_index()`. It contains information to identify the object + that is being described so that it can be indexed and tracked by the + domain. + """ + def __init__( self, *, repo: str, - bzl_file: str = None, + label: str, namespace: str = None, symbol: str = None, - target: str = None, ): """Creates an instance. @@ -172,33 +163,79 @@ def __init__( """ if not repo: raise InvalidValueError("repo cannot be empty") - if not bzl_file: - raise InvalidValueError("bzl_file cannot be empty") - if not symbol: - raise InvalidvalueError("symbol cannot be empty") + if not repo.startswith("@"): + raise InvalidValueError("repo must start with @") + if not label: + raise InvalidValueError("label cannot be empty") + if not label.startswith("//"): + raise InvalidValueError("label must start with //") + + if not label.endswith(".bzl") and (symbol or namespace): + raise InvalidValueError( + "Symbol and namespace can only be specified for .bzl labels" + ) self.repo = repo - self.bzl_file = bzl_file + self.label = label + self.package, self.target_name = self.label.split(":") self.namespace = namespace self.symbol = symbol # Relative to namespace + # doc-relative identifier for this object + self.doc_id = symbol or self.target_name + + if not self.doc_id: + raise InvalidValueError("doc_id is empty") - clean_repo = repo.replace("@", "") - package = _label_to_dotted_name(bzl_file) - self.full_id = ".".join(filter(None, [clean_repo, package, namespace, symbol])) + self.full_id = _full_id_from_parts(repo, label, [namespace, symbol]) @classmethod def from_env( - cls, env: environment.BuildEnvironment, symbol: str = None, target: str = None + cls, env: environment.BuildEnvironment, *, symbol: str = None, label: str = None ) -> "_BzlObjectId": - if target: - symbol = target.lstrip("/:").replace(":", ".") + label = label or env.ref_context["bzl:file"] + if symbol: + namespace = ".".join(env.ref_context["bzl:doc_id_stack"]) + else: + namespace = None + return cls( repo=env.ref_context["bzl:repo"], - bzl_file=env.ref_context["bzl:file"], - namespace=".".join(env.ref_context["bzl:doc_id_stack"]), + label=label, + namespace=namespace, symbol=symbol, ) + def __repr__(self): + return f"_BzlObjectId({self.full_id=})" + + +def _full_id_from_env(env, object_ids=None): + return _full_id_from_parts( + env.ref_context["bzl:repo"], + env.ref_context["bzl:file"], + env.ref_context["bzl:object_id_stack"] + (object_ids or []), + ) + + +def _full_id_from_parts(repo, bzl_file, symbol_names=None): + parts = [repo, bzl_file] + + symbol_names = symbol_names or [] + symbol_names = list(filter(None, symbol_names)) # Filter out empty values + if symbol_names: + parts.append("%") + parts.append(".".join(symbol_names)) + + full_id = "".join(parts) + return full_id + + +def _parse_full_id(full_id): + repo, slashes, label = full_id.partition("//") + label = slashes + label + label, _, symbol = label.partition("%") + return (repo, label, symbol) + class _TypeExprParser(ast.NodeVisitor): """Parsers a string description of types to doc nodes.""" @@ -335,7 +372,7 @@ def _make_xrefs_for_arg_attr( ) index_description = f"{arg_name} ({self.name} in {bzl_file}%{anchor_prefix})" anchor_id = f"{anchor_prefix}.{arg_name}" - full_id = ".".join(env.ref_context["bzl:object_id_stack"] + [arg_name]) + full_id = _full_id_from_env(env, [arg_name]) env.get_domain(domain).add_object( _ObjectEntry( @@ -459,9 +496,7 @@ def run(self) -> list[docutils_nodes.Node]: repo = self.env.config.bzl_default_repository_name self.env.ref_context["bzl:repo"] = repo self.env.ref_context["bzl:file"] = file_label - self.env.ref_context["bzl:object_id_stack"] = [ - _label_to_dotted_name(repo + file_label) - ] + self.env.ref_context["bzl:object_id_stack"] = [] self.env.ref_context["bzl:doc_id_stack"] = [] return [] @@ -511,8 +546,9 @@ class _BzlObject(sphinx_directives.ObjectDescription[_BzlObjectId]): @override def before_content(self) -> None: symbol_name = self.names[-1].symbol - self.env.ref_context["bzl:object_id_stack"].append(symbol_name) - self.env.ref_context["bzl:doc_id_stack"].append(symbol_name) + if symbol_name: + self.env.ref_context["bzl:object_id_stack"].append(symbol_name) + self.env.ref_context["bzl:doc_id_stack"].append(symbol_name) @override def transform_content(self, content_node: addnodes.desc_content) -> None: @@ -566,8 +602,9 @@ def match_arg_field_name(node): @override def after_content(self) -> None: - self.env.ref_context["bzl:object_id_stack"].pop() - self.env.ref_context["bzl:doc_id_stack"].pop() + if self.names[-1].symbol: + self.env.ref_context["bzl:object_id_stack"].pop() + self.env.ref_context["bzl:doc_id_stack"].pop() # docs on how to build signatures: # https://www.sphinx-doc.org/en/master/extdev/nodes.html#sphinx.addnodes.desc_signature @@ -668,7 +705,7 @@ def make_xref(name, title=None): if signature.return_annotation is not signature.empty: sig_node += addnodes.desc_returns("", signature.return_annotation) - obj_id = _BzlObjectId.from_env(self.env, relative_name) + obj_id = _BzlObjectId.from_env(self.env, symbol=relative_name) sig_node["bzl:object_id"] = obj_id.full_id return obj_id @@ -683,24 +720,25 @@ def add_target_and_index( self, obj_desc: _BzlObjectId, sig: str, sig_node: addnodes.desc_signature ) -> None: super().add_target_and_index(obj_desc, sig, sig_node) - symbol_name = obj_desc.symbol - display_name = sig_node.get("bzl:index_display_name", symbol_name) + if obj_desc.symbol: + display_name = obj_desc.symbol + location = obj_desc.label + if obj_desc.namespace: + location += f"%{obj_desc.namespace}" + else: + display_name = obj_desc.target_name + location = obj_desc.package anchor_prefix = ".".join(self.env.ref_context["bzl:doc_id_stack"]) if anchor_prefix: - anchor_id = f"{anchor_prefix}.{symbol_name}" - file_location = "%" + anchor_prefix + anchor_id = f"{anchor_prefix}.{obj_desc.doc_id}" else: - anchor_id = symbol_name - file_location = "" + anchor_id = obj_desc.doc_id sig_node["ids"].append(anchor_id) object_type_display = self._get_object_type_display_name() - index_description = ( - f"{display_name} ({object_type_display} in " - f"{obj_desc.bzl_file}{file_location})" - ) + index_description = f"{display_name} ({object_type_display} in {location})" self.indexnode["entries"].extend( _index_node_tuple("single", f"{index_type}; {index_description}", anchor_id) for index_type in [object_type_display] + self._get_additional_index_types() @@ -715,7 +753,7 @@ def add_target_and_index( object_type=self.objtype, search_priority=1, index_entry=domains.IndexEntry( - name=symbol_name, + name=display_name, subtype=_INDEX_SUBTYPE_NORMAL, docname=self.env.docname, anchor=anchor_id, @@ -732,13 +770,9 @@ def add_target_and_index( # Options require \@ for leading @, but don't # remove the escaping slash, so we have to do it manually .lstrip("\\") - .lstrip("@") - .replace("//", "/") - .replace(".bzl%", ".") - .replace("/", ".") - .replace(":", ".") ) - alt_names.extend(self._get_alt_names(object_entry)) + extra_alt_names = self._get_alt_names(object_entry) + alt_names.extend(extra_alt_names) self.env.get_domain(self.domain).add_object(object_entry, alt_names=alt_names) @@ -749,7 +783,7 @@ def _get_additional_index_types(self): def _object_hierarchy_parts( self, sig_node: addnodes.desc_signature ) -> tuple[str, ...]: - return tuple(sig_node["bzl:object_id"].split(".")) + return _parse_full_id(sig_node["bzl:object_id"]) @override def _toc_entry_name(self, sig_node: addnodes.desc_signature) -> str: @@ -762,16 +796,26 @@ def _get_signature_object_type(self) -> str: return self._get_object_type_display_name() def _get_alt_names(self, object_entry): - return [object_entry.full_id.split(".")[-1]] + alt_names = [] + full_id = object_entry.full_id + label, _, symbol = full_id.partition("%") + if symbol: + # Allow referring to the file-relative fully qualified symbol name + alt_names.append(symbol) + if "." in symbol: + # Allow referring to the last component of the symbol + alt_names.append(symbol.split(".")[-1]) + else: + # Otherwise, it's a target. Allow referring to just the target name + _, _, target_name = label.partition(":") + alt_names.append(target_name) + + return alt_names class _BzlCallable(_BzlObject): """Abstract base class for objects that are callable.""" - @override - def _get_alt_names(self, object_entry): - return [object_entry.full_id.split(".")[-1]] - class _BzlProvider(_BzlObject): """Documents a provider type. @@ -790,10 +834,6 @@ class _BzlProvider(_BzlObject): ``` """ - @override - def _get_alt_names(self, object_entry): - return [object_entry.full_id.split(".")[-1]] - class _BzlProviderField(_BzlObject): """Documents a field of a provider. @@ -822,7 +862,12 @@ def _get_signature_object_type(self) -> str: @override def _get_alt_names(self, object_entry): - return [".".join(object_entry.full_id.split(".")[-2:])] + alt_names = super()._get_alt_names(object_entry) + _, _, symbol = object_entry.full_id.partition("%") + # Allow refering to `mod_ext_name.tag_name`, even if the extension + # is nested within another object + alt_names.append(".".join(symbol.split(".")[-2:])) + return alt_names class _BzlRepositoryRule(_BzlCallable): @@ -1094,6 +1139,15 @@ class _BzlTagClass(_BzlCallable): def _get_signature_object_type(self) -> str: return "" + @override + def _get_alt_names(self, object_entry): + alt_names = super()._get_alt_names(object_entry) + _, _, symbol = object_entry.full_id.partition("%") + # Allow refering to `ProviderName.field`, even if the provider + # is nested within another object + alt_names.append(".".join(symbol.split(".")[-2:])) + return alt_names + class _TargetType(enum.Enum): TARGET = "target" @@ -1120,9 +1174,8 @@ def handle_signature(self, sig_text, sig_node): sig_node += addnodes.desc_addname(package, package) sig_node += addnodes.desc_name(target_name, target_name) - obj_id = _BzlObjectId.from_env(self.env, target=sig_text) + obj_id = _BzlObjectId.from_env(self.env, label=package + target_name) sig_node["bzl:object_id"] = obj_id.full_id - sig_node["bzl:index_display_name"] = f"{package}{target_name}" return obj_id @override @@ -1518,17 +1571,9 @@ def resolve_xref( def _find_entry_for_xref( self, fromdocname: str, object_type: str, target: str ) -> _ObjectEntry | None: - # Normalize a variety of formats to the dotted format used internally. - # --@foo//:bar flags - # --@foo//:bar=value labels - # //foo:bar.bzl labels - target = ( - target.lstrip("@/:-") - .replace("//", "/") - .replace(".bzl%", ".") - .replace("/", ".") - .replace(":", ".") - ) + if target.startswith("--"): + target = target.strip("-") + object_type = "flag" # Elide the value part of --foo=bar flags # Note that the flag value could contain `=` if "=" in target: @@ -1566,15 +1611,18 @@ def add_object(self, entry: _ObjectEntry, alt_names=None) -> None: self.data["objects_by_type"].setdefault(entry.object_type, {}) self.data["objects_by_type"][entry.object_type][entry.full_id] = entry - base_name = entry.full_id.split(".")[-1] - - without_repo = entry.full_id.split(".", 1)[1] + repo, label, symbol = _parse_full_id(entry.full_id) + if symbol: + base_name = symbol.split(".")[-1] + else: + base_name = label.split(":")[-1] if alt_names is not None: alt_names = list(alt_names) - alt_names.append(without_repo) + # Add the repo-less version as an alias + alt_names.append(label + (f"%{symbol}" if symbol else "")) - for alt_name in alt_names: + for alt_name in sorted(set(alt_names)): if alt_name in self.data["alt_names"]: existing = self.data["alt_names"][alt_name] # This situation usually occurs for the constructor function diff --git a/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel b/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel index e2837ff78f..3741e4169c 100644 --- a/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel +++ b/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel @@ -1,4 +1,5 @@ load("@bazel_skylib//:bzl_library.bzl", "bzl_library") +load("//python:py_test.bzl", "py_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("//sphinxdocs:sphinx_stardoc.bzl", "sphinx_stardoc", "sphinx_stardocs") @@ -85,3 +86,10 @@ sphinx_build_binary( "@dev_pip//typing_extensions", # Needed by sphinx_stardoc ], ) + +py_test( + name = "sphinx_output_test", + srcs = ["sphinx_output_test.py"], + data = [":docs"], + deps = ["@dev_pip//absl_py"], +) diff --git a/sphinxdocs/tests/sphinx_stardoc/bzl_rule.bzl b/sphinxdocs/tests/sphinx_stardoc/bzl_rule.bzl index d17c8bc087..366e372cba 100644 --- a/sphinxdocs/tests/sphinx_stardoc/bzl_rule.bzl +++ b/sphinxdocs/tests/sphinx_stardoc/bzl_rule.bzl @@ -14,7 +14,7 @@ P2 = provider() def _impl(ctx): _ = ctx # @unused -my_rule = rule( +bzl_rule = rule( implementation = _impl, attrs = { "srcs": attr.label( diff --git a/sphinxdocs/tests/sphinx_stardoc/index.md b/sphinxdocs/tests/sphinx_stardoc/index.md index 4f70482e19..43ef14f55a 100644 --- a/sphinxdocs/tests/sphinx_stardoc/index.md +++ b/sphinxdocs/tests/sphinx_stardoc/index.md @@ -21,6 +21,6 @@ ibazel build //sphinxdocs/tests/sphinx_stardoc:docs :hidden: :glob: -* +** genindex ::: diff --git a/sphinxdocs/tests/sphinx_stardoc/sphinx_output_test.py b/sphinxdocs/tests/sphinx_stardoc/sphinx_output_test.py new file mode 100644 index 0000000000..6d65c920e1 --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/sphinx_output_test.py @@ -0,0 +1,73 @@ +import importlib.resources +from xml.etree import ElementTree + +from absl.testing import absltest, parameterized + +from sphinxdocs.tests import sphinx_stardoc + + +class SphinxOutputTest(parameterized.TestCase): + def setUp(self): + super().setUp() + self._docs = {} + self._xmls = {} + + def assert_xref(self, doc, *, text, href): + match = self._doc_element(doc).find(f".//*[.='{text}']") + if not match: + self.fail(f"No element found with {text=}") + actual = match.attrib.get("href", "") + self.assertEqual( + href, + actual, + msg=f"Unexpected href for {text=}: " + + ElementTree.tostring(match).decode("utf8"), + ) + + def _read_doc(self, doc): + doc += ".html" + if doc not in self._docs: + self._docs[doc] = ( + importlib.resources.files(sphinx_stardoc) + .joinpath("docs/_build/html") + .joinpath(doc) + .read_text() + ) + return self._docs[doc] + + def _doc_element(self, doc): + xml = self._read_doc(doc) + if doc not in self._xmls: + self._xmls[doc] = ElementTree.fromstring(xml) + return self._xmls[doc] + + @parameterized.named_parameters( + # fmt: off + ("short_func", "myfunc", "function.html#myfunc"), + ("short_func_arg", "myfunc.arg1", "function.html#myfunc.arg1"), + ("short_rule", "my_rule", "rule.html#my_rule"), + ("short_rule_attr", "my_rule.ra1", "rule.html#my_rule.ra1"), + ("short_provider", "LangInfo", "provider.html#LangInfo"), + ("short_tag_class", "myext.mytag", "module_extension.html#myext.mytag"), + ("full_norepo_func", "//lang:function.bzl%myfunc", "function.html#myfunc"), + ("full_norepo_func_arg", "//lang:function.bzl%myfunc.arg1", "function.html#myfunc.arg1"), + ("full_norepo_rule", "//lang:rule.bzl%my_rule", "rule.html#my_rule"), + ("full_norepo_rule_attr", "//lang:rule.bzl%my_rule.ra1", "rule.html#my_rule.ra1"), + ("full_norepo_provider", "//lang:provider.bzl%LangInfo", "provider.html#LangInfo"), + ("full_norepo_aspect", "//lang:aspect.bzl%myaspect", "aspect.html#myaspect"), + ("full_norepo_target", "//lang:relativetarget", "target.html#relativetarget"), + ("full_repo_func", "@testrepo//lang:function.bzl%myfunc", "function.html#myfunc"), + ("full_repo_func_arg", "@testrepo//lang:function.bzl%myfunc.arg1", "function.html#myfunc.arg1"), + ("full_repo_rule", "@testrepo//lang:rule.bzl%my_rule", "rule.html#my_rule"), + ("full_repo_rule_attr", "@testrepo//lang:rule.bzl%my_rule.ra1", "rule.html#my_rule.ra1"), + ("full_repo_provider", "@testrepo//lang:provider.bzl%LangInfo", "provider.html#LangInfo"), + ("full_repo_aspect", "@testrepo//lang:aspect.bzl%myaspect", "aspect.html#myaspect"), + ("full_repo_target", "@testrepo//lang:relativetarget", "target.html#relativetarget"), + # fmt: on + ) + def test_xrefs(self, text, href): + self.assert_xref("xrefs", text=text, href=href) + + +if __name__ == "__main__": + absltest.main() diff --git a/sphinxdocs/tests/sphinx_stardoc/xrefs.md b/sphinxdocs/tests/sphinx_stardoc/xrefs.md index 9eb7b8178b..83f6869a48 100644 --- a/sphinxdocs/tests/sphinx_stardoc/xrefs.md +++ b/sphinxdocs/tests/sphinx_stardoc/xrefs.md @@ -12,13 +12,14 @@ Various tests of cross referencing support * rule: {obj}`my_rule` * rule attr: {obj}`my_rule.ra1` * provider: {obj}`LangInfo` +* tag class: {obj}`myext.mytag` ## Fully qualified label without repo * function: {obj}`//lang:function.bzl%myfunc` * function arg: {obj}`//lang:function.bzl%myfunc.arg1` * rule: {obj}`//lang:rule.bzl%my_rule` -* function: {obj}`//lang:rule.bzl%my_rule.ra1` +* rule attr: {obj}`//lang:rule.bzl%my_rule.ra1` * provider: {obj}`//lang:provider.bzl%LangInfo` * aspect: {obj}`//lang:aspect.bzl%myaspect` * target: {obj}`//lang:relativetarget` @@ -33,22 +34,6 @@ Various tests of cross referencing support * aspect: {obj}`@testrepo//lang:aspect.bzl%myaspect` * target: {obj}`@testrepo//lang:relativetarget` -## Fully qualified dotted name with repo - -* function: {obj}`testrepo.lang.function.myfunc` -* function arg: {obj}`testrepo.lang.function.myfunc.arg1` -* rule: {obj}`testrepo.lang.rule.my_rule` -* function: {obj}`testrepo.lang.rule.my_rule.ra1` -* provider: {obj}`testrepo.lang.provider.LangInfo` - -## Fully qualified dotted name without repo - -* function: {obj}`lang.function.myfunc` -* function arg: {obj}`lang.function.myfunc.arg1` -* rule: {obj}`lang.rule.my_rule` -* rule attr: {obj}`lang.rule.my_rule.ra1` -* provider: {obj}`lang.provider.LangInfo` - ## Using origin keys * provider using `{type}`: {type}`"@rules_python//sphinxdocs/tests/sphinx_stardoc:bzl_rule.bzl%GenericInfo"` From 79df3c9077b12ccf7a8e73757c417c607a81f1d3 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Mon, 2 Sep 2024 23:06:31 -0700 Subject: [PATCH 179/345] docs: fix some doc warnings and xrefs (#2176) This fixes a few warnings Sphinx emits when processing docs * Fix py_console_script_binary reference in changelog * Remove `*` that doesn't match anything in index * Replace heading with rubric to remove warning about non-consecutive indent * Remove duplicate bzl:type role definition --- CHANGELOG.md | 3 +-- docs/api/index.md | 1 - docs/conf.py | 2 +- python/private/pypi/pip_repository.bzl | 4 +++- sphinxdocs/docs/sphinx-bzl.md | 26 ++++++++++---------------- 5 files changed, 15 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dcd8576b98..6a901bb236 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -767,8 +767,7 @@ Breaking changes: ### Added -* (bzlmod, entry_point) Added - [`py_console_script_binary`](./docs/py_console_script_binary.md), which +* (bzlmod, entry_point) Added {obj}`py_console_script_binary`, which allows adding custom dependencies to a package's entry points and customizing the `py_binary` rule used to build it. diff --git a/docs/api/index.md b/docs/api/index.md index 87e17e1a8f..0a5f1ed1a5 100644 --- a/docs/api/index.md +++ b/docs/api/index.md @@ -2,6 +2,5 @@ ```{toctree} :glob: -* */index ``` diff --git a/docs/conf.py b/docs/conf.py index ba628b6fc1..d65d5b51f0 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -59,7 +59,7 @@ autodoc2_docstring_parser_regexes = [ (".*", "myst"), ] - + # NOTE: The redirects generation will clobber existing files. redirects = { "api/tools/precompiler/index": "/api/rules_python/tools/precompiler/index.html", diff --git a/python/private/pypi/pip_repository.bzl b/python/private/pypi/pip_repository.bzl index 0c9e300a4d..90cda77465 100644 --- a/python/private/pypi/pip_repository.bzl +++ b/python/private/pypi/pip_repository.bzl @@ -326,7 +326,9 @@ alias( ) ``` -### Vendoring the requirements.bzl file +:::{rubric} Vendoring the requirements.bzl file +:heading-level: 3 +::: In some cases you may not want to generate the requirements.bzl file as a repository rule while Bazel is fetching dependencies. For example, if you produce a reusable Bazel module diff --git a/sphinxdocs/docs/sphinx-bzl.md b/sphinxdocs/docs/sphinx-bzl.md index 0edd3202b6..bb51b6cdc6 100644 --- a/sphinxdocs/docs/sphinx-bzl.md +++ b/sphinxdocs/docs/sphinx-bzl.md @@ -140,6 +140,16 @@ Refer to a target. :::{rst:role} bzl:type Refer to a type or type expression; can also be used in argument documentation. + +``` +def func(arg): + """Do stuff + + Args: + arg: {type}`int | str` the arg + """ + print(arg + 1) +``` ::: ## Special roles @@ -187,22 +197,6 @@ def func(): ``` ::: -:::{rst:role} bzl:type - -Indicates the type of an argument for a function. Use it in the Args doc of -a function. - -``` -def func(arg): - """Do stuff - - Args: - arg: {type}`int` - """ - print(arg + 1) -``` -::: - ## Directives Most directives are automatically generated by `sphinx_stardoc`. Here, we only From 56abb0183c7cb29c5ea2f02ae1325ca7db1eb4e1 Mon Sep 17 00:00:00 2001 From: Oleh Prypin Date: Wed, 4 Sep 2024 22:18:20 +0200 Subject: [PATCH 180/345] refactor(precompiler): give optimize/invalidation_mode flags default values (#2180) This allows one to actually run this script with *just* these flags: src, src_name, pyc Extra: refactor how the enum member is parsed --- tools/precompiler/precompiler.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/precompiler/precompiler.py b/tools/precompiler/precompiler.py index ae7339abfe..310f2eb097 100644 --- a/tools/precompiler/precompiler.py +++ b/tools/precompiler/precompiler.py @@ -24,8 +24,8 @@ def _create_parser() -> "argparse.Namespace": parser = argparse.ArgumentParser(fromfile_prefix_chars="@") - parser.add_argument("--invalidation_mode") - parser.add_argument("--optimize", type=int) + parser.add_argument("--invalidation_mode", default="CHECKED_HASH") + parser.add_argument("--optimize", type=int, default=-1) parser.add_argument("--python_version") parser.add_argument("--src", action="append", dest="srcs") @@ -40,10 +40,10 @@ def _create_parser() -> "argparse.Namespace": def _compile(options: "argparse.Namespace") -> None: try: - invalidation_mode = getattr( - py_compile.PycInvalidationMode, options.invalidation_mode.upper() - ) - except AttributeError as e: + invalidation_mode = py_compile.PycInvalidationMode[ + options.invalidation_mode.upper() + ] + except KeyError as e: raise ValueError( f"Unknown PycInvalidationMode: {options.invalidation_mode}" ) from e From 9081cdb936fdb7f15f80b6d043148ef849ea6ea7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Sep 2024 14:12:02 -0700 Subject: [PATCH 181/345] build(deps): bump sphinx from 7.4.7 to 8.0.2 in /docs (#2137) Bumps [sphinx](https://github.com/sphinx-doc/sphinx) from 7.4.7 to 8.0.2.
Release notes

Sourced from sphinx's releases.

Sphinx 8.0.2

Changelog: https://www.sphinx-doc.org/en/master/changes.html

Sphinx 8.0.1

Changelog: https://www.sphinx-doc.org/en/master/changes.html

Sphinx 8.0.0

Changelog: https://www.sphinx-doc.org/en/master/changes.html

Dependencies

  • #12633: Drop Python 3.9 support.

Incompatible changes

  • Remove deprecated functions from sphinx.util:

    • Removed sphinx.util.path_stabilize (use sphinx.util.osutil.path_stabilize).
    • Removed sphinx.util.display_chunk (use sphinx.util.display.display_chunk).
    • Removed sphinx.util.status_iterator (use sphinx.util.display.status_iterator).
    • Removed sphinx.util.SkipProgressMessage (use sphinx.util.display.SkipProgressMessage).
    • Removed sphinx.util.progress_message (use sphinx.util.display.progress_message).
    • Removed sphinx.util.epoch_to_rfc1123 (use sphinx.http_date.epoch_to_rfc1123).
    • Removed sphinx.util.rfc1123_to_epoch (use sphinx.http_date.rfc1123_to_epoch).
    • Removed sphinx.util.save_traceback (use sphinx.exceptions.save_traceback).
    • Removed sphinx.util.format_exception_cut_frames (use sphinx.exceptions.format_exception_cut_frames).
    • Removed sphinx.util.xmlname_checker (use sphinx.builders.epub3._XML_NAME_PATTERN).

    Patch by Adam Turner.

  • Removed sphinx.util.osutil.cd (use contextlib.chdir). Patch by Adam Turner.

  • Removed sphinx.util.typing.stringify (use sphinx.util.typing.stringify_annotation). Patch by Adam Turner.

  • #12593: Raise an error for invalid html_sidebars values. Patch by Adam Turner.

  • #12593: Raise an error in Theme.get_config for invalid sections.

... (truncated)

Changelog

Sourced from sphinx's changelog.

Release 8.0.2 (released Jul 30, 2024)

Bugs fixed

  • Fix the pygments.Formatter.__class_getitem__ patch. Patch by Adam Turner.

Release 8.0.1 (released Jul 30, 2024)

Bugs fixed

  • Patch pygments.Formatter.__class_getitem__ in Pygments 2.17. Patch by Adam Turner.

Release 8.0.0 (released Jul 29, 2024)

Dependencies

  • #12633: Drop Python 3.9 support.

Incompatible changes

.. rst-class:: compact

  • Remove deprecated functions from sphinx.util:

    • Removed sphinx.util.path_stabilize (use sphinx.util.osutil.path_stabilize).
    • Removed sphinx.util.display_chunk (use sphinx.util.display.display_chunk).
    • Removed sphinx.util.status_iterator (use sphinx.util.display.status_iterator).
    • Removed sphinx.util.SkipProgressMessage (use sphinx.util.display.SkipProgressMessage).
    • Removed sphinx.util.progress_message (use sphinx.util.display.progress_message).
    • Removed sphinx.util.epoch_to_rfc1123 (use sphinx.http_date.epoch_to_rfc1123).
    • Removed sphinx.util.rfc1123_to_epoch (use sphinx.http_date.rfc1123_to_epoch).
    • Removed sphinx.util.save_traceback (use sphinx.exceptions.save_traceback).
    • Removed sphinx.util.format_exception_cut_frames

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sphinx&package-manager=pip&previous-version=7.4.7&new-version=8.0.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index cedefa9474..5ecf73c3ec 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -299,9 +299,9 @@ snowballstemmer==2.2.0 \ --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 \ --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a # via sphinx -sphinx==7.4.7 \ - --hash=sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe \ - --hash=sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239 +sphinx==8.0.2 \ + --hash=sha256:0cce1ddcc4fd3532cf1dd283bc7d886758362c5c1de6598696579ce96d8ffa5b \ + --hash=sha256:56173572ae6c1b9a38911786e206a110c9749116745873feae4f9ce88e59391d # via # rules-python-docs (docs/pyproject.toml) # myst-parser From 7b99948aea3cd58c6ea9833cc85238515fefd5dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Sep 2024 14:12:21 -0700 Subject: [PATCH 182/345] build(deps): bump alabaster from 0.7.16 to 1.0.0 in /docs (#2138) Bumps [alabaster](https://github.com/sphinx-doc/alabaster) from 0.7.16 to 1.0.0.
Release notes

Sourced from alabaster's releases.

Alabaster 1.0.0

Changelog: https://alabaster.readthedocs.io/en/latest/changelog.html

Changelog

Sourced from alabaster's changelog.

:git_tag:1.0.0 -- 2024-07-26

  • Dropped support for Python 3.9 and earlier.
  • Dropped support for Sphinx 6.1 and earlier.
  • Use a new SVG image for the GitHub banner.
  • :feature:217 Use the new searchfield component for the search box. Patch by Tim Hoffmann.
  • :feature:104 Allow translating strings in relations.html.
  • :bug:125 Do not underline linked images. Patch by Joshua Bronson.
  • :bug:169 Do not ignore the Pygments background colour. Patch by Matthias Geier.
  • :bug:174 Fix clipping caused by incorrect CSS breakpoints.
Commits
  • fba58a4 Bump to 1.0.0
  • 7d5c318 Update project maintainers
  • d25c4bc List basic.css in theme.conf (#219)
  • 97235d1 Fix incorrect breakpoints that cause clipping around 875px (#174)
  • 5bb4411 Remove explicit width for search field input (#218)
  • 9fdb57c Update references to searchbox
  • a35a1df Don't ignore the Pygments background (#169)
  • 17e55e5 Fix for "Don't put an underline on linked images" (#125)
  • 73be878 Allow translations for strings in relations.html (#104)
  • eb522b8 Use searchfield instead of searchbox component in sidebar (#217)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=alabaster&package-manager=pip&previous-version=0.7.16&new-version=1.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 5ecf73c3ec..808d797e79 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -6,9 +6,9 @@ absl-py==2.1.0 \ --hash=sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308 \ --hash=sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff # via rules-python-docs (docs/pyproject.toml) -alabaster==0.7.16 \ - --hash=sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65 \ - --hash=sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92 +alabaster==1.0.0 \ + --hash=sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e \ + --hash=sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b # via sphinx astroid==3.3.2 \ --hash=sha256:99e9b5b602cbb005434084309213d6af32bf7a9b743c836749168b8e2b330cbd \ From 076fbc7e0f3ed8413b8119b29e6adae166f43ae1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?X=C3=B9d=C5=8Dng=20Y=C3=A1ng?= Date: Wed, 4 Sep 2024 21:59:53 -0400 Subject: [PATCH 183/345] build(bazelci): explicitly enable workspace where Bzlmod is disabled (#2184) Only do this for latest Bazel (--enable_workspace was only introduced in 7.1.0). Fixes https://github.com/bazelbuild/rules_python/issues/2175 --- .bazelci/presubmit.yml | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 43c52f4114..a1d5d2e0a1 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -38,11 +38,18 @@ buildifier: - "..." 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" .common_workspace_flags: &common_workspace_flags test_flags: - "--noenable_bzlmod" + - "--enable_workspace" build_flags: - "--noenable_bzlmod" + - "--enable_workspace" .common_bazelinbazel_config: &common_bazelinbazel_config build_flags: - "--build_tag_filters=integration-test" @@ -84,7 +91,7 @@ buildifier: - "--test_tag_filters=-integration-test,-doc_check_test" tasks: gazelle_extension_min: - <<: *common_workspace_flags + <<: *common_workspace_flags_min_bazel <<: *minimum_supported_version name: "Gazelle: workspace, minumum supported Bazel version" platform: ubuntu2004 @@ -108,7 +115,7 @@ tasks: ubuntu_min_workspace: <<: *minimum_supported_version <<: *reusable_config - <<: *common_workspace_flags + <<: *common_workspace_flags_min_bazel name: "Default: Ubuntu, workspace, minimum Bazel" platform: ubuntu2004 ubuntu_min_bzlmod: @@ -187,7 +194,7 @@ tasks: integration_test_build_file_generation_ubuntu_minimum_supported_workspace: <<: *minimum_supported_version <<: *reusable_build_test_all - <<: *common_workspace_flags + <<: *common_workspace_flags_min_bazel name: "examples/build_file_generation: Ubuntu, workspace, minimum Bazel" working_directory: examples/build_file_generation platform: ubuntu2004 @@ -325,7 +332,7 @@ tasks: integration_test_pip_parse_ubuntu_min_workspace: <<: *minimum_supported_version - <<: *common_workspace_flags + <<: *common_workspace_flags_min_bazel <<: *reusable_build_test_all name: "examples/pip_parse: Ubuntu, workspace, minimum supporte Bazel version" working_directory: examples/pip_parse @@ -359,7 +366,7 @@ tasks: integration_test_pip_parse_vendored_ubuntu_min_workspace: <<: *minimum_supported_version - <<: *common_workspace_flags + <<: *common_workspace_flags_min_bazel <<: *reusable_build_test_all name: "examples/pip_parse_vendored: Ubuntu, workspace, minimum Bazel" working_directory: examples/pip_parse_vendored @@ -538,7 +545,7 @@ tasks: integration_compile_pip_requirements_test_from_external_repo_ubuntu_min_workspace: <<: *minimum_supported_version - <<: *common_workspace_flags + <<: *common_workspace_flags_min_bazel name: "compile_pip_requirements_test_from_external_repo: Ubuntu, workspace, minimum Bazel" working_directory: tests/integration/compile_pip_requirements_test_from_external_repo platform: ubuntu2004 From fe1d9a706e542053128d6d540da1fc32926677fe Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 4 Sep 2024 19:00:33 -0700 Subject: [PATCH 184/345] doc: clarify the precompile attribute affects the local target (#2179) Also mention the pyc_collection attribute and precompiling guide to better guide users on how to use precompiling and use binary-level opt-in. --- python/private/common/attributes.bzl | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/python/private/common/attributes.bzl b/python/private/common/attributes.bzl index 1878284f3a..86687fa9b1 100644 --- a/python/private/common/attributes.bzl +++ b/python/private/common/attributes.bzl @@ -278,9 +278,7 @@ attribute. ), "precompile": attr.string( doc = """ -Whether py source files should be precompiled. - -See also: {flag}`--precompile` flag, which can override this attribute in some cases. +Whether py source files **for this target** should be precompiled. Values: @@ -291,6 +289,15 @@ Values: * `disabled`: Don't compile Python source files at build time. * `if_generated_source`: Compile Python source files, but only if they're a generated file. + +:::{seealso} + +* The {flag}`--precompile` flag, which can override this attribute in some cases + and will affect all targets when building. +* The {obj}`pyc_collection` attribute for transitively enabling precompiling on + a per-target basis. +* The [Precompiling](precompiling) docs for a guide about using precompiling. +::: """, default = PrecompileAttr.INHERIT, values = sorted(PrecompileAttr.__members__.values()), From 612baef1f14d1af89594f45559bc9c11a50d390a Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 4 Sep 2024 20:50:27 -0700 Subject: [PATCH 185/345] tests: move various supporting code under tests/support (#2183) tests: move various supporting code under tests/support * Move subject classes under support * Switch to using rules_testing DefaultInfo subject * Move fake cc toolchains under tests/support/cc_toolchains (these are used in several places, not just tests/cc) * Make literal references of old //tests/cc locations use the constants from support.bzl This is both for code clarity (support code being in a common location), but also to make it easier to import the support code for the subset of tests Google imports and runs. --- tests/base_rules/base_tests.bzl | 2 +- .../precompile/precompile_tests.bzl | 2 +- tests/base_rules/py_executable_base_tests.bzl | 10 +- tests/base_rules/py_test/py_test_tests.bzl | 15 +- tests/cc/BUILD.bazel | 137 ---------------- .../current_py_cc_headers_tests.bzl | 9 +- .../current_py_cc_libs_tests.bzl | 6 +- .../py_cc_toolchain/py_cc_toolchain_tests.bzl | 21 +-- .../transition/multi_version_tests.bzl | 3 +- tests/py_runtime/py_runtime_tests.bzl | 2 +- .../py_runtime_pair/py_runtime_pair_tests.bzl | 5 +- tests/runtime_env_toolchain/BUILD.bazel | 3 +- tests/{ => support}/cc_info_subject.bzl | 0 tests/support/cc_toolchains/BUILD.bazel | 150 ++++++++++++++++++ .../fake_cc_toolchain_config.bzl | 0 .../py_cc_toolchain_info_subject.bzl | 0 .../py_info_subject.bzl | 0 .../{ => support}/py_runtime_info_subject.bzl | 0 tests/support/sh_py_run_test.bzl | 2 +- tests/support/support.bzl | 3 +- 20 files changed, 188 insertions(+), 182 deletions(-) rename tests/{ => support}/cc_info_subject.bzl (100%) create mode 100644 tests/support/cc_toolchains/BUILD.bazel rename tests/{cc => support/cc_toolchains}/fake_cc_toolchain_config.bzl (100%) rename tests/{ => support}/py_cc_toolchain_info_subject.bzl (100%) rename tests/{base_rules => support}/py_info_subject.bzl (100%) rename tests/{ => support}/py_runtime_info_subject.bzl (100%) diff --git a/tests/base_rules/base_tests.bzl b/tests/base_rules/base_tests.bzl index fb95c15017..ae298edb4f 100644 --- a/tests/base_rules/base_tests.bzl +++ b/tests/base_rules/base_tests.bzl @@ -18,8 +18,8 @@ load("@rules_testing//lib:truth.bzl", "matching") load("@rules_testing//lib:util.bzl", "PREVENT_IMPLICIT_BUILDING_TAGS", rt_util = "util") load("//python:defs.bzl", "PyInfo") load("//python/private:reexports.bzl", "BuiltinPyInfo") # buildifier: disable=bzl-visibility -load("//tests/base_rules:py_info_subject.bzl", "py_info_subject") load("//tests/base_rules:util.bzl", pt_util = "util") +load("//tests/support:py_info_subject.bzl", "py_info_subject") _tests = [] diff --git a/tests/base_rules/precompile/precompile_tests.bzl b/tests/base_rules/precompile/precompile_tests.bzl index 5599f6101f..62659fcfbd 100644 --- a/tests/base_rules/precompile/precompile_tests.bzl +++ b/tests/base_rules/precompile/precompile_tests.bzl @@ -23,7 +23,7 @@ load("//python:py_binary.bzl", "py_binary") load("//python:py_info.bzl", "PyInfo") load("//python:py_library.bzl", "py_library") load("//python:py_test.bzl", "py_test") -load("//tests/base_rules:py_info_subject.bzl", "py_info_subject") +load("//tests/support:py_info_subject.bzl", "py_info_subject") load( "//tests/support:support.bzl", "CC_TOOLCHAIN", diff --git a/tests/base_rules/py_executable_base_tests.bzl b/tests/base_rules/py_executable_base_tests.bzl index 1f805cb153..873349f289 100644 --- a/tests/base_rules/py_executable_base_tests.bzl +++ b/tests/base_rules/py_executable_base_tests.bzl @@ -23,7 +23,7 @@ load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable load("//tests/base_rules:base_tests.bzl", "create_base_tests") load("//tests/base_rules:util.bzl", "WINDOWS_ATTR", pt_util = "util") load("//tests/support:py_executable_info_subject.bzl", "PyExecutableInfoSubject") -load("//tests/support:support.bzl", "LINUX_X86_64", "WINDOWS_X86_64") +load("//tests/support:support.bzl", "CC_TOOLCHAIN", "CROSSTOOL_TOP", "LINUX_X86_64", "WINDOWS_X86_64") _BuiltinPyRuntimeInfo = PyRuntimeInfo @@ -51,8 +51,8 @@ def _test_basic_windows(name, config): # platforms. "//command_line_option:build_python_zip": "true", "//command_line_option:cpu": "windows_x86_64", - "//command_line_option:crosstool_top": Label("//tests/cc:cc_toolchain_suite"), - "//command_line_option:extra_toolchains": [str(Label("//tests/cc:all"))], + "//command_line_option:crosstool_top": CROSSTOOL_TOP, + "//command_line_option:extra_toolchains": [CC_TOOLCHAIN], "//command_line_option:platforms": [WINDOWS_X86_64], }, attr_values = {"target_compatible_with": target_compatible_with}, @@ -96,8 +96,8 @@ def _test_basic_zip(name, config): # platforms. "//command_line_option:build_python_zip": "true", "//command_line_option:cpu": "linux_x86_64", - "//command_line_option:crosstool_top": Label("//tests/cc:cc_toolchain_suite"), - "//command_line_option:extra_toolchains": [str(Label("//tests/cc:all"))], + "//command_line_option:crosstool_top": CROSSTOOL_TOP, + "//command_line_option:extra_toolchains": [CC_TOOLCHAIN], "//command_line_option:platforms": [LINUX_X86_64], }, attr_values = {"target_compatible_with": target_compatible_with}, diff --git a/tests/base_rules/py_test/py_test_tests.bzl b/tests/base_rules/py_test/py_test_tests.bzl index c77bd7eb04..6bd31ed3f9 100644 --- a/tests/base_rules/py_test/py_test_tests.bzl +++ b/tests/base_rules/py_test/py_test_tests.bzl @@ -21,12 +21,7 @@ load( "create_executable_tests", ) load("//tests/base_rules:util.bzl", pt_util = "util") -load("//tests/support:support.bzl", "LINUX_X86_64", "MAC_X86_64") - -# Explicit Label() calls are required so that it resolves in @rules_python -# context instead of @rules_testing context. -_FAKE_CC_TOOLCHAIN = Label("//tests/cc:cc_toolchain_suite") -_FAKE_CC_TOOLCHAINS = [str(Label("//tests/cc:all"))] +load("//tests/support:support.bzl", "CC_TOOLCHAIN", "CROSSTOOL_TOP", "LINUX_X86_64", "MAC_X86_64") # The Windows CI currently runs as root, which breaks when # the analysis tests try to install (but not use, because @@ -63,8 +58,8 @@ def _test_mac_requires_darwin_for_execution(name, config): target = name + "_subject", config_settings = { "//command_line_option:cpu": "darwin_x86_64", - "//command_line_option:crosstool_top": _FAKE_CC_TOOLCHAIN, - "//command_line_option:extra_toolchains": _FAKE_CC_TOOLCHAINS, + "//command_line_option:crosstool_top": CROSSTOOL_TOP, + "//command_line_option:extra_toolchains": CC_TOOLCHAIN, "//command_line_option:platforms": [MAC_X86_64], }, attr_values = _SKIP_WINDOWS, @@ -96,8 +91,8 @@ def _test_non_mac_doesnt_require_darwin_for_execution(name, config): target = name + "_subject", config_settings = { "//command_line_option:cpu": "k8", - "//command_line_option:crosstool_top": _FAKE_CC_TOOLCHAIN, - "//command_line_option:extra_toolchains": _FAKE_CC_TOOLCHAINS, + "//command_line_option:crosstool_top": CROSSTOOL_TOP, + "//command_line_option:extra_toolchains": CC_TOOLCHAIN, "//command_line_option:platforms": [LINUX_X86_64], }, attr_values = _SKIP_WINDOWS, diff --git a/tests/cc/BUILD.bazel b/tests/cc/BUILD.bazel index 889f9e02d2..aa21042e25 100644 --- a/tests/cc/BUILD.bazel +++ b/tests/cc/BUILD.bazel @@ -11,140 +11,3 @@ # 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_cc//cc:defs.bzl", "cc_toolchain", "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") - -package(default_visibility = ["//:__subpackages__"]) - -exports_files(["fake_header.h"]) - -filegroup( - name = "libpython", - srcs = ["libpython-fake.so"], - tags = PREVENT_IMPLICIT_BUILDING_TAGS, -) - -toolchain( - name = "fake_py_cc_toolchain", - tags = PREVENT_IMPLICIT_BUILDING_TAGS, - toolchain = ":fake_py_cc_toolchain_impl", - toolchain_type = "@rules_python//python/cc:toolchain_type", -) - -py_cc_toolchain( - name = "fake_py_cc_toolchain_impl", - headers = ":fake_headers", - libs = ":fake_libs", - python_version = "3.999", - tags = PREVENT_IMPLICIT_BUILDING_TAGS, -) - -# buildifier: disable=native-cc -cc_library( - name = "fake_headers", - hdrs = ["fake_header.h"], - data = ["data.txt"], - includes = ["fake_include"], - tags = PREVENT_IMPLICIT_BUILDING_TAGS, -) - -# buildifier: disable=native-cc -cc_library( - name = "fake_libs", - srcs = ["libpython3.so"], - data = ["libdata.txt"], - tags = PREVENT_IMPLICIT_BUILDING_TAGS, -) - -cc_toolchain_suite( - name = "cc_toolchain_suite", - tags = ["manual"], - toolchains = { - "darwin_x86_64": ":mac_toolchain", - "k8": ":linux_toolchain", - "windows_x86_64": ":windows_toolchain", - }, -) - -filegroup(name = "empty") - -cc_toolchain( - name = "mac_toolchain", - all_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 0, - toolchain_config = ":mac_toolchain_config", - toolchain_identifier = "mac-toolchain", -) - -toolchain( - name = "mac_toolchain_definition", - target_compatible_with = ["@platforms//os:macos"], - toolchain = ":mac_toolchain", - toolchain_type = "@bazel_tools//tools/cpp:toolchain_type", -) - -fake_cc_toolchain_config( - name = "mac_toolchain_config", - target_cpu = "darwin_x86_64", - toolchain_identifier = "mac-toolchain", -) - -cc_toolchain( - name = "linux_toolchain", - all_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 0, - toolchain_config = ":linux_toolchain_config", - toolchain_identifier = "linux-toolchain", -) - -toolchain( - name = "linux_toolchain_definition", - target_compatible_with = ["@platforms//os:linux"], - toolchain = ":linux_toolchain", - toolchain_type = "@bazel_tools//tools/cpp:toolchain_type", -) - -fake_cc_toolchain_config( - name = "linux_toolchain_config", - target_cpu = "k8", - toolchain_identifier = "linux-toolchain", -) - -cc_toolchain( - name = "windows_toolchain", - all_files = ":empty", - compiler_files = ":empty", - dwp_files = ":empty", - linker_files = ":empty", - objcopy_files = ":empty", - strip_files = ":empty", - supports_param_files = 0, - toolchain_config = ":windows_toolchain_config", - toolchain_identifier = "windows-toolchain", -) - -toolchain( - name = "windows_toolchain_definition", - target_compatible_with = ["@platforms//os:windows"], - toolchain = ":windows_toolchain", - toolchain_type = "@bazel_tools//tools/cpp:toolchain_type", -) - -fake_cc_toolchain_config( - name = "windows_toolchain_config", - target_cpu = "windows_x86_64", - toolchain_identifier = "windows-toolchain", -) 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 9aeec38698..8bbdaceaf0 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 @@ -17,7 +17,8 @@ load("@rules_cc//cc:defs.bzl", "CcInfo") load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite") load("@rules_testing//lib:truth.bzl", "matching") -load("//tests:cc_info_subject.bzl", "cc_info_subject") +load("//tests/support:cc_info_subject.bzl", "cc_info_subject") +load("//tests/support:support.bzl", "CC_TOOLCHAIN") _tests = [] @@ -27,11 +28,11 @@ def _test_current_toolchain_headers(name): impl = _test_current_toolchain_headers_impl, target = "//python/cc:current_py_cc_headers", config_settings = { - "//command_line_option:extra_toolchains": [str(Label("//tests/cc:all"))], + "//command_line_option:extra_toolchains": [CC_TOOLCHAIN], }, attrs = { "header": attr.label( - default = "//tests/cc:fake_header.h", + default = "//tests/support/cc_toolchains:fake_header.h", allow_single_file = True, ), }, @@ -58,7 +59,7 @@ def _test_current_toolchain_headers_impl(env, target): # Check that the forward DefaultInfo looks correct env.expect.that_target(target).runfiles().contains_predicate( - matching.str_matches("*/cc/data.txt"), + matching.str_matches("*/cc_toolchains/data.txt"), ) _tests.append(_test_current_toolchain_headers) 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 44615eeb4b..4a08ce745e 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 @@ -17,7 +17,7 @@ load("@rules_cc//cc:defs.bzl", "CcInfo") load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite") load("@rules_testing//lib:truth.bzl", "matching") -load("//tests:cc_info_subject.bzl", "cc_info_subject") +load("//tests/support:cc_info_subject.bzl", "cc_info_subject") _tests = [] @@ -27,11 +27,11 @@ def _test_current_toolchain_libs(name): impl = _test_current_toolchain_libs_impl, target = "//python/cc:current_py_cc_libs", config_settings = { - "//command_line_option:extra_toolchains": [str(Label("//tests/cc:all"))], + "//command_line_option:extra_toolchains": [str(Label("//tests/support/cc_toolchains:all"))], }, attrs = { "lib": attr.label( - default = "//tests/cc:libpython", + default = "//tests/support/cc_toolchains:libpython", allow_single_file = True, ), }, diff --git a/tests/cc/py_cc_toolchain/py_cc_toolchain_tests.bzl b/tests/cc/py_cc_toolchain/py_cc_toolchain_tests.bzl index fe83bf2e2d..fcc520e291 100644 --- a/tests/cc/py_cc_toolchain/py_cc_toolchain_tests.bzl +++ b/tests/cc/py_cc_toolchain/py_cc_toolchain_tests.bzl @@ -16,9 +16,8 @@ load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite") load("@rules_testing//lib:truth.bzl", "matching", "subjects") -load("//tests:cc_info_subject.bzl", "cc_info_subject") -load("//tests:default_info_subject.bzl", "default_info_subject") -load("//tests:py_cc_toolchain_info_subject.bzl", "PyCcToolchainInfoSubject") +load("//tests/support:cc_info_subject.bzl", "cc_info_subject") +load("//tests/support:py_cc_toolchain_info_subject.bzl", "PyCcToolchainInfoSubject") _tests = [] @@ -26,10 +25,10 @@ def _py_cc_toolchain_test(name): analysis_test( name = name, impl = _py_cc_toolchain_test_impl, - target = "//tests/cc:fake_py_cc_toolchain_impl", + target = "//tests/support/cc_toolchains:fake_py_cc_toolchain_impl", attrs = { "header": attr.label( - default = "//tests/cc:fake_header.h", + default = "//tests/support/cc_toolchains:fake_header.h", allow_single_file = True, ), }, @@ -63,15 +62,9 @@ def _py_cc_toolchain_test_impl(env, target): matching.str_matches("*/fake_include"), ]) - # TODO: Once subjects.default_info is available, do - # default_info = headers_providers.get("DefaultInfo", factory=subjects.default_info) - # https://github.com/bazelbuild/rules_python/issues/1297 - default_info = default_info_subject( - headers_providers.get("DefaultInfo", factory = lambda v, meta: v), - meta = env.expect.meta.derive(expr = "default_info"), - ) + default_info = headers_providers.get("DefaultInfo", factory = subjects.default_info) default_info.runfiles().contains_predicate( - matching.str_matches("*/cc/data.txt"), + matching.str_matches("*/cc_toolchains/data.txt"), ) libs_providers = toolchain.libs().providers_map() @@ -82,7 +75,7 @@ def _py_cc_toolchain_test_impl(env, target): cc_info.linking_context().linker_inputs().has_size(2) default_info = libs_providers.get("DefaultInfo", factory = subjects.default_info) - default_info.runfiles().contains("{workspace}/tests/cc/libdata.txt") + default_info.runfiles().contains("{workspace}/tests/support/cc_toolchains/libdata.txt") default_info.runfiles().contains_predicate( matching.str_matches("/libpython3."), ) diff --git a/tests/config_settings/transition/multi_version_tests.bzl b/tests/config_settings/transition/multi_version_tests.bzl index 6659da574c..367837b3fb 100644 --- a/tests/config_settings/transition/multi_version_tests.bzl +++ b/tests/config_settings/transition/multi_version_tests.bzl @@ -20,6 +20,7 @@ load("//python:py_info.bzl", "PyInfo") load("//python/config_settings:transition.bzl", py_binary_transitioned = "py_binary", py_test_transitioned = "py_test") load("//python/private:reexports.bzl", "BuiltinPyInfo") # buildifier: disable=bzl-visibility load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility +load("//tests/support:support.bzl", "CC_TOOLCHAIN") # NOTE @aignas 2024-06-04: we are using here something that is registered in the MODULE.Bazel # and if you find tests failing, it could be because of the toolchain resolution issues here. @@ -87,7 +88,7 @@ def _setup_py_binary_windows(name, *, impl, build_python_zip): impl = impl, config_settings = { "//command_line_option:build_python_zip": build_python_zip, - "//command_line_option:extra_toolchains": "//tests/cc:all", + "//command_line_option:extra_toolchains": CC_TOOLCHAIN, "//command_line_option:platforms": str(Label("//tests/support:windows_x86_64")), }, ) diff --git a/tests/py_runtime/py_runtime_tests.bzl b/tests/py_runtime/py_runtime_tests.bzl index b47923d4ed..596cace4fc 100644 --- a/tests/py_runtime/py_runtime_tests.bzl +++ b/tests/py_runtime/py_runtime_tests.bzl @@ -20,8 +20,8 @@ load("@rules_testing//lib:truth.bzl", "matching") load("@rules_testing//lib:util.bzl", rt_util = "util") load("//python:py_runtime.bzl", "py_runtime") load("//python:py_runtime_info.bzl", "PyRuntimeInfo") -load("//tests:py_runtime_info_subject.bzl", "py_runtime_info_subject") load("//tests/base_rules:util.bzl", br_util = "util") +load("//tests/support:py_runtime_info_subject.bzl", "py_runtime_info_subject") _tests = [] diff --git a/tests/py_runtime_pair/py_runtime_pair_tests.bzl b/tests/py_runtime_pair/py_runtime_pair_tests.bzl index 236f1ba3a5..e89e080868 100644 --- a/tests/py_runtime_pair/py_runtime_pair_tests.bzl +++ b/tests/py_runtime_pair/py_runtime_pair_tests.bzl @@ -21,7 +21,8 @@ load("//python:py_binary.bzl", "py_binary") load("//python:py_runtime.bzl", "py_runtime") load("//python:py_runtime_pair.bzl", "py_runtime_pair") load("//python/private:reexports.bzl", "BuiltinPyRuntimeInfo") # buildifier: disable=bzl-visibility -load("//tests:py_runtime_info_subject.bzl", "py_runtime_info_subject") +load("//tests/support:py_runtime_info_subject.bzl", "py_runtime_info_subject") +load("//tests/support:support.bzl", "CC_TOOLCHAIN") def _toolchain_factory(value, meta): return subjects.struct( @@ -129,7 +130,7 @@ def _test_py_runtime_pair_and_binary(name): config_settings = { "//command_line_option:extra_toolchains": [ "//tests/py_runtime_pair:{}_toolchain".format(name), - "//tests/cc:all", + CC_TOOLCHAIN, ], }, ) diff --git a/tests/runtime_env_toolchain/BUILD.bazel b/tests/runtime_env_toolchain/BUILD.bazel index 99bdbab101..afc6b587f0 100644 --- a/tests/runtime_env_toolchain/BUILD.bazel +++ b/tests/runtime_env_toolchain/BUILD.bazel @@ -13,6 +13,7 @@ # limitations under the License. load("//tests/support:sh_py_run_test.bzl", "py_reconfig_test") +load("//tests/support:support.bzl", "CC_TOOLCHAIN") load(":runtime_env_toolchain_tests.bzl", "runtime_env_toolchain_test_suite") runtime_env_toolchain_test_suite(name = "runtime_env_toolchain_tests") @@ -26,7 +27,7 @@ py_reconfig_test( extra_toolchains = [ "//python/runtime_env_toolchains:all", # Necessary for RBE CI - "//tests/cc:all", + CC_TOOLCHAIN, ], main = "toolchain_runs_test.py", deps = ["//python/runfiles"], diff --git a/tests/cc_info_subject.bzl b/tests/support/cc_info_subject.bzl similarity index 100% rename from tests/cc_info_subject.bzl rename to tests/support/cc_info_subject.bzl diff --git a/tests/support/cc_toolchains/BUILD.bazel b/tests/support/cc_toolchains/BUILD.bazel new file mode 100644 index 0000000000..889f9e02d2 --- /dev/null +++ b/tests/support/cc_toolchains/BUILD.bazel @@ -0,0 +1,150 @@ +# 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. + +load("@rules_cc//cc:defs.bzl", "cc_toolchain", "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") + +package(default_visibility = ["//:__subpackages__"]) + +exports_files(["fake_header.h"]) + +filegroup( + name = "libpython", + srcs = ["libpython-fake.so"], + tags = PREVENT_IMPLICIT_BUILDING_TAGS, +) + +toolchain( + name = "fake_py_cc_toolchain", + tags = PREVENT_IMPLICIT_BUILDING_TAGS, + toolchain = ":fake_py_cc_toolchain_impl", + toolchain_type = "@rules_python//python/cc:toolchain_type", +) + +py_cc_toolchain( + name = "fake_py_cc_toolchain_impl", + headers = ":fake_headers", + libs = ":fake_libs", + python_version = "3.999", + tags = PREVENT_IMPLICIT_BUILDING_TAGS, +) + +# buildifier: disable=native-cc +cc_library( + name = "fake_headers", + hdrs = ["fake_header.h"], + data = ["data.txt"], + includes = ["fake_include"], + tags = PREVENT_IMPLICIT_BUILDING_TAGS, +) + +# buildifier: disable=native-cc +cc_library( + name = "fake_libs", + srcs = ["libpython3.so"], + data = ["libdata.txt"], + tags = PREVENT_IMPLICIT_BUILDING_TAGS, +) + +cc_toolchain_suite( + name = "cc_toolchain_suite", + tags = ["manual"], + toolchains = { + "darwin_x86_64": ":mac_toolchain", + "k8": ":linux_toolchain", + "windows_x86_64": ":windows_toolchain", + }, +) + +filegroup(name = "empty") + +cc_toolchain( + name = "mac_toolchain", + all_files = ":empty", + compiler_files = ":empty", + dwp_files = ":empty", + linker_files = ":empty", + objcopy_files = ":empty", + strip_files = ":empty", + supports_param_files = 0, + toolchain_config = ":mac_toolchain_config", + toolchain_identifier = "mac-toolchain", +) + +toolchain( + name = "mac_toolchain_definition", + target_compatible_with = ["@platforms//os:macos"], + toolchain = ":mac_toolchain", + toolchain_type = "@bazel_tools//tools/cpp:toolchain_type", +) + +fake_cc_toolchain_config( + name = "mac_toolchain_config", + target_cpu = "darwin_x86_64", + toolchain_identifier = "mac-toolchain", +) + +cc_toolchain( + name = "linux_toolchain", + all_files = ":empty", + compiler_files = ":empty", + dwp_files = ":empty", + linker_files = ":empty", + objcopy_files = ":empty", + strip_files = ":empty", + supports_param_files = 0, + toolchain_config = ":linux_toolchain_config", + toolchain_identifier = "linux-toolchain", +) + +toolchain( + name = "linux_toolchain_definition", + target_compatible_with = ["@platforms//os:linux"], + toolchain = ":linux_toolchain", + toolchain_type = "@bazel_tools//tools/cpp:toolchain_type", +) + +fake_cc_toolchain_config( + name = "linux_toolchain_config", + target_cpu = "k8", + toolchain_identifier = "linux-toolchain", +) + +cc_toolchain( + name = "windows_toolchain", + all_files = ":empty", + compiler_files = ":empty", + dwp_files = ":empty", + linker_files = ":empty", + objcopy_files = ":empty", + strip_files = ":empty", + supports_param_files = 0, + toolchain_config = ":windows_toolchain_config", + toolchain_identifier = "windows-toolchain", +) + +toolchain( + name = "windows_toolchain_definition", + target_compatible_with = ["@platforms//os:windows"], + toolchain = ":windows_toolchain", + toolchain_type = "@bazel_tools//tools/cpp:toolchain_type", +) + +fake_cc_toolchain_config( + name = "windows_toolchain_config", + target_cpu = "windows_x86_64", + toolchain_identifier = "windows-toolchain", +) diff --git a/tests/cc/fake_cc_toolchain_config.bzl b/tests/support/cc_toolchains/fake_cc_toolchain_config.bzl similarity index 100% rename from tests/cc/fake_cc_toolchain_config.bzl rename to tests/support/cc_toolchains/fake_cc_toolchain_config.bzl diff --git a/tests/py_cc_toolchain_info_subject.bzl b/tests/support/py_cc_toolchain_info_subject.bzl similarity index 100% rename from tests/py_cc_toolchain_info_subject.bzl rename to tests/support/py_cc_toolchain_info_subject.bzl diff --git a/tests/base_rules/py_info_subject.bzl b/tests/support/py_info_subject.bzl similarity index 100% rename from tests/base_rules/py_info_subject.bzl rename to tests/support/py_info_subject.bzl diff --git a/tests/py_runtime_info_subject.bzl b/tests/support/py_runtime_info_subject.bzl similarity index 100% rename from tests/py_runtime_info_subject.bzl rename to tests/support/py_runtime_info_subject.bzl diff --git a/tests/support/sh_py_run_test.bzl b/tests/support/sh_py_run_test.bzl index 455f64e49f..32df5b8caf 100644 --- a/tests/support/sh_py_run_test.bzl +++ b/tests/support/sh_py_run_test.bzl @@ -99,7 +99,7 @@ def _make_reconfig_rule(**kwargs): doc = """ Value for the --extra_toolchains flag. -NOTE: You'll likely have to also specify //tests/cc:all (or some CC toolchain) +NOTE: You'll likely have to also specify //tests/support/cc_toolchains:all (or some CC toolchain) to make the RBE presubmits happy, which disable auto-detection of a CC toolchain. """, diff --git a/tests/support/support.bzl b/tests/support/support.bzl index a74346d7b3..b7d8fa9fa6 100644 --- a/tests/support/support.bzl +++ b/tests/support/support.bzl @@ -27,7 +27,8 @@ WINDOWS = Label("//tests/support:windows") WINDOWS_X86_64 = Label("//tests/support:windows_x86_64") PLATFORM_TOOLCHAIN = str(Label("//tests/support:platform_toolchain")) -CC_TOOLCHAIN = str(Label("//tests/cc:all")) +CC_TOOLCHAIN = str(Label("//tests/support/cc_toolchains:all")) +CROSSTOOL_TOP = Label("//tests/support/cc_toolchains:cc_toolchain_suite") # str() around Label() is necessary because rules_testing's config_settings # doesn't accept yet Label objects. From 3fd5b8378faea1fb2926d9f49d695b14e4b472c8 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 5 Sep 2024 02:13:02 -0700 Subject: [PATCH 186/345] docs: add `testing.*` Bazel objects to Sphinx inventory and xref in docs (#2185) Also sorts the names in the inventory. --- python/private/py_exec_tools_info.bzl | 2 +- sphinxdocs/inventories/bazel_inventory.txt | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/python/private/py_exec_tools_info.bzl b/python/private/py_exec_tools_info.bzl index 2998543102..6fa4011e6b 100644 --- a/python/private/py_exec_tools_info.bzl +++ b/python/private/py_exec_tools_info.bzl @@ -48,7 +48,7 @@ when constructing the action invocation for running the precompiler program (typically `exec_interpreter`). See the `PyInterpreterProgramInfo` provider docs for details on how to construct an invocation. -If `testing.ExecutionInfo` is provided, it will be used to set execution +If {obj}`testing.ExecutionInfo` is provided, it will be used to set execution requirements. This can be used to control persistent worker settings. The precompiler command line API is: diff --git a/sphinxdocs/inventories/bazel_inventory.txt b/sphinxdocs/inventories/bazel_inventory.txt index 7cf772f6ad..b4182ea36c 100644 --- a/sphinxdocs/inventories/bazel_inventory.txt +++ b/sphinxdocs/inventories/bazel_inventory.txt @@ -3,9 +3,17 @@ # Version: 7.3.0 # The remainder of this file is compressed using zlib Action bzl:type 1 rules/lib/Action - +ExecutionInfo bzl:type 1 rules/lib/providers/ExecutionInfo - File bzl:type 1 rules/lib/File - Label bzl:type 1 rules/lib/Label - +RunEnvironmentInfo bzl:type 1 rules/lib/providers/RunEnvironmentInfo - Target bzl:type 1 rules/lib/builtins/Target - +attr.bool bzl:type 1 rules/lib/toplevel/attr#bool - +attr.int bzl:type 1 rules/lib/toplevel/attr#int - +attr.label bzl:type 1 rules/lib/toplevel/attr#label - +attr.label_list bzl:type 1 rules/lib/toplevel/attr#label_list - +attr.string bzl:type 1 rules/lib/toplevel/attr#string - +attr.string_list bzl:type 1 rules/lib/toplevel/attr#string_list - bool bzl:type 1 rules/lib/bool - callable bzl:type 1 rules/lib/core/function - config_common.FeatureFlagInfo bzl:type 1 rules/lib/toplevel/config_common#FeatureFlagInfo - @@ -48,12 +56,6 @@ int bzl:type 1 rules/lib/int - depset bzl:type 1 rules/lib/depset - dict bzl:type 1 rules/lib/dict - label bzl:type 1 concepts/labels - -attr.bool bzl:type 1 rules/lib/toplevel/attr#bool - -attr.int bzl:type 1 rules/lib/toplevel/attr#int - -attr.label bzl:type 1 rules/lib/toplevel/attr#label - -attr.label_list bzl:type 1 rules/lib/toplevel/attr#label_list - -attr.string bzl:type 1 rules/lib/toplevel/attr#string - -attr.string_list bzl:type 1 rules/lib/toplevel/attr#string_list - list bzl:type 1 rules/lib/list - native.existing_rule bzl:function 1 rules/lib/toplevel/native#existing_rule - native.existing_rules bzl:function 1 rules/lib/toplevel/native#existing_rules - @@ -75,6 +77,10 @@ runfiles.root_symlinks bzl:type 1 rules/lib/builtins/runfiles#root_symlinks - runfiles.symlinks bzl:type 1 rules/lib/builtins/runfiles#symlinks - str bzl:type 1 rules/lib/string - struct bzl:type 1 rules/lib/builtins/struct - +testing bzl:obj 1 rules/lib/toplevel/testing - +testing.analysis_test bzl:rule 1 rules/lib/toplevel/testing#analysis_test - +testing.ExecutionInfo bzl:function 1 rules/lib/toplevel/testing#ExecutionInfo - +testing.TestEnvironment bzl:function 1 rules/lib/toplevel/testing#TestEnvironment - toolchain_type bzl:type 1 ules/lib/builtins/toolchain_type.html - Name bzl:type 1 concepts/labels#target-names - CcInfo bzl:provider 1 rules/lib/providers/CcInfo - From 65d132671e89b09e9eb8624a15d2a5d1b481c2ab Mon Sep 17 00:00:00 2001 From: Steven Casagrande Date: Thu, 5 Sep 2024 13:13:46 -0400 Subject: [PATCH 187/345] fix: make bootstrap_impl=script compute correct directory when RUNFILES_MANIFEST_FILE set (#2177) The script-based bootstrap wasn't computing the correct runfiles directory when `RUNFILES_MANIFEST_FILE` was set. The path it computed stripped off the manifest file name, but didn't re-add the `.runfiles` suffix to point to the runfiles directory. To fix, just re-append the `.runfiles` suffix after it removes the manifest file name portion of the path. Reproducing this is a bit tricky and it's difficult to reproduce the necessary build flags in a test; all of the following must be met: * `--enable_runfiles=false`, but this cannot be set by transitions, only via command line * `--build_runfile_manifests=true` (this can be set in a transition, but see below) * Due to https://github.com/bazelbuild/bazel/issues/7994, even if a manifest is created, the RUNFILES_MANIFEST_FILE env var won't be set _unless_ the test strategy is local (i.e. not sandboxed, which is the default). To work around those issues, the test just recreates the necessary envvar state and invokes the binary. The underlying files may not exist, but that's OK for the code paths were testing. Fixes https://github.com/bazelbuild/rules_python/issues/2186 --------- Co-authored-by: Richard Levasseur --- CHANGELOG.md | 5 ++ python/private/stage1_bootstrap_template.sh | 5 +- .../bootstrap_impls/run_binary_zip_no_test.sh | 51 +++++++++++++++---- 3 files changed, 48 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a901bb236..e468e2bd91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,11 @@ A brief description of the categories of changes: stage2 bootstrap template. * (bzlmod) Properly handle relative path URLs in parse_simpleapi_html.bzl * (gazelle) Correctly resolve deps that have top-level module overlap with a gazelle_python.yaml dep module +* (rules) Make `RUNFILES_MANIFEST_FILE`-based invocations work when used with + {obj}`--bootstrap_impl=script`. This fixes invocations using non-sandboxed + test execution with `--enable_runfiles=false --build_runfile_manifests=true`. + ([#2186](https://github.com/bazelbuild/rules_python/issues/2186)). + ### Added * (rules) Executables provide {obj}`PyExecutableInfo`, which contains diff --git a/python/private/stage1_bootstrap_template.sh b/python/private/stage1_bootstrap_template.sh index 959e7babe6..e7e418cafb 100644 --- a/python/private/stage1_bootstrap_template.sh +++ b/python/private/stage1_bootstrap_template.sh @@ -44,10 +44,10 @@ else echo "$RUNFILES_DIR" return 0 elif [[ "${RUNFILES_MANIFEST_FILE:-}" = *".runfiles_manifest" ]]; then - echo "${RUNFILES_MANIFEST_FILE%%.runfiles_manifest}" + echo "${RUNFILES_MANIFEST_FILE%%.runfiles_manifest}.runfiles" return 0 elif [[ "${RUNFILES_MANIFEST_FILE:-}" = *".runfiles/MANIFEST" ]]; then - echo "${RUNFILES_MANIFEST_FILE%%.runfiles/MANIFEST}" + echo "${RUNFILES_MANIFEST_FILE%%.runfiles/MANIFEST}.runfiles" return 0 fi @@ -57,7 +57,6 @@ else if [[ "$stub_filename" != /* ]]; then stub_filename="$PWD/$stub_filename" fi - while true; do module_space="${stub_filename}.runfiles" if [[ -d "$module_space" ]]; then diff --git a/tests/bootstrap_impls/run_binary_zip_no_test.sh b/tests/bootstrap_impls/run_binary_zip_no_test.sh index 2ee69f3f66..c45cae54cd 100755 --- a/tests/bootstrap_impls/run_binary_zip_no_test.sh +++ b/tests/bootstrap_impls/run_binary_zip_no_test.sh @@ -29,15 +29,46 @@ if [[ -z "$bin" ]]; then echo "Unable to locate test binary: $BIN_RLOCATION" exit 1 fi -actual=$($bin 2>&1) - -# How we detect if a zip file was executed from depends on which bootstrap -# is used. -# bootstrap_impl=script outputs RULES_PYTHON_ZIP_DIR= -# bootstrap_impl=system_python outputs file:.*Bazel.runfiles -expected_pattern="Hello" -if ! (echo "$actual" | grep "$expected_pattern" ) >/dev/null; then - echo "expected output to match: $expected_pattern" - echo "but got:\n$actual" + +function test_invocation() { + actual=$($bin) + # How we detect if a zip file was executed from depends on which bootstrap + # is used. + # bootstrap_impl=script outputs RULES_PYTHON_ZIP_DIR= + # bootstrap_impl=system_python outputs file:.*Bazel.runfiles + expected_pattern="Hello" + if ! (echo "$actual" | grep "$expected_pattern" ) >/dev/null; then + echo "Test case failed: $1" + echo "expected output to match: $expected_pattern" + echo "but got:\n$actual" + exit 1 + fi +} + +# Test invocation with RUNFILES_DIR set +unset RUNFILES_MANIFEST_FILE +if [[ ! -e "$RUNFILES_DIR" ]]; then + echo "Runfiles doesn't exist: $RUNFILES_DIR" exit 1 fi +test_invocation "using RUNFILES_DIR" + + +orig_runfiles_dir="$RUNFILES_DIR" +unset RUNFILES_DIR + +# Test invocation using manifest within runfiles directory (output manifest) +# NOTE: this file may not actually exist in our test, but that's OK; the +# bootstrap just uses the path to find the runfiles directory. +export RUNFILES_MANIFEST_FILE="$orig_runfiles_dir/MANIFEST" +test_invocation "using RUNFILES_MANIFEST_FILE with output manifest" + +# Test invocation using manifest outside runfiles (input manifest) +# NOTE: this file may not actually exist in our test, but that's OK; the +# bootstrap just uses the path to find the runfiles directory. +export RUNFILES_MANIFEST_FILE="${orig_runfiles_dir%%.runfiles}.runfiles_manifest" +test_invocation "using RUNFILES_MANIFEST_FILE with input manifest" + +# Test invocation without any runfiles env vars set +unset RUNFILES_MANIFEST_FILE +test_invocation "using no runfiles env vars" From 42484670fd2af1a6cacccc2d60b512d1ee7fc1ea Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 5 Sep 2024 18:22:46 -0700 Subject: [PATCH 188/345] cleanup: remove commented out debug statement in precompile tests (#2191) This is a stray commented out line that was left over from debugging. --- tests/base_rules/precompile/precompile_tests.bzl | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/base_rules/precompile/precompile_tests.bzl b/tests/base_rules/precompile/precompile_tests.bzl index 62659fcfbd..508160a627 100644 --- a/tests/base_rules/precompile/precompile_tests.bzl +++ b/tests/base_rules/precompile/precompile_tests.bzl @@ -302,7 +302,6 @@ def _test_precompiler_action(name): _tests.append(_test_precompiler_action) def _test_precompiler_action_impl(env, target): - #env.expect.that_target(target).runfiles().contains_exactly([]) action = env.expect.that_target(target).action_named("PyCompile") action.contains_flag_values([ ("--optimize", "2"), From c46ee9240a483c41c53db8dc6f7acae4e4475827 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 5 Sep 2024 18:29:41 -0700 Subject: [PATCH 189/345] fix: allow detecting if `--precompile_source_retention` was specified on the command line (#2192) This defaults the `--precompile_source_retention` flag to a new value, `auto`. The effective default remains the same (`keep_source`). Having a separate value as the default allows detecting if the value was specified on the command line, which allows distinguishing between "pick for me" vs "I specifically want this behavior". --- docs/api/rules_python/python/config_settings/index.md | 8 +++++++- python/config_settings/BUILD.bazel | 2 +- python/private/common/attributes.bzl | 4 ++-- python/private/flags.bzl | 9 +++++++++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/docs/api/rules_python/python/config_settings/index.md b/docs/api/rules_python/python/config_settings/index.md index 2a2b39c53a..e102baaa5b 100644 --- a/docs/api/rules_python/python/config_settings/index.md +++ b/docs/api/rules_python/python/config_settings/index.md @@ -36,7 +36,7 @@ except for the case of `force_enabled` and `forced_disabled`. Values: -* `auto`: Automatically decide the effective value based on environment, +* `auto`: (default) Automatically decide the effective value based on environment, target platform, etc. * `enabled`: Compile Python source files at build time. Note that {bzl:obj}`--precompile_add_to_runfiles` affects how the compiled files are included into @@ -65,12 +65,18 @@ attribute. Values: +* `auto`: (default) Automatically decide the effective value based on environment, + target platform, etc. * `keep_source`: Include the original Python source. * `omit_source`: Don't include the orignal py source. * `omit_if_generated_source`: Keep the original source if it's a regular source file, but omit it if it's a generated file. + :::{versionadded} 0.33.0 ::: +:::{versionadded} 0.36.0 +The `auto` value +::: :::: ::::{bzl:flag} precompile_add_to_runfiles diff --git a/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel index f2383d6056..20bc50660a 100644 --- a/python/config_settings/BUILD.bazel +++ b/python/config_settings/BUILD.bazel @@ -58,7 +58,7 @@ string_flag( string_flag( name = "precompile_source_retention", - build_setting_default = PrecompileSourceRetentionFlag.KEEP_SOURCE, + build_setting_default = PrecompileSourceRetentionFlag.AUTO, values = sorted(PrecompileSourceRetentionFlag.__members__.values()), # NOTE: Only public because it's an implicit dependency visibility = ["//visibility:public"], diff --git a/python/private/common/attributes.bzl b/python/private/common/attributes.bzl index 86687fa9b1..90a53328a7 100644 --- a/python/private/common/attributes.bzl +++ b/python/private/common/attributes.bzl @@ -16,7 +16,7 @@ load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("@rules_cc//cc:defs.bzl", "CcInfo") load("//python/private:enum.bzl", "enum") -load("//python/private:flags.bzl", "PrecompileFlag") +load("//python/private:flags.bzl", "PrecompileFlag", "PrecompileSourceRetentionFlag") load("//python/private:reexports.bzl", "BuiltinPyInfo") load(":common.bzl", "union_attrs") load(":providers.bzl", "PyInfo") @@ -85,7 +85,7 @@ PrecompileInvalidationModeAttr = enum( def _precompile_source_retention_get_effective_value(ctx): attr_value = ctx.attr.precompile_source_retention if attr_value == PrecompileSourceRetentionAttr.INHERIT: - attr_value = ctx.attr._precompile_source_retention_flag[BuildSettingInfo].value + attr_value = PrecompileSourceRetentionFlag.get_effective_value(ctx) if attr_value not in ( PrecompileSourceRetentionAttr.KEEP_SOURCE, diff --git a/python/private/flags.bzl b/python/private/flags.bzl index fa31262c94..652e117221 100644 --- a/python/private/flags.bzl +++ b/python/private/flags.bzl @@ -74,10 +74,18 @@ PrecompileFlag = enum( get_effective_value = _precompile_flag_get_effective_value, ) +def _precompile_source_retention_flag_get_effective_value(ctx): + value = ctx.attr._precompile_source_retention_flag[BuildSettingInfo].value + if value == PrecompileSourceRetentionFlag.AUTO: + value = PrecompileSourceRetentionFlag.KEEP_SOURCE + return value + # Determines if, when a source file is compiled, if the source file is kept # in the resulting output or not. # buildifier: disable=name-conventions PrecompileSourceRetentionFlag = enum( + # Automatically decide the effective value based on environment, etc. + AUTO = "auto", # Include the original py source in the output. KEEP_SOURCE = "keep_source", # Don't include the original py source. @@ -85,6 +93,7 @@ PrecompileSourceRetentionFlag = enum( # Keep the original py source if it's a regular source file, but omit it # if it's a generated file. OMIT_IF_GENERATED_SOURCE = "omit_if_generated_source", + get_effective_value = _precompile_source_retention_flag_get_effective_value, ) # Determines if a target adds its compiled files to its runfiles. When a target From acc4cefa54661c4f121fc7ebaab6a80c64864c8f Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 6 Sep 2024 11:00:49 +0900 Subject: [PATCH 190/345] docs: add module_ctx, repository_ctx and path for xref support (#2188) And sort the list again - used `nvim` `:sort` after selecting all attributes. --- sphinxdocs/inventories/bazel_inventory.txt | 62 +++++++++++++++++++--- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/sphinxdocs/inventories/bazel_inventory.txt b/sphinxdocs/inventories/bazel_inventory.txt index b4182ea36c..ee507d1ccc 100644 --- a/sphinxdocs/inventories/bazel_inventory.txt +++ b/sphinxdocs/inventories/bazel_inventory.txt @@ -3,11 +3,15 @@ # Version: 7.3.0 # The remainder of this file is compressed using zlib Action bzl:type 1 rules/lib/Action - +CcInfo bzl:provider 1 rules/lib/providers/CcInfo - +CcInfo.linking_context bzl:provider-field 1 rules/lib/providers/CcInfo#linking_context - ExecutionInfo bzl:type 1 rules/lib/providers/ExecutionInfo - File bzl:type 1 rules/lib/File - Label bzl:type 1 rules/lib/Label - +Name bzl:type 1 concepts/labels#target-names - RunEnvironmentInfo bzl:type 1 rules/lib/providers/RunEnvironmentInfo - Target bzl:type 1 rules/lib/builtins/Target - +ToolchainInfo bzl:type 1 rules/lib/providers/ToolchainInfo.html - attr.bool bzl:type 1 rules/lib/toplevel/attr#bool - attr.int bzl:type 1 rules/lib/toplevel/attr#int - attr.label bzl:type 1 rules/lib/toplevel/attr#label - @@ -52,11 +56,28 @@ ctx.toolchains bzl:obj 1 rules/lib/builtins/ctx#toolchains - ctx.var bzl:obj 1 rules/lib/builtins/ctx#var - ctx.version_file bzl:obj 1 rules/lib/builtins/ctx#version_file - ctx.workspace_name bzl:obj 1 rules/lib/builtins/ctx#workspace_name - -int bzl:type 1 rules/lib/int - depset bzl:type 1 rules/lib/depset - dict bzl:type 1 rules/lib/dict - +int bzl:type 1 rules/lib/int - label bzl:type 1 concepts/labels - list bzl:type 1 rules/lib/list - +module_ctx bzl:type 1 rules/lib/builtins/module_ctx - +module_ctx.download bzl:function 1 rules/lib/builtins/module_ctx#download - +module_ctx.download_and_extract bzl:function 1 rules/lib/builtins/module_ctx#download_and_extract - +module_ctx.execute bzl:function 1 rules/lib/builtins/module_ctx#execute - +module_ctx.extension_metadata bzl:function 1 rules/lib/builtins/module_ctx#extension_metadata - +module_ctx.extract bzl:function 1 rules/lib/builtins/module_ctx#extract - +module_ctx.file bzl:function 1 rules/lib/builtins/module_ctx#file - +module_ctx.getenv bzl:function 1 rules/lib/builtins/module_ctx#getenv - +module_ctx.is_dev_dependency bzl:obj 1 rules/lib/builtins/module_ctx#is_dev_dependency - +module_ctx.modules bzl:obj 1 rules/lib/builtins/module_ctx#modules - +module_ctx.os bzl:obj 1 rules/lib/builtins/module_ctx#os - +module_ctx.path bzl:function 1 rules/lib/builtins/module_ctx#path - +module_ctx.read bzl:function 1 rules/lib/builtins/module_ctx#read - +module_ctx.report_progress bzl:function 1 rules/lib/builtins/module_ctx#report_progress - +module_ctx.root_module_has_non_dev_dependency bzl:function 1 rules/lib/builtins/module_ctx#root_module_has_non_dev_dependency - +module_ctx.watch bzl:function 1 rules/lib/builtins/module_ctx#watch - +module_ctx.which bzl:function 1 rules/lib/builtins/module_ctx#which - native.existing_rule bzl:function 1 rules/lib/toplevel/native#existing_rule - native.existing_rules bzl:function 1 rules/lib/toplevel/native#existing_rules - native.exports_files bzl:function 1 rules/lib/toplevel/native#exports_files - @@ -68,6 +89,39 @@ native.package_name bzl:function 1 rules/lib/toplevel/native#package_name - native.package_relative_label bzl:function 1 rules/lib/toplevel/native#package_relative_label - native.repo_name bzl:function 1 rules/lib/toplevel/native#repo_name - native.repository_name bzl:function 1 rules/lib/toplevel/native#repository_name - +path bzl:type 1 rules/lib/builtins/path - +path.basename bzl:obj 1 rules/lib/builtins/path#basename +path.dirname bzl:obj 1 rules/lib/builtins/path#dirname +path.exists bzl:obj 1 rules/lib/builtins/path#exists +path.get_child bzl:function 1 rules/lib/builtins/path#get_child +path.is_dir bzl:obj 1 rules/lib/builtins/path#is_dir +path.readdir bzl:function 1 rules/lib/builtins/path#readdir +path.realpath bzl:obj 1 rules/lib/builtins/path#realpath +repository_ctx bzl:type 1 rules/lib/builtins/repository_ctx - +repository_ctx.attr bzl:obj 1 rules/lib/builtins/repository_ctx#attr +repository_ctx.delete bzl:function 1 rules/lib/builtins/repository_ctx#delete +repository_ctx.download bzl:function 1 rules/lib/builtins/repository_ctx#download +repository_ctx.download_and_extract bzl:function 1 rules/lib/builtins/repository_ctx#download_and_extract +repository_ctx.execute bzl:function 1 rules/lib/builtins/repository_ctx#execute +repository_ctx.extract bzl:function 1 rules/lib/builtins/repository_ctx#extract +repository_ctx.file bzl:function 1 rules/lib/builtins/repository_ctx#file +repository_ctx.getenv bzl:function 1 rules/lib/builtins/repository_ctx#getenv +repository_ctx.name bzl:obj 1 rules/lib/builtins/repository_ctx#name +repository_ctx.os bzl:obj 1 rules/lib/builtins/repository_ctx#os +repository_ctx.patch bzl:function 1 rules/lib/builtins/repository_ctx#patch +repository_ctx.path bzl:obj 1 rules/lib/builtins/repository_ctx#path +repository_ctx.read bzl:function 1 rules/lib/builtins/repository_ctx#read +repository_ctx.report_progress bzl:function 1 rules/lib/builtins/repository_ctx#report_progress +repository_ctx.symlink bzl:function 1 rules/lib/builtins/repository_ctx#symlink +repository_ctx.template bzl:function 1 rules/lib/builtins/repository_ctx#template +repository_ctx.watch bzl:function 1 rules/lib/builtins/repository_ctx#watch +repository_ctx.watch_tree bzl:function 1 rules/lib/builtins/repository_ctx#watch_tree +repository_ctx.which bzl:function 1 rules/lib/builtins/repository_ctx#which +repository_ctx.workspace_root bzl:obj 1 rules/lib/builtins/repository_ctx#workspace_root +repository_os bzl:type 1 rules/lib/builtins/repository_os - +repository_os.arch bzl:obj 1 rules/lib/builtins/repository_os#arch +repository_os.environ bzl:obj 1 rules/lib/builtins/repository_os#environ +repository_os.name bzl:obj 1 rules/lib/builtins/repository_os#name runfiles bzl:type 1 rules/lib/builtins/runfiles - runfiles.empty_filenames bzl:type 1 rules/lib/builtins/runfiles#empty_filenames - runfiles.files bzl:type 1 rules/lib/builtins/runfiles#files - @@ -78,11 +132,7 @@ runfiles.symlinks bzl:type 1 rules/lib/builtins/runfiles#symlinks - str bzl:type 1 rules/lib/string - struct bzl:type 1 rules/lib/builtins/struct - testing bzl:obj 1 rules/lib/toplevel/testing - -testing.analysis_test bzl:rule 1 rules/lib/toplevel/testing#analysis_test - testing.ExecutionInfo bzl:function 1 rules/lib/toplevel/testing#ExecutionInfo - testing.TestEnvironment bzl:function 1 rules/lib/toplevel/testing#TestEnvironment - +testing.analysis_test bzl:rule 1 rules/lib/toplevel/testing#analysis_test - toolchain_type bzl:type 1 ules/lib/builtins/toolchain_type.html - -Name bzl:type 1 concepts/labels#target-names - -CcInfo bzl:provider 1 rules/lib/providers/CcInfo - -CcInfo.linking_context bzl:provider-field 1 rules/lib/providers/CcInfo#linking_context - -ToolchainInfo bzl:type 1 rules/lib/providers/ToolchainInfo.html - From 53f7407bdfd0e02c9f048a9e83f6acf0c9549099 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 6 Sep 2024 11:25:08 +0900 Subject: [PATCH 191/345] chore: cleanup exposed python_repository symbols and add docs (#2189) The bazel inventory for this sphinxdocs is in #2188. Removed the things that are definitely not used and the rest of the symbols can be left until we become bzlmod only - they do not require much maintenance. --- CHANGELOG.md | 5 ++- docs/BUILD.bazel | 1 + examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/BUILD.bazel | 1 + python/private/python_repositories.bzl | 51 +++++++++++++------------- python/repositories.bzl | 7 ++-- 6 files changed, 37 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e468e2bd91..bd94003bb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,9 +56,12 @@ A brief description of the categories of changes: or deriving a new one from the original. * (py_wheel) Removed use of bash to avoid failures on Windows machines which do not have it installed. +* (docs) Automatically generated documentation for {bzl:obj}`python_register_toolchains` + and related symbols. ### Removed -* Nothing yet +* (toolchains): Removed accidentally exposed `http_archive` symbol from + `python/repositories.bzl`. ## [0.35.0] - 2024-08-15 diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index f7f226ae0e..e211c13344 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -89,6 +89,7 @@ sphinx_stardocs( "//python:py_runtime_bzl", "//python:py_runtime_info_bzl", "//python:py_test_bzl", + "//python:repositories_bzl", "//python/cc:py_cc_toolchain_info_bzl", "//python/entry_points:py_console_script_binary_bzl", "//python/private:py_exec_tools_info_bzl", diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 8d02256e95..df0c96d6ca 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1231,7 +1231,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "9hiLCuWaaaU7Q+l2ONVr1A0NcG1JfSihv1UYeA1SpNY=", + "bzlTransitiveDigest": "NoDlhLqt5TG5tTcsLeBN6mnecYE+w8R4pvOKOF0ctC4=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6140,7 +6140,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "VoK/T0JkBdcomCHnDIYkX+stkywdxrh1MVM16e8D4sE=", + "bzlTransitiveDigest": "sh8kec0fTFOgrFmLOXLvQRfq+2g3Uv7rF0gj5xqnzKQ=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 8ddcc09df2..252606c0ff 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -310,6 +310,7 @@ bzl_library( srcs = ["toolchains_repo.bzl"], deps = [ ":repo_utils_bzl", + ":text_util_bzl", "//python:versions_bzl", ], ) diff --git a/python/private/python_repositories.bzl b/python/private/python_repositories.bzl index 25d8a96b79..8675399699 100644 --- a/python/private/python_repositories.bzl +++ b/python/private/python_repositories.bzl @@ -80,12 +80,12 @@ def is_standalone_interpreter(rctx, python_interpreter_path, *, logger = None): """Query a python interpreter target for whether or not it's a rules_rust provided toolchain Args: - rctx (repository_ctx): The repository rule's context object. - python_interpreter_path (path): A path representing the interpreter. + rctx: {type}`repository_ctx` The repository rule's context object. + python_interpreter_path: {type}`path` A path representing the interpreter. logger: Optional logger to use for operations. Returns: - bool: Whether or not the target is from a rules_python generated toolchain. + {type}`bool` Whether or not the target is from a rules_python generated toolchain. """ # Only update the location when using a hermetic toolchain. @@ -563,35 +563,35 @@ For more information see the official bazel docs def python_register_toolchains( name, python_version, - distutils = None, - distutils_content = None, register_toolchains = True, register_coverage_tool = False, set_python_version_constraint = False, - tool_versions = TOOL_VERSIONS, + tool_versions = None, **kwargs): """Convenience macro for users which does typical setup. - - Create a repository for each built-in platform like "python_linux_amd64" - + - Create a repository for each built-in platform like "python_3_8_linux_amd64" - this repository is lazily fetched when Python is needed for that platform. - Create a repository exposing toolchains for each platform like "python_platforms". - Register a toolchain pointing at each platform. + Users can avoid this macro and do these steps themselves, if they want more control. + Args: - name: base name for all created repos, like "python38". - python_version: the Python version. - distutils: see the distutils attribute in the python_repository repository rule. - distutils_content: see the distutils_content attribute in the python_repository repository rule. - register_toolchains: Whether or not to register the downloaded toolchains. - register_coverage_tool: Whether or not to register the downloaded coverage tool to the toolchains. - NOTE: Coverage support using the toolchain is only supported in Bazel 6 and higher. - - set_python_version_constraint: When set to true, target_compatible_with for the toolchains will include a version constraint. - tool_versions: a dict containing a mapping of version with SHASUM and platform info. If not supplied, the defaults - in python/versions.bzl will be used. - **kwargs: passed to each python_repositories call. + name: {type}`str` base name for all created repos, e.g. "python_3_8". + python_version: {type}`str` the Python version. + register_toolchains: {type}`bool` Whether or not to register the downloaded toolchains. + register_coverage_tool: {type}`bool` Whether or not to register the + downloaded coverage tool to the toolchains. + set_python_version_constraint: {type}`bool` When set to `True`, + `target_compatible_with` for the toolchains will include a version + constraint. + tool_versions: {type}`dict` contains a mapping of version with SHASUM + and platform info. If not supplied, the defaults in + python/versions.bzl will be used. + **kwargs: passed to each {obj}`python_repository` call. """ if BZLMOD_ENABLED: @@ -599,6 +599,7 @@ def python_register_toolchains( register_toolchains = False base_url = kwargs.pop("base_url", DEFAULT_RELEASE_BASE_URL) + tool_versions = tool_versions or TOOL_VERSIONS python_version = full_version(python_version) @@ -656,8 +657,6 @@ def python_register_toolchains( python_version = python_version, release_filename = release_filename, urls = urls, - distutils = distutils, - distutils_content = distutils_content, strip_prefix = strip_prefix, coverage_tool = coverage_tool, **kwargs @@ -709,11 +708,11 @@ def python_register_multi_toolchains( """Convenience macro for registering multiple Python toolchains. Args: - name: base name for each name in python_register_toolchains call. - python_versions: the Python version. - default_version: the default Python version. If not set, the first version in - python_versions is used. - **kwargs: passed to each python_register_toolchains call. + name: {type}`str` base name for each name in {obj}`python_register_toolchains` call. + python_versions: {type}`list[str]` the Python versions. + default_version: {type}`str` the default Python version. If not set, + the first version in python_versions is used. + **kwargs: passed to each {obj}`python_register_toolchains` call. """ if len(python_versions) == 0: fail("python_versions must not be empty") diff --git a/python/repositories.bzl b/python/repositories.bzl index cf8723405c..88c00e28cb 100644 --- a/python/repositories.bzl +++ b/python/repositories.bzl @@ -18,7 +18,6 @@ load( "//python/private:python_repositories.bzl", _STANDALONE_INTERPRETER_FILENAME = "STANDALONE_INTERPRETER_FILENAME", - _http_archive = "http_archive", _is_standalone_interpreter = "is_standalone_interpreter", _py_repositories = "py_repositories", _python_register_multi_toolchains = "python_register_multi_toolchains", @@ -30,9 +29,11 @@ py_repositories = _py_repositories python_register_multi_toolchains = _python_register_multi_toolchains python_register_toolchains = _python_register_toolchains +# Useful for documentation, but is not intended for public use - the python +# module extension will be the main interface in the future. +python_repository = _python_repository + # These symbols are of questionable public visibility. They were probably # not intended to be actually public. STANDALONE_INTERPRETER_FILENAME = _STANDALONE_INTERPRETER_FILENAME -http_archive = _http_archive is_standalone_interpreter = _is_standalone_interpreter -python_repository = _python_repository From a5076736b0d46b28146e7524f1c0d158d7ed3c2f Mon Sep 17 00:00:00 2001 From: Oleh Prypin Date: Fri, 6 Sep 2024 05:23:38 +0200 Subject: [PATCH 192/345] feat(rules): add build_data_file field to PyExecutableInfo (#2181) PyExecutableInfo was added in https://github.com/bazelbuild/rules_python/pull/2166 with the field `runfiles_without_exe` that intentionally excludes files that are specific to that target/executable, such as the build data file (which may contain the target name, or other target-specific information). However, consuming tools (such as ones used within Google) may need to derive a file from that build data, override it completely, or be happy with its content as is. To aid that case, expose it via PyExecutableInfo. --- python/private/common/py_executable.bzl | 26 +++++++++++++++---------- python/private/py_executable_info.bzl | 5 +++++ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/python/private/common/py_executable.bzl b/python/private/common/py_executable.bzl index 1437e2eb1d..80418acfcc 100644 --- a/python/private/common/py_executable.bzl +++ b/python/private/common/py_executable.bzl @@ -426,6 +426,8 @@ def _get_base_runfiles_for_binary( * data_runfiles: The data runfiles * runfiles_without_exe: The default runfiles, but without the executable or files specific to the original program/executable. + * build_data_file: A file with build stamp information if stamping is enabled, otherwise + None. """ common_runfiles_depsets = [main_py_files] @@ -465,17 +467,20 @@ def _get_base_runfiles_for_binary( data_runfiles = runfiles_with_exe if is_stamping_enabled(ctx, semantics) and semantics.should_include_build_data(ctx): - default_runfiles = runfiles_with_exe.merge(_create_runfiles_with_build_data( + build_data_file, build_data_runfiles = _create_runfiles_with_build_data( ctx, semantics.get_central_uncachable_version_file(ctx), semantics.get_extra_write_build_data_env(ctx), - )) + ) + default_runfiles = runfiles_with_exe.merge(build_data_runfiles) else: + build_data_file = None default_runfiles = runfiles_with_exe return struct( runfiles_without_exe = common_runfiles, default_runfiles = default_runfiles, + build_data_file = build_data_file, data_runfiles = data_runfiles, ) @@ -483,15 +488,15 @@ def _create_runfiles_with_build_data( ctx, central_uncachable_version_file, extra_write_build_data_env): - return ctx.runfiles( - symlinks = { - BUILD_DATA_SYMLINK_PATH: _write_build_data( - ctx, - central_uncachable_version_file, - extra_write_build_data_env, - ), - }, + build_data_file = _write_build_data( + ctx, + central_uncachable_version_file, + extra_write_build_data_env, ) + build_data_runfiles = ctx.runfiles(symlinks = { + BUILD_DATA_SYMLINK_PATH: build_data_file, + }) + return build_data_file, build_data_runfiles def _write_build_data(ctx, central_uncachable_version_file, extra_write_build_data_env): # TODO: Remove this logic when a central file is always available @@ -829,6 +834,7 @@ def _create_providers( PyExecutableInfo( main = main_py, runfiles_without_exe = runfiles_details.runfiles_without_exe, + build_data_file = runfiles_details.build_data_file, interpreter_path = runtime_details.executable_interpreter_path, ), ] diff --git a/python/private/py_executable_info.bzl b/python/private/py_executable_info.bzl index 7fa2f18308..deb119428d 100644 --- a/python/private/py_executable_info.bzl +++ b/python/private/py_executable_info.bzl @@ -10,6 +10,11 @@ This provider is for executable-specific information (e.g. tests and binaries). ::: """, fields = { + "build_data_file": """ +:type: None | File + +A symlink to build_data.txt if stamping is enabled, otherwise None. +""", "interpreter_path": """ :type: None | str From cd4b9c4bf02f27cc912be53aa8b77531b95733d5 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 6 Sep 2024 12:25:10 +0900 Subject: [PATCH 193/345] fix(bzlmod): use --lockfile_mode=update and add a separate job for lockfile testing (#2154) We add two jobs for the bzlmod example to test that lockfile is platform independent. Then we also add a .bazelversion file to the example so that the lockfile is stable. Finally we add a pre-commit hook which may help in keeping the lockfile up-to-date. Fixes #2148 --- .bazelci/presubmit.yml | 29 +++++++++++++++++++----- .pre-commit-config.yaml | 6 +++++ examples/bzlmod/.bazelrc | 5 +--- examples/bzlmod/.bazelversion | 1 + tools/private/update_bzlmod_lockfiles.sh | 5 ++++ 5 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 examples/bzlmod/.bazelversion create mode 100755 tools/private/update_bzlmod_lockfiles.sh diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index a1d5d2e0a1..631ad864f7 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -65,6 +65,15 @@ buildifier: .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 @@ -230,12 +239,6 @@ tasks: name: "examples/bzlmod: Ubuntu, minimum Bazel" working_directory: examples/bzlmod platform: ubuntu2004 - build_flags: - - "--lockfile_mode=update" - test_flags: - - "--lockfile_mode=update" - coverage_flags: - - "--lockfile_mode=update" integration_test_bzlmod_ubuntu: <<: *reusable_build_test_all <<: *coverage_targets_example_bzlmod @@ -260,6 +263,20 @@ tasks: name: "examples/bzlmod: Windows" working_directory: examples/bzlmod platform: windows + integration_test_bzlmod_ubuntu_lockfile: + <<: *reusable_build_test_all + <<: *coverage_targets_example_bzlmod + <<: *lockfile_mode_error + name: "examples/bzlmod: Ubuntu with lockfile" + 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 integration_test_bzlmod_generate_build_file_generation_ubuntu_min: <<: *minimum_supported_version diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 54aa04365a..38b9161e24 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -45,3 +45,9 @@ repos: 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/examples/bzlmod/.bazelrc b/examples/bzlmod/.bazelrc index 64e17c3175..fd16095857 100644 --- a/examples/bzlmod/.bazelrc +++ b/examples/bzlmod/.bazelrc @@ -1,8 +1,5 @@ common --enable_bzlmod - -# Update the lockfile by running: -# bazel mod deps --lockfile_mode=update -common --lockfile_mode=error +common --lockfile_mode=update coverage --java_runtime_version=remotejdk_11 diff --git a/examples/bzlmod/.bazelversion b/examples/bzlmod/.bazelversion new file mode 100644 index 0000000000..643916c03f --- /dev/null +++ b/examples/bzlmod/.bazelversion @@ -0,0 +1 @@ +7.3.1 diff --git a/tools/private/update_bzlmod_lockfiles.sh b/tools/private/update_bzlmod_lockfiles.sh new file mode 100755 index 0000000000..309d64e34a --- /dev/null +++ b/tools/private/update_bzlmod_lockfiles.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -euxo pipefail + +cd "$(dirname "$0")"/../../examples/bzlmod +bazel mod deps From da0fe5714436c9a8b913961b35da4e41e638fb0a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Sep 2024 03:25:44 +0000 Subject: [PATCH 194/345] build(deps): bump urllib3 from 2.0.7 to 2.2.2 in /tests/multiple_inputs (#2140) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.0.7 to 2.2.2.
Release notes

Sourced from urllib3's releases.

2.2.2

🚀 urllib3 is fundraising for HTTP/2 support

urllib3 is raising ~$40,000 USD to release HTTP/2 support and ensure long-term sustainable maintenance of the project after a sharp decline in financial support for 2023. If your company or organization uses Python and would benefit from HTTP/2 support in Requests, pip, cloud SDKs, and thousands of other projects please consider contributing financially to ensure HTTP/2 support is developed sustainably and maintained for the long-haul.

Thank you for your support.

Changes

  • Added the Proxy-Authorization header to the list of headers to strip from requests when redirecting to a different host. As before, different headers can be set via Retry.remove_headers_on_redirect.
  • Allowed passing negative integers as amt to read methods of http.client.HTTPResponse as an alternative to None. (#3122)
  • Fixed return types representing copying actions to use typing.Self. (#3363)

Full Changelog: https://github.com/urllib3/urllib3/compare/2.2.1...2.2.2

2.2.1

🚀 urllib3 is fundraising for HTTP/2 support

urllib3 is raising ~$40,000 USD to release HTTP/2 support and ensure long-term sustainable maintenance of the project after a sharp decline in financial support for 2023. If your company or organization uses Python and would benefit from HTTP/2 support in Requests, pip, cloud SDKs, and thousands of other projects please consider contributing financially to ensure HTTP/2 support is developed sustainably and maintained for the long-haul.

Thank you for your support.

Changes

  • Fixed issue where InsecureRequestWarning was emitted for HTTPS connections when using Emscripten. (#3331)
  • Fixed HTTPConnectionPool.urlopen to stop automatically casting non-proxy headers to HTTPHeaderDict. This change was premature as it did not apply to proxy headers and HTTPHeaderDict does not handle byte header values correctly yet. (#3343)
  • Changed ProtocolError to InvalidChunkLength when response terminates before the chunk length is sent. (#2860)
  • Changed ProtocolError to be more verbose on incomplete reads with excess content. (#3261)

2.2.0

🖥️ urllib3 now works in the browser

:tada: This release adds experimental support for using urllib3 in the browser with Pyodide! :tada:

Thanks to Joe Marshall (@​joemarshall) for contributing this feature. This change was possible thanks to work done in urllib3 v2.0 to detach our API from http.client. Please report all bugs to the urllib3 issue tracker.

🚀 urllib3 is fundraising for HTTP/2 support

urllib3 is raising ~$40,000 USD to release HTTP/2 support and ensure long-term sustainable maintenance of the project after a sharp decline in financial support for 2023. If your company or organization uses Python and would benefit from HTTP/2 support in Requests, pip, cloud SDKs, and thousands of other projects please consider contributing financially to ensure HTTP/2 support is developed sustainably and maintained for the long-haul.

Thank you for your support.

Changes

  • Added support for Emscripten and Pyodide, including streaming support in cross-origin isolated browser environments where threading is enabled. (#2951)
  • Added support for HTTPResponse.read1() method. (#3186)
  • Added rudimentary support for HTTP/2. (#3284)
  • Fixed issue where requests against urls with trailing dots were failing due to SSL errors when using proxy. (#2244)
  • Fixed HTTPConnection.proxy_is_verified and HTTPSConnection.proxy_is_verified to be always set to a boolean after connecting to a proxy. It could be None in some cases previously. (#3130)

... (truncated)

Changelog

Sourced from urllib3's changelog.

2.2.2 (2024-06-17)

  • Added the Proxy-Authorization header to the list of headers to strip from requests when redirecting to a different host. As before, different headers can be set via Retry.remove_headers_on_redirect.
  • Allowed passing negative integers as amt to read methods of http.client.HTTPResponse as an alternative to None. ([#3122](https://github.com/urllib3/urllib3/issues/3122) <https://github.com/urllib3/urllib3/issues/3122>__)
  • Fixed return types representing copying actions to use typing.Self. ([#3363](https://github.com/urllib3/urllib3/issues/3363) <https://github.com/urllib3/urllib3/issues/3363>__)

2.2.1 (2024-02-16)

  • Fixed issue where InsecureRequestWarning was emitted for HTTPS connections when using Emscripten. ([#3331](https://github.com/urllib3/urllib3/issues/3331) <https://github.com/urllib3/urllib3/issues/3331>__)
  • Fixed HTTPConnectionPool.urlopen to stop automatically casting non-proxy headers to HTTPHeaderDict. This change was premature as it did not apply to proxy headers and HTTPHeaderDict does not handle byte header values correctly yet. ([#3343](https://github.com/urllib3/urllib3/issues/3343) <https://github.com/urllib3/urllib3/issues/3343>__)
  • Changed InvalidChunkLength to ProtocolError when response terminates before the chunk length is sent. ([#2860](https://github.com/urllib3/urllib3/issues/2860) <https://github.com/urllib3/urllib3/issues/2860>__)
  • Changed ProtocolError to be more verbose on incomplete reads with excess content. ([#3261](https://github.com/urllib3/urllib3/issues/3261) <https://github.com/urllib3/urllib3/issues/3261>__)

2.2.0 (2024-01-30)

  • Added support for Emscripten and Pyodide <https://urllib3.readthedocs.io/en/latest/reference/contrib/emscripten.html>, including streaming support in cross-origin isolated browser environments where threading is enabled. ([#2951](https://github.com/urllib3/urllib3/issues/2951) <https://github.com/urllib3/urllib3/issues/2951>)
  • Added support for HTTPResponse.read1() method. ([#3186](https://github.com/urllib3/urllib3/issues/3186) <https://github.com/urllib3/urllib3/issues/3186>__)
  • Added rudimentary support for HTTP/2. ([#3284](https://github.com/urllib3/urllib3/issues/3284) <https://github.com/urllib3/urllib3/issues/3284>__)
  • Fixed issue where requests against urls with trailing dots were failing due to SSL errors when using proxy. ([#2244](https://github.com/urllib3/urllib3/issues/2244) <https://github.com/urllib3/urllib3/issues/2244>__)
  • Fixed HTTPConnection.proxy_is_verified and HTTPSConnection.proxy_is_verified to be always set to a boolean after connecting to a proxy. It could be None in some cases previously. ([#3130](https://github.com/urllib3/urllib3/issues/3130) <https://github.com/urllib3/urllib3/issues/3130>__)
  • Fixed an issue where headers passed in a request with json= would be mutated ([#3203](https://github.com/urllib3/urllib3/issues/3203) <https://github.com/urllib3/urllib3/issues/3203>__)
  • Fixed HTTPSConnection.is_verified to be set to False when connecting from a HTTPS proxy to an HTTP target. It was set to True previously. ([#3267](https://github.com/urllib3/urllib3/issues/3267) <https://github.com/urllib3/urllib3/issues/3267>__)
  • Fixed handling of new error message from OpenSSL 3.2.0 when configuring an HTTP proxy as HTTPS ([#3268](https://github.com/urllib3/urllib3/issues/3268) <https://github.com/urllib3/urllib3/issues/3268>__)
  • Fixed TLS 1.3 post-handshake auth when the server certificate validation is disabled ([#3325](https://github.com/urllib3/urllib3/issues/3325) <https://github.com/urllib3/urllib3/issues/3325>__)
  • Note for downstream distributors: To run integration tests, you now need to run the tests a second time with the --integration pytest flag. ([#3181](https://github.com/urllib3/urllib3/issues/3181) <https://github.com/urllib3/urllib3/issues/3181>__)

2.1.0 (2023-11-13)

  • Removed support for the deprecated urllib3[secure] extra. ([#2680](https://github.com/urllib3/urllib3/issues/2680) <https://github.com/urllib3/urllib3/issues/2680>__)
  • Removed support for the deprecated SecureTransport TLS implementation. ([#2681](https://github.com/urllib3/urllib3/issues/2681) <https://github.com/urllib3/urllib3/issues/2681>__)
  • Removed support for the end-of-life Python 3.7. ([#3143](https://github.com/urllib3/urllib3/issues/3143) <https://github.com/urllib3/urllib3/issues/3143>__)
  • Allowed loading CA certificates from memory for proxies. ([#3065](https://github.com/urllib3/urllib3/issues/3065) <https://github.com/urllib3/urllib3/issues/3065>__)
  • Fixed decoding Gzip-encoded responses which specified x-gzip content-encoding. ([#3174](https://github.com/urllib3/urllib3/issues/3174) <https://github.com/urllib3/urllib3/issues/3174>__)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=urllib3&package-manager=pip&previous-version=2.0.7&new-version=2.2.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/bazelbuild/rules_python/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tests/multiple_inputs/multiple_inputs.txt | 6 +++--- tests/multiple_inputs/multiple_pyproject_toml.txt | 6 +++--- tests/multiple_inputs/multiple_requirements_in.txt | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/multiple_inputs/multiple_inputs.txt b/tests/multiple_inputs/multiple_inputs.txt index a036c3f33d..e6fdcf12d3 100644 --- a/tests/multiple_inputs/multiple_inputs.txt +++ b/tests/multiple_inputs/multiple_inputs.txt @@ -10,9 +10,9 @@ attrs==23.1.0 \ # via # -r tests/multiple_inputs/requirements_2.in # multiple_inputs_2 (tests/multiple_inputs/b/pyproject.toml) -urllib3==2.0.7 \ - --hash=sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84 \ - --hash=sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e +urllib3==2.2.2 \ + --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ + --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 # via # -r tests/multiple_inputs/requirements_1.in # multiple_inputs_1 (tests/multiple_inputs/a/pyproject.toml) diff --git a/tests/multiple_inputs/multiple_pyproject_toml.txt b/tests/multiple_inputs/multiple_pyproject_toml.txt index b8af28ac10..cd9bc59f25 100644 --- a/tests/multiple_inputs/multiple_pyproject_toml.txt +++ b/tests/multiple_inputs/multiple_pyproject_toml.txt @@ -8,7 +8,7 @@ attrs==23.1.0 \ --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 # via multiple_inputs_2 (tests/multiple_inputs/b/pyproject.toml) -urllib3==2.0.7 \ - --hash=sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84 \ - --hash=sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e +urllib3==2.2.2 \ + --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ + --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 # via multiple_inputs_1 (tests/multiple_inputs/a/pyproject.toml) diff --git a/tests/multiple_inputs/multiple_requirements_in.txt b/tests/multiple_inputs/multiple_requirements_in.txt index 63edfe9f53..19586efa58 100644 --- a/tests/multiple_inputs/multiple_requirements_in.txt +++ b/tests/multiple_inputs/multiple_requirements_in.txt @@ -8,7 +8,7 @@ attrs==23.1.0 \ --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 # via -r tests/multiple_inputs/requirements_2.in -urllib3==2.0.7 \ - --hash=sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84 \ - --hash=sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e +urllib3==2.2.2 \ + --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ + --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 # via -r tests/multiple_inputs/requirements_1.in From 30bd94d1904c4701e1d19486a7ebcae2d6625a27 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 5 Sep 2024 22:52:46 -0700 Subject: [PATCH 195/345] tests: use `{package}` instead of hard-coded path in precompile_tests (#2193) When imported into Google, the workspace-relative path changes, which makes the tests fail. Using the `{package}` format kwarg makes the tests independent of their location in the workspace. --- tests/base_rules/precompile/precompile_tests.bzl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/base_rules/precompile/precompile_tests.bzl b/tests/base_rules/precompile/precompile_tests.bzl index 508160a627..e2ffdc8bb4 100644 --- a/tests/base_rules/precompile/precompile_tests.bzl +++ b/tests/base_rules/precompile/precompile_tests.bzl @@ -266,14 +266,14 @@ _tests.append(_test_precompile_add_to_runfiles_decided_elsewhere) def _test_precompile_add_to_runfiles_decided_elsewhere_impl(env, targets): env.expect.that_target(targets.binary).runfiles().contains_at_least([ - "{workspace}/tests/base_rules/precompile/__pycache__/bin.fakepy-45.pyc", - "{workspace}/tests/base_rules/precompile/__pycache__/lib.fakepy-45.pyc", - "{workspace}/tests/base_rules/precompile/bin.py", - "{workspace}/tests/base_rules/precompile/lib.py", + "{workspace}/{package}/__pycache__/bin.fakepy-45.pyc", + "{workspace}/{package}/__pycache__/lib.fakepy-45.pyc", + "{workspace}/{package}/bin.py", + "{workspace}/{package}/lib.py", ]) env.expect.that_target(targets.library).runfiles().contains_exactly([ - "{workspace}/tests/base_rules/precompile/lib.py", + "{workspace}/{package}/lib.py", ]) def _test_precompiler_action(name): From f4596fbc31fc4f2e32ced9c414a6fd42d54a7ff8 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Fri, 6 Sep 2024 14:02:12 -0700 Subject: [PATCH 196/345] fix: allow disabling exec_tools toolchain from looking up an interpreter (#2194) This allow the exec_interpreter attribute to propagate None even though it's a label with a default value. Such attributes can't _directly_ be set to None because None means to use the default. To work around that, a sentinel target is used, which allows breaking the dependency on the default and triggering the rule to use None instead. A null exec interpreter is necessary in environments that don't provide a separate Python interpreter. --- python/private/BUILD.bazel | 11 +++++ python/private/py_exec_tools_info.bzl | 8 +++- python/private/py_exec_tools_toolchain.bzl | 13 +++++- python/private/sentinel.bzl | 30 ++++++++++++++ tests/py_exec_tools_toolchain/BUILD.bazel | 19 +++++++++ .../py_exec_tools_toolchain_tests.bzl | 40 +++++++++++++++++++ 6 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 python/private/sentinel.bzl create mode 100644 tests/py_exec_tools_toolchain/BUILD.bazel create mode 100644 tests/py_exec_tools_toolchain/py_exec_tools_toolchain_tests.bzl diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 252606c0ff..7b913df2b3 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -18,6 +18,7 @@ load("//python:py_binary.bzl", "py_binary") load("//python:py_library.bzl", "py_library") load("//python:versions.bzl", "print_toolchains_checksums") load(":py_exec_tools_toolchain.bzl", "current_interpreter_executable") +load(":sentinel.bzl", "sentinel") load(":stamp.bzl", "stamp_build_setting") package( @@ -213,6 +214,7 @@ bzl_library( srcs = ["py_exec_tools_toolchain.bzl"], deps = [ ":py_exec_tools_info_bzl", + ":sentinel_bzl", ":toolchain_types_bzl", "//python/private/common:providers_bzl", "@bazel_skylib//lib:paths", @@ -294,6 +296,11 @@ bzl_library( srcs = ["repo_utils.bzl"], ) +bzl_library( + name = "sentinel_bzl", + srcs = ["sentinel.bzl"], +) + bzl_library( name = "stamp_bzl", srcs = ["stamp.bzl"], @@ -469,3 +476,7 @@ current_interpreter_executable( # py_exec_tools_toolchain. visibility = ["//visibility:public"], ) + +sentinel( + name = "sentinel", +) diff --git a/python/private/py_exec_tools_info.bzl b/python/private/py_exec_tools_info.bzl index 6fa4011e6b..b74f480fab 100644 --- a/python/private/py_exec_tools_info.bzl +++ b/python/private/py_exec_tools_info.bzl @@ -17,7 +17,9 @@ PyExecToolsInfo = provider( doc = "Build tools used as part of building Python programs.", fields = { "exec_interpreter": """ -Optional Target; an interpreter valid for running in the exec configuration. +:type: Target | None + +If available, an interpreter valid for running in the exec configuration. When running it in an action, use `DefaultInfo.files_to_run` to ensure all its files are appropriately available. An exec interpreter may not be available, e.g. if all the exec tools are prebuilt binaries. @@ -33,7 +35,9 @@ the proper target constraints are being applied when obtaining this from the toolchain. """, "precompiler": """ -Optional Target. The tool to use for generating pyc files. If not available, +:type: Target | None + +If available, the tool to use for generating pyc files. If not available, precompiling will not be available. Must provide one of the following: diff --git a/python/private/py_exec_tools_toolchain.bzl b/python/private/py_exec_tools_toolchain.bzl index a4516d86eb..26c09ca5cf 100644 --- a/python/private/py_exec_tools_toolchain.bzl +++ b/python/private/py_exec_tools_toolchain.bzl @@ -16,6 +16,7 @@ load("@bazel_skylib//lib:paths.bzl", "paths") load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") +load("//python/private:sentinel.bzl", "SentinelInfo") load("//python/private:toolchain_types.bzl", "TARGET_TOOLCHAIN_TYPE") load(":py_exec_tools_info.bzl", "PyExecToolsInfo") @@ -24,9 +25,13 @@ def _py_exec_tools_toolchain_impl(ctx): if ctx.attr._visible_for_testing[BuildSettingInfo].value: extra_kwargs["toolchain_label"] = ctx.label + exec_interpreter = ctx.attr.exec_interpreter + if SentinelInfo in ctx.attr.exec_interpreter: + exec_interpreter = None + return [platform_common.ToolchainInfo( exec_tools = PyExecToolsInfo( - exec_interpreter = ctx.attr.exec_interpreter, + exec_interpreter = exec_interpreter, precompiler = ctx.attr.precompiler, ), **extra_kwargs @@ -38,7 +43,11 @@ py_exec_tools_toolchain = rule( "exec_interpreter": attr.label( default = "//python/private:current_interpreter_executable", cfg = "exec", - doc = "See PyexecToolsInfo.exec_interpreter.", + doc = """ +The interpreter to use in the exec config. To disable, specify the +special target `//python/private:sentinel`. See PyExecToolsInfo.exec_interpreter +for further docs. +""", ), "precompiler": attr.label( allow_files = True, diff --git a/python/private/sentinel.bzl b/python/private/sentinel.bzl new file mode 100644 index 0000000000..6d753e1983 --- /dev/null +++ b/python/private/sentinel.bzl @@ -0,0 +1,30 @@ +# 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 rule to define a target to act as a singleton for label attributes. + +Label attributes with defaults cannot accept None, otherwise they fall +back to using the default. A sentinel allows detecting an intended None value. +""" + +SentinelInfo = provider( + doc = "Indicates this was the sentinel target.", + fields = [], +) + +def _sentinel_impl(ctx): + _ = ctx # @unused + return [SentinelInfo()] + +sentinel = rule(implementation = _sentinel_impl) diff --git a/tests/py_exec_tools_toolchain/BUILD.bazel b/tests/py_exec_tools_toolchain/BUILD.bazel new file mode 100644 index 0000000000..092e790939 --- /dev/null +++ b/tests/py_exec_tools_toolchain/BUILD.bazel @@ -0,0 +1,19 @@ +# 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(":py_exec_tools_toolchain_tests.bzl", "py_exec_tools_toolchain_test_suite") + +py_exec_tools_toolchain_test_suite( + name = "py_exec_tools_toolchain_tests", +) diff --git a/tests/py_exec_tools_toolchain/py_exec_tools_toolchain_tests.bzl b/tests/py_exec_tools_toolchain/py_exec_tools_toolchain_tests.bzl new file mode 100644 index 0000000000..3be2bc3f30 --- /dev/null +++ b/tests/py_exec_tools_toolchain/py_exec_tools_toolchain_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. +"""Starlark tests for py_exec_tools_toolchain rule.""" + +load("@rules_testing//lib:analysis_test.bzl", "analysis_test") +load("@rules_testing//lib:test_suite.bzl", "test_suite") +load("//python/private:py_exec_tools_toolchain.bzl", "py_exec_tools_toolchain") # buildifier: disable=bzl-visibility + +_tests = [] + +def _test_disable_exec_interpreter(name): + py_exec_tools_toolchain( + name = name + "_subject", + exec_interpreter = "//python/private:sentinel", + ) + analysis_test( + name = name, + target = name + "_subject", + impl = _test_disable_exec_interpreter_impl, + ) + +def _test_disable_exec_interpreter_impl(env, target): + exec_tools = target[platform_common.ToolchainInfo].exec_tools + env.expect.that_bool(exec_tools.exec_interpreter == None).equals(True) + +_tests.append(_test_disable_exec_interpreter) + +def py_exec_tools_toolchain_test_suite(name): + test_suite(name = name, tests = _tests) From 118573bd5cd57b7af1e8a4a7e1abd6561d76ff37 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sat, 7 Sep 2024 01:01:53 -0700 Subject: [PATCH 197/345] feat: allow py_cc_toolchain libs to be optional (#2197) This is for cases when shared libraries aren't available. --- CHANGELOG.md | 3 ++ python/private/py_cc_toolchain_info.bzl | 4 +-- python/private/py_cc_toolchain_rule.bzl | 18 +++++++----- .../py_cc_toolchain/py_cc_toolchain_tests.bzl | 28 ++++++++++++++++--- 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd94003bb7..d4105751eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,9 @@ A brief description of the categories of changes: * (gazelle): Update error messages when unable to resolve a dependency to be more human-friendly. * (flags) The {obj}`--python_version` flag now also returns {obj}`config_common.FeatureFlagInfo`. +* (toolchains) {obj}`py_cc_toolchain.libs` and {obj}`PyCcToolchainInfo.libs` is + optional. This is to support situations where only the Python headers are + available. ### Fixed * (whl_library): Remove `--no-index` and add `--no-build-isolation` to the diff --git a/python/private/py_cc_toolchain_info.bzl b/python/private/py_cc_toolchain_info.bzl index ae46bf4d4d..c5cdbd9d84 100644 --- a/python/private/py_cc_toolchain_info.bzl +++ b/python/private/py_cc_toolchain_info.bzl @@ -41,9 +41,9 @@ Information about the header files, struct with fields: represents). """, "libs": """\ -:type: struct +:type: struct | None -Information about C libraries, struct with fields: +If available, information about C libraries, struct with fields: * providers_map: A dict of string to provider instances. The key should be a fully qualified name (e.g. `@rules_foo//bar:baz.bzl#MyInfo`) of the provider to uniquely identify its type. diff --git a/python/private/py_cc_toolchain_rule.bzl b/python/private/py_cc_toolchain_rule.bzl index 1599415ac7..2c52a2ec84 100644 --- a/python/private/py_cc_toolchain_rule.bzl +++ b/python/private/py_cc_toolchain_rule.bzl @@ -23,6 +23,16 @@ load("@rules_cc//cc:defs.bzl", "CcInfo") load(":py_cc_toolchain_info.bzl", "PyCcToolchainInfo") def _py_cc_toolchain_impl(ctx): + if ctx.attr.libs: + libs = struct( + providers_map = { + "CcInfo": ctx.attr.libs[CcInfo], + "DefaultInfo": ctx.attr.libs[DefaultInfo], + }, + ) + else: + libs = None + py_cc_toolchain = PyCcToolchainInfo( headers = struct( providers_map = { @@ -30,12 +40,7 @@ def _py_cc_toolchain_impl(ctx): "DefaultInfo": ctx.attr.headers[DefaultInfo], }, ), - libs = struct( - providers_map = { - "CcInfo": ctx.attr.libs[CcInfo], - "DefaultInfo": ctx.attr.libs[DefaultInfo], - }, - ), + libs = libs, python_version = ctx.attr.python_version, ) extra_kwargs = {} @@ -59,7 +64,6 @@ py_cc_toolchain = rule( doc = ("Target that provides the Python runtime libraries for linking. " + "Typically this is a cc_library target of `.so` files."), providers = [CcInfo], - mandatory = True, ), "python_version": attr.string( doc = "The Major.minor Python version, e.g. 3.11", diff --git a/tests/cc/py_cc_toolchain/py_cc_toolchain_tests.bzl b/tests/cc/py_cc_toolchain/py_cc_toolchain_tests.bzl index fcc520e291..0419a04a45 100644 --- a/tests/cc/py_cc_toolchain/py_cc_toolchain_tests.bzl +++ b/tests/cc/py_cc_toolchain/py_cc_toolchain_tests.bzl @@ -16,15 +16,16 @@ load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite") load("@rules_testing//lib:truth.bzl", "matching", "subjects") +load("//python/cc:py_cc_toolchain.bzl", "py_cc_toolchain") load("//tests/support:cc_info_subject.bzl", "cc_info_subject") load("//tests/support:py_cc_toolchain_info_subject.bzl", "PyCcToolchainInfoSubject") _tests = [] -def _py_cc_toolchain_test(name): +def _test_py_cc_toolchain(name): analysis_test( name = name, - impl = _py_cc_toolchain_test_impl, + impl = _test_py_cc_toolchain_impl, target = "//tests/support/cc_toolchains:fake_py_cc_toolchain_impl", attrs = { "header": attr.label( @@ -34,7 +35,7 @@ def _py_cc_toolchain_test(name): }, ) -def _py_cc_toolchain_test_impl(env, target): +def _test_py_cc_toolchain_impl(env, target): env.expect.that_target(target).has_provider(platform_common.ToolchainInfo) toolchain = PyCcToolchainInfoSubject.new( @@ -80,7 +81,26 @@ def _py_cc_toolchain_test_impl(env, target): matching.str_matches("/libpython3."), ) -_tests.append(_py_cc_toolchain_test) +_tests.append(_test_py_cc_toolchain) + +def _test_libs_optional(name): + py_cc_toolchain( + name = name + "_subject", + libs = None, + headers = "//tests/support/cc_toolchains:fake_headers", + python_version = "4.5", + ) + analysis_test( + name = name, + target = name + "_subject", + impl = _test_libs_optional_impl, + ) + +def _test_libs_optional_impl(env, target): + libs = target[platform_common.ToolchainInfo].py_cc_toolchain.libs + env.expect.that_bool(libs == None).equals(True) + +_tests.append(_test_libs_optional) def py_cc_toolchain_test_suite(name): test_suite( From 148122aff9fcb36fd98ed2f2eda239ced668e863 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sat, 7 Sep 2024 01:03:10 -0700 Subject: [PATCH 198/345] docs: document py_cc_toolchain and py_runtime_pair (#2196) Their doc targets weren't included in the main docs deps list, so they weren't showing up. Also xref from the py_runtime_pair macro to the underlying rule. --- docs/BUILD.bazel | 5 +++-- python/py_runtime_pair.bzl | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index e211c13344..2b407db692 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -72,6 +72,8 @@ sphinx_docs( deps = [ ":bzl_api_docs", ":py_api_srcs", + ":py_cc_toolchain", + ":py_runtime_pair", "//sphinxdocs/docs:docs_lib", ], ) @@ -123,8 +125,7 @@ sphinx_stardoc( sphinx_stardoc( name = "py_runtime_pair", src = "//python/private:py_runtime_pair_rule_bzl", - prefix = "api/rules_python", - public_load_path = "//python:py_runtime_pair.bzl", + prefix = "api/rules_python/", tags = ["docs"], target_compatible_with = _TARGET_COMPATIBLE_WITH, ) diff --git a/python/py_runtime_pair.bzl b/python/py_runtime_pair.bzl index 1728dcdab7..b1e90414a2 100644 --- a/python/py_runtime_pair.bzl +++ b/python/py_runtime_pair.bzl @@ -25,6 +25,8 @@ _py_runtime_pair = _starlark_impl if IS_BAZEL_6_OR_HIGHER else _bazel_tools_impl def py_runtime_pair(name, py2_runtime = None, py3_runtime = None, **attrs): """A toolchain rule for Python. + This is a macro around the underlying {rule}`py_runtime_pair` rule. + This used to wrap up to two Python runtimes, one for Python 2 and one for Python 3. However, Python 2 is no longer supported, so it now only wraps a single Python 3 runtime. From a18ae496549559fbea5193bee63d704f11992d67 Mon Sep 17 00:00:00 2001 From: Weicheng Zhao <106119275+sfc-gh-wzhao@users.noreply.github.com> Date: Sat, 7 Sep 2024 05:14:18 -0700 Subject: [PATCH 199/345] fix: Fix incorrectly generated `Required-Dist` when specifying requirements with markers in extra_requires in py_wheel rule (#2200) Currently, if extra requirements are provided via a file, it is allowed to contain markers, but if it is passed via extra_requires field, it will run into error since the extra in this case is blindly added in the following line in `py_wheel.bzl` ``` metadata_contents.append( "Requires-Dist: %s; extra == '%s'" % (requirement, option), ) ``` Thus, this PR adds a post-process for this case, to make it possible to pass something like ``` extra_requires = {"example": [ "pyyaml>=6.0.0,!=6.0.1", 'toml; (python_version == "3.11" or python_version == "3.12") and python_version != "3.8"', 'wheel; python_version == "3.11" or python_version == "3.12" ', ]}, ``` to `py_wheel` --- CHANGELOG.md | 2 ++ examples/wheel/BUILD.bazel | 22 +++++++++++++++++++ examples/wheel/wheel_test.py | 30 ++++++++++++++++++++++++++ tools/wheelmaker.py | 42 +++++++++++++++++++++++------------- 4 files changed, 81 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4105751eb..e2c54e3d62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,8 @@ A brief description of the categories of changes: {obj}`--bootstrap_impl=script`. This fixes invocations using non-sandboxed test execution with `--enable_runfiles=false --build_runfile_manifests=true`. ([#2186](https://github.com/bazelbuild/rules_python/issues/2186)). +* (py_wheel) Fix incorrectly generated `Required-Dist` when specifying requirements with markers + in extra_requires in py_wheel rule. ### Added diff --git a/examples/wheel/BUILD.bazel b/examples/wheel/BUILD.bazel index aa063ce542..1eaf03525a 100644 --- a/examples/wheel/BUILD.bazel +++ b/examples/wheel/BUILD.bazel @@ -333,6 +333,27 @@ py_wheel( version = "0.0.1", ) +py_wheel( + name = "extra_requires", + distribution = "extra_requires", + extra_requires = {"example": [ + "pyyaml>=6.0.0,!=6.0.1", + 'toml; (python_version == "3.11" or python_version == "3.12") and python_version != "3.8"', + 'wheel; python_version == "3.11" or python_version == "3.12" ', + ]}, + python_tag = "py3", + # py_wheel can use text files to specify their requirements. This + # can be convenient for users of `compile_pip_requirements` who have + # granular `requirements.in` files per package. + requires = [ + "tomli>=2.0.0", + "starlark", + 'pytest; python_version != "3.8"', + ], + version = "0.0.1", + deps = [":example_pkg"], +) + py_test( name = "wheel_test", srcs = ["wheel_test.py"], @@ -341,6 +362,7 @@ py_test( ":custom_package_root_multi_prefix", ":custom_package_root_multi_prefix_reverse_order", ":customized", + ":extra_requires", ":filename_escaping", ":minimal_data_files", ":minimal_with_py_library", diff --git a/examples/wheel/wheel_test.py b/examples/wheel/wheel_test.py index 66ebd5044d..72124232bf 100644 --- a/examples/wheel/wheel_test.py +++ b/examples/wheel/wheel_test.py @@ -489,6 +489,36 @@ def test_minimal_data_files(self): ], ) + def test_extra_requires(self): + filename = self._get_path("extra_requires-0.0.1-py3-none-any.whl") + + with zipfile.ZipFile(filename) as zf: + self.assertAllEntriesHasReproducibleMetadata(zf) + metadata_file = None + for f in zf.namelist(): + if os.path.basename(f) == "METADATA": + metadata_file = f + self.assertIsNotNone(metadata_file) + + requires = [] + with zf.open(metadata_file) as fp: + for line in fp: + if line.startswith(b"Requires-Dist:"): + requires.append(line.decode("utf-8").strip()) + + print(requires) + self.assertEqual( + [ + "Requires-Dist: tomli>=2.0.0", + "Requires-Dist: starlark", + 'Requires-Dist: pytest; python_version != "3.8"', + "Requires-Dist: pyyaml!=6.0.1,>=6.0.0; extra == 'example'", + 'Requires-Dist: toml; ((python_version == "3.11" or python_version == "3.12") and python_version != "3.8") and extra == \'example\'', + 'Requires-Dist: wheel; (python_version == "3.11" or python_version == "3.12") and extra == \'example\'', + ], + requires, + ) + if __name__ == "__main__": unittest.main() diff --git a/tools/wheelmaker.py b/tools/wheelmaker.py index 8fa3e02d14..68578b8e58 100644 --- a/tools/wheelmaker.py +++ b/tools/wheelmaker.py @@ -537,9 +537,34 @@ def main() -> None: # Search for any `Requires-Dist` entries that refer to other files and # expand them. + + def get_new_requirement_line(reqs_text, extra): + req = Requirement(reqs_text.strip()) + if req.marker: + if extra: + return f"Requires-Dist: {req.name}{req.specifier}; ({req.marker}) and {extra}" + else: + return f"Requires-Dist: {req.name}{req.specifier}; {req.marker}" + else: + return f"Requires-Dist: {req.name}{req.specifier}; {extra}".strip(" ;") + for meta_line in metadata.splitlines(): - if not meta_line.startswith("Requires-Dist: @"): + if not meta_line.startswith("Requires-Dist: "): continue + + if not meta_line[len("Requires-Dist: ") :].startswith("@"): + # This is a normal requirement. + package, _, extra = meta_line[len("Requires-Dist: ") :].rpartition(";") + if not package: + # This is when the package requirement does not have markers. + continue + extra = extra.strip() + metadata = metadata.replace( + meta_line, get_new_requirement_line(package, extra) + ) + continue + + # This is a requirement that refers to a file. file, _, extra = meta_line[len("Requires-Dist: @") :].partition(";") extra = extra.strip() @@ -552,20 +577,7 @@ def main() -> None: # Strip any comments reqs_text, _, _ = reqs_text.partition("#") - req = Requirement(reqs_text.strip()) - if req.marker: - if extra: - reqs.append( - f"Requires-Dist: {req.name}{req.specifier}; ({req.marker}) and {extra}" - ) - else: - reqs.append( - f"Requires-Dist: {req.name}{req.specifier}; {req.marker}" - ) - else: - reqs.append( - f"Requires-Dist: {req.name}{req.specifier}; {extra}".strip(" ;") - ) + reqs.append(get_new_requirement_line(reqs_text, extra)) metadata = metadata.replace(meta_line, "\n".join(reqs)) From c804a13fe918f1e820a829a73d5fb951d6788c46 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 9 Sep 2024 10:10:34 +0900 Subject: [PATCH 200/345] feat(toolchain): add patch_strip attr for python_repository (#2201) This value has been hardcoded for a long time, so let's add the `patch_strip` attribute to the `WORKSPACE` setups now so that we add less tech debt in the `bzlmod` world later and need to migrate `bzlmod` users from the hard coded value to something that can be configured. This should be backwards compatible because of the default `int` value of `1` for the `patch_strip` attribute. Summary: - feat: add `patch_strip` to `python_repository`. - feat: add the default value of patch_strip to get_release_info. - refactor: handle patch_strip key in `TOOL_VERSIONS`. Work towards #2081. --------- Co-authored-by: Richard Levasseur --- CHANGELOG.md | 7 +++++++ examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/python_repositories.bzl | 21 +++++++++++++++++++-- python/versions.bzl | 12 +++++++++--- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2c54e3d62..7e2f9bb1fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,13 @@ A brief description of the categories of changes: have it installed. * (docs) Automatically generated documentation for {bzl:obj}`python_register_toolchains` and related symbols. +* (toolchains) Added {attr}`python_repository.patch_strip` attribute for + allowing values that are other than `1`, which has been hard-coded up until + now. If you are relying on the undocumented `patches` support in + `TOOL_VERSIONS` for registering patched toolchains please consider setting + the `patch_strip` explicitly to `1` if you depend on this value - in the + future the value may change to default to `0`. + ### Removed * (toolchains): Removed accidentally exposed `http_archive` symbol from diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index df0c96d6ca..6964e11fd7 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1231,7 +1231,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "NoDlhLqt5TG5tTcsLeBN6mnecYE+w8R4pvOKOF0ctC4=", + "bzlTransitiveDigest": "ofS5ggL4YnyCZejN3Rimf+XXWMSwuWypjGghv3fbAGY=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6140,7 +6140,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "sh8kec0fTFOgrFmLOXLvQRfq+2g3Uv7rF0gj5xqnzKQ=", + "bzlTransitiveDigest": "LJJOkml9ZwY4i0WJnh+pN5fZUQLciL7hPL27L8kNYeI=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/python/private/python_repositories.bzl b/python/private/python_repositories.bzl index 8675399699..46b2e293bf 100644 --- a/python/private/python_repositories.bzl +++ b/python/private/python_repositories.bzl @@ -179,7 +179,7 @@ def _python_repository_impl(rctx): if patches: for patch in patches: # Should take the strip as an attr, but this is fine for the moment - rctx.patch(patch, strip = 1) + rctx.patch(patch, strip = rctx.attr.patch_strip) # Write distutils.cfg to the Python installation. if "windows" in platform: @@ -450,6 +450,7 @@ py_exec_tools_toolchain( "ignore_root_user_error": rctx.attr.ignore_root_user_error, "name": rctx.attr.name, "netrc": rctx.attr.netrc, + "patch_strip": rctx.attr.patch_strip, "patches": rctx.attr.patches, "platform": platform, "python_version": python_version, @@ -515,6 +516,21 @@ For more information see the official bazel docs "netrc": attr.string( doc = ".netrc file to use for authentication; mirrors the eponymous attribute from http_archive", ), + "patch_strip": attr.int( + doc = """ +Same as the --strip argument of Unix patch. + +:::{note} +In the future the default value will be set to `0`, to mimic the well known +function defaults (e.g. `single_version_override` for `MODULE.bazel` files. +::: + +:::{versionadded} 0.36.0 +::: +""", + default = 1, + mandatory = False, + ), "patches": attr.label_list( doc = "A list of patch files to apply to the unpacked interpreter", mandatory = False, @@ -627,7 +643,7 @@ def python_register_toolchains( continue loaded_platforms.append(platform) - (release_filename, urls, strip_prefix, patches) = get_release_info(platform, python_version, base_url, tool_versions) + (release_filename, urls, strip_prefix, patches, patch_strip) = get_release_info(platform, python_version, base_url, tool_versions) # allow passing in a tool version coverage_tool = None @@ -653,6 +669,7 @@ def python_register_toolchains( ), sha256 = sha256, patches = patches, + patch_strip = patch_strip, platform = platform, python_version = python_version, release_filename = release_filename, diff --git a/python/versions.bzl b/python/versions.bzl index 2cf9b39e96..79e388db12 100644 --- a/python/versions.bzl +++ b/python/versions.bzl @@ -41,7 +41,7 @@ DEFAULT_RELEASE_BASE_URL = "https://github.com/indygreg/python-build-standalone/ # "strip_prefix": "python", # }, # -# It is possible to provide lists in "url". +# It is possible to provide lists in "url". It is also possible to provide patches or patch_strip. # # buildifier: disable=unsorted-dict-items TOOL_VERSIONS = { @@ -636,7 +636,7 @@ def get_release_info(platform, python_version, base_url = DEFAULT_RELEASE_BASE_U tool_versions: A dict listing the interpreter versions, their SHAs and URL Returns: - A tuple of (filename, url, and archive strip prefix) + A tuple of (filename, url, archive strip prefix, patches, patch_strip) """ url = tool_versions[python_version]["url"] @@ -673,8 +673,14 @@ def get_release_info(platform, python_version, base_url = DEFAULT_RELEASE_BASE_U patches = patches[platform] else: patches = [] + patch_strip = tool_versions[python_version].get("patch_strip", None) + if type(patch_strip) == type({}): + if platform in patch_strip.keys(): + patch_strip = patch_strip[platform] + else: + patch_strip = None - return (release_filename, rendered_urls, strip_prefix, patches) + return (release_filename, rendered_urls, strip_prefix, patches, patch_strip) def print_toolchains_checksums(name): native.genrule( From fcd1d5e9993306891a41b100a80ea407eb3802bc Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 8 Sep 2024 18:54:45 -0700 Subject: [PATCH 201/345] feat: default `py_runtime` version info to `--python_version` (#2198) This changes `py_runtime` to get its interpreter version from the `--python_version` flag if it wasn't explicitly specified. This is useful in two contexts: For the runtime env toolchains, a local toolchain, or platform interpreter (basically any py_runtime without a known version), it allows getting some Python version into the analysis phase, which allows e.g. precompiling. For environments using embedded Python, it allows defining fewer (e.g. 1) `py_runtime` target instead of one for every Python version. This is because `py_runtime` serves a minor role in such builds. --- CHANGELOG.md | 4 ++ python/private/common/py_runtime_rule.bzl | 47 +++++++++++++++++------ tests/py_runtime/py_runtime_tests.bzl | 29 ++++++++++++++ 3 files changed, 69 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e2f9bb1fb..c4c99206b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,10 @@ A brief description of the categories of changes: * (gazelle): Update error messages when unable to resolve a dependency to be more human-friendly. * (flags) The {obj}`--python_version` flag now also returns {obj}`config_common.FeatureFlagInfo`. +* (toolchains) When {obj}`py_runtime.interpreter_version_info` isn't specified, + the {obj}`--python_version` flag will determine the value. This allows + specifying the build-time Python version for the + {obj}`runtime_env_toolchains`. * (toolchains) {obj}`py_cc_toolchain.libs` and {obj}`PyCcToolchainInfo.libs` is optional. This is to support situations where only the Python headers are available. diff --git a/python/private/common/py_runtime_rule.bzl b/python/private/common/py_runtime_rule.bzl index e0b5fb2313..dd40f76a00 100644 --- a/python/private/common/py_runtime_rule.bzl +++ b/python/private/common/py_runtime_rule.bzl @@ -15,6 +15,7 @@ load("@bazel_skylib//lib:dicts.bzl", "dicts") load("@bazel_skylib//lib:paths.bzl", "paths") +load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("//python/private:reexports.bzl", "BuiltinPyRuntimeInfo") load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") load(":attributes.bzl", "NATIVE_RULES_ALLOWLIST_ATTRS") @@ -80,6 +81,10 @@ def _py_runtime_impl(ctx): python_version = ctx.attr.python_version interpreter_version_info = ctx.attr.interpreter_version_info + if not interpreter_version_info: + python_version_flag = ctx.attr._python_version_flag[BuildSettingInfo].value + if python_version_flag: + interpreter_version_info = _interpreter_version_info_from_version_str(python_version_flag) # TODO: Uncomment this after --incompatible_python_disable_py2 defaults to true # if ctx.fragments.py.disable_py2 and python_version == "PY2": @@ -133,13 +138,6 @@ def _py_runtime_impl(ctx): ), ] -def _is_singleton_depset(files): - # Bazel 6 doesn't have this helper to optimize detecting singleton depsets. - if _py_builtins: - return _py_builtins.is_singleton_depset(files) - else: - return len(files.to_list()) == 1 - # Bind to the name "py_runtime" to preserve the kind/rule_class it shows up # as elsewhere. py_runtime = rule( @@ -260,15 +258,22 @@ the target platform. For an in-build runtime this attribute must not be set. """), "interpreter_version_info": attr.string_dict( doc = """ -Version information about the interpreter this runtime provides. The -supported keys match the names for `sys.version_info`. While the input +Version information about the interpreter this runtime provides. + +If not specified, uses {obj}`--python_version` + +The supported keys match the names for `sys.version_info`. While the input values are strings, most are converted to ints. The supported keys are: * major: int, the major version number * minor: int, the minor version number * micro: optional int, the micro version number * releaselevel: optional str, the release level - * serial: optional int, the serial number of the release" - """, + * serial: optional int, the serial number of the release + +:::{versionchanged} 0.36.0 +{obj}`--python_version` determines the default value. +::: +""", mandatory = False, ), "pyc_tag": attr.string( @@ -327,5 +332,25 @@ The {obj}`PyRuntimeInfo.zip_main_template` field. ::: """, ), + "_python_version_flag": attr.label( + default = "//python/config_settings:python_version", + ), }), ) + +def _is_singleton_depset(files): + # Bazel 6 doesn't have this helper to optimize detecting singleton depsets. + if _py_builtins: + return _py_builtins.is_singleton_depset(files) + else: + return len(files.to_list()) == 1 + +def _interpreter_version_info_from_version_str(version_str): + parts = version_str.split(".") + version_info = {} + for key in ("major", "minor", "micro"): + if not parts: + break + version_info[key] = parts.pop(0) + + return version_info diff --git a/tests/py_runtime/py_runtime_tests.bzl b/tests/py_runtime/py_runtime_tests.bzl index 596cace4fc..d5a6076153 100644 --- a/tests/py_runtime/py_runtime_tests.bzl +++ b/tests/py_runtime/py_runtime_tests.bzl @@ -22,6 +22,7 @@ load("//python:py_runtime.bzl", "py_runtime") load("//python:py_runtime_info.bzl", "PyRuntimeInfo") load("//tests/base_rules:util.bzl", br_util = "util") load("//tests/support:py_runtime_info_subject.bzl", "py_runtime_info_subject") +load("//tests/support:support.bzl", "PYTHON_VERSION") _tests = [] @@ -528,6 +529,34 @@ def _test_interpreter_version_info_parses_values_to_struct_impl(env, target): _tests.append(_test_interpreter_version_info_parses_values_to_struct) +def _test_version_info_from_flag(name): + if not config.enable_pystar: + rt_util.skip_test(name) + return + py_runtime( + name = name + "_subject", + interpreter_version_info = None, + interpreter_path = "/bogus", + ) + analysis_test( + name = name, + target = name + "_subject", + impl = _test_version_info_from_flag_impl, + config_settings = { + PYTHON_VERSION: "3.12", + }, + ) + +def _test_version_info_from_flag_impl(env, target): + version_info = env.expect.that_target(target).provider(PyRuntimeInfo, factory = py_runtime_info_subject).interpreter_version_info() + version_info.major().equals(3) + version_info.minor().equals(12) + version_info.micro().equals(None) + version_info.releaselevel().equals(None) + version_info.serial().equals(None) + +_tests.append(_test_version_info_from_flag) + def py_runtime_test_suite(name): test_suite( name = name, From acfc125eb5435040b820e2fa4b5992c7bd6ee544 Mon Sep 17 00:00:00 2001 From: IM Date: Mon, 9 Sep 2024 22:26:15 +0200 Subject: [PATCH 202/345] fix(sphinx): Support python 3.9 in Sphinx rules (#2208) The implementation of the Sphinx related rules uses language features and types only available in python > 3.9. To the best of my understanding, `rules_python` aims to support python3.9 and therefore this patch uses `typing-extensions` instead of the built-in types. After this change, one can use the `sphinx_build_binary` to create Sphinx docs using 3.9 runtime. This fixes #2207 --- sphinxdocs/src/sphinx_bzl/bzl.py | 40 ++++++++++++++++---------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/sphinxdocs/src/sphinx_bzl/bzl.py b/sphinxdocs/src/sphinx_bzl/bzl.py index 6d98e16898..2980ecb21e 100644 --- a/sphinxdocs/src/sphinx_bzl/bzl.py +++ b/sphinxdocs/src/sphinx_bzl/bzl.py @@ -34,7 +34,7 @@ from sphinx.util import inspect, logging from sphinx.util import nodes as sphinx_nodes from sphinx.util import typing as sphinx_typing -from typing_extensions import override +from typing_extensions import override, TypeAlias _logger = logging.getLogger(__name__) _LOG_PREFIX = f"[{_logger.name}] " @@ -46,10 +46,10 @@ _T = TypeVar("_T") # See https://www.sphinx-doc.org/en/master/extdev/domainapi.html#sphinx.domains.Domain.get_objects -_GetObjectsTuple: typing.TypeAlias = tuple[str, str, str, str, str, int] +_GetObjectsTuple: TypeAlias = tuple[str, str, str, str, str, int] # See SphinxRole.run definition; the docs for role classes are pretty sparse. -_RoleRunResult: typing.TypeAlias = tuple[ +_RoleRunResult: TypeAlias = tuple[ list[docutils_nodes.Node], list[docutils_nodes.system_message] ] @@ -126,9 +126,9 @@ def _index_node_tuple( entry_type: str, entry_name: str, target: str, - main: str | None = None, - category_key: str | None = None, -) -> tuple[str, str, str, str | None, str | None]: + main: typing.Union[str, None] = None, + category_key: typing.Union[str, None] = None, +) -> tuple[str, str, str, typing.Union[str, None], typing.Union[str, None]]: # For this tuple definition, see: # https://www.sphinx-doc.org/en/master/extdev/nodes.html#sphinx.addnodes.index # For the definition of entry_type, see: @@ -339,10 +339,10 @@ def make_xrefs( domain: str, target: str, innernode: type[sphinx_typing.TextlikeNode] = addnodes.literal_emphasis, - contnode: docutils_nodes.Node | None = None, - env: environment.BuildEnvironment | None = None, - inliner: states.Inliner | None = None, - location: docutils_nodes.Element | None = None, + contnode: typing.Union[docutils_nodes.Node, None] = None, + env: typing.Union[environment.BuildEnvironment, None] = None, + inliner: typing.Union[states.Inliner, None] = None, + location: typing.Union[docutils_nodes.Element, None] = None, ) -> list[docutils_nodes.Node]: if rolename in ("arg", "attr"): return self._make_xrefs_for_arg_attr( @@ -359,10 +359,10 @@ def _make_xrefs_for_arg_attr( domain: str, arg_name: str, innernode: type[sphinx_typing.TextlikeNode] = addnodes.literal_emphasis, - contnode: docutils_nodes.Node | None = None, - env: environment.BuildEnvironment | None = None, - inliner: states.Inliner | None = None, - location: docutils_nodes.Element | None = None, + contnode: typing.Union[docutils_nodes.Node, None] = None, + env: typing.Union[environment.BuildEnvironment, None] = None, + inliner: typing.Union[states.Inliner, None] = None, + location: typing.Union[docutils_nodes.Element, None] = None, ) -> list[docutils_nodes.Node]: bzl_file = env.ref_context["bzl:file"] anchor_prefix = ".".join(env.ref_context["bzl:doc_id_stack"]) @@ -445,8 +445,8 @@ def make_field( domain: str, item: tuple, env: environment.BuildEnvironment = None, - inliner: states.Inliner | None = None, - location: docutils_nodes.Element | None = None, + inliner: typing.Union[states.Inliner, None] = None, + location: typing.Union[docutils_nodes.Element, None] = None, ) -> docutils_nodes.field: field_text = item[1][0].astext() parts = [p.strip() for p in field_text.split(",")] @@ -552,7 +552,7 @@ def before_content(self) -> None: @override def transform_content(self, content_node: addnodes.desc_content) -> None: - def first_child_with_class_name(root, class_name) -> "None | Element": + def first_child_with_class_name(root, class_name) -> typing.Union[None, docutils_nodes.Element]: matches = root.findall( lambda node: isinstance(node, docutils_nodes.Element) and class_name in node["classes"] @@ -1509,7 +1509,7 @@ class _BzlDomain(domains.Domain): } @override - def get_full_qualified_name(self, node: docutils_nodes.Element) -> str | None: + def get_full_qualified_name(self, node: docutils_nodes.Element) -> typing.Union[str, None]: bzl_file = node.get("bzl:file") symbol_name = node.get("bzl:symbol") ref_target = node.get("reftarget") @@ -1553,7 +1553,7 @@ def resolve_xref( target: str, node: addnodes.pending_xref, contnode: docutils_nodes.Element, - ) -> docutils_nodes.Element | None: + ) -> typing.Union[docutils_nodes.Element, None]: _log_debug( "resolve_xref: fromdocname=%s, typ=%s, target=%s", fromdocname, typ, target ) @@ -1570,7 +1570,7 @@ def resolve_xref( def _find_entry_for_xref( self, fromdocname: str, object_type: str, target: str - ) -> _ObjectEntry | None: + ) -> typing.Union[_ObjectEntry, None]: if target.startswith("--"): target = target.strip("-") object_type = "flag" From 2a8b2e06934b1e4c4da7d28510655f79ea49dbc3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 11:26:46 +0900 Subject: [PATCH 203/345] build(deps): bump certifi from 2024.7.4 to 2024.8.30 in /docs (#2210) Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.7.4 to 2024.8.30.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=certifi&package-manager=pip&previous-version=2024.7.4&new-version=2024.8.30)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 808d797e79..2f461138d6 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -18,9 +18,9 @@ babel==2.16.0 \ --hash=sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b \ --hash=sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316 # via sphinx -certifi==2024.7.4 \ - --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ - --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 +certifi==2024.8.30 \ + --hash=sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 \ + --hash=sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9 # via requests charset-normalizer==3.3.2 \ --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ From a6cd158eeaa5d887480e90351596c94d32b18bce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Sep 2024 13:12:21 +0900 Subject: [PATCH 204/345] build(deps): bump mdit-py-plugins from 0.4.1 to 0.4.2 in /docs (#2209) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [mdit-py-plugins](https://github.com/executablebooks/mdit-py-plugins) from 0.4.1 to 0.4.2.
Release notes

Sourced from mdit-py-plugins's releases.

v0.4.2

What's Changed

New Contributors

Full Changelog: https://github.com/executablebooks/mdit-py-plugins/compare/v0.4.1...v0.4.2

Changelog

Sourced from mdit-py-plugins's changelog.

0.4.2 - 2024-09-09

  • 👌 Improve parsing of nested amsmath

    The previous logic was problematic for amsmath blocks nested in other blocs (such as blockquotes)

    The new parsing code now principally follows the logic in markdown_it/rules_block/fence.py (see also https://spec.commonmark.org/0.30/#fenced-code-blocks), except that:

    1. it allows for a closing tag on the same line as the opening tag, and
    2. it does not allow for an opening tag without closing tag (i.e. no auto-closing)
  • ✨ Add allowed option for inline/block attributes

    The allowed option accepts a list of allowed attribute names. If not None, any attributes not in this list will be removed and placed in the token's meta under the key "insecure_attrs".

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=mdit-py-plugins&package-manager=pip&previous-version=0.4.1&new-version=0.4.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 2f461138d6..7b5681d82a 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -208,9 +208,9 @@ markupsafe==2.1.5 \ --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 # via jinja2 -mdit-py-plugins==0.4.1 \ - --hash=sha256:1020dfe4e6bfc2c79fb49ae4e3f5b297f5ccd20f010187acc52af2921e27dc6a \ - --hash=sha256:834b8ac23d1cd60cec703646ffd22ae97b7955a6d596eb1d304be1e251ae499c +mdit-py-plugins==0.4.2 \ + --hash=sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636 \ + --hash=sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5 # via myst-parser mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ From 7d42a93a55aa1d3a8778eb80bc690cf6e90eb769 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 10 Sep 2024 14:42:36 -0700 Subject: [PATCH 205/345] tests: make precompile tests pass when other toolchains are defined (#2213) This makes the precompile_tests pass when the environment defines custom toolchains that don't match what rules_python defines in its dev environment. This keeps the tests independent of whatever the user's environment is. Basically, the tests rely on a fake Python version 4.5 toolchain for the precompiler being defined. They pass today because they fallback to a real toolchain (as setup by MODULE.bazel), which doesn't have any version constraints on it. In comparison, within Google, there is no "default" toolchain, so the tests fail to find what they need. To fix, explicitly define a fake precompiler toolchain and tell the test to use it. Along the way: * Also force `--allow_unresolved_symlinks=true` in the tests. This flag isn't enabled in certain environments, but is implicitly relied upon by the `current_interpreter_executable` rule when a platform runtime is used (as they are in the tests). * Move the Python testing toolchains to support/py_toolchains, to match where the cc testing toolchains were moved. --- .../precompile/precompile_tests.bzl | 37 +++++------- tests/support/BUILD.bazel | 23 -------- tests/support/py_toolchains/BUILD | 59 +++++++++++++++++++ tests/support/support.bzl | 2 +- 4 files changed, 74 insertions(+), 47 deletions(-) create mode 100644 tests/support/py_toolchains/BUILD diff --git a/tests/base_rules/precompile/precompile_tests.bzl b/tests/base_rules/precompile/precompile_tests.bzl index e2ffdc8bb4..4c0f936ac5 100644 --- a/tests/base_rules/precompile/precompile_tests.bzl +++ b/tests/base_rules/precompile/precompile_tests.bzl @@ -28,13 +28,19 @@ load( "//tests/support:support.bzl", "CC_TOOLCHAIN", "EXEC_TOOLS_TOOLCHAIN", - "PLATFORM_TOOLCHAIN", "PRECOMPILE", "PRECOMPILE_ADD_TO_RUNFILES", "PRECOMPILE_SOURCE_RETENTION", + "PY_TOOLCHAINS", ) -_TEST_TOOLCHAINS = [PLATFORM_TOOLCHAIN, CC_TOOLCHAIN] +_COMMON_CONFIG_SETTINGS = { + # This isn't enabled in all environments the tests run in, so disable + # it for conformity. + "//command_line_option:allow_unresolved_symlinks": True, + "//command_line_option:extra_toolchains": [PY_TOOLCHAINS, CC_TOOLCHAIN], + EXEC_TOOLS_TOOLCHAIN: "enabled", +} _tests = [] @@ -60,10 +66,7 @@ def _test_precompile_enabled_setup(name, py_rule, **kwargs): name = name, impl = _test_precompile_enabled_impl, target = name + "_subject", - config_settings = { - "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, - EXEC_TOOLS_TOOLCHAIN: "enabled", - }, + config_settings = _COMMON_CONFIG_SETTINGS, ) def _test_precompile_enabled_impl(env, target): @@ -118,10 +121,8 @@ def _test_pyc_only(name): analysis_test( name = name, impl = _test_pyc_only_impl, - config_settings = { - "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, + config_settings = _COMMON_CONFIG_SETTINGS | { ##PRECOMPILE_SOURCE_RETENTION: "omit_source", - EXEC_TOOLS_TOOLCHAIN: "enabled", PRECOMPILE: "enabled", }, target = name + "_subject", @@ -163,10 +164,7 @@ def _test_precompile_if_generated(name): name = name, impl = _test_precompile_if_generated_impl, target = name + "_subject", - config_settings = { - "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, - EXEC_TOOLS_TOOLCHAIN: "enabled", - }, + config_settings = _COMMON_CONFIG_SETTINGS, ) _tests.append(_test_precompile_if_generated) @@ -205,10 +203,8 @@ def _test_omit_source_if_generated_source(name): name = name, impl = _test_omit_source_if_generated_source_impl, target = name + "_subject", - config_settings = { - "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, + config_settings = _COMMON_CONFIG_SETTINGS | { PRECOMPILE_SOURCE_RETENTION: "omit_if_generated_source", - EXEC_TOOLS_TOOLCHAIN: "enabled", }, ) @@ -254,11 +250,9 @@ def _test_precompile_add_to_runfiles_decided_elsewhere(name): "binary": name + "_binary", "library": name + "_lib", }, - config_settings = { - "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, + config_settings = _COMMON_CONFIG_SETTINGS | { PRECOMPILE_ADD_TO_RUNFILES: "decided_elsewhere", PRECOMPILE: "enabled", - EXEC_TOOLS_TOOLCHAIN: "enabled", }, ) @@ -293,10 +287,7 @@ def _test_precompiler_action(name): name = name, impl = _test_precompiler_action_impl, target = name + "_subject", - config_settings = { - "//command_line_option:extra_toolchains": _TEST_TOOLCHAINS, - EXEC_TOOLS_TOOLCHAIN: "enabled", - }, + config_settings = _COMMON_CONFIG_SETTINGS, ) _tests.append(_test_precompiler_action) diff --git a/tests/support/BUILD.bazel b/tests/support/BUILD.bazel index 58c74d6d48..9fb5cd0760 100644 --- a/tests/support/BUILD.bazel +++ b/tests/support/BUILD.bazel @@ -18,8 +18,6 @@ # to force them to resolve in the proper context. # ==================== -load("//python:py_runtime.bzl", "py_runtime") -load("//python:py_runtime_pair.bzl", "py_runtime_pair") load(":sh_py_run_test.bzl", "current_build_settings") package( @@ -89,27 +87,6 @@ platform( ], ) -py_runtime( - name = "platform_runtime", - implementation_name = "fakepy", - interpreter_path = "/fake/python3.9", - interpreter_version_info = { - "major": "4", - "minor": "5", - }, -) - -py_runtime_pair( - name = "platform_runtime_pair", - py3_runtime = ":platform_runtime", -) - -toolchain( - name = "platform_toolchain", - toolchain = ":platform_runtime_pair", - toolchain_type = "//python:toolchain_type", -) - current_build_settings( name = "current_build_settings", ) diff --git a/tests/support/py_toolchains/BUILD b/tests/support/py_toolchains/BUILD new file mode 100644 index 0000000000..185c7ae2da --- /dev/null +++ b/tests/support/py_toolchains/BUILD @@ -0,0 +1,59 @@ +# 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. + +# ==================== +# NOTE: tests/support/support.bzl has constants to easily refer to +# these toolchains. +# ==================== + +load("//python:py_runtime.bzl", "py_runtime") +load("//python:py_runtime_pair.bzl", "py_runtime_pair") +load("//python/private:py_exec_tools_toolchain.bzl", "py_exec_tools_toolchain") # buildifier: disable=bzl-visibility + +# NOTE: A platform runtime is used because it doesn't include any files. This +# makes it easier for analysis tests to verify content. +py_runtime( + name = "platform_runtime", + implementation_name = "fakepy", + interpreter_path = "/fake/python3.9", + interpreter_version_info = { + "major": "4", + "minor": "5", + }, +) + +py_runtime_pair( + name = "platform_runtime_pair", + py3_runtime = ":platform_runtime", +) + +toolchain( + name = "platform_toolchain", + toolchain = ":platform_runtime_pair", + toolchain_type = "//python:toolchain_type", +) + +toolchain( + name = "exec_toolchain", + toolchain = ":exec_toolchain_impl", + toolchain_type = "//python:exec_tools_toolchain_type", +) + +# An exec toolchain is explicitly defined so that the tests pass when run +# in environments that aren't using the toolchains generated by the +# hermetic runtimes. +py_exec_tools_toolchain( + name = "exec_toolchain_impl", + precompiler = "//tools/precompiler:precompiler", +) diff --git a/tests/support/support.bzl b/tests/support/support.bzl index b7d8fa9fa6..150ca7f4a4 100644 --- a/tests/support/support.bzl +++ b/tests/support/support.bzl @@ -26,7 +26,7 @@ LINUX_X86_64 = Label("//tests/support:linux_x86_64") WINDOWS = Label("//tests/support:windows") WINDOWS_X86_64 = Label("//tests/support:windows_x86_64") -PLATFORM_TOOLCHAIN = str(Label("//tests/support:platform_toolchain")) +PY_TOOLCHAINS = str(Label("//tests/support/py_toolchains:all")) CC_TOOLCHAIN = str(Label("//tests/support/cc_toolchains:all")) CROSSTOOL_TOP = Label("//tests/support/cc_toolchains:cc_toolchain_suite") From c9972d303cca4fe2567eb5920015726405013aea Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Wed, 11 Sep 2024 11:24:26 +0900 Subject: [PATCH 206/345] test(bzlmod): add python.toolchain unit tests (#2204) With this PR we get rudimentary unit tests for the `python` bzlmod extension which allows us to unit test the override behaviour that will become more complex soon. Summary: - refactor: inline the python_register_toolchains - refactor: use toolchain_info to call python_register_toolchains - refactor: move the registration out of the main loop - refactor: split the parsing of the modules to a separate function - test(bzlmod): add python.toolchain module parsing tests Work towards #2081 --------- Co-authored-by: Richard Levasseur --- python/private/python.bzl | 89 +++++++----- tests/python/BUILD.bazel | 17 +++ tests/python/python_tests.bzl | 253 ++++++++++++++++++++++++++++++++++ 3 files changed, 328 insertions(+), 31 deletions(-) create mode 100644 tests/python/BUILD.bazel create mode 100644 tests/python/python_tests.bzl diff --git a/python/private/python.bzl b/python/private/python.bzl index 6a265d1395..e1d13b9f1c 100644 --- a/python/private/python.bzl +++ b/python/private/python.bzl @@ -28,22 +28,21 @@ load(":util.bzl", "IS_BAZEL_6_4_OR_HIGHER") _MAX_NUM_TOOLCHAINS = 9999 _TOOLCHAIN_INDEX_PAD_LENGTH = len(str(_MAX_NUM_TOOLCHAINS)) -def _python_register_toolchains(name, toolchain_attr, module, ignore_root_user_error): - """Calls python_register_toolchains and returns a struct used to collect the toolchains. +def parse_modules(module_ctx): + """Parse the modules and return a struct for registrations. + + Args: + module_ctx: {type}`module_ctx` module context. + + Returns: + A struct with the following attributes: + * `toolchains`: The list of toolchains to register. The last + element is special and is treated as the default toolchain. + * `defaults`: The default `kwargs` passed to + {bzl:obj}`python_register_toolchains`. + * `debug_info`: {type}`None | dict` extra information to be passed + to the debug repo. """ - python_register_toolchains( - name = name, - python_version = toolchain_attr.python_version, - register_coverage_tool = toolchain_attr.configure_coverage_tool, - ignore_root_user_error = ignore_root_user_error, - ) - return struct( - python_version = toolchain_attr.python_version, - name = name, - module = struct(name = module.name, is_root = module.is_root), - ) - -def _python_impl(module_ctx): if module_ctx.os.environ.get("RULES_PYTHON_BZLMOD_DEBUG", "0") == "1": debug_info = { "toolchains_registered": [], @@ -61,7 +60,7 @@ def _python_impl(module_ctx): # This is a toolchain_info struct. default_toolchain = None - # Map of string Major.Minor to the toolchain_info struct + # Map of version string to the toolchain_info struct global_toolchain_versions = {} ignore_root_user_error = None @@ -139,11 +138,11 @@ def _python_impl(module_ctx): ) toolchain_info = None else: - toolchain_info = _python_register_toolchains( - toolchain_name, - toolchain_attr, - module = mod, - ignore_root_user_error = ignore_root_user_error, + toolchain_info = struct( + python_version = toolchain_attr.python_version, + name = toolchain_name, + register_coverage_tool = toolchain_attr.configure_coverage_tool, + module = struct(name = mod.name, is_root = mod.is_root), ) global_toolchain_versions[toolchain_version] = toolchain_info if debug_info: @@ -184,23 +183,51 @@ def _python_impl(module_ctx): if len(toolchains) > _MAX_NUM_TOOLCHAINS: fail("more than {} python versions are not supported".format(_MAX_NUM_TOOLCHAINS)) + return struct( + toolchains = [ + struct( + python_version = t.python_version, + name = t.name, + register_coverage_tool = t.register_coverage_tool, + ) + for t in toolchains + ], + debug_info = debug_info, + default_python_version = toolchains[-1].python_version, + defaults = { + "ignore_root_user_error": ignore_root_user_error, + }, + ) + +def _python_impl(module_ctx): + py = parse_modules(module_ctx) + + for toolchain_info in py.toolchains: + python_register_toolchains( + name = toolchain_info.name, + python_version = toolchain_info.python_version, + register_coverage_tool = toolchain_info.register_coverage_tool, + **py.defaults + ) + # Create the pythons_hub repo for the interpreter meta data and the # the various toolchains. hub_repo( name = "pythons_hub", - default_python_version = default_toolchain.python_version, + # Last toolchain is default + default_python_version = py.default_python_version, toolchain_prefixes = [ render.toolchain_prefix(index, toolchain.name, _TOOLCHAIN_INDEX_PAD_LENGTH) - for index, toolchain in enumerate(toolchains) + for index, toolchain in enumerate(py.toolchains) ], - toolchain_python_versions = [t.python_version for t in toolchains], + toolchain_python_versions = [t.python_version for t in py.toolchains], # The last toolchain is the default; it can't have version constraints # Despite the implication of the arg name, the values are strs, not bools toolchain_set_python_version_constraints = [ - "True" if i != len(toolchains) - 1 else "False" - for i in range(len(toolchains)) + "True" if i != len(py.toolchains) - 1 else "False" + for i in range(len(py.toolchains)) ], - toolchain_user_repository_names = [t.name for t in toolchains], + toolchain_user_repository_names = [t.name for t in py.toolchains], ) # This is require in order to support multiple version py_test @@ -208,15 +235,15 @@ def _python_impl(module_ctx): multi_toolchain_aliases( name = "python_versions", python_versions = { - version: toolchain.name - for version, toolchain in global_toolchain_versions.items() + toolchain.python_version: toolchain.name + for toolchain in py.toolchains }, ) - if debug_info != None: + if py.debug_info != None: _debug_repo( name = "rules_python_bzlmod_debug", - debug_info = json.encode_indent(debug_info), + debug_info = json.encode_indent(py.debug_info), ) if bazel_features.external_deps.extension_metadata_has_reproducible: diff --git a/tests/python/BUILD.bazel b/tests/python/BUILD.bazel new file mode 100644 index 0000000000..2553536b63 --- /dev/null +++ b/tests/python/BUILD.bazel @@ -0,0 +1,17 @@ +# 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(":python_tests.bzl", "python_test_suite") + +python_test_suite(name = "python_tests") diff --git a/tests/python/python_tests.bzl b/tests/python/python_tests.bzl new file mode 100644 index 0000000000..acbd6676dc --- /dev/null +++ b/tests/python/python_tests.bzl @@ -0,0 +1,253 @@ +# 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:python.bzl", _parse_modules = "parse_modules") # buildifier: disable=bzl-visibility + +_tests = [] + +def parse_modules(*, mctx, **kwargs): + return _parse_modules(module_ctx = mctx, **kwargs) + +def _mock_mctx(*modules, environ = {}): + return struct( + os = struct(environ = environ), + 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, toolchain = [], rules_python_private_testing = [], is_root = True): + return struct( + name = name, + tags = struct( + toolchain = toolchain, + rules_python_private_testing = rules_python_private_testing, + ), + is_root = is_root, + ) + +def _toolchain(python_version, *, is_default = False, **kwargs): + return struct( + is_default = is_default, + python_version = python_version, + **kwargs + ) + +def _test_default(env): + py = parse_modules( + mctx = _mock_mctx( + _mod(name = "rules_python", toolchain = [_toolchain("3.11")]), + ), + ) + + env.expect.that_collection(py.defaults.keys()).contains_exactly([ + "ignore_root_user_error", + ]) + env.expect.that_bool(py.defaults["ignore_root_user_error"]).equals(False) + env.expect.that_str(py.default_python_version).equals("3.11") + + want_toolchain = struct( + name = "python_3_11", + python_version = "3.11", + register_coverage_tool = False, + ) + env.expect.that_collection(py.toolchains).contains_exactly([want_toolchain]) + +_tests.append(_test_default) + +def _test_default_some_module(env): + py = parse_modules( + mctx = _mock_mctx( + _mod(name = "rules_python", toolchain = [_toolchain("3.11")], is_root = False), + ), + ) + + env.expect.that_collection(py.defaults.keys()).contains_exactly([ + "ignore_root_user_error", + ]) + env.expect.that_str(py.default_python_version).equals("3.11") + + want_toolchain = struct( + name = "python_3_11", + python_version = "3.11", + register_coverage_tool = False, + ) + env.expect.that_collection(py.toolchains).contains_exactly([want_toolchain]) + +_tests.append(_test_default_some_module) + +def _test_default_with_patch_version(env): + py = parse_modules( + mctx = _mock_mctx( + _mod(name = "rules_python", toolchain = [_toolchain("3.11.2")]), + ), + ) + + env.expect.that_str(py.default_python_version).equals("3.11.2") + + want_toolchain = struct( + name = "python_3_11_2", + python_version = "3.11.2", + register_coverage_tool = False, + ) + env.expect.that_collection(py.toolchains).contains_exactly([want_toolchain]) + +_tests.append(_test_default_with_patch_version) + +def _test_default_non_rules_python(env): + py = parse_modules( + mctx = _mock_mctx( + # NOTE @aignas 2024-09-06: the first item in the module_ctx.modules + # could be a non-root module, which is the case if the root module + # does not make any calls to the extension. + _mod(name = "rules_python", toolchain = [_toolchain("3.11")], is_root = False), + ), + ) + + env.expect.that_str(py.default_python_version).equals("3.11") + rules_python_toolchain = struct( + name = "python_3_11", + python_version = "3.11", + register_coverage_tool = False, + ) + env.expect.that_collection(py.toolchains).contains_exactly([rules_python_toolchain]) + +_tests.append(_test_default_non_rules_python) + +def _test_default_non_rules_python_ignore_root_user_error(env): + py = parse_modules( + mctx = _mock_mctx( + _mod( + name = "my_module", + toolchain = [_toolchain("3.12", ignore_root_user_error = True)], + ), + _mod(name = "rules_python", toolchain = [_toolchain("3.11")]), + ), + ) + + env.expect.that_bool(py.defaults["ignore_root_user_error"]).equals(True) + env.expect.that_str(py.default_python_version).equals("3.12") + + my_module_toolchain = struct( + name = "python_3_12", + python_version = "3.12", + register_coverage_tool = False, + ) + rules_python_toolchain = struct( + name = "python_3_11", + python_version = "3.11", + register_coverage_tool = False, + ) + env.expect.that_collection(py.toolchains).contains_exactly([ + rules_python_toolchain, + my_module_toolchain, + ]).in_order() + +_tests.append(_test_default_non_rules_python_ignore_root_user_error) + +def _test_default_non_rules_python_ignore_root_user_error_non_root_module(env): + py = parse_modules( + mctx = _mock_mctx( + _mod(name = "my_module", toolchain = [_toolchain("3.13")]), + _mod(name = "some_module", toolchain = [_toolchain("3.12", ignore_root_user_error = True)]), + _mod(name = "rules_python", toolchain = [_toolchain("3.11")]), + ), + ) + + env.expect.that_str(py.default_python_version).equals("3.13") + env.expect.that_bool(py.defaults["ignore_root_user_error"]).equals(False) + + my_module_toolchain = struct( + name = "python_3_13", + python_version = "3.13", + register_coverage_tool = False, + ) + some_module_toolchain = struct( + name = "python_3_12", + python_version = "3.12", + register_coverage_tool = False, + ) + rules_python_toolchain = struct( + name = "python_3_11", + python_version = "3.11", + register_coverage_tool = False, + ) + env.expect.that_collection(py.toolchains).contains_exactly([ + some_module_toolchain, + rules_python_toolchain, + my_module_toolchain, # this was the only toolchain, default to that + ]).in_order() + +_tests.append(_test_default_non_rules_python_ignore_root_user_error_non_root_module) + +def _test_first_occurance_of_the_toolchain_wins(env): + py = parse_modules( + mctx = _mock_mctx( + _mod(name = "my_module", toolchain = [_toolchain("3.12")]), + _mod(name = "some_module", toolchain = [_toolchain("3.12", configure_coverage_tool = True)]), + _mod(name = "rules_python", toolchain = [_toolchain("3.11")]), + environ = { + "RULES_PYTHON_BZLMOD_DEBUG": "1", + }, + ), + ) + + env.expect.that_str(py.default_python_version).equals("3.12") + + my_module_toolchain = struct( + name = "python_3_12", + python_version = "3.12", + # NOTE: coverage stays disabled even though `some_module` was + # configuring something else. + register_coverage_tool = False, + ) + rules_python_toolchain = struct( + name = "python_3_11", + python_version = "3.11", + register_coverage_tool = False, + ) + env.expect.that_collection(py.toolchains).contains_exactly([ + rules_python_toolchain, + my_module_toolchain, # default toolchain is last + ]).in_order() + env.expect.that_dict(py.debug_info).contains_exactly({ + "toolchains_registered": [ + {"ignore_root_user_error": False, "name": "python_3_12"}, + {"ignore_root_user_error": False, "name": "python_3_11"}, + ], + }) + +_tests.append(_test_first_occurance_of_the_toolchain_wins) + +def python_test_suite(name): + """Create the test suite. + + Args: + name: the name of the test suite + """ + test_suite(name = name, basic_tests = _tests) From 9b16bfb89aa0e8cc4cbbb21426af677b91ca083a Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 13 Sep 2024 12:12:11 +0900 Subject: [PATCH 207/345] chore: cleanup unused attributes for the host_toolchain repo rule (#2195) The attributes were not used, so we can remove them for now. --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/python_repositories.bzl | 7 +------ python/private/toolchains_repo.bzl | 8 -------- 3 files changed, 3 insertions(+), 16 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 6964e11fd7..d747ed35d7 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1231,7 +1231,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "ofS5ggL4YnyCZejN3Rimf+XXWMSwuWypjGghv3fbAGY=", + "bzlTransitiveDigest": "vzdh1M3LRVqyF10AVUO1+FOE7CZwlZaFT+7RgQ4OKXg=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6140,7 +6140,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "LJJOkml9ZwY4i0WJnh+pN5fZUQLciL7hPL27L8kNYeI=", + "bzlTransitiveDigest": "TgRegkReKbGzK4VxYz9up697gcf5Q8NFuZYnZHryck8=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/python/private/python_repositories.bzl b/python/private/python_repositories.bzl index 46b2e293bf..b65127b962 100644 --- a/python/private/python_repositories.bzl +++ b/python/private/python_repositories.bzl @@ -692,12 +692,7 @@ def python_register_toolchains( platform = platform, )) - host_toolchain( - name = name + "_host", - python_version = python_version, - user_repository_name = name, - platforms = loaded_platforms, - ) + host_toolchain(name = name + "_host") toolchain_aliases( name = name, diff --git a/python/private/toolchains_repo.bzl b/python/private/toolchains_repo.bzl index df16fb8cf7..21c4e905a4 100644 --- a/python/private/toolchains_repo.bzl +++ b/python/private/toolchains_repo.bzl @@ -314,14 +314,6 @@ toolchain_aliases repo because referencing the `python` interpreter target from this repo causes an eager fetch of the toolchain for the host platform. """, attrs = { - "platforms": attr.string_list( - doc = "List of platforms for which aliases shall be created", - ), - "python_version": attr.string(doc = "The Python version."), - "user_repository_name": attr.string( - mandatory = True, - doc = "The base name for all created repositories, like 'python38'.", - ), "_rule_name": attr.string(default = "host_toolchain"), "_rules_python_workspace": attr.label(default = Label("//:WORKSPACE")), }, From 451e62c46522fe155fdb842eb7f45261f5fb32e0 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 15 Sep 2024 10:00:18 +0900 Subject: [PATCH 208/345] refactor(internal): make the usage of MINOR_MAPPING variable explicit in full_version (#2219) This PR just makes the `MINOR_MAPPING` overridable and explicit in many macros/rules that we own. Even though technically new API is exposed, I am not sure if it is possible to use it and I am not sure if we should advertise it. Explicit minor_mapping results in easier wiring of `python.override` `bzlmod` extension tag class planned for #2081. --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/BUILD.bazel | 3 +-- python/private/config_settings.bzl | 11 ++++++----- python/private/full_version.bzl | 13 ++++++------- python/private/pypi/BUILD.bazel | 5 ++++- python/private/pypi/multi_pip_parse.bzl | 16 +++++++++++----- python/private/pypi/whl_library_alias.bzl | 6 +++++- python/private/python.bzl | 21 +++++++++++++-------- python/private/python_repositories.bzl | 15 ++++++++++++++- python/private/pythons_hub.bzl | 7 +++---- python/private/toolchains_repo.bzl | 3 +++ 11 files changed, 68 insertions(+), 36 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index d747ed35d7..af31a123a8 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1231,7 +1231,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "vzdh1M3LRVqyF10AVUO1+FOE7CZwlZaFT+7RgQ4OKXg=", + "bzlTransitiveDigest": "QxV2PiqVV2B5LpnSrlzLgYyKNbUEXyVc1u+ahMrefws=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6140,7 +6140,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "TgRegkReKbGzK4VxYz9up697gcf5Q8NFuZYnZHryck8=", + "bzlTransitiveDigest": "P0W31OsSgVVNQ3oRHHFiRWK7NLBLyI+KbQQBCPhou7w=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 7b913df2b3..3d23614425 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -114,7 +114,6 @@ bzl_library( bzl_library( name = "full_version_bzl", srcs = ["full_version.bzl"], - deps = ["//python:versions_bzl"], ) bzl_library( @@ -132,6 +131,7 @@ bzl_library( name = "python_bzl", srcs = ["python.bzl"], deps = [ + ":full_version_bzl", ":pythons_hub_bzl", ":repo_utils_bzl", ":toolchains_repo_bzl", @@ -164,7 +164,6 @@ bzl_library( deps = [ ":full_version_bzl", ":py_toolchain_suite_bzl", - "//python:versions_bzl", ], ) diff --git a/python/private/config_settings.bzl b/python/private/config_settings.bzl index 99b8b94adf..301a97b25d 100644 --- a/python/private/config_settings.bzl +++ b/python/private/config_settings.bzl @@ -27,14 +27,15 @@ def _ver_key(s): micro, _, s = s.partition(".") return (int(major), int(minor), int(micro)) -def _flag_values(python_versions): +def _flag_values(*, python_versions, minor_mapping): """Construct a map of python_version to a list of toolchain values. This mapping maps the concept of a config setting to a list of compatible toolchain versions. For using this in the code, the VERSION_FLAG_VALUES should be used instead. Args: - python_versions: list of strings; all X.Y.Z python versions + python_versions: {type}`list[str]` X.Y.Z` python versions. + minor_mapping: {type}`dict[str, str]` `X.Y` to `X.Y.Z` mapping. Returns: A `map[str, list[str]]`. Each key is a python_version flag value. Each value @@ -61,13 +62,13 @@ def _flag_values(python_versions): ret.setdefault(minor_version, [minor_version]).append(micro_version) # Ensure that is_python_3.9.8 is matched if python_version is set - # to 3.9 if MINOR_MAPPING points to 3.9.8 - default_micro_version = MINOR_MAPPING[minor_version] + # to 3.9 if minor_mapping points to 3.9.8 + default_micro_version = minor_mapping[minor_version] ret[micro_version] = [micro_version, minor_version] if default_micro_version == micro_version else [micro_version] return ret -VERSION_FLAG_VALUES = _flag_values(TOOL_VERSIONS.keys()) +VERSION_FLAG_VALUES = _flag_values(python_versions = TOOL_VERSIONS.keys(), minor_mapping = MINOR_MAPPING) def is_python_config_setting(name, *, python_version, reuse_conditions = None, **kwargs): """Create a config setting for matching 'python_version' configuration flag. diff --git a/python/private/full_version.bzl b/python/private/full_version.bzl index 98eeee59a1..0292d6c77d 100644 --- a/python/private/full_version.bzl +++ b/python/private/full_version.bzl @@ -14,20 +14,19 @@ """A small helper to ensure that we are working with full versions.""" -load("//python:versions.bzl", "MINOR_MAPPING") - -def full_version(version): +def full_version(*, version, minor_mapping): """Return a full version. Args: - version: the version in `X.Y` or `X.Y.Z` format. + version: {type}`str` the version in `X.Y` or `X.Y.Z` format. + minor_mapping: {type}`dict[str, str]` mapping between `X.Y` to `X.Y.Z` format. Returns: a full version given the version string. If the string is already a major version then we return it as is. """ - if version in MINOR_MAPPING: - return MINOR_MAPPING[version] + if version in minor_mapping: + return minor_mapping[version] parts = version.split(".") if len(parts) == 3: @@ -36,7 +35,7 @@ def full_version(version): fail( "Unknown Python version '{}', available values are: {}".format( version, - ",".join(MINOR_MAPPING.keys()), + ",".join(minor_mapping.keys()), ), ) else: diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel index 3b11dbe7f8..21f69bffb7 100644 --- a/python/private/pypi/BUILD.bazel +++ b/python/private/pypi/BUILD.bazel @@ -156,7 +156,10 @@ bzl_library( bzl_library( name = "multi_pip_parse_bzl", srcs = ["multi_pip_parse.bzl"], - deps = ["pip_repository_bzl"], + deps = [ + "pip_repository_bzl", + "//python/private:text_util_bzl", + ], ) bzl_library( diff --git a/python/private/pypi/multi_pip_parse.bzl b/python/private/pypi/multi_pip_parse.bzl index fe9e2db82d..6e824f674c 100644 --- a/python/private/pypi/multi_pip_parse.bzl +++ b/python/private/pypi/multi_pip_parse.bzl @@ -14,6 +14,7 @@ """A pip_parse implementation for version aware toolchains in WORKSPACE.""" +load("//python/private:text_util.bzl", "render") load(":pip_repository.bzl", pip_parse = "pip_repository") def _multi_pip_parse_impl(rctx): @@ -97,6 +98,7 @@ def install_deps(**whl_library_kwargs): name = "{name}_" + wheel_name, wheel_name = wheel_name, default_version = "{default_version}", + minor_mapping = {minor_mapping}, version_map = _version_map[wheel_name], ) """.format( @@ -107,6 +109,7 @@ def install_deps(**whl_library_kwargs): process_requirements_calls = "\n".join(process_requirements_calls), rules_python = rules_python, default_version = rctx.attr.default_version, + minor_mapping = render.indent(render.dict(rctx.attr.minor_mapping)).lstrip(), ) rctx.file("requirements.bzl", requirements_bzl) rctx.file("BUILD.bazel", "exports_files(['requirements.bzl'])") @@ -115,12 +118,13 @@ _multi_pip_parse = repository_rule( _multi_pip_parse_impl, attrs = { "default_version": attr.string(), + "minor_mapping": attr.string_dict(), "pip_parses": attr.string_dict(), "_rules_python_workspace": attr.label(default = Label("//:WORKSPACE")), }, ) -def multi_pip_parse(name, default_version, python_versions, python_interpreter_target, requirements_lock, **kwargs): +def multi_pip_parse(name, default_version, python_versions, python_interpreter_target, requirements_lock, minor_mapping, **kwargs): """NOT INTENDED FOR DIRECT USE! This is intended to be used by the multi_pip_parse implementation in the template of the @@ -128,10 +132,11 @@ def multi_pip_parse(name, default_version, python_versions, python_interpreter_t Args: name: the name of the multi_pip_parse repository. - default_version: the default Python version. - python_versions: all Python toolchain versions currently registered. - python_interpreter_target: a dictionary which keys are Python versions and values are resolved host interpreters. - requirements_lock: a dictionary which keys are Python versions and values are locked requirements files. + default_version: {type}`str` the default Python version. + python_versions: {type}`list[str]` all Python toolchain versions currently registered. + python_interpreter_target: {type}`dict[str, Label]` a dictionary which keys are Python versions and values are resolved host interpreters. + requirements_lock: {type}`dict[str, Label]` a dictionary which keys are Python versions and values are locked requirements files. + minor_mapping: {type}`dict[str, str]` mapping between `X.Y` to `X.Y.Z` format. **kwargs: extra arguments passed to all wrapped pip_parse. Returns: @@ -157,4 +162,5 @@ def multi_pip_parse(name, default_version, python_versions, python_interpreter_t name = name, default_version = default_version, pip_parses = pip_parses, + minor_mapping = minor_mapping, ) diff --git a/python/private/pypi/whl_library_alias.bzl b/python/private/pypi/whl_library_alias.bzl index 263d7ec0e7..d34b34a51a 100644 --- a/python/private/pypi/whl_library_alias.bzl +++ b/python/private/pypi/whl_library_alias.bzl @@ -29,6 +29,7 @@ def _whl_library_alias_impl(rctx): build_content.append(_whl_library_render_alias_target( alias_name = alias_name, default_repo_prefix = default_repo_prefix, + minor_mapping = rctx.attr.minor_mapping, rules_python = rules_python, version_map = version_map, wheel_name = rctx.attr.wheel_name, @@ -36,8 +37,10 @@ def _whl_library_alias_impl(rctx): rctx.file("BUILD.bazel", "\n".join(build_content)) def _whl_library_render_alias_target( + *, alias_name, default_repo_prefix, + minor_mapping, rules_python, version_map, wheel_name): @@ -48,7 +51,7 @@ alias( for [python_version, repo_prefix] in version_map: alias.append("""\ "@{rules_python}//python/config_settings:is_python_{full_python_version}": "{actual}",""".format( - full_python_version = full_version(python_version), + full_python_version = full_version(version = python_version, minor_mapping = minor_mapping), actual = "@{repo_prefix}{wheel_name}//:{alias_name}".format( repo_prefix = repo_prefix, wheel_name = wheel_name, @@ -92,6 +95,7 @@ whl_library_alias = repository_rule( "not specified, then the default rules won't be able to " + "resolve a wheel and an error will occur.", ), + "minor_mapping": attr.string_dict(mandatory = True), "version_map": attr.string_dict(mandatory = True), "wheel_name": attr.string(mandatory = True), "_rules_python_workspace": attr.label(default = Label("//:WORKSPACE")), diff --git a/python/private/python.bzl b/python/private/python.bzl index e1d13b9f1c..9a9a240cb3 100644 --- a/python/private/python.bzl +++ b/python/private/python.bzl @@ -16,9 +16,10 @@ load("@bazel_features//:features.bzl", "bazel_features") load("//python:repositories.bzl", "python_register_toolchains") -load("//python:versions.bzl", "TOOL_VERSIONS") -load("//python/private:repo_utils.bzl", "repo_utils") +load("//python:versions.bzl", "MINOR_MAPPING", "TOOL_VERSIONS") +load(":full_version.bzl", "full_version") load(":pythons_hub.bzl", "hub_repo") +load(":repo_utils.bzl", "repo_utils") load(":text_util.bzl", "render") load(":toolchains_repo.bzl", "multi_toolchain_aliases") load(":util.bzl", "IS_BAZEL_6_4_OR_HIGHER") @@ -184,6 +185,11 @@ def parse_modules(module_ctx): fail("more than {} python versions are not supported".format(_MAX_NUM_TOOLCHAINS)) return struct( + debug_info = debug_info, + default_python_version = toolchains[-1].python_version, + defaults = { + "ignore_root_user_error": ignore_root_user_error, + }, toolchains = [ struct( python_version = t.python_version, @@ -192,11 +198,6 @@ def parse_modules(module_ctx): ) for t in toolchains ], - debug_info = debug_info, - default_python_version = toolchains[-1].python_version, - defaults = { - "ignore_root_user_error": ignore_root_user_error, - }, ) def _python_impl(module_ctx): @@ -207,6 +208,7 @@ def _python_impl(module_ctx): name = toolchain_info.name, python_version = toolchain_info.python_version, register_coverage_tool = toolchain_info.register_coverage_tool, + minor_mapping = MINOR_MAPPING, **py.defaults ) @@ -220,7 +222,10 @@ def _python_impl(module_ctx): render.toolchain_prefix(index, toolchain.name, _TOOLCHAIN_INDEX_PAD_LENGTH) for index, toolchain in enumerate(py.toolchains) ], - toolchain_python_versions = [t.python_version for t in py.toolchains], + toolchain_python_versions = [ + full_version(version = t.python_version, minor_mapping = MINOR_MAPPING) + for t in py.toolchains + ], # The last toolchain is the default; it can't have version constraints # Despite the implication of the arg name, the values are strs, not bools toolchain_set_python_version_constraints = [ diff --git a/python/private/python_repositories.bzl b/python/private/python_repositories.bzl index b65127b962..c4988ee691 100644 --- a/python/private/python_repositories.bzl +++ b/python/private/python_repositories.bzl @@ -22,6 +22,7 @@ load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") load( "//python:versions.bzl", "DEFAULT_RELEASE_BASE_URL", + "MINOR_MAPPING", "PLATFORMS", "TOOL_VERSIONS", "get_release_info", @@ -583,6 +584,7 @@ def python_register_toolchains( register_coverage_tool = False, set_python_version_constraint = False, tool_versions = None, + minor_mapping = None, **kwargs): """Convenience macro for users which does typical setup. @@ -607,6 +609,8 @@ def python_register_toolchains( tool_versions: {type}`dict` contains a mapping of version with SHASUM and platform info. If not supplied, the defaults in python/versions.bzl will be used. + 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. """ @@ -616,8 +620,9 @@ def python_register_toolchains( base_url = kwargs.pop("base_url", DEFAULT_RELEASE_BASE_URL) tool_versions = tool_versions or TOOL_VERSIONS + minor_mapping = minor_mapping or MINOR_MAPPING - python_version = full_version(python_version) + python_version = full_version(version = python_version, minor_mapping = minor_mapping) toolchain_repo_name = "{name}_toolchains".format(name = name) @@ -716,6 +721,7 @@ def python_register_multi_toolchains( name, python_versions, default_version = None, + minor_mapping = None, **kwargs): """Convenience macro for registering multiple Python toolchains. @@ -724,11 +730,15 @@ def python_register_multi_toolchains( python_versions: {type}`list[str]` the Python versions. default_version: {type}`str` the default Python version. If not set, the first version in python_versions is used. + minor_mapping: {type}`dict[str, str]` mapping between `X.Y` to `X.Y.Z` + format. Defaults to the value in `//python:versions.bzl`. **kwargs: passed to each {obj}`python_register_toolchains` call. """ if len(python_versions) == 0: fail("python_versions must not be empty") + minor_mapping = minor_mapping or MINOR_MAPPING + if not default_version: default_version = python_versions.pop(0) for python_version in python_versions: @@ -742,12 +752,14 @@ def python_register_multi_toolchains( name = name + "_" + python_version.replace(".", "_"), python_version = python_version, set_python_version_constraint = True, + minor_mapping = minor_mapping, **kwargs ) python_register_toolchains( name = name + "_" + default_version.replace(".", "_"), python_version = default_version, set_python_version_constraint = False, + minor_mapping = minor_mapping, **kwargs ) @@ -757,4 +769,5 @@ def python_register_multi_toolchains( python_version: name + "_" + python_version.replace(".", "_") for python_version in (python_versions + [default_version]) }, + minor_mapping = minor_mapping, ) diff --git a/python/private/pythons_hub.bzl b/python/private/pythons_hub.bzl index 7a8c874ed8..da6c80d078 100644 --- a/python/private/pythons_hub.bzl +++ b/python/private/pythons_hub.bzl @@ -14,7 +14,6 @@ "Repo rule used by bzlmod extension to create a repo that has a map of Python interpreters and their labels" -load("//python/private:full_version.bzl", "full_version") load( "//python/private:toolchains_repo.bzl", "python_toolchain_build_file_content", @@ -59,7 +58,7 @@ def _hub_build_file_content( [ python_toolchain_build_file_content( prefix = prefixes[i], - python_version = full_version(python_versions[i]), + python_version = python_versions[i], set_python_version_constraint = set_python_version_constraints[i], user_repository_name = user_repository_names[i], ) @@ -123,7 +122,7 @@ This rule also writes out the various toolchains for the different Python versio implementation = _hub_repo_impl, attrs = { "default_python_version": attr.string( - doc = "Default Python version for the build.", + doc = "Default Python version for the build in `X.Y` or `X.Y.Z` format.", mandatory = True, ), "toolchain_prefixes": attr.string_list( @@ -131,7 +130,7 @@ This rule also writes out the various toolchains for the different Python versio mandatory = True, ), "toolchain_python_versions": attr.string_list( - doc = "List of Python versions for the toolchains", + doc = "List of Python versions for the toolchains. In `X.Y.Z` format.", mandatory = True, ), "toolchain_set_python_version_constraints": attr.string_list( diff --git a/python/private/toolchains_repo.bzl b/python/private/toolchains_repo.bzl index 21c4e905a4..528b86fc3b 100644 --- a/python/private/toolchains_repo.bzl +++ b/python/private/toolchains_repo.bzl @@ -358,11 +358,13 @@ def multi_pip_parse(name, requirements_lock, **kwargs): name = name, python_versions = {python_versions}, requirements_lock = requirements_lock, + minor_mapping = {minor_mapping}, **kwargs ) """.format( python_versions = rctx.attr.python_versions.keys(), + minor_mapping = render.indent(render.dict(rctx.attr.minor_mapping), indent = " " * 8).lstrip(), rules_python = rules_python, ) rctx.file("pip.bzl", content = pip_bzl) @@ -371,6 +373,7 @@ def multi_pip_parse(name, requirements_lock, **kwargs): multi_toolchain_aliases = repository_rule( _multi_toolchain_aliases_impl, attrs = { + "minor_mapping": attr.string_dict(doc = "The mapping between `X.Y` and `X.Y.Z` python version values"), "python_versions": attr.string_dict(doc = "The Python versions."), "_rules_python_workspace": attr.label(default = Label("//:WORKSPACE")), }, From 3f20b4b274753e116078f92b2aee92d8da4b3d88 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 15 Sep 2024 13:30:29 +0900 Subject: [PATCH 209/345] refactor(internal): add a semver parsing utility function (#2218) This `semver` function may turn out to be useful in validating the input for the `python.*override` tag classes to be added in a followup PR. Because this is a refactor of an existing code and adding tests, I decided to split it out. For a POC see #2151, work towards #2081. --- examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/BUILD.bazel | 5 ++ python/private/pypi/BUILD.bazel | 1 + python/private/pypi/extension.bzl | 17 +---- python/private/semver.bzl | 65 +++++++++++++++++ tests/semver/BUILD.bazel | 17 +++++ tests/semver/semver_test.bzl | 113 ++++++++++++++++++++++++++++++ 7 files changed, 205 insertions(+), 17 deletions(-) create mode 100644 python/private/semver.bzl create mode 100644 tests/semver/BUILD.bazel create mode 100644 tests/semver/semver_test.bzl diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index af31a123a8..0cfe49d5d8 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1231,7 +1231,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "QxV2PiqVV2B5LpnSrlzLgYyKNbUEXyVc1u+ahMrefws=", + "bzlTransitiveDigest": "7vRndkQ5a5Q2gcPIP8Jd/AkNRuB4n7SofpNFmFvodG8=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6140,7 +6140,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "P0W31OsSgVVNQ3oRHHFiRWK7NLBLyI+KbQQBCPhou7w=", + "bzlTransitiveDigest": "DQe4hZM+myEcJ/pVW54jl5vWJOw+oZNBZfE0WOX/S9g=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 3d23614425..a35e2f7c2e 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -295,6 +295,11 @@ bzl_library( srcs = ["repo_utils.bzl"], ) +bzl_library( + name = "semver_bzl", + srcs = ["semver.bzl"], +) + bzl_library( name = "sentinel_bzl", srcs = ["sentinel.bzl"], diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel index 21f69bffb7..1db50af7c7 100644 --- a/python/private/pypi/BUILD.bazel +++ b/python/private/pypi/BUILD.bazel @@ -59,6 +59,7 @@ bzl_library( srcs = ["extension.bzl"], deps = [ ":attrs_bzl", + "//python/private:semver_bzl", ":hub_repository_bzl", ":parse_requirements_bzl", ":evaluate_markers_bzl", diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 1bc8f15149..77a477899e 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -19,6 +19,7 @@ load("@pythons_hub//:interpreters.bzl", "DEFAULT_PYTHON_VERSION", "INTERPRETER_L load("//python/private:auth.bzl", "AUTH_ATTRS") load("//python/private:normalize_name.bzl", "normalize_name") load("//python/private:repo_utils.bzl", "repo_utils") +load("//python/private:semver.bzl", "semver") load("//python/private:version_label.bzl", "version_label") load(":attrs.bzl", "use_isolated") load(":evaluate_markers.bzl", "evaluate_markers", EVALUATE_MARKERS_SRCS = "SRCS") @@ -32,22 +33,8 @@ load(":simpleapi_download.bzl", "simpleapi_download") load(":whl_library.bzl", "whl_library") load(":whl_repo_name.bzl", "whl_repo_name") -def _parse_version(version): - major, _, version = version.partition(".") - minor, _, version = version.partition(".") - patch, _, version = version.partition(".") - build, _, version = version.partition(".") - - return struct( - # use semver vocabulary here - major = major, - minor = minor, - patch = patch, # this is called `micro` in the Python interpreter versioning scheme - build = build, - ) - def _major_minor_version(version): - version = _parse_version(version) + version = semver(version) return "{}.{}".format(version.major, version.minor) def _whl_mods_impl(mctx): diff --git a/python/private/semver.bzl b/python/private/semver.bzl new file mode 100644 index 0000000000..9a240d46b7 --- /dev/null +++ b/python/private/semver.bzl @@ -0,0 +1,65 @@ +# 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 semver version parser" + +def _key(version): + return ( + version.major, + version.minor, + version.patch, + # non pre-release versions are higher + version.pre_release == "", + # then we compare each element of the pre_release tag separately + tuple([ + ( + i if not i.isdigit() else "", + # digit values take precedence + int(i) if i.isdigit() else 0, + ) + for i in version.pre_release.split(".") + ]) if version.pre_release else None, + # And build info is just alphabetic + version.build, + ) + +def semver(version): + """Parse the semver version and return the values as a struct. + + Args: + version: {type}`str` the version string + + Returns: + A {type}`struct` with `major`, `minor`, `patch` and `build` attributes. + """ + + # Implement the https://semver.org/ spec + major, _, tail = version.partition(".") + minor, _, tail = tail.partition(".") + patch, _, build = tail.partition("+") + patch, _, pre_release = patch.partition("-") + + public = struct( + major = int(major), + minor = int(minor or "0"), + # NOTE: this is called `micro` in the Python interpreter versioning scheme + patch = int(patch or "0"), + pre_release = pre_release, + build = build, + # buildifier: disable=uninitialized + key = lambda: _key(self.actual), + str = lambda: version, + ) + self = struct(actual = public) + return public diff --git a/tests/semver/BUILD.bazel b/tests/semver/BUILD.bazel new file mode 100644 index 0000000000..e12b1e5300 --- /dev/null +++ b/tests/semver/BUILD.bazel @@ -0,0 +1,17 @@ +# 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(":semver_test.bzl", "semver_test_suite") + +semver_test_suite(name = "semver_tests") diff --git a/tests/semver/semver_test.bzl b/tests/semver/semver_test.bzl new file mode 100644 index 0000000000..6395639810 --- /dev/null +++ b/tests/semver/semver_test.bzl @@ -0,0 +1,113 @@ +# 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. + +"" + +load("@rules_testing//lib:test_suite.bzl", "test_suite") +load("//python/private:semver.bzl", "semver") # buildifier: disable=bzl-visibility + +_tests = [] + +def _test_semver_from_major(env): + actual = semver("3") + env.expect.that_int(actual.major).equals(3) + env.expect.that_int(actual.minor).equals(0) + env.expect.that_int(actual.patch).equals(0) + env.expect.that_str(actual.build).equals("") + +_tests.append(_test_semver_from_major) + +def _test_semver_from_major_minor_version(env): + actual = semver("4.9") + env.expect.that_int(actual.major).equals(4) + env.expect.that_int(actual.minor).equals(9) + env.expect.that_int(actual.patch).equals(0) + env.expect.that_str(actual.build).equals("") + +_tests.append(_test_semver_from_major_minor_version) + +def _test_semver_with_build_info(env): + actual = semver("1.2.3+mybuild") + env.expect.that_int(actual.major).equals(1) + env.expect.that_int(actual.minor).equals(2) + env.expect.that_int(actual.patch).equals(3) + env.expect.that_str(actual.build).equals("mybuild") + +_tests.append(_test_semver_with_build_info) + +def _test_semver_with_build_info_multiple_pluses(env): + actual = semver("1.2.3-rc0+build+info") + env.expect.that_int(actual.major).equals(1) + env.expect.that_int(actual.minor).equals(2) + env.expect.that_int(actual.patch).equals(3) + env.expect.that_str(actual.pre_release).equals("rc0") + env.expect.that_str(actual.build).equals("build+info") + +_tests.append(_test_semver_with_build_info_multiple_pluses) + +def _test_semver_alpha_beta(env): + actual = semver("1.2.3-alpha.beta") + env.expect.that_int(actual.major).equals(1) + env.expect.that_int(actual.minor).equals(2) + env.expect.that_int(actual.patch).equals(3) + env.expect.that_str(actual.pre_release).equals("alpha.beta") + +_tests.append(_test_semver_alpha_beta) + +def _test_semver_sort(env): + want = [ + semver(item) + for item in [ + # The items are sorted from lowest to highest version + "0.0.1", + "0.1.0-rc", + "0.1.0", + "0.9.11", + "0.9.12", + "1.0.0-alpha", + "1.0.0-alpha.1", + "1.0.0-alpha.beta", + "1.0.0-beta", + "1.0.0-beta.2", + "1.0.0-beta.11", + "1.0.0-rc.1", + "1.0.0-rc.2", + "1.0.0", + # Also handle missing minor and patch version strings + "2.0", + "3", + # Alphabetic comparison for different builds + "3.0.0+build0", + "3.0.0+build1", + ] + ] + actual = sorted(want, key = lambda x: x.key()) + env.expect.that_collection(actual).contains_exactly(want).in_order() + for i, greater in enumerate(want[1:]): + smaller = actual[i] + if greater.key() <= smaller.key(): + env.fail("Expected '{}' to be smaller than '{}', but got otherwise".format( + smaller.str(), + greater.str(), + )) + +_tests.append(_test_semver_sort) + +def semver_test_suite(name): + """Create the test suite. + + Args: + name: the name of the test suite + """ + test_suite(name = name, basic_tests = _tests) From b3862ec2446dc9c21e1ff5a25f86105d7718975a Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sat, 14 Sep 2024 22:20:01 -0700 Subject: [PATCH 210/345] docs: give some general guidance on how to define custom toolchains (#2220) From the discussion in #2216, it's clear that some better docs are needed to help people figure out how to define a toolchain and what the different pieces me. This gives some more explanation of the toolchain types, what they do, and how to define them. Along the way: * Add some more bazel objects to the inventory * Fix attribute lookups in the bazel inventory * Allow using parens in crossrefs, e.g. `foo()` --- docs/api/rules_python/python/cc/index.md | 7 + docs/api/rules_python/python/index.md | 8 + docs/index.md | 2 +- docs/toolchains.md | 200 ++++++++++++++++++++- sphinxdocs/docs/sphinx-bzl.md | 13 +- sphinxdocs/inventories/bazel_inventory.txt | 9 +- sphinxdocs/src/sphinx_bzl/bzl.py | 18 +- 7 files changed, 246 insertions(+), 11 deletions(-) diff --git a/docs/api/rules_python/python/cc/index.md b/docs/api/rules_python/python/cc/index.md index acaaf4f687..233b1308cd 100644 --- a/docs/api/rules_python/python/cc/index.md +++ b/docs/api/rules_python/python/cc/index.md @@ -25,3 +25,10 @@ This target provides: * `CcInfo`: The C++ information about the Python libraries. ::: + +:::{bzl:target} toolchain_type + +Toolchain type identifier for the Python C toolchain. + +This toolchain type is typically implemented by {obj}`py_cc_toolchain`. +::: diff --git a/docs/api/rules_python/python/index.md b/docs/api/rules_python/python/index.md index d1e633fc03..6ce5e7ca8d 100644 --- a/docs/api/rules_python/python/index.md +++ b/docs/api/rules_python/python/index.md @@ -8,6 +8,14 @@ :::{bzl:target} toolchain_type Identifier for the toolchain type for the target platform. + +This toolchain type gives information about the runtime for the target platform. +It is typically implemented by the {obj}`py_runtime` rule + +::::{seealso} +{any}`Custom Toolchains` for how to define custom toolchains +:::: + ::: :::{bzl:target} exec_tools_toolchain_type diff --git a/docs/index.md b/docs/index.md index 445cf20268..c06c31ed44 100644 --- a/docs/index.md +++ b/docs/index.md @@ -57,7 +57,7 @@ by buildifier. self getting-started pypi-dependencies -toolchains +Toolchains pip coverage precompiling diff --git a/docs/toolchains.md b/docs/toolchains.md index fac1bfc6b0..b5f664fcc3 100644 --- a/docs/toolchains.md +++ b/docs/toolchains.md @@ -161,9 +161,13 @@ Remember to call `use_repo()` to make repos visible to your module: #### Toolchain usage in other rules -Python toolchains can be utilized in other bazel rules, such as `genrule()`, by adding the `toolchains=["@rules_python//python:current_py_toolchain"]` attribute. You can obtain the path to the Python interpreter using the `$(PYTHON2)` and `$(PYTHON3)` ["Make" Variables](https://bazel.build/reference/be/make-variables). See the -{gh-path}`test_current_py_toolchain ` target for an example. - +Python toolchains can be utilized in other bazel rules, such as `genrule()`, by +adding the `toolchains=["@rules_python//python:current_py_toolchain"]` +attribute. You can obtain the path to the Python interpreter using the +`$(PYTHON2)` and `$(PYTHON3)` ["Make" +Variables](https://bazel.build/reference/be/make-variables). See the +{gh-path}`test_current_py_toolchain ` target +for an example. ## Workspace configuration @@ -242,3 +246,193 @@ there is a toolchain misconfiguration somewhere. To aid migration off the Bazel-builtin toolchain, rules_python provides {obj}`@rules_python//python/runtime_env_toolchains:all`. This is an equivalent toolchain, but is implemented using rules_python's objects. + + +## Custom toolchains + +While rules_python provides toolchains by default, it is not required to use +them, and you can define your own toolchains to use instead. This section +gives an introduction for how to define them yourself. + +:::{note} +* Defining your own toolchains is an advanced feature. +* APIs used for defining them are less stable and may change more often. +::: + +Under the hood, there are multiple toolchains that comprise the different +information necessary to build Python targets. Each one has an +associated _toolchain type_ that identifies it. We call the collection of these +toolchains a "toolchain suite". + +One of the underlying design goals of the toolchains is to support complex and +bespoke environments. Such environments may use an arbitrary combination of +{obj}`RBE`, cross-platform building, multiple Python versions, +building Python from source, embeding Python (as opposed to building separate +interpreters), using prebuilt binaries, or using binaries built from source. To +that end, many of the attributes they accept, and fields they provide, are +optional. + +### Target toolchain type + +The target toolchain type is {obj}`//python:toolchain_type`, and it +is for _target configuration_ runtime information, e.g., the Python version +and interpreter binary that a program will use. + +The is typically implemented using {obj}`py_runtime()`, which +provides the {obj}`PyRuntimeInfo` provider. For historical reasons from the +Python 2 transition, `py_runtime` is wrapped in {obj}`py_runtime_pair`, +which provides {obj}`ToolchainInfo` with the field `py3_runtime`, which is an +instance of `PyRuntimeInfo`. + +This toolchain type is intended to hold only _target configuration_ values. As +such, when defining its associated {external:bzl:obj}`toolchain` target, only +set {external:bzl:obj}`toolchain.target_compatible_with` and/or +{external:bzl:obj}`toolchain.target_settings` constraints; there is no need to +set {external:bzl:obj}`toolchain.exec_compatible_with`. + +### Python C toolchain type + +The Python C toolchain type ("py cc") is {obj}`//python/cc:toolchain_type`, and +it has C/C++ information for the _target configuration_, e.g. the C headers that +provide `Python.h`. + +This is typically implemented using {obj}`py_cc_toolchain()`, which provides +{obj}`ToolchainInfo` with the field `py_cc_toolchain` set, which is a +{obj}`PyCcToolchainInfo` provider instance. + +This toolchain type is intended to hold only _target configuration_ values +relating to the C/C++ information for the Python runtime. As such, when defining +its associated {external:obj}`toolchain` target, only set +{external:bzl:obj}`toolchain.target_compatible_with` and/or +{external:bzl:obj}`toolchain.target_settings` constraints; there is no need to +set {external:bzl:obj}`toolchain.exec_compatible_with`. + +### Exec tools toolchain type + +The exec tools toolchain type is {obj}`//python:exec_tools_toolchain_type`, +and it is for supporting tools for _building_ programs, e.g. the binary to +precompile code at build time. + +This toolchain type is intended to hold only _exec configuration_ values -- +usually tools (prebuilt or from-source) used to build Python targets. + +This is typically implemented using {obj}`py_exec_tools_toolchain`, which +provides {obj}`ToolchainInfo` with the field `exec_tools` set, which is an +instance of {obj}`PyExecToolsInfo`. + +The toolchain constraints of this toolchain type can be a bit more nuanced than +the other toolchain types. Typically, you set +{external:bzl:obj}`toolchain.target_settings` to the Python version the tools +are for, and {external:bzl:obj}`toolchain.exec_compatible_with` to the platform +they can run on. This allows the toolchain to first be considered based on the +target configuration (e.g. Python version), then for one to be chosen based on +finding one compatible with the available host platforms to run the tool on. + +However, what `target_compatible_with`/`target_settings` and +`exec_compatible_with` values to use depend on details of the tools being used. +For example: +* If you had a precompiler that supported any version of Python, then + putting the Python version in `target_settings` is unnecessary. +* If you had a prebuilt polyglot precompiler binary that could run on any + platform, then setting `exec_compatible_with` is unnecessary. + +This can work because, when the rules invoke these build tools, they pass along +all necessary information so that the tool can be entirely independent of the +target configuration being built for. + +Alternatively, if you had a precompiler that only ran on linux, and only +produced valid output for programs intended to run on linux, then _both_ +`exec_compatible_with` and `target_compatible_with` must be set to linux. + +### Custom toolchain example + +Here, we show an example for a semi-complicated toolchain suite, one that is: + +* A CPython-based interpreter +* For Python version 3.12.0 +* Using an in-build interpreter built from source +* That only runs on Linux +* Using a prebuilt precompiler that only runs on Linux, and only produces byte + code valid for 3.12 +* With the exec tools interpreter disabled (unnecessary with a prebuild + precompiler) +* Providing C headers and libraries + +Defining toolchains for this might look something like this: + +``` +# File: toolchain_impls/BUILD +load("@rules_python//python:py_cc_toolchain.bzl", "py_cc_toolchain") +load("@rules_python//python:py_exec_tools_toolchain.bzl", "py_exec_tools_toolchain") +load("@rules_python//python:py_runtime.bzl", "py_runtime") +load("@rules_python//python:py_runtime_pair.bzl", "py_runtime_pair") + +MAJOR = 3 +MINOR = 12 +MICRO = 0 + +py_runtime( + name = "runtime", + interpreter = ":python", + interpreter_version_info = { + "major": str(MAJOR), + "minor": str(MINOR), + "micro": str(MICRO), + } + implementation = "cpython" +) +py_runtime_pair( + name = "runtime_pair", + py3_runtime = ":runtime" +) + +py_cc_toolchain( + name = "py_cc_toolchain_impl", + headers = ":headers", + libs = ":libs", + python_version = "{}.{}".format(MAJOR, MINOR) +) + +py_exec_tools_toolchain( + name = "exec_tools_toolchain_impl", + exec_interpreter = "@rules_python/python:null_target", + precompiler = "precompiler-cpython-3.12" +) + +cc_binary(name = "python3.12", ...) +cc_library(name = "headers", ...) +cc_library(name = "libs", ...) + +# File: toolchains/BUILD +# Putting toolchain() calls in a separate package from the toolchain +# implementations minimizes Bazel loading overhead + +toolchain( + name = "runtime_toolchain", + toolchain = "//toolchain_impl:runtime_pair", + toolchain_type = "@rules_python//python:toolchain_type", + target_compatible_with = ["@platforms/os:linux"] +) +toolchain( + name = "py_cc_toolchain", + toolchain = "//toolchain_impl:py_cc_toolchain_impl", + toolchain_type = "@rules_python//python/cc:toolchain_type", + target_compatible_with = ["@platforms/os:linux"] +) + +toolchain( + name = "exec_tools_toolchain", + toolchain = "//toolchain_impl:exec_tools_toolchain_impl", + toolchain_type = "@rules_python//python:exec_tools_toolchain_type", + target_settings = [ + "@rules_python//python/config_settings:is_python_3.12", + ], + exec_comaptible_with = ["@platforms/os:linux"] +) +``` + +:::{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. +::: diff --git a/sphinxdocs/docs/sphinx-bzl.md b/sphinxdocs/docs/sphinx-bzl.md index bb51b6cdc6..73ae138f0e 100644 --- a/sphinxdocs/docs/sphinx-bzl.md +++ b/sphinxdocs/docs/sphinx-bzl.md @@ -90,7 +90,7 @@ chevrons (`<>`): {obj}`the binary rule ` ``` -Finally, specific types of objects (rules, functions, providers, etc) can be +Specific types of objects (rules, functions, providers, etc) can be specified to help disambiguate short names: ``` @@ -98,12 +98,21 @@ specified to help disambiguate short names: {rule}`py_binary` # Refers to the underlying rule ``` +Finally, objects built into Bazel can be explicitly referenced by forcing +a lookup outside the local project using `{external}`. For example, the symbol +`toolchain` is a builtin Bazel function, but it could also be the name of a tag +class in the local project. To force looking up the builtin Bazel `toolchain` rule, +`{external:bzl:rule}` can be used, e.g.: + +``` +{external:bzl:obj}`toolchain` +``` + Those are the basics of cross referencing. Sphinx has several additional syntaxes for finding and referencing objects; see [the MyST docs for supported syntaxes](https://myst-parser.readthedocs.io/en/latest/syntax/cross-referencing.html#reference-roles) - ### Cross reference roles A cross reference role is the `obj` portion of `{bzl:obj}`. It affects what is diff --git a/sphinxdocs/inventories/bazel_inventory.txt b/sphinxdocs/inventories/bazel_inventory.txt index ee507d1ccc..fd2bac7062 100644 --- a/sphinxdocs/inventories/bazel_inventory.txt +++ b/sphinxdocs/inventories/bazel_inventory.txt @@ -9,6 +9,7 @@ ExecutionInfo bzl:type 1 rules/lib/providers/ExecutionInfo - File bzl:type 1 rules/lib/File - Label bzl:type 1 rules/lib/Label - Name bzl:type 1 concepts/labels#target-names - +RBE bzl:obj 1 remote/rbe - RunEnvironmentInfo bzl:type 1 rules/lib/providers/RunEnvironmentInfo - Target bzl:type 1 rules/lib/builtins/Target - ToolchainInfo bzl:type 1 rules/lib/providers/ToolchainInfo.html - @@ -58,6 +59,7 @@ ctx.version_file bzl:obj 1 rules/lib/builtins/ctx#version_file - ctx.workspace_name bzl:obj 1 rules/lib/builtins/ctx#workspace_name - depset bzl:type 1 rules/lib/depset - dict bzl:type 1 rules/lib/dict - +exec_compatible_with bzl:attribute 1 reference/be/common-definitions#common.exec_compatible_with - int bzl:type 1 rules/lib/int - label bzl:type 1 concepts/labels - list bzl:type 1 rules/lib/list - @@ -131,8 +133,13 @@ runfiles.root_symlinks bzl:type 1 rules/lib/builtins/runfiles#root_symlinks - runfiles.symlinks bzl:type 1 rules/lib/builtins/runfiles#symlinks - str bzl:type 1 rules/lib/string - struct bzl:type 1 rules/lib/builtins/struct - +target_compatible_with bzl:attribute 1 reference/be/common-definitions#common.target_compatible_with - testing bzl:obj 1 rules/lib/toplevel/testing - testing.ExecutionInfo bzl:function 1 rules/lib/toplevel/testing#ExecutionInfo - testing.TestEnvironment bzl:function 1 rules/lib/toplevel/testing#TestEnvironment - testing.analysis_test bzl:rule 1 rules/lib/toplevel/testing#analysis_test - -toolchain_type bzl:type 1 ules/lib/builtins/toolchain_type.html - +toolchain bzl:rule 1 reference/be/platforms-and-toolchains#toolchain - +toolchain.exec_compatible_with bzl:rule 1 reference/be/platforms-and-toolchains#toolchain.exec_compatible_with - +toolchain.target_settings bzl:attribute 1 reference/be/platforms-and-toolchains#toolchain.target_settings - +toolchain.target_compatible_with bzl:attribute 1 reference/be/platforms-and-toolchains#toolchain.target_compatible_with - +toolchain_type bzl:type 1 rules/lib/builtins/toolchain_type.html - diff --git a/sphinxdocs/src/sphinx_bzl/bzl.py b/sphinxdocs/src/sphinx_bzl/bzl.py index 2980ecb21e..cbd35a958b 100644 --- a/sphinxdocs/src/sphinx_bzl/bzl.py +++ b/sphinxdocs/src/sphinx_bzl/bzl.py @@ -34,7 +34,7 @@ from sphinx.util import inspect, logging from sphinx.util import nodes as sphinx_nodes from sphinx.util import typing as sphinx_typing -from typing_extensions import override, TypeAlias +from typing_extensions import TypeAlias, override _logger = logging.getLogger(__name__) _LOG_PREFIX = f"[{_logger.name}] " @@ -552,7 +552,9 @@ def before_content(self) -> None: @override def transform_content(self, content_node: addnodes.desc_content) -> None: - def first_child_with_class_name(root, class_name) -> typing.Union[None, docutils_nodes.Element]: + def first_child_with_class_name( + root, class_name + ) -> typing.Union[None, docutils_nodes.Element]: matches = root.findall( lambda node: isinstance(node, docutils_nodes.Element) and class_name in node["classes"] @@ -1437,7 +1439,9 @@ class _BzlDomain(domains.Domain): object_types = { "arg": domains.ObjType("arg", "arg", "obj"), # macro/function arg "aspect": domains.ObjType("aspect", "aspect", "obj"), - "attribute": domains.ObjType("attribute", "attribute", "obj"), # rule attribute + "attribute": domains.ObjType( + "attribute", "attribute", "attr", "obj" + ), # rule attribute "function": domains.ObjType("function", "func", "obj"), "method": domains.ObjType("method", "method", "obj"), "module-extension": domains.ObjType( @@ -1509,7 +1513,9 @@ class _BzlDomain(domains.Domain): } @override - def get_full_qualified_name(self, node: docutils_nodes.Element) -> typing.Union[str, None]: + def get_full_qualified_name( + self, node: docutils_nodes.Element + ) -> typing.Union[str, None]: bzl_file = node.get("bzl:file") symbol_name = node.get("bzl:symbol") ref_target = node.get("reftarget") @@ -1574,6 +1580,10 @@ def _find_entry_for_xref( if target.startswith("--"): target = target.strip("-") object_type = "flag" + + # Allow using parentheses, e.g. `foo()` or `foo(x=...)` + target, _, _ = target.partition("(") + # Elide the value part of --foo=bar flags # Note that the flag value could contain `=` if "=" in target: From 63114a330bffcdecd69a97c0ebefea47c8b49621 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 15 Sep 2024 10:34:41 -0700 Subject: [PATCH 211/345] refactor: move hermetic Python runtime setup into macro (#2221) This stems from conversation in #2216. Moving the logic into a loading-phase macro makes it easier to understand how a repo with a python-build-standalone extracted archive has its toolchain defined. This also makes it easier to compare with the local runtime repo setup to try and find commonality in the future. Along the way: * Remove some Bazel 5 compatibility code: coverage_tool is now always passed to py_runtime. (Bazel 5 support was dropped earlier this year and we stopped testing with it; it's likely already broken with Bazel 5). * Add `semver.to_dict`, which makes it easier to pass into format() functions. --- examples/bzlmod/MODULE.bazel.lock | 4 +- .../private/hermetic_runtime_repo_setup.bzl | 161 ++++++++++++++++++ python/private/python_repositories.bzl | 161 +++--------------- python/private/semver.bzl | 18 +- 4 files changed, 199 insertions(+), 145 deletions(-) create mode 100644 python/private/hermetic_runtime_repo_setup.bzl diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 0cfe49d5d8..a34623ea08 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1231,7 +1231,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "7vRndkQ5a5Q2gcPIP8Jd/AkNRuB4n7SofpNFmFvodG8=", + "bzlTransitiveDigest": "3vqCp6yUy32HDgpZG9L+zqedcsEnHZu0Y7hfoRk3owY=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6140,7 +6140,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "DQe4hZM+myEcJ/pVW54jl5vWJOw+oZNBZfE0WOX/S9g=", + "bzlTransitiveDigest": "DdkE6u15ketmEdOGiZ1UcHX7sZV/xpVbFQLWBKjOAYM=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/python/private/hermetic_runtime_repo_setup.bzl b/python/private/hermetic_runtime_repo_setup.bzl new file mode 100644 index 0000000000..4b5a3c6810 --- /dev/null +++ b/python/private/hermetic_runtime_repo_setup.bzl @@ -0,0 +1,161 @@ +# 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. +"""Setup a python-build-standalone based toolchain.""" + +load("@rules_cc//cc:defs.bzl", "cc_import", "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(":py_exec_tools_toolchain.bzl", "py_exec_tools_toolchain") +load(":semver.bzl", "semver") + +def define_hermetic_runtime_toolchain_impl( + *, + name, + extra_files_glob_include, + extra_files_glob_exclude, + python_version, + python_bin, + coverage_tool): + """Define a toolchain implementation for a python-build-standalone repo. + + It expected this macro is called in the top-level package of an extracted + python-build-standalone repository. See + python/private/python_repositories.bzl for how it is invoked. + + Args: + name: {type}`str` name used for tools to identify the invocation. + extra_files_glob_include: {type}`list[str]` additional glob include + patterns for the target runtime files (the one included in + binaries). + extra_files_glob_exclude: {type}`list[str]` additional glob exclude + patterns for the target runtime files. + 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. + coverage_tool: {type}`str` optional target to the coverage tool to + use. + """ + _ = name # @unused + version_info = semver(python_version) + version_dict = version_info.to_dict() + native.filegroup( + name = "files", + srcs = native.glob( + include = [ + "bin/**", + "extensions/**", + "include/**", + "libs/**", + "share/**", + ] + extra_files_glob_include, + # 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), + # 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, + ), + ) + cc_import( + name = "interface", + interface_library = "libs/python{major}{minor}.lib".format(**version_dict), + system_provided = True, + ) + + native.filegroup( + name = "includes", + srcs = native.glob(["include/**/*.h"]), + ) + cc_library( + name = "python_headers", + deps = select({ + "@bazel_tools//src/conditions:windows": [":interface"], + "//conditions:default": None, + }), + hdrs = [":includes"], + includes = [ + "include", + "include/python{major}.{minor}".format(**version_dict), + "include/python{major}.{minor}m".format(**version_dict), + ], + ) + cc_library( + name = "libpython", + hdrs = [":includes"], + srcs = select({ + "@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)], + }), + ) + + native.exports_files(["python", python_bin]) + + # Used to only download coverage toolchain when the coverage is collected by + # bazel. + native.config_setting( + name = "coverage_enabled", + values = {"collect_code_coverage": "true"}, + visibility = ["//visibility:private"], + ) + + py_runtime( + name = "py3_runtime", + files = [":files"], + interpreter = python_bin, + interpreter_version_info = { + "major": str(version_info.major), + "micro": str(version_info.patch), + "minor": str(version_info.minor), + }, + # Convert empty string to None + coverage_tool = coverage_tool or 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), + ) + + py_runtime_pair( + name = "python_runtimes", + py2_runtime = None, + py3_runtime = ":py3_runtime", + ) + + py_cc_toolchain( + name = "py_cc_toolchain", + headers = ":python_headers", + libs = ":libpython", + python_version = python_version, + ) + + py_exec_tools_toolchain( + name = "py_exec_tools_toolchain", + # This macro is called in another repo: use Label() to ensure it + # resolves in the rules_python context. + precompiler = Label("//tools/precompiler:precompiler"), + ) diff --git a/python/private/python_repositories.bzl b/python/private/python_repositories.bzl index c4988ee691..0286160b52 100644 --- a/python/private/python_repositories.bzl +++ b/python/private/python_repositories.bzl @@ -34,6 +34,7 @@ load(":coverage_deps.bzl", "coverage_dep") load(":full_version.bzl", "full_version") load(":internal_config_repo.bzl", "internal_config_repo") load(":repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") +load(":text_util.bzl", "render") load( ":toolchains_repo.bzl", "host_toolchain", @@ -246,20 +247,6 @@ def _python_repository_impl(rctx): python_bin = "python.exe" if ("windows" in platform) else "bin/python3" - glob_include = [] - glob_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{python_version}.so".format(python_version = python_short_version), - # static libraries - "lib/**/*.a", - # tests for the standard libraries. - "lib/python{python_version}/**/test/**".format(python_version = python_short_version), - "lib/python{python_version}/**/tests/**".format(python_version = python_short_version), - "**/__pycache__/*.pyc.*", # During pyc creation, temp files named *.pyc.NNN are created - ] - if "linux" in platform: # Workaround around https://github.com/indygreg/python-build-standalone/issues/231 for url in urls: @@ -281,6 +268,8 @@ def _python_repository_impl(rctx): rctx.delete("share/terminfo") break + glob_include = [] + glob_exclude = [] if rctx.attr.ignore_root_user_error or "windows" in platform: glob_exclude += [ # These pycache files are created on first use of the associated python files. @@ -295,148 +284,42 @@ def _python_repository_impl(rctx): glob_include += [ "*.exe", "*.dll", - "bin/**", "DLLs/**", - "extensions/**", - "include/**", "Lib/**", - "libs/**", "Scripts/**", - "share/**", "tcl/**", ] else: - glob_include += [ - "bin/**", - "extensions/**", - "include/**", + glob_include.append( "lib/**", - "libs/**", - "share/**", - ] + ) - if rctx.attr.coverage_tool: - if "windows" in platform: - coverage_tool = None - else: - coverage_tool = '"{}"'.format(rctx.attr.coverage_tool) - - coverage_attr_text = """\ - coverage_tool = select({{ - ":coverage_enabled": {coverage_tool}, - "//conditions:default": None - }}), -""".format(coverage_tool = coverage_tool) + if "windows" in platform: + coverage_tool = None else: - coverage_attr_text = " # coverage_tool attribute not supported by this Bazel version" + coverage_tool = rctx.attr.coverage_tool build_content = """\ -# Generated by python/repositories.bzl +# Generated by python/private/python_repositories.bzl -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") -load("@rules_python//python/private:py_exec_tools_toolchain.bzl", "py_exec_tools_toolchain") +load("@rules_python//python/private:hermetic_runtime_repo_setup.bzl", "define_hermetic_runtime_toolchain_impl") package(default_visibility = ["//visibility:public"]) -filegroup( - name = "files", - srcs = glob( - include = {glob_include}, - # Platform-agnostic filegroup can't match on all patterns. - allow_empty = True, - exclude = {glob_exclude}, - ), -) - -cc_import( - name = "interface", - interface_library = "libs/python{python_version_nodot}.lib", - system_provided = True, -) - -filegroup( - name = "includes", - srcs = glob(["include/**/*.h"]), -) - -cc_library( - name = "python_headers", - deps = select({{ - "@bazel_tools//src/conditions:windows": [":interface"], - "//conditions:default": None, - }}), - hdrs = [":includes"], - includes = [ - "include", - "include/python{python_version}", - "include/python{python_version}m", - ], -) - -cc_library( - name = "libpython", - hdrs = [":includes"], - srcs = select({{ - "@platforms//os:windows": ["python3.dll", "libs/python{python_version_nodot}.lib"], - "@platforms//os:macos": ["lib/libpython{python_version}.dylib"], - "@platforms//os:linux": ["lib/libpython{python_version}.so", "lib/libpython{python_version}.so.1.0"], - }}), -) - -exports_files(["python", "{python_path}"]) - -# Used to only download coverage toolchain when the coverage is collected by -# bazel. -config_setting( - name = "coverage_enabled", - values = {{"collect_code_coverage": "true"}}, - visibility = ["//visibility:private"], -) - -py_runtime( - name = "py3_runtime", - files = [":files"], -{coverage_attr} - interpreter = "{python_path}", - interpreter_version_info = {{ - "major": "{interpreter_version_info_major}", - "minor": "{interpreter_version_info_minor}", - "micro": "{interpreter_version_info_micro}", - }}, - python_version = "PY3", - implementation_name = 'cpython', - pyc_tag = "cpython-{interpreter_version_info_major}{interpreter_version_info_minor}", -) - -py_runtime_pair( - name = "python_runtimes", - py2_runtime = None, - py3_runtime = ":py3_runtime", -) - -py_cc_toolchain( - name = "py_cc_toolchain", - headers = ":python_headers", - libs = ":libpython", - python_version = "{python_version}", -) - -py_exec_tools_toolchain( - name = "py_exec_tools_toolchain", - precompiler = "@rules_python//tools/precompiler:precompiler", +define_hermetic_runtime_toolchain_impl( + name = "define_runtime", + extra_files_glob_include = {extra_files_glob_include}, + extra_files_glob_exclude = {extra_files_glob_exclude}, + python_version = {python_version}, + python_bin = {python_bin}, + coverage_tool = {coverage_tool}, ) """.format( - glob_exclude = repr(glob_exclude), - glob_include = repr(glob_include), - python_path = python_bin, - python_version = python_short_version, - python_version_nodot = python_short_version.replace(".", ""), - coverage_attr = coverage_attr_text, - interpreter_version_info_major = python_version_info[0], - interpreter_version_info_minor = python_version_info[1], - interpreter_version_info_micro = python_version_info[2], + extra_files_glob_exclude = render.list(glob_exclude), + extra_files_glob_include = render.list(glob_include), + python_bin = render.str(python_bin), + python_version = render.str(rctx.attr.python_version), + coverage_tool = render.str(coverage_tool), ) rctx.delete("python") rctx.symlink(python_bin, "python") diff --git a/python/private/semver.bzl b/python/private/semver.bzl index 9a240d46b7..d77249ff9f 100644 --- a/python/private/semver.bzl +++ b/python/private/semver.bzl @@ -34,6 +34,15 @@ def _key(version): version.build, ) +def _to_dict(self): + return { + "build": self.build, + "major": self.major, + "minor": self.minor, + "patch": self.patch, + "pre_release": self.pre_release, + } + def semver(version): """Parse the semver version and return the values as a struct. @@ -50,7 +59,8 @@ def semver(version): patch, _, build = tail.partition("+") patch, _, pre_release = patch.partition("-") - public = struct( + # buildifier: disable=uninitialized + self = struct( major = int(major), minor = int(minor or "0"), # NOTE: this is called `micro` in the Python interpreter versioning scheme @@ -58,8 +68,8 @@ def semver(version): pre_release = pre_release, build = build, # buildifier: disable=uninitialized - key = lambda: _key(self.actual), + key = lambda: _key(self), str = lambda: version, + to_dict = lambda: _to_dict(self), ) - self = struct(actual = public) - return public + return self From 5a856e5514e11cf4ef31ae8dd2ebc779db5d6504 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Mon, 16 Sep 2024 19:07:40 -0700 Subject: [PATCH 212/345] feat: add //python:none as public target to disable exec_interpreter (#2226) When writing the toolchain docs, I realized there wasn't a public target to use for disabling the exec_interpreter. Fixed by adding an alias to the internal target. Along the way: * Add the exec tools and cc toolchains to the doc gen * A few improvements to the cc/exec tools docs * Add public bzl file for py_exec_tools_toolchain and PyExecToolsInfo * Fix a bug in sphinx_bzl where local names were hiding global names even if the requested type didn't match (e.g. a macro foo referring to rule foo) * Fix xrefs in the python/cc/index.md; it wasn't setting the default domain to bzl * Fix object type definition for attributes: the object type name was "attribute", but everything else was using "attr"; switched to "attr" --- CHANGELOG.md | 3 +- docs/BUILD.bazel | 17 +++------ docs/api/rules_python/python/cc/index.md | 7 ++++ docs/api/rules_python/python/index.md | 25 +++++++++++-- docs/toolchains.md | 2 +- python/BUILD.bazel | 18 ++++++++++ python/cc/BUILD.bazel | 2 +- python/cc/py_cc_toolchain_info.bzl | 11 +++--- python/private/BUILD.bazel | 19 +++++----- python/private/py_cc_toolchain_macro.bzl | 4 ++- python/private/py_cc_toolchain_rule.bzl | 6 ++++ python/private/py_exec_tools_toolchain.bzl | 30 +++++++++++++--- python/py_exec_tools_info.bzl | 24 +++++++++++++ python/py_exec_tools_toolchain.bzl | 18 ++++++++++ sphinxdocs/inventories/bazel_inventory.txt | 8 ++--- sphinxdocs/src/sphinx_bzl/bzl.py | 42 ++++++++++++---------- 16 files changed, 175 insertions(+), 61 deletions(-) create mode 100644 python/py_exec_tools_info.bzl create mode 100644 python/py_exec_tools_toolchain.bzl diff --git a/CHANGELOG.md b/CHANGELOG.md index c4c99206b1..33aecf0ed1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,7 +73,8 @@ A brief description of the categories of changes: `TOOL_VERSIONS` for registering patched toolchains please consider setting the `patch_strip` explicitly to `1` if you depend on this value - in the future the value may change to default to `0`. - +* (toolchains) Added `//python:none`, a special target for use with + {obj}`py_exec_tools_toolchain.exec_interpreter` to treat the value as `None`. ### Removed * (toolchains): Removed accidentally exposed `http_archive` symbol from diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index 2b407db692..149e2c57f3 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -72,7 +72,6 @@ sphinx_docs( deps = [ ":bzl_api_docs", ":py_api_srcs", - ":py_cc_toolchain", ":py_runtime_pair", "//sphinxdocs/docs:docs_lib", ], @@ -86,16 +85,18 @@ sphinx_stardocs( "//python:pip_bzl", "//python:py_binary_bzl", "//python:py_cc_link_params_info_bzl", + "//python:py_exec_tools_info_bzl", + "//python:py_exec_tools_toolchain_bzl", "//python:py_executable_info_bzl", "//python:py_library_bzl", "//python:py_runtime_bzl", "//python:py_runtime_info_bzl", "//python:py_test_bzl", "//python:repositories_bzl", + "//python/cc:py_cc_toolchain_bzl", "//python/cc:py_cc_toolchain_info_bzl", "//python/entry_points:py_console_script_binary_bzl", - "//python/private:py_exec_tools_info_bzl", - "//python/private:py_exec_tools_toolchain_bzl", + "//python/private:py_cc_toolchain_rule_bzl", "//python/private/common:py_binary_rule_bazel_bzl", "//python/private/common:py_library_rule_bazel_bzl", "//python/private/common:py_runtime_rule_bzl", @@ -112,16 +113,6 @@ sphinx_stardocs( target_compatible_with = _TARGET_COMPATIBLE_WITH, ) -sphinx_stardoc( - name = "py_cc_toolchain", - src = "//python/private:py_cc_toolchain_rule.bzl", - prefix = "api/rules_python/", - public_load_path = "//python/cc:py_cc_toolchain.bzl", - tags = ["docs"], - target_compatible_with = _TARGET_COMPATIBLE_WITH, - deps = ["//python/cc:py_cc_toolchain_bzl"], -) - sphinx_stardoc( name = "py_runtime_pair", src = "//python/private:py_runtime_pair_rule_bzl", diff --git a/docs/api/rules_python/python/cc/index.md b/docs/api/rules_python/python/cc/index.md index 233b1308cd..82c59343be 100644 --- a/docs/api/rules_python/python/cc/index.md +++ b/docs/api/rules_python/python/cc/index.md @@ -1,3 +1,5 @@ +:::{default-domain} bzl +::: :::{bzl:currentfile} //python/cc:BUILD.bazel ::: # //python/cc @@ -31,4 +33,9 @@ This target provides: Toolchain type identifier for the Python C toolchain. This toolchain type is typically implemented by {obj}`py_cc_toolchain`. + +::::{seealso} +{any}`Custom Toolchains` for how to define custom toolchains +:::: + ::: diff --git a/docs/api/rules_python/python/index.md b/docs/api/rules_python/python/index.md index 6ce5e7ca8d..bc5a7313c9 100644 --- a/docs/api/rules_python/python/index.md +++ b/docs/api/rules_python/python/index.md @@ -10,7 +10,7 @@ Identifier for the toolchain type for the target platform. This toolchain type gives information about the runtime for the target platform. -It is typically implemented by the {obj}`py_runtime` rule +It is typically implemented by the {obj}`py_runtime` rule. ::::{seealso} {any}`Custom Toolchains` for how to define custom toolchains @@ -21,6 +21,14 @@ It is typically implemented by the {obj}`py_runtime` rule :::{bzl:target} exec_tools_toolchain_type Identifier for the toolchain type for exec tools used to build Python targets. + +This toolchain type gives information about tools needed to build Python targets +at build time. It is typically implemented by the {obj}`py_exec_tools_toolchain` +rule. + +::::{seealso} +{any}`Custom Toolchains` for how to define custom toolchains +:::: ::: :::{bzl:target} current_py_toolchain @@ -28,7 +36,7 @@ Identifier for the toolchain type for exec tools used to build Python targets. Helper target to resolve to the consumer's current Python toolchain. This target provides: -* `PyRuntimeInfo`: The consuming target's target toolchain information +* {obj}`PyRuntimeInfo`: The consuming target's target toolchain information ::: @@ -42,3 +50,16 @@ Use {obj}`@rules_python//python/runtime_env_toolchains:all` instead. ::: :::: +:::{target} none +A special target so that label attributes with default values can be set to +`None`. + +Bazel interprets `None` to mean "use the default value", which +makes it impossible to have a label attribute with a default value that is +optional. To work around this, a target with a special provider is used; +internally rules check for this, then treat the value as `None`. + +::::{versionadded} 0.36.0 +:::: + +::: diff --git a/docs/toolchains.md b/docs/toolchains.md index b5f664fcc3..2ac0099304 100644 --- a/docs/toolchains.md +++ b/docs/toolchains.md @@ -395,7 +395,7 @@ py_cc_toolchain( py_exec_tools_toolchain( name = "exec_tools_toolchain_impl", - exec_interpreter = "@rules_python/python:null_target", + exec_interpreter = "@rules_python/python:none", precompiler = "precompiler-cpython-3.12" ) diff --git a/python/BUILD.bazel b/python/BUILD.bazel index 40880a1495..6fcde3892d 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -139,6 +139,18 @@ bzl_library( ], ) +bzl_library( + name = "py_exec_tools_info_bzl", + srcs = ["py_exec_tools_info.bzl"], + deps = ["//python/private:py_exec_tools_info_bzl"], +) + +bzl_library( + name = "py_exec_tools_toolchain_bzl", + srcs = ["py_exec_tools_toolchain.bzl"], + deps = ["//python/private:py_exec_tools_toolchain_bzl"], +) + bzl_library( name = "py_executable_info_bzl", srcs = ["py_executable_info.bzl"], @@ -308,6 +320,12 @@ toolchain_type( visibility = ["//visibility:public"], ) +# Special target to indicate `None` for label attributes a default value. +alias( + name = "none", + actual = "//python/private:sentinel", +) + # Definitions for a Python toolchain that, at execution time, attempts to detect # a platform runtime having the appropriate major Python version. Consider this # a toolchain of last resort. diff --git a/python/cc/BUILD.bazel b/python/cc/BUILD.bazel index d384d0538f..f4e4aeb00f 100644 --- a/python/cc/BUILD.bazel +++ b/python/cc/BUILD.bazel @@ -40,7 +40,7 @@ bzl_library( name = "py_cc_toolchain_bzl", srcs = ["py_cc_toolchain.bzl"], visibility = ["//visibility:public"], - deps = ["//python/private:py_cc_toolchain_bzl"], + deps = ["//python/private:py_cc_toolchain_macro_bzl"], ) bzl_library( diff --git a/python/cc/py_cc_toolchain_info.bzl b/python/cc/py_cc_toolchain_info.bzl index 9ea394ad9f..3164f89f10 100644 --- a/python/cc/py_cc_toolchain_info.bzl +++ b/python/cc/py_cc_toolchain_info.bzl @@ -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. @@ -11,11 +11,12 @@ # 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. +"""Provider for C/C++ information from the toolchain. -"""Provider for C/C++ information about the Python runtime. - -NOTE: This is a beta-quality feature. APIs subject to change until -https://github.com/bazelbuild/rules_python/issues/824 is considered done. +:::{seealso} +* {any}`Custom toolchains` for how to define custom toolchains. +* {obj}`py_cc_toolchain` rule for defining the toolchain. +::: """ load("//python/private:py_cc_toolchain_info.bzl", _PyCcToolchainInfo = "PyCcToolchainInfo") diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index a35e2f7c2e..e0de7d3b92 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -168,15 +168,16 @@ bzl_library( ) bzl_library( - name = "py_cc_toolchain_bzl", - srcs = [ - "py_cc_toolchain_macro.bzl", - "py_cc_toolchain_rule.bzl", - ], - visibility = [ - "//docs:__subpackages__", - "//python/cc:__pkg__", + name = "py_cc_toolchain_macro_bzl", + srcs = ["py_cc_toolchain_macro.bzl"], + deps = [ + ":py_cc_toolchain_rule_bzl", ], +) + +bzl_library( + name = "py_cc_toolchain_rule_bzl", + srcs = ["py_cc_toolchain_rule.bzl"], deps = [ ":py_cc_toolchain_info_bzl", ":rules_cc_srcs_bzl", @@ -188,7 +189,6 @@ bzl_library( bzl_library( name = "py_cc_toolchain_info_bzl", srcs = ["py_cc_toolchain_info.bzl"], - visibility = ["//python/cc:__pkg__"], ) bzl_library( @@ -370,7 +370,6 @@ exports_files( [ "coverage.patch", "repack_whl.py", - "py_cc_toolchain_rule.bzl", "py_package.bzl", "py_wheel.bzl", "py_wheel_normalize_pep440.bzl", diff --git a/python/private/py_cc_toolchain_macro.bzl b/python/private/py_cc_toolchain_macro.bzl index 35276f7401..416caac2ab 100644 --- a/python/private/py_cc_toolchain_macro.bzl +++ b/python/private/py_cc_toolchain_macro.bzl @@ -22,8 +22,10 @@ load(":util.bzl", "add_tag") def py_cc_toolchain(**kwargs): """Creates a py_cc_toolchain target. + This is a macro around the {rule}`py_cc_toolchain` rule. + Args: - **kwargs: Keyword args to pass onto underlying rule. + **kwargs: Keyword args to pass onto underlying {rule}`py_cc_toolchain` rule. """ # This tag is added to easily identify usages through other macros. diff --git a/python/private/py_cc_toolchain_rule.bzl b/python/private/py_cc_toolchain_rule.bzl index 2c52a2ec84..279f86cc14 100644 --- a/python/private/py_cc_toolchain_rule.bzl +++ b/python/private/py_cc_toolchain_rule.bzl @@ -78,5 +78,11 @@ A toolchain for a Python runtime's C/C++ information (e.g. headers) This rule carries information about the C/C++ side of a Python runtime, e.g. headers, shared libraries, etc. + +This provides `ToolchainInfo` with the following attributes: +* `py_cc_toolchain`: {type}`PyCcToolchainInfo` +* `toolchain_label`: {type}`Label` _only present when `--visibile_for_testing=True` + for internal testing_. The rule's label; this allows identifying what toolchain + implmentation was selected for testing purposes. """, ) diff --git a/python/private/py_exec_tools_toolchain.bzl b/python/private/py_exec_tools_toolchain.bzl index 26c09ca5cf..957448f421 100644 --- a/python/private/py_exec_tools_toolchain.bzl +++ b/python/private/py_exec_tools_toolchain.bzl @@ -39,20 +39,42 @@ def _py_exec_tools_toolchain_impl(ctx): py_exec_tools_toolchain = rule( implementation = _py_exec_tools_toolchain_impl, + doc = """ +Provides a toolchain for build time tools. + +This provides `ToolchainInfo` with the following attributes: +* `exec_tools`: {type}`PyExecToolsInfo` +* `toolchain_label`: {type}`Label` _only present when `--visibile_for_testing=True` + for internal testing_. The rule's label; this allows identifying what toolchain + implmentation was selected for testing purposes. +""", attrs = { "exec_interpreter": attr.label( default = "//python/private:current_interpreter_executable", cfg = "exec", doc = """ -The interpreter to use in the exec config. To disable, specify the -special target `//python/private:sentinel`. See PyExecToolsInfo.exec_interpreter -for further docs. +An interpreter that is directly usable in the exec configuration + +If not specified, the interpreter from {obj}`//python:toolchain_type` will +be used. + +To disable, specify the special target {obj}`//python:none`; the raw value `None` +will use the default. + +:::{note} +This is only useful for `ctx.actions.run` calls that _directly_ invoke the +interpreter, which is fairly uncommon and low level. It is better to use a +`cfg="exec"` attribute that points to a `py_binary` rule instead, which will +handle all the necessary transitions and runtime setup to invoke a program. +::: + +See {obj}`PyExecToolsInfo.exec_interpreter` for further docs. """, ), "precompiler": attr.label( allow_files = True, cfg = "exec", - doc = "See PyExecToolsInfo.precompiler", + doc = "See {obj}`PyExecToolsInfo.precompiler`", ), "_visible_for_testing": attr.label( default = "//python/private:visible_for_testing", diff --git a/python/py_exec_tools_info.bzl b/python/py_exec_tools_info.bzl new file mode 100644 index 0000000000..438412376e --- /dev/null +++ b/python/py_exec_tools_info.bzl @@ -0,0 +1,24 @@ +# 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. +"""Provider for the exec tools toolchain. + +:::{seealso} +* {any}`Custom toolchains` for how to define custom toolchains. +* {obj}`py_cc_toolchain` rule for defining the toolchain. +::: +""" + +load("//python/private:py_exec_tools_info.bzl", _PyExecToolsInfo = "PyExecToolsInfo") + +PyExecToolsInfo = _PyExecToolsInfo diff --git a/python/py_exec_tools_toolchain.bzl b/python/py_exec_tools_toolchain.bzl new file mode 100644 index 0000000000..6e0a663c91 --- /dev/null +++ b/python/py_exec_tools_toolchain.bzl @@ -0,0 +1,18 @@ +# 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. +"""Toolchain for build-time tools.""" + +load("//python/private:py_exec_tools_toolchain.bzl", _py_exec_tools_toolchain = "py_exec_tools_toolchain") + +py_exec_tools_toolchain = _py_exec_tools_toolchain diff --git a/sphinxdocs/inventories/bazel_inventory.txt b/sphinxdocs/inventories/bazel_inventory.txt index fd2bac7062..969c772386 100644 --- a/sphinxdocs/inventories/bazel_inventory.txt +++ b/sphinxdocs/inventories/bazel_inventory.txt @@ -59,7 +59,7 @@ ctx.version_file bzl:obj 1 rules/lib/builtins/ctx#version_file - ctx.workspace_name bzl:obj 1 rules/lib/builtins/ctx#workspace_name - depset bzl:type 1 rules/lib/depset - dict bzl:type 1 rules/lib/dict - -exec_compatible_with bzl:attribute 1 reference/be/common-definitions#common.exec_compatible_with - +exec_compatible_with bzl:attr 1 reference/be/common-definitions#common.exec_compatible_with - int bzl:type 1 rules/lib/int - label bzl:type 1 concepts/labels - list bzl:type 1 rules/lib/list - @@ -133,13 +133,13 @@ runfiles.root_symlinks bzl:type 1 rules/lib/builtins/runfiles#root_symlinks - runfiles.symlinks bzl:type 1 rules/lib/builtins/runfiles#symlinks - str bzl:type 1 rules/lib/string - struct bzl:type 1 rules/lib/builtins/struct - -target_compatible_with bzl:attribute 1 reference/be/common-definitions#common.target_compatible_with - +target_compatible_with bzl:attr 1 reference/be/common-definitions#common.target_compatible_with - testing bzl:obj 1 rules/lib/toplevel/testing - testing.ExecutionInfo bzl:function 1 rules/lib/toplevel/testing#ExecutionInfo - testing.TestEnvironment bzl:function 1 rules/lib/toplevel/testing#TestEnvironment - testing.analysis_test bzl:rule 1 rules/lib/toplevel/testing#analysis_test - toolchain bzl:rule 1 reference/be/platforms-and-toolchains#toolchain - toolchain.exec_compatible_with bzl:rule 1 reference/be/platforms-and-toolchains#toolchain.exec_compatible_with - -toolchain.target_settings bzl:attribute 1 reference/be/platforms-and-toolchains#toolchain.target_settings - -toolchain.target_compatible_with bzl:attribute 1 reference/be/platforms-and-toolchains#toolchain.target_compatible_with - +toolchain.target_settings bzl:attr 1 reference/be/platforms-and-toolchains#toolchain.target_settings - +toolchain.target_compatible_with bzl:attr 1 reference/be/platforms-and-toolchains#toolchain.target_compatible_with - toolchain_type bzl:type 1 rules/lib/builtins/toolchain_type.html - diff --git a/sphinxdocs/src/sphinx_bzl/bzl.py b/sphinxdocs/src/sphinx_bzl/bzl.py index cbd35a958b..54b1285a84 100644 --- a/sphinxdocs/src/sphinx_bzl/bzl.py +++ b/sphinxdocs/src/sphinx_bzl/bzl.py @@ -1439,9 +1439,7 @@ class _BzlDomain(domains.Domain): object_types = { "arg": domains.ObjType("arg", "arg", "obj"), # macro/function arg "aspect": domains.ObjType("aspect", "aspect", "obj"), - "attribute": domains.ObjType( - "attribute", "attribute", "attr", "obj" - ), # rule attribute + "attr": domains.ObjType("attr", "attr", "obj"), # rule attribute "function": domains.ObjType("function", "func", "obj"), "method": domains.ObjType("method", "method", "obj"), "module-extension": domains.ObjType( @@ -1460,6 +1458,7 @@ class _BzlDomain(domains.Domain): # types are objects that have a constructor and methods/attrs "type": domains.ObjType("type", "type", "obj"), } + # This controls: # * What is recognized when parsing, e.g. ":bzl:ref:`foo`" requires # "ref" to be in the role dict below. @@ -1508,7 +1507,7 @@ class _BzlDomain(domains.Domain): # dict[str, dict[str, _ObjectEntry]] "doc_names": {}, # Objects by a shorter or alternative name - # dict[str, _ObjectEntry] + # dict[str, dict[str id, _ObjectEntry]] "alt_names": {}, } @@ -1588,8 +1587,14 @@ def _find_entry_for_xref( # Note that the flag value could contain `=` if "=" in target: target = target[: target.find("=")] + if target in self.data["doc_names"].get(fromdocname, {}): - return self.data["doc_names"][fromdocname][target] + entry = self.data["doc_names"][fromdocname][target] + # Prevent a local doc name masking a global alt name when its of + # a different type. e.g. when the macro `foo` refers to the + # rule `foo` in another doc. + if object_type in self.object_types[entry.object_type].roles: + return entry if object_type == "obj": search_space = self.data["objects"] @@ -1600,7 +1605,15 @@ def _find_entry_for_xref( _log_debug("find_entry: alt_names=%s", sorted(self.data["alt_names"].keys())) if target in self.data["alt_names"]: - return self.data["alt_names"][target] + # Give preference to shorter object ids. This is a work around + # to allow e.g. `FooInfo` to refer to the FooInfo type rather than + # the `FooInfo` constructor. + entries = sorted( + self.data["alt_names"][target].items(), key=lambda item: len(item[0]) + ) + for _, entry in entries: + if object_type in self.object_types[entry.object_type].roles: + return entry return None @@ -1633,17 +1646,8 @@ def add_object(self, entry: _ObjectEntry, alt_names=None) -> None: alt_names.append(label + (f"%{symbol}" if symbol else "")) for alt_name in sorted(set(alt_names)): - if alt_name in self.data["alt_names"]: - existing = self.data["alt_names"][alt_name] - # This situation usually occurs for the constructor function - # of a provider, but could occur for e.g. an exported struct - # with an attribute the same name as the struct. For lack - # of a better option, take the shorter entry, on the assumption - # it refers to some container of the longer entry. - if len(entry.full_id) < len(existing.full_id): - self.data["alt_names"][alt_name] = entry - else: - self.data["alt_names"][alt_name] = entry + self.data["alt_names"].setdefault(alt_name, {}) + self.data["alt_names"][alt_name][entry.full_id] = entry docname = entry.index_entry.docname self.data["doc_names"].setdefault(docname, {}) @@ -1653,11 +1657,11 @@ def merge_domaindata( self, docnames: list[str], otherdata: dict[str, typing.Any] ) -> None: # Merge in simple dict[key, value] data - for top_key in ("objects", "alt_names"): + for top_key in ("objects",): self.data[top_key].update(otherdata.get(top_key, {})) # Merge in two-level dict[top_key, dict[sub_key, value]] data - for top_key in ("objects_by_type", "doc_names"): + for top_key in ("objects_by_type", "doc_names", "alt_names"): existing_top_map = self.data[top_key] for sub_key, sub_values in otherdata.get(top_key, {}).items(): if sub_key not in existing_top_map: From 654b4d54eeee13f46fd678c28252be22e2feb533 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Tue, 17 Sep 2024 13:12:48 +0900 Subject: [PATCH 213/345] chore: remove mandatory default values for python version flag (#2217) This is a different take on #2205. Summary: - Remove version constraints from the `//python/config_settings:python_version`. - Remove `is_python_config_setting` macro and use a different implementation to retain the same functionality. This in general will improve the situation on how the toolchains are registered and hopefully is a step towards resolving issues for #2081. --- CHANGELOG.md | 3 +- examples/bzlmod/MODULE.bazel.lock | 4 +- python/config_settings/BUILD.bazel | 3 + python/config_settings/config_settings.bzl | 6 - python/private/BUILD.bazel | 3 +- python/private/config_settings.bzl | 248 ++++++------------ .../pypi/generate_whl_library_build_bazel.bzl | 9 +- .../construct_config_settings_tests.bzl | 19 +- ...generate_whl_library_build_bazel_tests.bzl | 19 +- 9 files changed, 116 insertions(+), 198 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33aecf0ed1..32e3902aff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,6 +79,7 @@ A brief description of the categories of changes: ### Removed * (toolchains): Removed accidentally exposed `http_archive` symbol from `python/repositories.bzl`. +* (toolchains): An internal _is_python_config_setting_ macro has been removed. ## [0.35.0] - 2024-08-15 @@ -274,7 +275,7 @@ A brief description of the categories of changes: be automatically deleted correctly. For example, if `python_generation_mode` is set to package, when `__init__.py` is deleted, the `py_library` generated for this package before will be deleted automatically. -* (whl_library): Use `is_python_config_setting` to correctly handle multi-python +* (whl_library): Use _is_python_config_setting_ to correctly handle multi-python version dependency select statements when the `experimental_target_platforms` includes the Python ABI. The default python version case within the select is also now handled correctly, stabilizing the implementation. diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index a34623ea08..f0144e82e0 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1231,7 +1231,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "3vqCp6yUy32HDgpZG9L+zqedcsEnHZu0Y7hfoRk3owY=", + "bzlTransitiveDigest": "jb9c5l3dvSB2MHd/zfkT8Yr8efvg+K/YHtiRHU3aU6o=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6140,7 +6140,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "DdkE6u15ketmEdOGiZ1UcHX7sZV/xpVbFQLWBKjOAYM=", + "bzlTransitiveDigest": "cLqaqCEOdhle6//lX1Kcs2hfkmSerh2fk0izwhV8/GU=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel index 20bc50660a..c31d69f202 100644 --- a/python/config_settings/BUILD.bazel +++ b/python/config_settings/BUILD.bazel @@ -1,4 +1,5 @@ load("@bazel_skylib//rules:common_settings.bzl", "string_flag") +load("//python:versions.bzl", "MINOR_MAPPING", "TOOL_VERSIONS") load( "//python/private:flags.bzl", "BootstrapImplFlag", @@ -27,6 +28,8 @@ filegroup( construct_config_settings( name = "construct_config_settings", + minor_mapping = MINOR_MAPPING, + versions = TOOL_VERSIONS.keys(), ) string_flag( diff --git a/python/config_settings/config_settings.bzl b/python/config_settings/config_settings.bzl index f1d2ff0e06..44104259b7 100644 --- a/python/config_settings/config_settings.bzl +++ b/python/config_settings/config_settings.bzl @@ -18,13 +18,7 @@ load( "//python/private:config_settings.bzl", _construct_config_settings = "construct_config_settings", - _is_python_config_setting = "is_python_config_setting", ) -# This is exposed only for cases where the pip hub repo needs to use this rule -# to define hub-repo scoped config_settings for platform specific wheel -# support. -is_python_config_setting = _is_python_config_setting - # This is exposed for usage in rules_python only. construct_config_settings = _construct_config_settings diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index e0de7d3b92..1e05b928bc 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -78,8 +78,9 @@ bzl_library( name = "config_settings_bzl", srcs = ["config_settings.bzl"], deps = [ - "//python:versions_bzl", + ":semver_bzl", "@bazel_skylib//lib:selects", + "@bazel_skylib//rules:common_settings", ], ) diff --git a/python/private/config_settings.bzl b/python/private/config_settings.bzl index 301a97b25d..b15d6a8e03 100644 --- a/python/private/config_settings.bzl +++ b/python/private/config_settings.bzl @@ -17,201 +17,95 @@ load("@bazel_skylib//lib:selects.bzl", "selects") load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") -load("//python:versions.bzl", "MINOR_MAPPING", "TOOL_VERSIONS") +load(":semver.bzl", "semver") -_PYTHON_VERSION_FLAG = str(Label("//python/config_settings:python_version")) +_PYTHON_VERSION_FLAG = Label("//python/config_settings:python_version") +_PYTHON_VERSION_MAJOR_MINOR_FLAG = Label("//python/config_settings:_python_version_major_minor") -def _ver_key(s): - major, _, s = s.partition(".") - minor, _, s = s.partition(".") - micro, _, s = s.partition(".") - return (int(major), int(minor), int(micro)) - -def _flag_values(*, python_versions, minor_mapping): - """Construct a map of python_version to a list of toolchain values. - - This mapping maps the concept of a config setting to a list of compatible toolchain versions. - For using this in the code, the VERSION_FLAG_VALUES should be used instead. - - Args: - python_versions: {type}`list[str]` X.Y.Z` python versions. - minor_mapping: {type}`dict[str, str]` `X.Y` to `X.Y.Z` mapping. - - Returns: - A `map[str, list[str]]`. Each key is a python_version flag value. Each value - is a list of the python_version flag values that should match when for the - `key`. For example: - ``` - "3.8" -> ["3.8", "3.8.1", "3.8.2", ..., "3.8.19"] # All 3.8 versions - "3.8.2" -> ["3.8.2"] # Only 3.8.2 - "3.8.19" -> ["3.8.19", "3.8"] # The latest version should also match 3.8 so - as when the `3.8` toolchain is used we just use the latest `3.8` toolchain. - this makes the `select("is_python_3.8.19")` work no matter how the user - specifies the latest python version to use. - ``` - """ - ret = {} - - for micro_version in sorted(python_versions, key = _ver_key): - minor_version, _, _ = micro_version.rpartition(".") - - # This matches the raw flag value, e.g. --//python/config_settings:python_version=3.8 - # It's private because matching the concept of e.g. "3.8" value is done - # using the `is_python_X.Y` config setting group, which is aware of the - # minor versions that could match instead. - ret.setdefault(minor_version, [minor_version]).append(micro_version) - - # Ensure that is_python_3.9.8 is matched if python_version is set - # to 3.9 if minor_mapping points to 3.9.8 - default_micro_version = minor_mapping[minor_version] - ret[micro_version] = [micro_version, minor_version] if default_micro_version == micro_version else [micro_version] - - return ret - -VERSION_FLAG_VALUES = _flag_values(python_versions = TOOL_VERSIONS.keys(), minor_mapping = MINOR_MAPPING) - -def is_python_config_setting(name, *, python_version, reuse_conditions = None, **kwargs): - """Create a config setting for matching 'python_version' configuration flag. - - This function is mainly intended for internal use within the `whl_library` and `pip_parse` - machinery. - - The matching of the 'python_version' flag depends on the value passed in - `python_version` and here is the example for `3.8` (but the same applies - to other python versions present in @//python:versions.bzl#TOOL_VERSIONS): - * "3.8" -> ["3.8", "3.8.1", "3.8.2", ..., "3.8.19"] # All 3.8 versions - * "3.8.2" -> ["3.8.2"] # Only 3.8.2 - * "3.8.19" -> ["3.8.19", "3.8"] # The latest version should also match 3.8 so - as when the `3.8` toolchain is used we just use the latest `3.8` toolchain. - this makes the `select("is_python_3.8.19")` work no matter how the user - specifies the latest python version to use. - - Args: - name: name for the target that will be created to be used in select statements. - python_version: The python_version to be passed in the `flag_values` in the - `config_setting`. Depending on the version, the matching python version list - can be as described above. - reuse_conditions: A dict of version to version label for which we should - reuse config_setting targets instead of creating them from scratch. This - is useful when using is_python_config_setting multiple times in the - same package with the same `major.minor` python versions. - **kwargs: extra kwargs passed to the `config_setting`. - """ - if python_version not in name: - fail("The name '{}' must have the python version '{}' in it".format(name, python_version)) - - if python_version not in VERSION_FLAG_VALUES: - fail("The 'python_version' must be known to 'rules_python', choose from the values: {}".format(VERSION_FLAG_VALUES.keys())) - - python_versions = VERSION_FLAG_VALUES[python_version] - extra_flag_values = kwargs.pop("flag_values", {}) - if _PYTHON_VERSION_FLAG in extra_flag_values: - fail("Cannot set '{}' in the flag values".format(_PYTHON_VERSION_FLAG)) - - if len(python_versions) == 1: - native.config_setting( - name = name, - flag_values = { - _PYTHON_VERSION_FLAG: python_version, - } | extra_flag_values, - **kwargs - ) - return - - reuse_conditions = reuse_conditions or {} - create_config_settings = { - "_{}".format(name).replace(python_version, version): {_PYTHON_VERSION_FLAG: version} - for version in python_versions - if not reuse_conditions or version not in reuse_conditions - } - match_any = list(create_config_settings.keys()) - for version, condition in reuse_conditions.items(): - if len(VERSION_FLAG_VALUES[version]) == 1: - match_any.append(condition) - continue - - # Convert the name to an internal label that this function would create, - # so that we are hitting the config_setting and not the config_setting_group. - condition = Label(condition) - if hasattr(condition, "same_package_label"): - condition = condition.same_package_label("_" + condition.name) - else: - condition = condition.relative("_" + condition.name) - - match_any.append(condition) - - for name_, flag_values_ in create_config_settings.items(): - native.config_setting( - name = name_, - flag_values = flag_values_ | extra_flag_values, - **kwargs - ) - - # An alias pointing to an underscore-prefixed config_setting_group - # is used because config_setting_group creates - # `is_{version}_N` targets, which are easily confused with the - # `is_{minor}.{micro}` (dot) targets. - selects.config_setting_group( - name = "_{}_group".format(name), - match_any = match_any, - visibility = ["//visibility:private"], - ) - native.alias( - name = name, - actual = "_{}_group".format(name), - visibility = kwargs.get("visibility", []), - ) - -def construct_config_settings(name = None): # buildifier: disable=function-docstring +def construct_config_settings(*, name, versions, minor_mapping): # buildifier: disable=function-docstring """Create a 'python_version' config flag and construct all config settings used in rules_python. This mainly includes the targets that are used in the toolchain and pip hub repositories that only match on the 'python_version' flag values. Args: - name(str): A dummy name value that is no-op for now. + name: {type}`str` A dummy name value that is no-op for now. + versions: {type}`list[str]` A list of versions to build constraint settings for. + minor_mapping: {type}`dict[str, str]` A mapping from `X.Y` to `X.Y.Z` python versions. """ + _ = name # @unused _python_version_flag( - name = "python_version", + name = _PYTHON_VERSION_FLAG.name, # TODO: The default here should somehow match the MODULE config. Until # then, use the empty string to indicate an unknown version. This # also prevents version-unaware targets from inadvertently matching # a select condition when they shouldn't. build_setting_default = "", - values = [""] + VERSION_FLAG_VALUES.keys(), + visibility = ["//visibility:public"], + ) + + _python_version_major_minor_flag( + name = _PYTHON_VERSION_MAJOR_MINOR_FLAG.name, + build_setting_default = "", visibility = ["//visibility:public"], ) native.config_setting( name = "is_python_version_unset", - flag_values = { - Label("//python/config_settings:python_version"): "", - }, + flag_values = {_PYTHON_VERSION_FLAG: ""}, visibility = ["//visibility:public"], ) - for version, matching_versions in VERSION_FLAG_VALUES.items(): - is_python_config_setting( - name = "is_python_{}".format(version), - python_version = version, - reuse_conditions = { - v: native.package_relative_label("is_python_{}".format(v)) - for v in matching_versions - if v != version - }, + _reverse_minor_mapping = {full: minor for minor, full in minor_mapping.items()} + for version in versions: + minor_version = _reverse_minor_mapping.get(version) + if not minor_version: + native.config_setting( + name = "is_python_{}".format(version), + flag_values = {":python_version": version}, + visibility = ["//visibility:public"], + ) + continue + + # Also need to match the minor version when using + name = "is_python_{}".format(version) + native.config_setting( + name = "_" + name, + flag_values = {":python_version": version}, + visibility = ["//visibility:public"], + ) + + # An alias pointing to an underscore-prefixed config_setting_group + # is used because config_setting_group creates + # `is_{version}_N` targets, which are easily confused with the + # `is_{minor}.{micro}` (dot) targets. + selects.config_setting_group( + name = "_{}_group".format(name), + match_any = [ + ":_is_python_{}".format(version), + ":is_python_{}".format(minor_version), + ], + visibility = ["//visibility:private"], + ) + native.alias( + name = name, + actual = "_{}_group".format(name), + visibility = ["//visibility:public"], + ) + + # This matches the raw flag value, e.g. --//python/config_settings:python_version=3.8 + # It's private because matching the concept of e.g. "3.8" value is done + # using the `is_python_X.Y` config setting group, which is aware of the + # minor versions that could match instead. + for minor in minor_mapping.keys(): + native.config_setting( + name = "is_python_{}".format(minor), + flag_values = {_PYTHON_VERSION_MAJOR_MINOR_FLAG: minor}, visibility = ["//visibility:public"], ) def _python_version_flag_impl(ctx): value = ctx.build_setting_value - if value not in ctx.attr.values: - fail(( - "Invalid --python_version value: {actual}\nAllowed values {allowed}" - ).format( - actual = value, - allowed = ", ".join(sorted(ctx.attr.values)), - )) - return [ # BuildSettingInfo is the original provider returned, so continue to # return it for compatibility @@ -227,9 +121,25 @@ def _python_version_flag_impl(ctx): _python_version_flag = rule( implementation = _python_version_flag_impl, build_setting = config.string(flag = True), + attrs = {}, +) + +def _python_version_major_minor_flag_impl(ctx): + input = ctx.attr._python_version_flag[config_common.FeatureFlagInfo].value + if input: + version = semver(input) + value = "{}.{}".format(version.major, version.minor) + else: + value = "" + + return [config_common.FeatureFlagInfo(value = value)] + +_python_version_major_minor_flag = rule( + implementation = _python_version_major_minor_flag_impl, + build_setting = config.string(flag = False), attrs = { - "values": attr.string_list( - doc = "Allowed values.", + "_python_version_flag": attr.label( + default = _PYTHON_VERSION_FLAG, ), }, ) diff --git a/python/private/pypi/generate_whl_library_build_bazel.bzl b/python/private/pypi/generate_whl_library_build_bazel.bzl index d25f73a049..0be6f9c409 100644 --- a/python/private/pypi/generate_whl_library_build_bazel.bzl +++ b/python/private/pypi/generate_whl_library_build_bazel.bzl @@ -157,14 +157,13 @@ def _render_config_settings(dependencies_by_platform): constraint_values_str = render.indent(render.list(constraint_values)).lstrip() if abi: - if not loads: - loads.append("""load("@rules_python//python/config_settings:config_settings.bzl", "is_python_config_setting")""") - additional_content.append( """\ -is_python_config_setting( +config_setting( name = "is_{name}", - python_version = "3.{minor_version}", + flag_values = {{ + "@rules_python//python/config_settings:_python_version_major_minor": "3.{minor_version}", + }}, constraint_values = {constraint_values}, visibility = ["//visibility:private"], )""".format( diff --git a/tests/config_settings/construct_config_settings_tests.bzl b/tests/config_settings/construct_config_settings_tests.bzl index b1b2e062f9..9e6b6e1fc3 100644 --- a/tests/config_settings/construct_config_settings_tests.bzl +++ b/tests/config_settings/construct_config_settings_tests.bzl @@ -18,7 +18,6 @@ load("@rules_testing//lib:analysis_test.bzl", "analysis_test") load("@rules_testing//lib:test_suite.bzl", "test_suite") load("@rules_testing//lib:truth.bzl", "subjects") load("@rules_testing//lib:util.bzl", rt_util = "util") -load("//python/config_settings:config_settings.bzl", "is_python_config_setting") _tests = [] @@ -162,21 +161,25 @@ def construct_config_settings_test_suite(name): # buildifier: disable=function- # We have CI runners running on a great deal of the platforms from the list below, # hence use all of them within tests. for os in ["linux", "osx", "windows"]: - is_python_config_setting( + native.config_setting( name = "is_python_3.11_" + os, constraint_values = [ "@platforms//os:" + os, ], - python_version = "3.11", + flag_values = { + "//python/config_settings:_python_version_major_minor": "3.11", + }, ) for cpu in ["s390x", "ppc", "x86_64", "aarch64"]: - is_python_config_setting( + native.config_setting( name = "is_python_3.11_" + cpu, constraint_values = [ "@platforms//cpu:" + cpu, ], - python_version = "3.11", + flag_values = { + "//python/config_settings:_python_version_major_minor": "3.11", + }, ) for (os, cpu) in [ @@ -188,13 +191,15 @@ def construct_config_settings_test_suite(name): # buildifier: disable=function- ("osx", "x86_64"), ("windows", "x86_64"), ]: - is_python_config_setting( + native.config_setting( name = "is_python_3.11_{}_{}".format(os, cpu), constraint_values = [ "@platforms//cpu:" + cpu, "@platforms//os:" + os, ], - python_version = "3.11", + flag_values = { + "//python/config_settings:_python_version_major_minor": "3.11", + }, ) test_suite( 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 3d4df14b5b..a860681ae9 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 @@ -87,7 +87,6 @@ _tests.append(_test_simple) def _test_dep_selects(env): want = """\ load("@bazel_skylib//rules:copy_file.bzl", "copy_file") -load("@rules_python//python/config_settings:config_settings.bzl", "is_python_config_setting") load("@rules_python//python:defs.bzl", "py_library", "py_binary") package(default_visibility = ["//visibility:public"]) @@ -158,9 +157,11 @@ py_library( visibility = ["//visibility:public"], ) -is_python_config_setting( +config_setting( name = "is_python_3.10_linux_ppc", - python_version = "3.10", + flag_values = { + "@rules_python//python/config_settings:_python_version_major_minor": "3.10", + }, constraint_values = [ "@platforms//cpu:ppc", "@platforms//os:linux", @@ -168,16 +169,20 @@ is_python_config_setting( visibility = ["//visibility:private"], ) -is_python_config_setting( +config_setting( name = "is_python_3.9_anyos_aarch64", - python_version = "3.9", + flag_values = { + "@rules_python//python/config_settings:_python_version_major_minor": "3.9", + }, constraint_values = ["@platforms//cpu:aarch64"], visibility = ["//visibility:private"], ) -is_python_config_setting( +config_setting( name = "is_python_3.9_linux_anyarch", - python_version = "3.9", + flag_values = { + "@rules_python//python/config_settings:_python_version_major_minor": "3.9", + }, constraint_values = ["@platforms//os:linux"], visibility = ["//visibility:private"], ) From 27276b6de1362a1ed9c1f681e4b3f53aa8bcdbcf Mon Sep 17 00:00:00 2001 From: Morten Mjelva Date: Tue, 17 Sep 2024 22:58:14 +0200 Subject: [PATCH 214/345] fix: Prefix bootstrap file to prevent pytest reentrance (#2230) Pytest will, by default, discover tests in files named `test_*.py`. The existing behaviour of the bootstrap setup is to create a file named e.g. `test_foo_stage2_bootstrap.py` for a target named `test_foo`. This causes pytest to reenter, leading to a crash. To fix, prepend the generated stage2 file with an underscore so that pytest doesn't match it. --------- Co-authored-by: Richard Levasseur --- CHANGELOG.md | 2 ++ python/private/common/py_executable_bazel.bzl | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32e3902aff..0300824bd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -57,6 +57,8 @@ A brief description of the categories of changes: ([#2186](https://github.com/bazelbuild/rules_python/issues/2186)). * (py_wheel) Fix incorrectly generated `Required-Dist` when specifying requirements with markers in extra_requires in py_wheel rule. +* (rules) Prevent pytest from trying run the generated stage2 + bootstrap .py file when using {obj}`--bootstrap_impl=script` ### Added diff --git a/python/private/common/py_executable_bazel.bzl b/python/private/common/py_executable_bazel.bzl index a0cfebad8a..dae1c4a0b1 100644 --- a/python/private/common/py_executable_bazel.bzl +++ b/python/private/common/py_executable_bazel.bzl @@ -330,7 +330,9 @@ def _create_stage2_bootstrap( imports, runtime_details): output = ctx.actions.declare_file( - "{}_stage2_bootstrap.py".format(output_prefix), + # Prepend with underscore to prevent pytest from trying to + # process the bootstrap for files starting with `test_` + "_{}_stage2_bootstrap.py".format(output_prefix), sibling = output_sibling, ) runtime = runtime_details.effective_runtime From ade0b2b134565b865b8725bea4dc7896535c4c1a Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 20 Sep 2024 01:01:42 +0900 Subject: [PATCH 215/345] refactor(toolchains): split the implementation of toolchain rules to separate files (#2232) This makes the dependency management in WORKSPACE much easier to do. Summary: - refactor: split out the py_repositories call to a separate file - refactor: split out the python_repository rule to a separate file - refactor: split out the standalone interpreter utility function - refactor: split out the python_register_toolchains function - refactor: rename the remaining file Work towards #2081. --- examples/bzlmod/MODULE.bazel.lock | 4 +- python/BUILD.bazel | 6 +- python/private/BUILD.bazel | 59 +++- python/private/is_standalone_interpreter.bzl | 50 ++++ python/private/py_repositories.bzl | 49 ++++ python/private/pypi/BUILD.bazel | 2 +- python/private/pypi/whl_library.bzl | 2 +- python/private/python.bzl | 2 +- .../python_register_multi_toolchains.bzl | 75 +++++ python/private/python_register_toolchains.bzl | 176 ++++++++++++ ...repositories.bzl => python_repository.bzl} | 258 +----------------- python/repositories.bzl | 10 +- 12 files changed, 417 insertions(+), 276 deletions(-) create mode 100644 python/private/is_standalone_interpreter.bzl create mode 100644 python/private/py_repositories.bzl create mode 100644 python/private/python_register_multi_toolchains.bzl create mode 100644 python/private/python_register_toolchains.bzl rename python/private/{python_repositories.bzl => python_repository.bzl} (61%) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index f0144e82e0..234dc46cab 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1231,7 +1231,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "jb9c5l3dvSB2MHd/zfkT8Yr8efvg+K/YHtiRHU3aU6o=", + "bzlTransitiveDigest": "Cca+OPIA5xqQl5ND8j44y5jBkjQfz+36h8Hgq0N26I0=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6140,7 +6140,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "cLqaqCEOdhle6//lX1Kcs2hfkmSerh2fk0izwhV8/GU=", + "bzlTransitiveDigest": "wkQNgti5fKONsAUn77ZyTWdfaJfI2cSDrSI0b4JzmI8=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/python/BUILD.bazel b/python/BUILD.bazel index 6fcde3892d..b7a2172df5 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -229,7 +229,11 @@ bzl_library( name = "repositories_bzl", srcs = ["repositories.bzl"], deps = [ - "//python/private:python_repositories_bzl", + "//python/private:is_standalone_interpreter_bzl", + "//python/private:py_repositories_bzl", + "//python/private:python_register_multi_toolchains_bzl", + "//python/private:python_register_toolchains_bzl", + "//python/private:python_repository_bzl", ], ) diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 1e05b928bc..5fa551454e 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -123,6 +123,14 @@ bzl_library( deps = [":bzlmod_enabled_bzl"], ) +bzl_library( + name = "is_standalone_interpreter_bzl", + srcs = ["is_standalone_interpreter.bzl"], + deps = [ + ":repo_utils_bzl", + ], +) + bzl_library( name = "normalize_name_bzl", srcs = ["normalize_name.bzl"], @@ -143,22 +151,53 @@ bzl_library( ) bzl_library( - name = "python_repositories_bzl", - srcs = ["python_repositories.bzl"], + name = "py_repositories_bzl", + srcs = ["py_repositories.bzl"], + deps = [ + ":bazel_tools_bzl", + ":internal_config_repo_bzl", + "//python/private/pypi:deps_bzl", + ], +) + +bzl_library( + name = "python_register_toolchains_bzl", + srcs = ["python_register_toolchains.bzl"], deps = [ + ":auth_bzl", + ":bazel_tools_bzl", + ":bzlmod_enabled_bzl", + ":coverage_deps_bzl", + ":full_version_bzl", + ":internal_config_repo_bzl", + ":python_repository_bzl", + ":toolchains_repo_bzl", "//python:versions_bzl", - "//python/private:auth_bzl", - "//python/private:bazel_tools_bzl", - "//python/private:bzlmod_enabled_bzl", - "//python/private:coverage_deps_bzl", - "//python/private:full_version_bzl", - "//python/private:internal_config_repo_bzl", - "//python/private:repo_utils_bzl", - "//python/private:toolchains_repo_bzl", "//python/private/pypi:deps_bzl", ], ) +bzl_library( + name = "python_repository_bzl", + srcs = ["python_repository.bzl"], + deps = [ + ":auth_bzl", + ":repo_utils_bzl", + ":text_util_bzl", + "//python:versions_bzl", + ], +) + +bzl_library( + name = "python_register_multi_toolchains_bzl", + srcs = ["python_register_multi_toolchains.bzl"], + deps = [ + ":python_register_toolchains_bzl", + ":toolchains_repo_bzl", + "//python:versions_bzl", + ], +) + bzl_library( name = "pythons_hub_bzl", srcs = ["pythons_hub.bzl"], diff --git a/python/private/is_standalone_interpreter.bzl b/python/private/is_standalone_interpreter.bzl new file mode 100644 index 0000000000..5da7389612 --- /dev/null +++ b/python/private/is_standalone_interpreter.bzl @@ -0,0 +1,50 @@ +# 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 repository rules and macros to support toolchain registration. +""" + +load(":repo_utils.bzl", "repo_utils") + +STANDALONE_INTERPRETER_FILENAME = "STANDALONE_INTERPRETER" + +def is_standalone_interpreter(rctx, python_interpreter_path, *, logger = None): + """Query a python interpreter target for whether or not it's a rules_rust provided toolchain + + Args: + rctx: {type}`repository_ctx` The repository rule's context object. + python_interpreter_path: {type}`path` A path representing the interpreter. + logger: Optional logger to use for operations. + + Returns: + {type}`bool` Whether or not the target is from a rules_python generated toolchain. + """ + + # Only update the location when using a hermetic toolchain. + if not python_interpreter_path: + return False + + # This is a rules_python provided toolchain. + return repo_utils.execute_unchecked( + rctx, + op = "IsStandaloneInterpreter", + arguments = [ + "ls", + "{}/{}".format( + python_interpreter_path.dirname, + STANDALONE_INTERPRETER_FILENAME, + ), + ], + logger = logger, + ).return_code == 0 diff --git a/python/private/py_repositories.bzl b/python/private/py_repositories.bzl new file mode 100644 index 0000000000..ace3750a2b --- /dev/null +++ b/python/private/py_repositories.bzl @@ -0,0 +1,49 @@ +# 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 macros to be called during WORKSPACE evaluation.""" + +load("@bazel_tools//tools/build_defs/repo:http.bzl", _http_archive = "http_archive") +load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") +load("//python/private/pypi:deps.bzl", "pypi_deps") +load(":internal_config_repo.bzl", "internal_config_repo") + +def http_archive(**kwargs): + maybe(_http_archive, **kwargs) + +def py_repositories(): + """Runtime dependencies that users must install. + + This function should be loaded and called in the user's WORKSPACE. + With bzlmod enabled, this function is not needed since MODULE.bazel handles transitive deps. + """ + maybe( + internal_config_repo, + name = "rules_python_internal", + ) + http_archive( + name = "bazel_skylib", + sha256 = "74d544d96f4a5bb630d465ca8bbcfe231e3594e5aae57e1edbf17a6eb3ca2506", + 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", + ], + ) + 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", + ) + pypi_deps() diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel index 1db50af7c7..2b25bfbfb4 100644 --- a/python/private/pypi/BUILD.bazel +++ b/python/private/pypi/BUILD.bazel @@ -306,9 +306,9 @@ bzl_library( ":patch_whl_bzl", ":pypi_repo_utils_bzl", ":whl_target_platforms_bzl", - "//python:repositories_bzl", "//python/private:auth_bzl", "//python/private:envsubst_bzl", + "//python/private:is_standalone_interpreter_bzl", "//python/private:repo_utils_bzl", ], ) diff --git a/python/private/pypi/whl_library.bzl b/python/private/pypi/whl_library.bzl index 5b14151be6..309316b2ee 100644 --- a/python/private/pypi/whl_library.bzl +++ b/python/private/pypi/whl_library.bzl @@ -16,7 +16,7 @@ load("//python/private:auth.bzl", "AUTH_ATTRS", "get_auth") load("//python/private:envsubst.bzl", "envsubst") -load("//python/private:python_repositories.bzl", "is_standalone_interpreter") +load("//python/private:is_standalone_interpreter.bzl", "is_standalone_interpreter") load("//python/private:repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") load(":attrs.bzl", "ATTRS", "use_isolated") load(":deps.bzl", "all_repo_names") diff --git a/python/private/python.bzl b/python/private/python.bzl index 9a9a240cb3..98b089f7ca 100644 --- a/python/private/python.bzl +++ b/python/private/python.bzl @@ -15,9 +15,9 @@ "Python toolchain module extensions for use with bzlmod" load("@bazel_features//:features.bzl", "bazel_features") -load("//python:repositories.bzl", "python_register_toolchains") load("//python:versions.bzl", "MINOR_MAPPING", "TOOL_VERSIONS") load(":full_version.bzl", "full_version") +load(":python_register_toolchains.bzl", "python_register_toolchains") load(":pythons_hub.bzl", "hub_repo") load(":repo_utils.bzl", "repo_utils") load(":text_util.bzl", "render") diff --git a/python/private/python_register_multi_toolchains.bzl b/python/private/python_register_multi_toolchains.bzl new file mode 100644 index 0000000000..68f5249350 --- /dev/null +++ b/python/private/python_register_multi_toolchains.bzl @@ -0,0 +1,75 @@ +# 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 repository rules and macros to support toolchain registration. +""" + +load("//python:versions.bzl", "MINOR_MAPPING") +load(":python_register_toolchains.bzl", "python_register_toolchains") +load(":toolchains_repo.bzl", "multi_toolchain_aliases") + +def python_register_multi_toolchains( + name, + python_versions, + default_version = None, + minor_mapping = None, + **kwargs): + """Convenience macro for registering multiple Python toolchains. + + Args: + name: {type}`str` base name for each name in {obj}`python_register_toolchains` call. + python_versions: {type}`list[str]` the Python versions. + default_version: {type}`str` the default Python version. If not set, + the first version in python_versions is used. + minor_mapping: {type}`dict[str, str]` mapping between `X.Y` to `X.Y.Z` + format. Defaults to the value in `//python:versions.bzl`. + **kwargs: passed to each {obj}`python_register_toolchains` call. + """ + if len(python_versions) == 0: + fail("python_versions must not be empty") + + minor_mapping = minor_mapping or MINOR_MAPPING + + if not default_version: + default_version = python_versions.pop(0) + for python_version in python_versions: + if python_version == default_version: + # We register the default version lastly so that it's not picked first when --platforms + # is set with a constraint during toolchain resolution. This is due to the fact that + # Bazel will match the unconstrained toolchain if we register it before the constrained + # ones. + continue + python_register_toolchains( + name = name + "_" + python_version.replace(".", "_"), + python_version = python_version, + set_python_version_constraint = True, + minor_mapping = minor_mapping, + **kwargs + ) + python_register_toolchains( + name = name + "_" + default_version.replace(".", "_"), + python_version = default_version, + set_python_version_constraint = False, + minor_mapping = minor_mapping, + **kwargs + ) + + multi_toolchain_aliases( + name = name, + python_versions = { + python_version: name + "_" + python_version.replace(".", "_") + for python_version in (python_versions + [default_version]) + }, + minor_mapping = minor_mapping, + ) diff --git a/python/private/python_register_toolchains.bzl b/python/private/python_register_toolchains.bzl new file mode 100644 index 0000000000..7638d76313 --- /dev/null +++ b/python/private/python_register_toolchains.bzl @@ -0,0 +1,176 @@ +# 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 repository rules and macros to support toolchain registration. +""" + +load( + "//python:versions.bzl", + "DEFAULT_RELEASE_BASE_URL", + "MINOR_MAPPING", + "PLATFORMS", + "TOOL_VERSIONS", + "get_release_info", +) +load(":bzlmod_enabled.bzl", "BZLMOD_ENABLED") +load(":coverage_deps.bzl", "coverage_dep") +load(":full_version.bzl", "full_version") +load(":python_repository.bzl", "python_repository") +load( + ":toolchains_repo.bzl", + "host_toolchain", + "toolchain_aliases", + "toolchains_repo", +) + +# Wrapper macro around everything above, this is the primary API. +def python_register_toolchains( + name, + python_version, + register_toolchains = True, + register_coverage_tool = False, + set_python_version_constraint = False, + tool_versions = None, + minor_mapping = None, + **kwargs): + """Convenience macro for users which does typical setup. + + - Create a repository for each built-in platform like "python_3_8_linux_amd64" - + this repository is lazily fetched when Python is needed for that platform. + - Create a repository exposing toolchains for each platform like + "python_platforms". + - Register a toolchain pointing at each platform. + + Users can avoid this macro and do these steps themselves, if they want more + control. + + Args: + name: {type}`str` base name for all created repos, e.g. "python_3_8". + python_version: {type}`str` the Python version. + register_toolchains: {type}`bool` Whether or not to register the downloaded toolchains. + register_coverage_tool: {type}`bool` Whether or not to register the + downloaded coverage tool to the toolchains. + set_python_version_constraint: {type}`bool` When set to `True`, + `target_compatible_with` for the toolchains will include a version + constraint. + tool_versions: {type}`dict` contains a mapping of version with SHASUM + and platform info. If not supplied, the defaults in + python/versions.bzl will be used. + 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. + """ + + if BZLMOD_ENABLED: + # you cannot used native.register_toolchains when using bzlmod. + register_toolchains = False + + base_url = kwargs.pop("base_url", DEFAULT_RELEASE_BASE_URL) + tool_versions = tool_versions or TOOL_VERSIONS + minor_mapping = minor_mapping or MINOR_MAPPING + + python_version = full_version(version = python_version, minor_mapping = minor_mapping) + + toolchain_repo_name = "{name}_toolchains".format(name = name) + + # When using unreleased Bazel versions, the version is an empty string + if native.bazel_version: + bazel_major = int(native.bazel_version.split(".")[0]) + if bazel_major < 6: + if register_coverage_tool: + # buildifier: disable=print + print(( + "WARNING: ignoring register_coverage_tool=True when " + + "registering @{name}: Bazel 6+ required, got {version}" + ).format( + name = name, + version = native.bazel_version, + )) + register_coverage_tool = False + + loaded_platforms = [] + for platform in PLATFORMS.keys(): + sha256 = tool_versions[python_version]["sha256"].get(platform, None) + if not sha256: + continue + + loaded_platforms.append(platform) + (release_filename, urls, strip_prefix, patches, patch_strip) = get_release_info(platform, python_version, base_url, tool_versions) + + # allow passing in a tool version + coverage_tool = None + coverage_tool = tool_versions[python_version].get("coverage_tool", {}).get(platform, None) + if register_coverage_tool and coverage_tool == None: + coverage_tool = coverage_dep( + name = "{name}_{platform}_coverage".format( + name = name, + platform = platform, + ), + python_version = python_version, + platform = platform, + visibility = ["@{name}_{platform}//:__subpackages__".format( + name = name, + platform = platform, + )], + ) + + python_repository( + name = "{name}_{platform}".format( + name = name, + platform = platform, + ), + sha256 = sha256, + patches = patches, + patch_strip = patch_strip, + platform = platform, + python_version = python_version, + release_filename = release_filename, + urls = urls, + strip_prefix = strip_prefix, + coverage_tool = coverage_tool, + **kwargs + ) + if register_toolchains: + native.register_toolchains("@{toolchain_repo_name}//:{platform}_toolchain".format( + toolchain_repo_name = toolchain_repo_name, + platform = platform, + )) + native.register_toolchains("@{toolchain_repo_name}//:{platform}_py_cc_toolchain".format( + toolchain_repo_name = toolchain_repo_name, + platform = platform, + )) + native.register_toolchains("@{toolchain_repo_name}//:{platform}_py_exec_tools_toolchain".format( + toolchain_repo_name = toolchain_repo_name, + platform = platform, + )) + + host_toolchain(name = name + "_host") + + toolchain_aliases( + name = name, + python_version = python_version, + user_repository_name = name, + platforms = loaded_platforms, + ) + + # in bzlmod we write out our own toolchain repos + if BZLMOD_ENABLED: + return + + toolchains_repo( + name = toolchain_repo_name, + python_version = python_version, + set_python_version_constraint = set_python_version_constraint, + user_repository_name = name, + ) diff --git a/python/private/python_repositories.bzl b/python/private/python_repository.bzl similarity index 61% rename from python/private/python_repositories.bzl rename to python/private/python_repository.bzl index 0286160b52..28a2c959dd 100644 --- a/python/private/python_repositories.bzl +++ b/python/private/python_repository.bzl @@ -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. @@ -12,69 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""This file contains macros to be called during WORKSPACE evaluation. - -For historic reasons, pip_repositories() is defined in //python:pip.bzl. +"""This file contains repository rules and macros to support toolchain registration. """ -load("@bazel_tools//tools/build_defs/repo:http.bzl", _http_archive = "http_archive") -load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") -load( - "//python:versions.bzl", - "DEFAULT_RELEASE_BASE_URL", - "MINOR_MAPPING", - "PLATFORMS", - "TOOL_VERSIONS", - "get_release_info", -) -load("//python/private/pypi:deps.bzl", "pypi_deps") +load("//python:versions.bzl", "PLATFORMS") load(":auth.bzl", "get_auth") -load(":bzlmod_enabled.bzl", "BZLMOD_ENABLED") -load(":coverage_deps.bzl", "coverage_dep") -load(":full_version.bzl", "full_version") -load(":internal_config_repo.bzl", "internal_config_repo") load(":repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") load(":text_util.bzl", "render") -load( - ":toolchains_repo.bzl", - "host_toolchain", - "multi_toolchain_aliases", - "toolchain_aliases", - "toolchains_repo", -) - -def http_archive(**kwargs): - maybe(_http_archive, **kwargs) - -def py_repositories(): - """Runtime dependencies that users must install. - - This function should be loaded and called in the user's WORKSPACE. - With bzlmod enabled, this function is not needed since MODULE.bazel handles transitive deps. - """ - maybe( - internal_config_repo, - name = "rules_python_internal", - ) - http_archive( - name = "bazel_skylib", - sha256 = "74d544d96f4a5bb630d465ca8bbcfe231e3594e5aae57e1edbf17a6eb3ca2506", - 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", - ], - ) - 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", - ) - pypi_deps() - -######## -# Remaining content of the file is only used to support toolchains. -######## STANDALONE_INTERPRETER_FILENAME = "STANDALONE_INTERPRETER" @@ -458,199 +402,3 @@ function defaults (e.g. `single_version_override` for `MODULE.bazel` files. }, environ = [REPO_DEBUG_ENV_VAR], ) - -# Wrapper macro around everything above, this is the primary API. -def python_register_toolchains( - name, - python_version, - register_toolchains = True, - register_coverage_tool = False, - set_python_version_constraint = False, - tool_versions = None, - minor_mapping = None, - **kwargs): - """Convenience macro for users which does typical setup. - - - Create a repository for each built-in platform like "python_3_8_linux_amd64" - - this repository is lazily fetched when Python is needed for that platform. - - Create a repository exposing toolchains for each platform like - "python_platforms". - - Register a toolchain pointing at each platform. - - Users can avoid this macro and do these steps themselves, if they want more - control. - - Args: - name: {type}`str` base name for all created repos, e.g. "python_3_8". - python_version: {type}`str` the Python version. - register_toolchains: {type}`bool` Whether or not to register the downloaded toolchains. - register_coverage_tool: {type}`bool` Whether or not to register the - downloaded coverage tool to the toolchains. - set_python_version_constraint: {type}`bool` When set to `True`, - `target_compatible_with` for the toolchains will include a version - constraint. - tool_versions: {type}`dict` contains a mapping of version with SHASUM - and platform info. If not supplied, the defaults in - python/versions.bzl will be used. - 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. - """ - - if BZLMOD_ENABLED: - # you cannot used native.register_toolchains when using bzlmod. - register_toolchains = False - - base_url = kwargs.pop("base_url", DEFAULT_RELEASE_BASE_URL) - tool_versions = tool_versions or TOOL_VERSIONS - minor_mapping = minor_mapping or MINOR_MAPPING - - python_version = full_version(version = python_version, minor_mapping = minor_mapping) - - toolchain_repo_name = "{name}_toolchains".format(name = name) - - # When using unreleased Bazel versions, the version is an empty string - if native.bazel_version: - bazel_major = int(native.bazel_version.split(".")[0]) - if bazel_major < 6: - if register_coverage_tool: - # buildifier: disable=print - print(( - "WARNING: ignoring register_coverage_tool=True when " + - "registering @{name}: Bazel 6+ required, got {version}" - ).format( - name = name, - version = native.bazel_version, - )) - register_coverage_tool = False - - loaded_platforms = [] - for platform in PLATFORMS.keys(): - sha256 = tool_versions[python_version]["sha256"].get(platform, None) - if not sha256: - continue - - loaded_platforms.append(platform) - (release_filename, urls, strip_prefix, patches, patch_strip) = get_release_info(platform, python_version, base_url, tool_versions) - - # allow passing in a tool version - coverage_tool = None - coverage_tool = tool_versions[python_version].get("coverage_tool", {}).get(platform, None) - if register_coverage_tool and coverage_tool == None: - coverage_tool = coverage_dep( - name = "{name}_{platform}_coverage".format( - name = name, - platform = platform, - ), - python_version = python_version, - platform = platform, - visibility = ["@{name}_{platform}//:__subpackages__".format( - name = name, - platform = platform, - )], - ) - - python_repository( - name = "{name}_{platform}".format( - name = name, - platform = platform, - ), - sha256 = sha256, - patches = patches, - patch_strip = patch_strip, - platform = platform, - python_version = python_version, - release_filename = release_filename, - urls = urls, - strip_prefix = strip_prefix, - coverage_tool = coverage_tool, - **kwargs - ) - if register_toolchains: - native.register_toolchains("@{toolchain_repo_name}//:{platform}_toolchain".format( - toolchain_repo_name = toolchain_repo_name, - platform = platform, - )) - native.register_toolchains("@{toolchain_repo_name}//:{platform}_py_cc_toolchain".format( - toolchain_repo_name = toolchain_repo_name, - platform = platform, - )) - native.register_toolchains("@{toolchain_repo_name}//:{platform}_py_exec_tools_toolchain".format( - toolchain_repo_name = toolchain_repo_name, - platform = platform, - )) - - host_toolchain(name = name + "_host") - - toolchain_aliases( - name = name, - python_version = python_version, - user_repository_name = name, - platforms = loaded_platforms, - ) - - # in bzlmod we write out our own toolchain repos - if BZLMOD_ENABLED: - return - - toolchains_repo( - name = toolchain_repo_name, - python_version = python_version, - set_python_version_constraint = set_python_version_constraint, - user_repository_name = name, - ) - -def python_register_multi_toolchains( - name, - python_versions, - default_version = None, - minor_mapping = None, - **kwargs): - """Convenience macro for registering multiple Python toolchains. - - Args: - name: {type}`str` base name for each name in {obj}`python_register_toolchains` call. - python_versions: {type}`list[str]` the Python versions. - default_version: {type}`str` the default Python version. If not set, - the first version in python_versions is used. - minor_mapping: {type}`dict[str, str]` mapping between `X.Y` to `X.Y.Z` - format. Defaults to the value in `//python:versions.bzl`. - **kwargs: passed to each {obj}`python_register_toolchains` call. - """ - if len(python_versions) == 0: - fail("python_versions must not be empty") - - minor_mapping = minor_mapping or MINOR_MAPPING - - if not default_version: - default_version = python_versions.pop(0) - for python_version in python_versions: - if python_version == default_version: - # We register the default version lastly so that it's not picked first when --platforms - # is set with a constraint during toolchain resolution. This is due to the fact that - # Bazel will match the unconstrained toolchain if we register it before the constrained - # ones. - continue - python_register_toolchains( - name = name + "_" + python_version.replace(".", "_"), - python_version = python_version, - set_python_version_constraint = True, - minor_mapping = minor_mapping, - **kwargs - ) - python_register_toolchains( - name = name + "_" + default_version.replace(".", "_"), - python_version = default_version, - set_python_version_constraint = False, - minor_mapping = minor_mapping, - **kwargs - ) - - multi_toolchain_aliases( - name = name, - python_versions = { - python_version: name + "_" + python_version.replace(".", "_") - for python_version in (python_versions + [default_version]) - }, - minor_mapping = minor_mapping, - ) diff --git a/python/repositories.bzl b/python/repositories.bzl index 88c00e28cb..768b5874d5 100644 --- a/python/repositories.bzl +++ b/python/repositories.bzl @@ -16,14 +16,14 @@ """ load( - "//python/private:python_repositories.bzl", + "//python/private:is_standalone_interpreter.bzl", _STANDALONE_INTERPRETER_FILENAME = "STANDALONE_INTERPRETER_FILENAME", _is_standalone_interpreter = "is_standalone_interpreter", - _py_repositories = "py_repositories", - _python_register_multi_toolchains = "python_register_multi_toolchains", - _python_register_toolchains = "python_register_toolchains", - _python_repository = "python_repository", ) +load("//python/private:py_repositories.bzl", _py_repositories = "py_repositories") +load("//python/private:python_register_multi_toolchains.bzl", _python_register_multi_toolchains = "python_register_multi_toolchains") +load("//python/private:python_register_toolchains.bzl", _python_register_toolchains = "python_register_toolchains") +load("//python/private:python_repository.bzl", _python_repository = "python_repository") py_repositories = _py_repositories python_register_multi_toolchains = _python_register_multi_toolchains From 1d7fd51ceab8d09858eca85cce9a16b867b8a3e2 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 20 Sep 2024 19:22:04 +0900 Subject: [PATCH 216/345] fix(ci): use --enable_workspace for bazel-in-bazel tests (#2237) The CI on `main` started failing and is affecting all PRs. Most likely a fixup to #2184. --- .bazelversion | 2 +- CHANGELOG.md | 1 + MODULE.bazel | 2 + tests/integration/BUILD.bazel | 24 +++++- tests/integration/integration_test.bzl | 107 ++++++++++++++----------- version.bzl | 2 +- 6 files changed, 90 insertions(+), 48 deletions(-) diff --git a/.bazelversion b/.bazelversion index 66ce77b7ea..a3fcc7121b 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -7.0.0 +7.1.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index 0300824bd1..1d8632f762 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ A brief description of the categories of changes: * (toolchains) {obj}`py_cc_toolchain.libs` and {obj}`PyCcToolchainInfo.libs` is optional. This is to support situations where only the Python headers are available. +* (bazel) Minimum bazel 7 version that we test against has been bumped to `7.1`. ### Fixed * (whl_library): Remove `--no-index` and add `--no-build-isolation` to the diff --git a/MODULE.bazel b/MODULE.bazel index 9ac3e7a04c..424b4f84c1 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -116,6 +116,7 @@ bazel_binaries.local( 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") use_repo( bazel_binaries, @@ -124,6 +125,7 @@ use_repo( # 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_self", ) diff --git a/tests/integration/BUILD.bazel b/tests/integration/BUILD.bazel index 8724b25280..289c85d38a 100644 --- a/tests/integration/BUILD.bazel +++ b/tests/integration/BUILD.bazel @@ -19,10 +19,14 @@ load(":integration_test.bzl", "rules_python_integration_test") licenses(["notice"]) -_WORKSPACE_FLAGS = [ +_LEGACY_WORKSPACE_FLAGS = [ "--noenable_bzlmod", ] +_WORKSPACE_FLAGS = _LEGACY_WORKSPACE_FLAGS + [ + "--enable_workspace", +] + _WORKSPACE_GAZELLE_PLUGIN_FLAGS = [ "--override_repository=rules_python_gazelle_plugin=../../../rules_python_gazelle_plugin", ] @@ -31,6 +35,24 @@ _GAZELLE_PLUGIN_FLAGS = [ "--override_module=rules_python_gazelle_plugin=../../../rules_python_gazelle_plugin", ] +default_test_runner( + name = "bazel_6_4_workspace_test_runner", + bazel_cmds = [ + "info {}".format(" ".join(_LEGACY_WORKSPACE_FLAGS)), + "test {} //...".format(" ".join(_LEGACY_WORKSPACE_FLAGS)), + ], + visibility = ["//visibility:public"], +) + +default_test_runner( + name = "bazel_6_4_workspace_test_runner_gazelle_plugin", + bazel_cmds = [ + "info {}".format(" ".join(_LEGACY_WORKSPACE_FLAGS + _WORKSPACE_GAZELLE_PLUGIN_FLAGS)), + "test {} //...".format(" ".join(_LEGACY_WORKSPACE_FLAGS + _WORKSPACE_GAZELLE_PLUGIN_FLAGS)), + ], + visibility = ["//visibility:public"], +) + default_test_runner( name = "workspace_test_runner", bazel_cmds = [ diff --git a/tests/integration/integration_test.bzl b/tests/integration/integration_test.bzl index 8606f66bb3..c437953319 100644 --- a/tests/integration/integration_test.bzl +++ b/tests/integration/integration_test.bzl @@ -16,11 +16,40 @@ load("@bazel_binaries//:defs.bzl", "bazel_binaries") load( "@rules_bazel_integration_test//bazel_integration_test:defs.bzl", - "bazel_integration_tests", + "bazel_integration_test", "integration_test_utils", ) load("//python:py_test.bzl", "py_test") +def _test_runner(*, name, bazel_version, py_main, bzlmod, gazelle_plugin): + if py_main: + test_runner = "{}_bazel_{}_py_runner".format(name, bazel_version) + py_test( + name = test_runner, + srcs = [py_main], + main = py_main, + deps = [":runner_lib"], + # Hide from ... patterns; should only be run as part + # of the bazel integration test + tags = ["manual"], + ) + return test_runner + + if bazel_version.startswith("6") and not bzlmod: + if gazelle_plugin: + return "//tests/integration:bazel_6_4_workspace_test_runner_gazelle_plugin" + else: + return "//tests/integration:bazel_6_4_workspace_test_runner" + + if bzlmod and gazelle_plugin: + return "//tests/integration:test_runner_gazelle_plugin" + elif bzlmod: + return "//tests/integration:test_runner" + elif gazelle_plugin: + return "//tests/integration:workspace_test_runner_gazelle_plugin" + else: + return "//tests/integration:workspace_test_runner" + def rules_python_integration_test( name, workspace_path = None, @@ -48,26 +77,6 @@ def rules_python_integration_test( **kwargs: Passed to the upstream `bazel_integration_tests` rule. """ workspace_path = workspace_path or name.removesuffix("_test") - if py_main: - test_runner = name + "_py_runner" - py_test( - name = test_runner, - srcs = [py_main], - main = py_main, - deps = [":runner_lib"], - # Hide from ... patterns; should only be run as part - # of the bazel integration test - tags = ["manual"], - ) - elif bzlmod: - if gazelle_plugin: - test_runner = "//tests/integration:test_runner_gazelle_plugin" - else: - test_runner = "//tests/integration:test_runner" - elif gazelle_plugin: - test_runner = "//tests/integration:workspace_test_runner_gazelle_plugin" - else: - test_runner = "//tests/integration:workspace_test_runner" # Because glob expansion happens at loading time, the bazel-* symlinks # in the workspaces can recursively expand to tens-of-thousands of entries, @@ -89,27 +98,35 @@ def rules_python_integration_test( ], ) kwargs.setdefault("size", "enormous") - bazel_integration_tests( - name = name, - workspace_path = workspace_path, - test_runner = test_runner, - bazel_versions = bazel_versions or bazel_binaries.versions.all, - workspace_files = [name + "_workspace_files"], - # Override the tags so that the `manual` tag isn't applied. - tags = (tags or []) + [ - # These tests are very heavy weight, so much so that only a couple - # can be run in parallel without harming their reliability, - # overall runtime, and the system's stability. Unfortunately, - # there doesn't appear to be a way to tell Bazel to limit their - # concurrency, only disable it entirely with exclusive. - "exclusive", - # The default_test_runner() assumes it can write to the user's home - # directory for caching purposes. Give it access. - "no-sandbox", - # The CI RBE setup can't successfully run these tests remotely. - "no-remote-exec", - # A special tag is used so CI can run them as a separate job. - "integration-test", - ], - **kwargs - ) + for bazel_version in bazel_versions or bazel_binaries.versions.all: + test_runner = _test_runner( + name = name, + bazel_version = bazel_version, + py_main = py_main, + bzlmod = bzlmod, + gazelle_plugin = gazelle_plugin, + ) + bazel_integration_test( + name = "{}_bazel_{}".format(name, bazel_version), + workspace_path = workspace_path, + test_runner = test_runner, + bazel_version = bazel_version, + workspace_files = [name + "_workspace_files"], + # Override the tags so that the `manual` tag isn't applied. + tags = (tags or []) + [ + # These tests are very heavy weight, so much so that only a couple + # can be run in parallel without harming their reliability, + # overall runtime, and the system's stability. Unfortunately, + # there doesn't appear to be a way to tell Bazel to limit their + # concurrency, only disable it entirely with exclusive. + "exclusive", + # The default_test_runner() assumes it can write to the user's home + # directory for caching purposes. Give it access. + "no-sandbox", + # The CI RBE setup can't successfully run these tests remotely. + "no-remote-exec", + # A special tag is used so CI can run them as a separate job. + "integration-test", + ], + **kwargs + ) diff --git a/version.bzl b/version.bzl index 2e8fc0b0f5..5194f30073 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.0.0" +BAZEL_VERSION = "7.1.0" # NOTE: Keep in sync with .bazelci/presubmit.yml # This is the minimum supported bazel version, that we have some tests for. From 93eda704fe252af0213ad71fad566c3c0b4f3660 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 22 Sep 2024 13:37:45 +0900 Subject: [PATCH 217/345] fix(platforms): include flag_values in config_settings (#2236) This function that allows us to generate config settings for supported platforms did not get the flag_values addition. --- CHANGELOG.md | 2 ++ python/versions.bzl | 1 + 2 files changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d8632f762..88a8378cd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,8 @@ A brief description of the categories of changes: in extra_requires in py_wheel rule. * (rules) Prevent pytest from trying run the generated stage2 bootstrap .py file when using {obj}`--bootstrap_impl=script` +* (toolchain) The {bzl:obj}`gen_python_config_settings` has been fixed to include + the flag_values from the platform definitions. ### Added diff --git a/python/versions.bzl b/python/versions.bzl index 79e388db12..c97c1cc01f 100644 --- a/python/versions.bzl +++ b/python/versions.bzl @@ -722,5 +722,6 @@ def gen_python_config_settings(name = ""): for platform in PLATFORMS.keys(): native.config_setting( name = "{name}{platform}".format(name = name, platform = platform), + flag_values = PLATFORMS[platform].flag_values, constraint_values = PLATFORMS[platform].compatible_with, ) From b92927d86ca202c72bd981d208149fd788511b6d Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 22 Sep 2024 14:11:13 +0900 Subject: [PATCH 218/345] feat(bzlmod): add python.override APIs (#2222) Before this PR the users could not override how the hermetic toolchain is downloaded when in `bzlmod`. However, the same APIs would be available to users using `WORKSPACE`. With this we also allow root modules to restrict which toolchain versions the non-root modules, which may be helpful when optimizing the CI runtimes so that we don't waste time downloading multiple `micro` versions of the same `3.X` python version, which most of the times have identical behavior. Whilst at it, tweak the `semver` implementation to allow for testing of absence of values in the original input. Work towards #2081 and this should be one of the last items that are blocking #1361 from the API point of view. Replaces #2151. --------- Co-authored-by: Richard Levasseur --- .bazelrc | 4 +- CHANGELOG.md | 8 + MODULE.bazel | 2 +- docs/toolchains.md | 17 +- examples/bzlmod/MODULE.bazel | 51 +- examples/bzlmod/MODULE.bazel.lock | 4 +- python/extensions/python.bzl | 33 +- python/private/BUILD.bazel | 4 +- python/private/common/py_runtime_rule.bzl | 8 +- python/private/py_repositories.bzl | 4 +- python/private/pypi/BUILD.bazel | 2 +- python/private/python.bzl | 593 +++++++++++++++--- python/private/python_register_toolchains.bzl | 4 + python/private/python_repository.bzl | 20 +- python/private/semver.bzl | 10 +- python/private/toolchains_repo.bzl | 3 - .../ignore_root_user_error/bzlmod_test.py | 12 +- tests/python/python_tests.bzl | 494 ++++++++++++++- tests/semver/semver_test.bzl | 6 +- 19 files changed, 1137 insertions(+), 142 deletions(-) diff --git a/.bazelrc b/.bazelrc index b484751c3c..1ca469cd75 100644 --- a/.bazelrc +++ b/.bazelrc @@ -4,8 +4,8 @@ # (Note, we cannot use `common --deleted_packages` because the bazel version command doesn't support it) # To update these lines, execute # `bazel run @rules_bazel_integration_test//tools:update_deleted_packages` -build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered -query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered test --test_output=errors diff --git a/CHANGELOG.md b/CHANGELOG.md index 88a8378cd1..0fd84923ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,10 @@ A brief description of the categories of changes: * (gazelle): Update error messages when unable to resolve a dependency to be more human-friendly. * (flags) The {obj}`--python_version` flag now also returns {obj}`config_common.FeatureFlagInfo`. +* (toolchain): The toolchain patches now expose the `patch_strip` attribute + that one should use when patching toolchains. Please set it if you are + patching python interpreter. In the next release the default will be set to + `0` which better reflects the defaults used in public `bazel` APIs. * (toolchains) When {obj}`py_runtime.interpreter_version_info` isn't specified, the {obj}`--python_version` flag will determine the value. This allows specifying the build-time Python version for the @@ -65,6 +69,10 @@ A brief description of the categories of changes: ### Added +* (bzlmod): Toolchain overrides can now be done using the new + {bzl:obj}`python.override`, {bzl:obj}`python.single_version_override` and + {bzl:obj}`python.single_version_platform_override` tag classes. + See [#2081](https://github.com/bazelbuild/rules_python/issues/2081). * (rules) Executables provide {obj}`PyExecutableInfo`, which contains executable-specific information useful for packaging an executable or or deriving a new one from the original. diff --git a/MODULE.bazel b/MODULE.bazel index 424b4f84c1..58c7ae229b 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -81,7 +81,7 @@ dev_python = use_extension( "python", dev_dependency = True, ) -dev_python.rules_python_private_testing( +dev_python.override( register_all_versions = True, ) diff --git a/docs/toolchains.md b/docs/toolchains.md index 2ac0099304..6df6f22a2a 100644 --- a/docs/toolchains.md +++ b/docs/toolchains.md @@ -169,6 +169,21 @@ Variables](https://bazel.build/reference/be/make-variables). See the {gh-path}`test_current_py_toolchain ` target for an example. +### Overriding toolchain defaults and adding more versions + +One can perform various overrides for the registered toolchains from the root +module. For example, the following use cases would be supported using the +existing attributes: + +* Limiting the available toolchains for the entire `bzlmod` transitive graph + via {attr}`python.override.available_python_versions`. +* Setting particular `X.Y.Z` Python versions when modules request `X.Y` version + via {attr}`python.override.minor_mapping`. +* Per-version control of the coverage tool used using + {attr}`python.single_version_platform_override.coverage_tool`. +* Adding additional Python versions via {bzl:obj}`python.single_version_override` or + {bzl:obj}`python.single_version_platform_override`. + ## Workspace configuration To import rules_python in your project, you first need to add it to your @@ -244,7 +259,7 @@ automatically registers a higher-priority toolchain; it won't be used unless there is a toolchain misconfiguration somewhere. To aid migration off the Bazel-builtin toolchain, rules_python provides -{obj}`@rules_python//python/runtime_env_toolchains:all`. This is an equivalent +{bzl:obj}`@rules_python//python/runtime_env_toolchains:all`. This is an equivalent toolchain, but is implemented using rules_python's objects. diff --git a/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel index b7b46b7dba..4ac8191051 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -22,7 +22,7 @@ bazel_dep(name = "protobuf", version = "24.4", repo_name = "com_google_protobuf" python = use_extension("@rules_python//python/extensions:python.bzl", "python") python.toolchain( configure_coverage_tool = True, - # Only set when you have mulitple toolchain versions. + # Only set when you have multiple toolchain versions. is_default = True, python_version = "3.9", ) @@ -37,6 +37,55 @@ python.toolchain( python_version = "3.10", ) +# 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.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 defaults, controls what full version + # is used when `3.x` is requested. + minor_mapping = { + "3.10": "3.10.9", + "3.11": "3.11.8", + "3.9": "3.9.19", + }, +) + +# Or the sources that the toolchains come from for all platforms +python.single_version_override( + patch_strip = 1, + # The user can specify patches to be applied to all interpreters. + patches = [], + python_version = "3.10.2", + sha256 = { + "aarch64-apple-darwin": "1409acd9a506e2d1d3b65c1488db4e40d8f19d09a7df099667c87a506f71c0ef", + "aarch64-unknown-linux-gnu": "8f351a8cc348bb45c0f95b8634c8345ec6e749e483384188ad865b7428342703", + "x86_64-apple-darwin": "8146ad4390710ec69b316a5649912df0247d35f4a42e2aa9615bffd87b3e235a", + "x86_64-pc-windows-msvc": "a1d9a594cd3103baa24937ad9150c1a389544b4350e859200b3e5c036ac352bd", + "x86_64-unknown-linux-gnu": "9b64eca2a94f7aff9409ad70bdaa7fbbf8148692662e764401883957943620dd", + }, + urls = ["20220227/cpython-{python_version}+20220227-{platform}-{build}.tar.gz"], +) + +# Or a single platform. This can be used in combination with the +# `single_version_override` and `single_version_platform_override` will be +# applied after `single_version_override`. Any values present in this override +# will overwrite the values set by the `single_version_override` +python.single_version_platform_override( + patch_strip = 1, + patches = [], + platform = "aarch64-apple-darwin", + python_version = "3.10.2", + sha256 = "1409acd9a506e2d1d3b65c1488db4e40d8f19d09a7df099667c87a506f71c0ef", + urls = ["20220227/cpython-{python_version}+20220227-{platform}-{build}.tar.gz"], +) + # You only need to load this repositories if you are using multiple Python versions. # See the tests folder for various examples on using multiple Python versions. # The names "python_3_9" and "python_3_10" are autmatically created by the repo diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 234dc46cab..cb8fbe287c 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1231,7 +1231,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "Cca+OPIA5xqQl5ND8j44y5jBkjQfz+36h8Hgq0N26I0=", + "bzlTransitiveDigest": "ED3oUrLQz/MTptq8JOZ03sjD7HZ3naUeFS3XFpxz4tg=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6140,7 +6140,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "wkQNgti5fKONsAUn77ZyTWdfaJfI2cSDrSI0b4JzmI8=", + "bzlTransitiveDigest": "vEOIMpxlh8qbHkABunGFRr+IDbabjCM/hUF0V3GGTus=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/python/extensions/python.bzl b/python/extensions/python.bzl index 4148d90877..0f0da006a7 100644 --- a/python/extensions/python.bzl +++ b/python/extensions/python.bzl @@ -12,7 +12,38 @@ # See the License for the specific language governing permissions and # limitations under the License. -"Python toolchain module extensions for use with bzlmod" +"""Python toolchain module extensions for use with bzlmod. + +:::{topic} Basic usage + +The simplest way to configure the toolchain with `rules_python` is as follows. + +```starlark +python = use_extension("@rules_python//python/extensions:python.bzl", "python") +python.toolchain( + is_default = True, + python_version = "3.11", +) +use_repo(python, "python_3_11") +``` + +::::{seealso} +For more in-depth documentation see the {obj}`python.toolchain`. +:::: +::: + +:::{topic} Overrides + +Overrides can be done at 3 different levels: +* Overrides affecting all python toolchain versions on all platforms - {obj}`python.override`. +* Overrides affecting a single toolchain versions on all platforms - {obj}`python.single_version_override`. +* Overrides affecting a single toolchain versions on a single platforms - {obj}`python.single_version_platform_override`. + +::::{seealso} +The main documentation page on registering [toolchains](/toolchains). +:::: +::: +""" load("//python/private:python.bzl", _python = "python") diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 5fa551454e..bfe3764296 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -141,11 +141,12 @@ bzl_library( srcs = ["python.bzl"], deps = [ ":full_version_bzl", + ":python_register_toolchains_bzl", ":pythons_hub_bzl", ":repo_utils_bzl", + ":semver_bzl", ":toolchains_repo_bzl", ":util_bzl", - "//python:repositories_bzl", "@bazel_features//:features", ], ) @@ -202,7 +203,6 @@ bzl_library( name = "pythons_hub_bzl", srcs = ["pythons_hub.bzl"], deps = [ - ":full_version_bzl", ":py_toolchain_suite_bzl", ], ) diff --git a/python/private/common/py_runtime_rule.bzl b/python/private/common/py_runtime_rule.bzl index dd40f76a00..b339425099 100644 --- a/python/private/common/py_runtime_rule.bzl +++ b/python/private/common/py_runtime_rule.bzl @@ -202,8 +202,8 @@ See @bazel_tools//tools/python:python_bootstrap_template.txt for more variables. "coverage_tool": attr.label( allow_files = False, doc = """ -This is a target to use for collecting code coverage information from `py_binary` -and `py_test` targets. +This is a target to use for collecting code coverage information from +{rule}`py_binary` and {rule}`py_test` targets. If set, the target must either produce a single file or be an executable target. The path to the single file, or the executable if the target is executable, @@ -212,7 +212,7 @@ runfiles will be added to the runfiles when coverage is enabled. The entry point for the tool must be loadable by a Python interpreter (e.g. a `.py` or `.pyc` file). It must accept the command line arguments -of coverage.py (https://coverage.readthedocs.io), at least including +of [`coverage.py`](https://coverage.readthedocs.io), at least including the `run` and `lcov` subcommands. """, ), @@ -311,7 +311,7 @@ The template to use when two stage bootstrapping is enabled default = DEFAULT_STUB_SHEBANG, doc = """ "Shebang" expression prepended to the bootstrapping Python stub script -used when executing `py_binary` targets. +used when executing {rule}`py_binary` targets. See https://github.com/bazelbuild/bazel/issues/8685 for motivation. diff --git a/python/private/py_repositories.bzl b/python/private/py_repositories.bzl index ace3750a2b..8ddcb5d3a7 100644 --- a/python/private/py_repositories.bzl +++ b/python/private/py_repositories.bzl @@ -25,8 +25,8 @@ def http_archive(**kwargs): def py_repositories(): """Runtime dependencies that users must install. - This function should be loaded and called in the user's WORKSPACE. - With bzlmod enabled, this function is not needed since MODULE.bazel handles transitive deps. + This function should be loaded and called in the user's `WORKSPACE`. + With `bzlmod` enabled, this function is not needed since `MODULE.bazel` handles transitive deps. """ maybe( internal_config_repo, diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel index 2b25bfbfb4..8cfd3d6525 100644 --- a/python/private/pypi/BUILD.bazel +++ b/python/private/pypi/BUILD.bazel @@ -59,7 +59,6 @@ bzl_library( srcs = ["extension.bzl"], deps = [ ":attrs_bzl", - "//python/private:semver_bzl", ":hub_repository_bzl", ":parse_requirements_bzl", ":evaluate_markers_bzl", @@ -71,6 +70,7 @@ bzl_library( "//python/private:full_version_bzl", "//python/private:normalize_name_bzl", "//python/private:version_label_bzl", + "//python/private:semver_bzl", "@bazel_features//:features", ] + [ "@pythons_hub//:interpreters_bzl", diff --git a/python/private/python.bzl b/python/private/python.bzl index 98b089f7ca..cedf39a5c7 100644 --- a/python/private/python.bzl +++ b/python/private/python.bzl @@ -12,14 +12,16 @@ # See the License for the specific language governing permissions and # limitations under the License. -"Python toolchain module extensions for use with bzlmod" +"Python toolchain module extensions for use with bzlmod." load("@bazel_features//:features.bzl", "bazel_features") -load("//python:versions.bzl", "MINOR_MAPPING", "TOOL_VERSIONS") +load("//python:versions.bzl", "DEFAULT_RELEASE_BASE_URL", "PLATFORMS", "TOOL_VERSIONS") +load(":auth.bzl", "AUTH_ATTRS") load(":full_version.bzl", "full_version") load(":python_register_toolchains.bzl", "python_register_toolchains") load(":pythons_hub.bzl", "hub_repo") load(":repo_utils.bzl", "repo_utils") +load(":semver.bzl", "semver") load(":text_util.bzl", "render") load(":toolchains_repo.bzl", "multi_toolchain_aliases") load(":util.bzl", "IS_BAZEL_6_4_OR_HIGHER") @@ -29,11 +31,12 @@ load(":util.bzl", "IS_BAZEL_6_4_OR_HIGHER") _MAX_NUM_TOOLCHAINS = 9999 _TOOLCHAIN_INDEX_PAD_LENGTH = len(str(_MAX_NUM_TOOLCHAINS)) -def parse_modules(module_ctx): +def parse_modules(*, module_ctx, _fail = fail): """Parse the modules and return a struct for registrations. Args: module_ctx: {type}`module_ctx` module context. + _fail: {type}`function` the failure function, mainly for testing. Returns: A struct with the following attributes: @@ -61,7 +64,7 @@ def parse_modules(module_ctx): # This is a toolchain_info struct. default_toolchain = None - # Map of version string to the toolchain_info struct + # Map of string Major.Minor or Major.Minor.Patch to the toolchain_info struct global_toolchain_versions = {} ignore_root_user_error = None @@ -73,10 +76,16 @@ def parse_modules(module_ctx): if not module_ctx.modules[0].tags.toolchain: ignore_root_user_error = False + config = _get_toolchain_config(modules = module_ctx.modules, _fail = _fail) + + seen_versions = {} for mod in module_ctx.modules: module_toolchain_versions = [] - - toolchain_attr_structs = _create_toolchain_attr_structs(mod) + toolchain_attr_structs = _create_toolchain_attr_structs( + mod = mod, + seen_versions = seen_versions, + config = config, + ) for toolchain_attr in toolchain_attr_structs: toolchain_version = toolchain_attr.python_version @@ -149,6 +158,7 @@ def parse_modules(module_ctx): if debug_info: debug_info["toolchains_registered"].append({ "ignore_root_user_error": ignore_root_user_error, + "module": {"is_root": mod.is_root, "name": mod.name}, "name": toolchain_name, }) @@ -166,6 +176,8 @@ def parse_modules(module_ctx): elif toolchain_info: toolchains.append(toolchain_info) + config.default.setdefault("ignore_root_user_error", ignore_root_user_error) + # A default toolchain is required so that the non-version-specific rules # are able to match a toolchain. if default_toolchain == None: @@ -185,11 +197,9 @@ def parse_modules(module_ctx): fail("more than {} python versions are not supported".format(_MAX_NUM_TOOLCHAINS)) return struct( + config = config, debug_info = debug_info, default_python_version = toolchains[-1].python_version, - defaults = { - "ignore_root_user_error": ignore_root_user_error, - }, toolchains = [ struct( python_version = t.python_version, @@ -201,16 +211,24 @@ def parse_modules(module_ctx): ) def _python_impl(module_ctx): - py = parse_modules(module_ctx) + py = parse_modules(module_ctx = module_ctx) for toolchain_info in py.toolchains: - python_register_toolchains( - name = toolchain_info.name, - python_version = toolchain_info.python_version, - register_coverage_tool = toolchain_info.register_coverage_tool, - minor_mapping = MINOR_MAPPING, - **py.defaults + # Ensure that we pass the full version here. + full_python_version = full_version( + version = toolchain_info.python_version, + minor_mapping = py.config.minor_mapping, ) + kwargs = { + "python_version": full_python_version, + "register_coverage_tool": toolchain_info.register_coverage_tool, + } + + # Allow overrides per python version + 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(name = toolchain_info.name, **kwargs) # Create the pythons_hub repo for the interpreter meta data and the # the various toolchains. @@ -223,7 +241,7 @@ def _python_impl(module_ctx): for index, toolchain in enumerate(py.toolchains) ], toolchain_python_versions = [ - full_version(version = t.python_version, minor_mapping = MINOR_MAPPING) + full_version(version = t.python_version, minor_mapping = py.config.minor_mapping) for t in py.toolchains ], # The last toolchain is the default; it can't have version constraints @@ -264,6 +282,9 @@ def _fail_duplicate_module_toolchain_version(version, module): )) def _warn_duplicate_global_toolchain_version(version, first, second_toolchain_name, second_module_name, logger): + if not logger: + return + logger.info(lambda: ( "Ignoring toolchain '{second_toolchain}' from module '{second_module}': " + "Toolchain '{first_toolchain}' from module '{first_module}' " + @@ -284,25 +305,234 @@ def _fail_multiple_default_toolchains(first, second): second = second, )) -def _create_toolchain_attr_structs(mod): +def _validate_version(*, version, _fail = fail): + parsed = semver(version) + if parsed.patch == None or parsed.build or parsed.pre_release: + _fail("The 'python_version' attribute needs to specify an 'X.Y.Z' semver-compatible version, got: '{}'".format(version)) + return False + + return True + +def _process_single_version_overrides(*, tag, _fail = fail, default): + if not _validate_version(version = tag.python_version, _fail = _fail): + return + + available_versions = default["tool_versions"] + kwargs = default.setdefault("kwargs", {}) + + if tag.sha256 or tag.urls: + if not (tag.sha256 and tag.urls): + _fail("Both `sha256` and `urls` overrides need to be provided together") + return + + for platform in (tag.sha256 or []): + if platform not in PLATFORMS: + _fail("The platform must be one of {allowed} but got '{got}'".format( + allowed = sorted(PLATFORMS), + got = platform, + )) + return + + sha256 = dict(tag.sha256) or available_versions[tag.python_version]["sha256"] + override = { + "sha256": sha256, + "strip_prefix": { + platform: tag.strip_prefix + for platform in sha256 + }, + "url": { + platform: list(tag.urls) + for platform in tag.sha256 + } or available_versions[tag.python_version]["url"], + } + + if tag.patches: + override["patch_strip"] = { + platform: tag.patch_strip + for platform in sha256 + } + override["patches"] = { + platform: list(tag.patches) + for platform in sha256 + } + + available_versions[tag.python_version] = {k: v for k, v in override.items() if v} + + if tag.distutils_content: + kwargs.setdefault(tag.python_version, {})["distutils_content"] = tag.distutils_content + if tag.distutils: + kwargs.setdefault(tag.python_version, {})["distutils"] = tag.distutils + +def _process_single_version_platform_overrides(*, tag, _fail = fail, default): + if not _validate_version(version = tag.python_version, _fail = _fail): + return + + available_versions = default["tool_versions"] + + if tag.python_version not in available_versions: + if not tag.urls or not tag.sha256 or not tag.strip_prefix: + _fail("When introducing a new python_version '{}', 'sha256', 'strip_prefix' and 'urls' must be specified".format(tag.python_version)) + return + available_versions[tag.python_version] = {} + + if tag.coverage_tool: + available_versions[tag.python_version].setdefault("coverage_tool", {})[tag.platform] = tag.coverage_tool + if tag.patch_strip: + available_versions[tag.python_version].setdefault("patch_strip", {})[tag.platform] = tag.patch_strip + if tag.patches: + available_versions[tag.python_version].setdefault("patches", {})[tag.platform] = list(tag.patches) + if tag.sha256: + available_versions[tag.python_version].setdefault("sha256", {})[tag.platform] = tag.sha256 + if tag.strip_prefix: + available_versions[tag.python_version].setdefault("strip_prefix", {})[tag.platform] = tag.strip_prefix + if tag.urls: + available_versions[tag.python_version].setdefault("url", {})[tag.platform] = tag.urls + +def _process_global_overrides(*, tag, default, _fail = fail): + if tag.available_python_versions: + available_versions = default["tool_versions"] + all_versions = dict(available_versions) + available_versions.clear() + for v in tag.available_python_versions: + if v not in all_versions: + _fail("unknown version '{}', known versions are: {}".format( + v, + sorted(all_versions), + )) + return + + available_versions[v] = all_versions[v] + + if tag.minor_mapping: + for minor_version, full_version in tag.minor_mapping.items(): + parsed = semver(minor_version) + if parsed.patch != None or parsed.build or parsed.pre_release: + fail("Expected the key to be of `X.Y` format but got `{}`".format(minor_version)) + parsed = semver(full_version) + if parsed.patch == None: + fail("Expected the value to at least be of `X.Y.Z` format but got `{}`".format(minor_version)) + + default["minor_mapping"] = tag.minor_mapping + + forwarded_attrs = sorted(AUTH_ATTRS) + [ + "ignore_root_user_error", + "base_url", + "register_all_versions", + ] + for key in forwarded_attrs: + if getattr(tag, key, None): + default[key] = getattr(tag, key) + +def _override_defaults(*overrides, modules, _fail = fail, default): + mod = modules[0] if modules else None + if not mod or not mod.is_root: + return + + overriden_keys = [] + + for override in overrides: + for tag in getattr(mod.tags, override.name): + key = override.key(tag) + if key not in overriden_keys: + overriden_keys.append(key) + elif key: + _fail("Only a single 'python.{}' can be present for '{}'".format(override.name, key)) + return + else: + _fail("Only a single 'python.{}' can be present".format(override.name)) + return + + override.fn(tag = tag, _fail = _fail, default = default) + +def _get_toolchain_config(*, modules, _fail = fail): + # Items that can be overridden + available_versions = { + version: { + # Use a dicts straight away so that we could do URL overrides for a + # single version. + "sha256": dict(item["sha256"]), + "strip_prefix": { + platform: item["strip_prefix"] + for platform in item["sha256"] + }, + "url": { + platform: [item["url"]] + for platform in item["sha256"] + }, + } + for version, item in TOOL_VERSIONS.items() + } + default = { + "base_url": DEFAULT_RELEASE_BASE_URL, + "tool_versions": available_versions, + } + + _override_defaults( + # First override by single version, because the sha256 will replace + # anything that has been there before. + struct( + name = "single_version_override", + key = lambda t: t.python_version, + fn = _process_single_version_overrides, + ), + # Then override particular platform entries if they need to be overridden. + struct( + name = "single_version_platform_override", + key = lambda t: (t.python_version, t.platform), + fn = _process_single_version_platform_overrides, + ), + # Then finally add global args and remove the unnecessary toolchains. + # This ensures that we can do further validations when removing. + struct( + name = "override", + key = lambda t: None, + fn = _process_global_overrides, + ), + modules = modules, + default = default, + _fail = _fail, + ) + + minor_mapping = default.pop("minor_mapping", {}) + register_all_versions = default.pop("register_all_versions", False) + kwargs = default.pop("kwargs", {}) + + if not minor_mapping: + versions = {} + for version_string in available_versions: + v = semver(version_string) + versions.setdefault("{}.{}".format(v.major, v.minor), []).append((int(v.patch), version_string)) + + minor_mapping = { + major_minor: max(subset)[1] + for major_minor, subset in versions.items() + } + + return struct( + kwargs = kwargs, + minor_mapping = minor_mapping, + default = default, + register_all_versions = register_all_versions, + ) + +def _create_toolchain_attr_structs(*, mod, config, seen_versions): arg_structs = [] - seen_versions = {} + for tag in mod.tags.toolchain: - arg_structs.append(_create_toolchain_attrs_struct(tag = tag, toolchain_tag_count = len(mod.tags.toolchain))) + arg_structs.append(_create_toolchain_attrs_struct( + tag = tag, + toolchain_tag_count = len(mod.tags.toolchain), + )) + seen_versions[tag.python_version] = True - if mod.is_root: - register_all = False - for tag in mod.tags.rules_python_private_testing: - if tag.register_all_versions: - register_all = True - break - if register_all: - arg_structs.extend([ - _create_toolchain_attrs_struct(python_version = v) - for v in TOOL_VERSIONS.keys() - if v not in seen_versions - ]) + if config.register_all_versions: + arg_structs.extend([ + _create_toolchain_attrs_struct(python_version = v) + for v in config.default["tool_versions"].keys() + config.minor_mapping.keys() + if v not in seen_versions + ]) + return arg_structs def _create_toolchain_attrs_struct(*, tag = None, python_version = None, toolchain_tag_count = None): @@ -329,78 +559,295 @@ def _get_bazel_version_specific_kwargs(): return kwargs -python = module_extension( - doc = """Bzlmod extension that is used to register Python toolchains. -""", - implementation = _python_impl, - tag_classes = { - "rules_python_private_testing": tag_class( - attrs = { - "register_all_versions": attr.bool(default = False), - }, - ), - "toolchain": tag_class( - doc = """Tag class used to register Python toolchains. +_toolchain = tag_class( + doc = """Tag class used to register Python toolchains. Use this tag class to register one or more Python toolchains. This class is also potentially called by sub modules. The following covers different business rules and use cases. -Toolchains in the Root Module +:::{topic} Toolchains in the Root Module This class registers all toolchains in the root module. +::: -Toolchains in Sub Modules +:::{topic} Toolchains in Sub Modules It will create a toolchain that is in a sub module, if the toolchain of the same name does not exist in the root module. The extension stops name clashing between toolchains in the root module and toolchains in sub modules. You cannot configure more than one toolchain as the default toolchain. +::: -Toolchain set as the default version +:::{topic} Toolchain set as the default version This extension will not create a toolchain that exists in a sub module, if the sub module toolchain is marked as the default version. If you have more than one toolchain in your root module, you need to set one of the toolchains as the default version. If there is only one toolchain it is set as the default toolchain. +::: -Toolchain repository name +:::{topic} Toolchain repository name A toolchain's repository name uses the format `python_{major}_{minor}`, e.g. `python_3_10`. The `major` and `minor` components are `major` and `minor` are the Python version from the `python_version` attribute. + +If a toolchain is registered in `X.Y.Z`, then similarly the toolchain name will +be `python_{major}_{minor}_{patch}`, e.g. `python_3_10_19`. +::: + +:::{topic} Toolchain detection +The definition of the first toolchain wins, which means that the root module +can override settings for any python toolchain available. This relies on the +documented module traversal from the {obj}`module_ctx.modules`. +::: + +:::{tip} +In order to use a different name than the above, you can use the following `MODULE.bazel` +syntax: +```starlark +python = use_extension("@rules_python//python/extensions:python.bzl", "python") +python.toolchain( + is_default = True, + python_version = "3.11", +) + +use_repo(python, my_python_name = "python_3_11") +``` + +Then the python interpreter will be available as `my_python_name`. +::: """, - attrs = { - "configure_coverage_tool": attr.bool( - mandatory = False, - doc = "Whether or not to configure the default coverage tool for the toolchains.", - ), - "ignore_root_user_error": attr.bool( - default = False, - doc = """\ -If False, the Python runtime installation will be made read only. This improves + attrs = { + "configure_coverage_tool": attr.bool( + mandatory = False, + doc = "Whether or not to configure the default coverage tool provided by `rules_python` for the compatible toolchains.", + ), + "ignore_root_user_error": attr.bool( + default = False, + doc = """\ +If `False`, the Python runtime installation will be made read only. This improves the ability for Bazel to cache it, but prevents the interpreter from creating -pyc files for the standard library dynamically at runtime as they are loaded. +`.pyc` files for the standard library dynamically at runtime as they are loaded. -If True, the Python runtime installation is read-write. This allows the -interpreter to create pyc files for the standard library, but, because they are +If `True`, the Python runtime installation is read-write. This allows the +interpreter to create `.pyc` files for the standard library, but, because they are created as needed, it adversely affects Bazel's ability to cache the runtime and can result in spurious build failures. """, - mandatory = False, - ), - "is_default": attr.bool( - mandatory = False, - doc = "Whether the toolchain is the default version", - ), - "python_version": attr.string( - mandatory = True, - doc = "The Python version, in `major.minor` format, e.g " + - "'3.12', to create a toolchain for. Patch level " + - "granularity (e.g. '3.12.1') is not supported.", - ), - }, + mandatory = False, + ), + "is_default": attr.bool( + mandatory = False, + doc = "Whether the toolchain is the default version", ), + "python_version": attr.string( + mandatory = True, + doc = """\ +The Python version, in `major.minor` or `major.minor.patch` format, e.g +`3.12` (or `3.12.3`), to create a toolchain for. +""", + ), + }, +) + +_override = tag_class( + doc = """Tag class used to override defaults and behaviour of the module extension. + +:::{versionadded} 0.36.0 +::: +""", + attrs = { + "available_python_versions": attr.string_list( + mandatory = False, + doc = """\ +The list of available python tool versions to use. Must be in `X.Y.Z` format. +If the unknown version given the processing of the extension will fail - all of +the versions in the list have to be defined with +{obj}`python.single_version_override` or +{obj}`python.single_version_platform_override` before they are used in this +list. + +This attribute is usually used in order to ensure that no unexpected transitive +dependencies are introduced. +""", + ), + "base_url": attr.string( + mandatory = False, + doc = "The base URL to be used when downloading toolchains.", + default = DEFAULT_RELEASE_BASE_URL, + ), + "ignore_root_user_error": attr.bool( + default = False, + doc = """\ +If `False`, the Python runtime installation will be made read only. This improves +the ability for Bazel to cache it, but prevents the interpreter from creating +`.pyc` files for the standard library dynamically at runtime as they are loaded. + +If `True`, the Python runtime installation is read-write. This allows the +interpreter to create `.pyc` files for the standard library, but, because they are +created as needed, it adversely affects Bazel's ability to cache the runtime and +can result in spurious build failures. +""", + mandatory = False, + ), + "minor_mapping": attr.string_dict( + mandatory = False, + doc = """\ +The mapping between `X.Y` to `X.Y.Z` versions to be used when setting up +toolchains. It defaults to the interpreter with the highest available patch +version for each minor version. For example if one registers `3.10.3`, `3.10.4` +and `3.11.4` then the default for the `minor_mapping` dict will be: +```starlark +{ +"3.10": "3.10.4", +"3.11": "3.11.4", +} +``` +""", + default = {}, + ), + "register_all_versions": attr.bool(default = False, doc = "Add all versions"), + } | AUTH_ATTRS, +) + +_single_version_override = tag_class( + doc = """Override single python version URLs and patches for all platforms. + +:::{note} +This will replace any existing configuration for the given python version. +::: + +:::{tip} +If you would like to modify the configuration for a specific `(version, +platform)`, please use the {obj}`single_version_platform_override` tag +class. +::: + +:::{versionadded} 0.36.0 +::: +""", + attrs = { + # NOTE @aignas 2024-09-01: all of the attributes except for `version` + # can be part of the `python.toolchain` call. That would make it more + # ergonomic to define new toolchains and to override values for old + # toolchains. The same semantics of the `first one wins` would apply, + # so technically there is no need for any overrides? + # + # Although these attributes would override the code that is used by the + # code in non-root modules, so technically this could be thought as + # being overridden. + # + # rules_go has a single download call: + # https://github.com/bazelbuild/rules_go/blob/master/go/private/extensions.bzl#L38 + # + # However, we need to understand how to accommodate the fact that + # {attr}`single_version_override.version` only allows patch versions. + "distutils": attr.label( + allow_single_file = True, + doc = "A distutils.cfg file to be included in the Python installation. " + + "Either {attr}`distutils` or {attr}`distutils_content` can be specified, but not both.", + mandatory = False, + ), + "distutils_content": attr.string( + doc = "A distutils.cfg file content to be included in the Python installation. " + + "Either {attr}`distutils` or {attr}`distutils_content` can be specified, but not both.", + mandatory = False, + ), + "patch_strip": attr.int( + mandatory = False, + doc = "Same as the --strip argument of Unix patch.", + default = 0, + ), + "patches": attr.label_list( + mandatory = False, + doc = "A list of labels pointing to patch files to apply for the interpreter repository. They are applied in the list order and are applied before any platform-specific patches are applied.", + ), + "python_version": attr.string( + mandatory = True, + doc = "The python version to override URLs for. Must be in `X.Y.Z` format.", + ), + "sha256": attr.string_dict( + mandatory = False, + doc = "The python platform to sha256 dict. See {attr}`python.single_version_platform_override.platform` for allowed key values.", + ), + "strip_prefix": attr.string( + mandatory = False, + doc = "The 'strip_prefix' for the archive, defaults to 'python'.", + default = "python", + ), + "urls": attr.string_list( + mandatory = False, + doc = "The URL template to fetch releases for this Python version. See {attr}`python.single_version_platform_override.urls` for documentation.", + ), + }, +) + +_single_version_platform_override = tag_class( + doc = """Override single python version for a single existing platform. + +If the `(version, platform)` is new, we will add it to the existing versions and will +use the same `url` template. + +:::{tip} +If you would like to add or remove platforms to a single python version toolchain +configuration, please use {obj}`single_version_override`. +::: + +:::{versionadded} 0.36.0 +::: +""", + attrs = { + "coverage_tool": attr.label( + doc = """\ +The coverage tool to be used for a particular Python interpreter. This can override +`rules_python` defaults. +""", + ), + "patch_strip": attr.int( + mandatory = False, + doc = "Same as the --strip argument of Unix patch.", + default = 0, + ), + "patches": attr.label_list( + mandatory = False, + doc = "A list of labels pointing to patch files to apply for the interpreter repository. They are applied in the list order and are applied after the common patches are applied.", + ), + "platform": attr.string( + mandatory = True, + values = PLATFORMS.keys(), + doc = "The platform to override the values for, must be one of:\n{}.".format("\n".join(sorted(["* `{}`".format(p) for p in PLATFORMS]))), + ), + "python_version": attr.string( + mandatory = True, + doc = "The python version to override URLs for. Must be in `X.Y.Z` format.", + ), + "sha256": attr.string( + mandatory = False, + doc = "The sha256 for the archive", + ), + "strip_prefix": attr.string( + mandatory = False, + doc = "The 'strip_prefix' for the archive, defaults to 'python'.", + default = "python", + ), + "urls": attr.string_list( + mandatory = False, + doc = "The URL template to fetch releases for this Python version. If the URL template results in a relative fragment, default base URL is going to be used. Occurrences of `{python_version}`, `{platform}` and `{build}` will be interpolated based on the contents in the override and the known {attr}`platform` values.", + ), + }, +) + +python = module_extension( + doc = """Bzlmod extension that is used to register Python toolchains. +""", + implementation = _python_impl, + tag_classes = { + "override": _override, + "single_version_override": _single_version_override, + "single_version_platform_override": _single_version_platform_override, + "toolchain": _toolchain, }, **_get_bazel_version_specific_kwargs() ) diff --git a/python/private/python_register_toolchains.bzl b/python/private/python_register_toolchains.bzl index 7638d76313..d20e049610 100644 --- a/python/private/python_register_toolchains.bzl +++ b/python/private/python_register_toolchains.bzl @@ -46,6 +46,10 @@ def python_register_toolchains( **kwargs): """Convenience macro for users which does typical setup. + With `bzlmod` enabled, this function is not needed since `rules_python` is + handling everything. In order to override the default behaviour from the + root module one can see the docs for the {rule}`python` extension. + - Create a repository for each built-in platform like "python_3_8_linux_amd64" - this repository is lazily fetched when Python is needed for that platform. - Create a repository exposing toolchains for each platform like diff --git a/python/private/python_repository.bzl b/python/private/python_repository.bzl index 28a2c959dd..2710299b39 100644 --- a/python/private/python_repository.bzl +++ b/python/private/python_repository.bzl @@ -124,7 +124,6 @@ def _python_repository_impl(rctx): patches = rctx.attr.patches if patches: for patch in patches: - # Should take the strip as an attr, but this is fine for the moment rctx.patch(patch, strip = rctx.attr.patch_strip) # Write distutils.cfg to the Python installation. @@ -302,27 +301,14 @@ python_repository = repository_rule( doc = "Override mapping of hostnames to authorization patterns; mirrors the eponymous attribute from http_archive", ), "coverage_tool": attr.string( - # Mirrors the definition at - # https://github.com/bazelbuild/bazel/blob/master/src/main/starlark/builtins_bzl/common/python/py_runtime_rule.bzl doc = """ -This is a target to use for collecting code coverage information from `py_binary` -and `py_test` targets. - -If set, the target must either produce a single file or be an executable target. -The path to the single file, or the executable if the target is executable, -determines the entry point for the python coverage tool. The target and its -runfiles will be added to the runfiles when coverage is enabled. - -The entry point for the tool must be loadable by a Python interpreter (e.g. a -`.py` or `.pyc` file). It must accept the command line arguments -of coverage.py (https://coverage.readthedocs.io), at least including -the `run` and `lcov` subcommands. +This is a target to use for collecting code coverage information from {rule}`py_binary` +and {rule}`py_test` targets. The target is accepted as a string by the python_repository and evaluated within the context of the toolchain repository. -For more information see the official bazel docs -(https://bazel.build/reference/be/python#py_runtime.coverage_tool). +For more information see {attr}`py_runtime.coverage_tool`. """, ), "distutils": attr.label( diff --git a/python/private/semver.bzl b/python/private/semver.bzl index d77249ff9f..73d6b130ae 100644 --- a/python/private/semver.bzl +++ b/python/private/semver.bzl @@ -17,8 +17,8 @@ def _key(version): return ( version.major, - version.minor, - version.patch, + version.minor or 0, + version.patch or 0, # non pre-release versions are higher version.pre_release == "", # then we compare each element of the pre_release tag separately @@ -47,7 +47,7 @@ def semver(version): """Parse the semver version and return the values as a struct. Args: - version: {type}`str` the version string + version: {type}`str` the version string. Returns: A {type}`struct` with `major`, `minor`, `patch` and `build` attributes. @@ -62,9 +62,9 @@ def semver(version): # buildifier: disable=uninitialized self = struct( major = int(major), - minor = int(minor or "0"), + minor = int(minor) if minor.isdigit() else None, # NOTE: this is called `micro` in the Python interpreter versioning scheme - patch = int(patch or "0"), + patch = int(patch) if patch.isdigit() else None, pre_release = pre_release, build = build, # buildifier: disable=uninitialized diff --git a/python/private/toolchains_repo.bzl b/python/private/toolchains_repo.bzl index 528b86fc3b..4fae987c74 100644 --- a/python/private/toolchains_repo.bzl +++ b/python/private/toolchains_repo.bzl @@ -56,9 +56,6 @@ def python_toolchain_build_file_content( build_content: Text containing toolchain definitions """ - # We create a list of toolchain content from iterating over - # the enumeration of PLATFORMS. We enumerate PLATFORMS in - # order to get us an index to increment the increment. return "\n\n".join([ """\ py_toolchain_suite( diff --git a/tests/integration/ignore_root_user_error/bzlmod_test.py b/tests/integration/ignore_root_user_error/bzlmod_test.py index 98715b32ec..1283415987 100644 --- a/tests/integration/ignore_root_user_error/bzlmod_test.py +++ b/tests/integration/ignore_root_user_error/bzlmod_test.py @@ -28,8 +28,16 @@ def test_toolchains(self): debug_info = json.loads(debug_path.read_bytes()) expected = [ - {"ignore_root_user_error": True, "name": "python_3_11"}, - {"ignore_root_user_error": True, "name": "python_3_10"}, + { + "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) diff --git a/tests/python/python_tests.bzl b/tests/python/python_tests.bzl index acbd6676dc..101313da4f 100644 --- a/tests/python/python_tests.bzl +++ b/tests/python/python_tests.bzl @@ -15,13 +15,11 @@ "" load("@rules_testing//lib:test_suite.bzl", "test_suite") -load("//python/private:python.bzl", _parse_modules = "parse_modules") # buildifier: disable=bzl-visibility +load("//python:versions.bzl", "MINOR_MAPPING") +load("//python/private:python.bzl", "parse_modules") # buildifier: disable=bzl-visibility _tests = [] -def parse_modules(*, mctx, **kwargs): - return _parse_modules(module_ctx = mctx, **kwargs) - def _mock_mctx(*modules, environ = {}): return struct( os = struct(environ = environ), @@ -41,12 +39,14 @@ def _mock_mctx(*modules, environ = {}): ], ) -def _mod(*, name, toolchain = [], rules_python_private_testing = [], is_root = True): +def _mod(*, name, toolchain = [], override = [], single_version_override = [], single_version_platform_override = [], is_root = True): return struct( name = name, tags = struct( toolchain = toolchain, - rules_python_private_testing = rules_python_private_testing, + override = override, + single_version_override = single_version_override, + single_version_platform_override = single_version_platform_override, ), is_root = is_root, ) @@ -58,17 +58,88 @@ def _toolchain(python_version, *, is_default = False, **kwargs): **kwargs ) +def _override( + auth_patterns = {}, + available_python_versions = [], + base_url = "", + ignore_root_user_error = False, + minor_mapping = {}, + netrc = "", + register_all_versions = False): + return struct( + auth_patterns = auth_patterns, + available_python_versions = available_python_versions, + base_url = base_url, + ignore_root_user_error = ignore_root_user_error, + minor_mapping = minor_mapping, + netrc = netrc, + register_all_versions = register_all_versions, + ) + +def _single_version_override( + python_version = "", + sha256 = {}, + urls = [], + patch_strip = 0, + patches = [], + strip_prefix = "python", + distutils_content = "", + distutils = None): + if not python_version: + fail("missing mandatory args: python_version ({})".format(python_version)) + + return struct( + python_version = python_version, + sha256 = sha256, + urls = urls, + patch_strip = patch_strip, + patches = patches, + strip_prefix = strip_prefix, + distutils_content = distutils_content, + distutils = distutils, + ) + +def _single_version_platform_override( + coverage_tool = None, + patch_strip = 0, + patches = [], + platform = "", + python_version = "", + sha256 = "", + strip_prefix = "python", + urls = []): + if not platform or not python_version: + fail("missing mandatory args: platform ({}) and python_version ({})".format(platform, python_version)) + + return struct( + sha256 = sha256, + urls = urls, + strip_prefix = strip_prefix, + platform = platform, + coverage_tool = coverage_tool, + python_version = python_version, + patch_strip = patch_strip, + patches = patches, + ) + def _test_default(env): py = parse_modules( - mctx = _mock_mctx( + module_ctx = _mock_mctx( _mod(name = "rules_python", toolchain = [_toolchain("3.11")]), ), ) - env.expect.that_collection(py.defaults.keys()).contains_exactly([ + # The value there should be consistent in bzlmod with the automatically + # calculated value Please update the MINOR_MAPPING in //python:versions.bzl + # when this part starts failing. + env.expect.that_dict(py.config.minor_mapping).contains_exactly(MINOR_MAPPING) + env.expect.that_collection(py.config.kwargs).has_size(0) + env.expect.that_collection(py.config.default.keys()).contains_exactly([ + "base_url", "ignore_root_user_error", + "tool_versions", ]) - env.expect.that_bool(py.defaults["ignore_root_user_error"]).equals(False) + env.expect.that_bool(py.config.default["ignore_root_user_error"]).equals(False) env.expect.that_str(py.default_python_version).equals("3.11") want_toolchain = struct( @@ -82,14 +153,11 @@ _tests.append(_test_default) def _test_default_some_module(env): py = parse_modules( - mctx = _mock_mctx( + module_ctx = _mock_mctx( _mod(name = "rules_python", toolchain = [_toolchain("3.11")], is_root = False), ), ) - env.expect.that_collection(py.defaults.keys()).contains_exactly([ - "ignore_root_user_error", - ]) env.expect.that_str(py.default_python_version).equals("3.11") want_toolchain = struct( @@ -103,7 +171,7 @@ _tests.append(_test_default_some_module) def _test_default_with_patch_version(env): py = parse_modules( - mctx = _mock_mctx( + module_ctx = _mock_mctx( _mod(name = "rules_python", toolchain = [_toolchain("3.11.2")]), ), ) @@ -121,7 +189,7 @@ _tests.append(_test_default_with_patch_version) def _test_default_non_rules_python(env): py = parse_modules( - mctx = _mock_mctx( + module_ctx = _mock_mctx( # NOTE @aignas 2024-09-06: the first item in the module_ctx.modules # could be a non-root module, which is the case if the root module # does not make any calls to the extension. @@ -141,7 +209,7 @@ _tests.append(_test_default_non_rules_python) def _test_default_non_rules_python_ignore_root_user_error(env): py = parse_modules( - mctx = _mock_mctx( + module_ctx = _mock_mctx( _mod( name = "my_module", toolchain = [_toolchain("3.12", ignore_root_user_error = True)], @@ -150,7 +218,7 @@ def _test_default_non_rules_python_ignore_root_user_error(env): ), ) - env.expect.that_bool(py.defaults["ignore_root_user_error"]).equals(True) + env.expect.that_bool(py.config.default["ignore_root_user_error"]).equals(True) env.expect.that_str(py.default_python_version).equals("3.12") my_module_toolchain = struct( @@ -170,9 +238,41 @@ def _test_default_non_rules_python_ignore_root_user_error(env): _tests.append(_test_default_non_rules_python_ignore_root_user_error) +def _test_default_non_rules_python_ignore_root_user_error_override(env): + py = parse_modules( + module_ctx = _mock_mctx( + _mod( + name = "my_module", + toolchain = [_toolchain("3.12")], + override = [_override(ignore_root_user_error = True)], + ), + _mod(name = "rules_python", toolchain = [_toolchain("3.11")]), + ), + ) + + env.expect.that_bool(py.config.default["ignore_root_user_error"]).equals(True) + env.expect.that_str(py.default_python_version).equals("3.12") + + my_module_toolchain = struct( + name = "python_3_12", + python_version = "3.12", + register_coverage_tool = False, + ) + rules_python_toolchain = struct( + name = "python_3_11", + python_version = "3.11", + register_coverage_tool = False, + ) + env.expect.that_collection(py.toolchains).contains_exactly([ + rules_python_toolchain, + my_module_toolchain, + ]).in_order() + +_tests.append(_test_default_non_rules_python_ignore_root_user_error_override) + def _test_default_non_rules_python_ignore_root_user_error_non_root_module(env): py = parse_modules( - mctx = _mock_mctx( + module_ctx = _mock_mctx( _mod(name = "my_module", toolchain = [_toolchain("3.13")]), _mod(name = "some_module", toolchain = [_toolchain("3.12", ignore_root_user_error = True)]), _mod(name = "rules_python", toolchain = [_toolchain("3.11")]), @@ -180,7 +280,7 @@ def _test_default_non_rules_python_ignore_root_user_error_non_root_module(env): ) env.expect.that_str(py.default_python_version).equals("3.13") - env.expect.that_bool(py.defaults["ignore_root_user_error"]).equals(False) + env.expect.that_bool(py.config.default["ignore_root_user_error"]).equals(False) my_module_toolchain = struct( name = "python_3_13", @@ -207,7 +307,7 @@ _tests.append(_test_default_non_rules_python_ignore_root_user_error_non_root_mod def _test_first_occurance_of_the_toolchain_wins(env): py = parse_modules( - mctx = _mock_mctx( + module_ctx = _mock_mctx( _mod(name = "my_module", toolchain = [_toolchain("3.12")]), _mod(name = "some_module", toolchain = [_toolchain("3.12", configure_coverage_tool = True)]), _mod(name = "rules_python", toolchain = [_toolchain("3.11")]), @@ -235,15 +335,365 @@ def _test_first_occurance_of_the_toolchain_wins(env): rules_python_toolchain, my_module_toolchain, # default toolchain is last ]).in_order() + env.expect.that_dict(py.debug_info).contains_exactly({ "toolchains_registered": [ - {"ignore_root_user_error": False, "name": "python_3_12"}, - {"ignore_root_user_error": False, "name": "python_3_11"}, + {"ignore_root_user_error": False, "module": {"is_root": True, "name": "my_module"}, "name": "python_3_12"}, + {"ignore_root_user_error": False, "module": {"is_root": False, "name": "rules_python"}, "name": "python_3_11"}, ], }) _tests.append(_test_first_occurance_of_the_toolchain_wins) +def _test_auth_overrides(env): + py = parse_modules( + module_ctx = _mock_mctx( + _mod( + name = "my_module", + toolchain = [_toolchain("3.12")], + override = [ + _override( + netrc = "/my/netrc", + auth_patterns = {"foo": "bar"}, + ), + ], + ), + _mod(name = "rules_python", toolchain = [_toolchain("3.11")]), + ), + ) + + env.expect.that_dict(py.config.default).contains_at_least({ + "auth_patterns": {"foo": "bar"}, + "ignore_root_user_error": False, + "netrc": "/my/netrc", + }) + env.expect.that_str(py.default_python_version).equals("3.12") + + my_module_toolchain = struct( + name = "python_3_12", + python_version = "3.12", + register_coverage_tool = False, + ) + rules_python_toolchain = struct( + name = "python_3_11", + python_version = "3.11", + register_coverage_tool = False, + ) + env.expect.that_collection(py.toolchains).contains_exactly([ + rules_python_toolchain, + my_module_toolchain, + ]).in_order() + +_tests.append(_test_auth_overrides) + +def _test_add_new_version(env): + py = parse_modules( + module_ctx = _mock_mctx( + _mod( + name = "my_module", + toolchain = [_toolchain("3.13")], + single_version_override = [ + _single_version_override( + python_version = "3.13.0", + sha256 = { + "aarch64-unknown-linux-gnu": "deadbeef", + }, + urls = ["example.org"], + patch_strip = 0, + patches = [], + strip_prefix = "prefix", + distutils_content = "", + distutils = None, + ), + ], + single_version_platform_override = [ + _single_version_platform_override( + sha256 = "deadb00f", + urls = ["something.org", "else.org"], + strip_prefix = "python", + platform = "aarch64-unknown-linux-gnu", + coverage_tool = "specific_cov_tool", + python_version = "3.13.1", + patch_strip = 2, + patches = ["specific-patch.txt"], + ), + ], + override = [ + _override( + base_url = "", + available_python_versions = ["3.12.4", "3.13.0", "3.13.1"], + minor_mapping = { + "3.13": "3.13.0", + }, + ), + ], + ), + ), + ) + + env.expect.that_str(py.default_python_version).equals("3.13") + env.expect.that_collection(py.config.default["tool_versions"].keys()).contains_exactly([ + "3.12.4", + "3.13.0", + "3.13.1", + ]) + env.expect.that_dict(py.config.default["tool_versions"]["3.13.0"]).contains_exactly({ + "sha256": {"aarch64-unknown-linux-gnu": "deadbeef"}, + "strip_prefix": {"aarch64-unknown-linux-gnu": "prefix"}, + "url": {"aarch64-unknown-linux-gnu": ["example.org"]}, + }) + env.expect.that_dict(py.config.default["tool_versions"]["3.13.1"]).contains_exactly({ + "coverage_tool": {"aarch64-unknown-linux-gnu": "specific_cov_tool"}, + "patch_strip": {"aarch64-unknown-linux-gnu": 2}, + "patches": {"aarch64-unknown-linux-gnu": ["specific-patch.txt"]}, + "sha256": {"aarch64-unknown-linux-gnu": "deadb00f"}, + "strip_prefix": {"aarch64-unknown-linux-gnu": "python"}, + "url": {"aarch64-unknown-linux-gnu": ["something.org", "else.org"]}, + }) + env.expect.that_dict(py.config.minor_mapping).contains_exactly({ + "3.13": "3.13.0", + }) + env.expect.that_collection(py.toolchains).contains_exactly([ + struct( + name = "python_3_13", + python_version = "3.13", + register_coverage_tool = False, + ), + ]) + +_tests.append(_test_add_new_version) + +def _test_register_all_versions(env): + py = parse_modules( + module_ctx = _mock_mctx( + _mod( + name = "my_module", + toolchain = [_toolchain("3.13")], + single_version_override = [ + _single_version_override( + python_version = "3.13.0", + sha256 = { + "aarch64-unknown-linux-gnu": "deadbeef", + }, + urls = ["example.org"], + ), + ], + single_version_platform_override = [ + _single_version_platform_override( + sha256 = "deadb00f", + urls = ["something.org"], + platform = "aarch64-unknown-linux-gnu", + python_version = "3.13.1", + ), + ], + override = [ + _override( + base_url = "", + available_python_versions = ["3.12.4", "3.13.0", "3.13.1"], + register_all_versions = True, + ), + ], + ), + ), + ) + + env.expect.that_str(py.default_python_version).equals("3.13") + env.expect.that_collection(py.config.default["tool_versions"].keys()).contains_exactly([ + "3.12.4", + "3.13.0", + "3.13.1", + ]) + env.expect.that_dict(py.config.minor_mapping).contains_exactly({ + # The mapping is calculated automatically + "3.12": "3.12.4", + "3.13": "3.13.1", + }) + env.expect.that_collection(py.toolchains).contains_exactly([ + struct( + name = name, + python_version = version, + register_coverage_tool = False, + ) + for name, version in { + "python_3_12": "3.12", + "python_3_12_4": "3.12.4", + "python_3_13": "3.13", + "python_3_13_0": "3.13.0", + "python_3_13_1": "3.13.1", + }.items() + ]) + +_tests.append(_test_register_all_versions) + +def _test_add_patches(env): + py = parse_modules( + module_ctx = _mock_mctx( + _mod( + name = "my_module", + toolchain = [_toolchain("3.13")], + single_version_override = [ + _single_version_override( + python_version = "3.13.0", + sha256 = { + "aarch64-apple-darwin": "deadbeef", + "aarch64-unknown-linux-gnu": "deadbeef", + }, + urls = ["example.org"], + patch_strip = 1, + patches = ["common.txt"], + strip_prefix = "prefix", + distutils_content = "", + distutils = None, + ), + ], + single_version_platform_override = [ + _single_version_platform_override( + sha256 = "deadb00f", + urls = ["something.org", "else.org"], + strip_prefix = "python", + platform = "aarch64-unknown-linux-gnu", + coverage_tool = "specific_cov_tool", + python_version = "3.13.0", + patch_strip = 2, + patches = ["specific-patch.txt"], + ), + ], + override = [ + _override( + base_url = "", + available_python_versions = ["3.13.0"], + minor_mapping = { + "3.13": "3.13.0", + }, + ), + ], + ), + ), + ) + + env.expect.that_str(py.default_python_version).equals("3.13") + env.expect.that_dict(py.config.default["tool_versions"]).contains_exactly({ + "3.13.0": { + "coverage_tool": {"aarch64-unknown-linux-gnu": "specific_cov_tool"}, + "patch_strip": {"aarch64-apple-darwin": 1, "aarch64-unknown-linux-gnu": 2}, + "patches": { + "aarch64-apple-darwin": ["common.txt"], + "aarch64-unknown-linux-gnu": ["specific-patch.txt"], + }, + "sha256": {"aarch64-apple-darwin": "deadbeef", "aarch64-unknown-linux-gnu": "deadb00f"}, + "strip_prefix": {"aarch64-apple-darwin": "prefix", "aarch64-unknown-linux-gnu": "python"}, + "url": { + "aarch64-apple-darwin": ["example.org"], + "aarch64-unknown-linux-gnu": ["something.org", "else.org"], + }, + }, + }) + env.expect.that_dict(py.config.minor_mapping).contains_exactly({ + "3.13": "3.13.0", + }) + env.expect.that_collection(py.toolchains).contains_exactly([ + struct( + name = "python_3_13", + python_version = "3.13", + register_coverage_tool = False, + ), + ]) + +_tests.append(_test_add_patches) + +def _test_fail_two_overrides(env): + errors = [] + parse_modules( + module_ctx = _mock_mctx( + _mod( + name = "my_module", + toolchain = [_toolchain("3.13")], + override = [ + _override(base_url = "foo"), + _override(base_url = "bar"), + ], + ), + ), + _fail = errors.append, + ) + env.expect.that_collection(errors).contains_exactly([ + "Only a single 'python.override' can be present", + ]) + +_tests.append(_test_fail_two_overrides) + +def _test_single_version_override_errors(env): + for test in [ + struct( + overrides = [ + _single_version_override(python_version = "3.12.4", distutils_content = "foo"), + _single_version_override(python_version = "3.12.4", distutils_content = "foo"), + ], + want_error = "Only a single 'python.single_version_override' can be present for '3.12.4'", + ), + struct( + overrides = [ + _single_version_override(python_version = "3.12.4+3", distutils_content = "foo"), + ], + want_error = "The 'python_version' attribute needs to specify an 'X.Y.Z' semver-compatible version, got: '3.12.4+3'", + ), + ]: + errors = [] + parse_modules( + module_ctx = _mock_mctx( + _mod( + name = "my_module", + toolchain = [_toolchain("3.13")], + single_version_override = test.overrides, + ), + ), + _fail = errors.append, + ) + env.expect.that_collection(errors).contains_exactly([test.want_error]) + +_tests.append(_test_single_version_override_errors) + +def _test_single_version_platform_override_errors(env): + for test in [ + struct( + overrides = [ + _single_version_platform_override(python_version = "3.12.4", platform = "foo", coverage_tool = "foo"), + _single_version_platform_override(python_version = "3.12.4", platform = "foo", coverage_tool = "foo"), + ], + want_error = "Only a single 'python.single_version_platform_override' can be present for '(\"3.12.4\", \"foo\")'", + ), + struct( + overrides = [ + _single_version_platform_override(python_version = "3.12", platform = "foo"), + ], + want_error = "The 'python_version' attribute needs to specify an 'X.Y.Z' semver-compatible version, got: '3.12'", + ), + struct( + overrides = [ + _single_version_platform_override(python_version = "3.12.1+my_build", platform = "foo"), + ], + want_error = "The 'python_version' attribute needs to specify an 'X.Y.Z' semver-compatible version, got: '3.12.1+my_build'", + ), + ]: + errors = [] + parse_modules( + module_ctx = _mock_mctx( + _mod( + name = "my_module", + toolchain = [_toolchain("3.13")], + single_version_platform_override = test.overrides, + ), + ), + _fail = errors.append, + ) + env.expect.that_collection(errors).contains_exactly([test.want_error]) + +_tests.append(_test_single_version_platform_override_errors) + +# TODO @aignas 2024-09-03: add failure tests: +# * incorrect platform failure +# * missing python_version failure + def python_test_suite(name): """Create the test suite. diff --git a/tests/semver/semver_test.bzl b/tests/semver/semver_test.bzl index 6395639810..9d13402c92 100644 --- a/tests/semver/semver_test.bzl +++ b/tests/semver/semver_test.bzl @@ -22,8 +22,8 @@ _tests = [] def _test_semver_from_major(env): actual = semver("3") env.expect.that_int(actual.major).equals(3) - env.expect.that_int(actual.minor).equals(0) - env.expect.that_int(actual.patch).equals(0) + env.expect.that_int(actual.minor).equals(None) + env.expect.that_int(actual.patch).equals(None) env.expect.that_str(actual.build).equals("") _tests.append(_test_semver_from_major) @@ -32,7 +32,7 @@ def _test_semver_from_major_minor_version(env): actual = semver("4.9") env.expect.that_int(actual.major).equals(4) env.expect.that_int(actual.minor).equals(9) - env.expect.that_int(actual.patch).equals(0) + env.expect.that_int(actual.patch).equals(None) env.expect.that_str(actual.build).equals("") _tests.append(_test_semver_from_major_minor_version) From 387c2f67f5e923e3e56192e2aead27ad98db6f8c Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Tue, 24 Sep 2024 11:25:13 +0900 Subject: [PATCH 219/345] chore: prepare 0.36.0 release (#2245) Prep for 0.36.0 release (can be tagged after this PR is merged). --- CHANGELOG.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fd84923ee..8ea956574d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,22 @@ A brief description of the categories of changes: [x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/x.x.x +### Changed +* Nothing yet + +### Fixed +* Nothing yet + +### Added +* Nothing yet + +### Removed +* Nothing yet + +## [0.36.0] - 2024-09-24 + +[0.36.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.36.0 + ### Changed * (gazelle): Update error messages when unable to resolve a dependency to be more human-friendly. * (flags) The {obj}`--python_version` flag now also returns @@ -175,7 +191,6 @@ A brief description of the categories of changes: [pytest_bazel]: https://pypi.org/project/pytest-bazel [20240726]: https://github.com/indygreg/python-build-standalone/releases/tag/20240726 - ## [0.34.0] - 2024-07-04 [0.34.0]: https://github.com/bazelbuild/rules_python/releases/tag/0.34.0 From 2d34f6ceb3c69c9f43ea9b6de993bc9b59c06bd9 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 26 Sep 2024 04:00:51 -0700 Subject: [PATCH 220/345] refactor: move PyInfo into separate file (#2249) Both PyInfo and providers.bzl are fairly large, and some upcoming PRs will be adding more PyInfo-specific code. To keep them manageable, move PyInfo into its own file. --- python/BUILD.bazel | 2 +- python/private/BUILD.bazel | 9 ++ python/private/common/BUILD.bazel | 4 +- python/private/common/attributes.bzl | 2 +- python/private/common/common.bzl | 2 +- python/private/common/providers.bzl | 109 +--------------------- python/private/common/py_executable.bzl | 2 +- python/private/py_info.bzl | 115 ++++++++++++++++++++++++ python/private/util.bzl | 13 +++ python/py_info.bzl | 2 +- 10 files changed, 148 insertions(+), 112 deletions(-) create mode 100644 python/private/py_info.bzl diff --git a/python/BUILD.bazel b/python/BUILD.bazel index b7a2172df5..53fb812af6 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -167,8 +167,8 @@ bzl_library( name = "py_info_bzl", srcs = ["py_info.bzl"], deps = [ + "//python/private:py_info_bzl", "//python/private:reexports_bzl", - "//python/private/common:providers_bzl", "@rules_python_internal//:rules_python_config_bzl", ], ) diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index bfe3764296..8479f67b49 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -266,6 +266,15 @@ bzl_library( srcs = ["py_executable_info.bzl"], ) +bzl_library( + name = "py_info_bzl", + srcs = ["py_info.bzl"], + deps = [ + ":reexports_bzl", + ":util_bzl", + ], +) + bzl_library( name = "py_interpreter_program_bzl", srcs = ["py_interpreter_program.bzl"], diff --git a/python/private/common/BUILD.bazel b/python/private/common/BUILD.bazel index 805c00226d..6fef8e87af 100644 --- a/python/private/common/BUILD.bazel +++ b/python/private/common/BUILD.bazel @@ -29,11 +29,11 @@ bzl_library( srcs = ["attributes.bzl"], deps = [ ":common_bzl", - ":providers_bzl", ":py_internal_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", @@ -68,6 +68,7 @@ bzl_library( ":providers_bzl", ":py_internal_bzl", ":semantics_bzl", + "//python/private:py_info_bzl", "//python/private:reexports_bzl", "//python/private:rules_cc_srcs_bzl", ], @@ -133,6 +134,7 @@ bzl_library( ":py_internal_bzl", "//python/private:flags_bzl", "//python/private:py_executable_info_bzl", + "//python/private:py_info_bzl", "//python/private:rules_cc_srcs_bzl", "//python/private:toolchain_types_bzl", "@bazel_skylib//lib:dicts", diff --git a/python/private/common/attributes.bzl b/python/private/common/attributes.bzl index 90a53328a7..5e81f4698e 100644 --- a/python/private/common/attributes.bzl +++ b/python/private/common/attributes.bzl @@ -17,9 +17,9 @@ load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("@rules_cc//cc:defs.bzl", "CcInfo") load("//python/private:enum.bzl", "enum") load("//python/private:flags.bzl", "PrecompileFlag", "PrecompileSourceRetentionFlag") +load("//python/private:py_info.bzl", "PyInfo") load("//python/private:reexports.bzl", "BuiltinPyInfo") load(":common.bzl", "union_attrs") -load(":providers.bzl", "PyInfo") load(":py_internal.bzl", "py_internal") load( ":semantics.bzl", diff --git a/python/private/common/common.bzl b/python/private/common/common.bzl index 5559ccd195..bbda712d2d 100644 --- a/python/private/common/common.bzl +++ b/python/private/common/common.bzl @@ -13,9 +13,9 @@ # limitations under the License. """Various things common to Bazel and Google rule implementations.""" +load("//python/private:py_info.bzl", "PyInfo") load("//python/private:reexports.bzl", "BuiltinPyInfo") load(":cc_helper.bzl", "cc_helper") -load(":providers.bzl", "PyInfo") load(":py_internal.bzl", "py_internal") load( ":semantics.bzl", diff --git a/python/private/common/providers.bzl b/python/private/common/providers.bzl index eb8b910a2e..b704ce0298 100644 --- a/python/private/common/providers.bzl +++ b/python/private/common/providers.bzl @@ -14,7 +14,7 @@ """Providers for Python rules.""" load("@rules_cc//cc:defs.bzl", "CcInfo") -load("//python/private:util.bzl", "IS_BAZEL_6_OR_HIGHER") +load("//python/private:util.bzl", "define_bazel_6_provider") DEFAULT_STUB_SHEBANG = "#!/usr/bin/env python3" @@ -22,18 +22,6 @@ DEFAULT_BOOTSTRAP_TEMPLATE = Label("//python/private:bootstrap_template") _PYTHON_VERSION_VALUES = ["PY2", "PY3"] -# Helper to make the provider definitions not crash under Bazel 5.4: -# Bazel 5.4 doesn't support the `init` arg of `provider()`, so we have to -# not pass that when using Bazel 5.4. But, not passing the `init` arg -# changes the return value from a two-tuple to a single value, which then -# breaks Bazel 6+ code. -# This isn't actually used under Bazel 5.4, so just stub out the values -# to get past the loading phase. -def _define_provider(doc, fields, **kwargs): - if not IS_BAZEL_6_OR_HIGHER: - return provider("Stub, not used", fields = []), None - return provider(doc = doc, fields = fields, **kwargs) - def _optional_int(value): return int(value) if value != None else None @@ -133,9 +121,7 @@ def _PyRuntimeInfo_init( "zip_main_template": zip_main_template, } -# TODO(#15897): Rename this to PyRuntimeInfo when we're ready to replace the Java -# implemented provider with the Starlark one. -PyRuntimeInfo, _unused_raw_py_runtime_info_ctor = _define_provider( +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. @@ -314,102 +300,13 @@ The following substitutions are made during template expansion: }, ) -def _check_arg_type(name, required_type, value): - value_type = type(value) - if value_type != required_type: - fail("parameter '{}' got value of type '{}', want '{}'".format( - name, - value_type, - required_type, - )) - -def _PyInfo_init( - *, - transitive_sources, - uses_shared_libraries = False, - imports = depset(), - has_py2_only_sources = False, - has_py3_only_sources = False, - direct_pyc_files = depset(), - transitive_pyc_files = depset()): - _check_arg_type("transitive_sources", "depset", transitive_sources) - - # Verify it's postorder compatible, but retain is original ordering. - depset(transitive = [transitive_sources], order = "postorder") - - _check_arg_type("uses_shared_libraries", "bool", uses_shared_libraries) - _check_arg_type("imports", "depset", imports) - _check_arg_type("has_py2_only_sources", "bool", has_py2_only_sources) - _check_arg_type("has_py3_only_sources", "bool", has_py3_only_sources) - _check_arg_type("direct_pyc_files", "depset", direct_pyc_files) - _check_arg_type("transitive_pyc_files", "depset", transitive_pyc_files) - return { - "direct_pyc_files": direct_pyc_files, - "has_py2_only_sources": has_py2_only_sources, - "has_py3_only_sources": has_py2_only_sources, - "imports": imports, - "transitive_pyc_files": transitive_pyc_files, - "transitive_sources": transitive_sources, - "uses_shared_libraries": uses_shared_libraries, - } - -PyInfo, _unused_raw_py_info_ctor = _define_provider( - doc = "Encapsulates information provided by the Python rules.", - init = _PyInfo_init, - fields = { - "direct_pyc_files": """ -:type: depset[File] - -Precompiled Python files that are considered directly provided -by the target. -""", - "has_py2_only_sources": """ -:type: bool - -Whether any of this target's transitive sources requires a Python 2 runtime. -""", - "has_py3_only_sources": """ -:type: bool - -Whether any of this target's transitive sources requires a Python 3 runtime. -""", - "imports": """\ -:type: depset[str] - -A depset of import path strings to be added to the `PYTHONPATH` of executable -Python targets. These are accumulated from the transitive `deps`. -The order of the depset is not guaranteed and may be changed in the future. It -is recommended to use `default` order (the default). -""", - "transitive_pyc_files": """ -:type: depset[File] - -Direct and transitive precompiled Python files that are provided by the target. -""", - "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`. -""", - "uses_shared_libraries": """ -:type: bool - -Whether any of this target's transitive `deps` has a shared library file (such -as a `.so` file). - -This field is currently unused in Bazel and may go away in the future. -""", - }, -) - def _PyCcLinkParamsProvider_init(cc_info): return { "cc_info": CcInfo(linking_context = cc_info.linking_context), } # buildifier: disable=name-conventions -PyCcLinkParamsProvider, _unused_raw_py_cc_link_params_provider_ctor = _define_provider( +PyCcLinkParamsProvider, _unused_raw_py_cc_link_params_provider_ctor = define_bazel_6_provider( doc = ("Python-wrapper to forward {obj}`CcInfo.linking_context`. This is to " + "allow Python targets to propagate C++ linking information, but " + "without the Python target appearing to be a valid C++ rule dependency"), diff --git a/python/private/common/py_executable.bzl b/python/private/common/py_executable.bzl index 80418acfcc..37ca313e0b 100644 --- a/python/private/common/py_executable.bzl +++ b/python/private/common/py_executable.bzl @@ -19,6 +19,7 @@ load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("@rules_cc//cc:defs.bzl", "cc_common") load("//python/private:flags.bzl", "PrecompileAddToRunfilesFlag") load("//python/private:py_executable_info.bzl", "PyExecutableInfo") +load("//python/private:py_info.bzl", "PyInfo") load("//python/private:reexports.bzl", "BuiltinPyRuntimeInfo") load( "//python/private:toolchain_types.bzl", @@ -52,7 +53,6 @@ load( load( ":providers.bzl", "PyCcLinkParamsProvider", - "PyInfo", "PyRuntimeInfo", ) load(":py_internal.bzl", "py_internal") diff --git a/python/private/py_info.bzl b/python/private/py_info.bzl new file mode 100644 index 0000000000..7945775a25 --- /dev/null +++ b/python/private/py_info.bzl @@ -0,0 +1,115 @@ +# 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. +"""Implementation of PyInfo provider and PyInfo-specific utilities.""" + +load(":util.bzl", "define_bazel_6_provider") + +def _check_arg_type(name, required_type, value): + """Check that a value is of an expected type.""" + value_type = type(value) + if value_type != required_type: + fail("parameter '{}' got value of type '{}', want '{}'".format( + name, + value_type, + required_type, + )) + +def _PyInfo_init( + *, + transitive_sources, + uses_shared_libraries = False, + imports = depset(), + has_py2_only_sources = False, + has_py3_only_sources = False, + direct_pyc_files = depset(), + transitive_pyc_files = depset()): + _check_arg_type("transitive_sources", "depset", transitive_sources) + + # Verify it's postorder compatible, but retain is original ordering. + depset(transitive = [transitive_sources], order = "postorder") + + _check_arg_type("uses_shared_libraries", "bool", uses_shared_libraries) + _check_arg_type("imports", "depset", imports) + _check_arg_type("has_py2_only_sources", "bool", has_py2_only_sources) + _check_arg_type("has_py3_only_sources", "bool", has_py3_only_sources) + _check_arg_type("direct_pyc_files", "depset", direct_pyc_files) + _check_arg_type("transitive_pyc_files", "depset", transitive_pyc_files) + + return { + "direct_pyc_files": direct_pyc_files, + "has_py2_only_sources": has_py2_only_sources, + "has_py3_only_sources": has_py2_only_sources, + "imports": imports, + "transitive_pyc_files": transitive_pyc_files, + "transitive_sources": transitive_sources, + "uses_shared_libraries": uses_shared_libraries, + } + +PyInfo, _unused_raw_py_info_ctor = define_bazel_6_provider( + doc = "Encapsulates information provided by the Python rules.", + init = _PyInfo_init, + fields = { + "direct_pyc_files": """ +:type: depset[File] + +Precompiled Python files that are considered directly provided +by the target and **must be included**. + +These files usually come from, e.g., a library setting {attr}`precompile=enabled` +to forcibly enable precompiling for itself. Downstream binaries are expected +to always include these files, as the originating target expects them to exist. +""", + "has_py2_only_sources": """ +:type: bool + +Whether any of this target's transitive sources requires a Python 2 runtime. +""", + "has_py3_only_sources": """ +:type: bool + +Whether any of this target's transitive sources requires a Python 3 runtime. +""", + "imports": """\ +:type: depset[str] + +A depset of import path strings to be added to the `PYTHONPATH` of executable +Python targets. These are accumulated from the transitive `deps`. +The order of the depset is not guaranteed and may be changed in the future. It +is recommended to use `default` order (the default). +""", + "transitive_pyc_files": """ +:type: depset[File] + +The transitive set of precompiled files that must be included. + +These files usually come from, e.g., a library setting {attr}`precompile=enabled` +to forcibly enable precompiling for itself. Downstream binaries are expected +to always include these files, as the originating target expects them to exist. +""", + "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`. +""", + "uses_shared_libraries": """ +:type: bool + +Whether any of this target's transitive `deps` has a shared library file (such +as a `.so` file). + +This field is currently unused in Bazel and may go away in the future. +""", + }, +) diff --git a/python/private/util.bzl b/python/private/util.bzl index 16b8ff8f55..3c32adc607 100644 --- a/python/private/util.bzl +++ b/python/private/util.bzl @@ -84,6 +84,19 @@ def add_tag(attrs, tag): else: attrs["tags"] = [tag] +# Helper to make the provider definitions not crash under Bazel 5.4: +# Bazel 5.4 doesn't support the `init` arg of `provider()`, so we have to +# not pass that when using Bazel 5.4. But, not passing the `init` arg +# changes the return value from a two-tuple to a single value, which then +# breaks Bazel 6+ code. +# This isn't actually used under Bazel 5.4, so just stub out the values +# to get past the loading phase. +def define_bazel_6_provider(doc, fields, **kwargs): + """Define a provider, or a stub for pre-Bazel 7.""" + if not IS_BAZEL_6_OR_HIGHER: + return provider("Stub, not used", fields = []), None + return provider(doc = doc, fields = fields, **kwargs) + 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/py_info.bzl b/python/py_info.bzl index 0af35ac320..52a66a87c2 100644 --- a/python/py_info.bzl +++ b/python/py_info.bzl @@ -15,7 +15,7 @@ """Public entry point for PyInfo.""" load("@rules_python_internal//:rules_python_config.bzl", "config") +load("//python/private:py_info.bzl", _starlark_PyInfo = "PyInfo") load("//python/private:reexports.bzl", "BuiltinPyInfo") -load("//python/private/common:providers.bzl", _starlark_PyInfo = "PyInfo") PyInfo = _starlark_PyInfo if config.enable_pystar else BuiltinPyInfo From 8f762e257b9321a750b4efaa2cfa4d7cba68a48f Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Thu, 26 Sep 2024 14:58:22 -0700 Subject: [PATCH 221/345] Remove absolute path from libpython.dylib (#2256) Previously this set the install name of the binary, which is put into any binaries that link this, as an absolute path that is user specific. Instead this can be fetched relatively, and bazel will automatically handle adding the correct rpaths for this. --- python/private/python_repository.bzl | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/python/private/python_repository.bzl b/python/private/python_repository.bzl index 2710299b39..e44bdd151d 100644 --- a/python/private/python_repository.bzl +++ b/python/private/python_repository.bzl @@ -143,12 +143,11 @@ def _python_repository_impl(rctx): # dyld lookup errors. To fix, set the full path to the dylib as # it appears in the Bazel workspace as its LC_ID_DYLIB using # the `install_name_tool` bundled with macOS. - dylib = "lib/libpython{}.dylib".format(python_short_version) - full_dylib_path = rctx.path(dylib) + dylib = "libpython{}.dylib".format(python_short_version) repo_utils.execute_checked( rctx, op = "python_repository.FixUpDyldIdPath", - arguments = [repo_utils.which_checked(rctx, "install_name_tool"), "-id", full_dylib_path, dylib], + arguments = [repo_utils.which_checked(rctx, "install_name_tool"), "-id", "@rpath/{}".format(dylib), "lib/{}".format(dylib)], logger = logger, ) From 416bd4c183b0c3f62b745d4ba6b4226da1fceaa4 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 26 Sep 2024 15:21:50 -0700 Subject: [PATCH 222/345] chore: don't add migration tag if Starlark implementation is enabled (#2257) This avoids the tag being added when it doesn't need to be, which can look confusing to users without context about what it means. Work towards #1361 --- python/private/BUILD.bazel | 5 ++++- python/private/util.bzl | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 8479f67b49..1e8fe140d3 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -386,7 +386,10 @@ bzl_library( visibility = [ "//:__subpackages__", ], - deps = ["@bazel_skylib//lib:types"], + deps = [ + "@bazel_skylib//lib:types", + "@rules_python_internal//:rules_python_config_bzl", + ], ) bzl_library( diff --git a/python/private/util.bzl b/python/private/util.bzl index 3c32adc607..033920d3bf 100644 --- a/python/private/util.bzl +++ b/python/private/util.bzl @@ -15,6 +15,7 @@ """Functionality shared by multiple pieces of code.""" load("@bazel_skylib//lib:types.bzl", "types") +load("@rules_python_internal//:rules_python_config.bzl", "config") def copy_propagating_kwargs(from_kwargs, into_kwargs = None): """Copies args that must be compatible between two targets with a dependency relationship. @@ -60,7 +61,8 @@ def add_migration_tag(attrs): Returns: The same `attrs` object, but modified. """ - add_tag(attrs, _MIGRATION_TAG) + if not config.enable_pystar: + add_tag(attrs, _MIGRATION_TAG) return attrs def add_tag(attrs, tag): From 9a98e8c1f18fb8b1c41e1d409088da9c72cee352 Mon Sep 17 00:00:00 2001 From: Timotheus Bachinger Date: Fri, 27 Sep 2024 06:17:22 +0200 Subject: [PATCH 223/345] fix(whl_filegroup): Make RECORD from wheel available (#2238) Why this change is being made, briefly. * We need to also get the `RECORD` file from a wheel in order to package everything * It seems a bit weird to me that the `RECORD` file is *not part* of `whl_filegroup` even no pattern filtering was applied (or I am misunderstanding something) * Further: neither `hash` nor `filelen` have been used in the code, so why are only files considered with those attributes? --- CHANGELOG.md | 3 +- .../whl_filegroup/extract_wheel_files.py | 12 +++--- .../whl_filegroup/extract_wheel_files_test.py | 37 +++++-------------- 3 files changed, 16 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ea956574d..8982a5f716 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,7 +28,7 @@ A brief description of the categories of changes: * Nothing yet ### Fixed -* Nothing yet +* (whl_filegroup): Provide per default also the `RECORD` file ### Added * Nothing yet @@ -83,7 +83,6 @@ A brief description of the categories of changes: * (toolchain) The {bzl:obj}`gen_python_config_settings` has been fixed to include the flag_values from the platform definitions. - ### Added * (bzlmod): Toolchain overrides can now be done using the new {bzl:obj}`python.override`, {bzl:obj}`python.single_version_override` and diff --git a/python/private/whl_filegroup/extract_wheel_files.py b/python/private/whl_filegroup/extract_wheel_files.py index e81e6a32ff..01d0bc6c9e 100644 --- a/python/private/whl_filegroup/extract_wheel_files.py +++ b/python/private/whl_filegroup/extract_wheel_files.py @@ -6,7 +6,7 @@ from collections.abc import Iterable from pathlib import Path -WhlRecord = dict[str, tuple[str, int]] +WhlRecord = Iterable[str] def get_record(whl_path: Path) -> WhlRecord: @@ -20,18 +20,16 @@ def get_record(whl_path: Path) -> WhlRecord: except ValueError: raise RuntimeError(f"{whl_path} doesn't contain exactly one .dist-info/RECORD") record_lines = zipf.read(record_file).decode().splitlines() - return { - file: (filehash, int(filelen)) + return ( + line.split(",")[0] for line in record_lines - for file, filehash, filelen in [line.split(",")] - if filehash # Skip RECORD itself, which has no hash or length - } + ) def get_files(whl_record: WhlRecord, regex_pattern: str) -> list[str]: """Get files in a wheel that match a regex pattern.""" p = re.compile(regex_pattern) - return [filepath for filepath in whl_record.keys() if re.match(p, filepath)] + return [filepath for filepath in whl_record if re.match(p, filepath)] def extract_files(whl_path: Path, files: Iterable[str], outdir: Path) -> None: diff --git a/tests/whl_filegroup/extract_wheel_files_test.py b/tests/whl_filegroup/extract_wheel_files_test.py index 2ea175b79a..387e56cde3 100644 --- a/tests/whl_filegroup/extract_wheel_files_test.py +++ b/tests/whl_filegroup/extract_wheel_files_test.py @@ -10,34 +10,17 @@ class WheelRecordTest(unittest.TestCase): def test_get_wheel_record(self) -> None: record = extract_wheel_files.get_record(_WHEEL) - expected = { - "examples/wheel/lib/data.txt": ( - "sha256=9vJKEdfLu8bZRArKLroPZJh1XKkK3qFMXiM79MBL2Sg", - 12, - ), - "examples/wheel/lib/module_with_data.py": ( - "sha256=8s0Khhcqz3yVsBKv2IB5u4l4TMKh7-c_V6p65WVHPms", - 637, - ), - "examples/wheel/lib/simple_module.py": ( - "sha256=z2hwciab_XPNIBNH8B1Q5fYgnJvQTeYf0ZQJpY8yLLY", - 637, - ), - "examples/wheel/main.py": ( - "sha256=sgg5iWN_9inYBjm6_Zw27hYdmo-l24fA-2rfphT-IlY", - 909, - ), - "example_minimal_package-0.0.1.dist-info/WHEEL": ( - "sha256=sobxWSyDDkdg_rinUth-jxhXHqoNqlmNMJY3aTZn2Us", - 91, - ), - "example_minimal_package-0.0.1.dist-info/METADATA": ( - "sha256=cfiQ2hFJhCKCUgbwtAwWG0fhW6NTzw4cr1uKOBcV_IM", - 76, - ), - } + expected = ( + "examples/wheel/lib/data.txt", + "examples/wheel/lib/module_with_data.py", + "examples/wheel/lib/simple_module.py", + "examples/wheel/main.py", + "example_minimal_package-0.0.1.dist-info/WHEEL", + "example_minimal_package-0.0.1.dist-info/METADATA", + "example_minimal_package-0.0.1.dist-info/RECORD", + ) self.maxDiff = None - self.assertDictEqual(record, expected) + self.assertEqual(list(record), list(expected)) def test_get_files(self) -> None: pattern = "(examples/wheel/lib/.*\.txt$|.*main)" From 18380a283d73060db856c2f3d105a0290143971a Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Fri, 27 Sep 2024 09:08:17 -0700 Subject: [PATCH 224/345] refactor: add builders to make creating PyInfo/depset/runfiles easier (#2251) This add some builders "classes" to make constructing PyInfo, depsets, and runfiles a bit cleaner. Previously, building such objects required creating multiple local variables for each arg/attribute of the object (e.g. list_of_files and list_of_depsets for building a depset). Keeping track of all the variables was verbose and tedious. To make it easier, encapsulate that bookkeeping in some objects. Accumulating parts is now much easier: builders have an `add()` method that looks at the input and stores it in the appropriate place. This builders will be exposed to users in an upcoming PR to make building and merging PyInfo objects easier. Work towards https://github.com/bazelbuild/rules_python/issues/1647 --- python/private/BUILD.bazel | 10 ++ python/private/builders.bzl | 190 ++++++++++++++++++++ python/private/common/common.bzl | 78 +++----- python/private/common/py_executable.bzl | 34 ++-- python/private/common/py_library.bzl | 18 +- python/private/py_info.bzl | 123 +++++++++++++ tests/base_rules/py_info/BUILD.bazel | 23 +++ tests/base_rules/py_info/py_info_tests.bzl | 198 +++++++++++++++++++++ tests/builders/BUILD.bazel | 17 ++ tests/builders/builders_tests.bzl | 116 ++++++++++++ 10 files changed, 728 insertions(+), 79 deletions(-) create mode 100644 python/private/builders.bzl create mode 100644 tests/base_rules/py_info/BUILD.bazel create mode 100644 tests/base_rules/py_info/py_info_tests.bzl create mode 100644 tests/builders/BUILD.bazel create mode 100644 tests/builders/builders_tests.bzl diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 1e8fe140d3..f128742b2c 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -69,6 +69,14 @@ bzl_library( ], ) +bzl_library( + name = "builders_bzl", + srcs = ["builders.bzl"], + deps = [ + "@bazel_skylib//lib:types", + ], +) + bzl_library( name = "bzlmod_enabled_bzl", srcs = ["bzlmod_enabled.bzl"], @@ -270,8 +278,10 @@ bzl_library( name = "py_info_bzl", srcs = ["py_info.bzl"], deps = [ + ":builders_bzl", ":reexports_bzl", ":util_bzl", + "@rules_python_internal//:rules_python_config_bzl", ], ) diff --git a/python/private/builders.bzl b/python/private/builders.bzl new file mode 100644 index 0000000000..50aa3ed91a --- /dev/null +++ b/python/private/builders.bzl @@ -0,0 +1,190 @@ +# 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. +"""Builders to make building complex objects easier.""" + +load("@bazel_skylib//lib:types.bzl", "types") + +def _DepsetBuilder(): + """Create a builder for a depset.""" + + # buildifier: disable=uninitialized + self = struct( + _order = [None], + add = lambda *a, **k: _DepsetBuilder_add(self, *a, **k), + build = lambda *a, **k: _DepsetBuilder_build(self, *a, **k), + direct = [], + get_order = lambda *a, **k: _DepsetBuilder_get_order(self, *a, **k), + set_order = lambda *a, **k: _DepsetBuilder_set_order(self, *a, **k), + transitive = [], + ) + return self + +def _DepsetBuilder_add(self, *values): + """Add value to the depset. + + Args: + self: {type}`DepsetBuilder` implicitly added. + *values: {type}`depset | list | object` Values to add to the depset. + The values can be a depset, the non-depset value to add, or + a list of such values to add. + + Returns: + {type}`DepsetBuilder` + """ + for value in values: + if types.is_list(value): + for sub_value in value: + if types.is_depset(sub_value): + self.transitive.append(sub_value) + else: + self.direct.append(sub_value) + elif types.is_depset(value): + self.transitive.append(value) + else: + self.direct.append(value) + return self + +def _DepsetBuilder_set_order(self, order): + """Sets the order to use. + + Args: + self: {type}`DepsetBuilder` implicitly added. + order: {type}`str` One of the {obj}`depset` `order` values. + + Returns: + {type}`DepsetBuilder` + """ + self._order[0] = order + return self + +def _DepsetBuilder_get_order(self): + """Gets the depset order that will be used. + + Args: + self: {type}`DepsetBuilder` implicitly added. + + Returns: + {type}`str | None` If not previously set, `None` is returned. + """ + return self._order[0] + +def _DepsetBuilder_build(self): + """Creates a {obj}`depset` from the accumulated values. + + Args: + self: {type}`DepsetBuilder` implicitly added. + + Returns: + {type}`depset` + """ + if not self.direct and len(self.transitive) == 1 and self._order[0] == None: + return self.transitive[0] + else: + kwargs = {} + if self._order[0] != None: + kwargs["order"] = self._order[0] + return depset(direct = self.direct, transitive = self.transitive, **kwargs) + +def _RunfilesBuilder(): + """Creates a `RunfilesBuilder`. + + Returns: + {type}`RunfilesBuilder` + """ + + # buildifier: disable=uninitialized + self = struct( + add = lambda *a, **k: _RunfilesBuilder_add(self, *a, **k), + add_targets = lambda *a, **k: _RunfilesBuilder_add_targets(self, *a, **k), + build = lambda *a, **k: _RunfilesBuilder_build(self, *a, **k), + files = _DepsetBuilder(), + root_symlinks = {}, + runfiles = [], + symlinks = {}, + ) + return self + +def _RunfilesBuilder_add(self, *values): + """Adds a value to the runfiles. + + Args: + self: {type}`RunfilesBuilder` implicitly added. + *values: {type}`File | runfiles | list[File] | depset[File] | list[runfiles]` + The values to add. + + Returns: + {type}`RunfilesBuilder` + """ + for value in values: + if types.is_list(value): + for sub_value in value: + _RunfilesBuilder_add_internal(self, sub_value) + else: + _RunfilesBuilder_add_internal(self, value) + return self + +def _RunfilesBuilder_add_targets(self, targets): + """Adds runfiles from targets + + Args: + self: {type}`RunfilesBuilder` implicitly added. + targets: {type}`list[Target]` targets whose default runfiles + to add. + + Returns: + {type}`RunfilesBuilder` + """ + for t in targets: + self.runfiles.append(t[DefaultInfo].default_runfiles) + return self + +def _RunfilesBuilder_add_internal(self, value): + if _is_file(value): + self.files.add(value) + elif types.is_depset(value): + self.files.add(value) + elif _is_runfiles(value): + self.runfiles.append(value) + else: + fail("Unhandled value: type {}: {}".format(type(value), value)) + +def _RunfilesBuilder_build(self, ctx, **kwargs): + """Creates a {obj}`runfiles` from the accumulated values. + + Args: + self: {type}`RunfilesBuilder` implicitly added. + ctx: {type}`ctx` The rule context to use to create the runfiles object. + **kwargs: additional args to pass along to {obj}`ctx.runfiles`. + + Returns: + {type}`runfiles` + """ + return ctx.runfiles( + transitive_files = self.files.build(), + symlinks = self.symlinks, + root_symlinks = self.root_symlinks, + **kwargs + ).merge_all(self.runfiles) + +# Skylib's types module doesn't have is_file, so roll our own +def _is_file(value): + return type(value) == "File" + +def _is_runfiles(value): + return type(value) == "runfiles" + +builders = struct( + DepsetBuilder = _DepsetBuilder, + RunfilesBuilder = _RunfilesBuilder, +) diff --git a/python/private/common/common.bzl b/python/private/common/common.bzl index bbda712d2d..e4cc254654 100644 --- a/python/private/common/common.bzl +++ b/python/private/common/common.bzl @@ -13,7 +13,7 @@ # limitations under the License. """Various things common to Bazel and Google rule implementations.""" -load("//python/private:py_info.bzl", "PyInfo") +load("//python/private:py_info.bzl", "PyInfo", "PyInfoBuilder") load("//python/private:reexports.bzl", "BuiltinPyInfo") load(":cc_helper.bzl", "cc_helper") load(":py_internal.bzl", "py_internal") @@ -282,7 +282,7 @@ def collect_imports(ctx, semantics): if BuiltinPyInfo in dep ]) -def collect_runfiles(ctx, files): +def collect_runfiles(ctx, files = depset()): """Collects the necessary files from the rule's context. This presumes the ctx is for a py_binary, py_test, or py_library rule. @@ -364,84 +364,50 @@ def create_py_info(ctx, *, direct_sources, direct_pyc_files, imports): transitive sources collected from dependencies (the latter is only necessary for deprecated extra actions support). """ - uses_shared_libraries = False - has_py2_only_sources = ctx.attr.srcs_version in ("PY2", "PY2ONLY") - has_py3_only_sources = ctx.attr.srcs_version in ("PY3", "PY3ONLY") - transitive_sources_depsets = [] # list of depsets - transitive_sources_files = [] # list of Files - transitive_pyc_depsets = [direct_pyc_files] # list of depsets + + py_info = PyInfoBuilder() + py_info.direct_pyc_files.add(direct_pyc_files) + py_info.transitive_pyc_files.add(direct_pyc_files) + py_info.imports.add(imports) + py_info.merge_has_py2_only_sources(ctx.attr.srcs_version in ("PY2", "PY2ONLY")) + py_info.merge_has_py3_only_sources(ctx.attr.srcs_version in ("PY3", "PY3ONLY")) + for target in ctx.attr.deps: # PyInfo may not be present e.g. cc_library rules. if PyInfo in target or BuiltinPyInfo in target: - info = _get_py_info(target) - transitive_sources_depsets.append(info.transitive_sources) - uses_shared_libraries = uses_shared_libraries or info.uses_shared_libraries - has_py2_only_sources = has_py2_only_sources or info.has_py2_only_sources - has_py3_only_sources = has_py3_only_sources or info.has_py3_only_sources - - # BuiltinPyInfo doesn't have this field. - if hasattr(info, "transitive_pyc_files"): - transitive_pyc_depsets.append(info.transitive_pyc_files) + py_info.merge(_get_py_info(target)) else: # TODO(b/228692666): Remove this once non-PyInfo targets are no # longer supported in `deps`. files = target.files.to_list() for f in files: if f.extension == "py": - transitive_sources_files.append(f) - uses_shared_libraries = ( - uses_shared_libraries or - cc_helper.is_valid_shared_library_artifact(f) - ) - deps_transitive_sources = depset( - direct = transitive_sources_files, - transitive = transitive_sources_depsets, - ) + py_info.transitive_sources.add(f) + py_info.merge_uses_shared_libraries(cc_helper.is_valid_shared_library_artifact(f)) + + deps_transitive_sources = py_info.transitive_sources.build() + py_info.transitive_sources.add(direct_sources) # We only look at data to calculate uses_shared_libraries, if it's already # true, then we don't need to waste time looping over it. - if not uses_shared_libraries: + if not py_info.get_uses_shared_libraries(): # Similar to the above, except we only calculate uses_shared_libraries for target in ctx.attr.data: # TODO(b/234730058): Remove checking for PyInfo in data once depot # cleaned up. if PyInfo in target or BuiltinPyInfo in target: info = _get_py_info(target) - uses_shared_libraries = info.uses_shared_libraries + py_info.merge_uses_shared_libraries(info.uses_shared_libraries) else: files = target.files.to_list() for f in files: - uses_shared_libraries = cc_helper.is_valid_shared_library_artifact(f) - if uses_shared_libraries: + py_info.merge_uses_shared_libraries(cc_helper.is_valid_shared_library_artifact(f)) + if py_info.get_uses_shared_libraries(): break - if uses_shared_libraries: + if py_info.get_uses_shared_libraries(): break - py_info_kwargs = dict( - transitive_sources = depset( - transitive = [deps_transitive_sources, direct_sources], - ), - imports = imports, - # NOTE: This isn't strictly correct, but with Python 2 gone, - # the srcs_version logic is largely defunct, so shouldn't matter in - # practice. - has_py2_only_sources = has_py2_only_sources, - has_py3_only_sources = has_py3_only_sources, - uses_shared_libraries = uses_shared_libraries, - direct_pyc_files = direct_pyc_files, - transitive_pyc_files = depset(transitive = transitive_pyc_depsets), - ) - - # TODO(b/203567235): Set `uses_shared_libraries` field, though the Bazel - # docs indicate it's unused in Bazel and may be removed. - py_info = PyInfo(**py_info_kwargs) - - # Remove args that BuiltinPyInfo doesn't support - py_info_kwargs.pop("direct_pyc_files") - py_info_kwargs.pop("transitive_pyc_files") - builtin_py_info = BuiltinPyInfo(**py_info_kwargs) - - return py_info, deps_transitive_sources, builtin_py_info + return py_info.build(), deps_transitive_sources, py_info.build_builtin_py_info() def _get_py_info(target): return target[PyInfo] if PyInfo in target else target[BuiltinPyInfo] diff --git a/python/private/common/py_executable.bzl b/python/private/common/py_executable.bzl index 37ca313e0b..1d14344d4e 100644 --- a/python/private/common/py_executable.bzl +++ b/python/private/common/py_executable.bzl @@ -17,6 +17,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("//python/private:builders.bzl", "builders") load("//python/private:flags.bzl", "PrecompileAddToRunfilesFlag") load("//python/private:py_executable_info.bzl", "PyExecutableInfo") load("//python/private:py_info.bzl", "PyInfo") @@ -170,9 +171,10 @@ def py_executable_base_impl(ctx, *, semantics, is_test, inherited_environment = direct_pyc_files = depset(precompile_result.pyc_files) executable = _declare_executable_file(ctx) - default_outputs = [executable] - default_outputs.extend(precompile_result.keep_srcs) - default_outputs.extend(precompile_result.pyc_files) + default_outputs = builders.DepsetBuilder() + default_outputs.add(executable) + default_outputs.add(precompile_result.keep_srcs) + default_outputs.add(precompile_result.pyc_files) imports = collect_imports(ctx, semantics) @@ -219,6 +221,7 @@ def py_executable_base_impl(ctx, *, semantics, is_test, inherited_environment = native_deps_details = native_deps_details, runfiles_details = runfiles_details, ) + default_outputs.add(exec_result.extra_files_to_build) extra_exec_runfiles = exec_result.extra_runfiles.merge( ctx.runfiles(transitive_files = exec_result.extra_files_to_build), @@ -240,7 +243,7 @@ def py_executable_base_impl(ctx, *, semantics, is_test, inherited_environment = imports = imports, direct_sources = direct_sources, direct_pyc_files = direct_pyc_files, - default_outputs = depset(default_outputs, transitive = [exec_result.extra_files_to_build]), + default_outputs = default_outputs.build(), runtime_details = runtime_details, cc_info = cc_details.cc_info_for_propagating, inherited_environment = inherited_environment, @@ -429,26 +432,25 @@ def _get_base_runfiles_for_binary( * build_data_file: A file with build stamp information if stamping is enabled, otherwise None. """ - common_runfiles_depsets = [main_py_files] + common_runfiles = builders.RunfilesBuilder() + common_runfiles.add(main_py_files) if ctx.attr._precompile_add_to_runfiles_flag[BuildSettingInfo].value == PrecompileAddToRunfilesFlag.ALWAYS: - common_runfiles_depsets.append(direct_pyc_files) + common_runfiles.add(direct_pyc_files) elif PycCollectionAttr.is_pyc_collection_enabled(ctx): - common_runfiles_depsets.append(direct_pyc_files) + common_runfiles.add(direct_pyc_files) for dep in (ctx.attr.deps + extra_deps): if PyInfo not in dep: continue - common_runfiles_depsets.append(dep[PyInfo].transitive_pyc_files) + common_runfiles.add(dep[PyInfo].transitive_pyc_files) - common_runfiles = collect_runfiles(ctx, depset( - transitive = common_runfiles_depsets, - )) + common_runfiles.add(collect_runfiles(ctx)) + common_runfiles.add(collect_runfiles(ctx)) if extra_deps: - common_runfiles = common_runfiles.merge_all([ - t[DefaultInfo].default_runfiles - for t in extra_deps - ]) - common_runfiles = common_runfiles.merge_all(extra_common_runfiles) + common_runfiles.add_runfiles(targets = extra_deps) + common_runfiles.add(extra_common_runfiles) + + common_runfiles = common_runfiles.build(ctx) if semantics.should_create_init_files(ctx): common_runfiles = _py_builtins.merge_runfiles_with_generated_inits_empty_files_supplier( diff --git a/python/private/common/py_library.bzl b/python/private/common/py_library.bzl index fd534908d0..4423986e1b 100644 --- a/python/private/common/py_library.bzl +++ b/python/private/common/py_library.bzl @@ -15,6 +15,7 @@ load("@bazel_skylib//lib:dicts.bzl", "dicts") load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") +load("//python/private:builders.bzl", "builders") load("//python/private:flags.bzl", "PrecompileAddToRunfilesFlag") load( "//python/private:toolchain_types.bzl", @@ -67,16 +68,19 @@ def py_library_impl(ctx, *, semantics): precompile_result = semantics.maybe_precompile(ctx, direct_sources) direct_pyc_files = depset(precompile_result.pyc_files) - default_outputs = depset(precompile_result.keep_srcs, transitive = [direct_pyc_files]) + default_outputs = builders.DepsetBuilder() + default_outputs.add(precompile_result.keep_srcs) + default_outputs.add(direct_pyc_files) + default_outputs = default_outputs.build() + + runfiles = builders.RunfilesBuilder() + runfiles.add(precompile_result.keep_srcs) - extra_runfiles_depsets = [depset(precompile_result.keep_srcs)] if ctx.attr._precompile_add_to_runfiles_flag[BuildSettingInfo].value == PrecompileAddToRunfilesFlag.ALWAYS: - extra_runfiles_depsets.append(direct_pyc_files) + runfiles.add(direct_pyc_files) - runfiles = collect_runfiles( - ctx = ctx, - files = depset(transitive = extra_runfiles_depsets), - ) + runfiles.add(collect_runfiles(ctx)) + runfiles = runfiles.build(ctx) cc_info = semantics.get_cc_info_for_library(ctx) py_info, deps_transitive_sources, builtins_py_info = create_py_info( diff --git a/python/private/py_info.bzl b/python/private/py_info.bzl index 7945775a25..a3e40f2924 100644 --- a/python/private/py_info.bzl +++ b/python/private/py_info.bzl @@ -13,6 +13,9 @@ # limitations under the License. """Implementation of PyInfo provider and PyInfo-specific utilities.""" +load("@rules_python_internal//:rules_python_config.bzl", "config") +load("//python/private:reexports.bzl", "BuiltinPyInfo") +load(":builders.bzl", "builders") load(":util.bzl", "define_bazel_6_provider") def _check_arg_type(name, required_type, value): @@ -113,3 +116,123 @@ This field is currently unused in Bazel and may go away in the future. """, }, ) + +# The "effective" PyInfo is what the canonical //python:py_info.bzl%PyInfo symbol refers to +_EffectivePyInfo = PyInfo if config.enable_pystar else BuiltinPyInfo + +def PyInfoBuilder(): + # buildifier: disable=uninitialized + self = struct( + _has_py2_only_sources = [False], + _has_py3_only_sources = [False], + _uses_shared_libraries = [False], + build = lambda *a, **k: _PyInfoBuilder_build(self, *a, **k), + build_builtin_py_info = lambda *a, **k: _PyInfoBuilder_build_builtin_py_info(self, *a, **k), + direct_pyc_files = builders.DepsetBuilder(), + get_has_py2_only_sources = lambda *a, **k: _PyInfoBuilder_get_has_py2_only_sources(self, *a, **k), + get_has_py3_only_sources = lambda *a, **k: _PyInfoBuilder_get_has_py3_only_sources(self, *a, **k), + get_uses_shared_libraries = lambda *a, **k: _PyInfoBuilder_get_uses_shared_libraries(self, *a, **k), + imports = builders.DepsetBuilder(), + merge = lambda *a, **k: _PyInfoBuilder_merge(self, *a, **k), + merge_all = lambda *a, **k: _PyInfoBuilder_merge_all(self, *a, **k), + merge_has_py2_only_sources = lambda *a, **k: _PyInfoBuilder_merge_has_py2_only_sources(self, *a, **k), + merge_has_py3_only_sources = lambda *a, **k: _PyInfoBuilder_merge_has_py3_only_sources(self, *a, **k), + merge_target = lambda *a, **k: _PyInfoBuilder_merge_target(self, *a, **k), + merge_targets = lambda *a, **k: _PyInfoBuilder_merge_targets(self, *a, **k), + merge_uses_shared_libraries = lambda *a, **k: _PyInfoBuilder_merge_uses_shared_libraries(self, *a, **k), + set_has_py2_only_sources = lambda *a, **k: _PyInfoBuilder_set_has_py2_only_sources(self, *a, **k), + set_has_py3_only_sources = lambda *a, **k: _PyInfoBuilder_set_has_py3_only_sources(self, *a, **k), + set_uses_shared_libraries = lambda *a, **k: _PyInfoBuilder_set_uses_shared_libraries(self, *a, **k), + transitive_pyc_files = builders.DepsetBuilder(), + transitive_sources = builders.DepsetBuilder(), + ) + return self + +def _PyInfoBuilder_get_has_py3_only_sources(self): + return self._has_py3_only_sources[0] + +def _PyInfoBuilder_get_has_py2_only_sources(self): + return self._has_py2_only_sources[0] + +def _PyInfoBuilder_set_has_py2_only_sources(self, value): + self._has_py2_only_sources[0] = value + return self + +def _PyInfoBuilder_set_has_py3_only_sources(self, value): + self._has_py3_only_sources[0] = value + return self + +def _PyInfoBuilder_merge_has_py2_only_sources(self, value): + self._has_py2_only_sources[0] = self._has_py2_only_sources[0] or value + return self + +def _PyInfoBuilder_merge_has_py3_only_sources(self, value): + self._has_py3_only_sources[0] = self._has_py3_only_sources[0] or value + return self + +def _PyInfoBuilder_merge_uses_shared_libraries(self, value): + self._uses_shared_libraries[0] = self._uses_shared_libraries[0] or value + return self + +def _PyInfoBuilder_get_uses_shared_libraries(self): + return self._uses_shared_libraries[0] + +def _PyInfoBuilder_set_uses_shared_libraries(self, value): + self._uses_shared_libraries[0] = value + return self + +def _PyInfoBuilder_merge(self, *infos): + return self.merge_all(infos) + +def _PyInfoBuilder_merge_all(self, py_infos): + for info in py_infos: + self.imports.add(info.imports) + self.merge_has_py2_only_sources(info.has_py2_only_sources) + self.merge_has_py3_only_sources(info.has_py3_only_sources) + self.merge_uses_shared_libraries(info.uses_shared_libraries) + self.transitive_sources.add(info.transitive_sources) + + # BuiltinPyInfo doesn't have these fields + if hasattr(info, "transitive_pyc_files"): + self.transitive_pyc_files.add(info.transitive_pyc_files) + + return self + +def _PyInfoBuilder_merge_target(self, target): + if PyInfo in target: + self.merge(target[PyInfo]) + elif BuiltinPyInfo in target: + self.merge(target[BuiltinPyInfo]) + return self + +def _PyInfoBuilder_merge_targets(self, targets): + for t in targets: + self.merge_target(t) + return self + +def _PyInfoBuilder_build(self): + if config.enable_pystar: + kwargs = dict( + direct_pyc_files = self.direct_pyc_files.build(), + transitive_pyc_files = self.transitive_pyc_files.build(), + ) + else: + kwargs = {} + + return _EffectivePyInfo( + has_py2_only_sources = self._has_py2_only_sources[0], + has_py3_only_sources = self._has_py3_only_sources[0], + imports = self.imports.build(), + transitive_sources = self.transitive_sources.build(), + uses_shared_libraries = self._uses_shared_libraries[0], + **kwargs + ) + +def _PyInfoBuilder_build_builtin_py_info(self): + return BuiltinPyInfo( + has_py2_only_sources = self._has_py2_only_sources[0], + has_py3_only_sources = self._has_py3_only_sources[0], + imports = self.imports.build(), + transitive_sources = self.transitive_sources.build(), + uses_shared_libraries = self._uses_shared_libraries[0], + ) diff --git a/tests/base_rules/py_info/BUILD.bazel b/tests/base_rules/py_info/BUILD.bazel new file mode 100644 index 0000000000..69f0bdae3f --- /dev/null +++ b/tests/base_rules/py_info/BUILD.bazel @@ -0,0 +1,23 @@ +# 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(":py_info_tests.bzl", "py_info_test_suite") + +filegroup( + name = "some_runfiles", + data = ["runfile1.txt"], + tags = ["manual"], +) + +py_info_test_suite(name = "py_info_tests") diff --git a/tests/base_rules/py_info/py_info_tests.bzl b/tests/base_rules/py_info/py_info_tests.bzl new file mode 100644 index 0000000000..b64263f6ba --- /dev/null +++ b/tests/base_rules/py_info/py_info_tests.bzl @@ -0,0 +1,198 @@ +# 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. +"""Tests for py_info.""" + +load("@rules_python_internal//:rules_python_config.bzl", "config") +load("@rules_testing//lib:analysis_test.bzl", "analysis_test") +load("@rules_testing//lib:test_suite.bzl", "test_suite") +load("@rules_testing//lib:util.bzl", rt_util = "util") +load("//python:py_info.bzl", "PyInfo") +load("//python/private:py_info.bzl", "PyInfoBuilder") # buildifier: disable=bzl-visibility +load("//python/private:reexports.bzl", "BuiltinPyInfo") # buildifier: disable=bzl-visibility +load("//tests/support:py_info_subject.bzl", "py_info_subject") + +def _provide_py_info_impl(ctx): + kwargs = { + "direct_pyc_files": depset(ctx.files.direct_pyc_files), + "imports": depset(ctx.attr.imports), + "transitive_pyc_files": depset(ctx.files.transitive_pyc_files), + "transitive_sources": depset(ctx.files.transitive_sources), + } + if ctx.attr.has_py2_only_sources != -1: + kwargs["has_py2_only_sources"] = bool(ctx.attr.has_py2_only_sources) + if ctx.attr.has_py3_only_sources != -1: + kwargs["has_py2_only_sources"] = bool(ctx.attr.has_py2_only_sources) + + providers = [] + if config.enable_pystar: + providers.append(PyInfo(**kwargs)) + + # Handle Bazel 6 or if Bazel autoloading is enabled + if not config.enable_pystar or PyInfo != BuiltinPyInfo: + providers.append(BuiltinPyInfo(**{ + k: kwargs[k] + for k in ( + "transitive_sources", + "has_py2_only_sources", + "has_py3_only_sources", + "uses_shared_libraries", + "imports", + ) + if k in kwargs + })) + return providers + +provide_py_info = rule( + implementation = _provide_py_info_impl, + attrs = { + "direct_pyc_files": attr.label_list(allow_files = True), + "has_py2_only_sources": attr.int(default = -1), + "has_py3_only_sources": attr.int(default = -1), + "imports": attr.string_list(), + "transitive_pyc_files": attr.label_list(allow_files = True), + "transitive_sources": attr.label_list(allow_files = True), + }, +) + +_tests = [] + +def _test_py_info_create(name): + rt_util.helper_target( + native.filegroup, + name = name + "_files", + srcs = ["trans.py", "direct.pyc", "trans.pyc"], + ) + analysis_test( + name = name, + target = name + "_files", + impl = _test_py_info_create_impl, + ) + +def _test_py_info_create_impl(env, target): + trans_py, direct_pyc, trans_pyc = target[DefaultInfo].files.to_list() + actual = PyInfo( + has_py2_only_sources = True, + has_py3_only_sources = True, + imports = depset(["import-path"]), + transitive_sources = depset([trans_py]), + uses_shared_libraries = True, + **(dict( + direct_pyc_files = depset([direct_pyc]), + transitive_pyc_files = depset([trans_pyc]), + ) if config.enable_pystar else {}) + ) + + subject = py_info_subject(actual, meta = env.expect.meta) + subject.uses_shared_libraries().equals(True) + subject.has_py2_only_sources().equals(True) + subject.has_py3_only_sources().equals(True) + subject.transitive_sources().contains_exactly(["tests/base_rules/py_info/trans.py"]) + subject.imports().contains_exactly(["import-path"]) + if config.enable_pystar: + subject.direct_pyc_files().contains_exactly(["tests/base_rules/py_info/direct.pyc"]) + subject.transitive_pyc_files().contains_exactly(["tests/base_rules/py_info/trans.pyc"]) + +_tests.append(_test_py_info_create) + +def _test_py_info_builder(name): + rt_util.helper_target( + native.filegroup, + name = name + "_misc", + srcs = ["trans.py", "direct.pyc", "trans.pyc"], + ) + rt_util.helper_target( + provide_py_info, + name = name + "_py1", + transitive_sources = ["py1-trans.py"], + direct_pyc_files = ["py1-direct-pyc.pyc"], + imports = ["py1import"], + transitive_pyc_files = ["py1-trans.pyc"], + ) + rt_util.helper_target( + provide_py_info, + name = name + "_py2", + transitive_sources = ["py2-trans.py"], + direct_pyc_files = ["py2-direct.pyc"], + imports = ["py2import"], + transitive_pyc_files = ["py2-trans.pyc"], + ) + analysis_test( + name = name, + impl = _test_py_info_builder_impl, + targets = { + "misc": name + "_misc", + "py1": name + "_py1", + "py2": name + "_py2", + }, + ) + +def _test_py_info_builder_impl(env, targets): + trans, direct_pyc, trans_pyc = targets.misc[DefaultInfo].files.to_list() + builder = PyInfoBuilder() + builder.direct_pyc_files.add(direct_pyc) + builder.merge_has_py2_only_sources(True) + builder.merge_has_py3_only_sources(True) + builder.imports.add("import-path") + builder.transitive_pyc_files.add(trans_pyc) + builder.transitive_sources.add(trans) + builder.merge_uses_shared_libraries(True) + + builder.merge_target(targets.py1) + builder.merge_targets([targets.py2]) + + def check(actual): + subject = py_info_subject(actual, meta = env.expect.meta) + + subject.uses_shared_libraries().equals(True) + subject.has_py2_only_sources().equals(True) + subject.has_py3_only_sources().equals(True) + + subject.transitive_sources().contains_exactly([ + "tests/base_rules/py_info/trans.py", + "tests/base_rules/py_info/py1-trans.py", + "tests/base_rules/py_info/py2-trans.py", + ]) + subject.imports().contains_exactly([ + "import-path", + "py1import", + "py2import", + ]) + if hasattr(actual, "direct_pyc_files"): + subject.direct_pyc_files().contains_exactly([ + "tests/base_rules/py_info/direct.pyc", + ]) + subject.transitive_pyc_files().contains_exactly([ + "tests/base_rules/py_info/trans.pyc", + "tests/base_rules/py_info/py1-trans.pyc", + "tests/base_rules/py_info/py2-trans.pyc", + ]) + + check(builder.build()) + check(builder.build_builtin_py_info()) + + builder.set_has_py2_only_sources(False) + builder.set_has_py3_only_sources(False) + builder.set_uses_shared_libraries(False) + + env.expect.that_bool(builder.get_has_py2_only_sources()).equals(False) + env.expect.that_bool(builder.get_has_py3_only_sources()).equals(False) + env.expect.that_bool(builder.get_uses_shared_libraries()).equals(False) + +_tests.append(_test_py_info_builder) + +def py_info_test_suite(name): + test_suite( + name = name, + tests = _tests, + ) diff --git a/tests/builders/BUILD.bazel b/tests/builders/BUILD.bazel new file mode 100644 index 0000000000..3ad0c3e80c --- /dev/null +++ b/tests/builders/BUILD.bazel @@ -0,0 +1,17 @@ +# 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(":builders_tests.bzl", "builders_test_suite") + +builders_test_suite(name = "builders_test_suite") diff --git a/tests/builders/builders_tests.bzl b/tests/builders/builders_tests.bzl new file mode 100644 index 0000000000..f1d596eaff --- /dev/null +++ b/tests/builders/builders_tests.bzl @@ -0,0 +1,116 @@ +# 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. +"""Tests for py_info.""" + +load("@rules_testing//lib:analysis_test.bzl", "analysis_test") +load("@rules_testing//lib:test_suite.bzl", "test_suite") +load("@rules_testing//lib:truth.bzl", "subjects") +load("@rules_testing//lib:util.bzl", rt_util = "util") +load("//python/private:builders.bzl", "builders") # buildifier: disable=bzl-visibility + +_tests = [] + +def _test_depset_builder(name): + rt_util.helper_target( + native.filegroup, + name = name + "_files", + ) + analysis_test( + name = name, + target = name + "_files", + impl = _test_depset_builder_impl, + ) + +def _test_depset_builder_impl(env, target): + _ = target # @unused + builder = builders.DepsetBuilder() + builder.set_order("preorder") + builder.add("one") + builder.add(["two"]) + builder.add(depset(["three"])) + builder.add([depset(["four"])]) + + env.expect.that_str(builder.get_order()).equals("preorder") + + actual = builder.build() + + env.expect.that_collection(actual).contains_exactly([ + "one", + "two", + "three", + "four", + ]).in_order() + +_tests.append(_test_depset_builder) + +def _test_runfiles_builder(name): + rt_util.helper_target( + native.filegroup, + name = name + "_files", + srcs = ["f1.txt", "f2.txt", "f3.txt", "f4.txt", "f5.txt"], + ) + rt_util.helper_target( + native.filegroup, + name = name + "_runfiles", + data = ["runfile.txt"], + ) + analysis_test( + name = name, + impl = _test_runfiles_builder_impl, + targets = { + "files": name + "_files", + "runfiles": name + "_runfiles", + }, + ) + +def _test_runfiles_builder_impl(env, targets): + ctx = env.ctx + + f1, f2, f3, f4, f5 = targets.files[DefaultInfo].files.to_list() + builder = builders.RunfilesBuilder() + builder.add(f1) + builder.add([f2]) + builder.add(depset([f3])) + + rf1 = ctx.runfiles([f4]) + rf2 = ctx.runfiles([f5]) + builder.add(rf1) + builder.add([rf2]) + + builder.add_targets([targets.runfiles]) + + builder.root_symlinks["root_link"] = f1 + builder.symlinks["regular_link"] = f1 + + actual = builder.build(ctx) + + subject = subjects.runfiles(actual, meta = env.expect.meta) + subject.contains_exactly([ + "root_link", + "{workspace}/regular_link", + "{workspace}/tests/builders/f1.txt", + "{workspace}/tests/builders/f2.txt", + "{workspace}/tests/builders/f3.txt", + "{workspace}/tests/builders/f4.txt", + "{workspace}/tests/builders/f5.txt", + "{workspace}/tests/builders/runfile.txt", + ]) + +_tests.append(_test_runfiles_builder) + +def builders_test_suite(name): + test_suite( + name = name, + tests = _tests, + ) From b52f3818d8ef896c7b634c34676c90670e04c242 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Tue, 1 Oct 2024 10:15:08 -0700 Subject: [PATCH 225/345] feat: add py_wheel.compress to control using compression (#2260) This is useful for development where, for large wheels, a significant portion of the time can be spent compression native binaries Fixes https://github.com/bazelbuild/rules_python/issues/2240 --- CHANGELOG.md | 3 ++- python/private/py_wheel.bzl | 7 +++++++ tools/wheelmaker.py | 9 +++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8982a5f716..a16a5e3c81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,7 +31,8 @@ A brief description of the categories of changes: * (whl_filegroup): Provide per default also the `RECORD` file ### Added -* Nothing yet +* (py_wheel) Now supports `compress = (True|False)` to allow disabling + compression to speed up development. ### Removed * Nothing yet diff --git a/python/private/py_wheel.bzl b/python/private/py_wheel.bzl index ef9e6f24ae..26eb5652a6 100644 --- a/python/private/py_wheel.bzl +++ b/python/private/py_wheel.bzl @@ -34,6 +34,10 @@ _distribution_attrs = { default = "none", doc = "Python ABI tag. 'none' for pure-Python wheels.", ), + "compress": attr.bool( + default = True, + doc = "Enable compression of the final archive.", + ), "distribution": attr.string( mandatory = True, doc = """\ @@ -466,6 +470,9 @@ def _py_wheel_impl(ctx): args.add("--description_file", description_file) other_inputs.append(description_file) + if not ctx.attr.compress: + args.add("--no_compress") + for target, filename in ctx.attr.extra_distinfo_files.items(): target_files = target.files.to_list() if len(target_files) != 1: diff --git a/tools/wheelmaker.py b/tools/wheelmaker.py index 68578b8e58..db287ebaee 100644 --- a/tools/wheelmaker.py +++ b/tools/wheelmaker.py @@ -227,6 +227,7 @@ def __init__( python_tag, abi, platform, + compress, outfile=None, strip_path_prefixes=None, ): @@ -238,6 +239,7 @@ def __init__( self._platform = platform self._outfile = outfile self._strip_path_prefixes = strip_path_prefixes + self._compress = compress self._wheelname_fragment_distribution_name = escape_filename_distribution_name( self._name ) @@ -254,6 +256,7 @@ def __enter__(self): mode="w", distribution_prefix=self._distribution_prefix, strip_path_prefixes=self._strip_path_prefixes, + compression=zipfile.ZIP_DEFLATED if self._compress else zipfile.ZIP_STORED, ) return self @@ -388,6 +391,11 @@ def parse_args() -> argparse.Namespace: output_group.add_argument( "--out", type=str, default=None, help="Override name of ouptut file" ) + output_group.add_argument( + "--no_compress", + action="store_true", + help="Disable compression of the final archive", + ) output_group.add_argument( "--name_file", type=Path, @@ -516,6 +524,7 @@ def main() -> None: platform=arguments.platform, outfile=arguments.out, strip_path_prefixes=strip_prefixes, + compress=not arguments.no_compress, ) as maker: for package_filename, real_filename in all_files: maker.add_file(package_filename, real_filename) From 413690fd09b068ab43ec9c1d37d20d8017747f2c Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Tue, 1 Oct 2024 15:33:31 -0700 Subject: [PATCH 226/345] chore: delete stale bot (#2264) The repo is actively maintained, but we've had a bunch of relevant issues be auto-closed by the bot. I haven't seen other active rulesets adopt this, so I don't think it makes sense to be the outlier. Note, I introduced this configuration. https://github.com/bazelbuild/rules_python/issues/385 as an example where users have to make comments to prevent things being marked stale. --- .github/workflows/stale.yml | 73 ------------------------------------- 1 file changed, 73 deletions(-) delete mode 100644 .github/workflows/stale.yml diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml deleted file mode 100644 index d37121b0da..0000000000 --- a/.github/workflows/stale.yml +++ /dev/null @@ -1,73 +0,0 @@ -# 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. - -# See https://github.com/marketplace/actions/close-stale-issues - -name: Mark stale issues and pull requests - -on: - schedule: - # run at 22:45 UTC daily - - cron: "45 22 * * *" - -jobs: - stale: - runs-on: ubuntu-latest - - steps: - - uses: actions/stale@v9 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - - # NB: We start with very long duration while trimming existing issues, - # with the hope to reduce when/if we get better at keeping up with user support. - - # The number of days old an issue can be before marking it stale. - days-before-stale: 180 - # Number of days of inactivity before a stale issue is closed - days-before-close: 30 - - # If an issue/PR is assigned, trust the assignee to stay involved - # Can revisit if these get stale - exempt-all-assignees: true - # Issues with these labels will never be considered stale - exempt-issue-labels: "need: discussion,cleanup" - - # Label to use when marking an issue as stale - stale-issue-label: 'Can Close?' - stale-pr-label: 'Can Close?' - - stale-issue-message: > - This issue has been automatically marked as stale because it has not had - any activity for 180 days. - It will be closed if no further activity occurs in 30 days. - - Collaborators can add an assignee to keep this open indefinitely. - Thanks for your contributions to rules_python! - - stale-pr-message: > - This Pull Request has been automatically marked as stale because it has not had - any activity for 180 days. - It will be closed if no further activity occurs in 30 days. - - Collaborators can add an assignee to keep this open indefinitely. - Thanks for your contributions to rules_python! - - close-issue-message: > - This issue was automatically closed because it went 30 days without a reply - since it was labeled "Can Close?" - - close-pr-message: > - This PR was automatically closed because it went 30 days without a reply - since it was labeled "Can Close?" From 4f38119c1918344856e4c86b563aabc4a445887a Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Thu, 3 Oct 2024 13:14:54 +0900 Subject: [PATCH 227/345] fix(bzlmod): correctly wire the extra_pip_args (#2258) Before this PR we were just dropping the `extra_pip_args` passed to `pip.parse` and were just using the args passed through the requirements file. Thanks to @swarren12 for pointing this out. This PR also passes `extra_pip_args` to `sdist` `whl_library` instances so that users can build the `sdists` correctly when using `experimental_index_url` feature. Summary: - pass `extra_pip_args` when building sdists in experimental mode - join `extra_pip_args` from the file and the pip.parse attr - test: add a test to ensure that the extra args are joined Fixes #2239 Closes #2254 --- CHANGELOG.md | 5 +++ examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/pypi/extension.bzl | 10 ++++- python/private/pypi/parse_requirements.bzl | 2 +- .../parse_requirements_tests.bzl | 42 +++++++++++++++++++ 5 files changed, 58 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a16a5e3c81..7235e8949c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,11 @@ A brief description of the categories of changes: * Nothing yet ### Fixed +* (bzlmod) correctly wire the {attr}`pip.parse.extra_pip_args` all the + way to {obj}`whl_library`. What is more we will pass the `extra_pip_args` to + {obj}`whl_library` for `sdist` distributions when using + {attr}`pip.parse.experimental_index_url`. See + [#2239](https://github.com/bazelbuild/rules_python/issues/2239). * (whl_filegroup): Provide per default also the `RECORD` file ### Added diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index cb8fbe287c..604aef17c6 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1231,7 +1231,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "ED3oUrLQz/MTptq8JOZ03sjD7HZ3naUeFS3XFpxz4tg=", + "bzlTransitiveDigest": "W8FWi7aL0uqh7djg6csTMzkL1RB6WGRgfO/MOcbqYZI=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6140,7 +6140,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "vEOIMpxlh8qbHkABunGFRr+IDbabjCM/hUF0V3GGTus=", + "bzlTransitiveDigest": "9aEp4XU4yVL6sJqODxio5iSCoqf37Ro3o+Mt1izDnq8=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 77a477899e..712d2fefda 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -182,6 +182,7 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s python_version = major_minor, logger = logger, ), + extra_pip_args = pip_attr.extra_pip_args, get_index_urls = get_index_urls, # NOTE @aignas 2024-08-02: , we will execute any interpreter that we find either # in the PATH or if specified as a label. We will configure the env @@ -275,8 +276,13 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s if pip_attr.auth_patterns: whl_library_args["auth_patterns"] = pip_attr.auth_patterns - # 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) + 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 + # need to pass the extra args there. + pass # This is no-op because pip is not used to download the wheel. whl_library_args.pop("download_only", None) diff --git a/python/private/pypi/parse_requirements.bzl b/python/private/pypi/parse_requirements.bzl index eee97d7019..c72f5d43f8 100644 --- a/python/private/pypi/parse_requirements.bzl +++ b/python/private/pypi/parse_requirements.bzl @@ -48,7 +48,7 @@ def parse_requirements( different package versions (or different packages) for different os, arch combinations. extra_pip_args (string list): Extra pip arguments to perform extra validations and to - be joined with args fined in files. + be joined with args found in files. get_index_urls: Callable[[ctx, list[str]], dict], a callable to get all of the distribution URLs from a PyPI index. Accepts ctx and distribution names to query. diff --git a/tests/pypi/parse_requirements/parse_requirements_tests.bzl b/tests/pypi/parse_requirements/parse_requirements_tests.bzl index 25d2961a34..c719ad6972 100644 --- a/tests/pypi/parse_requirements/parse_requirements_tests.bzl +++ b/tests/pypi/parse_requirements/parse_requirements_tests.bzl @@ -21,6 +21,11 @@ def _mock_ctx(): testdata = { "requirements_direct": """\ foo[extra] @ https://some-url +""", + "requirements_extra_args": """\ +--index-url=example.org + +foo[extra]==0.0.1 --hash=sha256:deadbeef """, "requirements_linux": """\ foo==0.0.3 --hash=sha256:deadbaaf @@ -93,6 +98,43 @@ def _test_simple(env): _tests.append(_test_simple) +def _test_extra_pip_args(env): + got = parse_requirements( + ctx = _mock_ctx(), + requirements_by_platform = { + "requirements_extra_args": ["linux_x86_64"], + }, + extra_pip_args = ["--trusted-host=example.org"], + ) + env.expect.that_dict(got).contains_exactly({ + "foo": [ + struct( + distribution = "foo", + extra_pip_args = ["--index-url=example.org", "--trusted-host=example.org"], + requirement_line = "foo[extra]==0.0.1 --hash=sha256:deadbeef", + srcs = struct( + requirement = "foo[extra]==0.0.1", + shas = ["deadbeef"], + version = "0.0.1", + ), + target_platforms = [ + "linux_x86_64", + ], + whls = [], + sdist = None, + is_exposed = True, + ), + ], + }) + env.expect.that_str( + select_requirement( + got["foo"], + platform = "linux_x86_64", + ).srcs.version, + ).equals("0.0.1") + +_tests.append(_test_extra_pip_args) + def _test_dupe_requirements(env): got = parse_requirements( ctx = _mock_ctx(), From 9c3d303418a4eec0f701a8a46fb06b1aa7f7ea61 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 21:30:26 -0700 Subject: [PATCH 228/345] build(deps): bump idna from 3.8 to 3.10 in /docs (#2227) Bumps [idna](https://github.com/kjd/idna) from 3.8 to 3.10.
Changelog

Sourced from idna's changelog.

3.10 (2024-09-15) +++++++++++++++++

  • Reverted to Unicode 15.1.0 data. Unicode 16 has some significant changes to UTS46 processing that will require more work to properly implement.

3.9 (2024-09-13) ++++++++++++++++

  • Update to Unicode 16.0.0
  • Deprecate setup.cfg in favour of pyproject.toml
  • Use ruff for code formatting

Thanks to Waket Zheng for contributions to this release.

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=idna&package-manager=pip&previous-version=3.8&new-version=3.10)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 7b5681d82a..6f417d90b0 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -125,9 +125,9 @@ docutils==0.21.2 \ # myst-parser # sphinx # sphinx-rtd-theme -idna==3.8 \ - --hash=sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac \ - --hash=sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603 +idna==3.10 \ + --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ + --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 # via requests imagesize==1.4.1 \ --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b \ From 5c3b71cbccd76b81243fddf2887fdfdd1a5735af Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 6 Oct 2024 17:43:08 -0700 Subject: [PATCH 229/345] feat(toolchains): default py_runtime.implementation_name to cpython (#2272) This defaults `py_runtime.implementation_name` to `cpython`, the value that is most likely to be used. This is done not only because it's the most likely value, but because of how it affects whether precompiling works. Within py_runtime, automatically computing `pyc_tag` requires both `implementation_name` and Python version information. With upcoming changes to make `--python_version` always set to the correct value, it'll make enabling precompiling easier, especially if there are custom toolchains defined. --- CHANGELOG.md | 3 ++- python/private/common/py_runtime_rule.bzl | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7235e8949c..3b348e68c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,8 @@ A brief description of the categories of changes: [x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/x.x.x ### Changed -* Nothing yet +* (toolchains) `py_runtime.implementation_name` now defaults to `cpython` + (previously it defaulted to None). ### Fixed * (bzlmod) correctly wire the {attr}`pip.parse.extra_pip_args` all the diff --git a/python/private/common/py_runtime_rule.bzl b/python/private/common/py_runtime_rule.bzl index b339425099..d944796118 100644 --- a/python/private/common/py_runtime_rule.bzl +++ b/python/private/common/py_runtime_rule.bzl @@ -226,6 +226,7 @@ runtime. For a platform runtime this attribute must not be set. ), "implementation_name": attr.string( doc = "The Python implementation name (`sys.implementation.name`)", + default = "cpython", ), "interpreter": attr.label( # We set `allow_files = True` to allow specifying executable From 33fa8455d3c474f6a12dc909d2ca809d2b1a594e Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 7 Oct 2024 11:07:27 +0900 Subject: [PATCH 230/345] fix(bzlmod): set the default_version to the python_version flag (#2253) With this change we set the default value of `--python_version` when the `python.toolchain` is used in `bzlmod` and we generate the appropriate config settings based on the registered toolchains and given overrides by the root module. This means that we expect the `--python_version` to be always set to a non-empty value under `bzlmod` and we can cleanup code which was handling `//conditions:default` case. This also means that we can in theory drop the requirement for `python_version` in `pip.parse` and just setup dependencies for all packages that we find in the `requirements.txt` file and move on. This is left as future work by myself or anyone willing to contribute. We can also start reusing the same `whl_library` instance for multi-platform packages because the python version flag is always set - this will simplify the layout and makes the feature non-experimental anymore under bzlmod. Summary: * Add `@pythons_hub` to the `WORKSPACE` with dummy data to make pythons_hub work. * Add `MINOR_MAPPING` and `PYTHON_VERSIONS` to pythons_hub to generate the config settings. * Remove handling of the default version in `pypi` code under bzlmod. Work towards #2081, #260, #1708 --------- Co-authored-by: Richard Levasseur --- CHANGELOG.md | 5 + WORKSPACE | 4 +- examples/bzlmod/MODULE.bazel | 9 +- examples/bzlmod/MODULE.bazel.lock | 7 +- examples/bzlmod/tests/BUILD.bazel | 2 +- internal_setup.bzl | 12 + python/config_settings/BUILD.bazel | 5 +- python/private/BUILD.bazel | 3 + python/private/config_settings.bzl | 9 +- python/private/py_repositories.bzl | 13 + python/private/pypi/BUILD.bazel | 8 +- python/private/pypi/config_settings.bzl | 10 +- python/private/pypi/extension.bzl | 3 +- python/private/pypi/hub_repository.bzl | 9 - python/private/pypi/render_pkg_aliases.bzl | 48 +--- python/private/python.bzl | 28 +- .../python_register_multi_toolchains.bzl | 4 + python/private/pythons_hub.bzl | 40 ++- .../construct_config_settings_tests.bzl | 2 +- .../config_settings/config_settings_tests.bzl | 99 +++---- .../render_pkg_aliases_test.bzl | 263 ++++-------------- tests/python/python_tests.bzl | 3 +- 22 files changed, 238 insertions(+), 348 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b348e68c6..cad878471c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,11 @@ A brief description of the categories of changes: (previously it defaulted to None). ### Fixed +* (bzlmod) The `python.override(minor_mapping)` now merges the default and the + overridden versions ensuring that the resultant `minor_mapping` will always + have all of the python versions. +* (bzlmod) The default value for the {obj}`--python_version` flag will now be + always set to the default python toolchain version value. * (bzlmod) correctly wire the {attr}`pip.parse.extra_pip_args` all the way to {obj}`whl_library`. What is more we will pass the `extra_pip_args` to {obj}`whl_library` for `sdist` distributions when using diff --git a/WORKSPACE b/WORKSPACE index 02b3b6e926..ba05ec54c5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -41,14 +41,14 @@ load("//:internal_setup.bzl", "rules_python_internal_setup") rules_python_internal_setup() +load("@pythons_hub//:versions.bzl", "MINOR_MAPPING", "PYTHON_VERSIONS") load("//python:repositories.bzl", "python_register_multi_toolchains") -load("//python:versions.bzl", "MINOR_MAPPING", "TOOL_VERSIONS") python_register_multi_toolchains( name = "python", default_version = MINOR_MAPPING.values()[-2], # Integration tests verify each version, so register all of them. - python_versions = TOOL_VERSIONS.keys(), + python_versions = PYTHON_VERSIONS, ) load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive", "http_file") diff --git a/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel index 4ac8191051..5504172e1d 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -42,17 +42,16 @@ python.toolchain( 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", ], # Also override the `minor_mapping` so that the root module, - # instead of rules_python's defaults, controls what full version - # is used when `3.x` is requested. + # instead of rules_python's defaulting to the latest available version, + # controls what full version is used when `3.x` is requested. minor_mapping = { - "3.10": "3.10.9", - "3.11": "3.11.8", "3.9": "3.9.19", }, ) @@ -90,7 +89,7 @@ python.single_version_platform_override( # See the tests folder for various examples on using multiple Python versions. # The names "python_3_9" and "python_3_10" are autmatically created by the repo # rules based on the `python_version` arg values. -use_repo(python, "python_3_10", "python_3_9", "python_versions") +use_repo(python, "python_3_10", "python_3_9", "python_versions", "pythons_hub") # EXPERIMENTAL: This is experimental and may be removed without notice uv = use_extension("@rules_python//python/uv:extensions.bzl", "uv") diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 604aef17c6..9a3ededcb8 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1231,7 +1231,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "W8FWi7aL0uqh7djg6csTMzkL1RB6WGRgfO/MOcbqYZI=", + "bzlTransitiveDigest": "vHagWYWcU/mNBRAz0GLQ3uxZZsgz/7/7i2GEWboxKd0=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -2955,7 +2955,6 @@ "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\"}]" }, - "default_version": "3.9", "packages": [], "groups": {} } @@ -4267,7 +4266,6 @@ "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\"}]" }, - "default_version": "3.9", "packages": [ "alabaster", "astroid", @@ -6140,7 +6138,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "9aEp4XU4yVL6sJqODxio5iSCoqf37Ro3o+Mt1izDnq8=", + "bzlTransitiveDigest": "qRRffSjIlTY99Raninpbkvh1elRwuufP+ZZaGb00rdo=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", @@ -8105,7 +8103,6 @@ "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\"}]" }, - "default_version": "3.9", "packages": [ "bleach", "certifi", diff --git a/examples/bzlmod/tests/BUILD.bazel b/examples/bzlmod/tests/BUILD.bazel index 9f7aa1ba00..a778ca1aee 100644 --- a/examples/bzlmod/tests/BUILD.bazel +++ b/examples/bzlmod/tests/BUILD.bazel @@ -1,8 +1,8 @@ load("@python_versions//3.10:defs.bzl", py_binary_3_10 = "py_binary", py_test_3_10 = "py_test") load("@python_versions//3.11:defs.bzl", py_binary_3_11 = "py_binary", py_test_3_11 = "py_test") load("@python_versions//3.9:defs.bzl", py_binary_3_9 = "py_binary", py_test_3_9 = "py_test") +load("@pythons_hub//:versions.bzl", "MINOR_MAPPING") load("@rules_python//python:defs.bzl", "py_binary", "py_test") -load("@rules_python//python:versions.bzl", "MINOR_MAPPING") load("@rules_python//python/config_settings:transition.bzl", py_versioned_binary = "py_binary", py_versioned_test = "py_test") py_binary( diff --git a/internal_setup.bzl b/internal_setup.bzl index 1967c0e568..3029c1546f 100644 --- a/internal_setup.bzl +++ b/internal_setup.bzl @@ -22,13 +22,25 @@ load("@rules_bazel_integration_test//bazel_integration_test:deps.bzl", "bazel_in load("@rules_bazel_integration_test//bazel_integration_test:repo_defs.bzl", "bazel_binaries") load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains") load("//:version.bzl", "SUPPORTED_BAZEL_VERSIONS") +load("//python:versions.bzl", "MINOR_MAPPING", "TOOL_VERSIONS") load("//python/private:internal_config_repo.bzl", "internal_config_repo") # buildifier: disable=bzl-visibility +load("//python/private:pythons_hub.bzl", "hub_repo") # buildifier: disable=bzl-visibility load("//python/private/pypi:deps.bzl", "pypi_deps") # buildifier: disable=bzl-visibility def rules_python_internal_setup(): """Setup for rules_python tests and tools.""" internal_config_repo(name = "rules_python_internal") + hub_repo( + name = "pythons_hub", + minor_mapping = MINOR_MAPPING, + default_python_version = "", + toolchain_prefixes = [], + toolchain_python_versions = [], + toolchain_set_python_version_constraints = [], + toolchain_user_repository_names = [], + 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() diff --git a/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel index c31d69f202..9fb395741b 100644 --- a/python/config_settings/BUILD.bazel +++ b/python/config_settings/BUILD.bazel @@ -1,5 +1,5 @@ load("@bazel_skylib//rules:common_settings.bzl", "string_flag") -load("//python:versions.bzl", "MINOR_MAPPING", "TOOL_VERSIONS") +load("@pythons_hub//:versions.bzl", "DEFAULT_PYTHON_VERSION", "MINOR_MAPPING", "PYTHON_VERSIONS") load( "//python/private:flags.bzl", "BootstrapImplFlag", @@ -28,8 +28,9 @@ filegroup( construct_config_settings( name = "construct_config_settings", + default_version = DEFAULT_PYTHON_VERSION, minor_mapping = MINOR_MAPPING, - versions = TOOL_VERSIONS.keys(), + versions = PYTHON_VERSIONS, ) string_flag( diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index f128742b2c..cb0fd5ca02 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -165,6 +165,8 @@ bzl_library( deps = [ ":bazel_tools_bzl", ":internal_config_repo_bzl", + ":pythons_hub_bzl", + "//python:versions_bzl", "//python/private/pypi:deps_bzl", ], ) @@ -212,6 +214,7 @@ bzl_library( srcs = ["pythons_hub.bzl"], deps = [ ":py_toolchain_suite_bzl", + ":text_util_bzl", ], ) diff --git a/python/private/config_settings.bzl b/python/private/config_settings.bzl index b15d6a8e03..eceeb549bd 100644 --- a/python/private/config_settings.bzl +++ b/python/private/config_settings.bzl @@ -22,7 +22,7 @@ load(":semver.bzl", "semver") _PYTHON_VERSION_FLAG = Label("//python/config_settings:python_version") _PYTHON_VERSION_MAJOR_MINOR_FLAG = Label("//python/config_settings:_python_version_major_minor") -def construct_config_settings(*, name, versions, minor_mapping): # buildifier: disable=function-docstring +def construct_config_settings(*, name, default_version, versions, minor_mapping): # buildifier: disable=function-docstring """Create a 'python_version' config flag and construct all config settings used in rules_python. This mainly includes the targets that are used in the toolchain and pip hub @@ -30,17 +30,14 @@ def construct_config_settings(*, name, versions, minor_mapping): # buildifier: Args: name: {type}`str` A dummy name value that is no-op for now. + default_version: {type}`str` the default value for the `python_version` flag. versions: {type}`list[str]` A list of versions to build constraint settings for. minor_mapping: {type}`dict[str, str]` A mapping from `X.Y` to `X.Y.Z` python versions. """ _ = name # @unused _python_version_flag( name = _PYTHON_VERSION_FLAG.name, - # TODO: The default here should somehow match the MODULE config. Until - # then, use the empty string to indicate an unknown version. This - # also prevents version-unaware targets from inadvertently matching - # a select condition when they shouldn't. - build_setting_default = "", + build_setting_default = default_version, visibility = ["//visibility:public"], ) diff --git a/python/private/py_repositories.bzl b/python/private/py_repositories.bzl index 8ddcb5d3a7..ff8a6389ba 100644 --- a/python/private/py_repositories.bzl +++ b/python/private/py_repositories.bzl @@ -16,8 +16,10 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", _http_archive = "http_archive") load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") +load("//python:versions.bzl", "MINOR_MAPPING", "TOOL_VERSIONS") load("//python/private/pypi:deps.bzl", "pypi_deps") load(":internal_config_repo.bzl", "internal_config_repo") +load(":pythons_hub.bzl", "hub_repo") def http_archive(**kwargs): maybe(_http_archive, **kwargs) @@ -32,6 +34,17 @@ def py_repositories(): internal_config_repo, name = "rules_python_internal", ) + maybe( + hub_repo, + name = "pythons_hub", + minor_mapping = MINOR_MAPPING, + default_python_version = "", + toolchain_prefixes = [], + toolchain_python_versions = [], + toolchain_set_python_version_constraints = [], + toolchain_user_repository_names = [], + python_versions = sorted(TOOL_VERSIONS.keys()), + ) http_archive( name = "bazel_skylib", sha256 = "74d544d96f4a5bb630d465ca8bbcfe231e3594e5aae57e1edbf17a6eb3ca2506", diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel index 8cfd3d6525..e76f9d36b1 100644 --- a/python/private/pypi/BUILD.bazel +++ b/python/private/pypi/BUILD.bazel @@ -13,7 +13,6 @@ # limitations under the License. load("@bazel_skylib//:bzl_library.bzl", "bzl_library") -load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") package(default_visibility = ["//:__subpackages__"]) @@ -59,9 +58,9 @@ bzl_library( srcs = ["extension.bzl"], deps = [ ":attrs_bzl", + ":evaluate_markers_bzl", ":hub_repository_bzl", ":parse_requirements_bzl", - ":evaluate_markers_bzl", ":parse_whl_name_bzl", ":pip_repository_attrs_bzl", ":simpleapi_download_bzl", @@ -69,12 +68,11 @@ bzl_library( ":whl_repo_name_bzl", "//python/private:full_version_bzl", "//python/private:normalize_name_bzl", - "//python/private:version_label_bzl", "//python/private:semver_bzl", + "//python/private:version_label_bzl", "@bazel_features//:features", - ] + [ "@pythons_hub//:interpreters_bzl", - ] if BZLMOD_ENABLED else [], + ], ) bzl_library( diff --git a/python/private/pypi/config_settings.bzl b/python/private/pypi/config_settings.bzl index 974121782f..9ccb646a3d 100644 --- a/python/private/pypi/config_settings.bzl +++ b/python/private/pypi/config_settings.bzl @@ -109,9 +109,15 @@ def config_settings( for python_version in [""] + python_versions: is_python = "is_python_{}".format(python_version or "version_unset") - native.alias( + + # The aliases defined in @rules_python//python/config_settings may not + # have config settings for the versions we need, so define our own + # config settings instead. + native.config_setting( name = is_python, - actual = Label("//python/config_settings:" + is_python), + flag_values = { + Label("//python/config_settings:_python_version_major_minor"): python_version, + }, visibility = visibility, ) diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 712d2fefda..200aa4327e 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -15,7 +15,7 @@ "pip module extension for use with bzlmod" load("@bazel_features//:features.bzl", "bazel_features") -load("@pythons_hub//:interpreters.bzl", "DEFAULT_PYTHON_VERSION", "INTERPRETER_LABELS") +load("@pythons_hub//:interpreters.bzl", "INTERPRETER_LABELS") load("//python/private:auth.bzl", "AUTH_ATTRS") load("//python/private:normalize_name.bzl", "normalize_name") load("//python/private:repo_utils.bzl", "repo_utils") @@ -506,7 +506,6 @@ def _pip_impl(module_ctx): key: json.encode(value) for key, value in whl_map.items() }, - default_version = _major_minor_version(DEFAULT_PYTHON_VERSION), packages = sorted(exposed_packages.get(hub_name, {})), groups = hub_group_map.get(hub_name), ) diff --git a/python/private/pypi/hub_repository.bzl b/python/private/pypi/hub_repository.bzl index f589dd4744..7afb616e3d 100644 --- a/python/private/pypi/hub_repository.bzl +++ b/python/private/pypi/hub_repository.bzl @@ -35,8 +35,6 @@ def _impl(rctx): key: [whl_alias(**v) for v in json.decode(values)] for key, values in rctx.attr.whl_map.items() }, - default_version = rctx.attr.default_version, - default_config_setting = "//_config:is_python_" + rctx.attr.default_version, requirement_cycles = rctx.attr.groups, ) for path, contents in aliases.items(): @@ -67,13 +65,6 @@ def _impl(rctx): hub_repository = repository_rule( attrs = { - "default_version": attr.string( - mandatory = True, - doc = """\ -This is the default python version in the format of X.Y. This should match -what is setup by the 'python' extension using the 'is_default = True' -setting.""", - ), "groups": attr.string_list_dict( mandatory = False, ), diff --git a/python/private/pypi/render_pkg_aliases.bzl b/python/private/pypi/render_pkg_aliases.bzl index 9e5158f8f0..0086bfff8f 100644 --- a/python/private/pypi/render_pkg_aliases.bzl +++ b/python/private/pypi/render_pkg_aliases.bzl @@ -73,7 +73,6 @@ which has a "null" version value and will not match version constraints. def _render_whl_library_alias( *, name, - default_config_setting, aliases, target_name, **kwargs): @@ -97,9 +96,6 @@ def _render_whl_library_alias( 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) - if alias.config_setting == default_config_setting: - selects[actual].append("//conditions:default") - no_match_error = None return render.alias( name = name, @@ -121,7 +117,7 @@ def _render_whl_library_alias( **kwargs ) -def _render_common_aliases(*, name, aliases, default_config_setting = None, group_name = None): +def _render_common_aliases(*, name, aliases, group_name = None): lines = [ """load("@bazel_skylib//lib:selects.bzl", "selects")""", """package(default_visibility = ["//visibility:public"])""", @@ -131,9 +127,7 @@ def _render_common_aliases(*, name, aliases, default_config_setting = None, grou if aliases: config_settings = sorted([v.config_setting for v in aliases if v.config_setting]) - if not config_settings or default_config_setting in config_settings: - pass - else: + if config_settings: error_msg = NO_MATCH_ERROR_MESSAGE_TEMPLATE_V2.format( config_settings = render.indent( "\n".join(config_settings), @@ -145,10 +139,6 @@ def _render_common_aliases(*, name, aliases, default_config_setting = None, grou error_msg = error_msg, )) - # This is to simplify the code in _render_whl_library_alias and to ensure - # that we don't pass a 'default_version' that is not in 'versions'. - default_config_setting = None - lines.append( render.alias( name = name, @@ -159,7 +149,6 @@ def _render_common_aliases(*, name, aliases, default_config_setting = None, grou [ _render_whl_library_alias( name = name, - default_config_setting = default_config_setting, aliases = aliases, target_name = target_name, visibility = ["//_groups:__subpackages__"] if name.startswith("_") else None, @@ -188,7 +177,7 @@ def _render_common_aliases(*, name, aliases, default_config_setting = None, grou return "\n\n".join(lines) -def render_pkg_aliases(*, aliases, default_config_setting = None, requirement_cycles = None): +def render_pkg_aliases(*, aliases, requirement_cycles = None): """Create alias declarations for each PyPI package. The aliases should be appended to the pip_repository BUILD.bazel file. These aliases @@ -198,7 +187,6 @@ def render_pkg_aliases(*, aliases, default_config_setting = None, requirement_cy Args: aliases: dict, the keys are normalized distribution names and values are the whl_alias instances. - default_config_setting: the default to be used for the aliases. requirement_cycles: any package groups to also add. Returns: @@ -227,7 +215,6 @@ def render_pkg_aliases(*, aliases, default_config_setting = None, requirement_cy "{}/BUILD.bazel".format(normalize_name(name)): _render_common_aliases( name = normalize_name(name), aliases = pkg_aliases, - default_config_setting = default_config_setting, group_name = whl_group_mapping.get(normalize_name(name)), ).strip() for name, pkg_aliases in aliases.items() @@ -278,13 +265,12 @@ def whl_alias(*, repo, version = None, config_setting = None, filename = None, t target_platforms = target_platforms, ) -def render_multiplatform_pkg_aliases(*, aliases, default_version = None, **kwargs): +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 transformed from ones having `filename` to ones having `config_setting`. - default_version: str, the default python version. Defaults to None. **kwargs: extra arguments passed to render_pkg_aliases. Returns: @@ -302,7 +288,6 @@ def render_multiplatform_pkg_aliases(*, aliases, default_version = None, **kwarg config_setting_aliases = { pkg: multiplatform_whl_aliases( aliases = pkg_aliases, - default_version = default_version, glibc_versions = flag_versions.get("glibc_versions", []), muslc_versions = flag_versions.get("muslc_versions", []), osx_versions = flag_versions.get("osx_versions", []), @@ -317,14 +302,13 @@ def render_multiplatform_pkg_aliases(*, aliases, default_version = None, **kwarg contents["_config/BUILD.bazel"] = _render_config_settings(**flag_versions) return contents -def multiplatform_whl_aliases(*, aliases, default_version = None, **kwargs): +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. - default_version: string | None, the default python version to use. **kwargs: Extra parameters passed to get_filename_config_settings. Returns: @@ -344,7 +328,6 @@ def multiplatform_whl_aliases(*, aliases, default_version = None, **kwargs): filename = alias.filename, target_platforms = alias.target_platforms, python_version = alias.version, - python_default = default_version == alias.version, **kwargs ) @@ -511,8 +494,7 @@ def get_filename_config_settings( glibc_versions, muslc_versions, osx_versions, - python_version = "", - python_default = True): + python_version): """Get the filename config settings. Args: @@ -522,7 +504,6 @@ def get_filename_config_settings( 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. - python_default: if we should include the setting when python_version is not set. Returns: A tuple: @@ -573,18 +554,9 @@ def get_filename_config_settings( prefixes = ["sdist"] suffixes = [_non_versioned_platform(p) for p in target_platforms or []] - if python_default and python_version: - prefixes += ["cp{}_{}".format(python_version, p) for p in prefixes] - elif python_version: - prefixes = ["cp{}_{}".format(python_version, p) for p in prefixes] - elif python_default: - pass - else: - fail("BUG: got no python_version and it is not default") - versioned = { - ":is_{}_{}".format(p, suffix): { - version: ":is_{}_{}".format(p, setting) + ":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 @@ -592,9 +564,9 @@ def get_filename_config_settings( } if suffixes or versioned: - return [":is_{}_{}".format(p, s) for p in prefixes for s in suffixes], versioned + return [":is_cp{}_{}_{}".format(python_version, p, s) for p in prefixes for s in suffixes], versioned else: - return [":is_{}".format(p) for p in prefixes], setting_supported_versions + return [":is_cp{}_{}".format(python_version, p) for p in prefixes], setting_supported_versions def _whl_config_setting_suffixes( platform_tag, diff --git a/python/private/python.bzl b/python/private/python.bzl index cedf39a5c7..83bc43f92e 100644 --- a/python/private/python.bzl +++ b/python/private/python.bzl @@ -236,6 +236,7 @@ def _python_impl(module_ctx): name = "pythons_hub", # Last toolchain is default default_python_version = py.default_python_version, + minor_mapping = py.config.minor_mapping, toolchain_prefixes = [ render.toolchain_prefix(index, toolchain.name, _TOOLCHAIN_INDEX_PAD_LENGTH) for index, toolchain in enumerate(py.toolchains) @@ -493,20 +494,23 @@ def _get_toolchain_config(*, modules, _fail = fail): _fail = _fail, ) - minor_mapping = default.pop("minor_mapping", {}) register_all_versions = default.pop("register_all_versions", False) kwargs = default.pop("kwargs", {}) - if not minor_mapping: - versions = {} - for version_string in available_versions: - v = semver(version_string) - versions.setdefault("{}.{}".format(v.major, v.minor), []).append((int(v.patch), version_string)) + versions = {} + for version_string in available_versions: + v = semver(version_string) + versions.setdefault("{}.{}".format(v.major, v.minor), []).append((int(v.patch), version_string)) - minor_mapping = { - major_minor: max(subset)[1] - for major_minor, subset in versions.items() - } + minor_mapping = { + major_minor: max(subset)[1] + for major_minor, subset in versions.items() + } + + # The following ensures that all of the versions will be present in the minor_mapping + minor_mapping_overrides = default.pop("minor_mapping", {}) + for major_minor, full in minor_mapping_overrides.items(): + minor_mapping[major_minor] = full return struct( kwargs = kwargs, @@ -705,6 +709,10 @@ and `3.11.4` then the default for the `minor_mapping` dict will be: "3.11": "3.11.4", } ``` + +:::{versionchanged} 0.37.0 +The values in this mapping override the default values and do not replace them. +::: """, default = {}, ), diff --git a/python/private/python_register_multi_toolchains.bzl b/python/private/python_register_multi_toolchains.bzl index 68f5249350..1c7138d0e9 100644 --- a/python/private/python_register_multi_toolchains.bzl +++ b/python/private/python_register_multi_toolchains.bzl @@ -15,6 +15,10 @@ """This file contains repository rules and macros to support toolchain registration. """ +# NOTE @aignas 2024-10-07: we are not importing this from `@pythons_hub` because of this +# leading to a backwards incompatible change - the `//python:repositories.bzl` is loading +# from this file and it will cause a circular import loop and an error. If the users in +# WORKSPACE world want to override the `minor_mapping`, they will have to pass an argument. load("//python:versions.bzl", "MINOR_MAPPING") load(":python_register_toolchains.bzl", "python_register_toolchains") load(":toolchains_repo.bzl", "multi_toolchain_aliases") diff --git a/python/private/pythons_hub.bzl b/python/private/pythons_hub.bzl index da6c80d078..fdaad60e22 100644 --- a/python/private/pythons_hub.bzl +++ b/python/private/pythons_hub.bzl @@ -14,10 +14,8 @@ "Repo rule used by bzlmod extension to create a repo that has a map of Python interpreters and their labels" -load( - "//python/private:toolchains_repo.bzl", - "python_toolchain_build_file_content", -) +load(":text_util.bzl", "render") +load(":toolchains_repo.bzl", "python_toolchain_build_file_content") def _have_same_length(*lists): if not lists: @@ -34,6 +32,12 @@ bzl_library( visibility = ["@rules_python//:__subpackages__"], ) +bzl_library( + name = "versions_bzl", + srcs = ["versions.bzl"], + visibility = ["@rules_python//:__subpackages__"], +) + {toolchains} """ @@ -82,6 +86,12 @@ _line_for_hub_template = """\ "{name}_host": Label("@{name}_host//:python"), """ +_versions_bzl_template = """ +DEFAULT_PYTHON_VERSION = "{default_python_version}" +MINOR_MAPPING = {minor_mapping} +PYTHON_VERSIONS = {python_versions} +""" + def _hub_repo_impl(rctx): # Create the various toolchain definitions and # write them to the BUILD file. @@ -107,8 +117,22 @@ def _hub_repo_impl(rctx): 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, + ) + + rctx.file( + "versions.bzl", + _versions_bzl_template.format( default_python_version = rctx.attr.default_python_version, + minor_mapping = render.dict(rctx.attr.minor_mapping), + python_versions = rctx.attr.python_versions or render.list(sorted({ + v: None + for v in rctx.attr.toolchain_python_versions + })), ), executable = False, ) @@ -125,6 +149,14 @@ This rule also writes out the various toolchains for the different Python versio doc = "Default Python version for the build in `X.Y` or `X.Y.Z` format.", mandatory = True, ), + "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, + ), + "python_versions": attr.string_list( + doc = "The list of python versions to include in the `interpreters.bzl` if the toolchains are not specified. Used in `WORKSPACE` builds.", + mandatory = False, + ), "toolchain_prefixes": attr.string_list( doc = "List prefixed for the toolchains", mandatory = True, diff --git a/tests/config_settings/construct_config_settings_tests.bzl b/tests/config_settings/construct_config_settings_tests.bzl index 9e6b6e1fc3..3abedac5eb 100644 --- a/tests/config_settings/construct_config_settings_tests.bzl +++ b/tests/config_settings/construct_config_settings_tests.bzl @@ -13,7 +13,7 @@ # limitations under the License. """Tests for construction of Python version matching config settings.""" -load("@//python:versions.bzl", "MINOR_MAPPING") +load("@pythons_hub//:versions.bzl", "MINOR_MAPPING") load("@rules_testing//lib:analysis_test.bzl", "analysis_test") load("@rules_testing//lib:test_suite.bzl", "test_suite") load("@rules_testing//lib:truth.bzl", "subjects") diff --git a/tests/pypi/config_settings/config_settings_tests.bzl b/tests/pypi/config_settings/config_settings_tests.bzl index 87e18b412f..a77fa5b66b 100644 --- a/tests/pypi/config_settings/config_settings_tests.bzl +++ b/tests/pypi/config_settings/config_settings_tests.bzl @@ -55,6 +55,8 @@ def _analysis_test(*, name, dist, want, config_settings = [_flag.platform("linux config_settings = dict(config_settings) if not config_settings: fail("For reproducibility on different platforms, the config setting must be specified") + python_version, default_value = _flag.python_version("3.7.10") + config_settings.setdefault(python_version, default_value) analysis_test( name = name, @@ -75,7 +77,7 @@ def _test_sdist_default(name): _analysis_test( name = name, dist = { - "is_sdist": "sdist", + "is_cp3.7_sdist": "sdist", }, want = "sdist", ) @@ -86,7 +88,7 @@ def _test_sdist_no_whl(name): _analysis_test( name = name, dist = { - "is_sdist": "sdist", + "is_cp3.7_sdist": "sdist", }, config_settings = [ _flag.platform("linux_aarch64"), @@ -101,7 +103,7 @@ def _test_sdist_no_sdist(name): _analysis_test( name = name, dist = { - "is_sdist": "sdist", + "is_cp3.7_sdist": "sdist", }, config_settings = [ _flag.platform("linux_aarch64"), @@ -118,8 +120,8 @@ def _test_basic_whl_default(name): _analysis_test( name = name, dist = { - "is_py_none_any": "whl", - "is_sdist": "sdist", + "is_cp3.7_py_none_any": "whl", + "is_cp3.7_sdist": "sdist", }, want = "whl", ) @@ -130,8 +132,8 @@ def _test_basic_whl_nowhl(name): _analysis_test( name = name, dist = { - "is_py_none_any": "whl", - "is_sdist": "sdist", + "is_cp3.7_py_none_any": "whl", + "is_cp3.7_sdist": "sdist", }, config_settings = [ _flag.platform("linux_aarch64"), @@ -146,8 +148,8 @@ def _test_basic_whl_nosdist(name): _analysis_test( name = name, dist = { - "is_py_none_any": "whl", - "is_sdist": "sdist", + "is_cp3.7_py_none_any": "whl", + "is_cp3.7_sdist": "sdist", }, config_settings = [ _flag.platform("linux_aarch64"), @@ -162,8 +164,8 @@ def _test_whl_default(name): _analysis_test( name = name, dist = { - "is_py3_none_any": "whl", - "is_py_none_any": "basic_whl", + "is_cp3.7_py3_none_any": "whl", + "is_cp3.7_py_none_any": "basic_whl", }, want = "whl", ) @@ -174,8 +176,8 @@ def _test_whl_nowhl(name): _analysis_test( name = name, dist = { - "is_py3_none_any": "whl", - "is_py_none_any": "basic_whl", + "is_cp3.7_py3_none_any": "whl", + "is_cp3.7_py_none_any": "basic_whl", }, config_settings = [ _flag.platform("linux_aarch64"), @@ -190,7 +192,7 @@ def _test_whl_nosdist(name): _analysis_test( name = name, dist = { - "is_py3_none_any": "whl", + "is_cp3.7_py3_none_any": "whl", }, config_settings = [ _flag.platform("linux_aarch64"), @@ -205,8 +207,8 @@ def _test_abi_whl_is_prefered(name): _analysis_test( name = name, dist = { - "is_py3_abi3_any": "abi_whl", - "is_py3_none_any": "whl", + "is_cp3.7_py3_abi3_any": "abi_whl", + "is_cp3.7_py3_none_any": "whl", }, want = "abi_whl", ) @@ -217,9 +219,9 @@ def _test_whl_with_constraints_is_prefered(name): _analysis_test( name = name, dist = { - "is_py3_none_any": "default_whl", - "is_py3_none_any_linux_aarch64": "whl", - "is_py3_none_any_linux_x86_64": "amd64_whl", + "is_cp3.7_py3_none_any": "default_whl", + "is_cp3.7_py3_none_any_linux_aarch64": "whl", + "is_cp3.7_py3_none_any_linux_x86_64": "amd64_whl", }, want = "whl", ) @@ -230,9 +232,9 @@ def _test_cp_whl_is_prefered_over_py3(name): _analysis_test( name = name, dist = { - "is_cp3x_none_any": "cp", - "is_py3_abi3_any": "py3_abi3", - "is_py3_none_any": "py3", + "is_cp3.7_cp3x_none_any": "cp", + "is_cp3.7_py3_abi3_any": "py3_abi3", + "is_cp3.7_py3_none_any": "py3", }, want = "cp", ) @@ -243,8 +245,8 @@ def _test_cp_abi_whl_is_prefered_over_py3(name): _analysis_test( name = name, dist = { - "is_cp3x_abi3_any": "cp", - "is_py3_abi3_any": "py3", + "is_cp3.7_cp3x_abi3_any": "cp", + "is_cp3.7_py3_abi3_any": "py3", }, want = "cp", ) @@ -258,7 +260,6 @@ def _test_cp_version_is_selected_when_python_version_is_specified(name): "is_cp3.10_cp3x_none_any": "cp310", "is_cp3.8_cp3x_none_any": "cp38", "is_cp3.9_cp3x_none_any": "cp39", - "is_cp3x_none_any": "cp_default", }, want = "cp310", config_settings = [ @@ -319,11 +320,11 @@ def _test_platform_whl_is_prefered_over_any_whl_with_constraints(name): _analysis_test( name = name, dist = { - "is_py3_abi3_any": "better_default_whl", - "is_py3_abi3_any_linux_aarch64": "better_default_any_whl", - "is_py3_none_any": "default_whl", - "is_py3_none_any_linux_aarch64": "whl", - "is_py3_none_linux_aarch64": "platform_whl", + "is_cp3.7_py3_abi3_any": "better_default_whl", + "is_cp3.7_py3_abi3_any_linux_aarch64": "better_default_any_whl", + "is_cp3.7_py3_none_any": "default_whl", + "is_cp3.7_py3_none_any_linux_aarch64": "whl", + "is_cp3.7_py3_none_linux_aarch64": "platform_whl", }, want = "platform_whl", ) @@ -334,8 +335,8 @@ def _test_abi3_platform_whl_preference(name): _analysis_test( name = name, dist = { - "is_py3_abi3_linux_aarch64": "abi3_platform", - "is_py3_none_linux_aarch64": "platform", + "is_cp3.7_py3_abi3_linux_aarch64": "abi3_platform", + "is_cp3.7_py3_none_linux_aarch64": "platform", }, want = "abi3_platform", ) @@ -346,8 +347,8 @@ def _test_glibc(name): _analysis_test( name = name, dist = { - "is_cp3x_cp_manylinux_aarch64": "glibc", - "is_py3_abi3_linux_aarch64": "abi3_platform", + "is_cp3.7_cp3x_cp_manylinux_aarch64": "glibc", + "is_cp3.7_py3_abi3_linux_aarch64": "abi3_platform", }, want = "glibc", ) @@ -358,9 +359,9 @@ def _test_glibc_versioned(name): _analysis_test( name = name, dist = { - "is_cp3x_cp_manylinux_2_14_aarch64": "glibc", - "is_cp3x_cp_manylinux_2_17_aarch64": "glibc", - "is_py3_abi3_linux_aarch64": "abi3_platform", + "is_cp3.7_cp3x_cp_manylinux_2_14_aarch64": "glibc", + "is_cp3.7_cp3x_cp_manylinux_2_17_aarch64": "glibc", + "is_cp3.7_py3_abi3_linux_aarch64": "abi3_platform", }, want = "glibc", config_settings = [ @@ -378,8 +379,8 @@ def _test_glibc_compatible_exists(name): dist = { # Code using the conditions will need to construct selects, which # do the version matching correctly. - "is_cp3x_cp_manylinux_2_14_aarch64": "2_14_whl_via_2_14_branch", - "is_cp3x_cp_manylinux_2_17_aarch64": "2_14_whl_via_2_17_branch", + "is_cp3.7_cp3x_cp_manylinux_2_14_aarch64": "2_14_whl_via_2_14_branch", + "is_cp3.7_cp3x_cp_manylinux_2_17_aarch64": "2_14_whl_via_2_17_branch", }, want = "2_14_whl_via_2_17_branch", config_settings = [ @@ -395,7 +396,7 @@ def _test_musl(name): _analysis_test( name = name, dist = { - "is_cp3x_cp_musllinux_aarch64": "musl", + "is_cp3.7_cp3x_cp_musllinux_aarch64": "musl", }, want = "musl", config_settings = [ @@ -410,7 +411,7 @@ def _test_windows(name): _analysis_test( name = name, dist = { - "is_cp3x_cp_windows_x86_64": "whl", + "is_cp3.7_cp3x_cp_windows_x86_64": "whl", }, want = "whl", config_settings = [ @@ -425,8 +426,8 @@ def _test_osx(name): name = name, dist = { # We prefer arch specific whls over universal - "is_cp3x_cp_osx_x86_64": "whl", - "is_cp3x_cp_osx_x86_64_universal2": "universal_whl", + "is_cp3.7_cp3x_cp_osx_x86_64": "whl", + "is_cp3.7_cp3x_cp_osx_x86_64_universal2": "universal_whl", }, want = "whl", config_settings = [ @@ -441,7 +442,7 @@ def _test_osx_universal_default(name): name = name, dist = { # We default to universal if only that exists - "is_cp3x_cp_osx_x86_64_universal2": "whl", + "is_cp3.7_cp3x_cp_osx_x86_64_universal2": "whl", }, want = "whl", config_settings = [ @@ -456,8 +457,8 @@ def _test_osx_universal_only(name): name = name, dist = { # If we prefer universal, then we use that - "is_cp3x_cp_osx_x86_64": "whl", - "is_cp3x_cp_osx_x86_64_universal2": "universal", + "is_cp3.7_cp3x_cp_osx_x86_64": "whl", + "is_cp3.7_cp3x_cp_osx_x86_64_universal2": "universal", }, want = "universal", config_settings = [ @@ -474,7 +475,7 @@ def _test_osx_os_version(name): dist = { # Similarly to the libc version, the user of the config settings will have to # construct the select so that the version selection is correct. - "is_cp3x_cp_osx_10_9_x86_64": "whl", + "is_cp3.7_cp3x_cp_osx_10_9_x86_64": "whl", }, want = "whl", config_settings = [ @@ -489,7 +490,7 @@ def _test_all(name): _analysis_test( name = name, dist = { - "is_" + f: f + "is_cp3.7_" + f: f for f in [ "{py}_{abi}_{plat}".format(py = valid_py, abi = valid_abi, plat = valid_plat) # we have py2.py3, py3, cp3x @@ -528,7 +529,7 @@ def config_settings_test_suite(name): # buildifier: disable=function-docstring config_settings( name = "dummy", - python_versions = ["3.8", "3.9", "3.10"], + python_versions = ["3.7", "3.8", "3.9", "3.10"], glibc_versions = [(2, 14), (2, 17)], muslc_versions = [(1, 1)], osx_versions = [(10, 9), (11, 0)], 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 09a06311fc..9de309b295 100644 --- a/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl +++ b/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl @@ -110,7 +110,6 @@ _tests.append(_test_legacy_aliases) def _test_bzlmod_aliases(env): # Use this function as it is used in pip_repository actual = render_multiplatform_pkg_aliases( - default_config_setting = "//:my_config_setting", aliases = { "bar-baz": [ whl_alias(version = "3.2", repo = "pypi_32_bar_baz", config_setting = "//:my_config_setting"), @@ -124,6 +123,23 @@ 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: + //:my_config_setting + +To determine the current configuration's Python version, run: + `bazel config ` (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", @@ -133,11 +149,9 @@ alias( name = "pkg", actual = selects.with_or( { - ( - "//:my_config_setting", - "//conditions:default", - ): "@pypi_32_bar_baz//:pkg", + "//:my_config_setting": "@pypi_32_bar_baz//:pkg", }, + no_match_error = _NO_MATCH_ERROR, ), ) @@ -145,11 +159,9 @@ alias( name = "whl", actual = selects.with_or( { - ( - "//:my_config_setting", - "//conditions:default", - ): "@pypi_32_bar_baz//:whl", + "//:my_config_setting": "@pypi_32_bar_baz//:whl", }, + no_match_error = _NO_MATCH_ERROR, ), ) @@ -157,11 +169,9 @@ alias( name = "data", actual = selects.with_or( { - ( - "//:my_config_setting", - "//conditions:default", - ): "@pypi_32_bar_baz//:data", + "//:my_config_setting": "@pypi_32_bar_baz//:data", }, + no_match_error = _NO_MATCH_ERROR, ), ) @@ -169,11 +179,9 @@ alias( name = "dist_info", actual = selects.with_or( { - ( - "//:my_config_setting", - "//conditions:default", - ): "@pypi_32_bar_baz//:dist_info", + "//:my_config_setting": "@pypi_32_bar_baz//:dist_info", }, + no_match_error = _NO_MATCH_ERROR, ), )""" @@ -198,7 +206,6 @@ _tests.append(_test_bzlmod_aliases) def _test_bzlmod_aliases_with_no_default_version(env): actual = render_multiplatform_pkg_aliases( - default_config_setting = None, aliases = { "bar-baz": [ whl_alias( @@ -291,106 +298,8 @@ alias( _tests.append(_test_bzlmod_aliases_with_no_default_version) -def _test_bzlmod_aliases_for_non_root_modules(env): - actual = render_pkg_aliases( - # NOTE @aignas 2024-01-17: if the default X.Y version coincides with the - # versions that are used in the root module, then this would be the same as - # as _test_bzlmod_aliases. - # - # However, if the root module uses a different default version than the - # non-root module, then we will have a no-match-error because the - # default_config_setting is not in the list of the versions in the - # whl_map. - default_config_setting = "//_config:is_python_3.3", - aliases = { - "bar-baz": [ - whl_alias(version = "3.2", repo = "pypi_32_bar_baz"), - 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 - //_config:is_python_3.2 - -To determine the current configuration's Python version, run: - `bazel config ` (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", - "//_config: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", - "//_config: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", - "//_config: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", - "//_config:is_python_3.2": "@pypi_32_bar_baz//:dist_info", - }, - no_match_error = _NO_MATCH_ERROR, - ), -)""" - - env.expect.that_collection(actual.keys()).contains_exactly([want_key]) - env.expect.that_str(actual[want_key]).equals(want_content) - -_tests.append(_test_bzlmod_aliases_for_non_root_modules) - def _test_aliases_are_created_for_all_wheels(env): actual = render_pkg_aliases( - default_config_setting = "//_config:is_python_3.2", aliases = { "bar": [ whl_alias(version = "3.1", repo = "pypi_31_bar"), @@ -414,7 +323,6 @@ _tests.append(_test_aliases_are_created_for_all_wheels) def _test_aliases_with_groups(env): actual = render_pkg_aliases( - default_config_setting = "//_config:is_python_3.2", aliases = { "bar": [ whl_alias(version = "3.1", repo = "pypi_31_bar"), @@ -555,13 +463,12 @@ def _test_config_settings( *, filename, want, + python_version, want_versions = {}, target_platforms = [], glibc_versions = [], muslc_versions = [], - osx_versions = [], - python_version = "", - python_default = True): + osx_versions = []): got, got_default_version_settings = get_filename_config_settings( filename = filename, target_platforms = target_platforms, @@ -569,7 +476,6 @@ def _test_config_settings( muslc_versions = muslc_versions, osx_versions = osx_versions, python_version = python_version, - python_default = python_default, ) env.expect.that_collection(got).contains_exactly(want) env.expect.that_dict(got_default_version_settings).contains_exactly(want_versions) @@ -580,42 +486,21 @@ def _test_sdist(env): _test_config_settings( env, filename = "foo-0.0.1" + ext, - want = [":is_sdist"], + python_version = "3.2", + want = [":is_cp3.2_sdist"], ) ext = ".zip" - _test_config_settings( - env, - filename = "foo-0.0.1" + ext, - target_platforms = [ - "linux_aarch64", - ], - want = [":is_sdist_linux_aarch64"], - ) - - _test_config_settings( - env, - filename = "foo-0.0.1" + ext, - python_version = "3.2", - want = [ - ":is_sdist", - ":is_cp3.2_sdist", - ], - ) - _test_config_settings( env, filename = "foo-0.0.1" + ext, python_version = "3.2", - python_default = True, target_platforms = [ "linux_aarch64", "linux_x86_64", ], want = [ - ":is_sdist_linux_aarch64", ":is_cp3.2_sdist_linux_aarch64", - ":is_sdist_linux_x86_64", ":is_cp3.2_sdist_linux_x86_64", ], ) @@ -623,28 +508,11 @@ def _test_sdist(env): _tests.append(_test_sdist) def _test_py2_py3_none_any(env): - _test_config_settings( - env, - filename = "foo-0.0.1-py2.py3-none-any.whl", - want = [":is_py_none_any"], - ) - - _test_config_settings( - env, - filename = "foo-0.0.1-py2.py3-none-any.whl", - target_platforms = [ - "linux_aarch64", - ], - want = [":is_py_none_any_linux_aarch64"], - ) - _test_config_settings( env, filename = "foo-0.0.1-py2.py3-none-any.whl", python_version = "3.2", - python_default = True, want = [ - ":is_py_none_any", ":is_cp3.2_py_none_any", ], ) @@ -653,13 +521,10 @@ def _test_py2_py3_none_any(env): env, filename = "foo-0.0.1-py2.py3-none-any.whl", python_version = "3.2", - python_default = False, target_platforms = [ "osx_x86_64", ], - want = [ - ":is_cp3.2_py_none_any_osx_x86_64", - ], + want = [":is_cp3.2_py_none_any_osx_x86_64"], ) _tests.append(_test_py2_py3_none_any) @@ -668,14 +533,16 @@ def _test_py3_none_any(env): _test_config_settings( env, filename = "foo-0.0.1-py3-none-any.whl", - want = [":is_py3_none_any"], + python_version = "3.1", + want = [":is_cp3.1_py3_none_any"], ) _test_config_settings( env, filename = "foo-0.0.1-py3-none-any.whl", + python_version = "3.1", target_platforms = ["linux_x86_64"], - want = [":is_py3_none_any_linux_x86_64"], + want = [":is_cp3.1_py3_none_any_linux_x86_64"], ) _tests.append(_test_py3_none_any) @@ -684,19 +551,20 @@ def _test_py3_none_macosx_10_9_universal2(env): _test_config_settings( env, filename = "foo-0.0.1-py3-none-macosx_10_9_universal2.whl", + python_version = "3.1", osx_versions = [ (10, 9), (11, 0), ], want = [], want_versions = { - ":is_py3_none_osx_aarch64_universal2": { - (10, 9): ":is_py3_none_osx_10_9_aarch64_universal2", - (11, 0): ":is_py3_none_osx_11_0_aarch64_universal2", + ":is_cp3.1_py3_none_osx_aarch64_universal2": { + (10, 9): ":is_cp3.1_py3_none_osx_10_9_aarch64_universal2", + (11, 0): ":is_cp3.1_py3_none_osx_11_0_aarch64_universal2", }, - ":is_py3_none_osx_x86_64_universal2": { - (10, 9): ":is_py3_none_osx_10_9_x86_64_universal2", - (11, 0): ":is_py3_none_osx_11_0_x86_64_universal2", + ":is_cp3.1_py3_none_osx_x86_64_universal2": { + (10, 9): ":is_cp3.1_py3_none_osx_10_9_x86_64_universal2", + (11, 0): ":is_cp3.1_py3_none_osx_11_0_x86_64_universal2", }, }, ) @@ -707,20 +575,8 @@ def _test_cp37_abi3_linux_x86_64(env): _test_config_settings( env, filename = "foo-0.0.1-cp37-abi3-linux_x86_64.whl", - want = [ - ":is_cp3x_abi3_linux_x86_64", - ], - ) - - _test_config_settings( - env, - filename = "foo-0.0.1-cp37-abi3-linux_x86_64.whl", - python_version = "3.2", - python_default = True, - want = [ - ":is_cp3x_abi3_linux_x86_64", - ":is_cp3.2_cp3x_abi3_linux_x86_64", - ], + python_version = "3.7", + want = [":is_cp3.7_cp3x_abi3_linux_x86_64"], ) _tests.append(_test_cp37_abi3_linux_x86_64) @@ -729,9 +585,8 @@ def _test_cp37_abi3_windows_x86_64(env): _test_config_settings( env, filename = "foo-0.0.1-cp37-abi3-windows_x86_64.whl", - want = [ - ":is_cp3x_abi3_windows_x86_64", - ], + python_version = "3.7", + want = [":is_cp3.7_cp3x_abi3_windows_x86_64"], ) _tests.append(_test_cp37_abi3_windows_x86_64) @@ -740,6 +595,7 @@ def _test_cp37_abi3_manylinux_2_17_x86_64(env): _test_config_settings( env, filename = "foo-0.0.1-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", + python_version = "3.7", glibc_versions = [ (2, 16), (2, 17), @@ -747,9 +603,9 @@ def _test_cp37_abi3_manylinux_2_17_x86_64(env): ], want = [], want_versions = { - ":is_cp3x_abi3_manylinux_x86_64": { - (2, 17): ":is_cp3x_abi3_manylinux_2_17_x86_64", - (2, 18): ":is_cp3x_abi3_manylinux_2_18_x86_64", + ":is_cp3.7_cp3x_abi3_manylinux_x86_64": { + (2, 17): ":is_cp3.7_cp3x_abi3_manylinux_2_17_x86_64", + (2, 18): ":is_cp3.7_cp3x_abi3_manylinux_2_18_x86_64", }, }, ) @@ -761,6 +617,7 @@ def _test_cp37_abi3_manylinux_2_17_musllinux_1_1_aarch64(env): _test_config_settings( env, filename = "foo-0.0.1-cp37-cp37-manylinux_2_17_arm64.musllinux_1_1_arm64.whl", + python_version = "3.7", glibc_versions = [ (2, 16), (2, 17), @@ -771,12 +628,12 @@ def _test_cp37_abi3_manylinux_2_17_musllinux_1_1_aarch64(env): ], want = [], want_versions = { - ":is_cp3x_cp_manylinux_aarch64": { - (2, 17): ":is_cp3x_cp_manylinux_2_17_aarch64", - (2, 18): ":is_cp3x_cp_manylinux_2_18_aarch64", + ":is_cp3.7_cp3x_cp_manylinux_aarch64": { + (2, 17): ":is_cp3.7_cp3x_cp_manylinux_2_17_aarch64", + (2, 18): ":is_cp3.7_cp3x_cp_manylinux_2_18_aarch64", }, - ":is_cp3x_cp_musllinux_aarch64": { - (1, 1): ":is_cp3x_cp_musllinux_1_1_aarch64", + ":is_cp3.7_cp3x_cp_musllinux_aarch64": { + (1, 1): ":is_cp3.7_cp3x_cp_musllinux_1_1_aarch64", }, }, ) @@ -785,7 +642,7 @@ _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 = [], default_version = None) + got = multiplatform_whl_aliases(aliases = []) env.expect.that_collection(got).contains_exactly([]) _tests.append(_test_multiplatform_whl_aliases_empty) @@ -798,7 +655,7 @@ def _test_multiplatform_whl_aliases_nofilename(env): version = "3.1", ), ] - got = multiplatform_whl_aliases(aliases = aliases, default_version = None) + got = multiplatform_whl_aliases(aliases = aliases) env.expect.that_collection(got).contains_exactly(aliases) _tests.append(_test_multiplatform_whl_aliases_nofilename) @@ -827,7 +684,6 @@ def _test_multiplatform_whl_aliases_filename(env): ] got = multiplatform_whl_aliases( aliases = aliases, - default_version = "3.1", glibc_versions = [], muslc_versions = [], osx_versions = [], @@ -837,9 +693,6 @@ def _test_multiplatform_whl_aliases_filename(env): 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"), - whl_alias(config_setting = "//_config:is_py3_none_any", repo = "foo-py3-0.0.1", version = "3.1"), - whl_alias(config_setting = "//_config:is_py3_none_any_linux_aarch64", repo = "foo-0.0.2", version = "3.1"), - whl_alias(config_setting = "//_config:is_py3_none_any_linux_x86_64", repo = "foo-0.0.2", version = "3.1"), ] env.expect.that_collection(got).contains_exactly(want) @@ -865,7 +718,6 @@ def _test_multiplatform_whl_aliases_filename_versioned(env): ] got = multiplatform_whl_aliases( aliases = aliases, - default_version = None, glibc_versions = [(2, 17), (2, 18)], muslc_versions = [(1, 1), (1, 2)], osx_versions = [], @@ -931,7 +783,6 @@ def _test_config_settings_exist(env): got_aliases = multiplatform_whl_aliases( aliases = aliases, - default_version = None, glibc_versions = kwargs.get("glibc_versions", []), muslc_versions = kwargs.get("muslc_versions", []), osx_versions = kwargs.get("osx_versions", []), diff --git a/tests/python/python_tests.bzl b/tests/python/python_tests.bzl index 101313da4f..40504302d1 100644 --- a/tests/python/python_tests.bzl +++ b/tests/python/python_tests.bzl @@ -14,8 +14,8 @@ "" +load("@pythons_hub//:versions.bzl", "MINOR_MAPPING") load("@rules_testing//lib:test_suite.bzl", "test_suite") -load("//python:versions.bzl", "MINOR_MAPPING") load("//python/private:python.bzl", "parse_modules") # buildifier: disable=bzl-visibility _tests = [] @@ -451,6 +451,7 @@ def _test_add_new_version(env): "url": {"aarch64-unknown-linux-gnu": ["something.org", "else.org"]}, }) env.expect.that_dict(py.config.minor_mapping).contains_exactly({ + "3.12": "3.12.4", # The `minor_mapping` will be overriden only for the missing keys "3.13": "3.13.0", }) env.expect.that_collection(py.toolchains).contains_exactly([ From 30fc3f99b5fa50e0dc99ef0465c0b1ae89fb9212 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 7 Oct 2024 12:22:19 +0900 Subject: [PATCH 231/345] feat(toolchains): expose the //python/config_settings:python_version_major_minor (#2275) With this change the users can simply reuse our internal flag that will correctly report the `X.Y` version in `select` statements. If users previously depended on now removed `is_python_config_setting` now they have an alternative. Followup to #2253 --- CHANGELOG.md | 3 +++ docs/api/rules_python/python/config_settings/index.md | 4 ++++ examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/config_settings.bzl | 2 +- python/private/pypi/config_settings.bzl | 2 +- python/private/pypi/generate_whl_library_build_bazel.bzl | 2 +- tests/config_settings/construct_config_settings_tests.bzl | 6 +++--- .../generate_whl_library_build_bazel_tests.bzl | 6 +++--- 8 files changed, 18 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cad878471c..3077756655 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,9 @@ A brief description of the categories of changes: ### Added * (py_wheel) Now supports `compress = (True|False)` to allow disabling compression to speed up development. +* (toolchains): A public `//python/config_settings:python_version_major_minor` has + been exposed for users to be able to match on the `X.Y` version of a Python + interpreter. ### Removed * Nothing yet diff --git a/docs/api/rules_python/python/config_settings/index.md b/docs/api/rules_python/python/config_settings/index.md index e102baaa5b..645e4e2246 100644 --- a/docs/api/rules_python/python/config_settings/index.md +++ b/docs/api/rules_python/python/config_settings/index.md @@ -10,6 +10,10 @@ Determines the default hermetic Python toolchain version. This can be set to one of the values that `rules_python` maintains. ::: +:::{bzl:target} python_version_major_minor +Parses the value of the `python_version` and transforms it into a `X.Y` value. +::: + ::::{bzl:flag} exec_tools_toolchain Determines if the {obj}`exec_tools_toolchain_type` toolchain is enabled. diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 9a3ededcb8..11e63af6e9 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1231,7 +1231,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "vHagWYWcU/mNBRAz0GLQ3uxZZsgz/7/7i2GEWboxKd0=", + "bzlTransitiveDigest": "SY5Kzq6Z7CG9q0dbCVrOHK8FFnVC6YTXBqGE4ZfNNbo=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6138,7 +6138,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "qRRffSjIlTY99Raninpbkvh1elRwuufP+ZZaGb00rdo=", + "bzlTransitiveDigest": "BLXk2JiegzzGfis5XuIaAVMg5WUUhmsofn99NgeBDEQ=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/python/private/config_settings.bzl b/python/private/config_settings.bzl index eceeb549bd..10b4d686a7 100644 --- a/python/private/config_settings.bzl +++ b/python/private/config_settings.bzl @@ -20,7 +20,7 @@ load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load(":semver.bzl", "semver") _PYTHON_VERSION_FLAG = Label("//python/config_settings:python_version") -_PYTHON_VERSION_MAJOR_MINOR_FLAG = Label("//python/config_settings:_python_version_major_minor") +_PYTHON_VERSION_MAJOR_MINOR_FLAG = Label("//python/config_settings:python_version_major_minor") def construct_config_settings(*, name, default_version, versions, minor_mapping): # buildifier: disable=function-docstring """Create a 'python_version' config flag and construct all config settings used in rules_python. diff --git a/python/private/pypi/config_settings.bzl b/python/private/pypi/config_settings.bzl index 9ccb646a3d..492acf1895 100644 --- a/python/private/pypi/config_settings.bzl +++ b/python/private/pypi/config_settings.bzl @@ -116,7 +116,7 @@ def config_settings( native.config_setting( name = is_python, flag_values = { - Label("//python/config_settings:_python_version_major_minor"): python_version, + Label("//python/config_settings:python_version_major_minor"): python_version, }, visibility = visibility, ) diff --git a/python/private/pypi/generate_whl_library_build_bazel.bzl b/python/private/pypi/generate_whl_library_build_bazel.bzl index 0be6f9c409..934fa00c69 100644 --- a/python/private/pypi/generate_whl_library_build_bazel.bzl +++ b/python/private/pypi/generate_whl_library_build_bazel.bzl @@ -162,7 +162,7 @@ def _render_config_settings(dependencies_by_platform): config_setting( name = "is_{name}", flag_values = {{ - "@rules_python//python/config_settings:_python_version_major_minor": "3.{minor_version}", + "@rules_python//python/config_settings:python_version_major_minor": "3.{minor_version}", }}, constraint_values = {constraint_values}, visibility = ["//visibility:private"], diff --git a/tests/config_settings/construct_config_settings_tests.bzl b/tests/config_settings/construct_config_settings_tests.bzl index 3abedac5eb..087efbbc70 100644 --- a/tests/config_settings/construct_config_settings_tests.bzl +++ b/tests/config_settings/construct_config_settings_tests.bzl @@ -167,7 +167,7 @@ def construct_config_settings_test_suite(name): # buildifier: disable=function- "@platforms//os:" + os, ], flag_values = { - "//python/config_settings:_python_version_major_minor": "3.11", + "//python/config_settings:python_version_major_minor": "3.11", }, ) @@ -178,7 +178,7 @@ def construct_config_settings_test_suite(name): # buildifier: disable=function- "@platforms//cpu:" + cpu, ], flag_values = { - "//python/config_settings:_python_version_major_minor": "3.11", + "//python/config_settings:python_version_major_minor": "3.11", }, ) @@ -198,7 +198,7 @@ def construct_config_settings_test_suite(name): # buildifier: disable=function- "@platforms//os:" + os, ], flag_values = { - "//python/config_settings:_python_version_major_minor": "3.11", + "//python/config_settings:python_version_major_minor": "3.11", }, ) 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 a860681ae9..94530117cd 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 @@ -160,7 +160,7 @@ py_library( config_setting( name = "is_python_3.10_linux_ppc", flag_values = { - "@rules_python//python/config_settings:_python_version_major_minor": "3.10", + "@rules_python//python/config_settings:python_version_major_minor": "3.10", }, constraint_values = [ "@platforms//cpu:ppc", @@ -172,7 +172,7 @@ config_setting( config_setting( name = "is_python_3.9_anyos_aarch64", flag_values = { - "@rules_python//python/config_settings:_python_version_major_minor": "3.9", + "@rules_python//python/config_settings:python_version_major_minor": "3.9", }, constraint_values = ["@platforms//cpu:aarch64"], visibility = ["//visibility:private"], @@ -181,7 +181,7 @@ config_setting( config_setting( name = "is_python_3.9_linux_anyarch", flag_values = { - "@rules_python//python/config_settings:_python_version_major_minor": "3.9", + "@rules_python//python/config_settings:python_version_major_minor": "3.9", }, constraint_values = ["@platforms//os:linux"], visibility = ["//visibility:private"], From d85a3925c5d32783b4ebbd652ce7acda109fa27f Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Mon, 7 Oct 2024 15:03:17 -0700 Subject: [PATCH 232/345] feat: add public API for analysis-phase logic (#2252) This adds a public API for rules (i.e. analysis-phase code) to use code from rules_python. The main motivation for this is so that users can propagate PyInfo without having to know all the fields of PyInfo and implement the merging logic. With upcoming PRs adding additional fields to PyInfo, this becomes much more important. The way the API is exposed is through a target. There are three reasons for this: 1. It avoids loading phase costs when the implementation of the API functions change. Within Google, this makes changes to rules_python much cheaper and easier to submit and revert. This also allows us to worry less about the loading-phase impact of our code. 2. Because a target can have dependencies, it allows us to hide some details from users. For example, if we want a flag to affect behavior, we can add it to the API target's attributes; users don't have to add it to their rule's attributes 3. By having the API take the user's `ctx` as an argument, it allows us to capture it and use it as part of future API calls (this isn't used now, but gives us flexibility in the future). Work towards https://github.com/bazelbuild/rules_python/issues/1647 --- CHANGELOG.md | 2 + docs/BUILD.bazel | 2 + python/BUILD.bazel | 1 + python/api/BUILD.bazel | 31 ++++++++++ python/api/api.bzl | 5 ++ python/private/api/BUILD.bazel | 43 ++++++++++++++ python/private/api/api.bzl | 55 +++++++++++++++++ python/private/api/py_common_api.bzl | 38 ++++++++++++ python/private/py_info.bzl | 13 +++-- tests/api/py_common/BUILD.bazel | 17 ++++++ tests/api/py_common/py_common_tests.bzl | 68 ++++++++++++++++++++++ tests/base_rules/py_info/py_info_tests.bzl | 50 ++++++++++------ 12 files changed, 302 insertions(+), 23 deletions(-) create mode 100644 python/api/BUILD.bazel create mode 100644 python/api/api.bzl create mode 100644 python/private/api/BUILD.bazel create mode 100644 python/private/api/api.bzl create mode 100644 python/private/api/py_common_api.bzl create mode 100644 tests/api/py_common/BUILD.bazel create mode 100644 tests/api/py_common/py_common_tests.bzl diff --git a/CHANGELOG.md b/CHANGELOG.md index 3077756655..d58351a542 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,8 @@ A brief description of the categories of changes: * (toolchains): A public `//python/config_settings:python_version_major_minor` has been exposed for users to be able to match on the `X.Y` version of a Python interpreter. +* (api) Added {obj}`merge_py_infos()` so user rules can merge and propagate + `PyInfo` without losing information. ### Removed * Nothing yet diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index 149e2c57f3..66b6496fc5 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -93,10 +93,12 @@ sphinx_stardocs( "//python:py_runtime_info_bzl", "//python:py_test_bzl", "//python:repositories_bzl", + "//python/api:api_bzl", "//python/cc:py_cc_toolchain_bzl", "//python/cc:py_cc_toolchain_info_bzl", "//python/entry_points:py_console_script_binary_bzl", "//python/private:py_cc_toolchain_rule_bzl", + "//python/private/api:py_common_api_bzl", "//python/private/common:py_binary_rule_bazel_bzl", "//python/private/common:py_library_rule_bazel_bzl", "//python/private/common:py_runtime_rule_bzl", diff --git a/python/BUILD.bazel b/python/BUILD.bazel index 53fb812af6..e64ad8cdb7 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -34,6 +34,7 @@ licenses(["notice"]) filegroup( name = "distribution", srcs = glob(["**"]) + [ + "//python/api:distribution", "//python/cc:distribution", "//python/config_settings:distribution", "//python/constraints:distribution", diff --git a/python/api/BUILD.bazel b/python/api/BUILD.bazel new file mode 100644 index 0000000000..1df6877ef8 --- /dev/null +++ b/python/api/BUILD.bazel @@ -0,0 +1,31 @@ +# 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("@bazel_skylib//:bzl_library.bzl", "bzl_library") + +package( + default_visibility = ["//:__subpackages__"], +) + +bzl_library( + name = "api_bzl", + srcs = ["api.bzl"], + visibility = ["//visibility:public"], + deps = ["//python/private/api:api_bzl"], +) + +filegroup( + name = "distribution", + srcs = glob(["**"]), +) diff --git a/python/api/api.bzl b/python/api/api.bzl new file mode 100644 index 0000000000..c8fb921c12 --- /dev/null +++ b/python/api/api.bzl @@ -0,0 +1,5 @@ +"""Public, analysis phase APIs for Python rules.""" + +load("//python/private/api:api.bzl", _py_common = "py_common") + +py_common = _py_common diff --git a/python/private/api/BUILD.bazel b/python/private/api/BUILD.bazel new file mode 100644 index 0000000000..9e97dc2b59 --- /dev/null +++ b/python/private/api/BUILD.bazel @@ -0,0 +1,43 @@ +# 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("@bazel_skylib//:bzl_library.bzl", "bzl_library") +load(":py_common_api.bzl", "py_common_api") + +package( + default_visibility = ["//:__subpackages__"], +) + +py_common_api( + name = "py_common_api", + # NOTE: Not actually public. Implicit dependency of public rules. + visibility = ["//visibility:public"], +) + +bzl_library( + name = "api_bzl", + srcs = ["api.bzl"], + deps = [ + "//python/private:py_info_bzl", + ], +) + +bzl_library( + name = "py_common_api_bzl", + srcs = ["py_common_api.bzl"], + deps = [ + ":api_bzl", + "//python/private:py_info_bzl", + ], +) diff --git a/python/private/api/api.bzl b/python/private/api/api.bzl new file mode 100644 index 0000000000..06fb7294b9 --- /dev/null +++ b/python/private/api/api.bzl @@ -0,0 +1,55 @@ +# 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. +"""Implementation of py_api.""" + +_PY_COMMON_API_LABEL = Label("//python/private/api:py_common_api") + +ApiImplInfo = provider( + doc = "Provider to hold an API implementation", + fields = { + "impl": """ +:type: struct + +The implementation of the API being provided. The object it contains +will depend on the target that is providing the API struct. +""", + }, +) + +def _py_common_get(ctx): + """Get the py_common API instance. + + NOTE: to use this function, the rule must have added `py_common.API_ATTRS` + to its attributes. + + Args: + ctx: {type}`ctx` current rule ctx + + Returns: + {type}`PyCommonApi` + """ + + # A generic provider is used to decouple the API implementations from + # the loading phase of the rules using an implementation. + return ctx.attr._py_common_api[ApiImplInfo].impl + +py_common = struct( + get = _py_common_get, + API_ATTRS = { + "_py_common_api": attr.label( + default = _PY_COMMON_API_LABEL, + providers = [ApiImplInfo], + ), + }, +) diff --git a/python/private/api/py_common_api.bzl b/python/private/api/py_common_api.bzl new file mode 100644 index 0000000000..401b35973e --- /dev/null +++ b/python/private/api/py_common_api.bzl @@ -0,0 +1,38 @@ +# 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. +"""Implementation of py_api.""" + +load("//python/private:py_info.bzl", "PyInfoBuilder") +load("//python/private/api:api.bzl", "ApiImplInfo") + +def _py_common_api_impl(ctx): + _ = ctx # @unused + return [ApiImplInfo(impl = PyCommonApi)] + +py_common_api = rule( + implementation = _py_common_api_impl, + doc = "Rule implementing py_common API.", +) + +def _merge_py_infos(transitive, *, direct = []): + builder = PyInfoBuilder() + builder.merge_all(transitive, direct = direct) + return builder.build() + +# Exposed for doc generation, not directly used. +# buildifier: disable=name-conventions +PyCommonApi = struct( + merge_py_infos = _merge_py_infos, + PyInfoBuilder = PyInfoBuilder, +) diff --git a/python/private/py_info.bzl b/python/private/py_info.bzl index a3e40f2924..97cd50bdcf 100644 --- a/python/private/py_info.bzl +++ b/python/private/py_info.bzl @@ -181,11 +181,16 @@ def _PyInfoBuilder_set_uses_shared_libraries(self, value): self._uses_shared_libraries[0] = value return self -def _PyInfoBuilder_merge(self, *infos): - return self.merge_all(infos) +def _PyInfoBuilder_merge(self, *infos, direct = []): + return self.merge_all(list(infos), direct = direct) -def _PyInfoBuilder_merge_all(self, py_infos): - for info in py_infos: +def _PyInfoBuilder_merge_all(self, transitive, *, direct = []): + for info in direct: + # BuiltinPyInfo doesn't have this field + if hasattr(info, "direct_pyc_files"): + self.direct_pyc_files.add(info.direct_pyc_files) + + for info in direct + transitive: self.imports.add(info.imports) self.merge_has_py2_only_sources(info.has_py2_only_sources) self.merge_has_py3_only_sources(info.has_py3_only_sources) diff --git a/tests/api/py_common/BUILD.bazel b/tests/api/py_common/BUILD.bazel new file mode 100644 index 0000000000..09300370d3 --- /dev/null +++ b/tests/api/py_common/BUILD.bazel @@ -0,0 +1,17 @@ +# 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(":py_common_tests.bzl", "py_common_test_suite") + +py_common_test_suite(name = "py_common_tests") diff --git a/tests/api/py_common/py_common_tests.bzl b/tests/api/py_common/py_common_tests.bzl new file mode 100644 index 0000000000..572028b2a6 --- /dev/null +++ b/tests/api/py_common/py_common_tests.bzl @@ -0,0 +1,68 @@ +# 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. +"""py_common tests.""" + +load("@rules_python_internal//:rules_python_config.bzl", "config") +load("@rules_testing//lib:analysis_test.bzl", "analysis_test") +load("@rules_testing//lib:test_suite.bzl", "test_suite") +load("@rules_testing//lib:util.bzl", rt_util = "util") +load("//python/api:api.bzl", _py_common = "py_common") +load("//tests/support:py_info_subject.bzl", "py_info_subject") + +_tests = [] + +def _test_merge_py_infos(name): + rt_util.helper_target( + native.filegroup, + name = name + "_subject", + srcs = ["f1.py", "f1.pyc", "f2.py", "f2.pyc"], + ) + analysis_test( + name = name, + impl = _test_merge_py_infos_impl, + target = name + "_subject", + attrs = _py_common.API_ATTRS, + ) + +def _test_merge_py_infos_impl(env, target): + f1_py, f1_pyc, f2_py, f2_pyc = target[DefaultInfo].files.to_list() + + py_common = _py_common.get(env.ctx) + + py1 = py_common.PyInfoBuilder() + if config.enable_pystar: + py1.direct_pyc_files.add(f1_pyc) + py1.transitive_sources.add(f1_py) + + py2 = py_common.PyInfoBuilder() + if config.enable_pystar: + py1.direct_pyc_files.add(f2_pyc) + py2.transitive_sources.add(f2_py) + + actual = py_info_subject( + py_common.merge_py_infos([py2.build()], direct = [py1.build()]), + meta = env.expect.meta, + ) + + actual.transitive_sources().contains_exactly([f1_py.path, f2_py.path]) + if config.enable_pystar: + actual.direct_pyc_files().contains_exactly([f1_pyc.path, f2_pyc.path]) + +_tests.append(_test_merge_py_infos) + +def py_common_test_suite(name): + test_suite( + name = name, + tests = _tests, + ) diff --git a/tests/base_rules/py_info/py_info_tests.bzl b/tests/base_rules/py_info/py_info_tests.bzl index b64263f6ba..97c8e2608d 100644 --- a/tests/base_rules/py_info/py_info_tests.bzl +++ b/tests/base_rules/py_info/py_info_tests.bzl @@ -111,30 +111,25 @@ def _test_py_info_builder(name): name = name + "_misc", srcs = ["trans.py", "direct.pyc", "trans.pyc"], ) - rt_util.helper_target( - provide_py_info, - name = name + "_py1", - transitive_sources = ["py1-trans.py"], - direct_pyc_files = ["py1-direct-pyc.pyc"], - imports = ["py1import"], - transitive_pyc_files = ["py1-trans.pyc"], - ) - rt_util.helper_target( - provide_py_info, - name = name + "_py2", - transitive_sources = ["py2-trans.py"], - direct_pyc_files = ["py2-direct.pyc"], - imports = ["py2import"], - transitive_pyc_files = ["py2-trans.pyc"], - ) + + py_info_targets = {} + for n in range(1, 7): + py_info_name = "{}_py{}".format(name, n) + py_info_targets["py{}".format(n)] = py_info_name + rt_util.helper_target( + provide_py_info, + name = py_info_name, + transitive_sources = ["py{}-trans.py".format(n)], + direct_pyc_files = ["py{}-direct.pyc".format(n)], + imports = ["py{}import".format(n)], + transitive_pyc_files = ["py{}-trans.pyc".format(n)], + ) analysis_test( name = name, impl = _test_py_info_builder_impl, targets = { "misc": name + "_misc", - "py1": name + "_py1", - "py2": name + "_py2", - }, + } | py_info_targets, ) def _test_py_info_builder_impl(env, targets): @@ -151,6 +146,9 @@ def _test_py_info_builder_impl(env, targets): builder.merge_target(targets.py1) builder.merge_targets([targets.py2]) + builder.merge(targets.py3[PyInfo], direct = [targets.py4[PyInfo]]) + builder.merge_all([targets.py5[PyInfo]], direct = [targets.py6[PyInfo]]) + def check(actual): subject = py_info_subject(actual, meta = env.expect.meta) @@ -162,20 +160,34 @@ def _test_py_info_builder_impl(env, targets): "tests/base_rules/py_info/trans.py", "tests/base_rules/py_info/py1-trans.py", "tests/base_rules/py_info/py2-trans.py", + "tests/base_rules/py_info/py3-trans.py", + "tests/base_rules/py_info/py4-trans.py", + "tests/base_rules/py_info/py5-trans.py", + "tests/base_rules/py_info/py6-trans.py", ]) subject.imports().contains_exactly([ "import-path", "py1import", "py2import", + "py3import", + "py4import", + "py5import", + "py6import", ]) if hasattr(actual, "direct_pyc_files"): subject.direct_pyc_files().contains_exactly([ "tests/base_rules/py_info/direct.pyc", + "tests/base_rules/py_info/py4-direct.pyc", + "tests/base_rules/py_info/py6-direct.pyc", ]) subject.transitive_pyc_files().contains_exactly([ "tests/base_rules/py_info/trans.pyc", "tests/base_rules/py_info/py1-trans.pyc", "tests/base_rules/py_info/py2-trans.pyc", + "tests/base_rules/py_info/py3-trans.pyc", + "tests/base_rules/py_info/py4-trans.pyc", + "tests/base_rules/py_info/py5-trans.pyc", + "tests/base_rules/py_info/py6-trans.pyc", ]) check(builder.build()) From a2773de53c02ccaf242ed52f706a08a7f61b9186 Mon Sep 17 00:00:00 2001 From: kcon-stackav <168012427+kcon-stackav@users.noreply.github.com> Date: Mon, 7 Oct 2024 19:33:26 -0700 Subject: [PATCH 233/345] fix(py_wheel): Quote wheel RECORD file entry elements if needed (#2269) The `RECORD` file written when wheels are patched using `pip.override()` is not quoting filenames as needed, so wheels that (unfortunately) include files whose name contain commas would be written in such a way that https://pypi.org/project/installer/ would fail to parse them, resulting in an error like: ``` installer.records.InvalidRecordEntry: Row Index 360: expected 3 elements, got 5 ``` This PR fixes that by using `csv` to read and write `RECORD` file entries which takes care of quoting elements of record entries as needed. See PEP376 for more info about the `RECORD` file format here: https://peps.python.org/pep-0376/#record Fixes #2261 --- CHANGELOG.md | 2 ++ examples/wheel/lib/BUILD.bazel | 11 +++++++- examples/wheel/wheel_test.py | 19 ++++++++----- python/private/pypi/repack_whl.py | 5 ++-- .../whl_filegroup/extract_wheel_files.py | 6 ++--- .../whl_filegroup/extract_wheel_files_test.py | 13 +++++++-- tools/wheelmaker.py | 27 +++++++++++++------ 7 files changed, 60 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d58351a542..c850d186ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,8 @@ A brief description of the categories of changes: {attr}`pip.parse.experimental_index_url`. See [#2239](https://github.com/bazelbuild/rules_python/issues/2239). * (whl_filegroup): Provide per default also the `RECORD` file +* (py_wheel): `RECORD` file entry elements are now quoted if necessary when a + wheel is created ### Added * (py_wheel) Now supports `compress = (True|False)` to allow disabling diff --git a/examples/wheel/lib/BUILD.bazel b/examples/wheel/lib/BUILD.bazel index 3b59662745..755818daa1 100644 --- a/examples/wheel/lib/BUILD.bazel +++ b/examples/wheel/lib/BUILD.bazel @@ -26,7 +26,10 @@ py_library( py_library( name = "module_with_data", srcs = ["module_with_data.py"], - data = [":data.txt"], + data = [ + "data,with,commas.txt", + ":data.txt", + ], ) genrule( @@ -34,3 +37,9 @@ genrule( outs = ["data.txt"], cmd = "echo foo bar baz > $@", ) + +genrule( + name = "make_data_with_commas_in_name", + outs = ["data,with,commas.txt"], + cmd = "echo foo bar baz > $@", +) diff --git a/examples/wheel/wheel_test.py b/examples/wheel/wheel_test.py index 72124232bf..4494ee170d 100644 --- a/examples/wheel/wheel_test.py +++ b/examples/wheel/wheel_test.py @@ -95,6 +95,7 @@ def test_py_package_wheel(self): self.assertEqual( zf.namelist(), [ + "examples/wheel/lib/data,with,commas.txt", "examples/wheel/lib/data.txt", "examples/wheel/lib/module_with_data.py", "examples/wheel/lib/simple_module.py", @@ -105,7 +106,7 @@ def test_py_package_wheel(self): ], ) self.assertFileSha256Equal( - filename, "b4815a1d3a17cc6a5ce717ed42b940fa7788cb5168f5c1de02f5f50abed7083e" + filename, "82370bf61310e2d3c7b1218368457dc7e161bf5dc1a280d7d45102b5e56acf43" ) def test_customized_wheel(self): @@ -117,6 +118,7 @@ def test_customized_wheel(self): self.assertEqual( zf.namelist(), [ + "examples/wheel/lib/data,with,commas.txt", "examples/wheel/lib/data.txt", "examples/wheel/lib/module_with_data.py", "examples/wheel/lib/simple_module.py", @@ -140,6 +142,7 @@ def test_customized_wheel(self): record_contents, # The entries are guaranteed to be sorted. b"""\ +"examples/wheel/lib/data,with,commas.txt",sha256=9vJKEdfLu8bZRArKLroPZJh1XKkK3qFMXiM79MBL2Sg,12 examples/wheel/lib/data.txt,sha256=9vJKEdfLu8bZRArKLroPZJh1XKkK3qFMXiM79MBL2Sg,12 examples/wheel/lib/module_with_data.py,sha256=8s0Khhcqz3yVsBKv2IB5u4l4TMKh7-c_V6p65WVHPms,637 examples/wheel/lib/simple_module.py,sha256=z2hwciab_XPNIBNH8B1Q5fYgnJvQTeYf0ZQJpY8yLLY,637 @@ -194,7 +197,7 @@ def test_customized_wheel(self): second = second.main:s""", ) self.assertFileSha256Equal( - filename, "27f3038be6e768d28735441a1bc567eca2213bd3568d18b22a414e6399a2d48e" + filename, "706e8dd45884d8cb26e92869f7d29ab7ed9f683b4e2d08f06c03dbdaa12191b8" ) def test_filename_escaping(self): @@ -205,6 +208,7 @@ def test_filename_escaping(self): self.assertEqual( zf.namelist(), [ + "examples/wheel/lib/data,with,commas.txt", "examples/wheel/lib/data.txt", "examples/wheel/lib/module_with_data.py", "examples/wheel/lib/simple_module.py", @@ -241,6 +245,7 @@ def test_custom_package_root_wheel(self): self.assertEqual( zf.namelist(), [ + "wheel/lib/data,with,commas.txt", "wheel/lib/data.txt", "wheel/lib/module_with_data.py", "wheel/lib/simple_module.py", @@ -260,7 +265,7 @@ def test_custom_package_root_wheel(self): for line in record_contents.splitlines(): self.assertFalse(line.startswith("/")) self.assertFileSha256Equal( - filename, "f034b3278781f4df32a33df70d794bb94170b450e477c8bd9cd42d2d922476ae" + filename, "568922541703f6edf4b090a8413991f9fa625df2844e644dd30bdbe9deb660be" ) def test_custom_package_root_multi_prefix_wheel(self): @@ -273,6 +278,7 @@ def test_custom_package_root_multi_prefix_wheel(self): self.assertEqual( zf.namelist(), [ + "data,with,commas.txt", "data.txt", "module_with_data.py", "simple_module.py", @@ -291,7 +297,7 @@ def test_custom_package_root_multi_prefix_wheel(self): for line in record_contents.splitlines(): self.assertFalse(line.startswith("/")) self.assertFileSha256Equal( - filename, "ff19f5e4540948247742716338bb4194d619cb56df409045d1a99f265ce8e36c" + filename, "a8b91ce9d6f570e97b40a357a292a6f595d3470f07c479cb08550257cc9c8306" ) def test_custom_package_root_multi_prefix_reverse_order_wheel(self): @@ -304,6 +310,7 @@ def test_custom_package_root_multi_prefix_reverse_order_wheel(self): self.assertEqual( zf.namelist(), [ + "lib/data,with,commas.txt", "lib/data.txt", "lib/module_with_data.py", "lib/simple_module.py", @@ -322,7 +329,7 @@ def test_custom_package_root_multi_prefix_reverse_order_wheel(self): for line in record_contents.splitlines(): self.assertFalse(line.startswith("/")) self.assertFileSha256Equal( - filename, "4331e378ea8b8148409ae7c02177e4eb24d151a85ef937bb44b79ff5258d634b" + filename, "8f44e940731757c186079a42cfe7ea3d43cd96b526e3fb2ca2a3ea3048a9d489" ) def test_python_requires_wheel(self): @@ -347,7 +354,7 @@ def test_python_requires_wheel(self): """, ) self.assertFileSha256Equal( - filename, "b34676828f93da8cd898d50dcd4f36e02fe273150e213aacb999310a05f5f38c" + filename, "ba32493f5e43e481346384aaab9e8fa09c23884276ad057c5f432096a0350101" ) def test_python_abi3_binary_wheel(self): diff --git a/python/private/pypi/repack_whl.py b/python/private/pypi/repack_whl.py index 9052ac39c6..519631f272 100644 --- a/python/private/pypi/repack_whl.py +++ b/python/private/pypi/repack_whl.py @@ -22,6 +22,7 @@ from __future__ import annotations import argparse +import csv import difflib import logging import pathlib @@ -65,8 +66,8 @@ def _files_to_pack(dir: pathlib.Path, want_record: str) -> list[pathlib.Path]: # First get existing files by using the RECORD file got_files = [] got_distinfos = [] - for line in want_record.splitlines(): - rec, _, _ = line.partition(",") + for row in csv.reader(want_record.splitlines()): + rec = row[0] path = dir / rec if not path.exists(): diff --git a/python/private/whl_filegroup/extract_wheel_files.py b/python/private/whl_filegroup/extract_wheel_files.py index 01d0bc6c9e..5b799c9fbb 100644 --- a/python/private/whl_filegroup/extract_wheel_files.py +++ b/python/private/whl_filegroup/extract_wheel_files.py @@ -1,5 +1,6 @@ """Extract files from a wheel's RECORD.""" +import csv import re import sys import zipfile @@ -20,10 +21,7 @@ def get_record(whl_path: Path) -> WhlRecord: except ValueError: raise RuntimeError(f"{whl_path} doesn't contain exactly one .dist-info/RECORD") record_lines = zipf.read(record_file).decode().splitlines() - return ( - line.split(",")[0] - for line in record_lines - ) + return (row[0] for row in csv.reader(record_lines)) def get_files(whl_record: WhlRecord, regex_pattern: str) -> list[str]: diff --git a/tests/whl_filegroup/extract_wheel_files_test.py b/tests/whl_filegroup/extract_wheel_files_test.py index 387e56cde3..434899d5cf 100644 --- a/tests/whl_filegroup/extract_wheel_files_test.py +++ b/tests/whl_filegroup/extract_wheel_files_test.py @@ -11,6 +11,7 @@ class WheelRecordTest(unittest.TestCase): def test_get_wheel_record(self) -> None: record = extract_wheel_files.get_record(_WHEEL) expected = ( + "examples/wheel/lib/data,with,commas.txt", "examples/wheel/lib/data.txt", "examples/wheel/lib/module_with_data.py", "examples/wheel/lib/simple_module.py", @@ -26,11 +27,19 @@ def test_get_files(self) -> None: pattern = "(examples/wheel/lib/.*\.txt$|.*main)" record = extract_wheel_files.get_record(_WHEEL) files = extract_wheel_files.get_files(record, pattern) - expected = ["examples/wheel/lib/data.txt", "examples/wheel/main.py"] + expected = [ + "examples/wheel/lib/data,with,commas.txt", + "examples/wheel/lib/data.txt", + "examples/wheel/main.py", + ] self.assertEqual(files, expected) def test_extract(self) -> None: - files = {"examples/wheel/lib/data.txt", "examples/wheel/main.py"} + files = { + "examples/wheel/lib/data,with,commas.txt", + "examples/wheel/lib/data.txt", + "examples/wheel/main.py", + } with tempfile.TemporaryDirectory() as tmpdir: outdir = Path(tmpdir) extract_wheel_files.extract_files(_WHEEL, files, outdir) diff --git a/tools/wheelmaker.py b/tools/wheelmaker.py index db287ebaee..23b18eca5f 100644 --- a/tools/wheelmaker.py +++ b/tools/wheelmaker.py @@ -16,7 +16,9 @@ import argparse import base64 +import csv import hashlib +import io import os import re import stat @@ -208,14 +210,23 @@ def add_recordfile(self): """Write RECORD file to the distribution.""" record_path = self.distinfo_path("RECORD") entries = self._record + [(record_path, b"", b"")] - contents = b"" - for filename, digest, size in entries: - if isinstance(filename, str): - filename = filename.lstrip("/").encode("utf-8", "surrogateescape") - contents += b"%s,%s,%s\n" % (filename, digest, size) - - self.add_string(record_path, contents) - return contents + with io.StringIO() as contents_io: + writer = csv.writer(contents_io, lineterminator="\n") + for filename, digest, size in entries: + if isinstance(filename, str): + filename = filename.lstrip("/") + writer.writerow( + ( + c + if isinstance(c, str) + else c.decode("utf-8", "surrogateescape") + for c in (filename, digest, size) + ) + ) + + contents = contents_io.getvalue() + self.add_string(record_path, contents) + return contents.encode("utf-8", "surrogateescape") class WheelMaker(object): From 84ff5777421c336f1cf1329a3ff0a5754b5bbf47 Mon Sep 17 00:00:00 2001 From: Ivo List Date: Tue, 8 Oct 2024 20:01:39 +0200 Subject: [PATCH 234/345] chore: support removal of builtin providers (#2274) The builtin providers PyInfo, PyRuntimeInfo, and PyCcLinkParamsProvider are being removed, which means Bazel throws an error while compiling bzl files if there is a reference to a top-level symbol that doesn't exist anymore. For backwards compatibility, rules_python consumes/produces these providers, so the symbols are used in various places. To fix, use `native.legacy_globals` and Bazel version detection to conditionally emit the symbols into `@rules_python_internal`. If they aren't present, they are reported as None. This mimics equivalent functionality in bazel_features; bazel_features isn't used because it would require users to update their WORKSPACE to initialize some dependencies before rules_python can perform its initialization. Removal of the builtin symbols is controlled by `--incompatible_autoload_externally` (which is in Bazel 8 and has been cherry-picked into earlier version). If the flag is enabled with "@rules_python" or "-@rules_python" the providers are removed from Bazel. --------- Co-authored-by: Richard Levasseur --- python/config_settings/transition.bzl | 4 ++-- python/private/BUILD.bazel | 5 ++++- python/private/common/attributes.bzl | 5 +++-- python/private/common/common.bzl | 8 ++++---- python/private/common/py_executable.bzl | 5 +++-- python/private/common/py_library.bzl | 6 ++++-- python/private/common/py_runtime_rule.bzl | 14 ++++++++------ python/private/internal_config_repo.bzl | 15 +++++++++++++++ python/private/py_info.bzl | 7 +++++-- python/private/py_runtime_pair_rule.bzl | 8 +++++--- python/private/reexports.bzl | 11 ++++++----- python/py_cc_link_params_info.bzl | 6 +++++- python/py_info.bzl | 2 +- tests/base_rules/py_executable_base_tests.bzl | 10 +++++----- tests/base_rules/py_info/py_info_tests.bzl | 3 ++- 15 files changed, 72 insertions(+), 37 deletions(-) diff --git a/python/config_settings/transition.bzl b/python/config_settings/transition.bzl index 7ac41f881f..a7646dcda3 100644 --- a/python/config_settings/transition.bzl +++ b/python/config_settings/transition.bzl @@ -101,12 +101,12 @@ def _transition_py_impl(ctx): ] if PyInfo in target: providers.append(target[PyInfo]) - if BuiltinPyInfo in target and PyInfo != BuiltinPyInfo: + if BuiltinPyInfo != None and BuiltinPyInfo in target and PyInfo != BuiltinPyInfo: providers.append(target[BuiltinPyInfo]) if PyRuntimeInfo in target: providers.append(target[PyRuntimeInfo]) - if BuiltinPyRuntimeInfo in target and PyRuntimeInfo != BuiltinPyRuntimeInfo: + if BuiltinPyRuntimeInfo != None and BuiltinPyRuntimeInfo in target and PyRuntimeInfo != BuiltinPyRuntimeInfo: providers.append(target[BuiltinPyRuntimeInfo]) return providers diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index cb0fd5ca02..b4084fb7f4 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -344,7 +344,10 @@ bzl_library( visibility = [ "//:__subpackages__", ], - deps = [":bazel_tools_bzl"], + deps = [ + ":bazel_tools_bzl", + "@rules_python_internal//:rules_python_config_bzl", + ], ) bzl_library( diff --git a/python/private/common/attributes.bzl b/python/private/common/attributes.bzl index 5e81f4698e..0299e85657 100644 --- a/python/private/common/attributes.bzl +++ b/python/private/common/attributes.bzl @@ -253,6 +253,8 @@ COMMON_ATTRS = union_attrs( allow_none = True, ) +_MaybeBuiltinPyInfo = [[BuiltinPyInfo]] if BuiltinPyInfo != None else [] + # Attributes common to rules accepting Python sources and deps. PY_SRCS_ATTRS = union_attrs( { @@ -260,8 +262,7 @@ PY_SRCS_ATTRS = union_attrs( providers = [ [PyInfo], [CcInfo], - [BuiltinPyInfo], - ], + ] + _MaybeBuiltinPyInfo, # TODO(b/228692666): Google-specific; remove these allowances once # the depot is cleaned up. allow_rules = DEPS_ATTR_ALLOW_RULES, diff --git a/python/private/common/common.bzl b/python/private/common/common.bzl index e4cc254654..99a632484d 100644 --- a/python/private/common/common.bzl +++ b/python/private/common/common.bzl @@ -280,7 +280,7 @@ def collect_imports(ctx, semantics): dep[BuiltinPyInfo].imports for dep in ctx.attr.deps if BuiltinPyInfo in dep - ]) + ] if BuiltinPyInfo != None else []) def collect_runfiles(ctx, files = depset()): """Collects the necessary files from the rule's context. @@ -374,7 +374,7 @@ def create_py_info(ctx, *, direct_sources, direct_pyc_files, imports): for target in ctx.attr.deps: # PyInfo may not be present e.g. cc_library rules. - if PyInfo in target or BuiltinPyInfo in target: + if PyInfo in target or (BuiltinPyInfo != None and BuiltinPyInfo in target): py_info.merge(_get_py_info(target)) else: # TODO(b/228692666): Remove this once non-PyInfo targets are no @@ -395,7 +395,7 @@ def create_py_info(ctx, *, direct_sources, direct_pyc_files, imports): for target in ctx.attr.data: # TODO(b/234730058): Remove checking for PyInfo in data once depot # cleaned up. - if PyInfo in target or BuiltinPyInfo in target: + if PyInfo in target or (BuiltinPyInfo != None and BuiltinPyInfo in target): info = _get_py_info(target) py_info.merge_uses_shared_libraries(info.uses_shared_libraries) else: @@ -410,7 +410,7 @@ def create_py_info(ctx, *, direct_sources, direct_pyc_files, imports): return py_info.build(), deps_transitive_sources, py_info.build_builtin_py_info() def _get_py_info(target): - return target[PyInfo] if PyInfo in target else target[BuiltinPyInfo] + return target[PyInfo] if PyInfo in target or BuiltinPyInfo == None else target[BuiltinPyInfo] def create_instrumented_files_info(ctx): return _coverage_common.instrumented_files_info( diff --git a/python/private/common/py_executable.bzl b/python/private/common/py_executable.bzl index 1d14344d4e..cfd9961606 100644 --- a/python/private/common/py_executable.bzl +++ b/python/private/common/py_executable.bzl @@ -855,7 +855,7 @@ def _create_providers( # builtin py_runtime rule or defined their own. We can't directly detect # the type of the provider object, but the rules_python PyRuntimeInfo # object has an extra attribute that the builtin one doesn't. - if hasattr(py_runtime_info, "interpreter_version_info"): + if hasattr(py_runtime_info, "interpreter_version_info") and BuiltinPyRuntimeInfo != None: providers.append(BuiltinPyRuntimeInfo( interpreter_path = py_runtime_info.interpreter_path, interpreter = py_runtime_info.interpreter, @@ -890,7 +890,8 @@ def _create_providers( ) providers.append(py_info) - providers.append(builtin_py_info) + if builtin_py_info: + providers.append(builtin_py_info) providers.append(create_output_group_info(py_info.transitive_sources, output_groups)) extra_providers = semantics.get_extra_providers( diff --git a/python/private/common/py_library.bzl b/python/private/common/py_library.bzl index 4423986e1b..078626e063 100644 --- a/python/private/common/py_library.bzl +++ b/python/private/common/py_library.bzl @@ -98,14 +98,16 @@ def py_library_impl(ctx, *, semantics): dependency_transitive_python_sources = deps_transitive_sources, ) - return [ + providers = [ DefaultInfo(files = default_outputs, runfiles = runfiles), py_info, - builtins_py_info, create_instrumented_files_info(ctx), PyCcLinkParamsProvider(cc_info = cc_info), create_output_group_info(py_info.transitive_sources, extra_groups = {}), ] + if builtins_py_info: + providers.append(builtins_py_info) + return providers _DEFAULT_PY_LIBRARY_DOC = """ A library of Python code that can be depended upon. diff --git a/python/private/common/py_runtime_rule.bzl b/python/private/common/py_runtime_rule.bzl index d944796118..088b6ead16 100644 --- a/python/private/common/py_runtime_rule.bzl +++ b/python/private/common/py_runtime_rule.bzl @@ -125,18 +125,20 @@ def _py_runtime_impl(ctx): if not IS_BAZEL_7_OR_HIGHER: builtin_py_runtime_info_kwargs.pop("bootstrap_template") - return [ + providers = [ PyRuntimeInfo(**py_runtime_info_kwargs), - # Return the builtin provider for better compatibility. - # 1. There is a legacy code path in py_binary that - # checks for the provider when toolchains aren't used - # 2. It makes it easier to transition from builtins to rules_python - BuiltinPyRuntimeInfo(**builtin_py_runtime_info_kwargs), DefaultInfo( files = runtime_files, runfiles = runfiles, ), ] + if BuiltinPyRuntimeInfo != None and BuiltinPyRuntimeInfo != PyRuntimeInfo: + # Return the builtin provider for better compatibility. + # 1. There is a legacy code path in py_binary that + # checks for the provider when toolchains aren't used + # 2. It makes it easier to transition from builtins to rules_python + providers.append(BuiltinPyRuntimeInfo(**builtin_py_runtime_info_kwargs)) + return providers # Bind to the name "py_runtime" to preserve the kind/rule_class it shows up # as elsewhere. diff --git a/python/private/internal_config_repo.bzl b/python/private/internal_config_repo.bzl index c37bc351cc..e2fa8f6af1 100644 --- a/python/private/internal_config_repo.bzl +++ b/python/private/internal_config_repo.bzl @@ -24,6 +24,9 @@ _ENABLE_PYSTAR_DEFAULT = "1" _CONFIG_TEMPLATE = """\ config = struct( enable_pystar = {enable_pystar}, + BuiltinPyInfo = getattr(getattr(native, "legacy_globals", None), "PyInfo", {builtin_py_info_symbol}), + BuiltinPyRuntimeInfo = getattr(getattr(native, "legacy_globals", None), "PyRuntimeInfo", {builtin_py_runtime_info_symbol}), + BuiltinPyCcLinkParamsProvider = getattr(getattr(native, "legacy_globals", None), "PyCcLinkParamsProvider", {builtin_py_cc_link_params_provider}), ) """ @@ -65,8 +68,20 @@ def _internal_config_repo_impl(rctx): else: enable_pystar = False + if native.bazel_version.startswith("8."): + builtin_py_info_symbol = "None" + builtin_py_runtime_info_symbol = "None" + builtin_py_cc_link_params_provider = "None" + else: + builtin_py_info_symbol = "PyInfo" + builtin_py_runtime_info_symbol = "PyRuntimeInfo" + builtin_py_cc_link_params_provider = "PyCcLinkParamsProvider" + rctx.file("rules_python_config.bzl", _CONFIG_TEMPLATE.format( enable_pystar = enable_pystar, + builtin_py_info_symbol = builtin_py_info_symbol, + builtin_py_runtime_info_symbol = builtin_py_runtime_info_symbol, + builtin_py_cc_link_params_provider = builtin_py_cc_link_params_provider, )) if enable_pystar: diff --git a/python/private/py_info.bzl b/python/private/py_info.bzl index 97cd50bdcf..ce56e2330a 100644 --- a/python/private/py_info.bzl +++ b/python/private/py_info.bzl @@ -118,7 +118,7 @@ This field is currently unused in Bazel and may go away in the future. ) # The "effective" PyInfo is what the canonical //python:py_info.bzl%PyInfo symbol refers to -_EffectivePyInfo = PyInfo if config.enable_pystar else BuiltinPyInfo +_EffectivePyInfo = PyInfo if (config.enable_pystar or BuiltinPyInfo == None) else BuiltinPyInfo def PyInfoBuilder(): # buildifier: disable=uninitialized @@ -206,7 +206,7 @@ def _PyInfoBuilder_merge_all(self, transitive, *, direct = []): def _PyInfoBuilder_merge_target(self, target): if PyInfo in target: self.merge(target[PyInfo]) - elif BuiltinPyInfo in target: + elif BuiltinPyInfo != None and BuiltinPyInfo in target: self.merge(target[BuiltinPyInfo]) return self @@ -234,6 +234,9 @@ def _PyInfoBuilder_build(self): ) def _PyInfoBuilder_build_builtin_py_info(self): + if BuiltinPyInfo == None: + return None + return BuiltinPyInfo( has_py2_only_sources = self._has_py2_only_sources[0], has_py3_only_sources = self._has_py3_only_sources[0], diff --git a/python/private/py_runtime_pair_rule.bzl b/python/private/py_runtime_pair_rule.bzl index eb91413563..39f15bffb4 100644 --- a/python/private/py_runtime_pair_rule.bzl +++ b/python/private/py_runtime_pair_rule.bzl @@ -56,7 +56,7 @@ def _get_py_runtime_info(target): # py_binary (implemented in Java) performs a type check on the provider # value to verify it is an instance of the Java-implemented PyRuntimeInfo # class. - if IS_BAZEL_7_OR_HIGHER and PyRuntimeInfo in target: + if (IS_BAZEL_7_OR_HIGHER and PyRuntimeInfo in target) or BuiltinPyRuntimeInfo == None: return target[PyRuntimeInfo] else: return target[BuiltinPyRuntimeInfo] @@ -70,13 +70,15 @@ def _is_py2_disabled(ctx): return False return ctx.fragments.py.disable_py2 +_MaybeBuiltinPyRuntimeInfo = [[BuiltinPyRuntimeInfo]] if BuiltinPyRuntimeInfo != None else [] + py_runtime_pair = rule( implementation = _py_runtime_pair_impl, attrs = { # The two runtimes are used by the py_binary at runtime, and so need to # be built for the target platform. "py2_runtime": attr.label( - providers = [[PyRuntimeInfo], [BuiltinPyRuntimeInfo]], + providers = [[PyRuntimeInfo]] + _MaybeBuiltinPyRuntimeInfo, cfg = "target", doc = """\ The runtime to use for Python 2 targets. Must have `python_version` set to @@ -84,7 +86,7 @@ The runtime to use for Python 2 targets. Must have `python_version` set to """, ), "py3_runtime": attr.label( - providers = [[PyRuntimeInfo], [BuiltinPyRuntimeInfo]], + providers = [[PyRuntimeInfo]] + _MaybeBuiltinPyRuntimeInfo, cfg = "target", doc = """\ The runtime to use for Python 3 targets. Must have `python_version` set to diff --git a/python/private/reexports.bzl b/python/private/reexports.bzl index ea39ac9f35..e9d2ded33e 100644 --- a/python/private/reexports.bzl +++ b/python/private/reexports.bzl @@ -30,11 +30,12 @@ inaccessible. So instead we access the builtin here and export it under a different name. Then we can load it from elsewhere. """ -# Don't use underscore prefix, since that would make the symbol local to this -# file only. Use a non-conventional name to emphasize that this is not a public -# symbol. +load("@rules_python_internal//:rules_python_config.bzl", "config") + +# NOTE: May be None (Bazel 8 autoloading rules_python) # buildifier: disable=name-conventions -BuiltinPyInfo = PyInfo +BuiltinPyInfo = config.BuiltinPyInfo +# NOTE: May be None (Bazel 8 autoloading rules_python) # buildifier: disable=name-conventions -BuiltinPyRuntimeInfo = PyRuntimeInfo +BuiltinPyRuntimeInfo = config.BuiltinPyRuntimeInfo diff --git a/python/py_cc_link_params_info.bzl b/python/py_cc_link_params_info.bzl index 42d8daf221..b0ad0a79d2 100644 --- a/python/py_cc_link_params_info.bzl +++ b/python/py_cc_link_params_info.bzl @@ -3,4 +3,8 @@ load("@rules_python_internal//:rules_python_config.bzl", "config") load("//python/private/common:providers.bzl", _starlark_PyCcLinkParamsProvider = "PyCcLinkParamsProvider") -PyCcLinkParamsInfo = _starlark_PyCcLinkParamsProvider if config.enable_pystar else PyCcLinkParamsProvider +PyCcLinkParamsInfo = ( + _starlark_PyCcLinkParamsProvider if ( + config.enable_pystar or config.BuiltinPyCcLinkParamsProvider == None + ) else config.BuiltinPyCcLinkParamsProvider +) diff --git a/python/py_info.bzl b/python/py_info.bzl index 52a66a87c2..5697f58419 100644 --- a/python/py_info.bzl +++ b/python/py_info.bzl @@ -18,4 +18,4 @@ load("@rules_python_internal//:rules_python_config.bzl", "config") load("//python/private:py_info.bzl", _starlark_PyInfo = "PyInfo") load("//python/private:reexports.bzl", "BuiltinPyInfo") -PyInfo = _starlark_PyInfo if config.enable_pystar else BuiltinPyInfo +PyInfo = _starlark_PyInfo if config.enable_pystar or BuiltinPyInfo == None else BuiltinPyInfo diff --git a/tests/base_rules/py_executable_base_tests.bzl b/tests/base_rules/py_executable_base_tests.bzl index 873349f289..3cc6dfb702 100644 --- a/tests/base_rules/py_executable_base_tests.bzl +++ b/tests/base_rules/py_executable_base_tests.bzl @@ -19,14 +19,13 @@ load("@rules_testing//lib:analysis_test.bzl", "analysis_test") load("@rules_testing//lib:truth.bzl", "matching") load("@rules_testing//lib:util.bzl", rt_util = "util") load("//python:py_executable_info.bzl", "PyExecutableInfo") +load("//python/private:reexports.bzl", "BuiltinPyRuntimeInfo") # buildifier: disable=bzl-visibility load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") # buildifier: disable=bzl-visibility load("//tests/base_rules:base_tests.bzl", "create_base_tests") load("//tests/base_rules:util.bzl", "WINDOWS_ATTR", pt_util = "util") load("//tests/support:py_executable_info_subject.bzl", "PyExecutableInfoSubject") load("//tests/support:support.bzl", "CC_TOOLCHAIN", "CROSSTOOL_TOP", "LINUX_X86_64", "WINDOWS_X86_64") -_BuiltinPyRuntimeInfo = PyRuntimeInfo - _tests = [] def _test_basic_windows(name, config): @@ -359,9 +358,10 @@ def _test_py_runtime_info_provided_impl(env, target): # Make sure that the rules_python loaded symbol is provided. env.expect.that_target(target).has_provider(RulesPythonPyRuntimeInfo) - # For compatibility during the transition, the builtin PyRuntimeInfo should - # also be provided. - env.expect.that_target(target).has_provider(_BuiltinPyRuntimeInfo) + if BuiltinPyRuntimeInfo != None: + # For compatibility during the transition, the builtin PyRuntimeInfo should + # also be provided. + env.expect.that_target(target).has_provider(BuiltinPyRuntimeInfo) _tests.append(_test_py_runtime_info_provided) diff --git a/tests/base_rules/py_info/py_info_tests.bzl b/tests/base_rules/py_info/py_info_tests.bzl index 97c8e2608d..0f46d12381 100644 --- a/tests/base_rules/py_info/py_info_tests.bzl +++ b/tests/base_rules/py_info/py_info_tests.bzl @@ -191,7 +191,8 @@ def _test_py_info_builder_impl(env, targets): ]) check(builder.build()) - check(builder.build_builtin_py_info()) + if BuiltinPyInfo != None: + check(builder.build_builtin_py_info()) builder.set_has_py2_only_sources(False) builder.set_has_py3_only_sources(False) From ca0b27a2fcb1ff11aae361624ce18bdfd733af53 Mon Sep 17 00:00:00 2001 From: Matt Brown Date: Tue, 8 Oct 2024 19:51:23 -0400 Subject: [PATCH 235/345] fix(whl_library): avoid excessive report_progress() messages (#2280) With the current behavior, we see really long progress messages in the console like ``` Running whl_library.ResolveRequirement(foobar_pip_deps_regex, regex==2023.12.25 --hash=sha256:0694219a1d54336fd0445ea3\ 82d49d36882415c0134ee1e8332afd1529f0baa5 ``` This spams the console and isn't very useful. To fix, only print up to the first white space, which captures the important information (e.g. "regex==2024.12.25") and is brief. Closes https://github.com/bazelbuild/rules_python/issues/2206 --- CHANGELOG.md | 2 ++ examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/whl_library.bzl | 5 ++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c850d186ac..c966ebe5a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,8 @@ A brief description of the categories of changes: * (whl_filegroup): Provide per default also the `RECORD` file * (py_wheel): `RECORD` file entry elements are now quoted if necessary when a wheel is created +* (whl_library) truncate progress messages from the repo rule to better handle + case where a requirement has many `--hash=sha256:...` flags ### Added * (py_wheel) Now supports `compress = (True|False)` to allow disabling diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 11e63af6e9..2ddbe40bc3 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1231,7 +1231,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "SY5Kzq6Z7CG9q0dbCVrOHK8FFnVC6YTXBqGE4ZfNNbo=", + "bzlTransitiveDigest": "kPvx0u6SR68H+8BqqEfxd3NpVZjuMOyzI9Xml01rdrQ=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6138,7 +6138,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "BLXk2JiegzzGfis5XuIaAVMg5WUUhmsofn99NgeBDEQ=", + "bzlTransitiveDigest": "c3OA6iewVGq8nz0o3iI2AtIQhsRZIg/E/PDq2vuAQTw=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/python/private/pypi/whl_library.bzl b/python/private/pypi/whl_library.bzl index 309316b2ee..60e46b3480 100644 --- a/python/private/pypi/whl_library.bzl +++ b/python/private/pypi/whl_library.bzl @@ -244,7 +244,10 @@ def _whl_library_impl(rctx): repo_utils.execute_checked( rctx, - op = op_tmpl.format(name = rctx.attr.name, requirement = rctx.attr.requirement), + # truncate the requirement value when logging it / reporting + # progress since it may contain several ' --hash=sha256:... + # --hash=sha256:...' substrings that fill up the console + op = op_tmpl.format(name = rctx.attr.name, requirement = rctx.attr.requirement.split(" ", 1)[0]), arguments = args, environment = environment, quiet = rctx.attr.quiet, From af3516e11591eab7b48d88febf8fc7f5ac26a7f2 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 9 Oct 2024 01:47:46 -0700 Subject: [PATCH 236/345] docs: clarify that the runtime env toolchains don't provide build info (#2279) This stems after some conversation with a user where they were surprised that building C extensions wasn't working when using the runtime env toolchain. --- .../python/runtime_env_toolchains/index.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/docs/api/rules_python/python/runtime_env_toolchains/index.md b/docs/api/rules_python/python/runtime_env_toolchains/index.md index 7d6e1fbf6e..5ced89bd36 100644 --- a/docs/api/rules_python/python/runtime_env_toolchains/index.md +++ b/docs/api/rules_python/python/runtime_env_toolchains/index.md @@ -7,11 +7,17 @@ ::::{target} all -A set of toolchains that invoke `python3` from the runtime environment. - -Note that this toolchain provides no build-time information, which makes it of -limited utility. This is because the invocation of `python3` is done when a -program is run, not at build time. +A set of toolchains that invoke `python3` from the runtime environment (i.e +after building). + +:::{note} +These toolchains do not provide any build-time information, including but not +limited to the Python version or C headers. As such, they cannot be used +for e.g. precompiling, building Python C extension modules, or anything else +that requires information about the Python runtime at build time. Under the +hood, these simply create a fake "interpreter" that calls `python3` that +built programs use to run themselves. +::: This is only provided to aid migration off the builtin Bazel toolchain (`@bazel_tools//python:autodetecting_toolchain`), and is largely only applicable From bf4978c796f804f13d845a8283893079bc60d00e Mon Sep 17 00:00:00 2001 From: vfdev Date: Wed, 9 Oct 2024 11:53:00 +0200 Subject: [PATCH 237/345] feat(toolchain): add python 3.13.0, updated other versions and bumped coverage to 7.6.1 (#2265) Description: - Added python 3.13.0 toolchain - Updated other versions in the toolchain - Bumped coverage version to 7.6.1 - Updated CHANGELOG.md --- CHANGELOG.md | 10 ++ DEVELOPING.md | 2 + WORKSPACE | 2 +- python/private/coverage_deps.bzl | 94 +++++++++++-------- python/versions.bzl | 87 ++++++++++++++++- .../update_deps/update_coverage_deps.py | 2 +- 6 files changed, 150 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c966ebe5a3..b0807d5c57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,16 @@ A brief description of the categories of changes: interpreter. * (api) Added {obj}`merge_py_infos()` so user rules can merge and propagate `PyInfo` without losing information. +* (toolchains) New Python versions available: 3.13.0 using the [20241008] release. +* (toolchains): Bump default toolchain versions to: + * `3.8 -> 3.8.20` + * `3.9 -> 3.9.20` + * `3.10 -> 3.10.15` + * `3.11 -> 3.11.10` + * `3.12 -> 3.12.7` +[20241008]: https://github.com/indygreg/python-build-standalone/releases/tag/20241008 +* (coverage) Add support for python 3.13 and bump `coverage.py` to 7.6.1. + ### Removed * Nothing yet diff --git a/DEVELOPING.md b/DEVELOPING.md index a70d3b171f..0601be5478 100644 --- a/DEVELOPING.md +++ b/DEVELOPING.md @@ -9,6 +9,8 @@ 1. Bump the coverage dependencies using the script using: ``` bazel run //tools/private/update_deps:update_coverage_deps + # for example: + # bazel run //tools/private/update_deps:update_coverage_deps 7.6.1 ``` ## Releasing diff --git a/WORKSPACE b/WORKSPACE index ba05ec54c5..33ab37f292 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -46,7 +46,7 @@ load("//python:repositories.bzl", "python_register_multi_toolchains") python_register_multi_toolchains( name = "python", - default_version = MINOR_MAPPING.values()[-2], + default_version = MINOR_MAPPING.values()[-3], # Use 3.11.10 # Integration tests verify each version, so register all of them. python_versions = PYTHON_VERSIONS, ) diff --git a/python/private/coverage_deps.bzl b/python/private/coverage_deps.bzl index d69fab9ecd..d3a6d96664 100644 --- a/python/private/coverage_deps.bzl +++ b/python/private/coverage_deps.bzl @@ -23,92 +23,106 @@ load("//python/private:version_label.bzl", "version_label") _coverage_deps = { "cp310": { "aarch64-apple-darwin": ( - "https://files.pythonhosted.org/packages/a3/36/b5ae380c05f58544a40ff36f87fa1d6e45f5c2f299335586aac140c341ce/coverage-7.4.3-cp310-cp310-macosx_11_0_arm64.whl", - "718187eeb9849fc6cc23e0d9b092bc2348821c5e1a901c9f8975df0bc785bfd4", + "https://files.pythonhosted.org/packages/7d/73/041928e434442bd3afde5584bdc3f932fb4562b1597629f537387cec6f3d/coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", + "cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", ), "aarch64-unknown-linux-gnu": ( - "https://files.pythonhosted.org/packages/9e/48/5ae1ccf4601500af0ca36eba0a2c1f1796e58fb7495de6da55ed43e13e5f/coverage-7.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", - "767b35c3a246bcb55b8044fd3a43b8cd553dd1f9f2c1eeb87a302b1f8daa0524", + "https://files.pythonhosted.org/packages/c7/c8/6ca52b5147828e45ad0242388477fdb90df2c6cbb9a441701a12b3c71bc8/coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", ), "x86_64-apple-darwin": ( - "https://files.pythonhosted.org/packages/50/5a/d727fcd2e0fc3aba61591b6f0fe1e87865ea9b6275f58f35810d6f85b05b/coverage-7.4.3-cp310-cp310-macosx_10_9_x86_64.whl", - "8580b827d4746d47294c0e0b92854c85a92c2227927433998f0d3320ae8a71b6", + "https://files.pythonhosted.org/packages/7e/61/eb7ce5ed62bacf21beca4937a90fe32545c91a3c8a42a30c6616d48fc70d/coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", + "b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", ), "x86_64-unknown-linux-gnu": ( - "https://files.pythonhosted.org/packages/23/0a/ab5b0f6d6b24f7156624e7697ec7ab49f9d5cdac922da90d9927ae5de1cf/coverage-7.4.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "ba3a8aaed13770e970b3df46980cb068d1c24af1a1968b7818b69af8c4347efb", + "https://files.pythonhosted.org/packages/53/23/9e2c114d0178abc42b6d8d5281f651a8e6519abfa0ef460a00a91f80879d/coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", ), }, "cp311": { "aarch64-apple-darwin": ( - "https://files.pythonhosted.org/packages/f8/a1/161102d2e26fde2d878d68cc1ed303758dc7b01ee14cc6aa70f5fd1b910d/coverage-7.4.3-cp311-cp311-macosx_11_0_arm64.whl", - "489763b2d037b164846ebac0cbd368b8a4ca56385c4090807ff9fad817de4113", + "https://files.pythonhosted.org/packages/e1/0e/e52332389e057daa2e03be1fbfef25bb4d626b37d12ed42ae6281d0a274c/coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", + "ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", ), "aarch64-unknown-linux-gnu": ( - "https://files.pythonhosted.org/packages/a7/af/1510df1132a68ca876013c0417ca46836252e43871d2623b489e4339c980/coverage-7.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", - "451f433ad901b3bb00184d83fd83d135fb682d780b38af7944c9faeecb1e0bfe", + "https://files.pythonhosted.org/packages/aa/cd/766b45fb6e090f20f8927d9c7cb34237d41c73a939358bc881883fd3a40d/coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", ), "x86_64-apple-darwin": ( - "https://files.pythonhosted.org/packages/ca/77/f17a5b199e8ca0443ace312f7e07ff3e4e7ba7d7c52847567d6f1edb22a7/coverage-7.4.3-cp311-cp311-macosx_10_9_x86_64.whl", - "cbbe5e739d45a52f3200a771c6d2c7acf89eb2524890a4a3aa1a7fa0695d2a47", + "https://files.pythonhosted.org/packages/ad/5f/67af7d60d7e8ce61a4e2ddcd1bd5fb787180c8d0ae0fbd073f903b3dd95d/coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", + "7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", ), "x86_64-unknown-linux-gnu": ( - "https://files.pythonhosted.org/packages/a9/1a/e2120233177b3e2ea9dcfd49a050748060166c74792b2b1db4a803307da4/coverage-7.4.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "b3ec74cfef2d985e145baae90d9b1b32f85e1741b04cd967aaf9cfa84c1334f3", + "https://files.pythonhosted.org/packages/14/6f/8351b465febb4dbc1ca9929505202db909c5a635c6fdf33e089bbc3d7d85/coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", ), }, "cp312": { "aarch64-apple-darwin": ( - "https://files.pythonhosted.org/packages/9d/d8/111ec1a65fef57ad2e31445af627d481f660d4a9218ee5c774b45187812a/coverage-7.4.3-cp312-cp312-macosx_11_0_arm64.whl", - "d6cdecaedea1ea9e033d8adf6a0ab11107b49571bbb9737175444cea6eb72328", + "https://files.pythonhosted.org/packages/e1/ab/6bf00de5327ecb8db205f9ae596885417a31535eeda6e7b99463108782e1/coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", + "5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", ), "aarch64-unknown-linux-gnu": ( - "https://files.pythonhosted.org/packages/8f/eb/28416f1721a3b7fa28ea499e8a6f867e28146ea2453839c2bca04a001eeb/coverage-7.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", - "3b2eccb883368f9e972e216c7b4c7c06cabda925b5f06dde0650281cb7666a30", + "https://files.pythonhosted.org/packages/92/8f/2ead05e735022d1a7f3a0a683ac7f737de14850395a826192f0288703472/coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", ), "x86_64-apple-darwin": ( - "https://files.pythonhosted.org/packages/11/5c/2cf3e794fa5d1eb443aa8544e2ba3837d75073eaf25a1fda64d232065609/coverage-7.4.3-cp312-cp312-macosx_10_9_x86_64.whl", - "b51bfc348925e92a9bd9b2e48dad13431b57011fd1038f08316e6bf1df107d10", + "https://files.pythonhosted.org/packages/7e/d4/300fc921dff243cd518c7db3a4c614b7e4b2431b0d1145c1e274fd99bd70/coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", + "95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", ), "x86_64-unknown-linux-gnu": ( - "https://files.pythonhosted.org/packages/2f/db/70900f10b85a66f761a3a28950ccd07757d51548b1d10157adc4b9415f15/coverage-7.4.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "b9a4a8dd3dcf4cbd3165737358e4d7dfbd9d59902ad11e3b15eebb6393b0446e", + "https://files.pythonhosted.org/packages/1f/0f/c890339dd605f3ebc269543247bdd43b703cce6825b5ed42ff5f2d6122c7/coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", + ), + }, + "cp313": { + "aarch64-apple-darwin": ( + "https://files.pythonhosted.org/packages/b9/67/e1413d5a8591622a46dd04ff80873b04c849268831ed5c304c16433e7e30/coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", + "a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", + ), + "aarch64-unknown-linux-gnu": ( + "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/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", ), }, "cp38": { "aarch64-apple-darwin": ( - "https://files.pythonhosted.org/packages/96/71/1c299b12e80d231e04a2bfd695e761fb779af7ab66f8bd3cb15649be82b3/coverage-7.4.3-cp38-cp38-macosx_11_0_arm64.whl", - "280459f0a03cecbe8800786cdc23067a8fc64c0bd51dc614008d9c36e1659d7e", + "https://files.pythonhosted.org/packages/38/ea/cab2dc248d9f45b2b7f9f1f596a4d75a435cb364437c61b51d2eb33ceb0e/coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", + "f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a", ), "aarch64-unknown-linux-gnu": ( - "https://files.pythonhosted.org/packages/c7/a7/b00eaa53d904193478eae01625d784b2af8b522a98028f47c831dcc95663/coverage-7.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", - "6c0cdedd3500e0511eac1517bf560149764b7d8e65cb800d8bf1c63ebf39edd2", + "https://files.pythonhosted.org/packages/ca/6f/f82f9a500c7c5722368978a5390c418d2a4d083ef955309a8748ecaa8920/coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b", ), "x86_64-apple-darwin": ( - "https://files.pythonhosted.org/packages/e2/bc/f54b24b476db0069ac04ff2cdeb28cd890654c8619761bf818726022c76a/coverage-7.4.3-cp38-cp38-macosx_10_9_x86_64.whl", - "28ca2098939eabab044ad68850aac8f8db6bf0b29bc7f2887d05889b17346454", + "https://files.pythonhosted.org/packages/81/d0/d9e3d554e38beea5a2e22178ddb16587dbcbe9a1ef3211f55733924bf7fa/coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", + "6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0", ), "x86_64-unknown-linux-gnu": ( - "https://files.pythonhosted.org/packages/d0/3a/e882caceca2c7d65791a4a759764a1bf803bbbd10caf38ec41d73a45219e/coverage-7.4.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "dec9de46a33cf2dd87a5254af095a409ea3bf952d85ad339751e7de6d962cde6", + "https://files.pythonhosted.org/packages/e4/6e/885bcd787d9dd674de4a7d8ec83faf729534c63d05d51d45d4fa168f7102/coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de", ), }, "cp39": { "aarch64-apple-darwin": ( - "https://files.pythonhosted.org/packages/66/f2/57f5d3c9d2e78c088e4c8dbc933b85fa81c424f23641f10c1aa64052ee4f/coverage-7.4.3-cp39-cp39-macosx_11_0_arm64.whl", - "77fbfc5720cceac9c200054b9fab50cb2a7d79660609200ab83f5db96162d20c", + "https://files.pythonhosted.org/packages/a5/fe/137d5dca72e4a258b1bc17bb04f2e0196898fe495843402ce826a7419fe3/coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", + "547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", ), "aarch64-unknown-linux-gnu": ( - "https://files.pythonhosted.org/packages/ad/3f/cde6fd2e4cc447bd24e3dc2e79abd2e0fba67ac162996253d3505f8efef4/coverage-7.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", - "6679060424faa9c11808598504c3ab472de4531c571ab2befa32f4971835788e", + "https://files.pythonhosted.org/packages/78/5b/a0a796983f3201ff5485323b225d7c8b74ce30c11f456017e23d8e8d1945/coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", ), "x86_64-apple-darwin": ( - "https://files.pythonhosted.org/packages/d6/cf/4094ac6410b680c91c5e55a56f25f4b3a878e2fcbf773c1cecfbdbaaec4f/coverage-7.4.3-cp39-cp39-macosx_10_9_x86_64.whl", - "3b253094dbe1b431d3a4ac2f053b6d7ede2664ac559705a704f621742e034f1f", + "https://files.pythonhosted.org/packages/19/d3/d54c5aa83268779d54c86deb39c1c4566e5d45c155369ca152765f8db413/coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", + "abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", ), "x86_64-unknown-linux-gnu": ( - "https://files.pythonhosted.org/packages/b5/ad/effc12b8f72321cb847c5ba7f4ea7ce3e5c19c641f6418131f8fb0ab2f61/coverage-7.4.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "8640f1fde5e1b8e3439fe482cdc2b0bb6c329f4bb161927c28d2e8879c6029ee", + "https://files.pythonhosted.org/packages/9a/6f/eef79b779a540326fee9520e5542a8b428cc3bfa8b7c8f1022c1ee4fc66c/coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", ), }, } diff --git a/python/versions.bzl b/python/versions.bzl index c97c1cc01f..ae017e3d12 100644 --- a/python/versions.bzl +++ b/python/versions.bzl @@ -130,6 +130,17 @@ TOOL_VERSIONS = { }, "strip_prefix": "python", }, + "3.8.20": { + "url": "20241002/cpython-{python_version}+20241002-{platform}-{build}.tar.gz", + "sha256": { + "aarch64-apple-darwin": "2ddfc04bdb3e240f30fb782fa1deec6323799d0e857e0b63fa299218658fd3d4", + "aarch64-unknown-linux-gnu": "9d8798f9e79e0fc0f36fcb95bfa28a1023407d51a8ea5944b4da711f1f75f1ed", + "x86_64-apple-darwin": "68d060cd373255d2ca5b8b3441363d5aa7cc45b0c11bbccf52b1717c2b5aa8bb", + "x86_64-pc-windows-msvc": "41b6709fec9c56419b7de1940d1f87fa62045aff81734480672dcb807eedc47e", + "x86_64-unknown-linux-gnu": "285e141c36f88b2e9357654c5f77d1f8fb29cc25132698fe35bb30d787f38e87", + }, + "strip_prefix": "python", + }, "3.9.10": { "url": "20220227/cpython-{python_version}+20220227-{platform}-{build}.tar.gz", "sha256": { @@ -225,6 +236,19 @@ TOOL_VERSIONS = { }, "strip_prefix": "python", }, + "3.9.20": { + "url": "20241008/cpython-{python_version}+20241008-{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", + }, + "strip_prefix": "python", + }, "3.10.2": { "url": "20220227/cpython-{python_version}+20220227-{platform}-{build}.tar.gz", "sha256": { @@ -331,6 +355,19 @@ TOOL_VERSIONS = { }, "strip_prefix": "python", }, + "3.10.15": { + "url": "20241008/cpython-{python_version}+20241008-{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", + }, + "strip_prefix": "python", + }, "3.11.1": { "url": "20230116/cpython-{python_version}+20230116-{platform}-{build}.tar.gz", "sha256": { @@ -432,6 +469,19 @@ TOOL_VERSIONS = { }, "strip_prefix": "python", }, + "3.11.10": { + "url": "20241008/cpython-{python_version}+20241008-{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", + }, + "strip_prefix": "python", + }, "3.12.0": { "url": "20231002/cpython-{python_version}+20231002-{platform}-{build}.tar.gz", "sha256": { @@ -497,15 +547,42 @@ TOOL_VERSIONS = { }, "strip_prefix": "python", }, + "3.12.7": { + "url": "20241008/cpython-{python_version}+20241008-{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", + }, + "strip_prefix": "python", + }, + "3.13.0": { + "url": "20241008/cpython-{python_version}+20241008-{platform}-{build}.tar.gz", + "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", + }, + "strip_prefix": "python", + }, } # buildifier: disable=unsorted-dict-items MINOR_MAPPING = { - "3.8": "3.8.19", - "3.9": "3.9.19", - "3.10": "3.10.14", - "3.11": "3.11.9", - "3.12": "3.12.4", + "3.8": "3.8.20", + "3.9": "3.9.20", + "3.10": "3.10.15", + "3.11": "3.11.10", + "3.12": "3.12.7", + "3.13": "3.13.0", } PLATFORMS = { diff --git a/tools/private/update_deps/update_coverage_deps.py b/tools/private/update_deps/update_coverage_deps.py index 6b837b9f4b..a856b7acba 100755 --- a/tools/private/update_deps/update_coverage_deps.py +++ b/tools/private/update_deps/update_coverage_deps.py @@ -131,7 +131,7 @@ def _parse_args() -> argparse.Namespace: "--py", nargs="+", type=str, - default=["cp38", "cp39", "cp310", "cp311", "cp312"], + default=["cp38", "cp39", "cp310", "cp311", "cp312", "cp313"], help="Supported python versions", ) parser.add_argument( From 83eb5e8364b84eee27c16864b843ca117f17e005 Mon Sep 17 00:00:00 2001 From: Logan Pulley Date: Wed, 9 Oct 2024 09:08:28 -0500 Subject: [PATCH 238/345] fix: pass kwargs `env` to both update and test targets (#2277) Fixes #2270. --- CHANGELOG.md | 3 +++ python/private/pypi/pip_compile.bzl | 22 ++++++++++++---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0807d5c57..67c3477443 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,9 @@ A brief description of the categories of changes: wheel is created * (whl_library) truncate progress messages from the repo rule to better handle case where a requirement has many `--hash=sha256:...` flags +* (rules) `compile_pip_requirements` passes `env` to the `X.update` target (and + not only to the `X_test` target, a bug introduced in + [#1067](https://github.com/bazelbuild/rules_python/pull/1067)). ### Added * (py_wheel) Now supports `compress = (True|False)` to allow disabling diff --git a/python/private/pypi/pip_compile.bzl b/python/private/pypi/pip_compile.bzl index a6cabf70c1..dc5b186a6a 100644 --- a/python/private/pypi/pip_compile.bzl +++ b/python/private/pypi/pip_compile.bzl @@ -154,18 +154,11 @@ def pip_compile( "visibility": visibility, } - # setuptools (the default python build tool) attempts to find user - # configuration in the user's home direcotory. This seems to work fine on - # linux and macOS, but fails on Windows, so we conditionally provide a fake - # USERPROFILE env variable to allow setuptools to proceed without finding - # user-provided configuration. - kwargs["env"] = select({ - "@@platforms//os:windows": {"USERPROFILE": "Z:\\FakeSetuptoolsHomeDirectoryHack"}, - "//conditions:default": {}, - }) | kwargs.get("env", {}) + env = kwargs.pop("env", {}) py_binary( name = name + ".update", + env = env, **attrs ) @@ -174,6 +167,15 @@ def pip_compile( py_test( name = name + "_test", timeout = timeout, - # kwargs could contain test-specific attributes like size or timeout + # setuptools (the default python build tool) attempts to find user + # configuration in the user's home direcotory. This seems to work fine on + # linux and macOS, but fails on Windows, so we conditionally provide a fake + # USERPROFILE env variable to allow setuptools to proceed without finding + # user-provided configuration. + env = select({ + "@@platforms//os:windows": {"USERPROFILE": "Z:\\FakeSetuptoolsHomeDirectoryHack"}, + "//conditions:default": {}, + }) | env, + # kwargs could contain test-specific attributes like size **dict(attrs, **kwargs) ) From 09b087f63585ada0d5b9e8e1115c73e1501350ad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 14:18:06 -0700 Subject: [PATCH 239/345] build(deps): bump zipp from 3.17.0 to 3.19.1 in /examples/pip_parse (#2266) Bumps [zipp](https://github.com/jaraco/zipp) from 3.17.0 to 3.19.1.
Changelog

Sourced from zipp's changelog.

v3.19.1

Bugfixes

  • Improved handling of malformed zip files. (#119)

v3.19.0

Features

  • Implement is_symlink. (#117)

v3.18.2

No significant changes.

v3.18.1

No significant changes.

v3.18.0

Features

  • Bypass ZipFile.namelist in glob for better performance. (#106)
  • Refactored glob functionality to support a more generalized solution with support for platform-specific path separators. (#108)

Bugfixes

  • Add special accounting for pypy when computing the stack level for text encoding warnings. (#114)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=zipp&package-manager=pip&previous-version=3.17.0&new-version=3.19.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/bazelbuild/rules_python/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/pip_parse/requirements_lock.txt | 6 +++--- examples/pip_parse/requirements_windows.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/pip_parse/requirements_lock.txt b/examples/pip_parse/requirements_lock.txt index 4e8af7f523..b11ab20dab 100644 --- a/examples/pip_parse/requirements_lock.txt +++ b/examples/pip_parse/requirements_lock.txt @@ -226,9 +226,9 @@ yamllint==1.28.0 \ --hash=sha256:89bb5b5ac33b1ade059743cf227de73daa34d5e5a474b06a5e17fc16583b0cf2 \ --hash=sha256:9e3d8ddd16d0583214c5fdffe806c9344086721f107435f68bad990e5a88826b # via -r requirements.in -zipp==3.17.0 \ - --hash=sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 \ - --hash=sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0 +zipp==3.19.1 \ + --hash=sha256:2828e64edb5386ea6a52e7ba7cdb17bb30a73a858f5eb6eb93d8d36f5ea26091 \ + --hash=sha256:35427f6d5594f4acf82d25541438348c26736fa9b3afa2754bcd63cdb99d8e8f # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: diff --git a/examples/pip_parse/requirements_windows.txt b/examples/pip_parse/requirements_windows.txt index 4debc11dd1..6beb69679d 100644 --- a/examples/pip_parse/requirements_windows.txt +++ b/examples/pip_parse/requirements_windows.txt @@ -230,9 +230,9 @@ yamllint==1.28.0 \ --hash=sha256:89bb5b5ac33b1ade059743cf227de73daa34d5e5a474b06a5e17fc16583b0cf2 \ --hash=sha256:9e3d8ddd16d0583214c5fdffe806c9344086721f107435f68bad990e5a88826b # via -r requirements.in -zipp==3.17.0 \ - --hash=sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 \ - --hash=sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0 +zipp==3.19.1 \ + --hash=sha256:2828e64edb5386ea6a52e7ba7cdb17bb30a73a858f5eb6eb93d8d36f5ea26091 \ + --hash=sha256:35427f6d5594f4acf82d25541438348c26736fa9b3afa2754bcd63cdb99d8e8f # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: From db7cca53c93d01bead66a836d6d3400f70c6f927 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 14:18:37 -0700 Subject: [PATCH 240/345] build(deps): bump idna from 3.7 to 3.10 in /tools/publish (#2228) Bumps [idna](https://github.com/kjd/idna) from 3.7 to 3.10.
Release notes

Sourced from idna's releases.

v3.10

No release notes provided.

v3.9

No release notes provided.

v3.8

What's Changed

  • Fix regression where IDNAError exception was not being produced for certain inputs.
  • Add support for Python 3.13, drop support for Python 3.5 as it is no longer testable.
  • Documentation improvements
  • Updates to package testing using Github actions

Thanks to Hugo van Kemenade for contributions to this release.

Full Changelog: https://github.com/kjd/idna/compare/v3.7...v3.8

Changelog

Sourced from idna's changelog.

3.10 (2024-09-15) +++++++++++++++++

  • Reverted to Unicode 15.1.0 data. Unicode 16 has some significant changes to UTS46 processing that will require more work to properly implement.

3.9 (2024-09-13) ++++++++++++++++

  • Update to Unicode 16.0.0
  • Deprecate setup.cfg in favour of pyproject.toml
  • Use ruff for code formatting

Thanks to Waket Zheng for contributions to this release.

3.8 (2024-08-23) ++++++++++++++++

  • Fix regression where IDNAError exception was not being produced for certain inputs.
  • Add support for Python 3.13, drop support for Python 3.5 as it is no longer testable.
  • Documentation improvements
  • Updates to package testing using Github actions

Thanks to Hugo van Kemenade for contributions to this release.

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=idna&package-manager=pip&previous-version=3.7&new-version=3.10)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/publish/requirements_darwin.txt | 6 +++--- tools/publish/requirements_windows.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/publish/requirements_darwin.txt b/tools/publish/requirements_darwin.txt index dd4ac40820..169dc80327 100644 --- a/tools/publish/requirements_darwin.txt +++ b/tools/publish/requirements_darwin.txt @@ -108,9 +108,9 @@ docutils==0.19 \ --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ --hash=sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc # via readme-renderer -idna==3.7 \ - --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ - --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 +idna==3.10 \ + --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ + --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 # via requests importlib-metadata==6.0.0 \ --hash=sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad \ diff --git a/tools/publish/requirements_windows.txt b/tools/publish/requirements_windows.txt index 7e210c9eb7..bb137ffcee 100644 --- a/tools/publish/requirements_windows.txt +++ b/tools/publish/requirements_windows.txt @@ -108,9 +108,9 @@ docutils==0.19 \ --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ --hash=sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc # via readme-renderer -idna==3.7 \ - --hash=sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc \ - --hash=sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0 +idna==3.10 \ + --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ + --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 # via requests importlib-metadata==6.0.0 \ --hash=sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad \ From 3b0b9925998ceefe519e8983714d849111e99b0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 21:19:10 +0000 Subject: [PATCH 241/345] build(deps): bump docutils from 0.19 to 0.21.2 in /tools/publish (#2159) Bumps [docutils](https://docutils.sourceforge.io) from 0.19 to 0.21.2. [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=docutils&package-manager=pip&previous-version=0.19&new-version=0.21.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) You can trigger a rebase of this PR by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
> **Note** > Automatic rebases have been disabled on this pull request as it has been open for over 30 days. Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/publish/requirements_darwin.txt | 6 +++--- tools/publish/requirements_windows.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/publish/requirements_darwin.txt b/tools/publish/requirements_darwin.txt index 169dc80327..c1958ae3bb 100644 --- a/tools/publish/requirements_darwin.txt +++ b/tools/publish/requirements_darwin.txt @@ -104,9 +104,9 @@ charset-normalizer==3.3.2 \ --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 # via requests -docutils==0.19 \ - --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ - --hash=sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc +docutils==0.21.2 \ + --hash=sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f \ + --hash=sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 # via readme-renderer idna==3.10 \ --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ diff --git a/tools/publish/requirements_windows.txt b/tools/publish/requirements_windows.txt index bb137ffcee..3702ff65a8 100644 --- a/tools/publish/requirements_windows.txt +++ b/tools/publish/requirements_windows.txt @@ -104,9 +104,9 @@ charset-normalizer==3.3.2 \ --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 # via requests -docutils==0.19 \ - --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ - --hash=sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc +docutils==0.21.2 \ + --hash=sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f \ + --hash=sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 # via readme-renderer idna==3.10 \ --hash=sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9 \ From 1388a89dc04374ed33c761e17b7747b85211c063 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Oct 2024 14:19:33 -0700 Subject: [PATCH 242/345] build(deps): bump certifi from 2024.7.4 to 2024.8.30 in /tools/publish (#2211) Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.7.4 to 2024.8.30.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=certifi&package-manager=pip&previous-version=2024.7.4&new-version=2024.8.30)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/publish/requirements_darwin.txt | 6 +++--- tools/publish/requirements_windows.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/publish/requirements_darwin.txt b/tools/publish/requirements_darwin.txt index c1958ae3bb..ddd47c7d45 100644 --- a/tools/publish/requirements_darwin.txt +++ b/tools/publish/requirements_darwin.txt @@ -8,9 +8,9 @@ bleach==6.0.0 \ --hash=sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414 \ --hash=sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4 # via readme-renderer -certifi==2024.7.4 \ - --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ - --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 +certifi==2024.8.30 \ + --hash=sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 \ + --hash=sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9 # via requests charset-normalizer==3.3.2 \ --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ diff --git a/tools/publish/requirements_windows.txt b/tools/publish/requirements_windows.txt index 3702ff65a8..e9e523a630 100644 --- a/tools/publish/requirements_windows.txt +++ b/tools/publish/requirements_windows.txt @@ -8,9 +8,9 @@ bleach==6.0.0 \ --hash=sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414 \ --hash=sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4 # via readme-renderer -certifi==2024.7.4 \ - --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ - --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 +certifi==2024.8.30 \ + --hash=sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 \ + --hash=sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9 # via requests charset-normalizer==3.3.2 \ --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ From 43583d1fe84bc2b4daa1531e3dcf404dbcb98dda Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 10 Oct 2024 20:12:55 -0700 Subject: [PATCH 243/345] fix(bzlmod): let workspace-invoked python_register_toolchains to register toolchains (#2289) While migrating to bzlmod, users may have a hybrid build where WORKSPACE contains python_register_toolchain() calls. Because these calls originate from WORKSPACE files, the `native.register_toolchain` APIs are still available. At the same time, we still detect that bzlmod is enabled, and thus disable calling those functions. The net effect is, users aren't able to register toolchains in such a hybrid setup. At the same time, because the code path is shared, we can't have the bzlmod toolchain code try to call them, as it'll fail. To accomodate both cases, have the bzlmod toolchain code pass a special arg so that `python_register_toolchains` knows to skip parts that don't apply to the bzlmod toolchain invocation. This was all unwound by some users and pointed out in a Slack thread. A few people are manually carrying an equivalent patch for a working hybrid mode. Fixes https://github.com/bazelbuild/rules_python/issues/1675 --- CHANGELOG.md | 3 +++ python/private/BUILD.bazel | 1 - python/private/python.bzl | 6 +++++- python/private/python_register_toolchains.bzl | 8 +++----- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67c3477443..3ea99a72b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,9 @@ A brief description of the categories of changes: * (rules) `compile_pip_requirements` passes `env` to the `X.update` target (and not only to the `X_test` target, a bug introduced in [#1067](https://github.com/bazelbuild/rules_python/pull/1067)). +* (bzlmod) In hybrid bzlmod with WORKSPACE builds, + `python_register_toolchains(register_toolchains=True)` is respected + ([#1675](https://github.com/bazelbuild/rules_python/issues/1675)). ### Added * (py_wheel) Now supports `compress = (True|False)` to allow disabling diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index b4084fb7f4..6fb4a1ccc2 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -177,7 +177,6 @@ bzl_library( deps = [ ":auth_bzl", ":bazel_tools_bzl", - ":bzlmod_enabled_bzl", ":coverage_deps_bzl", ":full_version_bzl", ":internal_config_repo_bzl", diff --git a/python/private/python.bzl b/python/private/python.bzl index 83bc43f92e..12ab4bb48d 100644 --- a/python/private/python.bzl +++ b/python/private/python.bzl @@ -228,7 +228,11 @@ def _python_impl(module_ctx): 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(name = toolchain_info.name, **kwargs) + python_register_toolchains( + name = toolchain_info.name, + _internal_bzlmod_toolchain_call = True, + **kwargs + ) # Create the pythons_hub repo for the interpreter meta data and the # the various toolchains. diff --git a/python/private/python_register_toolchains.bzl b/python/private/python_register_toolchains.bzl index d20e049610..64b66d5a6f 100644 --- a/python/private/python_register_toolchains.bzl +++ b/python/private/python_register_toolchains.bzl @@ -23,7 +23,6 @@ load( "TOOL_VERSIONS", "get_release_info", ) -load(":bzlmod_enabled.bzl", "BZLMOD_ENABLED") load(":coverage_deps.bzl", "coverage_dep") load(":full_version.bzl", "full_version") load(":python_repository.bzl", "python_repository") @@ -75,9 +74,8 @@ def python_register_toolchains( version. **kwargs: passed to each {obj}`python_repository` call. """ - - if BZLMOD_ENABLED: - # you cannot used native.register_toolchains when using bzlmod. + bzlmod_toolchain_call = kwargs.pop("_internal_bzlmod_toolchain_call", False) + if bzlmod_toolchain_call: register_toolchains = False base_url = kwargs.pop("base_url", DEFAULT_RELEASE_BASE_URL) @@ -169,7 +167,7 @@ def python_register_toolchains( ) # in bzlmod we write out our own toolchain repos - if BZLMOD_ENABLED: + if bzlmod_toolchain_call: return toolchains_repo( From b57209bcce3e0d2ad361f556d027d6cd63376298 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 12:13:15 +0900 Subject: [PATCH 244/345] build(deps): bump certifi from 2023.7.22 to 2024.7.4 in /examples/bzlmod_build_file_generation (#2287) Bumps [certifi](https://github.com/certifi/python-certifi) from 2023.7.22 to 2024.7.4.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=certifi&package-manager=pip&previous-version=2023.7.22&new-version=2024.7.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/bazelbuild/rules_python/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/bzlmod_build_file_generation/requirements_lock.txt | 6 +++--- .../bzlmod_build_file_generation/requirements_windows.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/bzlmod_build_file_generation/requirements_lock.txt b/examples/bzlmod_build_file_generation/requirements_lock.txt index 8ba315be1c..9d9ad9453e 100644 --- a/examples/bzlmod_build_file_generation/requirements_lock.txt +++ b/examples/bzlmod_build_file_generation/requirements_lock.txt @@ -8,9 +8,9 @@ astroid==2.12.13 \ --hash=sha256:10e0ad5f7b79c435179d0d0f0df69998c4eef4597534aae44910db060baeb907 \ --hash=sha256:1493fe8bd3dfd73dc35bd53c9d5b6e49ead98497c47b2307662556a5692d29d7 # via pylint -certifi==2023.7.22 \ - --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ - --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 +certifi==2024.7.4 \ + --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ + --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 # via requests chardet==4.0.0 \ --hash=sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa \ diff --git a/examples/bzlmod_build_file_generation/requirements_windows.txt b/examples/bzlmod_build_file_generation/requirements_windows.txt index 09971f9663..5b31ff5541 100644 --- a/examples/bzlmod_build_file_generation/requirements_windows.txt +++ b/examples/bzlmod_build_file_generation/requirements_windows.txt @@ -8,9 +8,9 @@ astroid==2.12.13 \ --hash=sha256:10e0ad5f7b79c435179d0d0f0df69998c4eef4597534aae44910db060baeb907 \ --hash=sha256:1493fe8bd3dfd73dc35bd53c9d5b6e49ead98497c47b2307662556a5692d29d7 # via pylint -certifi==2023.7.22 \ - --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ - --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 +certifi==2024.7.4 \ + --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ + --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 # via requests chardet==4.0.0 \ --hash=sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa \ From 71417c5ab792948ef87b3ce5bde0fb92be4aad83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Oct 2024 03:44:53 +0000 Subject: [PATCH 245/345] build(deps): bump certifi from 2023.7.22 to 2024.7.4 in /examples/pip_parse (#2291) Bumps [certifi](https://github.com/certifi/python-certifi) from 2023.7.22 to 2024.7.4.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=certifi&package-manager=pip&previous-version=2023.7.22&new-version=2024.7.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/bazelbuild/rules_python/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- examples/pip_parse/requirements_lock.txt | 6 +++--- examples/pip_parse/requirements_windows.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/pip_parse/requirements_lock.txt b/examples/pip_parse/requirements_lock.txt index b11ab20dab..5e7a198c38 100644 --- a/examples/pip_parse/requirements_lock.txt +++ b/examples/pip_parse/requirements_lock.txt @@ -12,9 +12,9 @@ babel==2.13.1 \ --hash=sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900 \ --hash=sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed # via sphinx -certifi==2023.7.22 \ - --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ - --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 +certifi==2024.7.4 \ + --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ + --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 # via requests chardet==4.0.0 \ --hash=sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa \ diff --git a/examples/pip_parse/requirements_windows.txt b/examples/pip_parse/requirements_windows.txt index 6beb69679d..4b1969255a 100644 --- a/examples/pip_parse/requirements_windows.txt +++ b/examples/pip_parse/requirements_windows.txt @@ -12,9 +12,9 @@ babel==2.13.1 \ --hash=sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900 \ --hash=sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed # via sphinx -certifi==2023.7.22 \ - --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 \ - --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9 +certifi==2024.7.4 \ + --hash=sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b \ + --hash=sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90 # via requests chardet==4.0.0 \ --hash=sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa \ From f6361e4dc33f841ecd526f0dc16797a52f451e8c Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 12 Oct 2024 02:46:14 +0900 Subject: [PATCH 246/345] feat(bzlmod): enable download_only for experimental_index_url (#2290) With this change we can support ibazel for building our docs again because we will just not have any sdists that are causing issues. This limits the scope to only supporting whls at this time, but for the time being it is the best solution. Fixes #2223 Work towards #260 --- .bazelrc | 4 ++-- CHANGELOG.md | 2 ++ MODULE.bazel | 1 + examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 16 +++++++++------- tests/pypi/integration/BUILD.bazel | 2 +- 6 files changed, 17 insertions(+), 12 deletions(-) diff --git a/.bazelrc b/.bazelrc index 1ca469cd75..b484751c3c 100644 --- a/.bazelrc +++ b/.bazelrc @@ -4,8 +4,8 @@ # (Note, we cannot use `common --deleted_packages` because the bazel version command doesn't support it) # To update these lines, execute # `bazel run @rules_bazel_integration_test//tools:update_deleted_packages` -build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered -query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered test --test_output=errors diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ea99a72b9..5473dc529f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -68,6 +68,8 @@ A brief description of the categories of changes: * `3.12 -> 3.12.7` [20241008]: https://github.com/indygreg/python-build-standalone/releases/tag/20241008 * (coverage) Add support for python 3.13 and bump `coverage.py` to 7.6.1. +* (bzlmod) Add support for `download_only` flag to disable usage of `sdists` + when {bzl:attr}`pip.parse.experimental_index_url` is set. ### Removed diff --git a/MODULE.bazel b/MODULE.bazel index 58c7ae229b..780d7f8666 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -91,6 +91,7 @@ dev_pip = use_extension( dev_dependency = True, ) dev_pip.parse( + download_only = True, # this will not add the `sdist` values to the transitive closures at all. hub_name = "dev_pip", python_version = "3.11", requirements_lock = "//docs:requirements.txt", diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 2ddbe40bc3..8ef6e97588 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1231,7 +1231,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "kPvx0u6SR68H+8BqqEfxd3NpVZjuMOyzI9Xml01rdrQ=", + "bzlTransitiveDigest": "Rc0r+OwZ3f57lwygvIXLejgTsJKr8ezIcd136SpMyDo=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6138,7 +6138,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "c3OA6iewVGq8nz0o3iI2AtIQhsRZIg/E/PDq2vuAQTw=", + "bzlTransitiveDigest": "s4J1aKQE20A+qzGkeB4XwzitVphP4H3vYmeLg6pMZxA=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 200aa4327e..36fb20e030 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -151,9 +151,6 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s get_index_urls = None if pip_attr.experimental_index_url: - if pip_attr.download_only: - fail("Currently unsupported to use `download_only` and `experimental_index_url`") - get_index_urls = lambda ctx, distributions: simpleapi_download( ctx, attr = struct( @@ -263,11 +260,11 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s is_exposed = False for requirement in requirements: is_exposed = is_exposed or requirement.is_exposed - for distribution in requirement.whls + [requirement.sdist]: - if not distribution: - # sdist may be None - continue + dists = requirement.whls + if not pip_attr.download_only and requirement.sdist: + dists = dists + [requirement.sdist] + for distribution in dists: found_something = True is_hub_reproducible = False @@ -564,6 +561,11 @@ In the future this could be defaulted to `https://pypi.org` when this feature be stable. This is equivalent to `--index-url` `pip` option. + +:::{versionchanged} 0.37.0 +If {attr}`download_only` is set, then `sdist` archives will be discarded and `pip.parse` will +operate in wheel-only mode. +::: """, ), "experimental_index_url_overrides": attr.string_dict( diff --git a/tests/pypi/integration/BUILD.bazel b/tests/pypi/integration/BUILD.bazel index f846bfb124..9ea8dcebe4 100644 --- a/tests/pypi/integration/BUILD.bazel +++ b/tests/pypi/integration/BUILD.bazel @@ -1,5 +1,5 @@ load("@bazel_skylib//rules:build_test.bzl", "build_test") -load("@dev_pip//:requirements.bzl", "all_requirements") +load("@rules_python_publish_deps//:requirements.bzl", "all_requirements") load(":transitions.bzl", "transition_rule") build_test( From a3cdab5e2670792d5c31b28606722fe11b8d4356 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Fri, 11 Oct 2024 11:25:34 -0700 Subject: [PATCH 247/345] fix(precompiling)!: make binary-level precompile opt-in/opt-opt work (#2243) This makes binary-level opt-in/opt-out of precompiling work as intended. Previously, when `pyc_collection=include_pyc` was set on a binary, only transitive libraries that had explicitly enabled precompiling were being included (which was moot anyways -- libraries put their files in runfiles, so no matter what, their files were included). The intent was that, when a binary set `pyc_collection=include_pyc`, then precompiled files would be used for all its transitive dependencies (unless they had, at the target-level, disabled precompiling). Conversely, if `pyc_collection=disabled` was set, the precompiled files would not be used (unless a target had, at the target level, enabled precompiling). To make it work as desired, the basic fix is to make it so that libraries have a place to put the implicit pyc files (the ones automatically generated), and have the binaries include those when requested. The net effect is a library has 4 sets of files it produces: * required py files: py source files that should always go into the binary's runfiles * required pyc files: precompiled pyc files that should always go into the binary's runfiles (e.g., when a library sets `precompile=enabled` directly). * implicit pyc files: precompiled pyc files for a library that are always generated, but it's up to the binary if they go into the runfiles * implicit pyc source files: the source py file for an implicit pyc file. When a binary *doesn't* include the implicit pyc file, it must include the source py file (otherwise none of the library's code ends up included). Similarly, in order to allow a binary to decide what files are used, libraries must stop putting the py/pyc files into runfiles themselves. While this is potentially a breaking change, I found that, within Google, there was no reliance on this behavior, so should be safe enough. That said, I added `--add_srcs_to_runfiles` to restore the previous behavior to aid in transitioning. **BREAKING CHANGES** 1. `py_library` no longer puts its srcs into runfiles directly. 2. Removed `--precompile_add_to_runfiles` 3. Removed `--pyc_collection` 4. `precompile=if_generated_source` removed 5. `precompile_source_retention=omit_if_generated_source` removed Though 2 through 5 are technically breaking changes, I don't think precompiling was very usable anyways, so usages of those flags/values is rare. Fixes https://github.com/bazelbuild/rules_python/issues/2212 --- CHANGELOG.md | 20 +- .../python/config_settings/index.md | 63 +-- docs/precompiling.md | 36 +- python/config_settings/BUILD.bazel | 27 +- python/private/BUILD.bazel | 4 + python/private/common/attributes.bzl | 49 +- python/private/common/common.bzl | 32 +- python/private/common/common_bazel.bzl | 59 ++- python/private/common/py_executable.bzl | 131 ++++-- python/private/common/py_library.bzl | 44 +- python/private/enum.bzl | 13 +- python/private/flags.bzl | 69 +-- python/private/proto/py_proto_library.bzl | 41 +- python/private/py_info.bzl | 42 +- python/private/py_package.bzl | 22 +- .../precompile/precompile_tests.bzl | 436 +++++++++++++----- tests/support/support.bzl | 2 +- 17 files changed, 746 insertions(+), 344 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5473dc529f..abaa2bba39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,14 @@ A brief description of the categories of changes: [x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/x.x.x ### 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 + populate runfiles with the necessary files. Adding source files to runfiles + can be temporarily restored by setting {obj}`--add_srcs_to_runfiles=enabled`, + but this flag will be removed in a subsequent releases. +* {obj}`PyInfo.transitive_sources` is now added to runfiles. These files are + `.py` files that are required to be added to runfiles by downstream binaries + (or equivalent). * (toolchains) `py_runtime.implementation_name` now defaults to `cpython` (previously it defaulted to None). @@ -50,6 +58,8 @@ A brief description of the categories of changes: * (bzlmod) In hybrid bzlmod with WORKSPACE builds, `python_register_toolchains(register_toolchains=True)` is respected ([#1675](https://github.com/bazelbuild/rules_python/issues/1675)). +* (precompiling) The {obj}`pyc_collection` attribute now correctly + enables (or disables) using pyc files from targets transitively ### Added * (py_wheel) Now supports `compress = (True|False)` to allow disabling @@ -66,14 +76,20 @@ A brief description of the categories of changes: * `3.10 -> 3.10.15` * `3.11 -> 3.11.10` * `3.12 -> 3.12.7` -[20241008]: https://github.com/indygreg/python-build-standalone/releases/tag/20241008 * (coverage) Add support for python 3.13 and bump `coverage.py` to 7.6.1. * (bzlmod) Add support for `download_only` flag to disable usage of `sdists` when {bzl:attr}`pip.parse.experimental_index_url` is set. +* (api) PyInfo fields: {obj}`PyInfo.transitive_implicit_pyc_files`, + {obj}`PyInfo.transitive_implicit_pyc_source_files`. +[20241008]: https://github.com/indygreg/python-build-standalone/releases/tag/20241008 ### Removed -* Nothing yet +* (precompiling) {obj}`--precompile_add_to_runfiles` has been removed. +* (precompiling) {obj}`--pyc_collection` has been removed. The `pyc_collection` + attribute now bases its default on {obj}`--precompile`. +* (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. ## [0.36.0] - 2024-09-24 diff --git a/docs/api/rules_python/python/config_settings/index.md b/docs/api/rules_python/python/config_settings/index.md index 645e4e2246..511a218eef 100644 --- a/docs/api/rules_python/python/config_settings/index.md +++ b/docs/api/rules_python/python/config_settings/index.md @@ -5,6 +5,25 @@ # //python/config_settings +:::{bzl:flag} add_srcs_to_runfiles +Determines if the `srcs` of targets are added to their runfiles. + +More specifically, the sources added to runfiles are the `.py` files in `srcs`. +If precompiling is performed, it is the `.py` files that are kept according +to {obj}`precompile_source_retention`. + +Values: +* `auto`: (default) Automatically decide the effective value; the current + behavior is `disabled`. +* `disabled`: Don't add `srcs` to a target's runfiles. +* `enabled`: Add `srcs` to a target's runfiles. +::::{versionadded} 0.37.0 +:::: +::::{deprecated} 0.37.0 +This is a transition flag and will be removed in a subsequent release. +:::: +::: + :::{bzl:flag} python_version Determines the default hermetic Python toolchain version. This can be set to one of the values that `rules_python` maintains. @@ -42,12 +61,8 @@ Values: * `auto`: (default) Automatically decide the effective value based on environment, target platform, etc. -* `enabled`: Compile Python source files at build time. Note that - {bzl:obj}`--precompile_add_to_runfiles` affects how the compiled files are included into - a downstream binary. +* `enabled`: Compile Python source files at build time. * `disabled`: Don't compile Python source files at build time. -* `if_generated_source`: Compile Python source files, but only if they're a - generated file. * `force_enabled`: Like `enabled`, except overrides target-level setting. This is mostly useful for development, testing enabling precompilation more broadly, or as an escape hatch if build-time compiling is not available. @@ -56,6 +71,9 @@ Values: broadly, or as an escape hatch if build-time compiling is not available. :::{versionadded} 0.33.0 ::: +:::{versionchanged} 0.37.0 +The `if_generated_source` value was removed +::: :::: ::::{bzl:flag} precompile_source_retention @@ -73,45 +91,14 @@ Values: target platform, etc. * `keep_source`: Include the original Python source. * `omit_source`: Don't include the orignal py source. -* `omit_if_generated_source`: Keep the original source if it's a regular source - file, but omit it if it's a generated file. :::{versionadded} 0.33.0 ::: :::{versionadded} 0.36.0 The `auto` value ::: -:::: - -::::{bzl:flag} precompile_add_to_runfiles -Determines if a target adds its compiled files to its runfiles. - -When a target compiles its files, but doesn't add them to its own runfiles, it -relies on a downstream target to retrieve them from -{bzl:obj}`PyInfo.transitive_pyc_files` - -Values: -* `always`: Always include the compiled files in the target's runfiles. -* `decided_elsewhere`: Don't include the compiled files in the target's - runfiles; they are still added to {bzl:obj}`PyInfo.transitive_pyc_files`. See - also: {bzl:obj}`py_binary.pyc_collection` attribute. This is useful for allowing - incrementally enabling precompilation on a per-binary basis. -:::{versionadded} 0.33.0 -::: -:::: - -::::{bzl:flag} pyc_collection -Determine if `py_binary` collects transitive pyc files. - -:::{note} -This flag is overridden by the target level `pyc_collection` attribute. -::: - -Values: -* `include_pyc`: Include `PyInfo.transitive_pyc_files` as part of the binary. -* `disabled`: Don't include `PyInfo.transitive_pyc_files` as part of the binary. -:::{versionadded} 0.33.0 -::: +:::{versionchanged} 0.37.0 +The `omit_if_generated_source` value was removed :::: ::::{bzl:flag} py_linux_libc diff --git a/docs/precompiling.md b/docs/precompiling.md index 52678e63ea..6eadc4042b 100644 --- a/docs/precompiling.md +++ b/docs/precompiling.md @@ -20,24 +20,24 @@ While precompiling helps runtime performance, it has two main costs: ## Binary-level opt-in -Because of the costs of precompiling, it may not be feasible to globally enable it -for your repo for everything. For example, some binaries may be -particularly large, and doubling the number of runfiles isn't doable. +Binary-level opt-in allows enabling precompiling on a per-target basic. This is +useful for situations such as: -If this is the case, there's an alternative way to more selectively and -incrementally control precompiling on a per-binry basis. +* Globally enabling precompiling in your `.bazelrc` isn't feasible. This may + be because some targets don't work with precompiling, e.g. because they're too + big. +* Enabling precompiling for build tools (exec config targets) separately from + target-config programs. -To use this approach, the two basic steps are: -1. Disable pyc files from being automatically added to runfiles: - {bzl:obj}`--@rules_python//python/config_settings:precompile_add_to_runfiles=decided_elsewhere`, -2. Set the `pyc_collection` attribute on the binaries/tests that should or should - not use precompiling. +To use this approach, set the {bzl:attr}`pyc_collection` attribute on the +binaries/tests that should or should not use precompiling. Then change the +{bzl:flag}`--precompile` default. -The default for the `pyc_collection` attribute is controlled by the flag -{bzl:obj}`--@rules_python//python/config_settings:pyc_collection`, so you +The default for the {bzl:attr}`pyc_collection` attribute is controlled by the flag +{bzl:obj}`--@rules_python//python/config_settings:precompile`, so you can use an opt-in or opt-out approach by setting its value: -* targets must opt-out: `--@rules_python//python/config_settings:pyc_collection=include_pyc` -* targets must opt-in: `--@rules_python//python/config_settings:pyc_collection=disabled` +* targets must opt-out: `--@rules_python//python/config_settings:precompile=enabled` +* targets must opt-in: `--@rules_python//python/config_settings:precompile=disabled` ## Advanced precompiler customization @@ -48,7 +48,7 @@ not work as well for remote execution builds. To customize the precompiler, two mechanisms are available: * The exec tools toolchain allows customizing the precompiler binary used with - the `precompiler` attribute. Arbitrary binaries are supported. + the {bzl:attr}`precompiler` attribute. Arbitrary binaries are supported. * The execution requirements can be customized using `--@rules_python//tools/precompiler:execution_requirements`. This is a list flag that can be repeated. Each entry is a key=value that is added to the @@ -92,3 +92,9 @@ Note that any execution requirements values can be specified in the flag. `foo.cpython-39.opt-2.pyc`). This works fine (it's all byte code), but also means the interpreter `-O` argument can't be used -- doing so will cause the interpreter to look for the non-existent `opt-N` named files. +* Targets with the same source files and different exec properites will result + in action conflicts. This most commonly occurs when a `py_binary` and + `py_library` have the same source files. To fix, modify both targets so + they have the same exec properties. If this is difficult because unsupported + exec groups end up being passed to the Python rules, please file an issue + to have those exec groups added to the Python rules. diff --git a/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel index 9fb395741b..b55213b5d6 100644 --- a/python/config_settings/BUILD.bazel +++ b/python/config_settings/BUILD.bazel @@ -2,12 +2,11 @@ load("@bazel_skylib//rules:common_settings.bzl", "string_flag") load("@pythons_hub//:versions.bzl", "DEFAULT_PYTHON_VERSION", "MINOR_MAPPING", "PYTHON_VERSIONS") load( "//python/private:flags.bzl", + "AddSrcsToRunfilesFlag", "BootstrapImplFlag", "ExecToolsToolchainFlag", - "PrecompileAddToRunfilesFlag", "PrecompileFlag", "PrecompileSourceRetentionFlag", - "PycCollectionFlag", ) load( "//python/private/pypi:flags.bzl", @@ -33,6 +32,14 @@ construct_config_settings( versions = PYTHON_VERSIONS, ) +string_flag( + name = "add_srcs_to_runfiles", + build_setting_default = AddSrcsToRunfilesFlag.AUTO, + values = AddSrcsToRunfilesFlag.flag_values(), + # NOTE: Only public because it is dependency of public rules. + visibility = ["//visibility:public"], +) + string_flag( name = "exec_tools_toolchain", build_setting_default = ExecToolsToolchainFlag.DISABLED, @@ -68,22 +75,6 @@ string_flag( visibility = ["//visibility:public"], ) -string_flag( - name = "precompile_add_to_runfiles", - build_setting_default = PrecompileAddToRunfilesFlag.ALWAYS, - values = sorted(PrecompileAddToRunfilesFlag.__members__.values()), - # NOTE: Only public because it's an implicit dependency - visibility = ["//visibility:public"], -) - -string_flag( - name = "pyc_collection", - build_setting_default = PycCollectionFlag.DISABLED, - values = sorted(PycCollectionFlag.__members__.values()), - # NOTE: Only public because it's an implicit dependency - visibility = ["//visibility:public"], -) - string_flag( name = "bootstrap_impl", build_setting_default = BootstrapImplFlag.SYSTEM_PYTHON, diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 6fb4a1ccc2..cee77c5836 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -297,6 +297,10 @@ bzl_library( name = "py_package_bzl", srcs = ["py_package.bzl"], visibility = ["//:__subpackages__"], + deps = [ + ":builders_bzl", + ":py_info_bzl", + ], ) bzl_library( diff --git a/python/private/common/attributes.bzl b/python/private/common/attributes.bzl index 0299e85657..56e8a66e19 100644 --- a/python/private/common/attributes.bzl +++ b/python/private/common/attributes.bzl @@ -29,6 +29,26 @@ load( _PackageSpecificationInfo = getattr(py_internal, "PackageSpecificationInfo", None) +# Due to how the common exec_properties attribute works, rules must add exec +# groups even if they don't actually use them. This is due to two interactions: +# 1. Rules give an error if users pass an unsupported exec group. +# 2. exec_properties is configurable, so macro-code can't always filter out +# exec group names that aren't supported by the rule. +# The net effect is, if a user passes exec_properties to a macro, and the macro +# invokes two rules, the macro can't always ensure each rule is only passed +# valid exec groups, and is thus liable to cause an error. +# +# NOTE: These are no-op/empty exec groups. If a rule *does* support an exec +# group and needs custom settings, it should merge this dict with one that +# overrides the supported key. +REQUIRED_EXEC_GROUPS = { + # py_binary may invoke C++ linking, or py rules may be used in combination + # with cc rules (e.g. within the same macro), so support that exec group. + # This exec group is defined by rules_cc for the cc rules. + "cpp_link": exec_group(), + "py_precompile": exec_group(), +} + _STAMP_VALUES = [-1, 0, 1] def _precompile_attr_get_effective_value(ctx): @@ -50,7 +70,6 @@ def _precompile_attr_get_effective_value(ctx): if precompile not in ( PrecompileAttr.ENABLED, PrecompileAttr.DISABLED, - PrecompileAttr.IF_GENERATED_SOURCE, ): fail("Unexpected final precompile value: {}".format(repr(precompile))) @@ -60,14 +79,10 @@ def _precompile_attr_get_effective_value(ctx): PrecompileAttr = enum( # Determine the effective value from --precompile INHERIT = "inherit", - # Compile Python source files at build time. Note that - # --precompile_add_to_runfiles affects how the compiled files are included - # into a downstream binary. + # Compile Python source files at build time. ENABLED = "enabled", # Don't compile Python source files at build time. DISABLED = "disabled", - # Compile Python source files, but only if they're a generated file. - IF_GENERATED_SOURCE = "if_generated_source", get_effective_value = _precompile_attr_get_effective_value, ) @@ -90,7 +105,6 @@ def _precompile_source_retention_get_effective_value(ctx): if attr_value not in ( PrecompileSourceRetentionAttr.KEEP_SOURCE, PrecompileSourceRetentionAttr.OMIT_SOURCE, - PrecompileSourceRetentionAttr.OMIT_IF_GENERATED_SOURCE, ): fail("Unexpected final precompile_source_retention value: {}".format(repr(attr_value))) return attr_value @@ -100,14 +114,17 @@ PrecompileSourceRetentionAttr = enum( INHERIT = "inherit", KEEP_SOURCE = "keep_source", OMIT_SOURCE = "omit_source", - OMIT_IF_GENERATED_SOURCE = "omit_if_generated_source", get_effective_value = _precompile_source_retention_get_effective_value, ) def _pyc_collection_attr_is_pyc_collection_enabled(ctx): pyc_collection = ctx.attr.pyc_collection if pyc_collection == PycCollectionAttr.INHERIT: - pyc_collection = ctx.attr._pyc_collection_flag[BuildSettingInfo].value + precompile_flag = PrecompileFlag.get_effective_value(ctx) + if precompile_flag in (PrecompileFlag.ENABLED, PrecompileFlag.FORCE_ENABLED): + pyc_collection = PycCollectionAttr.INCLUDE_PYC + else: + pyc_collection = PycCollectionAttr.DISABLED if pyc_collection not in (PycCollectionAttr.INCLUDE_PYC, PycCollectionAttr.DISABLED): fail("Unexpected final pyc_collection value: {}".format(repr(pyc_collection))) @@ -283,13 +300,9 @@ Whether py source files **for this target** should be precompiled. Values: -* `inherit`: Determine the value from the {flag}`--precompile` flag. -* `enabled`: Compile Python source files at build time. Note that - --precompile_add_to_runfiles affects how the compiled files are included into - a downstream binary. +* `inherit`: Allow the downstream binary decide if precompiled files are used. +* `enabled`: Compile Python source files at build time. * `disabled`: Don't compile Python source files at build time. -* `if_generated_source`: Compile Python source files, but only if they're a - generated file. :::{seealso} @@ -344,8 +357,6 @@ in the resulting output or not. Valid values are: * `inherit`: Inherit the value from the {flag}`--precompile_source_retention` flag. * `keep_source`: Include the original Python source. * `omit_source`: Don't include the original py source. -* `omit_if_generated_source`: Keep the original source if it's a regular source - file, but omit it if it's a generated file. """, ), # Required attribute, but details vary by rule. @@ -357,10 +368,6 @@ in the resulting output or not. Valid values are: # Required attribute, but the details vary by rule. # Use create_srcs_version_attr to create one. "srcs_version": None, - "_precompile_add_to_runfiles_flag": attr.label( - default = "//python/config_settings:precompile_add_to_runfiles", - providers = [BuildSettingInfo], - ), "_precompile_flag": attr.label( default = "//python/config_settings:precompile", providers = [BuildSettingInfo], diff --git a/python/private/common/common.bzl b/python/private/common/common.bzl index 99a632484d..ec46ea8965 100644 --- a/python/private/common/common.bzl +++ b/python/private/common/common.bzl @@ -348,15 +348,29 @@ def collect_runfiles(ctx, files = depset()): collect_default = True, ) -def create_py_info(ctx, *, direct_sources, direct_pyc_files, imports): +def create_py_info( + ctx, + *, + required_py_files, + required_pyc_files, + implicit_pyc_files, + implicit_pyc_source_files, + imports): """Create PyInfo provider. Args: ctx: rule ctx. - direct_sources: depset of Files; the direct, raw `.py` sources for the - target. This should only be Python source files. It should not - include pyc files. - direct_pyc_files: depset of Files; the direct `.pyc` sources for the target. + required_py_files: `depset[File]`; the direct, `.py` sources for the + target that **must** be included by downstream targets. This should + only be Python source files. It should not include pyc files. + required_pyc_files: `depset[File]`; the direct `.pyc` files this target + produces. + implicit_pyc_files: `depset[File]` pyc files that are only used if pyc + collection is enabled. + implicit_pyc_source_files: `depset[File]` source files for implicit pyc + files that are used when the implicit pyc files are not. + implicit_pyc_files: {type}`depset[File]` Implicitly generated pyc files + that a binary can choose to include. imports: depset of strings; the import path values to propagate. Returns: @@ -366,8 +380,10 @@ def create_py_info(ctx, *, direct_sources, direct_pyc_files, imports): """ py_info = PyInfoBuilder() - py_info.direct_pyc_files.add(direct_pyc_files) - py_info.transitive_pyc_files.add(direct_pyc_files) + py_info.direct_pyc_files.add(required_pyc_files) + py_info.transitive_pyc_files.add(required_pyc_files) + py_info.transitive_implicit_pyc_files.add(implicit_pyc_files) + py_info.transitive_implicit_pyc_source_files.add(implicit_pyc_source_files) py_info.imports.add(imports) py_info.merge_has_py2_only_sources(ctx.attr.srcs_version in ("PY2", "PY2ONLY")) py_info.merge_has_py3_only_sources(ctx.attr.srcs_version in ("PY3", "PY3ONLY")) @@ -386,7 +402,7 @@ def create_py_info(ctx, *, direct_sources, direct_pyc_files, imports): py_info.merge_uses_shared_libraries(cc_helper.is_valid_shared_library_artifact(f)) deps_transitive_sources = py_info.transitive_sources.build() - py_info.transitive_sources.add(direct_sources) + py_info.transitive_sources.add(required_py_files) # We only look at data to calculate uses_shared_libraries, if it's already # true, then we don't need to waste time looping over it. diff --git a/python/private/common/common_bazel.bzl b/python/private/common/common_bazel.bzl index c86abd27f0..6148fc2daa 100644 --- a/python/private/common/common_bazel.bzl +++ b/python/private/common/common_bazel.bzl @@ -14,7 +14,9 @@ """Common functions that are specific to Bazel rule implementation""" 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("//python/private:flags.bzl", "PrecompileFlag") load("//python/private:py_interpreter_program.bzl", "PyInterpreterProgramInfo") load("//python/private:toolchain_types.bzl", "EXEC_TOOLS_TOOLCHAIN_TYPE", "TARGET_TOOLCHAIN_TYPE") load(":attributes.bzl", "PrecompileAttr", "PrecompileInvalidationModeAttr", "PrecompileSourceRetentionAttr") @@ -60,7 +62,7 @@ def maybe_precompile(ctx, srcs): Returns: Struct of precompiling results with fields: * `keep_srcs`: list of File; the input sources that should be included - as default outputs and runfiles. + as default outputs. * `pyc_files`: list of File; the precompiled files. * `py_to_pyc_map`: dict of src File input to pyc File output. If a source file wasn't precompiled, it won't be in the dict. @@ -72,9 +74,27 @@ def maybe_precompile(ctx, srcs): if exec_tools_toolchain == None or exec_tools_toolchain.exec_tools.precompiler == None: precompile = PrecompileAttr.DISABLED else: - precompile = PrecompileAttr.get_effective_value(ctx) + precompile_flag = ctx.attr._precompile_flag[BuildSettingInfo].value + + if precompile_flag == PrecompileFlag.FORCE_ENABLED: + precompile = PrecompileAttr.ENABLED + elif precompile_flag == PrecompileFlag.FORCE_DISABLED: + precompile = PrecompileAttr.DISABLED + else: + precompile = ctx.attr.precompile + + # Unless explicitly disabled, we always generate a pyc. This allows + # binaries to decide whether to include them or not later. + if precompile != PrecompileAttr.DISABLED: + should_precompile = True + else: + should_precompile = False source_retention = PrecompileSourceRetentionAttr.get_effective_value(ctx) + keep_source = ( + not should_precompile or + source_retention == PrecompileSourceRetentionAttr.KEEP_SOURCE + ) result = struct( keep_srcs = [], @@ -82,26 +102,17 @@ def maybe_precompile(ctx, srcs): py_to_pyc_map = {}, ) for src in srcs: - # The logic below is a bit convoluted. The gist is: - # * If precompiling isn't done, add the py source to default outputs. - # Otherwise, the source retention flag decides. - # * In order to determine `use_pycache`, we have to know if the source - # is being added to the default outputs. - is_generated_source = not src.is_source - should_precompile = ( - precompile == PrecompileAttr.ENABLED or - (precompile == PrecompileAttr.IF_GENERATED_SOURCE and is_generated_source) - ) - keep_source = ( - not should_precompile or - source_retention == PrecompileSourceRetentionAttr.KEEP_SOURCE or - (source_retention == PrecompileSourceRetentionAttr.OMIT_IF_GENERATED_SOURCE and not is_generated_source) - ) if should_precompile: + # NOTE: _precompile() may return None pyc = _precompile(ctx, src, use_pycache = keep_source) + else: + pyc = None + + if pyc: result.pyc_files.append(pyc) result.py_to_pyc_map[src] = pyc - if keep_source: + + if keep_source or not pyc: result.keep_srcs.append(src) return result @@ -119,6 +130,12 @@ def _precompile(ctx, src, *, use_pycache): Returns: File of the generated pyc file. """ + + # Generating a file in another package is an error, so we have to skip + # such cases. + if ctx.label.package != src.owner.package: + return None + exec_tools_info = ctx.toolchains[EXEC_TOOLS_TOOLCHAIN_TYPE].exec_tools target_toolchain = ctx.toolchains[TARGET_TOOLCHAIN_TYPE].py3_runtime @@ -149,7 +166,11 @@ def _precompile(ctx, src, *, use_pycache): stem = src.basename[:-(len(src.extension) + 1)] if use_pycache: if not target_toolchain.pyc_tag: - fail("Unable to create __pycache__ pyc: pyc_tag is empty") + # 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. + # Instead of failing, just don't generate any pyc. + return None pyc_path = "__pycache__/{stem}.{tag}.pyc".format( stem = stem, tag = target_toolchain.pyc_tag, diff --git a/python/private/common/py_executable.bzl b/python/private/common/py_executable.bzl index cfd9961606..6c238a2a5d 100644 --- a/python/private/common/py_executable.bzl +++ b/python/private/common/py_executable.bzl @@ -18,10 +18,9 @@ load("@bazel_skylib//lib:structs.bzl", "structs") load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("@rules_cc//cc:defs.bzl", "cc_common") load("//python/private:builders.bzl", "builders") -load("//python/private:flags.bzl", "PrecompileAddToRunfilesFlag") load("//python/private:py_executable_info.bzl", "PyExecutableInfo") load("//python/private:py_info.bzl", "PyInfo") -load("//python/private:reexports.bzl", "BuiltinPyRuntimeInfo") +load("//python/private:reexports.bzl", "BuiltinPyInfo", "BuiltinPyRuntimeInfo") load( "//python/private:toolchain_types.bzl", "EXEC_TOOLS_TOOLCHAIN_TYPE", @@ -32,7 +31,9 @@ load( "AGNOSTIC_EXECUTABLE_ATTRS", "COMMON_ATTRS", "PY_SRCS_ATTRS", + "PrecompileAttr", "PycCollectionAttr", + "REQUIRED_EXEC_GROUPS", "SRCS_VERSION_ALL_VALUES", "create_srcs_attr", "create_srcs_version_attr", @@ -99,16 +100,13 @@ filename in `srcs`, `main` must be specified. doc = """ Determines whether pyc files from dependencies should be manually included. -NOTE: This setting is only useful with {flag}`--precompile_add_to_runfiles=decided_elsewhere`. - Valid values are: -* `inherit`: Inherit the value from {flag}`--pyc_collection`. -* `include_pyc`: Add pyc files from dependencies in the binary (from - {obj}`PyInfo.transitive_pyc_files`. -* `disabled`: Don't explicitly add pyc files from dependencies. Note that - pyc files may still come from dependencies if a target includes them as - part of their runfiles (such as when {obj}`--precompile_add_to_runfiles=always` - is used). +* `inherit`: Inherit the value from {flag}`--precompile`. +* `include_pyc`: Add implicitly generated pyc files from dependencies. i.e. + pyc files for targets that specify {attr}`precompile="inherit"`. +* `disabled`: Don't add implicitly generated pyc files. Note that + pyc files may still come from dependencies that enable precompiling at the + target level. """, ), # TODO(b/203567235): In Google, this attribute is deprecated, and can @@ -126,10 +124,6 @@ Valid values are: default = "//python/config_settings:bootstrap_impl", providers = [BuildSettingInfo], ), - "_pyc_collection_flag": attr.label( - default = "//python/config_settings:pyc_collection", - providers = [BuildSettingInfo], - ), "_windows_constraints": attr.label_list( default = [ "@platforms//os:windows", @@ -164,11 +158,21 @@ def py_executable_base_impl(ctx, *, semantics, is_test, inherited_environment = direct_sources = filter_to_py_srcs(ctx.files.srcs) precompile_result = semantics.maybe_precompile(ctx, direct_sources) + required_py_files = precompile_result.keep_srcs + required_pyc_files = [] + implicit_pyc_files = [] + implicit_pyc_source_files = direct_sources + + if ctx.attr.precompile == PrecompileAttr.ENABLED: + required_pyc_files.extend(precompile_result.pyc_files) + else: + implicit_pyc_files.extend(precompile_result.pyc_files) + # Sourceless precompiled builds omit the main py file from outputs, so # main has to be pointed to the precompiled main instead. - if main_py not in precompile_result.keep_srcs: + if (main_py not in precompile_result.keep_srcs and + PycCollectionAttr.is_pyc_collection_enabled(ctx)): main_py = precompile_result.py_to_pyc_map[main_py] - direct_pyc_files = depset(precompile_result.pyc_files) executable = _declare_executable_file(ctx) default_outputs = builders.DepsetBuilder() @@ -200,8 +204,10 @@ def py_executable_base_impl(ctx, *, semantics, is_test, inherited_environment = ctx, executable = executable, extra_deps = extra_deps, - main_py_files = depset([main_py] + precompile_result.keep_srcs), - direct_pyc_files = direct_pyc_files, + required_py_files = required_py_files, + required_pyc_files = required_pyc_files, + implicit_pyc_files = implicit_pyc_files, + implicit_pyc_source_files = implicit_pyc_source_files, extra_common_runfiles = [ runtime_details.runfiles, cc_details.extra_runfiles, @@ -241,8 +247,10 @@ def py_executable_base_impl(ctx, *, semantics, is_test, inherited_environment = runfiles_details = runfiles_details, main_py = main_py, imports = imports, - direct_sources = direct_sources, - direct_pyc_files = direct_pyc_files, + required_py_files = required_py_files, + required_pyc_files = required_pyc_files, + implicit_pyc_files = implicit_pyc_files, + implicit_pyc_source_files = implicit_pyc_source_files, default_outputs = default_outputs.build(), runtime_details = runtime_details, cc_info = cc_details.cc_info_for_propagating, @@ -403,8 +411,10 @@ def _get_base_runfiles_for_binary( *, executable, extra_deps, - main_py_files, - direct_pyc_files, + required_py_files, + required_pyc_files, + implicit_pyc_files, + implicit_pyc_source_files, extra_common_runfiles, semantics): """Returns the set of runfiles necessary prior to executable creation. @@ -417,8 +427,15 @@ def _get_base_runfiles_for_binary( executable: The main executable output. extra_deps: List of Targets; additional targets whose runfiles will be added to the common runfiles. - main_py_files: depset of File of the default outputs to add into runfiles. - direct_pyc_files: depset of File of pyc files directly from this target. + required_py_files: `depset[File]` the direct, `.py` sources for the + target that **must** be included by downstream targets. This should + only be Python source files. It should not include pyc files. + required_pyc_files: `depset[File]` the direct `.pyc` files this target + produces. + implicit_pyc_files: `depset[File]` pyc files that are only used if pyc + collection is enabled. + implicit_pyc_source_files: `depset[File]` source files for implicit pyc + files that are used when the implicit pyc files are not. extra_common_runfiles: List of runfiles; additional runfiles that will be added to the common runfiles. semantics: A `BinarySemantics` struct; see `create_binary_semantics_struct`. @@ -433,19 +450,31 @@ def _get_base_runfiles_for_binary( None. """ common_runfiles = builders.RunfilesBuilder() - common_runfiles.add(main_py_files) - - if ctx.attr._precompile_add_to_runfiles_flag[BuildSettingInfo].value == PrecompileAddToRunfilesFlag.ALWAYS: - common_runfiles.add(direct_pyc_files) - elif PycCollectionAttr.is_pyc_collection_enabled(ctx): - common_runfiles.add(direct_pyc_files) - for dep in (ctx.attr.deps + extra_deps): - if PyInfo not in dep: - continue - common_runfiles.add(dep[PyInfo].transitive_pyc_files) - - common_runfiles.add(collect_runfiles(ctx)) - common_runfiles.add(collect_runfiles(ctx)) + common_runfiles.files.add(required_py_files) + common_runfiles.files.add(required_pyc_files) + pyc_collection_enabled = PycCollectionAttr.is_pyc_collection_enabled(ctx) + if pyc_collection_enabled: + common_runfiles.files.add(implicit_pyc_files) + else: + 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): + continue + info = dep[PyInfo] if PyInfo in dep else dep[BuiltinPyInfo] + common_runfiles.files.add(info.transitive_sources) + + # Everything past this won't work with BuiltinPyInfo + if not hasattr(info, "transitive_pyc_files"): + continue + + common_runfiles.files.add(info.transitive_pyc_files) + if pyc_collection_enabled: + common_runfiles.files.add(info.transitive_implicit_pyc_files) + else: + common_runfiles.files.add(info.transitive_implicit_pyc_source_files) + + common_runfiles.runfiles.append(collect_runfiles(ctx)) if extra_deps: common_runfiles.add_runfiles(targets = extra_deps) common_runfiles.add(extra_common_runfiles) @@ -782,8 +811,10 @@ def _create_providers( ctx, executable, main_py, - direct_sources, - direct_pyc_files, + required_py_files, + required_pyc_files, + implicit_pyc_files, + implicit_pyc_source_files, default_outputs, runfiles_details, imports, @@ -798,10 +829,15 @@ def _create_providers( ctx: The rule ctx. executable: File; the target's executable file. main_py: File; the main .py entry point. - direct_sources: list of Files; the direct, raw `.py` sources for the target. - This should only be Python source files. It should not include pyc - files. - direct_pyc_files: depset of File; the direct pyc files for the target. + required_py_files: `depset[File]` the direct, `.py` sources for the + target that **must** be included by downstream targets. This should + only be Python source files. It should not include pyc files. + required_pyc_files: `depset[File]` the direct `.pyc` files this target + produces. + implicit_pyc_files: `depset[File]` pyc files that are only used if pyc + collection is enabled. + implicit_pyc_source_files: `depset[File]` source files for implicit pyc + files that are used when the implicit pyc files are not. default_outputs: depset of Files; the files for DefaultInfo.files runfiles_details: runfiles that will become the default and data runfiles. imports: depset of strings; the import paths to propagate @@ -876,8 +912,10 @@ def _create_providers( py_info, deps_transitive_sources, builtin_py_info = create_py_info( ctx, - direct_sources = depset(direct_sources), - direct_pyc_files = direct_pyc_files, + required_py_files = required_py_files, + required_pyc_files = required_pyc_files, + implicit_pyc_files = implicit_pyc_files, + implicit_pyc_source_files = implicit_pyc_source_files, imports = imports, ) @@ -931,6 +969,7 @@ def create_base_executable_rule(*, attrs, fragments = [], **kwargs): # The list might be frozen, so use concatentation fragments = fragments + ["py"] kwargs.setdefault("provides", []).append(PyExecutableInfo) + kwargs["exec_groups"] = REQUIRED_EXEC_GROUPS | (kwargs.get("exec_groups") or {}) return rule( # TODO: add ability to remove attrs, i.e. for imports attr attrs = dicts.add(EXECUTABLE_ATTRS, attrs), diff --git a/python/private/common/py_library.bzl b/python/private/common/py_library.bzl index 078626e063..bce18c3132 100644 --- a/python/private/common/py_library.bzl +++ b/python/private/common/py_library.bzl @@ -16,7 +16,7 @@ load("@bazel_skylib//lib:dicts.bzl", "dicts") load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("//python/private:builders.bzl", "builders") -load("//python/private:flags.bzl", "PrecompileAddToRunfilesFlag") +load("//python/private:flags.bzl", "AddSrcsToRunfilesFlag", "PrecompileFlag") load( "//python/private:toolchain_types.bzl", "EXEC_TOOLS_TOOLCHAIN_TYPE", @@ -26,6 +26,8 @@ load( ":attributes.bzl", "COMMON_ATTRS", "PY_SRCS_ATTRS", + "PrecompileAttr", + "REQUIRED_EXEC_GROUPS", "SRCS_VERSION_ALL_VALUES", "create_srcs_attr", "create_srcs_version_attr", @@ -51,6 +53,11 @@ LIBRARY_ATTRS = union_attrs( PY_SRCS_ATTRS, create_srcs_version_attr(values = SRCS_VERSION_ALL_VALUES), create_srcs_attr(mandatory = False), + { + "_add_srcs_to_runfiles_flag": attr.label( + default = "//python/config_settings:add_srcs_to_runfiles", + ), + }, ) def py_library_impl(ctx, *, semantics): @@ -67,27 +74,39 @@ def py_library_impl(ctx, *, semantics): direct_sources = filter_to_py_srcs(ctx.files.srcs) precompile_result = semantics.maybe_precompile(ctx, direct_sources) - direct_pyc_files = depset(precompile_result.pyc_files) + + required_py_files = precompile_result.keep_srcs + required_pyc_files = [] + implicit_pyc_files = [] + implicit_pyc_source_files = direct_sources + + precompile_attr = ctx.attr.precompile + precompile_flag = ctx.attr._precompile_flag[BuildSettingInfo].value + if (precompile_attr == PrecompileAttr.ENABLED or + precompile_flag == PrecompileFlag.FORCE_ENABLED): + required_pyc_files.extend(precompile_result.pyc_files) + else: + implicit_pyc_files.extend(precompile_result.pyc_files) + default_outputs = builders.DepsetBuilder() default_outputs.add(precompile_result.keep_srcs) - default_outputs.add(direct_pyc_files) + default_outputs.add(required_pyc_files) default_outputs = default_outputs.build() runfiles = builders.RunfilesBuilder() - runfiles.add(precompile_result.keep_srcs) - - if ctx.attr._precompile_add_to_runfiles_flag[BuildSettingInfo].value == PrecompileAddToRunfilesFlag.ALWAYS: - runfiles.add(direct_pyc_files) - + if AddSrcsToRunfilesFlag.is_enabled(ctx): + runfiles.add(required_py_files) runfiles.add(collect_runfiles(ctx)) runfiles = runfiles.build(ctx) cc_info = semantics.get_cc_info_for_library(ctx) py_info, deps_transitive_sources, builtins_py_info = create_py_info( ctx, - direct_sources = depset(direct_sources), + required_py_files = required_py_files, + required_pyc_files = required_pyc_files, + implicit_pyc_files = implicit_pyc_files, + implicit_pyc_source_files = implicit_pyc_source_files, imports = collect_imports(ctx, semantics), - direct_pyc_files = direct_pyc_files, ) # TODO(b/253059598): Remove support for extra actions; https://github.com/bazelbuild/bazel/issues/16455 @@ -119,6 +138,10 @@ Default outputs: NOTE: Precompilation affects which of the default outputs are included in the resulting runfiles. See the precompile-related attributes and flags for more information. + +:::{versionchanged} 0.37.0 +Source files are no longer added to the runfiles directly. +::: """ def create_py_library_rule(*, attrs = {}, **kwargs): @@ -137,6 +160,7 @@ def create_py_library_rule(*, attrs = {}, **kwargs): # TODO: b/253818097 - fragments=py is only necessary so that # RequiredConfigFragmentsTest passes fragments = kwargs.pop("fragments", None) or [] + kwargs["exec_groups"] = REQUIRED_EXEC_GROUPS | (kwargs.get("exec_groups") or {}) return rule( attrs = dicts.add(LIBRARY_ATTRS, attrs), toolchains = [ diff --git a/python/private/enum.bzl b/python/private/enum.bzl index 011d9fbda1..d71442e3b5 100644 --- a/python/private/enum.bzl +++ b/python/private/enum.bzl @@ -17,10 +17,13 @@ This is a separate file to minimize transitive loads. """ -def enum(**kwargs): +def enum(methods = {}, **kwargs): """Creates a struct whose primary purpose is to be like an enum. Args: + methods: {type}`dict[str, callable]` functions that will be + added to the created enum object, but will have the enum object + itself passed as the first positional arg when calling them. **kwargs: The fields of the returned struct. All uppercase names will be treated as enum values and added to `__members__`. @@ -33,4 +36,10 @@ def enum(**kwargs): for key, value in kwargs.items() if key.upper() == key } - return struct(__members__ = members, **kwargs) + + for name, unbound_method in methods.items(): + # buildifier: disable=uninitialized + kwargs[name] = lambda *a, **k: unbound_method(self, *a, **k) + + self = struct(__members__ = members, **kwargs) + return self diff --git a/python/private/flags.bzl b/python/private/flags.bzl index 652e117221..e7643fc1ae 100644 --- a/python/private/flags.bzl +++ b/python/private/flags.bzl @@ -21,6 +21,40 @@ unnecessary files when all that are needed are flag definitions. load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("//python/private:enum.bzl", "enum") +def _FlagEnum_flag_values(self): + return sorted(self.__members__.values()) + +def FlagEnum(**kwargs): + """Define an enum specialized for flags. + + Args: + **kwargs: members of the enum. + + Returns: + {type}`FlagEnum` struct. This is an enum with the following extras: + * `flag_values`: A function that returns a sorted list of the + flag values (enum `__members__`). Useful for passing to the + `values` attribute for string flags. + """ + return enum( + methods = dict(flag_values = _FlagEnum_flag_values), + **kwargs + ) + +def _AddSrcsToRunfilesFlag_is_enabled(ctx): + value = ctx.attr._add_srcs_to_runfiles_flag[BuildSettingInfo].value + if value == AddSrcsToRunfilesFlag.AUTO: + value = AddSrcsToRunfilesFlag.ENABLED + return value == AddSrcsToRunfilesFlag.ENABLED + +# buildifier: disable=name-conventions +AddSrcsToRunfilesFlag = FlagEnum( + AUTO = "auto", + ENABLED = "enabled", + DISABLED = "disabled", + is_enabled = _AddSrcsToRunfilesFlag_is_enabled, +) + def _bootstrap_impl_flag_get_value(ctx): return ctx.attr._bootstrap_impl_flag[BuildSettingInfo].value @@ -55,17 +89,13 @@ PrecompileFlag = enum( # Automatically decide the effective value based on environment, # target platform, etc. AUTO = "auto", - # Compile Python source files at build time. Note that - # --precompile_add_to_runfiles affects how the compiled files are included - # into a downstream binary. + # Compile Python source files at build time. ENABLED = "enabled", # Don't compile Python source files at build time. DISABLED = "disabled", - # Compile Python source files, but only if they're a generated file. - IF_GENERATED_SOURCE = "if_generated_source", # Like `enabled`, except overrides target-level setting. This is mostly # useful for development, testing enabling precompilation more broadly, or - # as an escape hatch if build-time compiling is not available. + # as an escape hatch to force all transitive deps to precompile. FORCE_ENABLED = "force_enabled", # Like `disabled`, except overrides target-level setting. This is useful # useful for development, testing enabling precompilation more broadly, or @@ -90,32 +120,5 @@ PrecompileSourceRetentionFlag = enum( KEEP_SOURCE = "keep_source", # Don't include the original py source. OMIT_SOURCE = "omit_source", - # Keep the original py source if it's a regular source file, but omit it - # if it's a generated file. - OMIT_IF_GENERATED_SOURCE = "omit_if_generated_source", get_effective_value = _precompile_source_retention_flag_get_effective_value, ) - -# Determines if a target adds its compiled files to its runfiles. When a target -# compiles its files, but doesn't add them to its own runfiles, it relies on -# a downstream target to retrieve them from `PyInfo.transitive_pyc_files` -# buildifier: disable=name-conventions -PrecompileAddToRunfilesFlag = enum( - # Always include the compiled files in the target's runfiles. - ALWAYS = "always", - # Don't include the compiled files in the target's runfiles; they are - # still added to `PyInfo.transitive_pyc_files`. See also: - # `py_binary.pyc_collection` attribute. This is useful for allowing - # incrementally enabling precompilation on a per-binary basis. - DECIDED_ELSEWHERE = "decided_elsewhere", -) - -# Determine if `py_binary` collects transitive pyc files. -# NOTE: This flag is only respect if `py_binary.pyc_collection` is `inherit`. -# buildifier: disable=name-conventions -PycCollectionFlag = enum( - # Include `PyInfo.transitive_pyc_files` as part of the binary. - INCLUDE_PYC = "include_pyc", - # Don't include `PyInfo.transitive_pyc_files` as part of the binary. - DISABLED = "disabled", -) diff --git a/python/private/proto/py_proto_library.bzl b/python/private/proto/py_proto_library.bzl index e123ff8476..ecb0938bcd 100644 --- a/python/private/proto/py_proto_library.bzl +++ b/python/private/proto/py_proto_library.bzl @@ -16,6 +16,7 @@ load("@rules_proto//proto:defs.bzl", "ProtoInfo", "proto_common") load("//python:defs.bzl", "PyInfo") +load("//python/api:api.bzl", _py_common = "py_common") PY_PROTO_TOOLCHAIN = "@rules_python//python/proto:toolchain_type" @@ -25,6 +26,7 @@ _PyProtoInfo = provider( "imports": """ (depset[str]) The field forwarding PyInfo.imports coming from the proto language runtime dependency.""", + "py_info": "PyInfo from proto runtime (or other deps) to propagate.", "runfiles_from_proto_deps": """ (depset[File]) Files from the transitive closure implicit proto dependencies""", @@ -71,6 +73,11 @@ def _py_proto_aspect_impl(target, ctx): else: proto_lang_toolchain_info = getattr(ctx.attr, "_aspect_proto_toolchain")[proto_common.ProtoLangToolchainInfo] + py_common = _py_common.get(ctx) + py_info = py_common.PyInfoBuilder().merge_target( + proto_lang_toolchain_info.runtime, + ).build() + api_deps = [proto_lang_toolchain_info.runtime] generated_sources = [] @@ -127,16 +134,19 @@ def _py_proto_aspect_impl(target, ctx): ), runfiles_from_proto_deps = runfiles_from_proto_deps, transitive_sources = transitive_sources, + py_info = py_info, ), ] _py_proto_aspect = aspect( implementation = _py_proto_aspect_impl, - attrs = {} if _incompatible_toolchains_enabled() else { - "_aspect_proto_toolchain": attr.label( - default = ":python_toolchain", - ), - }, + attrs = _py_common.API_ATTRS | ( + {} if _incompatible_toolchains_enabled() else { + "_aspect_proto_toolchain": attr.label( + default = ":python_toolchain", + ), + } + ), attr_aspects = ["deps"], required_providers = [ProtoInfo], provides = [_PyProtoInfo], @@ -159,6 +169,17 @@ def _py_proto_library_rule(ctx): transitive = [info.transitive_sources for info in pyproto_infos], ) + py_common = _py_common.get(ctx) + + py_info = py_common.PyInfoBuilder() + py_info.set_has_py2_only_sources(False) + py_info.set_has_py3_only_sources(False) + py_info.transitive_sources.add(default_outputs) + py_info.imports.add([info.imports for info in pyproto_infos]) + py_info.merge_all([ + pyproto_info.py_info + for pyproto_info in pyproto_infos + ]) return [ DefaultInfo( files = default_outputs, @@ -171,13 +192,7 @@ def _py_proto_library_rule(ctx): OutputGroupInfo( default = depset(), ), - PyInfo( - transitive_sources = default_outputs, - imports = depset(transitive = [info.imports for info in pyproto_infos]), - # Proto always produces 2- and 3- compatible source files - has_py2_only_sources = False, - has_py3_only_sources = False, - ), + py_info.build(), ] py_proto_library = rule( @@ -218,6 +233,6 @@ proto_library( providers = [ProtoInfo], aspects = [_py_proto_aspect], ), - }, + } | _py_common.API_ATTRS, provides = [PyInfo], ) diff --git a/python/private/py_info.bzl b/python/private/py_info.bzl index ce56e2330a..6c2c3c6499 100644 --- a/python/private/py_info.bzl +++ b/python/private/py_info.bzl @@ -36,7 +36,9 @@ def _PyInfo_init( has_py2_only_sources = False, has_py3_only_sources = False, direct_pyc_files = depset(), - transitive_pyc_files = depset()): + transitive_pyc_files = depset(), + transitive_implicit_pyc_files = depset(), + transitive_implicit_pyc_source_files = depset()): _check_arg_type("transitive_sources", "depset", transitive_sources) # Verify it's postorder compatible, but retain is original ordering. @@ -49,11 +51,15 @@ def _PyInfo_init( _check_arg_type("direct_pyc_files", "depset", direct_pyc_files) _check_arg_type("transitive_pyc_files", "depset", transitive_pyc_files) + _check_arg_type("transitive_implicit_pyc_files", "depset", transitive_pyc_files) + _check_arg_type("transitive_implicit_pyc_source_files", "depset", transitive_pyc_files) return { "direct_pyc_files": direct_pyc_files, "has_py2_only_sources": has_py2_only_sources, "has_py3_only_sources": has_py2_only_sources, "imports": imports, + "transitive_implicit_pyc_files": transitive_implicit_pyc_files, + "transitive_implicit_pyc_source_files": transitive_implicit_pyc_source_files, "transitive_pyc_files": transitive_pyc_files, "transitive_sources": transitive_sources, "uses_shared_libraries": uses_shared_libraries, @@ -90,6 +96,26 @@ A depset of import path strings to be added to the `PYTHONPATH` of executable Python targets. These are accumulated from the transitive `deps`. The order of the depset is not guaranteed and may be changed in the future. It is recommended to use `default` order (the default). +""", + "transitive_implicit_pyc_files": """ +:type: depset[File] + +Automatically generated pyc files that downstream binaries (or equivalent) +can choose to include in their output. If not included, then +{obj}`transitive_implicit_pyc_source_files` should be included instead. + +::::{versionadded} 0.37.0 +:::: +""", + "transitive_implicit_pyc_source_files": """ +:type: depset[File] + +Source `.py` files for {obj}`transitive_implicit_pyc_files` that downstream +binaries (or equivalent) can choose to include in their output. If not included, +then {obj}`transitive_implicit_pyc_files` should be included instead. + +::::{versionadded} 0.37.0 +:::: """, "transitive_pyc_files": """ :type: depset[File] @@ -105,6 +131,14 @@ to always include these files, as the originating target expects them to exist. A (`postorder`-compatible) depset of `.py` files appearing in the target's `srcs` and the `srcs` of the target's transitive `deps`. + +These are `.py` source files that are considered required and downstream +binaries (or equivalent) must include in their outputs. + +::::{versionchanged} 0.37.0 +The files are considered necessary for downstream binaries to function; +previously they were considerd informational and largely unused. +:::: """, "uses_shared_libraries": """ :type: bool @@ -143,6 +177,8 @@ def PyInfoBuilder(): set_has_py2_only_sources = lambda *a, **k: _PyInfoBuilder_set_has_py2_only_sources(self, *a, **k), set_has_py3_only_sources = lambda *a, **k: _PyInfoBuilder_set_has_py3_only_sources(self, *a, **k), set_uses_shared_libraries = lambda *a, **k: _PyInfoBuilder_set_uses_shared_libraries(self, *a, **k), + transitive_implicit_pyc_files = builders.DepsetBuilder(), + transitive_implicit_pyc_source_files = builders.DepsetBuilder(), transitive_pyc_files = builders.DepsetBuilder(), transitive_sources = builders.DepsetBuilder(), ) @@ -199,6 +235,8 @@ def _PyInfoBuilder_merge_all(self, transitive, *, direct = []): # BuiltinPyInfo doesn't have these fields if hasattr(info, "transitive_pyc_files"): + self.transitive_implicit_pyc_files.add(info.transitive_implicit_pyc_files) + self.transitive_implicit_pyc_source_files.add(info.transitive_implicit_pyc_source_files) self.transitive_pyc_files.add(info.transitive_pyc_files) return self @@ -220,6 +258,8 @@ def _PyInfoBuilder_build(self): kwargs = dict( direct_pyc_files = self.direct_pyc_files.build(), transitive_pyc_files = self.transitive_pyc_files.build(), + transitive_implicit_pyc_files = self.transitive_implicit_pyc_files.build(), + transitive_implicit_pyc_source_files = self.transitive_implicit_pyc_source_files.build(), ) else: kwargs = {} diff --git a/python/private/py_package.bzl b/python/private/py_package.bzl index 08f4b0b318..fd8bc2724c 100644 --- a/python/private/py_package.bzl +++ b/python/private/py_package.bzl @@ -11,9 +11,11 @@ # 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_package rule" +load(":builders.bzl", "builders") +load(":py_info.bzl", "PyInfoBuilder") + def _path_inside_wheel(input_file): # input_file.short_path is sometimes relative ("../${repository_root}/foobar") # which is not a valid path within a zip file. Fix that. @@ -31,10 +33,20 @@ def _path_inside_wheel(input_file): return short_path def _py_package_impl(ctx): - inputs = depset( - transitive = [dep[DefaultInfo].data_runfiles.files for dep in ctx.attr.deps] + - [dep[DefaultInfo].default_runfiles.files for dep in ctx.attr.deps], - ) + inputs = builders.DepsetBuilder() + py_info = PyInfoBuilder() + for dep in ctx.attr.deps: + inputs.add(dep[DefaultInfo].data_runfiles.files) + inputs.add(dep[DefaultInfo].default_runfiles.files) + py_info.merge_target(dep) + py_info = py_info.build() + inputs.add(py_info.transitive_sources) + + # Remove conditional once Bazel 6 support dropped. + if hasattr(py_info, "transitive_pyc_files"): + inputs.add(py_info.transitive_pyc_files) + + inputs = inputs.build() # TODO: '/' is wrong on windows, but the path separator is not available in starlark. # Fix this once ctx.configuration has directory separator information. diff --git a/tests/base_rules/precompile/precompile_tests.bzl b/tests/base_rules/precompile/precompile_tests.bzl index 4c0f936ac5..9d6ac5f7d4 100644 --- a/tests/base_rules/precompile/precompile_tests.bzl +++ b/tests/base_rules/precompile/precompile_tests.bzl @@ -26,11 +26,10 @@ load("//python:py_test.bzl", "py_test") load("//tests/support:py_info_subject.bzl", "py_info_subject") load( "//tests/support:support.bzl", + "ADD_SRCS_TO_RUNFILES", "CC_TOOLCHAIN", "EXEC_TOOLS_TOOLCHAIN", "PRECOMPILE", - "PRECOMPILE_ADD_TO_RUNFILES", - "PRECOMPILE_SOURCE_RETENTION", "PY_TOOLCHAINS", ) @@ -44,7 +43,7 @@ _COMMON_CONFIG_SETTINGS = { _tests = [] -def _test_precompile_enabled_setup(name, py_rule, **kwargs): +def _test_executable_precompile_attr_enabled_setup(name, py_rule, **kwargs): if not rp_config.enable_pystar: rt_util.skip_test(name = name) return @@ -53,31 +52,43 @@ def _test_precompile_enabled_setup(name, py_rule, **kwargs): name = name + "_subject", precompile = "enabled", srcs = ["main.py"], - deps = [name + "_lib"], + deps = [name + "_lib1"], **kwargs ) rt_util.helper_target( py_library, - name = name + "_lib", - srcs = ["lib.py"], + name = name + "_lib1", + srcs = ["lib1.py"], + precompile = "enabled", + deps = [name + "_lib2"], + ) + + # 2nd order target to verify propagation + rt_util.helper_target( + py_library, + name = name + "_lib2", + srcs = ["lib2.py"], precompile = "enabled", ) analysis_test( name = name, - impl = _test_precompile_enabled_impl, + impl = _test_executable_precompile_attr_enabled_impl, target = name + "_subject", config_settings = _COMMON_CONFIG_SETTINGS, ) -def _test_precompile_enabled_impl(env, target): +def _test_executable_precompile_attr_enabled_impl(env, target): target = env.expect.that_target(target) runfiles = target.runfiles() - runfiles.contains_predicate( + runfiles_contains_at_least_predicates(runfiles, [ matching.str_matches("__pycache__/main.fakepy-45.pyc"), - ) - runfiles.contains_predicate( + matching.str_matches("__pycache__/lib1.fakepy-45.pyc"), + matching.str_matches("__pycache__/lib2.fakepy-45.pyc"), matching.str_matches("/main.py"), - ) + matching.str_matches("/lib1.py"), + matching.str_matches("/lib2.py"), + ]) + target.default_outputs().contains_at_least_predicates([ matching.file_path_matches("__pycache__/main.fakepy-45.pyc"), matching.file_path_matches("/main.py"), @@ -88,23 +99,85 @@ def _test_precompile_enabled_impl(env, target): ]) py_info.transitive_pyc_files().contains_exactly([ "{package}/__pycache__/main.fakepy-45.pyc", - "{package}/__pycache__/lib.fakepy-45.pyc", + "{package}/__pycache__/lib1.fakepy-45.pyc", + "{package}/__pycache__/lib2.fakepy-45.pyc", ]) def _test_precompile_enabled_py_binary(name): - _test_precompile_enabled_setup(name = name, py_rule = py_binary, main = "main.py") + _test_executable_precompile_attr_enabled_setup(name = name, py_rule = py_binary, main = "main.py") _tests.append(_test_precompile_enabled_py_binary) def _test_precompile_enabled_py_test(name): - _test_precompile_enabled_setup(name = name, py_rule = py_test, main = "main.py") + _test_executable_precompile_attr_enabled_setup(name = name, py_rule = py_test, main = "main.py") _tests.append(_test_precompile_enabled_py_test) -def _test_precompile_enabled_py_library(name): - _test_precompile_enabled_setup(name = name, py_rule = py_library) +def _test_precompile_enabled_py_library_setup(name, impl, config_settings): + if not rp_config.enable_pystar: + rt_util.skip_test(name = name) + return + rt_util.helper_target( + py_library, + name = name + "_subject", + srcs = ["lib.py"], + precompile = "enabled", + ) + analysis_test( + name = name, + impl = impl, #_test_precompile_enabled_py_library_impl, + target = name + "_subject", + config_settings = _COMMON_CONFIG_SETTINGS | config_settings, + ) + +def _test_precompile_enabled_py_library_common_impl(env, target): + target = env.expect.that_target(target) + + target.default_outputs().contains_at_least_predicates([ + matching.file_path_matches("__pycache__/lib.fakepy-45.pyc"), + matching.file_path_matches("/lib.py"), + ]) + py_info = target.provider(PyInfo, factory = py_info_subject) + py_info.direct_pyc_files().contains_exactly([ + "{package}/__pycache__/lib.fakepy-45.pyc", + ]) + py_info.transitive_pyc_files().contains_exactly([ + "{package}/__pycache__/lib.fakepy-45.pyc", + ]) + +def _test_precompile_enabled_py_library_add_to_runfiles_disabled(name): + _test_precompile_enabled_py_library_setup( + name = name, + impl = _test_precompile_enabled_py_library_add_to_runfiles_disabled_impl, + config_settings = { + ADD_SRCS_TO_RUNFILES: "disabled", + }, + ) + +def _test_precompile_enabled_py_library_add_to_runfiles_disabled_impl(env, target): + _test_precompile_enabled_py_library_common_impl(env, target) + runfiles = env.expect.that_target(target).runfiles() + runfiles.contains_exactly([]) + +_tests.append(_test_precompile_enabled_py_library_add_to_runfiles_disabled) + +def _test_precompile_enabled_py_library_add_to_runfiles_enabled(name): + _test_precompile_enabled_py_library_setup( + name = name, + impl = _test_precompile_enabled_py_library_add_to_runfiles_enabled_impl, + config_settings = { + ADD_SRCS_TO_RUNFILES: "enabled", + }, + ) + +def _test_precompile_enabled_py_library_add_to_runfiles_enabled_impl(env, target): + _test_precompile_enabled_py_library_common_impl(env, target) + runfiles = env.expect.that_target(target).runfiles() + runfiles.contains_exactly([ + "{workspace}/{package}/lib.py", + ]) -_tests.append(_test_precompile_enabled_py_library) +_tests.append(_test_precompile_enabled_py_library_add_to_runfiles_enabled) def _test_pyc_only(name): if not rp_config.enable_pystar: @@ -117,12 +190,19 @@ def _test_pyc_only(name): srcs = ["main.py"], main = "main.py", precompile_source_retention = "omit_source", + pyc_collection = "include_pyc", + deps = [name + "_lib"], + ) + rt_util.helper_target( + py_library, + name = name + "_lib", + srcs = ["lib.py"], + precompile_source_retention = "omit_source", ) analysis_test( name = name, impl = _test_pyc_only_impl, config_settings = _COMMON_CONFIG_SETTINGS | { - ##PRECOMPILE_SOURCE_RETENTION: "omit_source", PRECOMPILE: "enabled", }, target = name + "_subject", @@ -136,9 +216,15 @@ def _test_pyc_only_impl(env, target): runfiles.contains_predicate( matching.str_matches("/main.pyc"), ) + runfiles.contains_predicate( + matching.str_matches("/lib.pyc"), + ) runfiles.not_contains_predicate( matching.str_endswith("/main.py"), ) + runfiles.not_contains_predicate( + matching.str_endswith("/lib.py"), + ) target.default_outputs().contains_at_least_predicates([ matching.file_path_matches("/main.pyc"), ]) @@ -146,165 +232,291 @@ def _test_pyc_only_impl(env, target): matching.file_basename_equals("main.py"), ) -def _test_precompile_if_generated(name): +def _test_precompiler_action(name): if not rp_config.enable_pystar: rt_util.skip_test(name = name) return rt_util.helper_target( py_binary, name = name + "_subject", - srcs = [ - "main.py", - rt_util.empty_file("generated1.py"), - ], - main = "main.py", - precompile = "if_generated_source", + srcs = ["main2.py"], + main = "main2.py", + precompile = "enabled", + precompile_optimize_level = 2, + precompile_invalidation_mode = "unchecked_hash", ) analysis_test( name = name, - impl = _test_precompile_if_generated_impl, + impl = _test_precompiler_action_impl, target = name + "_subject", config_settings = _COMMON_CONFIG_SETTINGS, ) -_tests.append(_test_precompile_if_generated) +_tests.append(_test_precompiler_action) -def _test_precompile_if_generated_impl(env, target): - target = env.expect.that_target(target) - runfiles = target.runfiles() - runfiles.contains_predicate( - matching.str_matches("/__pycache__/generated1.fakepy-45.pyc"), - ) - runfiles.not_contains_predicate( - matching.str_matches("main.*pyc"), - ) - target.default_outputs().contains_at_least_predicates([ - matching.file_path_matches("/__pycache__/generated1.fakepy-45.pyc"), +def _test_precompiler_action_impl(env, target): + action = env.expect.that_target(target).action_named("PyCompile") + action.contains_flag_values([ + ("--optimize", "2"), + ("--python_version", "4.5"), + ("--invalidation_mode", "unchecked_hash"), ]) - target.default_outputs().not_contains_predicate( - matching.file_path_matches("main.*pyc"), - ) + action.has_flags_specified(["--src", "--pyc", "--src_name"]) + action.env().contains_at_least({ + "PYTHONHASHSEED": "0", + "PYTHONNOUSERSITE": "1", + "PYTHONSAFEPATH": "1", + }) -def _test_omit_source_if_generated_source(name): - if not rp_config.enable_pystar: - rt_util.skip_test(name = name) - return +def _setup_precompile_flag_pyc_collection_attr_interaction( + *, + name, + pyc_collection_attr, + precompile_flag, + test_impl): rt_util.helper_target( py_binary, - name = name + "_subject", - srcs = [ - "main.py", - rt_util.empty_file("generated2.py"), + name = name + "_bin", + srcs = ["bin.py"], + main = "bin.py", + precompile = "disabled", + pyc_collection = pyc_collection_attr, + deps = [ + name + "_lib_inherit", + name + "_lib_enabled", + name + "_lib_disabled", ], - main = "main.py", + ) + rt_util.helper_target( + py_library, + name = name + "_lib_inherit", + srcs = ["lib_inherit.py"], + precompile = "inherit", + ) + rt_util.helper_target( + py_library, + name = name + "_lib_enabled", + srcs = ["lib_enabled.py"], precompile = "enabled", ) + rt_util.helper_target( + py_library, + name = name + "_lib_disabled", + srcs = ["lib_disabled.py"], + precompile = "disabled", + ) analysis_test( name = name, - impl = _test_omit_source_if_generated_source_impl, - target = name + "_subject", + impl = test_impl, + target = name + "_bin", config_settings = _COMMON_CONFIG_SETTINGS | { - PRECOMPILE_SOURCE_RETENTION: "omit_if_generated_source", + PRECOMPILE: precompile_flag, }, ) -_tests.append(_test_omit_source_if_generated_source) +def _verify_runfiles(contains_patterns, not_contains_patterns): + def _verify_runfiles_impl(env, target): + runfiles = env.expect.that_target(target).runfiles() + for pattern in contains_patterns: + runfiles.contains_predicate(matching.str_matches(pattern)) + for pattern in not_contains_patterns: + runfiles.not_contains_predicate( + matching.str_matches(pattern), + ) -def _test_omit_source_if_generated_source_impl(env, target): - target = env.expect.that_target(target) - runfiles = target.runfiles() - runfiles.contains_predicate( - matching.str_matches("/generated2.pyc"), + return _verify_runfiles_impl + +def _test_precompile_flag_enabled_pyc_collection_attr_include_pyc(name): + if not rp_config.enable_pystar: + rt_util.skip_test(name = name) + return + _setup_precompile_flag_pyc_collection_attr_interaction( + name = name, + precompile_flag = "enabled", + pyc_collection_attr = "include_pyc", + test_impl = _verify_runfiles( + contains_patterns = [ + "__pycache__/lib_enabled.*.pyc", + "__pycache__/lib_inherit.*.pyc", + ], + not_contains_patterns = [ + "/bin*.pyc", + "/lib_disabled*.pyc", + ], + ), ) - runfiles.contains_predicate( - matching.str_matches("__pycache__/main.fakepy-45.pyc"), + +_tests.append(_test_precompile_flag_enabled_pyc_collection_attr_include_pyc) + +# buildifier: disable=function-docstring-header +def _test_precompile_flag_enabled_pyc_collection_attr_disabled(name): + """Verify that a binary can opt-out of using implicit pycs even when + precompiling is enabled by default. + """ + if not rp_config.enable_pystar: + rt_util.skip_test(name = name) + return + _setup_precompile_flag_pyc_collection_attr_interaction( + name = name, + precompile_flag = "enabled", + pyc_collection_attr = "disabled", + test_impl = _verify_runfiles( + contains_patterns = [ + "__pycache__/lib_enabled.*.pyc", + ], + not_contains_patterns = [ + "/bin*.pyc", + "/lib_disabled*.pyc", + "/lib_inherit.*.pyc", + ], + ), ) - target.default_outputs().contains_at_least_predicates([ - matching.file_path_matches("generated2.pyc"), - ]) - target.default_outputs().contains_predicate( - matching.file_path_matches("__pycache__/main.fakepy-45.pyc"), + +_tests.append(_test_precompile_flag_enabled_pyc_collection_attr_disabled) + +# buildifier: disable=function-docstring-header +def _test_precompile_flag_disabled_pyc_collection_attr_include_pyc(name): + """Verify that a binary can opt-in to using pycs even when precompiling is + disabled by default.""" + if not rp_config.enable_pystar: + rt_util.skip_test(name = name) + return + _setup_precompile_flag_pyc_collection_attr_interaction( + name = name, + precompile_flag = "disabled", + pyc_collection_attr = "include_pyc", + test_impl = _verify_runfiles( + contains_patterns = [ + "__pycache__/lib_enabled.*.pyc", + "__pycache__/lib_inherit.*.pyc", + ], + not_contains_patterns = [ + "/bin*.pyc", + "/lib_disabled*.pyc", + ], + ), + ) + +_tests.append(_test_precompile_flag_disabled_pyc_collection_attr_include_pyc) + +def _test_precompile_flag_disabled_pyc_collection_attr_disabled(name): + if not rp_config.enable_pystar: + rt_util.skip_test(name = name) + return + _setup_precompile_flag_pyc_collection_attr_interaction( + name = name, + precompile_flag = "disabled", + pyc_collection_attr = "disabled", + test_impl = _verify_runfiles( + contains_patterns = [ + "__pycache__/lib_enabled.*.pyc", + ], + not_contains_patterns = [ + "/bin*.pyc", + "/lib_disabled*.pyc", + "/lib_inherit.*.pyc", + ], + ), ) -def _test_precompile_add_to_runfiles_decided_elsewhere(name): +_tests.append(_test_precompile_flag_disabled_pyc_collection_attr_disabled) + +# buildifier: disable=function-docstring-header +def _test_pyc_collection_disabled_library_omit_source(name): + """Verify that, when a binary doesn't include implicit pyc files, libraries + that set omit_source still have the py source file included. + """ if not rp_config.enable_pystar: rt_util.skip_test(name = name) return rt_util.helper_target( py_binary, - name = name + "_binary", + name = name + "_subject", srcs = ["bin.py"], main = "bin.py", deps = [name + "_lib"], - pyc_collection = "include_pyc", + pyc_collection = "disabled", ) rt_util.helper_target( py_library, name = name + "_lib", srcs = ["lib.py"], + precompile = "inherit", + precompile_source_retention = "omit_source", ) analysis_test( name = name, - impl = _test_precompile_add_to_runfiles_decided_elsewhere_impl, - targets = { - "binary": name + "_binary", - "library": name + "_lib", - }, - config_settings = _COMMON_CONFIG_SETTINGS | { - PRECOMPILE_ADD_TO_RUNFILES: "decided_elsewhere", - PRECOMPILE: "enabled", - }, + impl = _test_pyc_collection_disabled_library_omit_source_impl, + target = name + "_subject", + config_settings = _COMMON_CONFIG_SETTINGS, ) -_tests.append(_test_precompile_add_to_runfiles_decided_elsewhere) - -def _test_precompile_add_to_runfiles_decided_elsewhere_impl(env, targets): - env.expect.that_target(targets.binary).runfiles().contains_at_least([ - "{workspace}/{package}/__pycache__/bin.fakepy-45.pyc", - "{workspace}/{package}/__pycache__/lib.fakepy-45.pyc", - "{workspace}/{package}/bin.py", - "{workspace}/{package}/lib.py", - ]) +def _test_pyc_collection_disabled_library_omit_source_impl(env, target): + contains_patterns = [ + "/lib.py", + "/bin.py", + ] + not_contains_patterns = [ + "/lib.*pyc", + "/bin.*pyc", + ] + runfiles = env.expect.that_target(target).runfiles() + for pattern in contains_patterns: + runfiles.contains_predicate(matching.str_matches(pattern)) + for pattern in not_contains_patterns: + runfiles.not_contains_predicate( + matching.str_matches(pattern), + ) - env.expect.that_target(targets.library).runfiles().contains_exactly([ - "{workspace}/{package}/lib.py", - ]) +_tests.append(_test_pyc_collection_disabled_library_omit_source) -def _test_precompiler_action(name): +def _test_pyc_collection_include_dep_omit_source(name): if not rp_config.enable_pystar: rt_util.skip_test(name = name) return rt_util.helper_target( py_binary, name = name + "_subject", - srcs = ["main2.py"], - main = "main2.py", - precompile = "enabled", - precompile_optimize_level = 2, - precompile_invalidation_mode = "unchecked_hash", + srcs = ["bin.py"], + main = "bin.py", + deps = [name + "_lib"], + precompile = "disabled", + pyc_collection = "include_pyc", + ) + rt_util.helper_target( + py_library, + name = name + "_lib", + srcs = ["lib.py"], + precompile = "inherit", + precompile_source_retention = "omit_source", ) analysis_test( name = name, - impl = _test_precompiler_action_impl, + impl = _test_pyc_collection_include_dep_omit_source_impl, target = name + "_subject", config_settings = _COMMON_CONFIG_SETTINGS, ) -_tests.append(_test_precompiler_action) +def _test_pyc_collection_include_dep_omit_source_impl(env, target): + contains_patterns = [ + "/lib.pyc", + ] + not_contains_patterns = [ + "/lib.py", + ] + runfiles = env.expect.that_target(target).runfiles() + for pattern in contains_patterns: + runfiles.contains_predicate(matching.str_endswith(pattern)) + for pattern in not_contains_patterns: + runfiles.not_contains_predicate( + matching.str_endswith(pattern), + ) -def _test_precompiler_action_impl(env, target): - action = env.expect.that_target(target).action_named("PyCompile") - action.contains_flag_values([ - ("--optimize", "2"), - ("--python_version", "4.5"), - ("--invalidation_mode", "unchecked_hash"), - ]) - action.has_flags_specified(["--src", "--pyc", "--src_name"]) - action.env().contains_at_least({ - "PYTHONHASHSEED": "0", - "PYTHONNOUSERSITE": "1", - "PYTHONSAFEPATH": "1", - }) +_tests.append(_test_pyc_collection_include_dep_omit_source) + +def runfiles_contains_at_least_predicates(runfiles, predicates): + for predicate in predicates: + runfiles.contains_predicate(predicate) def precompile_test_suite(name): test_suite( diff --git a/tests/support/support.bzl b/tests/support/support.bzl index 150ca7f4a4..7358a6b1ee 100644 --- a/tests/support/support.bzl +++ b/tests/support/support.bzl @@ -32,9 +32,9 @@ CROSSTOOL_TOP = Label("//tests/support/cc_toolchains:cc_toolchain_suite") # str() around Label() is necessary because rules_testing's config_settings # doesn't accept yet Label objects. +ADD_SRCS_TO_RUNFILES = str(Label("//python/config_settings:add_srcs_to_runfiles")) EXEC_TOOLS_TOOLCHAIN = str(Label("//python/config_settings:exec_tools_toolchain")) PRECOMPILE = str(Label("//python/config_settings:precompile")) -PRECOMPILE_ADD_TO_RUNFILES = str(Label("//python/config_settings:precompile_add_to_runfiles")) PRECOMPILE_SOURCE_RETENTION = str(Label("//python/config_settings:precompile_source_retention")) PYC_COLLECTION = str(Label("//python/config_settings:pyc_collection")) PYTHON_VERSION = str(Label("//python/config_settings:python_version")) From 0e604b06ae4c29c9d386677d3ac57ffe4012e3d7 Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Sat, 12 Oct 2024 20:31:04 -0700 Subject: [PATCH 248/345] fix(pip): skip wheel patching with empty patches (#2294) Previously if you pulled multiple wheels of the same dep, even ones not affected by patches would be processed, which is expensive for larger wheels because of the unzipping / re-zipping. Fixes https://github.com/bazelbuild/rules_python/issues/2263 --- CHANGELOG.md | 2 + examples/bzlmod/MODULE.bazel.lock | 174 +++++++++++++++++----------- python/private/pypi/patch_whl.bzl | 3 + python/private/pypi/whl_library.bzl | 19 +-- 4 files changed, 119 insertions(+), 79 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index abaa2bba39..835d541641 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,8 @@ A brief description of the categories of changes: ([#1675](https://github.com/bazelbuild/rules_python/issues/1675)). * (precompiling) The {obj}`pyc_collection` attribute now correctly enables (or disables) using pyc files from targets transitively +* (pip) Skip patching wheels not matching `pip.override`'s `file` + ([#2294](https://github.com/bazelbuild/rules_python/pull/2294)). ### Added * (py_wheel) Now supports `compress = (True|False)` to allow disabling diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 8ef6e97588..e292528dc0 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1231,7 +1231,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "Rc0r+OwZ3f57lwygvIXLejgTsJKr8ezIcd136SpMyDo=", + "bzlTransitiveDigest": "R4UDOUIolqXHNPsTlMq16g3t0xLeGMK/p7Ou1Cziz04=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6138,12 +6138,12 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "s4J1aKQE20A+qzGkeB4XwzitVphP4H3vYmeLg6pMZxA=", + "bzlTransitiveDigest": "8o/oP53WcjE/4DQ4VQ0l0IVCa/i3A1mTDmN05qwm0yM=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", - "@@rules_python~//tools/publish/requirements_windows.txt": "15472d5a28e068d31ba9e2dc389459698afaff366e9db06e15890283a3ea252e", - "@@rules_python~//tools/publish/requirements_darwin.txt": "61cf602ff33b58c5f42a6cee30112985e9b502209605314e313157f8aad679f9" + "@@rules_python~//tools/publish/requirements_windows.txt": "27831a1477549ad865043f17a9c1dd9a19566d460ba1f68cd8dfded642accbca", + "@@rules_python~//tools/publish/requirements_darwin.txt": "91df49ab0079887f6b7ee4035f9e2a686036c749e7ce82837a4a74b471e4a9aa" }, "recordedDirentsInputs": {}, "envVariables": { @@ -6333,46 +6333,6 @@ ] } }, - "rules_python_publish_deps_311_idna_py3_none_any_82fee1fc": { - "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.7-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "idna==3.7", - "sha256": "82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0", - "urls": [ - "https://files.pythonhosted.org/packages/e5/3e/741d8c82801c347547f8a2a06aa57dbb1992be9e948df2ea0eda2c8b79e8/idna-3.7-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_certifi_py3_none_any_c198e21b": { - "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.7.4-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "certifi==2024.7.4", - "sha256": "c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90", - "urls": [ - "https://files.pythonhosted.org/packages/1c/d5/c84e1a17bf61d4df64ca866a1c9a913874b4e9bdc131ec689a0ad013fb36/certifi-2024.7.4-py3-none-any.whl" - ] - } - }, "rules_python_publish_deps_311_requests_toolbelt_py2_none_any_18565aa5": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -6719,6 +6679,26 @@ ] } }, + "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", @@ -7102,6 +7082,26 @@ ] } }, + "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", @@ -7144,6 +7144,26 @@ ] } }, + "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", @@ -7189,6 +7209,26 @@ ] } }, + "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", @@ -7495,7 +7535,7 @@ ] } }, - "rules_python_publish_deps_311_certifi_sdist_5a1e7645": { + "rules_python_publish_deps_311_idna_py3_none_any_946d195a": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7505,13 +7545,13 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "certifi-2024.7.4.tar.gz", + "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": "certifi==2024.7.4", - "sha256": "5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", + "requirement": "idna==3.10", + "sha256": "946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", "urls": [ - "https://files.pythonhosted.org/packages/c2/02/a95f2b11e207f68bc64d7aae9666fed2e2b3f307748d5123dffb72a1bbea/certifi-2024.7.4.tar.gz" + "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl" ] } }, @@ -7848,10 +7888,7 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "cp311_linux_x86_64" ], "filename": "docutils-0.19-py3-none-any.whl", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", @@ -7873,10 +7910,7 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "cp311_linux_x86_64" ], "filename": "docutils-0.19.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", @@ -7888,7 +7922,7 @@ ] } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_66394663": { + "rules_python_publish_deps_311_docutils_py3_none_any_dafca5b9": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7898,17 +7932,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", + "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": "charset-normalizer==3.3.2", - "sha256": "663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "requirement": "docutils==0.21.2", + "sha256": "dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", "urls": [ - "https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl" + "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_idna_sdist_028ff3aa": { + "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": { @@ -7918,13 +7952,13 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "idna-3.7.tar.gz", + "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": "idna==3.7", - "sha256": "028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", + "requirement": "charset-normalizer==3.3.2", + "sha256": "663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", "urls": [ - "https://files.pythonhosted.org/packages/21/ed/f86a79a07470cb07819390452f178b3bef1d375f2ec021ecfc709fc7cf07/idna-3.7.tar.gz" + "https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl" ] } }, @@ -8075,19 +8109,19 @@ "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.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\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"idna-3.7-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_idna_py3_none_any_82fee1fc\",\"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.7.tar.gz\",\"repo\":\"rules_python_publish_deps_311_idna_sdist_028ff3aa\",\"target_platforms\":[\"cp311_osx_aarch64\",\"cp311_osx_x86_64\",\"cp311_windows_x86_64\"],\"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.7.4-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_certifi_py3_none_any_c198e21b\",\"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.7.4.tar.gz\",\"repo\":\"rules_python_publish_deps_311_certifi_sdist_5a1e7645\",\"target_platforms\":[\"cp311_osx_aarch64\",\"cp311_osx_x86_64\",\"cp311_windows_x86_64\"],\"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\":null,\"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\":null,\"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\"}]", diff --git a/python/private/pypi/patch_whl.bzl b/python/private/pypi/patch_whl.bzl index c2c633da7f..74cd890bad 100644 --- a/python/private/pypi/patch_whl.bzl +++ b/python/private/pypi/patch_whl.bzl @@ -60,6 +60,9 @@ def patch_whl(rctx, *, python_interpreter, whl_path, patches, **kwargs): if not rctx.delete(whl_file_zip): fail("Failed to remove the symlink after extracting") + if not patches: + fail("Trying to patch wheel without any patches") + for patch_file, patch_strip in patches.items(): rctx.patch(patch_file, strip = patch_strip) diff --git a/python/private/pypi/whl_library.bzl b/python/private/pypi/whl_library.bzl index 60e46b3480..82fe072655 100644 --- a/python/private/pypi/whl_library.bzl +++ b/python/private/pypi/whl_library.bzl @@ -266,15 +266,16 @@ def _whl_library_impl(rctx): if whl_path.basename in patch_dst.whls: patches[patch_file] = patch_dst.patch_strip - whl_path = patch_whl( - rctx, - op = "whl_library.PatchWhl({}, {})".format(rctx.attr.name, rctx.attr.requirement), - python_interpreter = python_interpreter, - whl_path = whl_path, - patches = patches, - quiet = rctx.attr.quiet, - timeout = rctx.attr.timeout, - ) + if patches: + whl_path = patch_whl( + rctx, + op = "whl_library.PatchWhl({}, {})".format(rctx.attr.name, rctx.attr.requirement), + python_interpreter = python_interpreter, + whl_path = whl_path, + patches = patches, + quiet = rctx.attr.quiet, + timeout = rctx.attr.timeout, + ) target_platforms = rctx.attr.experimental_target_platforms if target_platforms: From 19910469eeb1ebea49ef620a1557bce10e9edc6b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 10:58:29 +0900 Subject: [PATCH 249/345] build(deps): bump urllib3 from 2.2.2 to 2.2.3 in /docs (#2301) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.2.2 to 2.2.3.
Release notes

Sourced from urllib3's releases.

2.2.3

🚀 urllib3 is fundraising for HTTP/2 support

urllib3 is raising ~$40,000 USD to release HTTP/2 support and ensure long-term sustainable maintenance of the project after a sharp decline in financial support for 2023. If your company or organization uses Python and would benefit from HTTP/2 support in Requests, pip, cloud SDKs, and thousands of other projects please consider contributing financially to ensure HTTP/2 support is developed sustainably and maintained for the long-haul.

Thank you for your support.

Features

  • Added support for Python 3.13. (#3473)

Bugfixes

  • Fixed the default encoding of chunked request bodies to be UTF-8 instead of ISO-8859-1. All other methods of supplying a request body already use UTF-8 starting in urllib3 v2.0. (#3053)
  • Fixed ResourceWarning on CONNECT with Python < 3.11.4 by backporting python/cpython#103472. (`#3252)
  • Adjust tolerance for floating-point comparison on Windows to avoid flakiness in CI (#3413)
  • Fixed a crash where certain standard library hash functions were absent in restricted environments. (#3432)
  • Fixed mypy error when adding to HTTPConnection.default_socket_options. (#3448)

HTTP/2 (experimental)

HTTP/2 support is still in early development.

  • Excluded Transfer-Encoding: chunked from HTTP/2 request body (#3425)
  • Added version checking for h2 (https://pypi.org/project/h2/) usage. Now only accepting supported h2 major version 4.x.x. (#3290)
  • Added a probing mechanism for determining whether a given target origin supports HTTP/2 via ALPN. (#3301)
  • Add support for sending a request body with HTTP/2 (#3302)

Full Changelog: https://github.com/urllib3/urllib3/compare/2.2.2...2.2.3

Changelog

Sourced from urllib3's changelog.

2.2.3 (2024-09-12)

Features

  • Added support for Python 3.13. ([#3473](https://github.com/urllib3/urllib3/issues/3473) <https://github.com/urllib3/urllib3/issues/3473>__)

Bugfixes

  • Fixed the default encoding of chunked request bodies to be UTF-8 instead of ISO-8859-1. All other methods of supplying a request body already use UTF-8 starting in urllib3 v2.0. ([#3053](https://github.com/urllib3/urllib3/issues/3053) <https://github.com/urllib3/urllib3/issues/3053>__)
  • Fixed ResourceWarning on CONNECT with Python `__)
  • Adjust tolerance for floating-point comparison on Windows to avoid flakiness in CI ([#3413](https://github.com/urllib3/urllib3/issues/3413) <https://github.com/urllib3/urllib3/issues/3413>__)
  • Fixed a crash where certain standard library hash functions were absent in restricted environments. ([#3432](https://github.com/urllib3/urllib3/issues/3432) <https://github.com/urllib3/urllib3/issues/3432>__)
  • Fixed mypy error when adding to HTTPConnection.default_socket_options. ([#3448](https://github.com/urllib3/urllib3/issues/3448) <https://github.com/urllib3/urllib3/issues/3448>__)

HTTP/2 (experimental)

HTTP/2 support is still in early development.

  • Excluded Transfer-Encoding: chunked from HTTP/2 request body ([#3425](https://github.com/urllib3/urllib3/issues/3425) <https://github.com/urllib3/urllib3/issues/3425>__)

  • Added version checking for h2 (https://pypi.org/project/h2/) usage.

    Now only accepting supported h2 major version 4.x.x. ([#3290](https://github.com/urllib3/urllib3/issues/3290) <https://github.com/urllib3/urllib3/issues/3290>__)

  • Added a probing mechanism for determining whether a given target origin supports HTTP/2 via ALPN. ([#3301](https://github.com/urllib3/urllib3/issues/3301) <https://github.com/urllib3/urllib3/issues/3301>__)

  • Add support for sending a request body with HTTP/2 ([#3302](https://github.com/urllib3/urllib3/issues/3302) <https://github.com/urllib3/urllib3/issues/3302>__)

Deprecations and Removals

  • Note for downstream distributors: the _version.py file has been removed and is now created at build time by hatch-vcs. ([#3412](https://github.com/urllib3/urllib3/issues/3412) <https://github.com/urllib3/urllib3/issues/3412>__)
  • Drop support for end-of-life PyPy3.8 and PyPy3.9. ([#3475](https://github.com/urllib3/urllib3/issues/3475) <https://github.com/urllib3/urllib3/issues/3475>__)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=urllib3&package-manager=pip&previous-version=2.2.2&new-version=2.2.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 6f417d90b0..81335881d7 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -354,7 +354,7 @@ typing-extensions==4.12.2 \ # via # rules-python-docs (docs/pyproject.toml) # sphinx-autodoc2 -urllib3==2.2.2 \ - --hash=sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472 \ - --hash=sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168 +urllib3==2.2.3 \ + --hash=sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac \ + --hash=sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9 # via requests From 92f0a080dae9a43f181e0cac03e73904116bc092 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 10:59:57 +0900 Subject: [PATCH 250/345] build(deps): bump markupsafe from 2.1.5 to 3.0.1 in /docs (#2302) Bumps [markupsafe](https://github.com/pallets/markupsafe) from 2.1.5 to 3.0.1.
Release notes

Sourced from markupsafe's releases.

3.0.1

This is the MarkupSafe 3.0.1 fix release, which fixes bugs but does not otherwise change behavior and should not result in breaking changes.

PyPI: https://pypi.org/project/MarkupSafe/3.0.1/ Changes: https://markupsafe.palletsprojects.com/page/changes/#version-3-0-1 (pending a fix to the docs build) Milestone: https://github.com/pallets/markupsafe/milestone/13?closed=1

  • Address compiler warnings that became errors in GCC 14. #466
  • Fix compatibility with proxy objects. #467

3.0.0

This is the MarkupSafe 3.0.0 feature release. A feature release may include new features, remove previously deprecated code, add new deprecations, or introduce potentially breaking changes. The 3.0.x branch is now the supported fix branch, the 2.1.x branch will become a tag marking the end of support for that branch. We encourage everyone to upgrade, and to use a tool such as pip-tools to pin all dependencies and control upgrades. Test with warnings treated as errors to be able to adapt to deprecation warnings early.

PyPI: https://pypi.org/project/MarkupSafe/3.0.0/ Changes: https://markupsafe.palletsprojects.com/page/changes/#version-3-0-0 (pending a fix to the docs build) Milestone: https://github.com/pallets/markupsafe/milestone/10?closed=1

  • Support Python 3.13 and its experimental free-threaded build. #461
  • Drop support for Python 3.7 and 3.8.
  • Use modern packaging metadata with pyproject.toml instead of setup.cfg. #348
  • Change distutils imports to setuptools. #399
  • Use deferred evaluation of annotations. #400
  • Update signatures for Markup methods to match str signatures. Use positional-only arguments. #400
  • Some str methods on Markup no longer escape their argument: strip, lstrip, rstrip, removeprefix, removesuffix, partition, and rpartition; replace only escapes its new argument. These methods are conceptually linked to search methods such as in, find, and index, which already do not escape their argument. #401
  • The __version__ attribute is deprecated. Use feature detection, or importlib.metadata.version("markupsafe"), instead. #402
  • Speed up escaping plain strings by 40%. #434
  • Simplify speedups implementation. #437
Changelog

Sourced from markupsafe's changelog.

Version 3.0.1

Released 2024-10-08

  • Address compiler warnings that became errors in GCC 14. :issue:466
  • Fix compatibility with proxy objects. :issue:467

Version 3.0.0

Released 2024-10-07

  • Support Python 3.13 and its experimental free-threaded build. :pr:461
  • Drop support for Python 3.7 and 3.8.
  • Use modern packaging metadata with pyproject.toml instead of setup.cfg. :pr:348
  • Change distutils imports to setuptools. :pr:399
  • Use deferred evaluation of annotations. :pr:400
  • Update signatures for Markup methods to match str signatures. Use positional-only arguments. :pr:400
  • Some str methods on Markup no longer escape their argument: strip, lstrip, rstrip, removeprefix, removesuffix, partition, and rpartition; replace only escapes its new argument. These methods are conceptually linked to search methods such as in, find, and index, which already do not escape their argument. :issue:401
  • The __version__ attribute is deprecated. Use feature detection, or importlib.metadata.version("markupsafe"), instead. :pr:402
  • Speed up escaping plain strings by 40%. :pr:434
  • Simplify speedups implementation. :pr:437
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=markupsafe&package-manager=pip&previous-version=2.1.5&new-version=3.0.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.txt | 123 +++++++++++++++++++++--------------------- 1 file changed, 62 insertions(+), 61 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 81335881d7..00f5f75bc7 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -146,67 +146,68 @@ markdown-it-py==3.0.0 \ # via # mdit-py-plugins # myst-parser -markupsafe==2.1.5 \ - --hash=sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf \ - --hash=sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff \ - --hash=sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f \ - --hash=sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3 \ - --hash=sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532 \ - --hash=sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f \ - --hash=sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617 \ - --hash=sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df \ - --hash=sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4 \ - --hash=sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906 \ - --hash=sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f \ - --hash=sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4 \ - --hash=sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8 \ - --hash=sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371 \ - --hash=sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2 \ - --hash=sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465 \ - --hash=sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52 \ - --hash=sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6 \ - --hash=sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169 \ - --hash=sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad \ - --hash=sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2 \ - --hash=sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0 \ - --hash=sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029 \ - --hash=sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f \ - --hash=sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a \ - --hash=sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced \ - --hash=sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5 \ - --hash=sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c \ - --hash=sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf \ - --hash=sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9 \ - --hash=sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb \ - --hash=sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad \ - --hash=sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3 \ - --hash=sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1 \ - --hash=sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46 \ - --hash=sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc \ - --hash=sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a \ - --hash=sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee \ - --hash=sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900 \ - --hash=sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5 \ - --hash=sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea \ - --hash=sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f \ - --hash=sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5 \ - --hash=sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e \ - --hash=sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a \ - --hash=sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f \ - --hash=sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50 \ - --hash=sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a \ - --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ - --hash=sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4 \ - --hash=sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff \ - --hash=sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2 \ - --hash=sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46 \ - --hash=sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b \ - --hash=sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf \ - --hash=sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5 \ - --hash=sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5 \ - --hash=sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab \ - --hash=sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd \ - --hash=sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68 +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 # via jinja2 mdit-py-plugins==0.4.2 \ --hash=sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636 \ From 595fe115023a8ce3edff6e8819938d82edc2b297 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Oct 2024 02:00:36 +0000 Subject: [PATCH 251/345] build(deps): bump sphinx-rtd-theme from 2.0.0 to 3.0.1 in /docs (#2303) Bumps [sphinx-rtd-theme](https://github.com/readthedocs/sphinx_rtd_theme) from 2.0.0 to 3.0.1.
Changelog

Sourced from sphinx-rtd-theme's changelog.

3.0.1

  • Use black color for text in selectors.

.. _release-3.0.0:

3.0.0

Final version.

.. _release-3.0.0rc4:

3.0.0rc4

Fixes

  • Trigger "Read the Docs Search addon" when focusing the "Search docs" input in the navbar.

.. _release-3.0.0rc3:

3.0.0rc3

Fixes

  • Show hidden version in selector if it's the current active version

.. _release-3.0.0rc2:

3.0.0rc2

Added

  • Render version and language selectors below the documentation's title (top left). This can be controlled via the new theme options version_selector and language_selector.

.. _release-3.0.0rc1:

3.0.0rc1

Added

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sphinx-rtd-theme&package-manager=pip&previous-version=2.0.0&new-version=3.0.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 00f5f75bc7..dcaa74e80b 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -317,9 +317,9 @@ sphinx-reredirects==0.1.5 \ --hash=sha256:444ae1438fba4418242ca76d6a6de3eaee82aaf0d8f2b0cac71a15d32ce6eba2 \ --hash=sha256:cfa753b441020a22708ce8eb17d4fd553a28fc87a609330092917ada2a6da0d8 # via rules-python-docs (docs/pyproject.toml) -sphinx-rtd-theme==2.0.0 \ - --hash=sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b \ - --hash=sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586 +sphinx-rtd-theme==3.0.1 \ + --hash=sha256:921c0ece75e90633ee876bd7b148cfaad136b481907ad154ac3669b6fc957916 \ + --hash=sha256:a4c5745d1b06dfcb80b7704fe532eb765b44065a8fad9851e4258c8804140703 # via rules-python-docs (docs/pyproject.toml) sphinxcontrib-applehelp==2.0.0 \ --hash=sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1 \ From 59783902f02f88397538aad359a25b43649011d1 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Mon, 14 Oct 2024 21:29:57 -0700 Subject: [PATCH 252/345] fix(sphinxdocs),deps: allow using sphinx_stardoc with bzlmod; add stardoc 0.6.2 as dependency (#2295) Using the sphinx_stardoc rule doesn't work with bzlmod because it refers to the stardoc repo, which was a dev dependency. This means, even if a user's root module has visibility to stardoc, rules_python doesn't. To fix, make stardoc a non-dev dependency. With bzlmod semantics, stardoc won't actually be loaded unless a user depends on it by using sphinxdocs. I ran into this while trying to port rules_testing over to sphinxdocs. The pigweed project recently started using sphinxdocs and didn't run into this problem, but I'm pretty sure that's because they're using workspace still, which doesn't have the visibility constraints that bzlmod does. --- CHANGELOG.md | 1 + MODULE.bazel | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 835d541641..9cc3cbca97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ A brief description of the categories of changes: (or equivalent). * (toolchains) `py_runtime.implementation_name` now defaults to `cpython` (previously it defaulted to None). +* (deps) stardoc 0.6.2 added as dependency. ### Fixed * (bzlmod) The `python.override(minor_mapping)` now merges the default and the diff --git a/MODULE.bazel b/MODULE.bazel index 780d7f8666..390e81a6d8 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -66,8 +66,10 @@ pip.parse( ) 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") + # ===== DEV ONLY DEPS AND SETUP BELOW HERE ===== -bazel_dep(name = "stardoc", version = "0.6.2", dev_dependency = True, repo_name = "io_bazel_stardoc") bazel_dep(name = "rules_bazel_integration_test", version = "0.20.0", dev_dependency = True) bazel_dep(name = "rules_testing", version = "0.6.0", dev_dependency = True) From dd5db656e3beeed739220dfc0d62e5e5bc88ff36 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 15 Oct 2024 16:33:37 -0700 Subject: [PATCH 253/345] chore: move files out of private/common (#2285) The "common" subdir was just carried over from the original file layout in Bazel. It's not necessary in rules_python. Remove it to simplify, since various newly added code is going directly into private, not into private/common. --- docs/BUILD.bazel | 8 +- docs/conf.py | 10 +- examples/bzlmod/MODULE.bazel.lock | 191 ++++++++++- python/BUILD.bazel | 12 +- python/private/BUILD.bazel | 235 +++++++++++++- python/private/{common => }/attributes.bzl | 8 +- .../private/{common => }/attributes_bazel.bzl | 0 python/private/{common => }/cc_helper.bzl | 0 python/private/{common => }/common.bzl | 6 +- python/private/common/BUILD.bazel | 228 ------------- python/private/{common => }/common_bazel.bzl | 12 +- python/private/flags.bzl | 2 +- python/private/local_runtime_repo.bzl | 2 +- .../private/local_runtime_toolchains_repo.bzl | 2 +- .../{common => }/py_binary_macro_bazel.bzl | 0 .../{common => }/py_binary_rule_bazel.bzl | 0 ...oviders.bzl => py_cc_link_params_info.bzl} | 8 +- python/private/py_exec_tools_toolchain.bzl | 6 +- python/private/{common => }/py_executable.bzl | 31 +- .../{common => }/py_executable_bazel.bzl | 6 +- python/private/py_info.bzl | 2 +- python/private/{common => }/py_internal.bzl | 0 python/private/{common => }/py_library.bzl | 18 +- .../{common => }/py_library_macro_bazel.bzl | 0 .../{common => }/py_library_rule_bazel.bzl | 0 python/private/py_runtime_info.bzl | 300 ++++++++++++++++++ .../private/{common => }/py_runtime_macro.bzl | 0 python/private/py_runtime_pair_rule.bzl | 4 +- .../private/{common => }/py_runtime_rule.bzl | 6 +- .../{common => }/py_test_macro_bazel.bzl | 0 .../{common => }/py_test_rule_bazel.bzl | 0 python/private/py_toolchain_suite.bzl | 2 +- python/private/py_wheel.bzl | 2 +- python/private/{common => }/semantics.bzl | 0 python/private/toolchains_repo.bzl | 4 +- python/py_binary.bzl | 10 +- python/py_cc_link_params_info.bzl | 4 +- python/py_library.bzl | 8 +- python/py_runtime.bzl | 7 +- python/py_runtime_info.bzl | 2 +- python/py_test.bzl | 8 +- 41 files changed, 785 insertions(+), 359 deletions(-) rename python/private/{common => }/attributes.bzl (98%) rename python/private/{common => }/attributes_bazel.bzl (100%) rename python/private/{common => }/cc_helper.bzl (100%) rename python/private/{common => }/common.bzl (99%) delete mode 100644 python/private/common/BUILD.bazel rename python/private/{common => }/common_bazel.bzl (96%) rename python/private/{common => }/py_binary_macro_bazel.bzl (100%) rename python/private/{common => }/py_binary_rule_bazel.bzl (100%) rename python/private/{common/providers.bzl => py_cc_link_params_info.bzl} (98%) rename python/private/{common => }/py_executable.bzl (98%) rename python/private/{common => }/py_executable_bazel.bzl (99%) rename python/private/{common => }/py_internal.bzl (100%) rename python/private/{common => }/py_library.bzl (95%) rename python/private/{common => }/py_library_macro_bazel.bzl (100%) rename python/private/{common => }/py_library_rule_bazel.bzl (100%) create mode 100644 python/private/py_runtime_info.bzl rename python/private/{common => }/py_runtime_macro.bzl (100%) rename python/private/{common => }/py_runtime_rule.bzl (98%) rename python/private/{common => }/py_test_macro_bazel.bzl (100%) rename python/private/{common => }/py_test_rule_bazel.bzl (100%) rename python/private/{common => }/semantics.bzl (100%) diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index 66b6496fc5..33d93fd8ae 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -97,12 +97,12 @@ sphinx_stardocs( "//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_cc_toolchain_rule_bzl", + "//python/private:py_library_rule_bazel_bzl", + "//python/private:py_runtime_rule_bzl", + "//python/private:py_test_rule_bazel_bzl", "//python/private/api:py_common_api_bzl", - "//python/private/common:py_binary_rule_bazel_bzl", - "//python/private/common:py_library_rule_bazel_bzl", - "//python/private/common:py_runtime_rule_bzl", - "//python/private/common:py_test_rule_bazel_bzl", ] + ([ # Bazel 6 + Stardoc isn't able to parse something about the python bzlmod extension "//python/extensions:python_bzl", diff --git a/docs/conf.py b/docs/conf.py index d65d5b51f0..9d3378241e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -59,7 +59,7 @@ autodoc2_docstring_parser_regexes = [ (".*", "myst"), ] - + # NOTE: The redirects generation will clobber existing files. redirects = { "api/tools/precompiler/index": "/api/rules_python/tools/precompiler/index.html", @@ -69,10 +69,10 @@ "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/common/py_library_rule_bazel.html", - "api/python/private/common/py_test_rule_bazel": "/api/rules_python/python/private/common/py_test_rule_bazel.html", - "api/python/private/common/py_binary_rule_bazel": "/api/rules_python/python/private/common/py_binary_rule_bazel.html", - "api/python/private/common/py_runtime_rule": "/api/rules_python/python/private/common/py_runtime_rule.html", + "api/python/private/common/py_library_rule_bazel": "/api/rules_python/python/private/py_library_rule_bazel.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_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", "api/python/entry_points/py_console_script_binary": "/api/rules_python/python/entry_points/py_console_script_binary.html", diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index e292528dc0..56854cc847 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -17,6 +17,7 @@ "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", @@ -45,12 +46,14 @@ "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.1/source.json": "5abb45cc9beb27b77aec6a65a11855ef2b55d95dfdc358e9f312b78ae0ba32d5", + "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", @@ -62,7 +65,8 @@ "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/source.json": "8d8448e71706df7450ced227ca6b3812407ff5e2ccad74a43a9fbe79c84e34e0", "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.5.3/source.json": "cd53fe968dc8cd98197c052db3db6d82562960c87b61e7a90ee96f8e4e0dda97", + "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", @@ -149,9 +153,10 @@ }, "@@rules_jvm_external~//:extensions.bzl%maven": { "general": { - "bzlTransitiveDigest": "4ijz6uc3T4E+d+U8LQv4EAt+8OqZNVY/lzvhLx3y1yg=", - "usagesDigest": "WfVTcbopbu3jyxPgDWx1iqIv1QV6L/T7utvDxAj5k84=", + "bzlTransitiveDigest": "U98JuBYMWVrcyiXT1L6KAYSAA0chnjRZZloIUmNmZ7M=", + "usagesDigest": "1L6xElvJScwRWKMMza2Jyew+Iuz6EPOkfBMQmHYuNIk=", "recordedFileInputs": { + "@@stardoc~//maven_install.json": "de0bfa778b4ed6aebb77509362dd87ab8d20fc7c7c18d2a7429cdfee03949a21", "@@rules_jvm_external~//rules_jvm_external_deps_install.json": "3ab1f67b0de4815df110bc72ccd6c77882b3b21d3d1e0a84445847b6ce3235a3" }, "recordedDirentsInputs": {}, @@ -199,8 +204,7 @@ "attributes": { "sha256": "a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26", "urls": [ - "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar", - "https://maven.google.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar" + "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" } @@ -241,6 +245,42 @@ "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", @@ -331,8 +371,7 @@ "attributes": { "sha256": "21af30c92267bd6122c0e0b4d20cccb6641a37eaf956c6540ec471d584e64a7b", "urls": [ - "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar", - "https://maven.google.com/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar" + "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" } @@ -349,6 +388,17 @@ "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", @@ -385,6 +435,17 @@ "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", @@ -588,8 +649,7 @@ "attributes": { "sha256": "a42edc9cab792e39fe39bb94f3fca655ed157ff87a8af78e1d6ba5b07c4a00ab", "urls": [ - "https://repo1.maven.org/maven2/com/google/guava/guava/31.1-jre/guava-31.1-jre.jar", - "https://maven.google.com/com/google/guava/guava/31.1-jre/guava-31.1-jre.jar" + "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" } @@ -618,6 +678,17 @@ "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", @@ -726,6 +797,17 @@ "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", @@ -832,8 +914,7 @@ "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", - "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.11.0/error_prone_annotations-2.11.0.jar" + "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" } @@ -910,6 +991,51 @@ "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", @@ -934,6 +1060,17 @@ "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", @@ -1000,8 +1137,7 @@ "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", - "https://maven.google.com/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" + "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" } @@ -1042,6 +1178,17 @@ "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", @@ -1072,8 +1219,7 @@ "attributes": { "sha256": "766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7", "urls": [ - "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar", - "https://maven.google.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar" + "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" } @@ -1126,6 +1272,17 @@ "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", @@ -1204,7 +1361,7 @@ "@@rules_jvm_external~//:non-module-deps.bzl%non_module_deps": { "general": { "bzlTransitiveDigest": "l6SlNloqPvd60dcuPdWiJNi3g3jfK76fcZc0i/Yr0dQ=", - "usagesDigest": "pX61d12AFioOtqChQDmxvlNGDYT69e5MrKT2E/S6TeQ=", + "usagesDigest": "hiuzyio8ny4T3UoEFpHaxXzNFc6OGUFvx5DDVLBBUmU=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, diff --git a/python/BUILD.bazel b/python/BUILD.bazel index e64ad8cdb7..f2f3374db3 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -124,9 +124,9 @@ bzl_library( name = "py_binary_bzl", srcs = ["py_binary.bzl"], deps = [ + "//python/private:py_binary_macro_bazel_bzl", "//python/private:register_extension_info_bzl", "//python/private:util_bzl", - "//python/private/common:py_binary_macro_bazel_bzl", "@rules_python_internal//:rules_python_config_bzl", ], ) @@ -135,7 +135,7 @@ bzl_library( name = "py_cc_link_params_info_bzl", srcs = ["py_cc_link_params_info.bzl"], deps = [ - "//python/private/common:providers_bzl", + "//python/private:py_cc_link_params_info_bzl", "@rules_python_internal//:rules_python_config_bzl", ], ) @@ -178,9 +178,9 @@ bzl_library( name = "py_library_bzl", srcs = ["py_library.bzl"], deps = [ + "//python/private:py_library_macro_bazel_bzl", "//python/private:register_extension_info_bzl", "//python/private:util_bzl", - "//python/private/common:py_library_macro_bazel_bzl", "@rules_python_internal//:rules_python_config_bzl", ], ) @@ -189,8 +189,8 @@ bzl_library( name = "py_runtime_bzl", srcs = ["py_runtime.bzl"], deps = [ + "//python/private:py_runtime_macro_bzl", "//python/private:util_bzl", - "//python/private/common:py_runtime_macro_bzl", ], ) @@ -208,9 +208,9 @@ bzl_library( name = "py_runtime_info_bzl", srcs = ["py_runtime_info.bzl"], deps = [ + "//python/private:py_runtime_info_bzl", "//python/private:reexports_bzl", "//python/private:util_bzl", - "//python/private/common:providers_bzl", "@rules_python_internal//:rules_python_config_bzl", ], ) @@ -219,9 +219,9 @@ bzl_library( name = "py_test_bzl", srcs = ["py_test.bzl"], deps = [ + "//python/private:py_test_macro_bazel_bzl", "//python/private:register_extension_info_bzl", "//python/private:util_bzl", - "//python/private/common:py_test_macro_bazel_bzl", "@rules_python_internal//:rules_python_config_bzl", ], ) diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index cee77c5836..d3b9bf4aad 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -30,7 +30,6 @@ licenses(["notice"]) filegroup( name = "distribution", srcs = glob(["**"]) + [ - "//python/private/common:distribution", "//python/private/proto:distribution", "//python/private/pypi:distribution", "//python/private/whl_filegroup:distribution", @@ -52,6 +51,28 @@ filegroup( visibility = ["//python:__pkg__"], ) +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", + ":py_internal_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", + ], +) + bzl_library( name = "auth_bzl", srcs = ["auth.bzl"], @@ -82,6 +103,39 @@ bzl_library( srcs = ["bzlmod_enabled.bzl"], ) +bzl_library( + name = "cc_helper_bzl", + srcs = ["cc_helper.bzl"], + deps = [":py_internal_bzl"], +) + +bzl_library( + name = "common_bazel_bzl", + srcs = ["common_bazel.bzl"], + deps = [ + ":attributes_bzl", + ":common_bzl", + ":py_internal_bzl", + "//python/private:py_cc_link_params_info_bzl", + "//python/private:py_interpreter_program_bzl", + "//python/private:toolchain_types_bzl", + "@bazel_skylib//lib:paths", + ], +) + +bzl_library( + name = "common_bzl", + srcs = ["common.bzl"], + deps = [ + ":cc_helper_bzl", + ":py_internal_bzl", + ":semantics_bzl", + "//python/private:py_info_bzl", + "//python/private:reexports_bzl", + "//python/private:rules_cc_srcs_bzl", + ], +) + bzl_library( name = "config_settings_bzl", srcs = ["config_settings.bzl"], @@ -159,18 +213,6 @@ bzl_library( ], ) -bzl_library( - name = "py_repositories_bzl", - srcs = ["py_repositories.bzl"], - deps = [ - ":bazel_tools_bzl", - ":internal_config_repo_bzl", - ":pythons_hub_bzl", - "//python:versions_bzl", - "//python/private/pypi:deps_bzl", - ], -) - bzl_library( name = "python_register_toolchains_bzl", srcs = ["python_register_toolchains.bzl"], @@ -217,6 +259,35 @@ bzl_library( ], ) +bzl_library( + name = "py_binary_macro_bazel_bzl", + srcs = ["py_binary_macro_bazel.bzl"], + deps = [ + ":common_bzl", + ":py_binary_rule_bazel_bzl", + ], +) + +bzl_library( + name = "py_binary_rule_bazel_bzl", + srcs = ["py_binary_rule_bazel.bzl"], + deps = [ + ":attributes_bzl", + ":py_executable_bazel_bzl", + ":semantics_bzl", + "@bazel_skylib//lib:dicts", + ], +) + +bzl_library( + name = "py_cc_link_params_info_bzl", + srcs = ["py_cc_link_params_info.bzl"], + deps = [ + ":rules_cc_srcs_bzl", + ":util_bzl", + ], +) + bzl_library( name = "py_cc_toolchain_macro_bzl", srcs = ["py_cc_toolchain_macro.bzl"], @@ -265,12 +336,46 @@ bzl_library( ":py_exec_tools_info_bzl", ":sentinel_bzl", ":toolchain_types_bzl", - "//python/private/common:providers_bzl", "@bazel_skylib//lib:paths", "@bazel_skylib//rules:common_settings", ], ) +bzl_library( + name = "py_executable_bazel_bzl", + srcs = ["py_executable_bazel.bzl"], + deps = [ + ":attributes_bazel_bzl", + ":common_bazel_bzl", + ":common_bzl", + ":py_executable_bzl", + ":py_internal_bzl", + ":semantics_bzl", + "//python/private:py_runtime_info_bzl", + ], +) + +bzl_library( + name = "py_executable_bzl", + srcs = ["py_executable.bzl"], + deps = [ + ":attributes_bzl", + ":cc_helper_bzl", + ":common_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", + "@bazel_skylib//lib:dicts", + "@bazel_skylib//lib:structs", + "@bazel_skylib//rules:common_settings", + ], +) + bzl_library( name = "py_executable_info_bzl", srcs = ["py_executable_info.bzl"], @@ -287,12 +392,50 @@ bzl_library( ], ) +bzl_library( + name = "py_internal_bzl", + srcs = ["py_internal.bzl"], + deps = ["@rules_python_internal//:py_internal_bzl"], +) + bzl_library( name = "py_interpreter_program_bzl", srcs = ["py_interpreter_program.bzl"], deps = ["@bazel_skylib//rules:common_settings"], ) +bzl_library( + name = "py_library_bzl", + srcs = ["py_library.bzl"], + deps = [ + ":attributes_bzl", + ":common_bzl", + ":py_internal_bzl", + "//python/private:flags_bzl", + "//python/private:py_cc_link_params_info_bzl", + "//python/private: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"], +) + +bzl_library( + name = "py_library_rule_bazel_bzl", + srcs = ["py_library_rule_bazel.bzl"], + deps = [ + ":attributes_bazel_bzl", + ":common_bazel_bzl", + ":common_bzl", + ":py_library_bzl", + ], +) + bzl_library( name = "py_package_bzl", srcs = ["py_package.bzl"], @@ -303,6 +446,44 @@ bzl_library( ], ) +bzl_library( + name = "py_runtime_info_bzl", + srcs = ["py_runtime_info.bzl"], + deps = [":util_bzl"], +) + +bzl_library( + name = "py_repositories_bzl", + srcs = ["py_repositories.bzl"], + deps = [ + ":bazel_tools_bzl", + ":internal_config_repo_bzl", + ":pythons_hub_bzl", + "//python:versions_bzl", + "//python/private/pypi:deps_bzl", + ], +) + +bzl_library( + name = "py_runtime_macro_bzl", + srcs = ["py_runtime_macro.bzl"], + deps = [":py_runtime_rule_bzl"], +) + +bzl_library( + name = "py_runtime_rule_bzl", + srcs = ["py_runtime_rule.bzl"], + deps = [ + ":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", + ], +) + bzl_library( name = "py_runtime_pair_macro_bzl", srcs = ["py_runtime_pair_macro.bzl"], @@ -320,6 +501,27 @@ bzl_library( ], ) +bzl_library( + name = "py_test_macro_bazel_bzl", + srcs = ["py_test_macro_bazel.bzl"], + deps = [ + ":common_bazel_bzl", + ":py_test_rule_bazel_bzl", + ], +) + +bzl_library( + name = "py_test_rule_bazel_bzl", + srcs = ["py_test_rule_bazel.bzl"], + deps = [ + ":attributes_bzl", + ":common_bzl", + ":py_executable_bazel_bzl", + ":semantics_bzl", + "@bazel_skylib//lib:dicts", + ], +) + bzl_library( name = "py_toolchain_suite_bzl", srcs = ["py_toolchain_suite.bzl"], @@ -434,6 +636,11 @@ bzl_library( deps = [":bazel_tools_bzl"], ) +bzl_library( + name = "semantics_bzl", + srcs = ["semantics.bzl"], +) + # Needed to define bzl_library targets for docgen. (We don't define the # bzl_library target here because it'd give our users a transitive dependency # on Skylib.) diff --git a/python/private/common/attributes.bzl b/python/private/attributes.bzl similarity index 98% rename from python/private/common/attributes.bzl rename to python/private/attributes.bzl index 56e8a66e19..424a2c5ad6 100644 --- a/python/private/common/attributes.bzl +++ b/python/private/attributes.bzl @@ -15,12 +15,12 @@ load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("@rules_cc//cc:defs.bzl", "CcInfo") -load("//python/private:enum.bzl", "enum") -load("//python/private:flags.bzl", "PrecompileFlag", "PrecompileSourceRetentionFlag") -load("//python/private:py_info.bzl", "PyInfo") -load("//python/private:reexports.bzl", "BuiltinPyInfo") load(":common.bzl", "union_attrs") +load(":enum.bzl", "enum") +load(":flags.bzl", "PrecompileFlag", "PrecompileSourceRetentionFlag") +load(":py_info.bzl", "PyInfo") load(":py_internal.bzl", "py_internal") +load(":reexports.bzl", "BuiltinPyInfo") load( ":semantics.bzl", "DEPS_ATTR_ALLOW_RULES", diff --git a/python/private/common/attributes_bazel.bzl b/python/private/attributes_bazel.bzl similarity index 100% rename from python/private/common/attributes_bazel.bzl rename to python/private/attributes_bazel.bzl diff --git a/python/private/common/cc_helper.bzl b/python/private/cc_helper.bzl similarity index 100% rename from python/private/common/cc_helper.bzl rename to python/private/cc_helper.bzl diff --git a/python/private/common/common.bzl b/python/private/common.bzl similarity index 99% rename from python/private/common/common.bzl rename to python/private/common.bzl index ec46ea8965..2dcc9482ca 100644 --- a/python/private/common/common.bzl +++ b/python/private/common.bzl @@ -13,10 +13,10 @@ # limitations under the License. """Various things common to Bazel and Google rule implementations.""" -load("//python/private:py_info.bzl", "PyInfo", "PyInfoBuilder") -load("//python/private:reexports.bzl", "BuiltinPyInfo") load(":cc_helper.bzl", "cc_helper") +load(":py_info.bzl", "PyInfo", "PyInfoBuilder") load(":py_internal.bzl", "py_internal") +load(":reexports.bzl", "BuiltinPyInfo") load( ":semantics.bzl", "NATIVE_RULES_MIGRATION_FIX_CMD", @@ -173,7 +173,7 @@ def create_cc_details_struct( runfiles. cc_toolchain: CcToolchain that should be used when building. feature_config: struct from cc_configure_features(); see - //python/private/common:py_executable.bzl%cc_configure_features. + //python/private:py_executable.bzl%cc_configure_features. **kwargs: Additional keys/values to set in the returned struct. This is to facilitate extensions with less patching. Any added fields should pick names that are unlikely to collide if the CcDetails API has diff --git a/python/private/common/BUILD.bazel b/python/private/common/BUILD.bazel deleted file mode 100644 index 6fef8e87af..0000000000 --- a/python/private/common/BUILD.bazel +++ /dev/null @@ -1,228 +0,0 @@ -# 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. - -load("@bazel_skylib//:bzl_library.bzl", "bzl_library") - -package( - default_visibility = ["//:__subpackages__"], -) - -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", - ":py_internal_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", - ], -) - -bzl_library( - name = "cc_helper_bzl", - srcs = ["cc_helper.bzl"], - deps = [":py_internal_bzl"], -) - -bzl_library( - name = "common_bazel_bzl", - srcs = ["common_bazel.bzl"], - deps = [ - ":attributes_bzl", - ":common_bzl", - ":providers_bzl", - ":py_internal_bzl", - "//python/private:py_interpreter_program_bzl", - "//python/private:toolchain_types_bzl", - "@bazel_skylib//lib:paths", - ], -) - -bzl_library( - name = "common_bzl", - srcs = ["common.bzl"], - deps = [ - ":cc_helper_bzl", - ":providers_bzl", - ":py_internal_bzl", - ":semantics_bzl", - "//python/private:py_info_bzl", - "//python/private:reexports_bzl", - "//python/private:rules_cc_srcs_bzl", - ], -) - -filegroup( - name = "distribution", - srcs = glob(["**"]), -) - -bzl_library( - name = "providers_bzl", - srcs = ["providers.bzl"], - deps = [ - ":semantics_bzl", - "//python/private:rules_cc_srcs_bzl", - "//python/private:util_bzl", - ], -) - -bzl_library( - name = "py_binary_macro_bazel_bzl", - srcs = ["py_binary_macro_bazel.bzl"], - deps = [ - ":common_bzl", - ":py_binary_rule_bazel_bzl", - ], -) - -bzl_library( - name = "py_binary_rule_bazel_bzl", - srcs = ["py_binary_rule_bazel.bzl"], - deps = [ - ":attributes_bzl", - ":py_executable_bazel_bzl", - ":semantics_bzl", - "@bazel_skylib//lib:dicts", - ], -) - -bzl_library( - name = "py_executable_bazel_bzl", - srcs = ["py_executable_bazel.bzl"], - deps = [ - ":attributes_bazel_bzl", - ":common_bazel_bzl", - ":common_bzl", - ":providers_bzl", - ":py_executable_bzl", - ":py_internal_bzl", - ":semantics_bzl", - ], -) - -bzl_library( - name = "py_executable_bzl", - srcs = ["py_executable.bzl"], - deps = [ - ":attributes_bzl", - ":cc_helper_bzl", - ":common_bzl", - ":providers_bzl", - ":py_internal_bzl", - "//python/private:flags_bzl", - "//python/private:py_executable_info_bzl", - "//python/private:py_info_bzl", - "//python/private:rules_cc_srcs_bzl", - "//python/private:toolchain_types_bzl", - "@bazel_skylib//lib:dicts", - "@bazel_skylib//lib:structs", - "@bazel_skylib//rules:common_settings", - ], -) - -bzl_library( - name = "py_internal_bzl", - srcs = ["py_internal.bzl"], - deps = ["@rules_python_internal//:py_internal_bzl"], -) - -bzl_library( - name = "py_library_bzl", - srcs = ["py_library.bzl"], - deps = [ - ":attributes_bzl", - ":common_bzl", - ":providers_bzl", - ":py_internal_bzl", - "//python/private:flags_bzl", - "//python/private: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"], -) - -bzl_library( - name = "py_library_rule_bazel_bzl", - srcs = ["py_library_rule_bazel.bzl"], - deps = [ - ":attributes_bazel_bzl", - ":common_bazel_bzl", - ":common_bzl", - ":py_library_bzl", - ], -) - -bzl_library( - name = "py_runtime_macro_bzl", - srcs = ["py_runtime_macro.bzl"], - deps = [":py_runtime_rule_bzl"], -) - -bzl_library( - name = "py_runtime_rule_bzl", - srcs = ["py_runtime_rule.bzl"], - deps = [ - ":attributes_bzl", - ":providers_bzl", - ":py_internal_bzl", - "//python/private:reexports_bzl", - "//python/private:util_bzl", - "@bazel_skylib//lib:dicts", - "@bazel_skylib//lib:paths", - ], -) - -bzl_library( - name = "py_test_macro_bazel_bzl", - srcs = ["py_test_macro_bazel.bzl"], - deps = [ - ":common_bazel_bzl", - ":py_test_rule_bazel_bzl", - ], -) - -bzl_library( - name = "py_test_rule_bazel_bzl", - srcs = ["py_test_rule_bazel.bzl"], - deps = [ - ":attributes_bzl", - ":common_bzl", - ":py_executable_bazel_bzl", - ":semantics_bzl", - "@bazel_skylib//lib:dicts", - ], -) - -bzl_library( - name = "semantics_bzl", - srcs = ["semantics.bzl"], -) diff --git a/python/private/common/common_bazel.bzl b/python/private/common_bazel.bzl similarity index 96% rename from python/private/common/common_bazel.bzl rename to python/private/common_bazel.bzl index 6148fc2daa..642cfd86cc 100644 --- a/python/private/common/common_bazel.bzl +++ b/python/private/common_bazel.bzl @@ -16,13 +16,13 @@ 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("//python/private:flags.bzl", "PrecompileFlag") -load("//python/private:py_interpreter_program.bzl", "PyInterpreterProgramInfo") -load("//python/private:toolchain_types.bzl", "EXEC_TOOLS_TOOLCHAIN_TYPE", "TARGET_TOOLCHAIN_TYPE") load(":attributes.bzl", "PrecompileAttr", "PrecompileInvalidationModeAttr", "PrecompileSourceRetentionAttr") load(":common.bzl", "is_bool") -load(":providers.bzl", "PyCcLinkParamsProvider") +load(":flags.bzl", "PrecompileFlag") +load(":py_cc_link_params_info.bzl", "PyCcLinkParamsInfo") load(":py_internal.bzl", "py_internal") +load(":py_interpreter_program.bzl", "PyInterpreterProgramInfo") +load(":toolchain_types.bzl", "EXEC_TOOLS_TOOLCHAIN_TYPE", "TARGET_TOOLCHAIN_TYPE") _py_builtins = py_internal @@ -45,8 +45,8 @@ def collect_cc_info(ctx, extra_deps = []): if CcInfo in dep: cc_infos.append(dep[CcInfo]) - if PyCcLinkParamsProvider in dep: - cc_infos.append(dep[PyCcLinkParamsProvider].cc_info) + if PyCcLinkParamsInfo in dep: + cc_infos.append(dep[PyCcLinkParamsInfo].cc_info) return cc_common.merge_cc_infos(cc_infos = cc_infos) diff --git a/python/private/flags.bzl b/python/private/flags.bzl index e7643fc1ae..c190cf682b 100644 --- a/python/private/flags.bzl +++ b/python/private/flags.bzl @@ -19,7 +19,7 @@ unnecessary files when all that are needed are flag definitions. """ load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") -load("//python/private:enum.bzl", "enum") +load(":enum.bzl", "enum") def _FlagEnum_flag_values(self): return sorted(self.__members__.values()) diff --git a/python/private/local_runtime_repo.bzl b/python/private/local_runtime_repo.bzl index 4e7edde9d8..fb1a8e29ac 100644 --- a/python/private/local_runtime_repo.bzl +++ b/python/private/local_runtime_repo.bzl @@ -14,7 +14,7 @@ """Create a repository for a locally installed Python runtime.""" -load("//python/private:enum.bzl", "enum") +load(":enum.bzl", "enum") load(":repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") # buildifier: disable=name-conventions diff --git a/python/private/local_runtime_toolchains_repo.bzl b/python/private/local_runtime_toolchains_repo.bzl index 880fbfe224..adb3bb560d 100644 --- a/python/private/local_runtime_toolchains_repo.bzl +++ b/python/private/local_runtime_toolchains_repo.bzl @@ -14,8 +14,8 @@ """Create a repository to hold a local Python toolchain definitions.""" -load("//python/private:text_util.bzl", "render") load(":repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") +load(":text_util.bzl", "render") _TOOLCHAIN_TEMPLATE = """ # Generated by local_runtime_toolchains_repo.bzl diff --git a/python/private/common/py_binary_macro_bazel.bzl b/python/private/py_binary_macro_bazel.bzl similarity index 100% rename from python/private/common/py_binary_macro_bazel.bzl rename to python/private/py_binary_macro_bazel.bzl diff --git a/python/private/common/py_binary_rule_bazel.bzl b/python/private/py_binary_rule_bazel.bzl similarity index 100% rename from python/private/common/py_binary_rule_bazel.bzl rename to python/private/py_binary_rule_bazel.bzl diff --git a/python/private/common/providers.bzl b/python/private/py_cc_link_params_info.bzl similarity index 98% rename from python/private/common/providers.bzl rename to python/private/py_cc_link_params_info.bzl index b704ce0298..e5f4534c70 100644 --- a/python/private/common/providers.bzl +++ b/python/private/py_cc_link_params_info.bzl @@ -14,7 +14,7 @@ """Providers for Python rules.""" load("@rules_cc//cc:defs.bzl", "CcInfo") -load("//python/private:util.bzl", "define_bazel_6_provider") +load(":util.bzl", "define_bazel_6_provider") DEFAULT_STUB_SHEBANG = "#!/usr/bin/env python3" @@ -300,17 +300,17 @@ The following substitutions are made during template expansion: }, ) -def _PyCcLinkParamsProvider_init(cc_info): +def _PyCcLinkParamsInfo_init(cc_info): return { "cc_info": CcInfo(linking_context = cc_info.linking_context), } # buildifier: disable=name-conventions -PyCcLinkParamsProvider, _unused_raw_py_cc_link_params_provider_ctor = define_bazel_6_provider( +PyCcLinkParamsInfo, _unused_raw_py_cc_link_params_provider_ctor = define_bazel_6_provider( doc = ("Python-wrapper to forward {obj}`CcInfo.linking_context`. This is to " + "allow Python targets to propagate C++ linking information, but " + "without the Python target appearing to be a valid C++ rule dependency"), - init = _PyCcLinkParamsProvider_init, + init = _PyCcLinkParamsInfo_init, fields = { "cc_info": """ :type: CcInfo diff --git a/python/private/py_exec_tools_toolchain.bzl b/python/private/py_exec_tools_toolchain.bzl index 957448f421..edf9159759 100644 --- a/python/private/py_exec_tools_toolchain.bzl +++ b/python/private/py_exec_tools_toolchain.bzl @@ -16,9 +16,9 @@ load("@bazel_skylib//lib:paths.bzl", "paths") load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") -load("//python/private:sentinel.bzl", "SentinelInfo") -load("//python/private:toolchain_types.bzl", "TARGET_TOOLCHAIN_TYPE") load(":py_exec_tools_info.bzl", "PyExecToolsInfo") +load(":sentinel.bzl", "SentinelInfo") +load(":toolchain_types.bzl", "TARGET_TOOLCHAIN_TYPE") def _py_exec_tools_toolchain_impl(ctx): extra_kwargs = {} @@ -43,7 +43,7 @@ py_exec_tools_toolchain = rule( Provides a toolchain for build time tools. This provides `ToolchainInfo` with the following attributes: -* `exec_tools`: {type}`PyExecToolsInfo` +* `exec_tools`: {type}`PyExecToolsInfo` * `toolchain_label`: {type}`Label` _only present when `--visibile_for_testing=True` for internal testing_. The rule's label; this allows identifying what toolchain implmentation was selected for testing purposes. diff --git a/python/private/common/py_executable.bzl b/python/private/py_executable.bzl similarity index 98% rename from python/private/common/py_executable.bzl rename to python/private/py_executable.bzl index 6c238a2a5d..00d8d36272 100644 --- a/python/private/common/py_executable.bzl +++ b/python/private/py_executable.bzl @@ -17,15 +17,6 @@ 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("//python/private:builders.bzl", "builders") -load("//python/private:py_executable_info.bzl", "PyExecutableInfo") -load("//python/private:py_info.bzl", "PyInfo") -load("//python/private:reexports.bzl", "BuiltinPyInfo", "BuiltinPyRuntimeInfo") -load( - "//python/private:toolchain_types.bzl", - "EXEC_TOOLS_TOOLCHAIN_TYPE", - TOOLCHAIN_TYPE = "TARGET_TOOLCHAIN_TYPE", -) load( ":attributes.bzl", "AGNOSTIC_EXECUTABLE_ATTRS", @@ -38,6 +29,7 @@ load( "create_srcs_attr", "create_srcs_version_attr", ) +load(":builders.bzl", "builders") load(":cc_helper.bzl", "cc_helper") load( ":common.bzl", @@ -52,12 +44,12 @@ load( "target_platform_has_any_constraint", "union_attrs", ) -load( - ":providers.bzl", - "PyCcLinkParamsProvider", - "PyRuntimeInfo", -) +load(":py_cc_link_params_info.bzl", "PyCcLinkParamsInfo") +load(":py_executable_info.bzl", "PyExecutableInfo") +load(":py_info.bzl", "PyInfo") load(":py_internal.bzl", "py_internal") +load(":py_runtime_info.bzl", "PyRuntimeInfo") +load(":reexports.bzl", "BuiltinPyInfo", "BuiltinPyRuntimeInfo") load( ":semantics.bzl", "ALLOWED_MAIN_EXTENSIONS", @@ -65,6 +57,11 @@ load( "IS_BAZEL", "PY_RUNTIME_ATTR_NAME", ) +load( + ":toolchain_types.bzl", + "EXEC_TOOLS_TOOLCHAIN_TYPE", + TOOLCHAIN_TYPE = "TARGET_TOOLCHAIN_TYPE", +) _py_builtins = py_internal @@ -842,7 +839,7 @@ def _create_providers( runfiles_details: runfiles that will become the default and data runfiles. imports: depset of strings; the import paths to propagate cc_info: optional CcInfo; Linking information to propagate as - PyCcLinkParamsProvider. Note that only the linking information + PyCcLinkParamsInfo. Note that only the linking information is propagated, not the whole CcInfo. inherited_environment: list of strings; Environment variable names that should be inherited from the environment the executuble @@ -903,11 +900,11 @@ def _create_providers( bootstrap_template = py_runtime_info.bootstrap_template, )) - # TODO(b/163083591): Remove the PyCcLinkParamsProvider once binaries-in-deps + # TODO(b/163083591): Remove the PyCcLinkParamsInfo once binaries-in-deps # are cleaned up. if cc_info: providers.append( - PyCcLinkParamsProvider(cc_info = cc_info), + PyCcLinkParamsInfo(cc_info = cc_info), ) py_info, deps_transitive_sources, builtin_py_info = create_py_info( diff --git a/python/private/common/py_executable_bazel.bzl b/python/private/py_executable_bazel.bzl similarity index 99% rename from python/private/common/py_executable_bazel.bzl rename to python/private/py_executable_bazel.bzl index dae1c4a0b1..53206bdbfd 100644 --- a/python/private/common/py_executable_bazel.bzl +++ b/python/private/py_executable_bazel.bzl @@ -15,8 +15,6 @@ load("@bazel_skylib//lib:dicts.bzl", "dicts") load("@bazel_skylib//lib:paths.bzl", "paths") -load("//python/private:flags.bzl", "BootstrapImplFlag") -load("//python/private:toolchain_types.bzl", "TARGET_TOOLCHAIN_TYPE") load(":attributes_bazel.bzl", "IMPORTS_ATTRS") load( ":common.bzl", @@ -27,13 +25,15 @@ load( "union_attrs", ) load(":common_bazel.bzl", "collect_cc_info", "get_imports", "maybe_precompile") -load(":providers.bzl", "DEFAULT_STUB_SHEBANG") +load(":flags.bzl", "BootstrapImplFlag") load( ":py_executable.bzl", "create_base_executable_rule", "py_executable_base_impl", ) load(":py_internal.bzl", "py_internal") +load(":py_runtime_info.bzl", "DEFAULT_STUB_SHEBANG") +load(":toolchain_types.bzl", "TARGET_TOOLCHAIN_TYPE") _py_builtins = py_internal _EXTERNAL_PATH_PREFIX = "external" diff --git a/python/private/py_info.bzl b/python/private/py_info.bzl index 6c2c3c6499..7a0bdeaef8 100644 --- a/python/private/py_info.bzl +++ b/python/private/py_info.bzl @@ -14,8 +14,8 @@ """Implementation of PyInfo provider and PyInfo-specific utilities.""" load("@rules_python_internal//:rules_python_config.bzl", "config") -load("//python/private:reexports.bzl", "BuiltinPyInfo") load(":builders.bzl", "builders") +load(":reexports.bzl", "BuiltinPyInfo") load(":util.bzl", "define_bazel_6_provider") def _check_arg_type(name, required_type, value): diff --git a/python/private/common/py_internal.bzl b/python/private/py_internal.bzl similarity index 100% rename from python/private/common/py_internal.bzl rename to python/private/py_internal.bzl diff --git a/python/private/common/py_library.bzl b/python/private/py_library.bzl similarity index 95% rename from python/private/common/py_library.bzl rename to python/private/py_library.bzl index bce18c3132..4f43116947 100644 --- a/python/private/common/py_library.bzl +++ b/python/private/py_library.bzl @@ -15,13 +15,6 @@ load("@bazel_skylib//lib:dicts.bzl", "dicts") load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") -load("//python/private:builders.bzl", "builders") -load("//python/private:flags.bzl", "AddSrcsToRunfilesFlag", "PrecompileFlag") -load( - "//python/private:toolchain_types.bzl", - "EXEC_TOOLS_TOOLCHAIN_TYPE", - TOOLCHAIN_TYPE = "TARGET_TOOLCHAIN_TYPE", -) load( ":attributes.bzl", "COMMON_ATTRS", @@ -32,6 +25,7 @@ load( "create_srcs_attr", "create_srcs_version_attr", ) +load(":builders.bzl", "builders") load( ":common.bzl", "check_native_allowed", @@ -43,8 +37,14 @@ load( "filter_to_py_srcs", "union_attrs", ) -load(":providers.bzl", "PyCcLinkParamsProvider") +load(":flags.bzl", "AddSrcsToRunfilesFlag", "PrecompileFlag") +load(":py_cc_link_params_info.bzl", "PyCcLinkParamsInfo") load(":py_internal.bzl", "py_internal") +load( + ":toolchain_types.bzl", + "EXEC_TOOLS_TOOLCHAIN_TYPE", + TOOLCHAIN_TYPE = "TARGET_TOOLCHAIN_TYPE", +) _py_builtins = py_internal @@ -121,7 +121,7 @@ def py_library_impl(ctx, *, semantics): DefaultInfo(files = default_outputs, runfiles = runfiles), py_info, create_instrumented_files_info(ctx), - PyCcLinkParamsProvider(cc_info = cc_info), + PyCcLinkParamsInfo(cc_info = cc_info), create_output_group_info(py_info.transitive_sources, extra_groups = {}), ] if builtins_py_info: diff --git a/python/private/common/py_library_macro_bazel.bzl b/python/private/py_library_macro_bazel.bzl similarity index 100% rename from python/private/common/py_library_macro_bazel.bzl rename to python/private/py_library_macro_bazel.bzl diff --git a/python/private/common/py_library_rule_bazel.bzl b/python/private/py_library_rule_bazel.bzl similarity index 100% rename from python/private/common/py_library_rule_bazel.bzl rename to python/private/py_library_rule_bazel.bzl diff --git a/python/private/py_runtime_info.bzl b/python/private/py_runtime_info.bzl new file mode 100644 index 0000000000..359a9e78cf --- /dev/null +++ b/python/private/py_runtime_info.bzl @@ -0,0 +1,300 @@ +# 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. +"""Providers for Python rules.""" + +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 +::: +""", + }, +) diff --git a/python/private/common/py_runtime_macro.bzl b/python/private/py_runtime_macro.bzl similarity index 100% rename from python/private/common/py_runtime_macro.bzl rename to python/private/py_runtime_macro.bzl diff --git a/python/private/py_runtime_pair_rule.bzl b/python/private/py_runtime_pair_rule.bzl index 39f15bffb4..b3b7a4e5f8 100644 --- a/python/private/py_runtime_pair_rule.bzl +++ b/python/private/py_runtime_pair_rule.bzl @@ -16,8 +16,8 @@ load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load("//python:py_runtime_info.bzl", "PyRuntimeInfo") -load("//python/private:reexports.bzl", "BuiltinPyRuntimeInfo") -load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") +load(":reexports.bzl", "BuiltinPyRuntimeInfo") +load(":util.bzl", "IS_BAZEL_7_OR_HIGHER") def _py_runtime_pair_impl(ctx): if ctx.attr.py2_runtime != None: diff --git a/python/private/common/py_runtime_rule.bzl b/python/private/py_runtime_rule.bzl similarity index 98% rename from python/private/common/py_runtime_rule.bzl rename to python/private/py_runtime_rule.bzl index 088b6ead16..ba9b36d13a 100644 --- a/python/private/common/py_runtime_rule.bzl +++ b/python/private/py_runtime_rule.bzl @@ -16,11 +16,11 @@ load("@bazel_skylib//lib:dicts.bzl", "dicts") load("@bazel_skylib//lib:paths.bzl", "paths") load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") -load("//python/private:reexports.bzl", "BuiltinPyRuntimeInfo") -load("//python/private:util.bzl", "IS_BAZEL_7_OR_HIGHER") load(":attributes.bzl", "NATIVE_RULES_ALLOWLIST_ATTRS") -load(":providers.bzl", "DEFAULT_BOOTSTRAP_TEMPLATE", "DEFAULT_STUB_SHEBANG", "PyRuntimeInfo") load(":py_internal.bzl", "py_internal") +load(":py_runtime_info.bzl", "DEFAULT_BOOTSTRAP_TEMPLATE", "DEFAULT_STUB_SHEBANG", "PyRuntimeInfo") +load(":reexports.bzl", "BuiltinPyRuntimeInfo") +load(":util.bzl", "IS_BAZEL_7_OR_HIGHER") _py_builtins = py_internal diff --git a/python/private/common/py_test_macro_bazel.bzl b/python/private/py_test_macro_bazel.bzl similarity index 100% rename from python/private/common/py_test_macro_bazel.bzl rename to python/private/py_test_macro_bazel.bzl diff --git a/python/private/common/py_test_rule_bazel.bzl b/python/private/py_test_rule_bazel.bzl similarity index 100% rename from python/private/common/py_test_rule_bazel.bzl rename to python/private/py_test_rule_bazel.bzl diff --git a/python/private/py_toolchain_suite.bzl b/python/private/py_toolchain_suite.bzl index 3fead95069..a69be376b4 100644 --- a/python/private/py_toolchain_suite.bzl +++ b/python/private/py_toolchain_suite.bzl @@ -15,7 +15,7 @@ """Create the toolchain defs in a BUILD.bazel file.""" load("@bazel_skylib//lib:selects.bzl", "selects") -load("//python/private:text_util.bzl", "render") +load(":text_util.bzl", "render") load( ":toolchain_types.bzl", "EXEC_TOOLS_TOOLCHAIN_TYPE", diff --git a/python/private/py_wheel.bzl b/python/private/py_wheel.bzl index 26eb5652a6..6d047ad680 100644 --- a/python/private/py_wheel.bzl +++ b/python/private/py_wheel.bzl @@ -14,9 +14,9 @@ "Implementation of py_wheel rule" -load("//python/private:stamp.bzl", "is_stamping_enabled") load(":py_package.bzl", "py_package_lib") load(":py_wheel_normalize_pep440.bzl", "normalize_pep440") +load(":stamp.bzl", "is_stamping_enabled") PyWheelInfo = provider( doc = "Information about a wheel produced by `py_wheel`", diff --git a/python/private/common/semantics.bzl b/python/private/semantics.bzl similarity index 100% rename from python/private/common/semantics.bzl rename to python/private/semantics.bzl diff --git a/python/private/toolchains_repo.bzl b/python/private/toolchains_repo.bzl index 4fae987c74..d21e46ac48 100644 --- a/python/private/toolchains_repo.bzl +++ b/python/private/toolchains_repo.bzl @@ -30,8 +30,8 @@ load( "PLATFORMS", "WINDOWS_NAME", ) -load("//python/private:repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") -load("//python/private:text_util.bzl", "render") +load(":repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") +load(":text_util.bzl", "render") def get_repository_name(repository_workspace): dummy_label = "//:_" diff --git a/python/py_binary.bzl b/python/py_binary.bzl index f7f68e6045..349610865f 100644 --- a/python/py_binary.bzl +++ b/python/py_binary.bzl @@ -15,9 +15,9 @@ """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:register_extension_info.bzl", "register_extension_info") load("//python/private:util.bzl", "add_migration_tag") -load("//python/private/common:py_binary_macro_bazel.bzl", _starlark_py_binary = "py_binary") # buildifier: disable=native-python _py_binary_impl = _starlark_py_binary if config.enable_pystar else native.py_binary @@ -26,9 +26,8 @@ def py_binary(**attrs): """Creates an executable Python program. This is the public macro wrapping the underlying rule. Args are forwarded - on as-is unless otherwise specified. See - the underlying {bzl:obj}`py_binary rule` - for detailed attribute documentation. + on as-is unless otherwise specified. See the underlying {rule}`py_binary` + rule for detailed attribute documentation. This macro affects the following args: * `python_version`: cannot be `PY2` @@ -36,8 +35,7 @@ def py_binary(**attrs): * `tags`: May have special marker values added, if not already present. Args: - **attrs: Rule attributes forwarded onto the underlying - {bzl:obj}`py_binary rule` + **attrs: Rule attributes forwarded onto the underlying {rule}`py_binary`. """ if attrs.get("python_version") == "PY2": fail("Python 2 is no longer supported: https://github.com/bazelbuild/rules_python/issues/886") diff --git a/python/py_cc_link_params_info.bzl b/python/py_cc_link_params_info.bzl index b0ad0a79d2..02eff71c4d 100644 --- a/python/py_cc_link_params_info.bzl +++ b/python/py_cc_link_params_info.bzl @@ -1,10 +1,10 @@ """Public entry point for PyCcLinkParamsInfo.""" load("@rules_python_internal//:rules_python_config.bzl", "config") -load("//python/private/common:providers.bzl", _starlark_PyCcLinkParamsProvider = "PyCcLinkParamsProvider") +load("//python/private:py_cc_link_params_info.bzl", _starlark_PyCcLinkParamsInfo = "PyCcLinkParamsInfo") PyCcLinkParamsInfo = ( - _starlark_PyCcLinkParamsProvider if ( + _starlark_PyCcLinkParamsInfo if ( config.enable_pystar or config.BuiltinPyCcLinkParamsProvider == None ) else config.BuiltinPyCcLinkParamsProvider ) diff --git a/python/py_library.bzl b/python/py_library.bzl index 3b9ddd1aa4..4ec1da4b27 100644 --- a/python/py_library.bzl +++ b/python/py_library.bzl @@ -15,9 +15,9 @@ """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:register_extension_info.bzl", "register_extension_info") load("//python/private:util.bzl", "add_migration_tag") -load("//python/private/common:py_library_macro_bazel.bzl", _starlark_py_library = "py_library") # buildifier: disable=native-python _py_library_impl = _starlark_py_library if config.enable_pystar else native.py_library @@ -27,16 +27,14 @@ def py_library(**attrs): This is the public macro wrapping the underlying rule. Args are forwarded on as-is unless otherwise specified. See - {bzl:obj}`py_library ` - for detailed attribute documentation. + {rule}`py_library` for detailed attribute documentation. This macro affects the following args: * `srcs_version`: cannot be `PY2` or `PY2ONLY` * `tags`: May have special marker values added, if not already present. Args: - **attrs: Rule attributes forwarded onto - {bzl:obj}`py_library ` + **attrs: Rule attributes forwarded onto {rule}`py_library`. """ if attrs.get("srcs_version") in ("PY2", "PY2ONLY"): fail("Python 2 is no longer supported: https://github.com/bazelbuild/rules_python/issues/886") diff --git a/python/py_runtime.bzl b/python/py_runtime.bzl index 9c8cd00dd9..2c44523505 100644 --- a/python/py_runtime.bzl +++ b/python/py_runtime.bzl @@ -14,8 +14,8 @@ """Public entry point for py_runtime.""" +load("//python/private:py_runtime_macro.bzl", _starlark_py_runtime = "py_runtime") load("//python/private:util.bzl", "IS_BAZEL_6_OR_HIGHER", "add_migration_tag") -load("//python/private/common:py_runtime_macro.bzl", _starlark_py_runtime = "py_runtime") # buildifier: disable=native-python _py_runtime_impl = _starlark_py_runtime if IS_BAZEL_6_OR_HIGHER else native.py_runtime @@ -25,7 +25,7 @@ def py_runtime(**attrs): This is the public macro wrapping the underlying rule. Args are forwarded on as-is unless otherwise specified. See - {bzl:obj}`py_runtime ` + {rule}`py_runtime` for detailed attribute documentation. This macro affects the following args: @@ -34,8 +34,7 @@ def py_runtime(**attrs): * `tags`: May have special marker values added, if not already present. Args: - **attrs: Rule attributes forwarded onto - {bzl:obj}`py_runtime ` + **attrs: Rule attributes forwarded onto {rule}`py_runtime`. """ if attrs.get("python_version") == "PY2": fail("Python 2 is no longer supported: see https://github.com/bazelbuild/rules_python/issues/886") diff --git a/python/py_runtime_info.bzl b/python/py_runtime_info.bzl index e88e0c0235..3a31c0f2f4 100644 --- a/python/py_runtime_info.bzl +++ b/python/py_runtime_info.bzl @@ -15,7 +15,7 @@ """Public entry point for PyRuntimeInfo.""" load("@rules_python_internal//:rules_python_config.bzl", "config") +load("//python/private:py_runtime_info.bzl", _starlark_PyRuntimeInfo = "PyRuntimeInfo") load("//python/private:reexports.bzl", "BuiltinPyRuntimeInfo") -load("//python/private/common:providers.bzl", _starlark_PyRuntimeInfo = "PyRuntimeInfo") PyRuntimeInfo = _starlark_PyRuntimeInfo if config.enable_pystar else BuiltinPyRuntimeInfo diff --git a/python/py_test.bzl b/python/py_test.bzl index 8f93b270ff..2aa93ff54b 100644 --- a/python/py_test.bzl +++ b/python/py_test.bzl @@ -15,9 +15,9 @@ """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:register_extension_info.bzl", "register_extension_info") load("//python/private:util.bzl", "add_migration_tag") -load("//python/private/common:py_test_macro_bazel.bzl", _starlark_py_test = "py_test") # buildifier: disable=native-python _py_test_impl = _starlark_py_test if config.enable_pystar else native.py_test @@ -27,8 +27,7 @@ def py_test(**attrs): This is the public macro wrapping the underlying rule. Args are forwarded on as-is unless otherwise specified. See - {bzl:obj}`py_test ` - for detailed attribute documentation. + {rule}`py_test` for detailed attribute documentation. This macro affects the following args: * `python_version`: cannot be `PY2` @@ -36,8 +35,7 @@ def py_test(**attrs): * `tags`: May have special marker values added, if not already present. Args: - **attrs: Rule attributes forwarded onto - {bzl:obj}`py_test ` + **attrs: Rule attributes forwarded onto {rule}`py_test`. """ if attrs.get("python_version") == "PY2": fail("Python 2 is no longer supported: https://github.com/bazelbuild/rules_python/issues/886") From f22f39c9de5ee394002d1b50d4d1f8c209c251e9 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 16 Oct 2024 09:41:04 -0700 Subject: [PATCH 254/345] fix(precompiling): only add pyc to default outputs if precompiling explicitly enabled for target (#2307) This fixes a bug where precompiled files were *always* being added to the default outputs of a target. The intent is they are only added to a target's default outputs if the target explicitly opted into precompiling. This went unnoticed because the exec tools toolchain is still disabled by default, so the test that verifies a basic py_binary's default outputs didn't generate implicit pyc files. It was introduced when fixing the pyc collection bug. To fix, only add the pyc files deemed "required", not all the pyc files generated. Also added a test to capture this case to the precompile tests. --- python/private/py_executable.bzl | 2 +- .../precompile/precompile_tests.bzl | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/python/private/py_executable.bzl b/python/private/py_executable.bzl index 00d8d36272..ce1288cc29 100644 --- a/python/private/py_executable.bzl +++ b/python/private/py_executable.bzl @@ -175,7 +175,7 @@ def py_executable_base_impl(ctx, *, semantics, is_test, inherited_environment = default_outputs = builders.DepsetBuilder() default_outputs.add(executable) default_outputs.add(precompile_result.keep_srcs) - default_outputs.add(precompile_result.pyc_files) + default_outputs.add(required_pyc_files) imports = collect_imports(ctx, semantics) diff --git a/tests/base_rules/precompile/precompile_tests.bzl b/tests/base_rules/precompile/precompile_tests.bzl index 9d6ac5f7d4..895f2d3156 100644 --- a/tests/base_rules/precompile/precompile_tests.bzl +++ b/tests/base_rules/precompile/precompile_tests.bzl @@ -514,6 +514,38 @@ def _test_pyc_collection_include_dep_omit_source_impl(env, target): _tests.append(_test_pyc_collection_include_dep_omit_source) +def _test_precompile_attr_inherit_pyc_collection_disabled_precompile_flag_enabled(name): + if not rp_config.enable_pystar: + rt_util.skip_test(name = name) + return + rt_util.helper_target( + py_binary, + name = name + "_subject", + srcs = ["bin.py"], + main = "bin.py", + precompile = "inherit", + pyc_collection = "disabled", + ) + analysis_test( + name = name, + impl = _test_precompile_attr_inherit_pyc_collection_disabled_precompile_flag_enabled_impl, + target = name + "_subject", + config_settings = _COMMON_CONFIG_SETTINGS | { + PRECOMPILE: "enabled", + }, + ) + +def _test_precompile_attr_inherit_pyc_collection_disabled_precompile_flag_enabled_impl(env, target): + target = env.expect.that_target(target) + target.runfiles().not_contains_predicate( + matching.str_matches("/bin.*pyc"), + ) + target.default_outputs().not_contains_predicate( + matching.file_path_matches("/bin.*pyc"), + ) + +_tests.append(_test_precompile_attr_inherit_pyc_collection_disabled_precompile_flag_enabled) + def runfiles_contains_at_least_predicates(runfiles, predicates): for predicate in predicates: runfiles.contains_predicate(predicate) From ced0c109b3403911e75f36be8e9ee895ea8f0962 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Thu, 17 Oct 2024 01:59:33 +0900 Subject: [PATCH 255/345] chore: use rules_shell (#2305) Summary: - move bazelversion sh_test to //tests - add rules_shell dev dependency - use sh_test for the sh_py_run_test - use rules_shell in examples/bzlmod - use rules_shell in multi_python_versions example Fixes #2299. --- .bazelrc | 4 +-- BUILD.bazel | 32 +++---------------- CHANGELOG.md | 3 ++ MODULE.bazel | 1 + examples/bzlmod/MODULE.bazel | 3 ++ examples/bzlmod/MODULE.bazel.lock | 16 ++++++---- examples/bzlmod/tests/BUILD.bazel | 1 + examples/multi_python_versions/MODULE.bazel | 3 ++ examples/multi_python_versions/WORKSPACE | 16 ++++++++++ .../multi_python_versions/tests/BUILD.bazel | 1 + internal_deps.bzl | 8 +++++ internal_setup.bzl | 3 ++ tests/BUILD.bazel | 28 ++++++++++++++++ tests/support/sh_py_run_test.bzl | 3 +- 14 files changed, 86 insertions(+), 36 deletions(-) diff --git a/.bazelrc b/.bazelrc index b484751c3c..1ca469cd75 100644 --- a/.bazelrc +++ b/.bazelrc @@ -4,8 +4,8 @@ # (Note, we cannot use `common --deleted_packages` because the bazel version command doesn't support it) # To update these lines, execute # `bazel run @rules_bazel_integration_test//tools:update_deleted_packages` -build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered -query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered test --test_output=errors diff --git a/BUILD.bazel b/BUILD.bazel index 038b56a0c6..5a58422328 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -13,7 +13,6 @@ # limitations under the License. load("@bazel_skylib//:bzl_library.bzl", "bzl_library") -load(":version.bzl", "BAZEL_VERSION") package(default_visibility = ["//visibility:public"]) @@ -24,6 +23,11 @@ exports_files([ "version.bzl", ]) +exports_files( + [".bazelversion"], + visibility = ["//tests:__subpackages__"], +) + exports_files( glob(["*.md"]), visibility = ["//docs:__subpackages__"], @@ -69,29 +73,3 @@ filegroup( ], visibility = ["//visibility:public"], ) - -genrule( - name = "assert_bazelversion", - srcs = [".bazelversion"], - outs = ["assert_bazelversion_test.sh"], - cmd = """\ -set -o errexit -o nounset -o pipefail -current=$$(cat "$(execpath .bazelversion)") -cat > "$@" <&2 echo "ERROR: current bazel version '$${{current}}' is not the expected '{expected}'" - exit 1 -fi -EOF -""".format( - expected = BAZEL_VERSION, - ), - executable = True, -) - -sh_test( - name = "assert_bazelversion_test", - srcs = [":assert_bazelversion_test.sh"], -) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cc3cbca97..662a557155 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,9 @@ A brief description of the categories of changes: enables (or disables) using pyc files from targets transitively * (pip) Skip patching wheels not matching `pip.override`'s `file` ([#2294](https://github.com/bazelbuild/rules_python/pull/2294)). +* (chore): Add a `rules_shell` dev dependency and moved a `sh_test` target + outside of the `//:BUILD.bazel` file. + Fixes [#2299](https://github.com/bazelbuild/rules_python/issues/2299). ### Added * (py_wheel) Now supports `compress = (True|False)` to allow disabling diff --git a/MODULE.bazel b/MODULE.bazel index 390e81a6d8..0cbae38e30 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -72,6 +72,7 @@ bazel_dep(name = "stardoc", version = "0.6.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_testing", version = "0.6.0", dev_dependency = True) +bazel_dep(name = "rules_shell", version = "0.2.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. diff --git a/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel index 5504172e1d..e9d69c5ab8 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -256,3 +256,6 @@ local_path_override( module_name = "other_module", path = "other_module", ) + +# example test dependencies +bazel_dep(name = "rules_shell", version = "0.2.0", dev_dependency = True) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 56854cc847..8c66a1318f 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -10,7 +10,8 @@ "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.11.0/source.json": "c9320aa53cd1c441d24bd6b716da087ad7e4ff0d9742a9884587596edfe53015", + "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", @@ -26,13 +27,14 @@ "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/platforms/0.0.9/source.json": "cd74d854bf16a9e002fb2ca7b1a421f4403cda29f824a765acd3a8c56f8d43e6", "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", @@ -63,6 +65,8 @@ "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", @@ -108,7 +112,7 @@ "@@platforms//host:extension.bzl%host_platform": { "general": { "bzlTransitiveDigest": "xelQcPZH8+tmuOHVjL9vDxMnnQNMlwj0SlvgoqBkm4U=", - "usagesDigest": "meSzxn3DUCcYEhq4HQwExWkWtU4EjriRBQLsZN+Q0SU=", + "usagesDigest": "V1R2Y2oMxKNfx2WCWpSCaUV1WefW1o8HZGm3v1vHgY4=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -1388,7 +1392,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "R4UDOUIolqXHNPsTlMq16g3t0xLeGMK/p7Ou1Cziz04=", + "bzlTransitiveDigest": "iikkSIkMsBiM/vadkEf9xEoVbaxZqrkUg08hiHr/LKk=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -1399,7 +1403,7 @@ "@@//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": "c421a2c2f3f428d2685a16eb9cc3fb8662605aba4ef151a87a356678bb7e866d", + "@@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" }, @@ -6295,7 +6299,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "8o/oP53WcjE/4DQ4VQ0l0IVCa/i3A1mTDmN05qwm0yM=", + "bzlTransitiveDigest": "WPfU9gogl29lCI8A/N2aYn7RAhsCpZikVU1Hw7nMtAc=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/examples/bzlmod/tests/BUILD.bazel b/examples/bzlmod/tests/BUILD.bazel index a778ca1aee..7cbc8d47b7 100644 --- a/examples/bzlmod/tests/BUILD.bazel +++ b/examples/bzlmod/tests/BUILD.bazel @@ -4,6 +4,7 @@ load("@python_versions//3.9:defs.bzl", py_binary_3_9 = "py_binary", py_test_3_9 load("@pythons_hub//:versions.bzl", "MINOR_MAPPING") load("@rules_python//python:defs.bzl", "py_binary", "py_test") load("@rules_python//python/config_settings:transition.bzl", py_versioned_binary = "py_binary", py_versioned_test = "py_test") +load("@rules_shell//shell:sh_test.bzl", "sh_test") py_binary( name = "version_default", diff --git a/examples/multi_python_versions/MODULE.bazel b/examples/multi_python_versions/MODULE.bazel index 1e5d32ebc0..4223916d22 100644 --- a/examples/multi_python_versions/MODULE.bazel +++ b/examples/multi_python_versions/MODULE.bazel @@ -55,3 +55,6 @@ pip.parse( python_version = "3.11", requirements_lock = "//requirements:requirements_lock_3_11.txt", ) + +# example test dependencies +bazel_dep(name = "rules_shell", version = "0.2.0", dev_dependency = True) diff --git a/examples/multi_python_versions/WORKSPACE b/examples/multi_python_versions/WORKSPACE index 4f731d95a8..48d2065282 100644 --- a/examples/multi_python_versions/WORKSPACE +++ b/examples/multi_python_versions/WORKSPACE @@ -45,3 +45,19 @@ multi_pip_parse( load("@pypi//:requirements.bzl", "install_deps") install_deps() + +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +# See https://github.com/bazelbuild/rules_shell/releases/tag/v0.2.0 +http_archive( + name = "rules_shell", + sha256 = "410e8ff32e018b9efd2743507e7595c26e2628567c42224411ff533b57d27c28", + strip_prefix = "rules_shell-0.2.0", + url = "https://github.com/bazelbuild/rules_shell/releases/download/v0.2.0/rules_shell-v0.2.0.tar.gz", +) + +load("@rules_shell//shell:repositories.bzl", "rules_shell_dependencies", "rules_shell_toolchains") + +rules_shell_dependencies() + +rules_shell_toolchains() diff --git a/examples/multi_python_versions/tests/BUILD.bazel b/examples/multi_python_versions/tests/BUILD.bazel index 5df41bded7..cf14bf0a3b 100644 --- a/examples/multi_python_versions/tests/BUILD.bazel +++ b/examples/multi_python_versions/tests/BUILD.bazel @@ -4,6 +4,7 @@ load("@python//3.11:defs.bzl", py_binary_3_11 = "py_binary", py_test_3_11 = "py_ 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("@rules_python//python:defs.bzl", "py_binary", "py_test") +load("@rules_shell//shell:sh_test.bzl", "sh_test") copy_file( name = "copy_version", diff --git a/internal_deps.bzl b/internal_deps.bzl index 56962cbd19..9c2e6b2581 100644 --- a/internal_deps.bzl +++ b/internal_deps.bzl @@ -46,6 +46,14 @@ def rules_python_internal_deps(): ], ) + # See https://github.com/bazelbuild/rules_shell/releases/tag/v0.2.0 + http_archive( + name = "rules_shell", + sha256 = "410e8ff32e018b9efd2743507e7595c26e2628567c42224411ff533b57d27c28", + strip_prefix = "rules_shell-0.2.0", + url = "https://github.com/bazelbuild/rules_shell/releases/download/v0.2.0/rules_shell-v0.2.0.tar.gz", + ) + http_archive( name = "rules_pkg", urls = [ diff --git a/internal_setup.bzl b/internal_setup.bzl index 3029c1546f..b3dc326444 100644 --- a/internal_setup.bzl +++ b/internal_setup.bzl @@ -21,6 +21,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_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") load("//python:versions.bzl", "MINOR_MAPPING", "TOOL_VERSIONS") load("//python/private:internal_config_repo.bzl", "internal_config_repo") # buildifier: disable=bzl-visibility @@ -56,3 +57,5 @@ def rules_python_internal_setup(): bazel_starlib_dependencies() bazel_binaries(versions = SUPPORTED_BAZEL_VERSIONS) bazel_features_deps() + rules_shell_dependencies() + rules_shell_toolchains() diff --git a/tests/BUILD.bazel b/tests/BUILD.bazel index e7dbef65d8..0fb8e88135 100644 --- a/tests/BUILD.bazel +++ b/tests/BUILD.bazel @@ -1,4 +1,6 @@ load("@bazel_skylib//rules:build_test.bzl", "build_test") +load("@rules_shell//shell:sh_test.bzl", "sh_test") +load("//:version.bzl", "BAZEL_VERSION") package(default_visibility = ["//visibility:public"]) @@ -25,3 +27,29 @@ build_test( "//python/entry_points:py_console_script_binary_bzl", ], ) + +genrule( + name = "assert_bazelversion", + srcs = ["//:.bazelversion"], + outs = ["assert_bazelversion_test.sh"], + cmd = """\ +set -o errexit -o nounset -o pipefail +current=$$(cat "$(execpath //:.bazelversion)") +cat > "$@" <&2 echo "ERROR: current bazel version '$${{current}}' is not the expected '{expected}'" + exit 1 +fi +EOF +""".format( + expected = BAZEL_VERSION, + ), + executable = True, +) + +sh_test( + name = "assert_bazelversion_test", + srcs = [":assert_bazelversion_test.sh"], +) diff --git a/tests/support/sh_py_run_test.bzl b/tests/support/sh_py_run_test.bzl index 32df5b8caf..066f091650 100644 --- a/tests/support/sh_py_run_test.bzl +++ b/tests/support/sh_py_run_test.bzl @@ -17,6 +17,7 @@ This facilitates verify running binaries with different configuration settings without the overhead of a bazel-in-bazel integration test. """ +load("@rules_shell//shell:sh_test.bzl", "sh_test") load("//python:py_binary.bzl", "py_binary") load("//python:py_test.bzl", "py_test") load("//python/private:toolchain_types.bzl", "TARGET_TOOLCHAIN_TYPE") # buildifier: disable=bzl-visibility @@ -149,7 +150,7 @@ def py_reconfig_test(*, name, **kwargs): def sh_py_run_test(*, name, sh_src, py_src, **kwargs): bin_name = "_{}_bin".format(name) - native.sh_test( + sh_test( name = name, srcs = [sh_src], data = [bin_name], From d2bd4320ec1a3d840e557f2e2848e9c4206c7a25 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 16 Oct 2024 10:00:37 -0700 Subject: [PATCH 256/345] sphinxdocs: add typedef directive for documenting user-defined types (#2300) This adds support for documenting user-defined Starlark "types". Starlark doesn't have user-defined types as a first-class concept, but an equivalent can be done by using `struct` with lambdas and closures. On the documentation side, the structure of these objects can be shown by have a module-level struct with matching attributes. On the Sphinx side of things, this is simple to support (and the functionality was largely already there): it's just having a directive with other directives within it (this is the same way other languages handle it). On the Starlark side of things, its a bit more complicated. Stardoc can process a module-level struct, but essentially returns a list of `(dotted_name, object_proto)`, and it will only include object types it recognizes (e.g. functions, providers, rules, etc). To work within this limitation, the proto-to-markdown converter special cases the name "TYPEDEF" to indicate a typedef. Everything with the same prefix is then treated as a member of the typedef and nested within the generated typedef directive. Conveniently, because the "TYPEDEF" object is a function, it can then include that in the output and we get "class doc" functionality for free. This is mostly motivated by converting rules_testing to use sphinxdocs. While rules_python has a couple user-define types (e.g. the depset/runfiles/PyInfo builders), rules_testing has dozens of such types, which makes it untenable to hand-write docs describing them all. Today, rules_testing is already mostly following the format sphinxdocs proscribes to generate its at https://rules-testing.readthedocs.io/en/latest/api/index.html, and it's worked pretty well. --- sphinxdocs/docs/sphinx-bzl.md | 77 +++++++++++++++- sphinxdocs/docs/starlark-docgen.md | 87 +++++++++++++++++++ sphinxdocs/private/proto_to_markdown.py | 69 ++++++++++++--- sphinxdocs/src/sphinx_bzl/bzl.py | 43 +++++++-- .../proto_to_markdown_test.py | 16 ++++ sphinxdocs/tests/sphinx_stardoc/BUILD.bazel | 10 ++- .../tests/sphinx_stardoc/bzl_typedef.bzl | 46 ++++++++++ sphinxdocs/tests/sphinx_stardoc/typedef.md | 32 +++++++ 8 files changed, 360 insertions(+), 20 deletions(-) create mode 100644 sphinxdocs/tests/sphinx_stardoc/bzl_typedef.bzl create mode 100644 sphinxdocs/tests/sphinx_stardoc/typedef.md diff --git a/sphinxdocs/docs/sphinx-bzl.md b/sphinxdocs/docs/sphinx-bzl.md index 73ae138f0e..8376f60679 100644 --- a/sphinxdocs/docs/sphinx-bzl.md +++ b/sphinxdocs/docs/sphinx-bzl.md @@ -227,6 +227,11 @@ The documentation renders using RST notation (`.. directive::`), not MyST notation. ::: +Directives can be nested, but [the inner directives must have **fewer** colons +than outer +directives](https://myst-parser.readthedocs.io/en/latest/syntax/roles-and-directives.html#nesting-directives). + + :::{rst:directive} .. bzl:currentfile:: file This directive indicates the Bazel file that objects defined in the current @@ -237,21 +242,87 @@ files, and `//foo:BUILD.bazel` for things in BUILD files. ::: -:::{rst:directive} .. bzl:target:: target +:::::{rst:directive} .. bzl:target:: target Documents a target. It takes no directive options. The format of `target` can either be a fully qualified label (`//foo:bar`), or the base target name relative to `{bzl:currentfile}`. -``` +```` :::{bzl:target} //foo:target My docs ::: -``` +```` + +::::: :::{rst:directive} .. bzl:flag:: target Documents a flag. It has the same format as `{bzl:target}` ::: +::::::{rst:directive} .. bzl:typedef:: typename + +Documents a user-defined structural "type". These are typically generated by +the {obj}`sphinx_stardoc` rule after following [User-defined types] to create a +struct with a `TYPEDEF` field, but can also be manually defined if there's +no natural place for it in code, e.g. some ad-hoc structural type. + +````` +::::{bzl:typedef} Square +Doc about Square + +:::{bzl:field} width +:type: int +::: + +:::{bzl:function} new(size) + ... +::: + +:::{bzl:function} area() + ... +::: +:::: +````` + +Note that MyST requires the number of colons for the outer typedef directive +to be greater than the inner directives. Otherwise, only the first nested +directive is parsed as part of the typedef, but subsequent ones are not. +:::::: + +:::::{rst:directive} .. bzl:field:: fieldname + +Documents a field of an object. These are nested within some other directive, +typically `{bzl:typedef}` + +Directive options: +* `:type:` specifies the type of the field + +```` +:::{bzl:field} fieldname +:type: int | None | str + +Doc about field +::: +```` +::::: + +:::::{rst:directive} .. bzl:provider-field:: fieldname + +Documents a field of a provider. The directive itself is autogenerated by +`sphinx_stardoc`, but the content is simply the documentation string specified +in the provider's field. + +Directive options: +* `:type:` specifies the type of the field + +```` +:::{bzl:provider-field} fieldname +:type: depset[File] | None + +Doc about the provider field +::: +```` +::::: diff --git a/sphinxdocs/docs/starlark-docgen.md b/sphinxdocs/docs/starlark-docgen.md index d131607c8e..ba4ab516f5 100644 --- a/sphinxdocs/docs/starlark-docgen.md +++ b/sphinxdocs/docs/starlark-docgen.md @@ -73,3 +73,90 @@ bzl_library( deps = ... ) ``` + +## User-defined types + +While Starlark doesn't have user-defined types as a first-class concept, it's +still possible to create such objects using `struct` and lambdas. For the +purposes of documentation, they can be documented by creating a module-level +`struct` with matching fields *and* also a field named `TYPEDEF`. When the +`sphinx_stardoc` rule sees a struct with a `TYPEDEF` field, it generates doc +using the {rst:directive}`bzl:typedef` directive and puts all the struct's fields +within the typedef. The net result is the rendered docs look similar to how +a class would be documented in other programming languages. + +For example, a the Starlark implemenation of a `Square` object with a `area()` +method would look like: + +``` + +def _Square_typedef(): + """A square with fixed size. + + :::{field} width + :type: int + ::: + """ + +def _Square_new(width): + """Creates a Square. + + Args: + width: {type}`int` width of square + + Returns: + {type}`Square` + """ + self = struct( + area = lambda *a, **k: _Square_area(self, *a, **k), + width = width + ) + return self + +def _Square_area(self, ): + """Tells the area of the square.""" + return self.width * self.width + +Square = struct( + TYPEDEF = _Square_typedef, + new = _Square_new, + area = _Square_area, +) +``` + +This will then genereate markdown that looks like: + +``` +::::{bzl:typedef} Square +A square with fixed size + +:::{bzl:field} width +:type: int +::: +:::{bzl:function} new() +...args etc from _Square_new... +::: +:::{bzl:function} area() +...args etc from _Square_area... +::: +:::: +``` + +Which renders as: + +:::{bzl:currentfile} //example:square.bzl +::: + +::::{bzl:typedef} Square +A square with fixed size + +:::{bzl:field} width +:type: int +::: +:::{bzl:function} new() +... +::: +:::{bzl:function} area() +... +::: +:::: diff --git a/sphinxdocs/private/proto_to_markdown.py b/sphinxdocs/private/proto_to_markdown.py index d667eeca00..1f0fe3143e 100644 --- a/sphinxdocs/private/proto_to_markdown.py +++ b/sphinxdocs/private/proto_to_markdown.py @@ -96,6 +96,15 @@ def __init__( self._module = module self._out_stream = out_stream self._public_load_path = public_load_path + self._typedef_stack = [] + + def _get_colons(self): + # There's a weird behavior where increasing colon indents doesn't + # parse as nested objects correctly, so we have to reduce the + # number of colons based on the indent level + indent = 10 - len(self._typedef_stack) + assert indent >= 0 + return ":::" + ":" * indent def render(self): self._render_module(self._module) @@ -115,11 +124,10 @@ def _render_module(self, module: stardoc_output_pb2.ModuleInfo): "\n\n", ) - # Sort the objects by name objects = itertools.chain( ((r.rule_name, r, self._render_rule) for r in module.rule_info), ((p.provider_name, p, self._render_provider) for p in module.provider_info), - ((f.function_name, f, self._render_func) for f in module.func_info), + ((f.function_name, f, self._process_func_info) for f in module.func_info), ((a.aspect_name, a, self._render_aspect) for a in module.aspect_info), ( (m.extension_name, m, self._render_module_extension) @@ -130,13 +138,31 @@ def _render_module(self, module: stardoc_output_pb2.ModuleInfo): for r in module.repository_rule_info ), ) + # Sort by name, ignoring case. The `.TYPEDEF` string is removed so + # that the .TYPEDEF entries come before what is in the typedef. + objects = sorted(objects, key=lambda v: v[0].removesuffix(".TYPEDEF").lower()) - objects = sorted(objects, key=lambda v: v[0].lower()) - - for _, obj, func in objects: - func(obj) + for name, obj, func in objects: + self._process_object(name, obj, func) self._write("\n") + # Close any typedefs + while self._typedef_stack: + self._typedef_stack.pop() + self._render_typedef_end() + + def _process_object(self, name, obj, renderer): + # The trailing doc is added to prevent matching a common prefix + typedef_group = name.removesuffix(".TYPEDEF") + "." + while self._typedef_stack and not typedef_group.startswith( + self._typedef_stack[-1] + ): + self._typedef_stack.pop() + self._render_typedef_end() + renderer(obj) + if name.endswith(".TYPEDEF"): + self._typedef_stack.append(typedef_group) + def _render_aspect(self, aspect: stardoc_output_pb2.AspectInfo): _sort_attributes_inplace(aspect.attribute) self._write("::::::{bzl:aspect} ", aspect.aspect_name, "\n\n") @@ -242,12 +268,32 @@ def _rule_attr_type_string(self, attr: stardoc_output_pb2.AttributeInfo) -> str: # Rather than error, give some somewhat understandable value. return _AttributeType.Name(attr.type) + def _process_func_info(self, func): + if func.function_name.endswith(".TYPEDEF"): + self._render_typedef_start(func) + else: + self._render_func(func) + + def _render_typedef_start(self, func): + self._write( + self._get_colons(), + "{bzl:typedef} ", + func.function_name.removesuffix(".TYPEDEF"), + "\n", + ) + if func.doc_string: + self._write(func.doc_string.strip(), "\n") + + def _render_typedef_end(self): + self._write(self._get_colons(), "\n\n") + def _render_func(self, func: stardoc_output_pb2.StarlarkFunctionInfo): - self._write("::::::{bzl:function} ") + self._write(self._get_colons(), "{bzl:function} ") parameters = self._render_func_signature(func) - self._write(func.doc_string.strip(), "\n\n") + if doc_string := func.doc_string.strip(): + self._write(doc_string, "\n\n") if parameters: for param in parameters: @@ -268,10 +314,13 @@ def _render_func(self, func: stardoc_output_pb2.StarlarkFunctionInfo): self._write(":::::{deprecated}: unknown\n") self._write(" ", _indent_block_text(func.deprecated.doc_string), "\n") self._write(":::::\n") - self._write("::::::\n") + self._write(self._get_colons(), "\n") def _render_func_signature(self, func): - self._write(f"{func.function_name}(") + func_name = func.function_name + if self._typedef_stack: + func_name = func.function_name.removeprefix(self._typedef_stack[-1]) + self._write(f"{func_name}(") # TODO: Have an "is method" directive in the docstring to decide if # the self parameter should be removed. parameters = [param for param in func.parameter if param.name != "self"] diff --git a/sphinxdocs/src/sphinx_bzl/bzl.py b/sphinxdocs/src/sphinx_bzl/bzl.py index 54b1285a84..90fb109614 100644 --- a/sphinxdocs/src/sphinx_bzl/bzl.py +++ b/sphinxdocs/src/sphinx_bzl/bzl.py @@ -424,7 +424,7 @@ def _make_xrefs_for_arg_attr( return [wrapper] -class _BzlField(_BzlXrefField, docfields.Field): +class _BzlDocField(_BzlXrefField, docfields.Field): """A non-repeated field with xref support.""" @@ -623,6 +623,7 @@ def handle_signature( relative_name = relative_name.strip() name_prefix, _, base_symbol_name = relative_name.rpartition(".") + if name_prefix: # Respect whatever the signature wanted display_prefix = name_prefix @@ -819,6 +820,28 @@ class _BzlCallable(_BzlObject): """Abstract base class for objects that are callable.""" +class _BzlTypedef(_BzlObject): + """Documents a typedef. + + A typedef describes objects with well known attributes. + + ````` + ::::{bzl:typedef} Square + + :::{bzl:field} width + :type: int + ::: + + :::{bzl:function} new(size) + ::: + + :::{bzl:function} area() + ::: + :::: + ````` + """ + + class _BzlProvider(_BzlObject): """Documents a provider type. @@ -837,7 +860,7 @@ class _BzlProvider(_BzlObject): """ -class _BzlProviderField(_BzlObject): +class _BzlField(_BzlObject): """Documents a field of a provider. Fields can optionally have a type specified using the `:type:` option. @@ -872,6 +895,10 @@ def _get_alt_names(self, object_entry): return alt_names +class _BzlProviderField(_BzlField): + pass + + class _BzlRepositoryRule(_BzlCallable): """Documents a repository rule. @@ -951,7 +978,7 @@ class _BzlRule(_BzlCallable): rolename="attr", can_collapse=False, ), - _BzlField( + _BzlDocField( "provides", label="Provides", has_arg=False, @@ -1078,13 +1105,13 @@ class _BzlModuleExtension(_BzlObject): """ doc_field_types = [ - _BzlField( + _BzlDocField( "os-dependent", label="OS Dependent", has_arg=False, names=["os-dependent"], ), - _BzlField( + _BzlDocField( "arch-dependent", label="Arch Dependent", has_arg=False, @@ -1448,7 +1475,8 @@ class _BzlDomain(domains.Domain): # Providers are close enough to types that we include "type". This # also makes :type: Foo work in directive options. "provider": domains.ObjType("provider", "provider", "type", "obj"), - "provider-field": domains.ObjType("provider field", "field", "obj"), + "provider-field": domains.ObjType("provider field", "provider-field", "obj"), + "field": domains.ObjType("field", "field", "obj"), "repo-rule": domains.ObjType("repository rule", "repo_rule", "obj"), "rule": domains.ObjType("rule", "rule", "obj"), "tag-class": domains.ObjType("tag class", "tag_class", "obj"), @@ -1457,6 +1485,7 @@ class _BzlDomain(domains.Domain): "flag": domains.ObjType("flag", "flag", "target", "obj"), # types are objects that have a constructor and methods/attrs "type": domains.ObjType("type", "type", "obj"), + "typedef": domains.ObjType("typedef", "typedef", "type", "obj"), } # This controls: @@ -1483,7 +1512,9 @@ class _BzlDomain(domains.Domain): "function": _BzlFunction, "module-extension": _BzlModuleExtension, "provider": _BzlProvider, + "typedef": _BzlTypedef, "provider-field": _BzlProviderField, + "field": _BzlField, "repo-rule": _BzlRepositoryRule, "rule": _BzlRule, "tag-class": _BzlTagClass, diff --git a/sphinxdocs/tests/proto_to_markdown/proto_to_markdown_test.py b/sphinxdocs/tests/proto_to_markdown/proto_to_markdown_test.py index 3b664a5335..7835d64c31 100644 --- a/sphinxdocs/tests/proto_to_markdown/proto_to_markdown_test.py +++ b/sphinxdocs/tests/proto_to_markdown/proto_to_markdown_test.py @@ -193,6 +193,22 @@ def test_render_signature(self): self.assertIn('{default-value}`"@repo//pkg:file.bzl"`', actual) self.assertIn("{default-value}`''", actual) + def test_render_typedefs(self): + proto_text = """ +file: "@repo//pkg:foo.bzl" +func_info: { function_name: "Zeta.TYPEDEF" } +func_info: { function_name: "Carl.TYPEDEF" } +func_info: { function_name: "Carl.ns.Alpha.TYPEDEF" } +func_info: { function_name: "Beta.TYPEDEF" } +func_info: { function_name: "Beta.Sub.TYPEDEF" } +""" + actual = self._render(proto_text) + self.assertIn("\n:::::::::::::{bzl:typedef} Beta\n", actual) + self.assertIn("\n::::::::::::{bzl:typedef} Beta.Sub\n", actual) + self.assertIn("\n:::::::::::::{bzl:typedef} Carl\n", actual) + self.assertIn("\n::::::::::::{bzl:typedef} Carl.ns.Alpha\n", actual) + self.assertIn("\n:::::::::::::{bzl:typedef} Zeta\n", actual) + if __name__ == "__main__": absltest.main() diff --git a/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel b/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel index 3741e4169c..60a5e8d766 100644 --- a/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel +++ b/sphinxdocs/tests/sphinx_stardoc/BUILD.bazel @@ -42,7 +42,10 @@ sphinx_docs( sphinx_stardocs( name = "simple_bzl_docs", - srcs = [":bzl_rule_bzl"], + srcs = [ + ":bzl_rule_bzl", + ":bzl_typedef_bzl", + ], target_compatible_with = _TARGET_COMPATIBLE_WITH, ) @@ -76,6 +79,11 @@ bzl_library( deps = [":func_and_providers_bzl"], ) +bzl_library( + name = "bzl_typedef_bzl", + srcs = ["bzl_typedef.bzl"], +) + sphinx_build_binary( name = "sphinx-build", tags = ["manual"], # Only needed as part of sphinx doc building diff --git a/sphinxdocs/tests/sphinx_stardoc/bzl_typedef.bzl b/sphinxdocs/tests/sphinx_stardoc/bzl_typedef.bzl new file mode 100644 index 0000000000..5afd0bf837 --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/bzl_typedef.bzl @@ -0,0 +1,46 @@ +"""Module doc for bzl_typedef.""" + +def _Square_typedef(): + """Represents a square + + :::{field} width + :type: int + The length of the sides + ::: + + """ + +def _Square_new(width): + """Creates a square. + + Args: + width: {type}`int` the side size + + Returns: + {type}`Square` + """ + + # buildifier: disable=uninitialized + self = struct( + area = lambda *a, **k: _Square_area(self, *a, **k), + width = width, + ) + return self + +def _Square_area(self): + """Tells the area + + Args: + self: implicitly added + + Returns: + {type}`int` + """ + return self.width * self.width + +# buildifier: disable=name-conventions +Square = struct( + TYPEDEF = _Square_typedef, + new = _Square_new, + area = _Square_area, +) diff --git a/sphinxdocs/tests/sphinx_stardoc/typedef.md b/sphinxdocs/tests/sphinx_stardoc/typedef.md new file mode 100644 index 0000000000..08c4aa2c1b --- /dev/null +++ b/sphinxdocs/tests/sphinx_stardoc/typedef.md @@ -0,0 +1,32 @@ +:::{default-domain} bzl +::: + +:::{bzl:currentfile} //lang:typedef.bzl +::: + + +# Typedef + +below is a provider + +:::::::::{bzl:typedef} MyType + +my type doc + +:::{bzl:function} method(a, b) + +:arg a: + {type}`depset[str]` + arg a doc +:arg b: ami2 doc + {type}`None | depset[File]` + arg b doc +::: + +:::{bzl:field} field +:type: str + +field doc +::: + +::::::::: From eb2225c31a20a7ee361054b088bcef8cd9434b74 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 16 Oct 2024 10:13:33 -0700 Subject: [PATCH 257/345] chore: enable exec tools toolchain by default (#2308) This enables the exec tools toolchain by default. The flag to disable it is left available as an escape hatch. --- CHANGELOG.md | 3 +++ python/config_settings/BUILD.bazel | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 662a557155..867ce12bfb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,9 @@ A brief description of the categories of changes: (or equivalent). * (toolchains) `py_runtime.implementation_name` now defaults to `cpython` (previously it defaulted to None). +* (toolchains) The exec tools toolchain is enabled by default. It can be + disabled by setting + {obj}`--@rules_python//python/config_settings:exec_tools_toolchain=disabled`. * (deps) stardoc 0.6.2 added as dependency. ### Fixed diff --git a/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel index b55213b5d6..c530afe98b 100644 --- a/python/config_settings/BUILD.bazel +++ b/python/config_settings/BUILD.bazel @@ -42,7 +42,7 @@ string_flag( string_flag( name = "exec_tools_toolchain", - build_setting_default = ExecToolsToolchainFlag.DISABLED, + build_setting_default = ExecToolsToolchainFlag.ENABLED, values = sorted(ExecToolsToolchainFlag.__members__.values()), # NOTE: Only public because it is used in py_toolchain_suite from toolchain # repositories From 0e600586aea596a488902ce90938b36ce7e9f6d5 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 16 Oct 2024 17:39:35 -0700 Subject: [PATCH 258/345] docs: add stubs so Bazel docs link to a valid file (#2309) The Bazel docs link to the implementation files, which were recently moved. To avoid users getting a 404, add stub files with some text to direct them somewhere useful. Work towards https://github.com/bazelbuild/bazel/issues/24014 --- python/private/common/py_binary_rule_bazel.bzl | 6 ++++++ python/private/common/py_library_rule_bazel.bzl | 6 ++++++ python/private/common/py_runtime_rule.bzl | 6 ++++++ python/private/common/py_test_rule_bazel.bzl | 6 ++++++ 4 files changed, 24 insertions(+) create mode 100644 python/private/common/py_binary_rule_bazel.bzl create mode 100644 python/private/common/py_library_rule_bazel.bzl create mode 100644 python/private/common/py_runtime_rule.bzl create mode 100644 python/private/common/py_test_rule_bazel.bzl diff --git a/python/private/common/py_binary_rule_bazel.bzl b/python/private/common/py_binary_rule_bazel.bzl new file mode 100644 index 0000000000..7858411963 --- /dev/null +++ b/python/private/common/py_binary_rule_bazel.bzl @@ -0,0 +1,6 @@ +"""Stub file for Bazel docs to link to. + +The Bazel docs link to this file, but the implementation was moved. + +Please see: https://rules-python.readthedocs.io/en/latest/api/rules_python/python/defs.html#py_binary +""" diff --git a/python/private/common/py_library_rule_bazel.bzl b/python/private/common/py_library_rule_bazel.bzl new file mode 100644 index 0000000000..be631c9087 --- /dev/null +++ b/python/private/common/py_library_rule_bazel.bzl @@ -0,0 +1,6 @@ +"""Stub file for Bazel docs to link to. + +The Bazel docs link to this file, but the implementation was moved. + +Please see: https://rules-python.readthedocs.io/en/latest/api/rules_python/python/defs.html#py_library +""" diff --git a/python/private/common/py_runtime_rule.bzl b/python/private/common/py_runtime_rule.bzl new file mode 100644 index 0000000000..cadb48c704 --- /dev/null +++ b/python/private/common/py_runtime_rule.bzl @@ -0,0 +1,6 @@ +"""Stub file for Bazel docs to link to. + +The Bazel docs link to this file, but the implementation was moved. + +Please see: https://rules-python.readthedocs.io/en/latest/api/rules_python/python/defs.html#py_runtime +""" diff --git a/python/private/common/py_test_rule_bazel.bzl b/python/private/common/py_test_rule_bazel.bzl new file mode 100644 index 0000000000..c89e3a65c4 --- /dev/null +++ b/python/private/common/py_test_rule_bazel.bzl @@ -0,0 +1,6 @@ +"""Stub file for Bazel docs to link to. + +The Bazel docs link to this file, but the implementation was moved. + +Please see: https://rules-python.readthedocs.io/en/latest/api/rules_python/python/defs.html#py_test +""" From 8f3538f3d5701bba3f6fe85e6ab4340d407e6903 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 17 Oct 2024 22:52:47 -0700 Subject: [PATCH 259/345] sphinxdocs: fix rendering of args in directives with empty doc (#2313) This fixes a bug where tag-classes/functions that didn't have a doc string, but did have arguments/attributes, would render the args/attrs immediately after the directive line, which made them get interpreter as direction options (settings that apply to the overall directive) instead of doc fields nested within the directive (separate block-level elements that get rendered). To fix, update the code to ensure there's a newline between the directive line and subsequent arg/attr lines. Also adds tests for this. --- sphinxdocs/private/proto_to_markdown.py | 16 +++++- .../proto_to_markdown_test.py | 56 +++++++++++++++++++ 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/sphinxdocs/private/proto_to_markdown.py b/sphinxdocs/private/proto_to_markdown.py index 1f0fe3143e..18fbd12ede 100644 --- a/sphinxdocs/private/proto_to_markdown.py +++ b/sphinxdocs/private/proto_to_markdown.py @@ -182,7 +182,7 @@ def _render_module_extension(self, mod_ext: stardoc_output_pb2.ModuleExtensionIn for tag in mod_ext.tag_class: tag_name = f"{mod_ext.extension_name}.{tag.tag_name}" tag_name = f"{tag.tag_name}" - self._write(":::::{bzl:tag-class} ", tag_name, "\n\n") + self._write(":::::{bzl:tag-class} ") _sort_attributes_inplace(tag.attribute) self._render_signature( @@ -192,7 +192,12 @@ def _render_module_extension(self, mod_ext: stardoc_output_pb2.ModuleExtensionIn get_default=lambda a: a.default_value, ) - self._write(tag.doc_string.strip(), "\n\n") + if doc_string := tag.doc_string.strip(): + self._write(doc_string, "\n\n") + # Ensure a newline between the directive and the doc fields, + # otherwise they get parsed as directive options instead. + if not doc_string and tag.attribute: + self.write("\n") self._render_attributes(tag.attribute) self._write(":::::\n") self._write("::::::\n") @@ -292,10 +297,15 @@ def _render_func(self, func: stardoc_output_pb2.StarlarkFunctionInfo): parameters = self._render_func_signature(func) - if doc_string := func.doc_string.strip(): + doc_string = func.doc_string.strip() + if doc_string: self._write(doc_string, "\n\n") if parameters: + # Ensure a newline between the directive and the doc fields, + # otherwise they get parsed as directive options instead. + if not doc_string: + self._write("\n") for param in parameters: self._write(f":arg {param.name}:\n") if param.default_value: diff --git a/sphinxdocs/tests/proto_to_markdown/proto_to_markdown_test.py b/sphinxdocs/tests/proto_to_markdown/proto_to_markdown_test.py index 7835d64c31..66e3224b20 100644 --- a/sphinxdocs/tests/proto_to_markdown/proto_to_markdown_test.py +++ b/sphinxdocs/tests/proto_to_markdown/proto_to_markdown_test.py @@ -209,6 +209,62 @@ def test_render_typedefs(self): self.assertIn("\n::::::::::::{bzl:typedef} Carl.ns.Alpha\n", actual) self.assertIn("\n:::::::::::::{bzl:typedef} Zeta\n", actual) + def test_render_func_no_doc_with_args(self): + proto_text = """ +file: "@repo//pkg:foo.bzl" +func_info: { + function_name: "func" + parameter: { + name: "param" + doc_string: "param_doc" + } +} +""" + actual = self._render(proto_text) + expected = """ +:::::::::::::{bzl:function} func(*param) + +:arg param: + param_doc + +::::::::::::: +""" + self.assertIn(expected, actual) + + def test_render_module_extension(self): + proto_text = """ +file: "@repo//pkg:foo.bzl" +module_extension_info: { + extension_name: "bzlmod_ext" + tag_class: { + tag_name: "bzlmod_ext_tag_a" + doc_string: "BZLMOD_EXT_TAG_A_DOC_STRING" + attribute: { + name: "attr1", + doc_string: "attr1doc" + type: STRING_LIST + } + } +} +""" + actual = self._render(proto_text) + expected = """ +:::::{bzl:tag-class} bzlmod_ext_tag_a(attr1) + +BZLMOD_EXT_TAG_A_DOC_STRING + +:attr attr1: + {type}`list[str]` + attr1doc + :::{bzl:attr-info} Info + ::: + + +::::: +:::::: +""" + self.assertIn(expected, actual) + if __name__ == "__main__": absltest.main() From e06314fbce8dfd08a9fd1428a736310d7e9c5452 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 17 Oct 2024 22:53:21 -0700 Subject: [PATCH 260/345] docs: fix rendering of python extension (#2312) The file doc string used increasing colon-counts for directives (a 3-colon directive contained a 4-colon directive), which messes up subsequent nesting later on the page. To fix, use 4 colons for the outer topic and 3 for the inner topic. --- python/extensions/python.bzl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/python/extensions/python.bzl b/python/extensions/python.bzl index 0f0da006a7..abd5080dd8 100644 --- a/python/extensions/python.bzl +++ b/python/extensions/python.bzl @@ -14,7 +14,7 @@ """Python toolchain module extensions for use with bzlmod. -:::{topic} Basic usage +::::{topic} Basic usage The simplest way to configure the toolchain with `rules_python` is as follows. @@ -27,22 +27,22 @@ python.toolchain( use_repo(python, "python_3_11") ``` -::::{seealso} +:::{seealso} For more in-depth documentation see the {obj}`python.toolchain`. -:::: ::: +:::: -:::{topic} Overrides +::::{topic} Overrides Overrides can be done at 3 different levels: * Overrides affecting all python toolchain versions on all platforms - {obj}`python.override`. * Overrides affecting a single toolchain versions on all platforms - {obj}`python.single_version_override`. * Overrides affecting a single toolchain versions on a single platforms - {obj}`python.single_version_platform_override`. -::::{seealso} +:::{seealso} The main documentation page on registering [toolchains](/toolchains). -:::: ::: +:::: """ load("//python/private:python.bzl", _python = "python") From 0c0492dfaea7eee9132c501439872e8d8e62bd4a Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Fri, 18 Oct 2024 10:51:56 -0700 Subject: [PATCH 261/345] chore: update changelog for 0.37.0 (#2311) Update the changelog for 0.37.0 --------- Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> --- CHANGELOG.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 867ce12bfb..e428fa3aa8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,21 @@ A brief description of the categories of changes: ## Unreleased -[x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/x.x.x +### Changed +- Nothing yet + +### Fixed +- Nothing yet + +### Added +- Nothing yet + +### Removed +- Nothing yet + +## [0.37.0] - 2024-10-18 + +[x.x.x]: https://github.com/bazelbuild/rules_python/releases/tag/0.37.0 ### Changed * **BREAKING** `py_library` no longer puts its source files or generated pyc From 15345b8eeb549bc4a22195fa2f861ba28b339e1b Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 20 Oct 2024 16:08:39 -0700 Subject: [PATCH 262/345] docs: give user-friendly permalinks in changelog (#2315) The changelog header text doesn't turn into nice linkable ids. e.g. the "0.37.0" header is simply "id1" (and similar for all the other headers). To fix, use block attributes (made possible by the MyST attrs_block extension) to give them ids manually. The ids start with "v" and use dashes because a dotted number isn't accepted as a valid id. It was a bit tedious to update all the headers with ids, so I only did it for the last few releases. --- CHANGELOG.md | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e428fa3aa8..1994af2a62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,24 +20,33 @@ A brief description of the categories of changes: * Particular sub-systems are identified using parentheses, e.g. `(bzlmod)` or `(docs)`. +{#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 +{#v0-0-0-fixed} ### Fixed - Nothing yet +{#v0-0-0-added} ### Added - Nothing yet +{#v0-0-0-removed} ### Removed - Nothing yet +{#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 +63,7 @@ A brief description of the categories of changes: {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 +94,7 @@ A brief description of the categories of changes: 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 +118,7 @@ A brief description of the categories of changes: [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 +126,12 @@ A brief description of the categories of changes: * (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 +149,7 @@ A brief description of the categories of changes: 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 +176,7 @@ A brief description of the categories of changes: * (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 +198,18 @@ A brief description of the categories of changes: * (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 +223,7 @@ A brief description of the categories of changes: 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 +265,7 @@ A brief description of the categories of changes: 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 +289,12 @@ A brief description of the categories of changes: [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 +306,7 @@ A brief description of the categories of changes: 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 +337,7 @@ A brief description of the categories of changes: * (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 +345,16 @@ A brief description of the categories of changes: 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 +362,22 @@ A brief description of the categories of changes: 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 +406,7 @@ A brief description of the categories of changes: `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 +439,7 @@ A brief description of the categories of changes: * (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 +493,12 @@ A brief description of the categories of changes: [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 +506,12 @@ A brief description of the categories of changes: [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 From 0c907bde3d1b6bd49d643fb85c6f489c3205d55a Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 20 Oct 2024 17:30:20 -0700 Subject: [PATCH 263/345] ci: upgrade to rbe_ubuntu2004 (#2316) This is per https://github.com/bazelbuild/rules_python/pull/2293#issuecomment-2407749777 From what I can tell ubuntu1604 is very old and not well supported. --- .bazelci/presubmit.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 631ad864f7..d7f2f7a97f 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -177,7 +177,7 @@ tasks: <<: *minimum_supported_version <<: *reusable_config name: "RBE: Ubuntu, minimum Bazel" - platform: rbe_ubuntu1604 + platform: rbe_ubuntu2004 build_flags: # BazelCI sets --action_env=BAZEL_DO_NOT_DETECT_CPP_TOOLCHAIN=1, # which prevents cc toolchain autodetection from working correctly @@ -195,7 +195,7 @@ tasks: 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" From 787f3cb081c34a304cb5b3f61db96ce40a14a5d6 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 20 Oct 2024 17:39:12 -0700 Subject: [PATCH 264/345] chore: set 7.x in bazelversion (#2317) This just upgrades what Bazel version we run by default during development. --- .bazelversion | 2 +- version.bzl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.bazelversion b/.bazelversion index a3fcc7121b..35907cd9ca 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -7.1.0 +7.x diff --git a/version.bzl b/version.bzl index 5194f30073..61fb81efd4 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. From 317dab4133fe0ef1809583b73dda4f7acf2a6b9a Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 21 Oct 2024 10:34:23 +0900 Subject: [PATCH 265/345] docs: rules_python bzlmod GA and 1.0 prep (#2296) This is documenting the current state and closing the last remaining TODO items for 1.0 release. Work towards #1361. --------- Co-authored-by: Greg Roodt Co-authored-by: Richard Levasseur --- BZLMOD_SUPPORT.md | 42 +++++++++---- CONTRIBUTING.md | 7 ++- docs/getting-started.md | 35 +++++------ docs/index.md | 85 +++++++++++++++++++-------- examples/bzlmod/MODULE.bazel.lock | 4 +- gazelle/manifest/defs.bzl | 2 +- gazelle/manifest/generate/generate.go | 2 +- internal_setup.bzl | 1 - python/extensions/pip.bzl | 8 ++- python/pip.bzl | 4 ++ python/private/pypi/extension.bzl | 6 +- 11 files changed, 129 insertions(+), 67 deletions(-) diff --git a/BZLMOD_SUPPORT.md b/BZLMOD_SUPPORT.md index d3d0607511..85e28acb1a 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 user does not use `local_path_override` stanza and would define the version in 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 @@ platforms. 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/CONTRIBUTING.md b/CONTRIBUTING.md index 33b296fa64..a31781a89e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -194,8 +194,13 @@ The general process is: 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/docs/getting-started.md b/docs/getting-started.md index 45d1962ad8..9f52243fd1 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 @@ bazel_dep(name = "rules_python", version = "0.0.0") 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 @@ using Bzlmod. Here is a simplified setup to download the prebuilt runtimes. ```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_register_toolchains( 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 @@ py_binary( 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 c06c31ed44..378aac2faa 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 ` 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 ` 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 +` 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 @@ appropriate `load()` statements and rewrite uses of `native.py_*`. buildifier --lint=fix --warnings=native-py ``` -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 ` for any behaviour differences between +`bzlmod` and `WORKSPACE`. + ```{toctree} :hidden: diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 8c66a1318f..8cda22c3ae 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1392,7 +1392,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "iikkSIkMsBiM/vadkEf9xEoVbaxZqrkUg08hiHr/LKk=", + "bzlTransitiveDigest": "Okeg+CvZ5figeuuknTrCNwQR1dUzHr1+YvojOpIGXEI=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6299,7 +6299,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "WPfU9gogl29lCI8A/N2aYn7RAhsCpZikVU1Hw7nMtAc=", + "bzlTransitiveDigest": "dF4Tc81oqhFbL+/QjHfkMmWICMXhiduPI6eIB5d9VJY=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/gazelle/manifest/defs.bzl b/gazelle/manifest/defs.bzl index eacf1c18cf..3a65bffec4 100644 --- a/gazelle/manifest/defs.bzl +++ b/gazelle/manifest/defs.bzl @@ -39,7 +39,7 @@ def gazelle_python_manifest( 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 19ca08a2d6..27cf2a21d8 100644 --- a/gazelle/manifest/generate/generate.go +++ b/gazelle/manifest/generate/generate.go @@ -55,7 +55,7 @@ func main() { &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/internal_setup.bzl b/internal_setup.bzl index b3dc326444..b28c0e28b7 100644 --- a/internal_setup.bzl +++ b/internal_setup.bzl @@ -43,7 +43,6 @@ def rules_python_internal_setup(): 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() diff --git a/python/extensions/pip.bzl b/python/extensions/pip.bzl index e9d47263d5..62a51c67ea 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/pip.bzl b/python/pip.bzl index a1a67200b1..44ee69d65b 100644 --- a/python/pip.bzl +++ b/python/pip.bzl @@ -17,6 +17,10 @@ This contains a set of rules that are used to support inclusion of third-party 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/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 36fb20e030..6f8ca587c1 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -764,8 +764,7 @@ the BUILD files for wheels. 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. +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. """, @@ -814,8 +813,7 @@ the BUILD files for wheels. ), 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. """, From 6d108c49a198d851873e35a70d8e7518d568ae75 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:33:18 +0900 Subject: [PATCH 266/345] test(bzlmod): refactor pip_parse to make it more testable (#2314) This PR introduces a new `parse_modules` function in the `pypi/extension.bzl` code to mimic the structure of the `python` extension and to make it easier to write unit tests against the extension itself. I have also written a few unit tests to verify the generic structure. Work towards #2268. --- examples/bzlmod/MODULE.bazel.lock | 1820 ++++++++++---------- python/private/pypi/extension.bzl | 337 ++-- python/private/pypi/parse_requirements.bzl | 3 +- tests/pypi/extension/BUILD.bazel | 17 + tests/pypi/extension/extension_tests.bzl | 248 +++ 5 files changed, 1395 insertions(+), 1030 deletions(-) create mode 100644 tests/pypi/extension/BUILD.bazel create mode 100644 tests/pypi/extension/extension_tests.bzl diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 8cda22c3ae..681a701c34 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1392,7 +1392,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "Okeg+CvZ5figeuuknTrCNwQR1dUzHr1+YvojOpIGXEI=", + "bzlTransitiveDigest": "KZzbwT5y7SPbM+MgbQWr309EUGjGXvXvQ4/FMn+fEGE=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -1414,7 +1414,7 @@ "RULES_PYTHON_REPO_DEBUG_VERBOSITY": null }, "generatedRepoSpecs": { - "pip_39_zipp_sdist_0145e43d": { + "pip_39_snowballstemmer_py2_none_any_c8e1716e": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -1432,13 +1432,13 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "zipp-3.20.0.tar.gz", + "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": "zipp==3.20.0 ;python_version < '3.10'", - "sha256": "0145e43d89664cfe1a2e533adc75adafed82fe2da404b4bbb6b026c0157bdb31", + "requirement": "snowballstemmer==2.2.0", + "sha256": "c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", "urls": [ - "https://files.pythonhosted.org/packages/0e/af/9f2de5bd32549a1b705af7a7c054af3878816a1267cb389c03cc4f342a51/zipp-3.20.0.tar.gz" + "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl" ] } }, @@ -1470,7 +1470,7 @@ ] } }, - "pip_39_snowballstemmer_py2_none_any_c8e1716e": { + "pip_39_zipp_sdist_0145e43d": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -1488,13 +1488,13 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "snowballstemmer-2.2.0-py2.py3-none-any.whl", + "filename": "zipp-3.20.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "snowballstemmer==2.2.0", - "sha256": "c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", + "requirement": "zipp==3.20.0 ;python_version < '3.10'", + "sha256": "0145e43d89664cfe1a2e533adc75adafed82fe2da404b4bbb6b026c0157bdb31", "urls": [ - "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/0e/af/9f2de5bd32549a1b705af7a7c054af3878816a1267cb389c03cc4f342a51/zipp-3.20.0.tar.gz" ] } }, @@ -1526,7 +1526,7 @@ ] } }, - "pip_310_sphinx": { + "pip_310_docutils": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -1542,21 +1542,12 @@ "--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" + "requirement": "docutils==0.20.1 --hash=sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 --hash=sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b" } }, - "pip_310_docutils": { + "pip_310_sphinx": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -1572,9 +1563,18 @@ "--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": "docutils==0.20.1 --hash=sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 --hash=sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b" + "requirement": "sphinx==7.2.6 --hash=sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560 --hash=sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5" } }, "pip_39_tomlkit_py3_none_any_07de26b0": { @@ -1642,34 +1642,6 @@ ] } }, - "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", @@ -1700,7 +1672,7 @@ "requirement": "sphinxcontrib-serializinghtml==1.1.9 --hash=sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54 --hash=sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1" } }, - "pip_39_wrapt_cp39_cp39_manylinux_2_5_x86_64_40e7bc81": { + "pip_39_s3cmd_sdist_966b0a49": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -1718,13 +1690,13 @@ "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", + "filename": "s3cmd-2.1.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "wrapt==1.14.1", - "sha256": "40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b", + "requirement": "s3cmd==2.1.0", + "sha256": "966b0a494a916fc3b4324de38f089c86c70ee90e8e1cae6d59102103a4c0cc03", "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" + "https://files.pythonhosted.org/packages/c7/eb/5143fe1884af2303cb7b23f453e5c9f337af46c2281581fc40ab5322dee4/s3cmd-2.1.0.tar.gz" ] } }, @@ -1756,6 +1728,34 @@ ] } }, + "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_310_idna": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -1777,6 +1777,27 @@ "requirement": "idna==2.10 --hash=sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6 --hash=sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" } }, + "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_lazy_object_proxy_sdist_78247b6d": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -1805,27 +1826,6 @@ ] } }, - "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", @@ -1854,7 +1854,7 @@ ] } }, - "pip_39_pyyaml_cp39_cp39_macosx_10_9_x86_64_9eb6caa9": { + "pip_39_markupsafe_cp39_cp39_manylinux_2_17_x86_64_05fb2117": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -1872,17 +1872,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", + "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": "pyyaml==6.0.1", - "sha256": "9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", + "requirement": "markupsafe==2.1.3", + "sha256": "05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", "urls": [ - "https://files.pythonhosted.org/packages/57/c5/5d09b66b41d549914802f482a2118d925d876dc2a35b2d127694c1345c34/PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl" + "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_markupsafe_cp39_cp39_manylinux_2_17_x86_64_05fb2117": { + "pip_39_pyyaml_cp39_cp39_macosx_10_9_x86_64_9eb6caa9": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -1900,13 +1900,13 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "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": "markupsafe==2.1.3", - "sha256": "05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", + "requirement": "pyyaml==6.0.1", + "sha256": "9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", "urls": [ - "https://files.pythonhosted.org/packages/de/63/cb7e71984e9159ec5f45b5e81e896c8bdd0e45fe3fc6ce02ab497f0d790e/MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "https://files.pythonhosted.org/packages/57/c5/5d09b66b41d549914802f482a2118d925d876dc2a35b2d127694c1345c34/PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl" ] } }, @@ -2059,6 +2059,33 @@ ] } }, + "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_win_amd64_510c9dee": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -2087,33 +2114,6 @@ ] } }, - "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", @@ -2277,7 +2277,7 @@ ] } }, - "pip_39_websockets_cp39_cp39_musllinux_1_1_aarch64_1fdf26fa": { + "pip_39_sphinxcontrib_qthelp_sdist_62b9d1a1": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2295,17 +2295,26 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", + "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": "websockets==11.0.3", - "sha256": "1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7", + "requirement": "sphinxcontrib-qthelp==1.0.6", + "sha256": "62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d", "urls": [ - "https://files.pythonhosted.org/packages/c4/f5/15998b164c183af0513bba744b51ecb08d396ff86c0db3b55d62624d1f15/websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl" + "https://files.pythonhosted.org/packages/4f/a2/53129fc967ac8402d5e4e83e23c959c3f7a07362ec154bdb2e197d8cc270/sphinxcontrib_qthelp-1.0.6.tar.gz" ] } }, - "pip_39_sphinxcontrib_qthelp_sdist_62b9d1a1": { + "pip_39_websockets_cp39_cp39_musllinux_1_1_aarch64_1fdf26fa": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2323,25 +2332,37 @@ "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", + "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": "sphinxcontrib-qthelp==1.0.6", - "sha256": "62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d", + "requirement": "websockets==11.0.3", + "sha256": "1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7", "urls": [ - "https://files.pythonhosted.org/packages/4f/a2/53129fc967ac8402d5e4e83e23c959c3f7a07362ec154bdb2e197d8cc270/sphinxcontrib_qthelp-1.0.6.tar.gz" + "https://files.pythonhosted.org/packages/c4/f5/15998b164c183af0513bba744b51ecb08d396ff86c0db3b55d62624d1f15/websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl" ] } }, + "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_39_setuptools_sdist_a7620757": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -2370,27 +2391,6 @@ ] } }, - "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", @@ -2412,7 +2412,7 @@ "requirement": "python-magic==0.4.27 --hash=sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b --hash=sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3" } }, - "pip_39_mccabe_sdist_348e0240": { + "pip_39_chardet_sdist_0d6f53a1": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2430,17 +2430,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "mccabe-0.7.0.tar.gz", + "filename": "chardet-4.0.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "mccabe==0.7.0", - "sha256": "348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "requirement": "chardet==4.0.0", + "sha256": "0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", "urls": [ - "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz" + "https://files.pythonhosted.org/packages/ee/2d/9cdc2b527e127b4c9db64b86647d567985940ac3698eeabc7ffaccb4ea61/chardet-4.0.0.tar.gz" ] } }, - "pip_39_chardet_sdist_0d6f53a1": { + "pip_39_mccabe_sdist_348e0240": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2458,13 +2458,13 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "chardet-4.0.0.tar.gz", + "filename": "mccabe-0.7.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "chardet==4.0.0", - "sha256": "0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", + "requirement": "mccabe==0.7.0", + "sha256": "348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", "urls": [ - "https://files.pythonhosted.org/packages/ee/2d/9cdc2b527e127b4c9db64b86647d567985940ac3698eeabc7ffaccb4ea61/chardet-4.0.0.tar.gz" + "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz" ] } }, @@ -2505,6 +2505,27 @@ ] } }, + "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_docutils_sdist_f08a4e27": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -2533,7 +2554,7 @@ ] } }, - "pip_310_tabulate": { + "pip_310_lazy_object_proxy": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2551,7 +2572,7 @@ ], "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" + "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_packaging_py3_none_any_8c491190": { @@ -2582,27 +2603,6 @@ ] } }, - "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", @@ -2682,35 +2682,6 @@ "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", @@ -2739,10 +2710,11 @@ ] } }, - "pip_39_idna_py2_none_any_b97d804b": { + "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" @@ -2757,17 +2729,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "idna-2.10-py2.py3-none-any.whl", + "filename": "wheel-0.40.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "idna==2.10", - "sha256": "b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0", + "requirement": "wheel==0.40.0", + "sha256": "cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873", "urls": [ - "https://files.pythonhosted.org/packages/a2/38/928ddce2273eaa564f6f50de919327bf3a00f091b5baba8dfa9460f3a8a8/idna-2.10-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/fc/ef/0335f7217dd1e8096a9e8383e1d472aa14717878ffe07c4772e68b6e8735/wheel-0.40.0.tar.gz" ] } }, - "pip_39_pylint_py3_none_any_349c8cd3": { + "pip_39_idna_py2_none_any_b97d804b": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2785,13 +2757,13 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "pylint-2.15.9-py3-none-any.whl", + "filename": "idna-2.10-py2.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", + "requirement": "idna==2.10", + "sha256": "b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0", "urls": [ - "https://files.pythonhosted.org/packages/7d/df/0e50d5640ed4c6a492cdc6df0c281afee3f85d98209e7ec7b31243838b40/pylint-2.15.9-py3-none-any.whl" + "https://files.pythonhosted.org/packages/a2/38/928ddce2273eaa564f6f50de919327bf3a00f091b5baba8dfa9460f3a8a8/idna-2.10-py2.py3-none-any.whl" ] } }, @@ -2816,7 +2788,7 @@ "requirement": "babel==2.13.1 --hash=sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900 --hash=sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed" } }, - "pip_39_jinja2_py3_none_any_bc5dd2ab": { + "pip_39_pylint_py3_none_any_349c8cd3": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2834,16 +2806,26 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "jinja2-3.1.4-py3-none-any.whl", + "filename": "pylint-2.15.9-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", + "requirement": "pylint==2.15.9", + "sha256": "349c8cd36aede4d50a0754a8c0218b43323d13d5d88f4b2952ddfe3e169681eb", "urls": [ - "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl" + "https://files.pythonhosted.org/packages/7d/df/0e50d5640ed4c6a492cdc6df0c281afee3f85d98209e7ec7b31243838b40/pylint-2.15.9-py3-none-any.whl" ] } }, + "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_colorama_sdist_08695f5c": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -2872,17 +2854,7 @@ ] } }, - "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": { + "pip_39_jinja2_py3_none_any_bc5dd2ab": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2900,13 +2872,13 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "pathspec-0.10.3-py3-none-any.whl", + "filename": "jinja2-3.1.4-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", + "requirement": "jinja2==3.1.4", + "sha256": "bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d", "urls": [ - "https://files.pythonhosted.org/packages/3c/29/c07c3a976dbe37c56e381e058c11e8738cb3a0416fc842a310461f8bb695/pathspec-0.10.3-py3-none-any.whl" + "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl" ] } }, @@ -2931,6 +2903,34 @@ "requirement": "yamllint==1.32.0 --hash=sha256:d01dde008c65de5b235188ab3110bebc59d18e5c65fc8a58267cd211cd9df34a --hash=sha256:d97a66e48da820829d96077d76b8dfbe6c6140f106e558dae87e81ac4e6b30b7" } }, + "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_39_markupsafe_sdist_af598ed3": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -3148,7 +3148,7 @@ ] } }, - "pip_39_wrapt_cp39_cp39_win_amd64_dee60e1d": { + "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": { @@ -3166,17 +3166,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "wrapt-1.14.1-cp39-cp39-win_amd64.whl", + "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": "wrapt==1.14.1", - "sha256": "dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb", + "requirement": "lazy-object-proxy==1.10.0", + "sha256": "217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424", "urls": [ - "https://files.pythonhosted.org/packages/5b/02/5ac7ea3b6722c84a2882d349ac581a9711b4047fe7a58475903832caa295/wrapt-1.14.1-cp39-cp39-win_amd64.whl" + "https://files.pythonhosted.org/packages/d4/f8/d2d0d5caadf41c2d1fc9044dfc0e10d2831fb4ab6a077e68d25ea5bbff3b/lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl" ] } }, - "pip_39_lazy_object_proxy_cp39_cp39_musllinux_1_1_aarch64_21713819": { + "pip_39_wrapt_cp39_cp39_win_amd64_dee60e1d": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3194,13 +3194,13 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", + "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": "lazy-object-proxy==1.10.0", - "sha256": "217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424", + "requirement": "wrapt==1.14.1", + "sha256": "dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb", "urls": [ - "https://files.pythonhosted.org/packages/d4/f8/d2d0d5caadf41c2d1fc9044dfc0e10d2831fb4ab6a077e68d25ea5bbff3b/lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl" + "https://files.pythonhosted.org/packages/5b/02/5ac7ea3b6722c84a2882d349ac581a9711b4047fe7a58475903832caa295/wrapt-1.14.1-cp39-cp39-win_amd64.whl" ] } }, @@ -3458,7 +3458,7 @@ ] } }, - "pip_39_s3cmd_py2_none_any_49cd23d5": { + "pip_39_packaging_sdist_048fb0e9": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3476,17 +3476,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "s3cmd-2.1.0-py2.py3-none-any.whl", + "filename": "packaging-23.2.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "s3cmd==2.1.0", - "sha256": "49cd23d516b17974b22b611a95ce4d93fe326feaa07320bd1d234fed68cbccfa", + "requirement": "packaging==23.2", + "sha256": "048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", "urls": [ - "https://files.pythonhosted.org/packages/26/44/19e08f69b2169003f7307565f19449d997895251c6a6566ce21d5d636435/s3cmd-2.1.0-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/fb/2b/9b9c33ffed44ee921d0967086d653047286054117d584f1b1a7c22ceaf7b/packaging-23.2.tar.gz" ] } }, - "pip_39_packaging_sdist_048fb0e9": { + "pip_39_s3cmd_py2_none_any_49cd23d5": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3504,13 +3504,13 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "packaging-23.2.tar.gz", + "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": "packaging==23.2", - "sha256": "048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", + "requirement": "s3cmd==2.1.0", + "sha256": "49cd23d516b17974b22b611a95ce4d93fe326feaa07320bd1d234fed68cbccfa", "urls": [ - "https://files.pythonhosted.org/packages/fb/2b/9b9c33ffed44ee921d0967086d653047286054117d584f1b1a7c22ceaf7b/packaging-23.2.tar.gz" + "https://files.pythonhosted.org/packages/26/44/19e08f69b2169003f7307565f19449d997895251c6a6566ce21d5d636435/s3cmd-2.1.0-py2.py3-none-any.whl" ] } }, @@ -3542,6 +3542,27 @@ ] } }, + "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_snowballstemmer_sdist_09b16deb": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -3570,27 +3591,6 @@ ] } }, - "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", @@ -3838,6 +3838,27 @@ "requirement": "colorama==0.4.6 --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" } }, + "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_lazy_object_proxy_cp39_cp39_manylinux_2_5_x86_64_18dd842b": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -3866,27 +3887,6 @@ ] } }, - "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", @@ -4105,6 +4105,27 @@ "requirement": "typing-extensions==4.6.3 --hash=sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26 --hash=sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5" } }, + "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_websockets_cp39_cp39_musllinux_1_1_x86_64_97b52894": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -4133,7 +4154,7 @@ ] } }, - "pip_310_isort": { + "pip_310_sphinxcontrib_qthelp": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4149,12 +4170,21 @@ "--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": "isort==5.12.0 --hash=sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504 --hash=sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6" + "requirement": "sphinxcontrib-qthelp==1.0.6 --hash=sha256:62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d --hash=sha256:bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4" } }, - "pip_39_wrapt_cp39_cp39_macosx_10_9_x86_64_3232822c": { + "pip_39_pyyaml_cp39_cp39_musllinux_1_1_x86_64_04ac92ad": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4172,17 +4202,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", + "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": "wrapt==1.14.1", - "sha256": "3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383", + "requirement": "pyyaml==6.0.1", + "sha256": "04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", "urls": [ - "https://files.pythonhosted.org/packages/d9/ab/3ba5816dd466ffd7242913708771d258569825ab76fd29d7fd85b9361311/wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl" + "https://files.pythonhosted.org/packages/40/da/a175a35cf5583580e90ac3e2a3dbca90e43011593ae62ce63f79d7b28d92/PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl" ] } }, - "pip_39_pyyaml_cp39_cp39_musllinux_1_1_x86_64_04ac92ad": { + "pip_39_sphinxcontrib_jsmath_py2_none_any_2ec2eaeb": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4200,17 +4230,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", + "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": "pyyaml==6.0.1", - "sha256": "04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", + "requirement": "sphinxcontrib-jsmath==1.0.1", + "sha256": "2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", "urls": [ - "https://files.pythonhosted.org/packages/40/da/a175a35cf5583580e90ac3e2a3dbca90e43011593ae62ce63f79d7b28d92/PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl" + "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl" ] } }, - "pip_39_sphinxcontrib_jsmath_py2_none_any_2ec2eaeb": { + "pip_39_wrapt_cp39_cp39_macosx_10_9_x86_64_3232822c": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4228,46 +4258,16 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", + "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": "sphinxcontrib-jsmath==1.0.1", - "sha256": "2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", + "requirement": "wrapt==1.14.1", + "sha256": "3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383", "urls": [ - "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/d9/ab/3ba5816dd466ffd7242913708771d258569825ab76fd29d7fd85b9361311/wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.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", @@ -4289,7 +4289,7 @@ "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": { + "pip_39_importlib_metadata_py3_none_any_66f342cc": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4307,17 +4307,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "yamllint-1.28.0.tar.gz", + "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": "yamllint==1.28.0", - "sha256": "9e3d8ddd16d0583214c5fdffe806c9344086721f107435f68bad990e5a88826b", + "requirement": "importlib-metadata==8.4.0 ;python_version < '3.10'", + "sha256": "66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1", "urls": [ - "https://files.pythonhosted.org/packages/c8/82/4cd3ec8f98d821e7cc7ef504add450623d5c86b656faf65e9b0cc46f4be6/yamllint-1.28.0.tar.gz" + "https://files.pythonhosted.org/packages/c0/14/362d31bf1076b21e1bcdcb0dc61944822ff263937b804a79231df2774d28/importlib_metadata-8.4.0-py3-none-any.whl" ] } }, - "pip_39_importlib_metadata_py3_none_any_66f342cc": { + "pip_39_yamllint_sdist_9e3d8ddd": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4335,13 +4335,13 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "importlib_metadata-8.4.0-py3-none-any.whl", + "filename": "yamllint-1.28.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": "66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1", + "requirement": "yamllint==1.28.0", + "sha256": "9e3d8ddd16d0583214c5fdffe806c9344086721f107435f68bad990e5a88826b", "urls": [ - "https://files.pythonhosted.org/packages/c0/14/362d31bf1076b21e1bcdcb0dc61944822ff263937b804a79231df2774d28/importlib_metadata-8.4.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/c8/82/4cd3ec8f98d821e7cc7ef504add450623d5c86b656faf65e9b0cc46f4be6/yamllint-1.28.0.tar.gz" ] } }, @@ -4379,53 +4379,53 @@ "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\"}]", + "alabaster": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_alabaster\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "astroid": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_astroid\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "babel": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_babel\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "certifi": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_certifi\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "chardet": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_chardet\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "colorama": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_colorama\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "dill": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_dill\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "docutils": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_docutils\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "idna": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_idna\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "imagesize": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_imagesize\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", "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\"}]" + "isort": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_isort\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "jinja2": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_jinja2\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "lazy_object_proxy": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_lazy_object_proxy\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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-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-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-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\"}]", + "markupsafe": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_markupsafe\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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-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-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-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_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-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.tar.gz\",\"repo\":\"pip_39_markupsafe_sdist_af598ed3\",\"target_platforms\":null,\"version\":\"3.9\"}]", + "mccabe": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_mccabe\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "packaging": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_packaging\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "pathspec": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pathspec\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "platformdirs": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_platformdirs\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "pygments": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pygments\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "pylint": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pylint\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "pylint_print": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pylint_print\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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\"}]", + "python_dateutil": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_python_dateutil\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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\"}]", + "python_magic": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_python_magic\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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\"}]", + "pyyaml": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pyyaml\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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-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-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-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-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.tar.gz\",\"repo\":\"pip_39_pyyaml_sdist_bfdf460b\",\"target_platforms\":null,\"version\":\"3.9\"}]", + "requests": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_requests\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "s3cmd": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_s3cmd\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "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\"}]", + "six": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_six\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "snowballstemmer": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_snowballstemmer\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "sphinx": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinx\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "sphinxcontrib_applehelp": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_applehelp\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "sphinxcontrib_devhelp": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_devhelp\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "sphinxcontrib_htmlhelp": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_htmlhelp\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "sphinxcontrib_jsmath": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_jsmath\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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\"}]", + "sphinxcontrib_qthelp": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_qthelp\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "sphinxcontrib_serializinghtml": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_serializinghtml\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "tabulate": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_tabulate\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "tomli": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_tomli\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "tomlkit": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_tomlkit\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "typing_extensions": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_typing_extensions\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "urllib3": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_urllib3\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "websockets": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_websockets\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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-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-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-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-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-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-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.tar.gz\",\"repo\":\"pip_39_websockets_sdist_88fc51d9\",\"target_platforms\":null,\"version\":\"3.9\"}]", + "wheel": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_wheel\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "wrapt": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_wrapt\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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-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-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-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-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-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\"}]", + "yamllint": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_yamllint\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "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\"}]" }, "packages": [ "alabaster", @@ -4479,16 +4479,16 @@ "groups": { "sphinx": [ "sphinx", - "sphinxcontrib-qthelp", - "sphinxcontrib-htmlhelp", - "sphinxcontrib-devhelp", "sphinxcontrib-applehelp", + "sphinxcontrib-devhelp", + "sphinxcontrib-htmlhelp", + "sphinxcontrib-qthelp", "sphinxcontrib-serializinghtml" ] } } }, - "pip_39_pyyaml_cp39_cp39_manylinux_2_17_x86_64_bc1bf292": { + "pip_39_importlib_metadata_sdist_9a547d3b": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4506,17 +4506,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "filename": "importlib_metadata-8.4.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "pyyaml==6.0.1", - "sha256": "bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", + "requirement": "importlib-metadata==8.4.0 ;python_version < '3.10'", + "sha256": "9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5", "urls": [ - "https://files.pythonhosted.org/packages/7d/39/472f2554a0f1e825bd7c5afc11c817cd7a2f3657460f7159f691fbb37c51/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "https://files.pythonhosted.org/packages/c0/bd/fa8ce65b0a7d4b6d143ec23b0f5fd3f7ab80121078c465bc02baeaab22dc/importlib_metadata-8.4.0.tar.gz" ] } }, - "pip_39_importlib_metadata_sdist_9a547d3b": { + "pip_39_pyyaml_cp39_cp39_manylinux_2_17_x86_64_bc1bf292": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4534,13 +4534,13 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "importlib_metadata-8.4.0.tar.gz", + "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": "importlib-metadata==8.4.0 ;python_version < '3.10'", - "sha256": "9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5", + "requirement": "pyyaml==6.0.1", + "sha256": "bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", "urls": [ - "https://files.pythonhosted.org/packages/c0/bd/fa8ce65b0a7d4b6d143ec23b0f5fd3f7ab80121078c465bc02baeaab22dc/importlib_metadata-8.4.0.tar.gz" + "https://files.pythonhosted.org/packages/7d/39/472f2554a0f1e825bd7c5afc11c817cd7a2f3657460f7159f691fbb37c51/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" ] } }, @@ -4572,7 +4572,7 @@ ] } }, - "pip_39_websockets_cp39_cp39_win_amd64_c792ea4e": { + "pip_39_sphinxcontrib_qthelp_py3_none_any_bf76886e": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4590,17 +4590,26 @@ "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" - ] + "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_39_sphinxcontrib_qthelp_py3_none_any_bf76886e": { + "pip_39_websockets_cp39_cp39_win_amd64_c792ea4e": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4618,22 +4627,13 @@ "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", + "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": "sphinxcontrib-qthelp==1.0.6", - "sha256": "bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4", + "requirement": "websockets==11.0.3", + "sha256": "c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e", "urls": [ - "https://files.pythonhosted.org/packages/1f/e5/1850f3f118e95581c1e30b57028ac979badee1eb29e70ee72b0241f5a185/sphinxcontrib_qthelp-1.0.6-py3-none-any.whl" + "https://files.pythonhosted.org/packages/f4/3f/65dfa50084a06ab0a05f3ca74195c2c17a1c075b8361327d831ccce0a483/websockets-11.0.3-cp39-cp39-win_amd64.whl" ] } }, @@ -4658,7 +4658,7 @@ "requirement": "python-dateutil==2.8.2 --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" } }, - "pip_310_tomli": { + "pip_310_imagesize": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4676,10 +4676,10 @@ ], "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" + "requirement": "imagesize==1.4.1 --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b --hash=sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" } }, - "pip_310_imagesize": { + "pip_310_tomli": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4697,7 +4697,7 @@ ], "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" + "requirement": "tomli==2.0.1 --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" } }, "pip_39_sphinxcontrib_jsmath_sdist_a9925e4a": { @@ -4895,6 +4895,27 @@ ] } }, + "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_urllib3_py2_none_any_34b97092": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -4951,27 +4972,6 @@ ] } }, - "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", @@ -5147,7 +5147,7 @@ ] } }, - "pip_39_wrapt_cp39_cp39_manylinux_2_17_aarch64_9cca3c2c": { + "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": { @@ -5165,17 +5165,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "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": "wrapt==1.14.1", - "sha256": "9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86", + "requirement": "lazy-object-proxy==1.10.0", + "sha256": "2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b", "urls": [ - "https://files.pythonhosted.org/packages/38/38/5b338163b3b4f1ab718306984678c3d180b85a25d72654ea4c61aa6b0968/wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "https://files.pythonhosted.org/packages/20/44/7d3b51ada1ddf873b136e2fa1d68bf3ee7b406b0bd9eeb97445932e2bfe1/lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" ] } }, - "pip_39_lazy_object_proxy_cp39_cp39_manylinux_2_17_aarch64_2297f08f": { + "pip_39_wrapt_cp39_cp39_manylinux_2_17_aarch64_9cca3c2c": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5193,13 +5193,13 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "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": "lazy-object-proxy==1.10.0", - "sha256": "2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b", + "requirement": "wrapt==1.14.1", + "sha256": "9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86", "urls": [ - "https://files.pythonhosted.org/packages/20/44/7d3b51ada1ddf873b136e2fa1d68bf3ee7b406b0bd9eeb97445932e2bfe1/lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "https://files.pythonhosted.org/packages/38/38/5b338163b3b4f1ab718306984678c3d180b85a25d72654ea4c61aa6b0968/wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" ] } }, @@ -5252,34 +5252,6 @@ ] } }, - "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", @@ -5310,6 +5282,34 @@ "requirement": "sphinxcontrib-applehelp==1.0.7 --hash=sha256:094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d --hash=sha256:39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa" } }, + "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_39_pyyaml_sdist_bfdf460b": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -5396,7 +5396,7 @@ "requirement": "pygments==2.16.1 --hash=sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692 --hash=sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29" } }, - "pip_39_tabulate_sdist_0095b12b": { + "pip_39_sphinxcontrib_serializinghtml_py3_none_any_9b36e503": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5414,17 +5414,26 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "tabulate-0.9.0.tar.gz", + "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": "tabulate==0.9.0", - "sha256": "0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", + "requirement": "sphinxcontrib-serializinghtml==1.1.9", + "sha256": "9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1", "urls": [ - "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz" + "https://files.pythonhosted.org/packages/95/d6/2e0bda62b2a808070ac922d21a950aa2cb5e4fcfb87e5ff5f86bc43a2201/sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl" ] } }, - "pip_39_sphinxcontrib_serializinghtml_py3_none_any_9b36e503": { + "pip_39_tabulate_sdist_0095b12b": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5442,22 +5451,13 @@ "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", + "filename": "tabulate-0.9.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "sphinxcontrib-serializinghtml==1.1.9", - "sha256": "9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1", + "requirement": "tabulate==0.9.0", + "sha256": "0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", "urls": [ - "https://files.pythonhosted.org/packages/95/d6/2e0bda62b2a808070ac922d21a950aa2cb5e4fcfb87e5ff5f86bc43a2201/sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl" + "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz" ] } }, @@ -5592,6 +5592,27 @@ ] } }, + "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_39_zipp_py3_none_any_58da6168": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -5620,27 +5641,6 @@ ] } }, - "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", @@ -5817,35 +5817,7 @@ ] } }, - "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": { + "pip_310_chardet": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5866,6 +5838,34 @@ "requirement": "chardet==4.0.0 --hash=sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa --hash=sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" } }, + "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_39_pyyaml_cp39_cp39_manylinux_2_17_s390x_b786eecb": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -6020,34 +6020,6 @@ ] } }, - "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", @@ -6070,7 +6042,7 @@ "requirement": "wheel==0.40.0 --hash=sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873 --hash=sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247" } }, - "pip_39_dill_py3_none_any_a07ffd23": { + "pip_39_pyyaml_cp39_cp39_macosx_11_0_arm64_c8098ddc": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6088,17 +6060,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "dill-0.3.6-py3-none-any.whl", + "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": "dill==0.3.6", - "sha256": "a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0", + "requirement": "pyyaml==6.0.1", + "sha256": "c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", "urls": [ - "https://files.pythonhosted.org/packages/be/e3/a84bf2e561beed15813080d693b4b27573262433fced9c1d1fea59e60553/dill-0.3.6-py3-none-any.whl" + "https://files.pythonhosted.org/packages/0e/88/21b2f16cb2123c1e9375f2c93486e35fdc86e63f02e274f0e99c589ef153/PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl" ] } }, - "pip_39_babel_py3_none_any_7077a498": { + "pip_39_dill_py3_none_any_a07ffd23": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6116,13 +6088,13 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "Babel-2.13.1-py3-none-any.whl", + "filename": "dill-0.3.6-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", + "requirement": "dill==0.3.6", + "sha256": "a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0", "urls": [ - "https://files.pythonhosted.org/packages/86/14/5dc2eb02b7cc87b2f95930310a2cc5229198414919a116b564832c747bc1/Babel-2.13.1-py3-none-any.whl" + "https://files.pythonhosted.org/packages/be/e3/a84bf2e561beed15813080d693b4b27573262433fced9c1d1fea59e60553/dill-0.3.6-py3-none-any.whl" ] } }, @@ -6147,6 +6119,34 @@ "requirement": "jinja2==3.1.4 --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" } }, + "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_websockets": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -6299,7 +6299,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "dF4Tc81oqhFbL+/QjHfkMmWICMXhiduPI6eIB5d9VJY=", + "bzlTransitiveDigest": "mzsyVW4M380vwEPTn/pDXFMh5gtTHsv0sbqZCE7a1SY=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", @@ -6334,7 +6334,7 @@ ] } }, - "rules_python_publish_deps_311_zipp_sdist_a7a22e05": { + "rules_python_publish_deps_311_urllib3_sdist_076907bf": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6346,17 +6346,17 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "zipp-3.11.0.tar.gz", + "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": "zipp==3.11.0", - "sha256": "a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766", + "requirement": "urllib3==1.26.14", + "sha256": "076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72", "urls": [ - "https://files.pythonhosted.org/packages/8e/b3/8b16a007184714f71157b1a71bbe632c5d66dd43bc8152b3c799b13881e1/zipp-3.11.0.tar.gz" + "https://files.pythonhosted.org/packages/c5/52/fe421fb7364aa738b3506a2d99e4f3a56e079c0a798e9f4fa5e14c60922f/urllib3-1.26.14.tar.gz" ] } }, - "rules_python_publish_deps_311_urllib3_sdist_076907bf": { + "rules_python_publish_deps_311_zipp_sdist_a7a22e05": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6368,13 +6368,13 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "urllib3-1.26.14.tar.gz", + "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": "urllib3==1.26.14", - "sha256": "076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72", + "requirement": "zipp==3.11.0", + "sha256": "a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766", "urls": [ - "https://files.pythonhosted.org/packages/c5/52/fe421fb7364aa738b3506a2d99e4f3a56e079c0a798e9f4fa5e14c60922f/urllib3-1.26.14.tar.gz" + "https://files.pythonhosted.org/packages/8e/b3/8b16a007184714f71157b1a71bbe632c5d66dd43bc8152b3c799b13881e1/zipp-3.11.0.tar.gz" ] } }, @@ -6677,7 +6677,7 @@ ] } }, - "rules_python_publish_deps_311_keyring_py3_none_any_771ed2a9": { + "rules_python_publish_deps_311_jaraco_classes_sdist_89559fa5": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6692,17 +6692,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "keyring-23.13.1-py3-none-any.whl", + "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": "keyring==23.13.1", - "sha256": "771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd", + "requirement": "jaraco-classes==3.2.3", + "sha256": "89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a", "urls": [ - "https://files.pythonhosted.org/packages/62/db/0e9a09b2b95986dcd73ac78be6ed2bd73ebe8bac65cba7add5b83eb9d899/keyring-23.13.1-py3-none-any.whl" + "https://files.pythonhosted.org/packages/bf/02/a956c9bfd2dfe60b30c065ed8e28df7fcf72b292b861dca97e951c145ef6/jaraco.classes-3.2.3.tar.gz" ] } }, - "rules_python_publish_deps_311_jaraco_classes_sdist_89559fa5": { + "rules_python_publish_deps_311_keyring_py3_none_any_771ed2a9": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6717,17 +6717,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "jaraco.classes-3.2.3.tar.gz", + "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": "jaraco-classes==3.2.3", - "sha256": "89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a", + "requirement": "keyring==23.13.1", + "sha256": "771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd", "urls": [ - "https://files.pythonhosted.org/packages/bf/02/a956c9bfd2dfe60b30c065ed8e28df7fcf72b292b861dca97e951c145ef6/jaraco.classes-3.2.3.tar.gz" + "https://files.pythonhosted.org/packages/62/db/0e9a09b2b95986dcd73ac78be6ed2bd73ebe8bac65cba7add5b83eb9d899/keyring-23.13.1-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_rich_py3_none_any_7c963f0d": { + "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": { @@ -6737,18 +6737,15 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "cp311_linux_x86_64" ], - "filename": "rich-13.2.0-py3-none-any.whl", + "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": "rich==13.2.0", - "sha256": "7c963f0d03819221e9ac561e1bc866e3f95a02248c1234daa48954e6d381c003", + "requirement": "charset-normalizer==3.0.1", + "sha256": "8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317", "urls": [ - "https://files.pythonhosted.org/packages/0e/cf/a6369a2aee266c2d7604230f083d4bd14b8f69bc69eb25b3da63b9f2f853/rich-13.2.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/df/c5/dd3a17a615775d0ffc3e12b0e47833d8b7e0a4871431dad87a3f92382a19/charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" ] } }, @@ -6774,7 +6771,7 @@ ] } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8c7fe7af": { + "rules_python_publish_deps_311_rich_py3_none_any_7c963f0d": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6784,15 +6781,18 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", + "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": "charset-normalizer==3.0.1", - "sha256": "8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317", + "requirement": "rich==13.2.0", + "sha256": "7c963f0d03819221e9ac561e1bc866e3f95a02248c1234daa48954e6d381c003", "urls": [ - "https://files.pythonhosted.org/packages/df/c5/dd3a17a615775d0ffc3e12b0e47833d8b7e0a4871431dad87a3f92382a19/charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" + "https://files.pythonhosted.org/packages/0e/cf/a6369a2aee266c2d7604230f083d4bd14b8f69bc69eb25b3da63b9f2f853/rich-13.2.0-py3-none-any.whl" ] } }, @@ -6840,45 +6840,45 @@ ] } }, - "rules_python_publish_deps_311_idna_sdist_12f65c9b": { + "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_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" ], - "filename": "idna-3.10.tar.gz", + "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": "idna==3.10", - "sha256": "12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", + "requirement": "cryptography==42.0.4", + "sha256": "887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929", "urls": [ - "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz" + "https://files.pythonhosted.org/packages/da/56/1b2c8aa8e62bfb568022b68d77ebd2bd9afddea37898350fbfe008dcefa7/cryptography-42.0.4-cp39-abi3-musllinux_1_2_aarch64.whl" ] } }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_887623fe": { + "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_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": "cryptography-42.0.4-cp39-abi3-musllinux_1_2_aarch64.whl", + "filename": "idna-3.10.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": "887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929", + "requirement": "idna==3.10", + "sha256": "12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", "urls": [ - "https://files.pythonhosted.org/packages/da/56/1b2c8aa8e62bfb568022b68d77ebd2bd9afddea37898350fbfe008dcefa7/cryptography-42.0.4-cp39-abi3-musllinux_1_2_aarch64.whl" + "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz" ] } }, @@ -7045,7 +7045,7 @@ ] } }, - "rules_python_publish_deps_311_idna_py3_none_any_90b77e79": { + "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": { @@ -7057,17 +7057,17 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "idna-3.4-py3-none-any.whl", + "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": "idna==3.4", - "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2", + "requirement": "cryptography==42.0.4", + "sha256": "44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764", "urls": [ - "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl" + "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_cryptography_cp39_abi3_manylinux_2_28_x86_64_44a64043": { + "rules_python_publish_deps_311_idna_py3_none_any_90b77e79": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7079,13 +7079,13 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "cryptography-42.0.4-cp39-abi3-manylinux_2_28_x86_64.whl", + "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": "cryptography==42.0.4", - "sha256": "44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764", + "requirement": "idna==3.4", + "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2", "urls": [ - "https://files.pythonhosted.org/packages/7e/45/81f378eb85aab14b229c1032ba3694eff85a3d75b35092c3e71abd2d34f6/cryptography-42.0.4-cp39-abi3-manylinux_2_28_x86_64.whl" + "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl" ] } }, @@ -7153,46 +7153,46 @@ ] } }, - "rules_python_publish_deps_311_twine_sdist_9e102ef5": { + "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_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", + "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": "twine==4.0.2", - "sha256": "9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8", + "requirement": "pywin32-ctypes==0.2.0", + "sha256": "9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98", "urls": [ - "https://files.pythonhosted.org/packages/b7/1a/a7884359429d801cd63c2c5512ad0a337a509994b0e42d9696d4778d71f6/twine-4.0.2.tar.gz" + "https://files.pythonhosted.org/packages/9e/4b/3ab2720f1fa4b4bc924ef1932b842edf10007e4547ea8157b0b9fc78599a/pywin32_ctypes-0.2.0-py2.py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_pywin32_ctypes_py2_none_any_9dc2d991": { + "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": "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", + "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": "pywin32-ctypes==0.2.0", - "sha256": "9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98", + "requirement": "twine==4.0.2", + "sha256": "9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8", "urls": [ - "https://files.pythonhosted.org/packages/9e/4b/3ab2720f1fa4b4bc924ef1932b842edf10007e4547ea8157b0b9fc78599a/pywin32_ctypes-0.2.0-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/b7/1a/a7884359429d801cd63c2c5512ad0a337a509994b0e42d9696d4778d71f6/twine-4.0.2.tar.gz" ] } }, @@ -7263,6 +7263,26 @@ ] } }, + "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_cryptography_sdist_831a4b37": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -7285,7 +7305,7 @@ ] } }, - "rules_python_publish_deps_311_charset_normalizer_sdist_f30c3cb3": { + "rules_python_publish_deps_311_certifi_py3_none_any_922820b5": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7295,17 +7315,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "charset-normalizer-3.3.2.tar.gz", + "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": "charset-normalizer==3.3.2", - "sha256": "f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "requirement": "certifi==2024.8.30", + "sha256": "922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", "urls": [ - "https://files.pythonhosted.org/packages/63/09/c1bc53dab74b1816a00d8d030de5bf98f724c52c1635e07681d312f20be8/charset-normalizer-3.3.2.tar.gz" + "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_certifi_py3_none_any_922820b5": { + "rules_python_publish_deps_311_certifi_sdist_bec941d2": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7315,33 +7335,35 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "certifi-2024.8.30-py3-none-any.whl", + "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": "922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "sha256": "bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", "urls": [ - "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl" + "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz" ] } }, - "rules_python_publish_deps_311_zipp_sdist_bf1dcf64": { + "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_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" ], - "filename": "zipp-3.19.2.tar.gz", + "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": "zipp==3.19.2", - "sha256": "bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19", + "requirement": "cryptography==42.0.4", + "sha256": "ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0", "urls": [ - "https://files.pythonhosted.org/packages/d3/20/b48f58857d98dcb78f9e30ed2cfe533025e2e9827bbd36ea0a64cc00cbc1/zipp-3.19.2.tar.gz" + "https://files.pythonhosted.org/packages/a2/8e/dac70232d4231c53448e29aa4b768cf82d891fcfd6e0caa7ace242da8c9b/cryptography-42.0.4-cp39-abi3-musllinux_1_2_x86_64.whl" ] } }, @@ -7370,7 +7392,7 @@ ] } }, - "rules_python_publish_deps_311_certifi_sdist_bec941d2": { + "rules_python_publish_deps_311_zipp_sdist_bf1dcf64": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7380,17 +7402,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "certifi-2024.8.30.tar.gz", + "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": "certifi==2024.8.30", - "sha256": "bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", + "requirement": "zipp==3.19.2", + "sha256": "bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19", "urls": [ - "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz" + "https://files.pythonhosted.org/packages/d3/20/b48f58857d98dcb78f9e30ed2cfe533025e2e9827bbd36ea0a64cc00cbc1/zipp-3.19.2.tar.gz" ] } }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_ce8613be": { + "rules_python_publish_deps_311_more_itertools_py3_none_any_250e83d7": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7400,19 +7422,22 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "cryptography-42.0.4-cp39-abi3-musllinux_1_2_x86_64.whl", + "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": "cryptography==42.0.4", - "sha256": "ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0", + "requirement": "more-itertools==9.0.0", + "sha256": "250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41", "urls": [ - "https://files.pythonhosted.org/packages/a2/8e/dac70232d4231c53448e29aa4b768cf82d891fcfd6e0caa7ace242da8c9b/cryptography-42.0.4-cp39-abi3-musllinux_1_2_x86_64.whl" + "https://files.pythonhosted.org/packages/5d/87/1ec3fcc09d2c04b977eabf8a1083222f82eaa2f46d5a4f85f403bf8e7b30/more_itertools-9.0.0-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_more_itertools_py3_none_any_250e83d7": { + "rules_python_publish_deps_311_keyring_sdist_ba2e15a9": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7427,13 +7452,13 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "more_itertools-9.0.0-py3-none-any.whl", + "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": "more-itertools==9.0.0", - "sha256": "250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41", + "requirement": "keyring==23.13.1", + "sha256": "ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678", "urls": [ - "https://files.pythonhosted.org/packages/5d/87/1ec3fcc09d2c04b977eabf8a1083222f82eaa2f46d5a4f85f403bf8e7b30/more_itertools-9.0.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/55/fe/282f4c205add8e8bb3a1635cbbac59d6def2e0891b145aa553a0e40dd2d0/keyring-23.13.1.tar.gz" ] } }, @@ -7462,28 +7487,23 @@ ] } }, - "rules_python_publish_deps_311_keyring_sdist_ba2e15a9": { + "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_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", + "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": "keyring==23.13.1", - "sha256": "ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678", + "requirement": "charset-normalizer==3.3.2", + "sha256": "549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", "urls": [ - "https://files.pythonhosted.org/packages/55/fe/282f4c205add8e8bb3a1635cbbac59d6def2e0891b145aa553a0e40dd2d0/keyring-23.13.1.tar.gz" + "https://files.pythonhosted.org/packages/dd/51/68b61b90b24ca35495956b718f35a9756ef7d3dd4b3c1508056fa98d1a1b/charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl" ] } }, @@ -7512,26 +7532,6 @@ ] } }, - "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", @@ -7741,7 +7741,7 @@ ] } }, - "rules_python_publish_deps_311_webencodings_sdist_b36a1c24": { + "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": { @@ -7751,22 +7751,19 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "cp311_linux_x86_64" ], - "filename": "webencodings-0.5.1.tar.gz", + "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": "webencodings==0.5.1", - "sha256": "b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", + "requirement": "charset-normalizer==3.0.1", + "sha256": "4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b", "urls": [ - "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz" + "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_charset_normalizer_cp311_cp311_musllinux_1_1_s390x_4a8fcf28": { + "rules_python_publish_deps_311_webencodings_sdist_b36a1c24": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7776,15 +7773,18 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl", + "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": "charset-normalizer==3.0.1", - "sha256": "4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b", + "requirement": "webencodings==0.5.1", + "sha256": "b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", "urls": [ - "https://files.pythonhosted.org/packages/80/54/183163f9910936e57a60ee618f4f5cc91c2f8333ee2d4ebc6c50f6c8684d/charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl" + "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz" ] } }, @@ -7813,45 +7813,45 @@ ] } }, - "rules_python_publish_deps_311_urllib3_py2_none_any_37a03444": { + "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_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" ], - "filename": "urllib3-1.26.19-py2.py3-none-any.whl", + "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": "urllib3==1.26.19", - "sha256": "37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3", + "requirement": "charset-normalizer==3.0.1", + "sha256": "79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603", "urls": [ - "https://files.pythonhosted.org/packages/ae/6a/99eaaeae8becaa17a29aeb334a18e5d582d873b6f084c11f02581b8d7f7f/urllib3-1.26.19-py2.py3-none-any.whl" + "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_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_79909e27": { + "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_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": "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "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": "charset-normalizer==3.0.1", - "sha256": "79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603", + "requirement": "urllib3==1.26.19", + "sha256": "37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3", "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" + "https://files.pythonhosted.org/packages/ae/6a/99eaaeae8becaa17a29aeb334a18e5d582d873b6f084c11f02581b8d7f7f/urllib3-1.26.19-py2.py3-none-any.whl" ] } }, @@ -7924,46 +7924,46 @@ ] } }, - "rules_python_publish_deps_311_rich_sdist_f1a00cdd": { + "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_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", + "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": "rich==13.2.0", - "sha256": "f1a00cdd3eebf999a15d85ec498bfe0b1a77efe9b34f645768a54132ef444ac5", + "requirement": "pywin32-ctypes==0.2.0", + "sha256": "24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942", "urls": [ - "https://files.pythonhosted.org/packages/9e/5e/c3dc3ea32e2c14bfe46e48de954dd175bff76bcc549dd300acb9689521ae/rich-13.2.0.tar.gz" + "https://files.pythonhosted.org/packages/7a/7d/0dbc4c99379452a819b0fb075a0ffbb98611df6b6d59f54db67367af5bc0/pywin32-ctypes-0.2.0.tar.gz" ] } }, - "rules_python_publish_deps_311_pywin32_ctypes_sdist_24ffc3b3": { + "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": "pywin32-ctypes-0.2.0.tar.gz", + "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": "pywin32-ctypes==0.2.0", - "sha256": "24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942", + "requirement": "rich==13.2.0", + "sha256": "f1a00cdd3eebf999a15d85ec498bfe0b1a77efe9b34f645768a54132ef444ac5", "urls": [ - "https://files.pythonhosted.org/packages/7a/7d/0dbc4c99379452a819b0fb075a0ffbb98611df6b6d59f54db67367af5bc0/pywin32-ctypes-0.2.0.tar.gz" + "https://files.pythonhosted.org/packages/9e/5e/c3dc3ea32e2c14bfe46e48de954dd175bff76bcc549dd300acb9689521ae/rich-13.2.0.tar.gz" ] } }, @@ -8039,29 +8039,27 @@ ] } }, - "rules_python_publish_deps_311_docutils_py3_none_any_5e1de4d8": { + "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_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": "docutils-0.19-py3-none-any.whl", + "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": "docutils==0.19", - "sha256": "5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc", + "requirement": "charset-normalizer==3.3.2", + "sha256": "663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", "urls": [ - "https://files.pythonhosted.org/packages/93/69/e391bd51bc08ed9141ecd899a0ddb61ab6465309f1eb470905c0c8868081/docutils-0.19-py3-none-any.whl" + "https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl" ] } }, - "rules_python_publish_deps_311_docutils_sdist_33995a67": { + "rules_python_publish_deps_311_docutils_py3_none_any_5e1de4d8": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -8073,13 +8071,13 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "docutils-0.19.tar.gz", + "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": "33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6", + "sha256": "5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc", "urls": [ - "https://files.pythonhosted.org/packages/6b/5c/330ea8d383eb2ce973df34d1239b3b21e91cd8c865d21ff82902d952f91f/docutils-0.19.tar.gz" + "https://files.pythonhosted.org/packages/93/69/e391bd51bc08ed9141ecd899a0ddb61ab6465309f1eb470905c0c8868081/docutils-0.19-py3-none-any.whl" ] } }, @@ -8103,23 +8101,25 @@ ] } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_66394663": { + "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_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" ], - "filename": "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", + "filename": "docutils-0.19.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": "663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "requirement": "docutils==0.19", + "sha256": "33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6", "urls": [ - "https://files.pythonhosted.org/packages/57/ec/80c8d48ac8b1741d5b963797b7c0c869335619e13d4744ca2f67fc11c6fc/charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl" + "https://files.pythonhosted.org/packages/6b/5c/330ea8d383eb2ce973df34d1239b3b21e91cd8c865d21ff82902d952f91f/docutils-0.19.tar.gz" ] } }, @@ -8145,48 +8145,48 @@ ] } }, - "rules_python_publish_deps_311_zipp_py3_none_any_f091755f": { + "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": "zipp-3.19.2-py3-none-any.whl", + "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": "zipp==3.19.2", - "sha256": "f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c", + "requirement": "requests-toolbelt==0.10.1", + "sha256": "62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d", "urls": [ - "https://files.pythonhosted.org/packages/20/38/f5c473fe9b90c8debdd29ea68d5add0289f1936d6f923b6b9cc0b931194c/zipp-3.19.2-py3-none-any.whl" + "https://files.pythonhosted.org/packages/0c/4c/07f01c6ac44f7784fa399137fbc8d0cdc1b5d35304e8c0f278ad82105b58/requests-toolbelt-0.10.1.tar.gz" ] } }, - "rules_python_publish_deps_311_requests_toolbelt_sdist_62e09f7f": { + "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_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", + "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": "requests-toolbelt==0.10.1", - "sha256": "62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d", + "requirement": "zipp==3.19.2", + "sha256": "f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c", "urls": [ - "https://files.pythonhosted.org/packages/0c/4c/07f01c6ac44f7784fa399137fbc8d0cdc1b5d35304e8c0f278ad82105b58/requests-toolbelt-0.10.1.tar.gz" + "https://files.pythonhosted.org/packages/20/38/f5c473fe9b90c8debdd29ea68d5add0289f1936d6f923b6b9cc0b931194c/zipp-3.19.2-py3-none-any.whl" ] } }, @@ -8212,7 +8212,7 @@ ] } }, - "rules_python_publish_deps_311_rfc3986_py2_none_any_50b1502b": { + "rules_python_publish_deps_311_requests_sdist_98b1b278": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -8227,17 +8227,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "rfc3986-2.0.0-py2.py3-none-any.whl", + "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": "rfc3986==2.0.0", - "sha256": "50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", + "requirement": "requests==2.28.2", + "sha256": "98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf", "urls": [ - "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/9d/ee/391076f5937f0a8cdf5e53b701ffc91753e87b07d66bae4a09aa671897bf/requests-2.28.2.tar.gz" ] } }, - "rules_python_publish_deps_311_requests_sdist_98b1b278": { + "rules_python_publish_deps_311_rfc3986_py2_none_any_50b1502b": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -8252,13 +8252,13 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "requests-2.28.2.tar.gz", + "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": "requests==2.28.2", - "sha256": "98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf", + "requirement": "rfc3986==2.0.0", + "sha256": "50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", "urls": [ - "https://files.pythonhosted.org/packages/9d/ee/391076f5937f0a8cdf5e53b701ffc91753e87b07d66bae4a09aa671897bf/requests-2.28.2.tar.gz" + "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl" ] } }, @@ -8268,35 +8268,35 @@ "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\"}]", + "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\"}]", + "charset_normalizer": "[{\"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.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\"},{\"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-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_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-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-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_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_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_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-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.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-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-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-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-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\"}]", + "cryptography": "[{\"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-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-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-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-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-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-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_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.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cryptography_sdist_831a4b37\",\"target_platforms\":null,\"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\"}]", + "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\"}]", + "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\"}]", + "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\"}]", "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\"}]", + "markdown_it_py": "[{\"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\"},{\"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\"}]", + "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\"}]", + "more_itertools": "[{\"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\"},{\"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\"}]", "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\"}]", + "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\"}]", "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\"}]", + "pywin32_ctypes": "[{\"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\"},{\"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\"}]", + "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": "[{\"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\"}]", + "requests_toolbelt": "[{\"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\"},{\"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\"}]", + "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\"}]", + "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\"}]", "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\"}]" + "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\"}]", + "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\"}]", + "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\"}]", + "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\"}]", + "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\"}]" }, "packages": [ "bleach", @@ -8326,6 +8326,28 @@ "groups": {} } }, + "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_webencodings_py2_none_any_a0af1213": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -8351,25 +8373,23 @@ ] } }, - "rules_python_publish_deps_311_charset_normalizer_sdist_ebea339a": { + "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_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": "charset-normalizer-3.0.1.tar.gz", + "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.0.1", - "sha256": "ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f", + "requirement": "charset-normalizer==3.3.2", + "sha256": "573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", "urls": [ - "https://files.pythonhosted.org/packages/96/d7/1675d9089a1f4677df5eb29c3f8b064aa1e70c1251a0a8a127803158942d/charset-normalizer-3.0.1.tar.gz" + "https://files.pythonhosted.org/packages/3e/33/21a875a61057165e92227466e54ee076b73af1e21fe1b31f1e292251aa1e/charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl" ] } }, @@ -8395,26 +8415,6 @@ ] } }, - "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", diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 6f8ca587c1..dc02392d50 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -37,43 +37,19 @@ 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,49 @@ You cannot use both the additive_build_content and additive_build_content_file a 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, + 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`. + 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_alias` 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 = {} + whl_libraries = {} # if we do not have the python_interpreter set in the attributes # we programmatically find it. @@ -98,7 +113,7 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s 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 +123,9 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s 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,9 +133,6 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s ) 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(): @@ -137,12 +149,6 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s 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 = {} @@ -266,7 +272,7 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s for distribution in dists: found_something = True - is_hub_reproducible = False + is_reproducible = False if pip_attr.netrc: whl_library_args["netrc"] = pip_attr.netrc @@ -297,9 +303,9 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s if len(requirements) > 1: target_platforms = requirement.target_platforms - whl_library(name = repo_name, **dict(sorted(whl_library_args.items()))) + whl_libraries[repo_name] = dict(whl_library_args.items()) - whl_map[hub_name].setdefault(whl_name, []).append( + whl_map.setdefault(whl_name, []).append( whl_alias( repo = repo_name, version = major_minor, @@ -310,7 +316,7 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s if found_something: if is_exposed: - exposed_packages.setdefault(hub_name, {})[whl_name] = None + exposed_packages[whl_name] = None continue requirement = select_requirement( @@ -335,88 +341,65 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s # 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_libraries[repo_name] = dict(whl_library_args.items()) + whl_map.setdefault(whl_name, []).append( whl_alias( repo = repo_name, version = major_minor, ), ) - return is_hub_reproducible - -def _pip_impl(module_ctx): - """Implementation of a class tag that creates the pip hub and corresponding pip spoke whl repositories. - - This implementation iterates through all of the `pip.parse` calls and creates - different pip hub repositories based on the "hub_name". Each of the - pip calls create spoke repos that uses a specific Python interpreter. - - In a MODULES.bazel file we have: - - pip.parse( - hub_name = "pip", - python_version = 3.9, - requirements_lock = "//:requirements_lock_3_9.txt", - requirements_windows = "//:requirements_windows_3_9.txt", - ) - pip.parse( - hub_name = "pip", - python_version = 3.10, - requirements_lock = "//:requirements_lock_3_10.txt", - requirements_windows = "//:requirements_windows_3_10.txt", + return struct( + is_reproducible = is_reproducible, + whl_map = whl_map, + exposed_packages = exposed_packages, + whl_libraries = whl_libraries, ) - For instance, we have a hub with the name of "pip". - A repository named the following is created. It is actually called last when - all of the pip spokes are collected. - - - @@rules_python~override~pip~pip - - As shown in the example code above we have the following. - Two different pip.parse statements exist in MODULE.bazel provide the hub_name "pip". - These definitions create two different pip spoke repositories that are - related to the hub "pip". - One spoke uses Python 3.9 and the other uses Python 3.10. This code automatically - determines the Python version and the interpreter. - Both of these pip spokes contain requirements files that includes websocket - and its dependencies. - - We also need repositories for the wheels that the different pip spokes contain. - For each Python version a different wheel repository is created. In our example - each pip spoke had a requirements file that contained websockets. We - then create two different wheel repositories that are named the following. - - - @@rules_python~override~pip~pip_39_websockets - - @@rules_python~override~pip~pip_310_websockets - - And if the wheel has any other dependencies subsequent wheels are created in the same fashion. - - The hub repository has aliases for `pkg`, `data`, etc, which have a select that resolves to - a spoke repository depending on the Python version. - - Also we may have more than one hub as defined in a MODULES.bazel file. So we could have multiple - hubs pointing to various different pip spokes. - - Some other business rules notes. A hub can only have one spoke per Python version. We cannot - have a hub named "pip" that has two spokes that use the Python 3.9 interpreter. Second - we cannot have the same hub name used in sub-modules. The hub name has to be globally - unique. - - This implementation also handles the creation of whl_modification JSON files that are used - during the creation of wheel libraries. These JSON files used via the annotations argument - when calling wheel_installer.py. +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: module contents + 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 all of the wheel modifications if the tag class is called. - _whl_mods_impl(module_ctx) + 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: @@ -446,6 +429,7 @@ def _pip_impl(module_ctx): # 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]]] @@ -453,9 +437,9 @@ def _pip_impl(module_ctx): hub_whl_map = {} hub_group_map = {} exposed_packages = {} + whl_libraries = {} - simpleapi_cache = {} - is_extension_reproducible = True + is_reproducible = True for mod in module_ctx.modules: for pip_attr in mod.tags.parse: @@ -492,10 +476,125 @@ def _pip_impl(module_ctx): 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 + 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(): + hub_whl_map[hub_name].setdefault(key, []).extend(settings) + 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 the output here so that the lock file is sorted + whl_mods = dict(sorted(whl_mods.items())), + hub_whl_map = { + hub_name: { + whl_name: sorted(settings, key = lambda x: (x.version, x.filename)) + 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())}, + whl_libraries = dict(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. + + This implementation iterates through all of the `pip.parse` calls and creates + different pip hub repositories based on the "hub_name". Each of the + pip calls create spoke repos that uses a specific Python interpreter. + + In a MODULES.bazel file we have: + + pip.parse( + hub_name = "pip", + python_version = 3.9, + requirements_lock = "//:requirements_lock_3_9.txt", + requirements_windows = "//:requirements_windows_3_9.txt", + ) + pip.parse( + hub_name = "pip", + python_version = 3.10, + requirements_lock = "//:requirements_lock_3_10.txt", + requirements_windows = "//:requirements_windows_3_10.txt", + ) + + For instance, we have a hub with the name of "pip". + A repository named the following is created. It is actually called last when + all of the pip spokes are collected. + + - @@rules_python~override~pip~pip + + As shown in the example code above we have the following. + Two different pip.parse statements exist in MODULE.bazel provide the hub_name "pip". + These definitions create two different pip spoke repositories that are + related to the hub "pip". + One spoke uses Python 3.9 and the other uses Python 3.10. This code automatically + determines the Python version and the interpreter. + Both of these pip spokes contain requirements files that includes websocket + and its dependencies. + + We also need repositories for the wheels that the different pip spokes contain. + For each Python version a different wheel repository is created. In our example + each pip spoke had a requirements file that contained websockets. We + then create two different wheel repositories that are named the following. + + - @@rules_python~override~pip~pip_39_websockets + - @@rules_python~override~pip~pip_310_websockets + + And if the wheel has any other dependencies subsequent wheels are created in the same fashion. + + The hub repository has aliases for `pkg`, `data`, etc, which have a select that resolves to + a spoke repository depending on the Python version. + + Also we may have more than one hub as defined in a MODULES.bazel file. So we could have multiple + hubs pointing to various different pip spokes. + + Some other business rules notes. A hub can only have one spoke per Python version. We cannot + have a hub named "pip" that has two spokes that use the Python 3.9 interpreter. Second + we cannot have the same hub name used in sub-modules. The hub name has to be globally + unique. + + This implementation also handles the creation of whl_modification JSON files that are used + during the creation of wheel libraries. These JSON files used via the annotations argument + when calling wheel_installer.py. + + Args: + module_ctx: module contents + """ + + mods = parse_modules(module_ctx) + + # Build all of the wheel modifications if the tag class is called. + _whl_mods_impl(mods.whl_mods) + + for name, args in sorted(mods.whl_libraries.items()): + # 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. + whl_library(name = name, **dict(sorted(args.items()))) - 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, @@ -503,8 +602,8 @@ def _pip_impl(module_ctx): key: json.encode(value) for key, value 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,7 +613,7 @@ def _pip_impl(module_ctx): # 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 diff --git a/python/private/pypi/parse_requirements.bzl b/python/private/pypi/parse_requirements.bzl index c72f5d43f8..aacc8bdbc0 100644 --- a/python/private/pypi/parse_requirements.bzl +++ b/python/private/pypi/parse_requirements.bzl @@ -38,7 +38,7 @@ def parse_requirements( 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 +73,7 @@ def parse_requirements( 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(): diff --git a/tests/pypi/extension/BUILD.bazel b/tests/pypi/extension/BUILD.bazel new file mode 100644 index 0000000000..39000e8c1b --- /dev/null +++ b/tests/pypi/extension/BUILD.bazel @@ -0,0 +1,17 @@ +# 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(":extension_tests.bzl", "extension_test_suite") + +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 0000000000..3d79e10d73 --- /dev/null +++ b/tests/pypi/extension/extension_tests.bzl @@ -0,0 +1,248 @@ +# 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 + +_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"), + 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_pip_args = [], + isolated = True, + netrc = None, + 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_pip_args = extra_pip_args, + hub_name = hub_name, + isolated = isolated, + netrc = netrc, + 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": []}) + pypi.hub_group_map().contains_exactly({"pypi": {}}) + pypi.hub_whl_map().contains_exactly({"pypi": {}}) + pypi.whl_libraries().contains_exactly({}) + pypi.whl_mods().contains_exactly({}) + +_tests.append(_test_simple) + +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 = {}, + 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", + ), + ], + ), + ), + 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"]}) + pypi.hub_group_map().contains_exactly({"pypi": {}}) + pypi.hub_whl_map().contains_exactly({"pypi": { + "simple": [ + struct( + config_setting = "//_config:is_python_3.15", + filename = "simple-0.0.1.tar.gz", + repo = "pypi_315_simple_sdist_deadbeef", + target_platforms = None, + version = "3.15", + ), + ], + }}) + pypi.whl_libraries().contains_exactly({ + "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", + ], + "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"], + }, + }) + pypi.whl_mods().contains_exactly({}) + +_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) From 62a5c41c1e9e7e812c3d06026710eb9bd13267eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 16:09:32 -0700 Subject: [PATCH 267/345] build(deps): bump sphinx from 8.0.2 to 8.1.3 in /docs (#2322) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [sphinx](https://github.com/sphinx-doc/sphinx) from 8.0.2 to 8.1.3.
Release notes

Sourced from sphinx's releases.

Sphinx 8.1.3

Changelog: https://www.sphinx-doc.org/en/master/changes/8.1.html

Bugs fixed

  • #13013: Restore support for cut_lines() with no object type. Patch by Adam Turner.

Sphinx 8.1.2

Changelog: https://www.sphinx-doc.org/en/master/changes/8.1.html

Bugs fixed

  • #13012: Expose sphinx.errors.ExtensionError in sphinx.util for backwards compatibility. This will be removed in Sphinx 9, as exposing the exception in sphinx.util was never intentional. ExtensionError has been part of sphinx.errors since Sphinx 0.9. Patch by Adam Turner.

Sphinx 8.1.1

Changelog: https://www.sphinx-doc.org/en/master/changes/8.1.html

Bugs fixed

  • #13006: Use the preferred https://www.cve.org/ URL for the :cve: role. Patch by Hugo van Kemenade.
  • #13007: LaTeX: Improve resiliency when the required fontawesome or fontawesome5 packages are not installed. Patch by Jean-François B.

Sphinx 8.1.0

Changelog: https://www.sphinx-doc.org/en/master/changes/8.1.html

Dependencies

  • #12756: Add lower-bounds to the sphinxcontrib-* dependencies. Patch by Adam Turner.
  • #12833: Update the LaTeX parskip package from 2001 to 2018. Patch by Jean-François B.

Incompatible changes

  • #12763: Remove unused internal class sphinx.util.Tee. Patch by Adam Turner.
  • #12822: LaTeX: for Unicode engines, the fvset default is changed to '\\fvset{fontsize=auto}' from '\\fvset{fontsize=\\small}'. Code-blocks are unchanged as FreeMono is now loaded with Scale=0.9. An adjustment to existing projects is needed only if they used a custom fontpkg configuration and did not set fvset.

... (truncated)

Changelog

Sourced from sphinx's changelog.

Release 8.1.3 (released Oct 13, 2024)

Bugs fixed

  • #13013: Restore support for :func:!cut_lines with no object type. Patch by Adam Turner.

Release 8.1.2 (released Oct 12, 2024)

Bugs fixed

  • #13012: Expose :exc:sphinx.errors.ExtensionError in sphinx.util for backwards compatibility. This will be removed in Sphinx 9, as exposing the exception in sphinx.util was never intentional. :exc:!ExtensionError has been part of sphinx.errors since Sphinx 0.9. Patch by Adam Turner.

Release 8.1.1 (released Oct 11, 2024)

Bugs fixed

  • #13006: Use the preferred https://www.cve.org/ URL for the :rst:role::cve: <cve> role. Patch by Hugo van Kemenade.
  • #13007: LaTeX: Improve resiliency when the required fontawesome or fontawesome5 packages are not installed. Patch by Jean-François B.

Release 8.1.0 (released Oct 10, 2024)

Dependencies

  • #12756: Add lower-bounds to the sphinxcontrib-* dependencies. Patch by Adam Turner.
  • #12833: Update the LaTeX parskip package from 2001 to 2018. Patch by Jean-François B.

Incompatible changes

  • #12763: Remove unused internal class sphinx.util.Tee.

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sphinx&package-manager=pip&previous-version=8.0.2&new-version=8.1.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index dcaa74e80b..5c08f27845 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -300,9 +300,9 @@ snowballstemmer==2.2.0 \ --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 From a7d4eeaa6bfadfa056f6c65948d4b86b69e9762a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 23:10:18 +0000 Subject: [PATCH 268/345] build(deps): bump charset-normalizer from 3.3.2 to 3.4.0 in /tools/publish (#2323) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [charset-normalizer](https://github.com/Ousret/charset_normalizer) from 3.3.2 to 3.4.0.
Release notes

Sourced from charset-normalizer's releases.

Version 3.4.0

🚀 charset-normalizer is raising awareness around HTTP/2, and HTTP/3!

Did you know that Internet Explorer 11 shipped with an optional HTTP/2 support back in 2013? also libcurl did ship it in 2014[...] All of this while our community is still struggling to make a firm advancement in HTTP clients. Now, many of you use Requests as the defacto http client, now, and for many years now, Requests has been frozen. Being left in a vegetative state and not evolving, this blocked millions of developers from using more advanced features.

We promptly invite Python developers to look at the drop-in replacement for Requests, namely Niquests. It leverage charset-normalizer in a better way! Check it out, you will be positively surprised! Don't wait another decade.

We are thankful to @​microsoft and involved parties for funding our work through the Microsoft FOSS Fund program.

3.4.0 (2024-10-08)

Added

  • Argument --no-preemptive in the CLI to prevent the detector to search for hints.
  • Support for Python 3.13 (#512)

Fixed

  • Relax the TypeError exception thrown when trying to compare a CharsetMatch with anything else than a CharsetMatch.
  • Improved the general reliability of the detector based on user feedbacks. (#520) (#509) (#498) (#407) (#537)
  • Declared charset in content (preemptive detection) not changed when converting to utf-8 bytes. (#381)
Changelog

Sourced from charset-normalizer's changelog.

3.4.0 (2024-10-08)

Added

  • Argument --no-preemptive in the CLI to prevent the detector to search for hints.
  • Support for Python 3.13 (#512)

Fixed

  • Relax the TypeError exception thrown when trying to compare a CharsetMatch with anything else than a CharsetMatch.
  • Improved the general reliability of the detector based on user feedbacks. (#520) (#509) (#498) (#407) (#537)
  • Declared charset in content (preemptive detection) not changed when converting to utf-8 bytes. (#381)
Commits
  • f3118e3 :wrench: change download/upload artifact version to last working version
  • 33e67e8 :wrench: set compile-generator in generator_generic_slsa3 action
  • 73dd24c :wrench: add explicit build deps to setuptools
  • 78f1e9b :wrench: attempt to fix cd.yml *3
  • 56ae702 :wrench: attempt to fix cd.yml *2
  • 9720055 :wrench: attempt to fix cd.yml (macos part)
  • 1e10d06 Update CHANGELOG.md
  • 36c103a :bookmark: Release 3.4.0 (#545)
  • 7658dfc :arrow_up: Bump github/codeql-action from 3.26.11 to 3.26.12 (#544)
  • ca2535d :arrow_up: Bump github/codeql-action from 3.26.9 to 3.26.11 (#542)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=charset-normalizer&package-manager=pip&previous-version=3.3.2&new-version=3.4.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/publish/requirements_darwin.txt | 197 +++++++++++++------------ tools/publish/requirements_windows.txt | 197 +++++++++++++------------ 2 files changed, 212 insertions(+), 182 deletions(-) diff --git a/tools/publish/requirements_darwin.txt b/tools/publish/requirements_darwin.txt index ddd47c7d45..32f3ecf8e5 100644 --- a/tools/publish/requirements_darwin.txt +++ b/tools/publish/requirements_darwin.txt @@ -12,97 +12,112 @@ 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 \ diff --git a/tools/publish/requirements_windows.txt b/tools/publish/requirements_windows.txt index e9e523a630..d118065bac 100644 --- a/tools/publish/requirements_windows.txt +++ b/tools/publish/requirements_windows.txt @@ -12,97 +12,112 @@ 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 \ From 797cbe8f010210c5c830748fdf9a9ee3b836e334 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Oct 2024 16:40:27 -0700 Subject: [PATCH 269/345] build(deps): bump charset-normalizer from 3.3.2 to 3.4.0 in /docs (#2321) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [charset-normalizer](https://github.com/Ousret/charset_normalizer) from 3.3.2 to 3.4.0.
Release notes

Sourced from charset-normalizer's releases.

Version 3.4.0

🚀 charset-normalizer is raising awareness around HTTP/2, and HTTP/3!

Did you know that Internet Explorer 11 shipped with an optional HTTP/2 support back in 2013? also libcurl did ship it in 2014[...] All of this while our community is still struggling to make a firm advancement in HTTP clients. Now, many of you use Requests as the defacto http client, now, and for many years now, Requests has been frozen. Being left in a vegetative state and not evolving, this blocked millions of developers from using more advanced features.

We promptly invite Python developers to look at the drop-in replacement for Requests, namely Niquests. It leverage charset-normalizer in a better way! Check it out, you will be positively surprised! Don't wait another decade.

We are thankful to @​microsoft and involved parties for funding our work through the Microsoft FOSS Fund program.

3.4.0 (2024-10-08)

Added

  • Argument --no-preemptive in the CLI to prevent the detector to search for hints.
  • Support for Python 3.13 (#512)

Fixed

  • Relax the TypeError exception thrown when trying to compare a CharsetMatch with anything else than a CharsetMatch.
  • Improved the general reliability of the detector based on user feedbacks. (#520) (#509) (#498) (#407) (#537)
  • Declared charset in content (preemptive detection) not changed when converting to utf-8 bytes. (#381)
Changelog

Sourced from charset-normalizer's changelog.

3.4.0 (2024-10-08)

Added

  • Argument --no-preemptive in the CLI to prevent the detector to search for hints.
  • Support for Python 3.13 (#512)

Fixed

  • Relax the TypeError exception thrown when trying to compare a CharsetMatch with anything else than a CharsetMatch.
  • Improved the general reliability of the detector based on user feedbacks. (#520) (#509) (#498) (#407) (#537)
  • Declared charset in content (preemptive detection) not changed when converting to utf-8 bytes. (#381)
Commits
  • f3118e3 :wrench: change download/upload artifact version to last working version
  • 33e67e8 :wrench: set compile-generator in generator_generic_slsa3 action
  • 73dd24c :wrench: add explicit build deps to setuptools
  • 78f1e9b :wrench: attempt to fix cd.yml *3
  • 56ae702 :wrench: attempt to fix cd.yml *2
  • 9720055 :wrench: attempt to fix cd.yml (macos part)
  • 1e10d06 Update CHANGELOG.md
  • 36c103a :bookmark: Release 3.4.0 (#545)
  • 7658dfc :arrow_up: Bump github/codeql-action from 3.26.11 to 3.26.12 (#544)
  • ca2535d :arrow_up: Bump github/codeql-action from 3.26.9 to 3.26.11 (#542)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=charset-normalizer&package-manager=pip&previous-version=3.3.2&new-version=3.4.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/requirements.txt | 197 +++++++++++++++++++++++------------------- 1 file changed, 106 insertions(+), 91 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 5c08f27845..6862888a7b 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -22,97 +22,112 @@ 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 colorama==0.4.6 ; sys_platform == 'win32' \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ From 1a92c979595ce6bab6575822c75175e4913ea879 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Mon, 21 Oct 2024 19:51:10 -0700 Subject: [PATCH 270/345] docs: fix typo in precompiling docs (#2324) typo: due Python -> due to Python --- docs/precompiling.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/precompiling.md b/docs/precompiling.md index 6eadc4042b..a6711f3b76 100644 --- a/docs/precompiling.md +++ b/docs/precompiling.md @@ -83,7 +83,7 @@ Note that any execution requirements values can be specified in the flag. * 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 From 72ddf0c9473a1f49b361b082fc24c028aa791019 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 22 Oct 2024 10:58:57 -0700 Subject: [PATCH 271/345] fix(rules): remove rules_python --incompatible_python_disallow_native_rules checking (#2327) When --incompatible_python_disallow_native_rules is enabled, all the core rules fail with an error that rules_python should be used. This is incorrect, since the rules_python rules are being used. What's happening is https://github.com/bazelbuild/rules_python/pull/2257 removed the magic migration tag when pystar is enabled, but the code to check the tag was present wasn't removed. This went unnoticed because our CI doesn't set the migration flag. To fix, remove the validation logic entirely. If we're in the rules_python implementation, then there is not need to perform this validation. It was just something copy/pasted from the original code from Bazel itself. Also update the bazelrc to always set --incompatible_python_disallow_native_rules. Fixes https://github.com/bazelbuild/rules_python/issues/2326 Fixes https://github.com/bazelbuild/rules_python/issues/1645 --- .bazelci/presubmit.yml | 2 + .bazelrc | 2 + CHANGELOG.md | 4 +- examples/build_file_generation/.bazelrc | 2 + examples/bzlmod/.bazelrc | 1 + examples/bzlmod/MODULE.bazel.lock | 246 +++++++++--------- .../bzlmod_build_file_generation/.bazelrc | 1 + examples/multi_python_versions/.bazelrc | 1 + examples/pip_parse/.bazelrc | 1 + examples/pip_parse_vendored/.bazelrc | 1 + examples/pip_repository_annotations/.bazelrc | 1 + examples/py_proto_library/.bazelrc | 1 + gazelle/.bazelrc | 8 +- python/private/common.bzl | 71 ----- python/private/py_executable.bzl | 2 - python/private/py_library.bzl | 2 - .../compile_pip_requirements/.bazelrc | 1 + .../.bazelrc | 1 + .../ignore_root_user_error/.bazelrc | 1 + tests/integration/local_toolchains/.bazelrc | 1 + tests/integration/pip_parse/.bazelrc | 1 + .../py_cc_toolchain_registered/.bazelrc | 1 + 22 files changed, 146 insertions(+), 206 deletions(-) diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index d7f2f7a97f..5d51b106ed 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -94,6 +94,8 @@ buildifier: bazel: "7.x" environment: RULES_PYTHON_ENABLE_PYSTAR: "1" + build_flags: + - "--config=bazel7.x" test_flags: # The doc check tests fail because the Starlark implementation makes the # PyInfo and PyRuntimeInfo symbols become documented. diff --git a/.bazelrc b/.bazelrc index 1ca469cd75..c44124d961 100644 --- a/.bazelrc +++ b/.bazelrc @@ -33,4 +33,6 @@ build:rtd --stamp # 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/CHANGELOG.md b/CHANGELOG.md index 1994af2a62..47741743b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,7 +31,9 @@ A brief description of the categories of changes: {#v0-0-0-fixed} ### Fixed -- Nothing yet +* (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-0-0-added} ### Added diff --git a/examples/build_file_generation/.bazelrc b/examples/build_file_generation/.bazelrc index e0b1984e4e..fd0f731d2f 100644 --- a/examples/build_file_generation/.bazelrc +++ b/examples/build_file_generation/.bazelrc @@ -6,3 +6,5 @@ build --enable_runfiles # 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 fd16095857..ca83047ccc 100644 --- a/examples/bzlmod/.bazelrc +++ b/examples/bzlmod/.bazelrc @@ -7,3 +7,4 @@ test --test_output=errors --enable_runfiles # Windows requires these for multi-python support: build --enable_runfiles +common:bazel7.x --incompatible_python_disallow_native_rules diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 681a701c34..25930d11c5 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -6303,8 +6303,8 @@ "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" + "@@rules_python~//tools/publish/requirements_windows.txt": "a24d2aeea74a744a0aad1ac262cb9fb9e2f6f14f8d08d4f11a84f3f54da81231", + "@@rules_python~//tools/publish/requirements_darwin.txt": "186c9e45c372e30cae42e31696420a9065580147f71bd834e3e3ba477842bb5a" }, "recordedDirentsInputs": {}, "envVariables": { @@ -6334,6 +6334,26 @@ ] } }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5": { + "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.4.0-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.4.0", + "sha256": "c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", + "urls": [ + "https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl" + ] + } + }, "rules_python_publish_deps_311_urllib3_sdist_076907bf": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -6447,6 +6467,26 @@ ] } }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19": { + "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.4.0-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.4.0", + "sha256": "6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", + "urls": [ + "https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl" + ] + } + }, "rules_python_publish_deps_311_readme_renderer_py3_none_any_f67a16ca": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -6519,26 +6559,6 @@ ] } }, - "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", @@ -6583,6 +6603,26 @@ ] } }, + "rules_python_publish_deps_311_charset_normalizer_sdist_223217c3": { + "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.4.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", + "urls": [ + "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz" + ] + } + }, "rules_python_publish_deps_311_pygments_py3_none_any_fa7bd7bd": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -7153,6 +7193,26 @@ ] } }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f": { + "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.4.0-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.4.0", + "sha256": "cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", + "urls": [ + "https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl" + ] + } + }, "rules_python_publish_deps_311_pywin32_ctypes_py2_none_any_9dc2d991": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -7263,26 +7323,6 @@ ] } }, - "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_cryptography_sdist_831a4b37": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -7345,6 +7385,26 @@ ] } }, + "rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe": { + "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.4.0-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.4.0", + "sha256": "fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", + "urls": [ + "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl" + ] + } + }, "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", @@ -7487,26 +7547,6 @@ ] } }, - "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_rfc3986_sdist_97aacf9d": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -7557,26 +7597,6 @@ ] } }, - "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", @@ -8039,26 +8059,6 @@ ] } }, - "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_docutils_py3_none_any_5e1de4d8": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -8271,7 +8271,7 @@ "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\"}]", "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\"}]", - "charset_normalizer": "[{\"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.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\"},{\"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-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_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-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-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_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_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_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-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.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-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-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-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-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\"}]", + "charset_normalizer": "[{\"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.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-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_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-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-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_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_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_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-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.4.0-cp311-cp311-macosx_10_9_universal2.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe\",\"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.4.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_sdist_223217c3\",\"target_platforms\":[\"cp311_osx_aarch64\",\"cp311_osx_x86_64\",\"cp311_windows_x86_64\"],\"version\":\"3.11\"}]", "cryptography": "[{\"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-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-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-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-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-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-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_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.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cryptography_sdist_831a4b37\",\"target_platforms\":null,\"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\"}]", "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\"}]", @@ -8326,6 +8326,26 @@ "groups": {} } }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f": { + "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.4.0-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.4.0", + "sha256": "0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", + "urls": [ + "https://files.pythonhosted.org/packages/9c/61/73589dcc7a719582bf56aae309b6103d2762b526bffe189d635a7fcfd998/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl" + ] + } + }, "rules_python_publish_deps_311_charset_normalizer_sdist_ebea339a": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -8373,26 +8393,6 @@ ] } }, - "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_charset_normalizer_cp311_cp311_musllinux_1_1_aarch64_72966d1b": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", diff --git a/examples/bzlmod_build_file_generation/.bazelrc b/examples/bzlmod_build_file_generation/.bazelrc index acc7102a17..0289886d4d 100644 --- a/examples/bzlmod_build_file_generation/.bazelrc +++ b/examples/bzlmod_build_file_generation/.bazelrc @@ -6,3 +6,4 @@ build --enable_runfiles common --experimental_enable_bzlmod coverage --java_runtime_version=remotejdk_11 +common:bazel7.x --incompatible_python_disallow_native_rules diff --git a/examples/multi_python_versions/.bazelrc b/examples/multi_python_versions/.bazelrc index 58080ab51b..97a973bd85 100644 --- a/examples/multi_python_versions/.bazelrc +++ b/examples/multi_python_versions/.bazelrc @@ -4,3 +4,4 @@ test --test_output=errors build --enable_runfiles coverage --java_runtime_version=remotejdk_11 +common:bazel7.x --incompatible_python_disallow_native_rules diff --git a/examples/pip_parse/.bazelrc b/examples/pip_parse/.bazelrc index 9e7ef37327..a56904803c 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 3818a03808..be3555d1eb 100644 --- a/examples/pip_parse_vendored/.bazelrc +++ b/examples/pip_parse_vendored/.bazelrc @@ -6,3 +6,4 @@ build --enable_runfiles # 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 9ce0b72b48..4f62c6e76f 100644 --- a/examples/pip_repository_annotations/.bazelrc +++ b/examples/pip_repository_annotations/.bazelrc @@ -4,3 +4,4 @@ try-import %workspace%/user.bazelrc # 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 ef0e530774..65d8a0a2f6 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 e10cd78a26..97040903a6 100644 --- a/gazelle/.bazelrc +++ b/gazelle/.bazelrc @@ -11,10 +11,4 @@ build --incompatible_default_to_explicit_init_py # 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/python/private/common.bzl b/python/private/common.bzl index 2dcc9482ca..837cd19097 100644 --- a/python/private/common.bzl +++ b/python/private/common.bzl @@ -17,24 +17,15 @@ load(":cc_helper.bzl", "cc_helper") 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, @@ -477,65 +468,3 @@ def target_platform_has_any_constraint(ctx, constraints): 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/py_executable.bzl b/python/private/py_executable.bzl index ce1288cc29..b81f07e01a 100644 --- a/python/private/py_executable.bzl +++ b/python/private/py_executable.bzl @@ -33,7 +33,6 @@ load(":builders.bzl", "builders") 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 _get_build_info(ctx, cc_toolchain): 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): diff --git a/python/private/py_library.bzl b/python/private/py_library.bzl index 4f43116947..1bc96b5e4b 100644 --- a/python/private/py_library.bzl +++ b/python/private/py_library.bzl @@ -28,7 +28,6 @@ load( load(":builders.bzl", "builders") load( ":common.bzl", - "check_native_allowed", "collect_imports", "collect_runfiles", "create_instrumented_files_info", @@ -70,7 +69,6 @@ def py_library_impl(ctx, *, semantics): 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/tests/integration/compile_pip_requirements/.bazelrc b/tests/integration/compile_pip_requirements/.bazelrc index 8a42e6405b..b85f03bcb6 100644 --- a/tests/integration/compile_pip_requirements/.bazelrc +++ b/tests/integration/compile_pip_requirements/.bazelrc @@ -2,3 +2,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/compile_pip_requirements_test_from_external_repo/.bazelrc b/tests/integration/compile_pip_requirements_test_from_external_repo/.bazelrc index b98fc09774..ab10c8caf7 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/ignore_root_user_error/.bazelrc b/tests/integration/ignore_root_user_error/.bazelrc index 27d7d137cd..bb7b5742cd 100644 --- a/tests/integration/ignore_root_user_error/.bazelrc +++ b/tests/integration/ignore_root_user_error/.bazelrc @@ -4,3 +4,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/.bazelrc b/tests/integration/local_toolchains/.bazelrc index 551df401b3..39df41d9f4 100644 --- a/tests/integration/local_toolchains/.bazelrc +++ b/tests/integration/local_toolchains/.bazelrc @@ -3,3 +3,4 @@ common --lockfile_mode=off 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/pip_parse/.bazelrc b/tests/integration/pip_parse/.bazelrc index efeccbe919..a74909297d 100644 --- a/tests/integration/pip_parse/.bazelrc +++ b/tests/integration/pip_parse/.bazelrc @@ -5,3 +5,4 @@ build --enable_runfiles # 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/py_cc_toolchain_registered/.bazelrc b/tests/integration/py_cc_toolchain_registered/.bazelrc index 741d758a4f..fb31561892 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 From 5f28550f60e33c536941fb598e919441d39b8a2a Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 22 Oct 2024 21:08:57 -0700 Subject: [PATCH 272/345] fix: fix errors with bazel@head (#2332) Fix various errors with upcoming Bazel versions * Use rules_cc 0.0.13 for integration tests. * Set `allow_empty=True` in local toolchains setup Fixes https://github.com/bazelbuild/rules_python/issues/2310 --- python/private/local_runtime_repo_setup.bzl | 18 +++++++++++++----- .../compile_pip_requirements/WORKSPACE | 16 ++++++++++++++++ .../ignore_root_user_error/WORKSPACE | 18 ++++++++++++++++-- tests/integration/pip_parse/WORKSPACE | 16 ++++++++++++++++ .../py_cc_toolchain_registered/WORKSPACE | 16 ++++++++++++++++ 5 files changed, 77 insertions(+), 7 deletions(-) diff --git a/python/private/local_runtime_repo_setup.bzl b/python/private/local_runtime_repo_setup.bzl index 23fa99dfa9..3fa484e7c7 100644 --- a/python/private/local_runtime_repo_setup.bzl +++ b/python/private/local_runtime_repo_setup.bzl @@ -61,7 +61,11 @@ def define_local_runtime_toolchain_impl( 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 @@ def define_local_runtime_toolchain_impl( 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/tests/integration/compile_pip_requirements/WORKSPACE b/tests/integration/compile_pip_requirements/WORKSPACE index 0eeab2067c..fdd6b1da75 100644 --- a/tests/integration/compile_pip_requirements/WORKSPACE +++ b/tests/integration/compile_pip_requirements/WORKSPACE @@ -1,3 +1,19 @@ +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "protobuf", + sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", + strip_prefix = "protobuf-27.0", + url = "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protobuf-27.0.tar.gz", +) + +http_archive( + name = "rules_cc", + sha256 = "d9bdd3ec66b6871456ec9c965809f43a0901e692d754885e89293807762d3d80", + strip_prefix = "rules_cc-0.0.13", + urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.13/rules_cc-0.0.13.tar.gz"], +) + local_repository( name = "rules_python", path = "../../..", diff --git a/tests/integration/ignore_root_user_error/WORKSPACE b/tests/integration/ignore_root_user_error/WORKSPACE index c21b01e1bc..a1aa5b5009 100644 --- a/tests/integration/ignore_root_user_error/WORKSPACE +++ b/tests/integration/ignore_root_user_error/WORKSPACE @@ -1,3 +1,19 @@ +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "protobuf", + sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", + strip_prefix = "protobuf-27.0", + url = "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protobuf-27.0.tar.gz", +) + +http_archive( + name = "rules_cc", + sha256 = "d9bdd3ec66b6871456ec9c965809f43a0901e692d754885e89293807762d3d80", + strip_prefix = "rules_cc-0.0.13", + urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.13/rules_cc-0.0.13.tar.gz"], +) + local_repository( name = "rules_python", path = "../../..", @@ -13,8 +29,6 @@ python_register_toolchains( 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/pip_parse/WORKSPACE b/tests/integration/pip_parse/WORKSPACE index db0cd0c7c8..e22fbedca2 100644 --- a/tests/integration/pip_parse/WORKSPACE +++ b/tests/integration/pip_parse/WORKSPACE @@ -1,3 +1,19 @@ +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "protobuf", + sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", + strip_prefix = "protobuf-27.0", + url = "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protobuf-27.0.tar.gz", +) + +http_archive( + name = "rules_cc", + sha256 = "d9bdd3ec66b6871456ec9c965809f43a0901e692d754885e89293807762d3d80", + strip_prefix = "rules_cc-0.0.13", + urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.13/rules_cc-0.0.13.tar.gz"], +) + local_repository( name = "rules_python", path = "../../..", diff --git a/tests/integration/py_cc_toolchain_registered/WORKSPACE b/tests/integration/py_cc_toolchain_registered/WORKSPACE index de908549c0..b9d9f0f560 100644 --- a/tests/integration/py_cc_toolchain_registered/WORKSPACE +++ b/tests/integration/py_cc_toolchain_registered/WORKSPACE @@ -1,3 +1,19 @@ +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "protobuf", + sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", + strip_prefix = "protobuf-27.0", + url = "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protobuf-27.0.tar.gz", +) + +http_archive( + name = "rules_cc", + sha256 = "d9bdd3ec66b6871456ec9c965809f43a0901e692d754885e89293807762d3d80", + strip_prefix = "rules_cc-0.0.13", + urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.13/rules_cc-0.0.13.tar.gz"], +) + local_repository( name = "rules_python", path = "../../..", From b4cc7b7ee53b4c75747c06c341e699fc174a5cc3 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 22 Oct 2024 21:36:56 -0700 Subject: [PATCH 273/345] docs: update changelog for 0.37.1 (#2330) Update the headers and sections for the 0.37.1 release. --- CHANGELOG.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47741743b9..c559a6c638 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,9 +31,7 @@ A brief description of the categories of changes: {#v0-0-0-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). +- Nothing yet {#v0-0-0-added} ### Added @@ -43,6 +41,17 @@ A brief description of the categories of changes: ### Removed - Nothing yet +{#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 From 6babe59e991f1b8a7279c78a2b536980db6f6eb3 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 22 Oct 2024 21:37:47 -0700 Subject: [PATCH 274/345] docs: tell how to setup readthedocs integration with sphinxdocs (#2331) This comes from setting up readthedocs integration with rules_testing. It'd be nice if so much copy/paste wasn't necessary, but I'm not sure how to best reduce that, so at the least, document what one has to do. --- sphinxdocs/docs/index.md | 1 + sphinxdocs/docs/readthedocs.md | 156 +++++++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 sphinxdocs/docs/readthedocs.md diff --git a/sphinxdocs/docs/index.md b/sphinxdocs/docs/index.md index ac857d625b..bd6448ced9 100644 --- a/sphinxdocs/docs/index.md +++ b/sphinxdocs/docs/index.md @@ -17,4 +17,5 @@ is agnostic as to what is being documented. starlark-docgen sphinx-bzl +readthedocs ``` diff --git a/sphinxdocs/docs/readthedocs.md b/sphinxdocs/docs/readthedocs.md new file mode 100644 index 0000000000..66e4be82ea --- /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", ""), +} +``` From f231358115c8d411a77b7e5b0a7a7dd6867679fd Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 24 Oct 2024 10:55:33 -0700 Subject: [PATCH 275/345] deps: use rules_cc 0.0.13 to support newer bazel versions (#2335) In order for WORKSPACE to work with newer bazel versions, rules_cc 0.0.13 or higher is necessary. rules_cc then requires a newer protobuf version. Note I couldn't figure out the minimum protobuf version, but 27.0 seems to work OK. AFAIK only WORKSPACE is affected. Our bzlmod uses 0.0.9 and hasn't had issues. Fixes https://github.com/bazelbuild/rules_python/issues/2310 --- CHANGELOG.md | 5 ++++- python/private/py_repositories.bzl | 12 +++++++++--- .../compile_pip_requirements/WORKSPACE | 16 ---------------- .../integration/ignore_root_user_error/WORKSPACE | 14 -------------- tests/integration/pip_parse/WORKSPACE | 16 ---------------- .../py_cc_toolchain_registered/WORKSPACE | 16 ---------------- 6 files changed, 13 insertions(+), 66 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c559a6c638..cb26593437 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,7 +27,10 @@ A brief description of the categories of changes: {#v0-0-0-changed} ### Changed -- Nothing yet +* (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)). {#v0-0-0-fixed} ### Fixed diff --git a/python/private/py_repositories.bzl b/python/private/py_repositories.bzl index ff8a6389ba..26b2c780a3 100644 --- a/python/private/py_repositories.bzl +++ b/python/private/py_repositories.bzl @@ -55,8 +55,14 @@ def py_repositories(): ) 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 = "d9bdd3ec66b6871456ec9c965809f43a0901e692d754885e89293807762d3d80", + strip_prefix = "rules_cc-0.0.13", + urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.13/rules_cc-0.0.13.tar.gz"], + ) + http_archive( + name = "protobuf", + sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", + strip_prefix = "protobuf-27.0", + url = "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protobuf-27.0.tar.gz", ) pypi_deps() diff --git a/tests/integration/compile_pip_requirements/WORKSPACE b/tests/integration/compile_pip_requirements/WORKSPACE index fdd6b1da75..0eeab2067c 100644 --- a/tests/integration/compile_pip_requirements/WORKSPACE +++ b/tests/integration/compile_pip_requirements/WORKSPACE @@ -1,19 +1,3 @@ -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") - -http_archive( - name = "protobuf", - sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", - strip_prefix = "protobuf-27.0", - url = "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protobuf-27.0.tar.gz", -) - -http_archive( - name = "rules_cc", - sha256 = "d9bdd3ec66b6871456ec9c965809f43a0901e692d754885e89293807762d3d80", - strip_prefix = "rules_cc-0.0.13", - urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.13/rules_cc-0.0.13.tar.gz"], -) - local_repository( name = "rules_python", path = "../../..", diff --git a/tests/integration/ignore_root_user_error/WORKSPACE b/tests/integration/ignore_root_user_error/WORKSPACE index a1aa5b5009..0a25819ecd 100644 --- a/tests/integration/ignore_root_user_error/WORKSPACE +++ b/tests/integration/ignore_root_user_error/WORKSPACE @@ -1,19 +1,5 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -http_archive( - name = "protobuf", - sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", - strip_prefix = "protobuf-27.0", - url = "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protobuf-27.0.tar.gz", -) - -http_archive( - name = "rules_cc", - sha256 = "d9bdd3ec66b6871456ec9c965809f43a0901e692d754885e89293807762d3d80", - strip_prefix = "rules_cc-0.0.13", - urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.13/rules_cc-0.0.13.tar.gz"], -) - local_repository( name = "rules_python", path = "../../..", diff --git a/tests/integration/pip_parse/WORKSPACE b/tests/integration/pip_parse/WORKSPACE index e22fbedca2..db0cd0c7c8 100644 --- a/tests/integration/pip_parse/WORKSPACE +++ b/tests/integration/pip_parse/WORKSPACE @@ -1,19 +1,3 @@ -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") - -http_archive( - name = "protobuf", - sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", - strip_prefix = "protobuf-27.0", - url = "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protobuf-27.0.tar.gz", -) - -http_archive( - name = "rules_cc", - sha256 = "d9bdd3ec66b6871456ec9c965809f43a0901e692d754885e89293807762d3d80", - strip_prefix = "rules_cc-0.0.13", - urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.13/rules_cc-0.0.13.tar.gz"], -) - local_repository( name = "rules_python", path = "../../..", diff --git a/tests/integration/py_cc_toolchain_registered/WORKSPACE b/tests/integration/py_cc_toolchain_registered/WORKSPACE index b9d9f0f560..de908549c0 100644 --- a/tests/integration/py_cc_toolchain_registered/WORKSPACE +++ b/tests/integration/py_cc_toolchain_registered/WORKSPACE @@ -1,19 +1,3 @@ -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") - -http_archive( - name = "protobuf", - sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", - strip_prefix = "protobuf-27.0", - url = "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protobuf-27.0.tar.gz", -) - -http_archive( - name = "rules_cc", - sha256 = "d9bdd3ec66b6871456ec9c965809f43a0901e692d754885e89293807762d3d80", - strip_prefix = "rules_cc-0.0.13", - urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.13/rules_cc-0.0.13.tar.gz"], -) - local_repository( name = "rules_python", path = "../../..", From c7a20785bd158f04680be0b7270c76cf6fe4b4cb Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 24 Oct 2024 19:33:46 -0700 Subject: [PATCH 276/345] docs: link to main docs in generated release notes (#2338) The generated release notes provide some very simple copy/paste quick start, but don't tell where to find more detailed info. Link to our main docs so users know where to find out more. Along the way: * Drop Bazel 6 mention. It'll be unsupported pretty soon. * Drop "bzlmod is beta" mention, since the APIs are stable enough (and stability is better covered in other docs which can handle the nuance of what is/isn't GA) --- .github/workflows/create_archive_and_notes.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/create_archive_and_notes.sh b/.github/workflows/create_archive_and_notes.sh index ffeecd5800..0bc14f936b 100755 --- a/.github/workflows/create_archive_and_notes.sh +++ b/.github/workflows/create_archive_and_notes.sh @@ -25,9 +25,10 @@ git archive --format=tar --prefix=${PREFIX}/ ${TAG} | gzip > $ARCHIVE 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: From 7d4b8a559c59339f6916f1aa6358132194842537 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 25 Oct 2024 11:46:08 +0900 Subject: [PATCH 277/345] chore: bump twine dependencies and cleanup for 1.0 (#2333) This change updates the `requirements.txt` for all of the platforms for the `twine` component that is used in wheel publishing rules. Before that the deps would be maintained by `dependabot.txt` and it seems that it would constantly exclude the `requirements.txt` from the updated files, this means that the `requirements.txt` (used on Linux) has gone out of sync and it would be better to use a different mechanism to keep them in sync. Hence the proposal is to: - Use `uv` to sync the requirements. - Add `requirements_linux.txt` to explicitly highlight that the file is for Linux. - Keep `requirements.txt` but note that it is deprecated. - Add `requirements_universal.txt` in case people want to use a single requirements file. - Bump the dependencies to the latest versions and bring them back in sync. Whilst at it I had to: - support extra parameters in the locking format and allow setting visibility - chore: add `rules_multirun` as a `dev_dependency` - refactor: `uv pip compile` requirements for tools/publish - chore: bump uv to 0.4.25 --- .bazelrc | 4 +- CHANGELOG.md | 12 +- CONTRIBUTING.md | 9 + DEVELOPING.md | 6 +- MODULE.bazel | 5 +- docs/BUILD.bazel | 1 + docs/requirements.txt | 130 +-- examples/bzlmod/MODULE.bazel | 2 +- examples/bzlmod/MODULE.bazel.lock | 1291 ++++++++++++---------- internal_deps.bzl | 6 + private/BUILD.bazel | 28 + python/uv/private/lock.bzl | 25 +- python/uv/private/versions.bzl | 16 +- tools/private/BUILD.bazel | 0 tools/private/publish_deps.bzl | 29 + tools/private/update_deps/BUILD.bazel | 1 + tools/publish/BUILD.bazel | 28 +- tools/publish/requirements.txt | 551 ++++----- tools/publish/requirements_darwin.txt | 140 ++- tools/publish/requirements_linux.txt | 339 ++++++ tools/publish/requirements_universal.txt | 343 ++++++ tools/publish/requirements_windows.txt | 146 +-- tools/publish/requirementslinux.txt | 352 ++++++ 23 files changed, 2419 insertions(+), 1045 deletions(-) create mode 100644 private/BUILD.bazel create mode 100644 tools/private/BUILD.bazel create mode 100644 tools/private/publish_deps.bzl create mode 100644 tools/publish/requirements_linux.txt create mode 100644 tools/publish/requirements_universal.txt create mode 100644 tools/publish/requirementslinux.txt diff --git a/.bazelrc b/.bazelrc index c44124d961..66a644e289 100644 --- a/.bazelrc +++ b/.bazelrc @@ -4,8 +4,8 @@ # (Note, we cannot use `common --deleted_packages` because the bazel version command doesn't support it) # To update these lines, execute # `bazel run @rules_bazel_integration_test//tools:update_deleted_packages` -build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered -query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered test --test_output=errors diff --git a/CHANGELOG.md b/CHANGELOG.md index cb26593437..893e5e55f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,18 +31,24 @@ A brief description of the categories of changes: 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. {#v0-0-0-fixed} ### Fixed -- Nothing yet +* Nothing yet {#v0-0-0-added} ### Added -- Nothing yet +* (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. {#v0-0-0-removed} ### Removed -- Nothing yet +* Nothing yet {#v0-37-1} ## [0.37.1] - 2024-10-22 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a31781a89e..d5f24a9365 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -65,6 +65,15 @@ and setup. Subsequent runs will be faster, but there are many tests, and some of 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 diff --git a/DEVELOPING.md b/DEVELOPING.md index 0601be5478..1041039f9d 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: ``` diff --git a/MODULE.bazel b/MODULE.bazel index 0cbae38e30..de14b86f1b 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -59,8 +59,8 @@ pip.parse( 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_*", }, ) @@ -73,6 +73,7 @@ bazel_dep(name = "stardoc", version = "0.6.2", repo_name = "io_bazel_stardoc") bazel_dep(name = "rules_bazel_integration_test", version = "0.20.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_multirun", version = "0.9.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. @@ -140,7 +141,7 @@ uv = use_extension( "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/docs/BUILD.bazel b/docs/BUILD.bazel index 33d93fd8ae..d16a27e74f 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -158,6 +158,7 @@ lock( 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/requirements.txt b/docs/requirements.txt index 6862888a7b..2e306cd5b5 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -10,9 +10,9 @@ alabaster==1.0.0 \ --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 \ @@ -161,68 +161,68 @@ markdown-it-py==3.0.0 \ # 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 \ diff --git a/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel index e9d69c5ab8..0e5c2c8a2d 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -93,7 +93,7 @@ use_repo(python, "python_3_10", "python_3_9", "python_versions", "pythons_hub") # 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") diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 25930d11c5..286e8c0b01 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -6300,11 +6300,11 @@ "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { "bzlTransitiveDigest": "mzsyVW4M380vwEPTn/pDXFMh5gtTHsv0sbqZCE7a1SY=", - "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", + "usagesDigest": "LYtSAPzhPjmfD9vF39mCED1UQSvHEo2Hv+aK5Z4ZWWc=", "recordedFileInputs": { - "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", - "@@rules_python~//tools/publish/requirements_windows.txt": "a24d2aeea74a744a0aad1ac262cb9fb9e2f6f14f8d08d4f11a84f3f54da81231", - "@@rules_python~//tools/publish/requirements_darwin.txt": "186c9e45c372e30cae42e31696420a9065580147f71bd834e3e3ba477842bb5a" + "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", + "@@rules_python~//tools/publish/requirements_windows.txt": "7673adc71dc1a81d3661b90924d7a7c0fc998cd508b3cb4174337cef3f2de556", + "@@rules_python~//tools/publish/requirements_darwin.txt": "2994136eab7e57b083c3de76faf46f70fad130bc8e7360a7fed2b288b69e79dc" }, "recordedDirentsInputs": {}, "envVariables": { @@ -6312,7 +6312,7 @@ "RULES_PYTHON_REPO_DEBUG_VERBOSITY": null }, "generatedRepoSpecs": { - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_aarch64_3548db28": { + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6322,24 +6322,7 @@ "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_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5": { - "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_x86_64", "cp311_osx_aarch64", "cp311_osx_x86_64", "cp311_windows_x86_64" @@ -6354,7 +6337,7 @@ ] } }, - "rules_python_publish_deps_311_urllib3_sdist_076907bf": { + "rules_python_publish_deps_311_cffi_sdist_1c39c601": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6366,17 +6349,17 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "urllib3-1.26.14.tar.gz", + "filename": "cffi-1.17.1.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", + "requirement": "cffi==1.17.1", + "sha256": "1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", "urls": [ - "https://files.pythonhosted.org/packages/c5/52/fe421fb7364aa738b3506a2d99e4f3a56e079c0a798e9f4fa5e14c60922f/urllib3-1.26.14.tar.gz" + "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz" ] } }, - "rules_python_publish_deps_311_zipp_sdist_a7a22e05": { + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6386,19 +6369,22 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "zipp-3.11.0.tar.gz", + "filename": "charset_normalizer-3.4.0-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": "zipp==3.11.0", - "sha256": "a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766", + "requirement": "charset-normalizer==3.4.0", + "sha256": "6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", "urls": [ - "https://files.pythonhosted.org/packages/8e/b3/8b16a007184714f71157b1a71bbe632c5d66dd43bc8152b3c799b13881e1/zipp-3.11.0.tar.gz" + "https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl" ] } }, - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_91fc98ad": { + "rules_python_publish_deps_311_urllib3_py3_none_any_ca899ca0": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6408,19 +6394,22 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", + "filename": "urllib3-2.2.3-py3-none-any.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", + "requirement": "urllib3==2.2.3", + "sha256": "ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", "urls": [ - "https://files.pythonhosted.org/packages/5d/4e/4e0bb5579b01fdbfd4388bd1eb9394a989e1336203a4b7f700d887b233c1/cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_requests_py3_none_any_64299f49": { + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_3710a975": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6435,17 +6424,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "requests-2.28.2-py3-none-any.whl", + "filename": "charset_normalizer-3.4.0-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": "requests==2.28.2", - "sha256": "64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa", + "requirement": "charset-normalizer==3.4.0", + "sha256": "3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", "urls": [ - "https://files.pythonhosted.org/packages/d2/f4/274d1dbe96b41cf4e0efb70cbced278ffd61b5c7bb70338b62af94ccb25b/requests-2.28.2-py3-none-any.whl" + "https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" ] } }, - "rules_python_publish_deps_311_certifi_sdist_35824b4c": { + "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_x86_64_0f996e72": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6457,37 +6446,17 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "certifi-2022.12.7.tar.gz", + "filename": "cryptography-43.0.3-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": "certifi==2022.12.7", - "sha256": "35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3", + "requirement": "cryptography==43.0.3", + "sha256": "0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4", "urls": [ - "https://files.pythonhosted.org/packages/37/f7/2b1b0ec44fdc30a3d31dfebe52226be9ddc40cd6c0f34ffc8923ba423b69/certifi-2022.12.7.tar.gz" + "https://files.pythonhosted.org/packages/2a/2c/488776a3dc843f95f86d2f957ca0fc3407d0242b50bede7fad1e339be03f/cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" ] } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19": { - "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.4.0-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.4.0", - "sha256": "6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", - "urls": [ - "https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl" - ] - } - }, - "rules_python_publish_deps_311_readme_renderer_py3_none_any_f67a16ca": { + "rules_python_publish_deps_311_urllib3_sdist_e7d814a8": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6502,17 +6471,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "readme_renderer-37.3-py3-none-any.whl", + "filename": "urllib3-2.2.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": "f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343", + "requirement": "urllib3==2.2.3", + "sha256": "e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", "urls": [ - "https://files.pythonhosted.org/packages/97/52/fd8a77d6f0a9ddeb26ed8fb334e01ac546106bf0c5b8e40dc826c5bd160f/readme_renderer-37.3-py3-none-any.whl" + "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz" ] } }, - "rules_python_publish_deps_311_cffi_sdist_d400bfb9": { + "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_e1be4655": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6524,17 +6493,17 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "cffi-1.15.1.tar.gz", + "filename": "cryptography-43.0.3-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": "cffi==1.15.1", - "sha256": "d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", + "requirement": "cryptography==43.0.3", + "sha256": "e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16", "urls": [ - "https://files.pythonhosted.org/packages/2b/a8/050ab4f0c3d4c1b8aaa805f70e26e84d0e27004907c5b8ecc1d31815f92a/cffi-1.15.1.tar.gz" + "https://files.pythonhosted.org/packages/21/ce/b9c9ff56c7164d8e2edfb6c9305045fbc0df4508ccfdb13ee66eb8c95b0e/cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl" ] } }, - "rules_python_publish_deps_311_requests_toolbelt_py2_none_any_18565aa5": { + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_armv7l_0411beb0": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6549,17 +6518,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "requests_toolbelt-0.10.1-py2.py3-none-any.whl", + "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.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", + "requirement": "nh3==0.2.18", + "sha256": "0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164", "urls": [ - "https://files.pythonhosted.org/packages/05/d3/bf87a36bff1cb88fd30a509fd366c70ec30676517ee791b2f77e0e29817a/requests_toolbelt-0.10.1-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/05/2b/85977d9e11713b5747595ee61f381bc820749daf83f07b90b6c9964cf932/nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" ] } }, - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_x86_64_94411f22": { + "rules_python_publish_deps_311_charset_normalizer_sdist_223217c3": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6569,19 +6538,22 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "filename": "charset_normalizer-3.4.0.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": "94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", + "requirement": "charset-normalizer==3.4.0", + "sha256": "223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", "urls": [ - "https://files.pythonhosted.org/packages/37/5a/c37631a86be838bdd84cc0259130942bf7e6e32f70f4cab95f479847fb91/cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz" ] } }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_1_x86_64_6d0fbe73": { + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_47334db7": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6591,39 +6563,44 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "cryptography-42.0.4-cp39-abi3-musllinux_1_1_x86_64.whl", + "filename": "charset_normalizer-3.4.0-cp311-cp311-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": "6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257", + "requirement": "charset-normalizer==3.4.0", + "sha256": "47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", "urls": [ - "https://files.pythonhosted.org/packages/41/5d/33f17e40dbb7441ad51e8a6920e726f68443cdbfb388cb8eff53e4b6ffd4/cryptography-42.0.4-cp39-abi3-musllinux_1_1_x86_64.whl" + "https://files.pythonhosted.org/packages/d7/a1/493919799446464ed0299c8eef3c3fad0daf1c3cd48bff9263c731b0d9e2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl" ] } }, - "rules_python_publish_deps_311_charset_normalizer_sdist_223217c3": { + "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_46bf4316": { "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" + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" ], - "filename": "charset_normalizer-3.4.0.tar.gz", + "filename": "cffi-1.17.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.4.0", - "sha256": "223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", + "requirement": "cffi==1.17.1", + "sha256": "46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", "urls": [ - "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz" + "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" ] } }, - "rules_python_publish_deps_311_pygments_py3_none_any_fa7bd7bd": { + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_bf4475b8": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6638,17 +6615,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "Pygments-2.14.0-py3-none-any.whl", + "filename": "charset_normalizer-3.4.0-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": "pygments==2.14.0", - "sha256": "fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717", + "requirement": "charset-normalizer==3.4.0", + "sha256": "bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", "urls": [ - "https://files.pythonhosted.org/packages/0b/42/d9d95cc461f098f204cd20c85642ae40fbff81f74c300341b8d0e0df14e0/Pygments-2.14.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" ] } }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_1_aarch64_3c6048f2": { + "rules_python_publish_deps_311_cryptography_sdist_315b9001": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6660,17 +6637,17 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "cryptography-42.0.4-cp39-abi3-musllinux_1_1_aarch64.whl", + "filename": "cryptography-43.0.3.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": "3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff", + "requirement": "cryptography==43.0.3", + "sha256": "315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", "urls": [ - "https://files.pythonhosted.org/packages/ea/a1/04733ecbe1e77a228c738f4ab321ca050e45284997f3e3a1539461cd4bca/cryptography-42.0.4-cp39-abi3-musllinux_1_1_aarch64.whl" + "https://files.pythonhosted.org/packages/0d/05/07b55d1fa21ac18c3a8c79f764e2514e6f6a9698f1be44994f5adf0d29db/cryptography-43.0.3.tar.gz" ] } }, - "rules_python_publish_deps_311_bleach_py3_none_any_33c16e33": { + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64_5f36b271": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6685,17 +6662,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "bleach-6.0.0-py3-none-any.whl", + "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.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", + "requirement": "nh3==0.2.18", + "sha256": "5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189", "urls": [ - "https://files.pythonhosted.org/packages/ac/e2/dfcab68c9b2e7800c8f06b85c76e5f978d05b195a958daa9b1dda54a1db6/bleach-6.0.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/72/f2/5c894d5265ab80a97c68ca36f25c8f6f0308abac649aaf152b74e7e854a8/nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl" ] } }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_a1327f28": { + "rules_python_publish_deps_311_secretstorage_sdist_2403533e": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6707,17 +6684,17 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "cryptography-42.0.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "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": "cryptography==42.0.4", - "sha256": "a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52", + "requirement": "secretstorage==3.3.3", + "sha256": "2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77", "urls": [ - "https://files.pythonhosted.org/packages/44/61/644e21048102cd72a13325fd6443db741746fbf0157e7c5d5c7628afc336/cryptography-42.0.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "https://files.pythonhosted.org/packages/53/a4/f48c9d79cb507ed1373477dbceaba7401fd8a23af63b837fa61f1dcd3691/SecretStorage-3.3.3.tar.gz" ] } }, - "rules_python_publish_deps_311_jaraco_classes_sdist_89559fa5": { + "rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6732,17 +6709,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "jaraco.classes-3.2.3.tar.gz", + "filename": "jaraco_functools-4.1.0.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", + "requirement": "jaraco-functools==4.1.0", + "sha256": "70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d", "urls": [ - "https://files.pythonhosted.org/packages/bf/02/a956c9bfd2dfe60b30c065ed8e28df7fcf72b292b861dca97e951c145ef6/jaraco.classes-3.2.3.tar.gz" + "https://files.pythonhosted.org/packages/ab/23/9894b3df5d0a6eb44611c36aec777823fc2e07740dabbd0b810e19594013/jaraco_functools-4.1.0.tar.gz" ] } }, - "rules_python_publish_deps_311_keyring_py3_none_any_771ed2a9": { + "rules_python_publish_deps_311_pycparser_py3_none_any_c3702b6d": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6752,22 +6729,19 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "cp311_linux_x86_64" ], - "filename": "keyring-23.13.1-py3-none-any.whl", + "filename": "pycparser-2.22-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", + "requirement": "pycparser==2.22", + "sha256": "c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", "urls": [ - "https://files.pythonhosted.org/packages/62/db/0e9a09b2b95986dcd73ac78be6ed2bd73ebe8bac65cba7add5b83eb9d899/keyring-23.13.1-py3-none-any.whl" + "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8c7fe7af": { + "rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_aarch64_a9b15d49": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6779,17 +6753,17 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", + "filename": "cffi-1.17.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": "8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317", + "requirement": "cffi==1.17.1", + "sha256": "a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", "urls": [ - "https://files.pythonhosted.org/packages/df/c5/dd3a17a615775d0ffc3e12b0e47833d8b7e0a4871431dad87a3f92382a19/charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" + "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl" ] } }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_x86_64_6ffb03d4": { + "rules_python_publish_deps_311_idna_sdist_12f65c9b": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6799,19 +6773,22 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "cryptography-42.0.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "filename": "idna-3.10.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": "6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a", + "requirement": "idna==3.10", + "sha256": "12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", "urls": [ - "https://files.pythonhosted.org/packages/32/c2/4ff3cf950504aa6ccd3db3712f515151536eea0cf6125442015b0532a46d/cryptography-42.0.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz" ] } }, - "rules_python_publish_deps_311_rich_py3_none_any_7c963f0d": { + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6826,39 +6803,35 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "rich-13.2.0-py3-none-any.whl", + "filename": "nh3-0.2.18-cp37-abi3-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": "rich==13.2.0", - "sha256": "7c963f0d03819221e9ac561e1bc866e3f95a02248c1234daa48954e6d381c003", + "requirement": "nh3==0.2.18", + "sha256": "19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b", "urls": [ - "https://files.pythonhosted.org/packages/0e/cf/a6369a2aee266c2d7604230f083d4bd14b8f69bc69eb25b3da63b9f2f853/rich-13.2.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/c2/a8/3bb02d0c60a03ad3a112b76c46971e9480efa98a8946677b5a59f60130ca/nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl" ] } }, - "rules_python_publish_deps_311_secretstorage_sdist_2403533e": { + "rules_python_publish_deps_311_pywin32_ctypes_sdist_d162dc04": { "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_windows_x86_64" ], - "filename": "SecretStorage-3.3.3.tar.gz", + "filename": "pywin32-ctypes-0.2.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", + "requirement": "pywin32-ctypes==0.2.3", + "sha256": "d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", "urls": [ - "https://files.pythonhosted.org/packages/53/a4/f48c9d79cb507ed1373477dbceaba7401fd8a23af63b837fa61f1dcd3691/SecretStorage-3.3.3.tar.gz" + "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz" ] } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_1_ppc64le_5995f016": { + "rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6868,19 +6841,22 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl", + "filename": "readme_renderer-44.0-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": "5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc", + "requirement": "readme-renderer==44.0", + "sha256": "2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151", "urls": [ - "https://files.pythonhosted.org/packages/86/eb/31c9025b4ed7eddd930c5f2ac269efb953de33140608c7539675d74a2081/charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl" + "https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_887623fe": { + "rules_python_publish_deps_311_pygments_sdist_786ff802": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6890,39 +6866,22 @@ "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_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_linux_x86_64", "cp311_osx_aarch64", "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "idna-3.10.tar.gz", + "filename": "pygments-2.18.0.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", + "requirement": "pygments==2.18.0", + "sha256": "786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", "urls": [ - "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz" + "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz" ] } }, - "rules_python_publish_deps_311_more_itertools_sdist_5a6257e4": { + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_f1a2f519": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6937,17 +6896,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "more-itertools-9.0.0.tar.gz", + "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.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": "5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab", + "requirement": "charset-normalizer==3.4.0", + "sha256": "f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", "urls": [ - "https://files.pythonhosted.org/packages/13/b3/397aa9668da8b1f0c307bc474608653d46122ae0563d1d32f60e24fa0cbd/more-itertools-9.0.0.tar.gz" + "https://files.pythonhosted.org/packages/75/d2/0ab54463d3410709c09266dfb416d032a08f97fd7d60e94b8c6ef54ae14b/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl" ] } }, - "rules_python_publish_deps_311_importlib_metadata_py3_none_any_7efb448e": { + "rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6962,17 +6921,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "importlib_metadata-6.0.0-py3-none-any.whl", + "filename": "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.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", + "requirement": "nh3==0.2.18", + "sha256": "14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86", "urls": [ - "https://files.pythonhosted.org/packages/26/a7/9da7d5b23fc98ab3d424ac2c65613d63c1f401efb84ad50f2fa27b2caab4/importlib_metadata-6.0.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/b3/89/1daff5d9ba5a95a157c092c7c5f39b8dd2b1ddb4559966f808d31cfb67e0/nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl" ] } }, - "rules_python_publish_deps_311_importlib_metadata_sdist_e354bede": { + "rules_python_publish_deps_311_zipp_py3_none_any_a817ac80": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6987,17 +6946,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "importlib_metadata-6.0.0.tar.gz", + "filename": "zipp-3.20.2-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": "e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d", + "requirement": "zipp==3.20.2", + "sha256": "a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", "urls": [ - "https://files.pythonhosted.org/packages/90/07/6397ad02d31bddf1841c9ad3ec30a693a3ff208e09c2ef45c9a8a5f85156/importlib_metadata-6.0.0.tar.gz" + "https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_1_x86_64_761e8904": { + "rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7007,19 +6966,22 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", + "filename": "backports_tarfile-1.2.0.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": "761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6", + "requirement": "backports-tarfile==1.2.0", + "sha256": "d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", "urls": [ - "https://files.pythonhosted.org/packages/82/49/ab81421d5aa25bc8535896a017c93204cb4051f2a4e72b1ad8f3b594e072/charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl" + "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz" ] } }, - "rules_python_publish_deps_311_certifi_py3_none_any_4ad3232f": { + "rules_python_publish_deps_311_jeepney_py3_none_any_c0a454ad": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7031,17 +6993,17 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "certifi-2022.12.7-py3-none-any.whl", + "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": "certifi==2022.12.7", - "sha256": "4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18", + "requirement": "jeepney==0.8.0", + "sha256": "c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755", "urls": [ - "https://files.pythonhosted.org/packages/71/4c/3db2b8021bd6f2f0ceb0e088d6b2d49147671f25832fb17970e9b583d742/certifi-2022.12.7-py3-none-any.whl" + "https://files.pythonhosted.org/packages/ae/72/2a1e2290f1ab1e06f71f3d0f1646c9e4634e70e1d37491535e19266e8dc9/jeepney-0.8.0-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_jeepney_py3_none_any_c0a454ad": { + "rules_python_publish_deps_311_secretstorage_py3_none_any_f356e662": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7053,17 +7015,17 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "jeepney-0.8.0-py3-none-any.whl", + "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": "jeepney==0.8.0", - "sha256": "c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755", + "requirement": "secretstorage==3.3.3", + "sha256": "f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99", "urls": [ - "https://files.pythonhosted.org/packages/ae/72/2a1e2290f1ab1e06f71f3d0f1646c9e4634e70e1d37491535e19266e8dc9/jeepney-0.8.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_secretstorage_py3_none_any_f356e662": { + "rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7073,19 +7035,22 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "SecretStorage-3.3.3-py3-none-any.whl", + "filename": "jaraco.classes-3.4.0.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": "f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99", + "requirement": "jaraco-classes==3.4.0", + "sha256": "47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", "urls": [ - "https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl" + "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz" ] } }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_44a64043": { + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7095,19 +7060,22 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "cryptography-42.0.4-cp39-abi3-manylinux_2_28_x86_64.whl", + "filename": "charset_normalizer-3.4.0-cp311-cp311-win_amd64.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", + "requirement": "charset-normalizer==3.4.0", + "sha256": "cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", "urls": [ - "https://files.pythonhosted.org/packages/7e/45/81f378eb85aab14b229c1032ba3694eff85a3d75b35092c3e71abd2d34f6/cryptography-42.0.4-cp39-abi3-manylinux_2_28_x86_64.whl" + "https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl" ] } }, - "rules_python_publish_deps_311_idna_py3_none_any_90b77e79": { + "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_df6b6c6d": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7119,17 +7087,17 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "idna-3.4-py3-none-any.whl", + "filename": "cryptography-43.0.3-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": "idna==3.4", - "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2", + "requirement": "cryptography==43.0.3", + "sha256": "df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73", "urls": [ - "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl" + "https://files.pythonhosted.org/packages/2a/33/b3682992ab2e9476b9c81fff22f02c8b0a1e6e1d49ee1750a67d85fd7ed2/cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl" ] } }, - "rules_python_publish_deps_311_urllib3_py2_none_any_75edcdc2": { + "rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7139,39 +7107,47 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "urllib3-1.26.14-py2.py3-none-any.whl", + "filename": "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.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", + "requirement": "nh3==0.2.18", + "sha256": "7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811", "urls": [ - "https://files.pythonhosted.org/packages/fe/ca/466766e20b767ddb9b951202542310cba37ea5f2d792dae7589f1741af58/urllib3-1.26.14-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/2c/b6/42fc3c69cabf86b6b81e4c051a9b6e249c5ba9f8155590222c2622961f58/nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl" ] } }, - "rules_python_publish_deps_311_urllib3_sdist_3e3d753a": { + "rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3": { "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": "urllib3-1.26.19.tar.gz", + "filename": "requests-toolbelt-1.0.0.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", + "requirement": "requests-toolbelt==1.0.0", + "sha256": "7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", "urls": [ - "https://files.pythonhosted.org/packages/c8/93/65e479b023bbc46dab3e092bda6b0005424ea3217d711964ccdede3f9b1b/urllib3-1.26.19.tar.gz" + "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz" ] } }, - "rules_python_publish_deps_311_charset_normalizer_py3_none_any_7e189e2e": { + "rules_python_publish_deps_311_rich_py3_none_any_9836f509": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7181,57 +7157,72 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "charset_normalizer-3.0.1-py3-none-any.whl", + "filename": "rich-13.9.3-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", + "requirement": "rich==13.9.3", + "sha256": "9836f5096eb2172c9e77df411c1b009bace4193d6a481d534fea75ebba758283", "urls": [ - "https://files.pythonhosted.org/packages/68/2b/02e9d6a98ddb73fa238d559a9edcc30b247b8dc4ee848b6184c936e99dc0/charset_normalizer-3.0.1-py3-none-any.whl" + "https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f": { + "rules_python_publish_deps_311_importlib_metadata_py3_none_any_45e54197": { "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": "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", + "filename": "importlib_metadata-8.5.0-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.4.0", - "sha256": "cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", + "requirement": "importlib-metadata==8.5.0", + "sha256": "45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", "urls": [ - "https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl" + "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_pywin32_ctypes_py2_none_any_9dc2d991": { + "rules_python_publish_deps_311_twine_py3_none_any_215dbe7b": { "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": "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", + "filename": "twine-5.1.1-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", + "requirement": "twine==5.1.1", + "sha256": "215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997", "urls": [ - "https://files.pythonhosted.org/packages/9e/4b/3ab2720f1fa4b4bc924ef1932b842edf10007e4547ea8157b0b9fc78599a/pywin32_ctypes-0.2.0-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/5d/ec/00f9d5fd040ae29867355e559a94e9a8429225a0284a3f5f091a3878bfc0/twine-5.1.1-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_twine_sdist_9e102ef5": { + "rules_python_publish_deps_311_docutils_sdist_3a6b1873": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7246,17 +7237,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "twine-4.0.2.tar.gz", + "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": "twine==4.0.2", - "sha256": "9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8", + "requirement": "docutils==0.21.2", + "sha256": "3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", "urls": [ - "https://files.pythonhosted.org/packages/b7/1a/a7884359429d801cd63c2c5512ad0a337a509994b0e42d9696d4778d71f6/twine-4.0.2.tar.gz" + "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz" ] } }, - "rules_python_publish_deps_311_pkginfo_py3_none_any_4b7a555a": { + "rules_python_publish_deps_311_keyring_sdist_b07ebc55": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7271,17 +7262,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "pkginfo-1.9.6-py3-none-any.whl", + "filename": "keyring-25.4.1.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": "4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546", + "requirement": "keyring==25.4.1", + "sha256": "b07ebc55f3e8ed86ac81dd31ef14e81ace9dd9c3d4b5d77a6e9a2016d0d71a1b", "urls": [ - "https://files.pythonhosted.org/packages/b3/f2/6e95c86a23a30fa205ea6303a524b20cbae27fbee69216377e3d95266406/pkginfo-1.9.6-py3-none-any.whl" + "https://files.pythonhosted.org/packages/a5/1c/2bdbcfd5d59dc6274ffb175bc29aa07ecbfab196830e0cfbde7bd861a2ea/keyring-25.4.1.tar.gz" ] } }, - "rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_cc4d65ae": { + "rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7291,39 +7282,47 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", + "filename": "markdown_it_py-3.0.0-py3-none-any.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", + "requirement": "markdown-it-py==3.0.0", + "sha256": "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", "urls": [ - "https://files.pythonhosted.org/packages/d3/56/3e94aa719ae96eeda8b68b3ec6e347e0a23168c6841dc276ccdcdadc9f32/cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl" + "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_docutils_sdist_3a6b1873": { + "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_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": "docutils-0.21.2.tar.gz", + "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": "docutils==0.21.2", - "sha256": "3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", + "requirement": "certifi==2024.8.30", + "sha256": "922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", "urls": [ - "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz" + "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_cryptography_sdist_831a4b37": { + "rules_python_publish_deps_311_more_itertools_sdist_5482bfef": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7333,35 +7332,43 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "cryptography-42.0.4.tar.gz", + "filename": "more-itertools-10.5.0.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", + "requirement": "more-itertools==10.5.0", + "sha256": "5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6", "urls": [ - "https://files.pythonhosted.org/packages/81/d8/214d25515bf6034dce99aba22eeb47443b14c82160114e3d3f33067c6d3b/cryptography-42.0.4.tar.gz" + "https://files.pythonhosted.org/packages/51/78/65922308c4248e0eb08ebcbe67c95d48615cc6f27854b6f2e57143e9178f/more-itertools-10.5.0.tar.gz" ] } }, - "rules_python_publish_deps_311_certifi_py3_none_any_922820b5": { + "rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819": { "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": "certifi-2024.8.30-py3-none-any.whl", + "filename": "nh3-0.2.18-cp37-abi3-win_amd64.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", + "requirement": "nh3==0.2.18", + "sha256": "8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844", "urls": [ - "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl" + "https://files.pythonhosted.org/packages/26/8d/53c5b19c4999bdc6ba95f246f4ef35ca83d7d7423e5e38be43ad66544e5d/nh3-0.2.18-cp37-abi3-win_amd64.whl" ] } }, @@ -7371,6 +7378,11 @@ "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" @@ -7391,6 +7403,11 @@ "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" @@ -7405,7 +7422,7 @@ ] } }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_ce8613be": { + "rules_python_publish_deps_311_mdurl_py3_none_any_84008a41": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7415,19 +7432,22 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "cryptography-42.0.4-cp39-abi3-musllinux_1_2_x86_64.whl", + "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": "cryptography==42.0.4", - "sha256": "ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0", + "requirement": "mdurl==0.1.2", + "sha256": "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", "urls": [ - "https://files.pythonhosted.org/packages/a2/8e/dac70232d4231c53448e29aa4b768cf82d891fcfd6e0caa7ace242da8c9b/cryptography-42.0.4-cp39-abi3-musllinux_1_2_x86_64.whl" + "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_mdurl_py3_none_any_84008a41": { + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_bcb4f8ea": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7442,37 +7462,39 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "mdurl-0.1.2-py3-none-any.whl", + "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.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", + "requirement": "charset-normalizer==3.4.0", + "sha256": "bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", "urls": [ - "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl" + "https://files.pythonhosted.org/packages/ee/44/4f62042ca8cdc0cabf87c0fc00ae27cd8b53ab68be3605ba6d071f742ad3/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl" ] } }, - "rules_python_publish_deps_311_zipp_sdist_bf1dcf64": { + "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_s390x_a24ed04c": { "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" + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" ], - "filename": "zipp-3.19.2.tar.gz", + "filename": "cffi-1.17.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": "zipp==3.19.2", - "sha256": "bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19", + "requirement": "cffi==1.17.1", + "sha256": "a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", "urls": [ - "https://files.pythonhosted.org/packages/d3/20/b48f58857d98dcb78f9e30ed2cfe533025e2e9827bbd36ea0a64cc00cbc1/zipp-3.19.2.tar.gz" + "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" ] } }, - "rules_python_publish_deps_311_more_itertools_py3_none_any_250e83d7": { + "rules_python_publish_deps_311_mdurl_sdist_bb413d29": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7487,17 +7509,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "more_itertools-9.0.0-py3-none-any.whl", + "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": "more-itertools==9.0.0", - "sha256": "250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41", + "requirement": "mdurl==0.1.2", + "sha256": "bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", "urls": [ - "https://files.pythonhosted.org/packages/5d/87/1ec3fcc09d2c04b977eabf8a1083222f82eaa2f46d5a4f85f403bf8e7b30/more_itertools-9.0.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz" ] } }, - "rules_python_publish_deps_311_keyring_sdist_ba2e15a9": { + "rules_python_publish_deps_311_keyring_py3_none_any_5426f817": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7512,17 +7534,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "keyring-23.13.1.tar.gz", + "filename": "keyring-25.4.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": "ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678", + "requirement": "keyring==25.4.1", + "sha256": "5426f817cf7f6f007ba5ec722b1bcad95a75b27d780343772ad76b17cb47b0bf", "urls": [ - "https://files.pythonhosted.org/packages/55/fe/282f4c205add8e8bb3a1635cbbac59d6def2e0891b145aa553a0e40dd2d0/keyring-23.13.1.tar.gz" + "https://files.pythonhosted.org/packages/83/25/e6d59e5f0a0508d0dca8bb98c7f7fd3772fc943ac3f53d5ab18a218d32c0/keyring-25.4.1-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_mdurl_sdist_bb413d29": { + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7537,13 +7559,13 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "mdurl-0.1.2.tar.gz", + "filename": "nh3-0.2.18-cp37-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": "mdurl==0.1.2", - "sha256": "bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", + "requirement": "nh3==0.2.18", + "sha256": "42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200", "urls": [ - "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz" + "https://files.pythonhosted.org/packages/45/b9/833f385403abaf0023c6547389ec7a7acf141ddd9d1f21573723a6eab39a/nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" ] } }, @@ -7572,7 +7594,7 @@ ] } }, - "rules_python_publish_deps_311_six_py2_none_any_8abb2f1d": { + "rules_python_publish_deps_311_twine_sdist_9aa08251": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7587,17 +7609,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "six-1.16.0-py2.py3-none-any.whl", + "filename": "twine-5.1.1.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": "8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", + "requirement": "twine==5.1.1", + "sha256": "9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db", "urls": [ - "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/77/68/bd982e5e949ef8334e6f7dcf76ae40922a8750aa2e347291ae1477a4782b/twine-5.1.1.tar.gz" ] } }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_1df6fcbf": { + "rules_python_publish_deps_311_pkginfo_sdist_5df73835": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7607,19 +7629,22 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "cryptography-42.0.4-cp39-abi3-manylinux_2_28_aarch64.whl", + "filename": "pkginfo-1.10.0.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": "1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9", + "requirement": "pkginfo==1.10.0", + "sha256": "5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297", "urls": [ - "https://files.pythonhosted.org/packages/4c/e1/18056b2c0e4ba031ea6b9d660bc2bdf491f7ef64ab7ef1a803a03a8b8d26/cryptography-42.0.4-cp39-abi3-manylinux_2_28_aarch64.whl" + "https://files.pythonhosted.org/packages/2f/72/347ec5be4adc85c182ed2823d8d1c7b51e13b9a6b0c1aae59582eca652df/pkginfo-1.10.0.tar.gz" ] } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_14e76c0f": { + "rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7629,19 +7654,22 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "filename": "backports.tarfile-1.2.0-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": "14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b", + "requirement": "backports-tarfile==1.2.0", + "sha256": "77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", "urls": [ - "https://files.pythonhosted.org/packages/c0/4d/6b82099e3f25a9ed87431e2f51156c14f3a9ce8fad73880a3856cd95f1d5/charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_readme_renderer_sdist_cd653186": { + "rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7656,17 +7684,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "readme_renderer-37.3.tar.gz", + "filename": "markdown-it-py-3.0.0.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", + "requirement": "markdown-it-py==3.0.0", + "sha256": "e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", "urls": [ - "https://files.pythonhosted.org/packages/81/c3/d20152fcd1986117b898f66928938f329d0c91ddc47f081c58e64e0f51dc/readme_renderer-37.3.tar.gz" + "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz" ] } }, - "rules_python_publish_deps_311_markdown_it_py_py3_none_any_93de681e": { + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_ce031db0": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7681,17 +7709,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "markdown_it_py-2.1.0-py3-none-any.whl", + "filename": "charset_normalizer-3.4.0-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": "markdown-it-py==2.1.0", - "sha256": "93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27", + "requirement": "charset-normalizer==3.4.0", + "sha256": "ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", "urls": [ - "https://files.pythonhosted.org/packages/f9/3f/ecd1b708973b9a3e4574b43cffc1ce8eb98696da34f1a1c44a68c3c0d737/markdown_it_py-2.1.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/e2/29/d227805bff72ed6d6cb1ce08eec707f7cfbd9868044893617eb331f16295/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" ] } }, - "rules_python_publish_deps_311_six_sdist_1e61c374": { + "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7706,37 +7734,42 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "six-1.16.0.tar.gz", + "filename": "nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", - "requirement": "six==1.16.0", - "sha256": "1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "requirement": "nh3==0.2.18", + "sha256": "f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe", "urls": [ - "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz" + "https://files.pythonhosted.org/packages/a3/da/0c4e282bc3cff4a0adf37005fa1fb42257673fbc1bbf7d1ff639ec3d255a/nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl" ] } }, - "rules_python_publish_deps_311_idna_py3_none_any_946d195a": { + "rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2": { "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": "idna-3.10-py3-none-any.whl", + "filename": "pkginfo-1.10.0-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", + "requirement": "pkginfo==1.10.0", + "sha256": "889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097", "urls": [ - "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl" + "https://files.pythonhosted.org/packages/56/09/054aea9b7534a15ad38a363a2bd974c20646ab1582a387a95b8df1bfea1c/pkginfo-1.10.0-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_twine_py3_none_any_929bc3c2": { + "rules_python_publish_deps_311_idna_py3_none_any_946d195a": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7751,17 +7784,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "twine-4.0.2-py3-none-any.whl", + "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": "twine==4.0.2", - "sha256": "929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8", + "requirement": "idna==3.10", + "sha256": "946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", "urls": [ - "https://files.pythonhosted.org/packages/3a/38/a3f27a9e8ce45523d7d1e28c09e9085b61a98dab15d35ec086f36a44b37c/twine-4.0.2-py3-none-any.whl" + "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_1_s390x_4a8fcf28": { + "rules_python_publish_deps_311_nh3_sdist_94a16692": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7771,19 +7804,22 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl", + "filename": "nh3-0.2.18.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": "4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b", + "requirement": "nh3==0.2.18", + "sha256": "94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4", "urls": [ - "https://files.pythonhosted.org/packages/80/54/183163f9910936e57a60ee618f4f5cc91c2f8333ee2d4ebc6c50f6c8684d/charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl" + "https://files.pythonhosted.org/packages/62/73/10df50b42ddb547a907deeb2f3c9823022580a7a47281e8eae8e003a9639/nh3-0.2.18.tar.gz" ] } }, - "rules_python_publish_deps_311_webencodings_sdist_b36a1c24": { + "rules_python_publish_deps_311_requests_sdist_55365417": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7798,17 +7834,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "webencodings-0.5.1.tar.gz", + "filename": "requests-2.32.3.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", + "requirement": "requests==2.32.3", + "sha256": "55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", "urls": [ - "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz" + "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz" ] } }, - "rules_python_publish_deps_311_markdown_it_py_sdist_cf7e59fe": { + "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_846da004": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7818,22 +7854,19 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "cp311_linux_x86_64" ], - "filename": "markdown-it-py-2.1.0.tar.gz", + "filename": "cryptography-43.0.3-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": "markdown-it-py==2.1.0", - "sha256": "cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da", + "requirement": "cryptography==43.0.3", + "sha256": "846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5", "urls": [ - "https://files.pythonhosted.org/packages/33/e9/ac8a93e9eda3891ecdfecf5e01c060bbd2c44d4e3e77efc83b9c7ce9db32/markdown-it-py-2.1.0.tar.gz" + "https://files.pythonhosted.org/packages/2f/78/55356eb9075d0be6e81b59f45c7b48df87f76a20e73893872170471f3ee8/cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" ] } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_79909e27": { + "rules_python_publish_deps_311_pycparser_sdist_491c8be9": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7845,37 +7878,42 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "filename": "pycparser-2.22.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": "79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603", + "requirement": "pycparser==2.22", + "sha256": "491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", "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" + "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz" ] } }, - "rules_python_publish_deps_311_urllib3_py2_none_any_37a03444": { + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6": { "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": "urllib3-1.26.19-py2.py3-none-any.whl", + "filename": "nh3-0.2.18-cp37-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": "urllib3==1.26.19", - "sha256": "37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3", + "requirement": "nh3==0.2.18", + "sha256": "de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307", "urls": [ - "https://files.pythonhosted.org/packages/ae/6a/99eaaeae8becaa17a29aeb334a18e5d582d873b6f084c11f02581b8d7f7f/urllib3-1.26.19-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/1b/63/6ab90d0e5225ab9780f6c9fb52254fa36b52bb7c188df9201d05b647e5e1/nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" ] } }, - "rules_python_publish_deps_311_idna_sdist_814f528e": { + "rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7885,19 +7923,22 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "idna-3.4.tar.gz", + "filename": "pygments-2.18.0-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": "814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", + "requirement": "pygments==2.18.0", + "sha256": "b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", "urls": [ - "https://files.pythonhosted.org/packages/8b/e1/43beb3d38dba6cb420cefa297822eac205a277ab43e5ba5d5c46faf96438/idna-3.4.tar.gz" + "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_jaraco_classes_py3_none_any_2353de32": { + "rules_python_publish_deps_311_importlib_metadata_sdist_71522656": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7912,17 +7953,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "jaraco.classes-3.2.3-py3-none-any.whl", + "filename": "importlib_metadata-8.5.0.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": "2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158", + "requirement": "importlib-metadata==8.5.0", + "sha256": "71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", "urls": [ - "https://files.pythonhosted.org/packages/60/28/220d3ae0829171c11e50dded4355d17824d60895285631d7eb9dee0ab5e5/jaraco.classes-3.2.3-py3-none-any.whl" + "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz" ] } }, - "rules_python_publish_deps_311_pycparser_py2_none_any_8ee45429": { + "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_armv7l_3a157ab1": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7932,37 +7973,47 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "pycparser-2.21-py2.py3-none-any.whl", + "filename": "nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", - "requirement": "pycparser==2.21", - "sha256": "8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", + "requirement": "nh3==0.2.18", + "sha256": "3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a", "urls": [ - "https://files.pythonhosted.org/packages/62/d5/5f610ebe421e85889f2e55e33b7f9a6795bd982198517d912eb1c76e1a53/pycparser-2.21-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/de/81/c291231463d21da5f8bba82c8167a6d6893cc5419b0639801ee5d3aeb8a9/nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl" ] } }, - "rules_python_publish_deps_311_pywin32_ctypes_sdist_24ffc3b3": { + "rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48": { "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": "pywin32-ctypes-0.2.0.tar.gz", + "filename": "jaraco.context-6.0.1-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": "24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942", + "requirement": "jaraco-context==6.0.1", + "sha256": "f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", "urls": [ - "https://files.pythonhosted.org/packages/7a/7d/0dbc4c99379452a819b0fb075a0ffbb98611df6b6d59f54db67367af5bc0/pywin32-ctypes-0.2.0.tar.gz" + "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_rich_sdist_f1a00cdd": { + "rules_python_publish_deps_311_more_itertools_py3_none_any_037b0d32": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -7977,17 +8028,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "rich-13.2.0.tar.gz", + "filename": "more_itertools-10.5.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": "f1a00cdd3eebf999a15d85ec498bfe0b1a77efe9b34f645768a54132ef444ac5", + "requirement": "more-itertools==10.5.0", + "sha256": "037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef", "urls": [ - "https://files.pythonhosted.org/packages/9e/5e/c3dc3ea32e2c14bfe46e48de954dd175bff76bcc549dd300acb9689521ae/rich-13.2.0.tar.gz" + "https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_pkginfo_sdist_8fd5896e": { + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_63bc5c4a": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -8002,17 +8053,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "pkginfo-1.9.6.tar.gz", + "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", - "requirement": "pkginfo==1.9.6", - "sha256": "8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046", + "requirement": "charset-normalizer==3.4.0", + "sha256": "63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", "urls": [ - "https://files.pythonhosted.org/packages/b4/1c/89b38e431c20d6b2389ed8b3926c2ab72f58944733ba029354c6d9f69129/pkginfo-1.9.6.tar.gz" + "https://files.pythonhosted.org/packages/8d/c9/27e41d481557be53d51e60750b85aa40eaf52b841946b3cdeff363105737/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl" ] } }, - "rules_python_publish_deps_311_pygments_sdist_b3ed06a9": { + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -8027,17 +8078,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "Pygments-2.14.0.tar.gz", + "filename": "nh3-0.2.18-cp37-abi3-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": "pygments==2.14.0", - "sha256": "b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297", + "requirement": "nh3==0.2.18", + "sha256": "34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad", "urls": [ - "https://files.pythonhosted.org/packages/da/6a/c427c06913204e24de28de5300d3f0e809933f376e0b7df95194b2bb3f71/Pygments-2.14.0.tar.gz" + "https://files.pythonhosted.org/packages/ab/a7/375afcc710dbe2d64cfbd69e31f82f3e423d43737258af01f6a56d844085/nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" ] } }, - "rules_python_publish_deps_311_zipp_py3_none_any_83a28fcb": { + "rules_python_publish_deps_311_rich_sdist_bc1e01b8": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -8047,19 +8098,22 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "zipp-3.11.0-py3-none-any.whl", + "filename": "rich-13.9.3.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": "83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa", + "requirement": "rich==13.9.3", + "sha256": "bc1e01b899537598cf02579d2b9f4a415104d3fc439313a7a2c165d76557a08e", "urls": [ - "https://files.pythonhosted.org/packages/d8/20/256eb3f3f437c575fb1a2efdce5e801a5ce3162ea8117da96c43e6ee97d8/zipp-3.11.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/d9/e9/cf9ef5245d835065e6673781dbd4b8911d352fb770d56cf0879cf11b7ee1/rich-13.9.3.tar.gz" ] } }, - "rules_python_publish_deps_311_docutils_py3_none_any_5e1de4d8": { + "rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -8069,39 +8123,44 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "docutils-0.19-py3-none-any.whl", + "filename": "requests_toolbelt-1.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": "docutils==0.19", - "sha256": "5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc", + "requirement": "requests-toolbelt==1.0.0", + "sha256": "cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", "urls": [ - "https://files.pythonhosted.org/packages/93/69/e391bd51bc08ed9141ecd899a0ddb61ab6465309f1eb470905c0c8868081/docutils-0.19-py3-none-any.whl" + "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_docutils_py3_none_any_dafca5b9": { + "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_x86_64_610faea7": { "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" + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64" ], - "filename": "docutils-0.21.2-py3-none-any.whl", + "filename": "cffi-1.17.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": "docutils==0.21.2", - "sha256": "dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", + "requirement": "cffi==1.17.1", + "sha256": "610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", "urls": [ - "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl" + "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" ] } }, - "rules_python_publish_deps_311_docutils_sdist_33995a67": { + "rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_fc48c783": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -8113,17 +8172,17 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "docutils-0.19.tar.gz", + "filename": "cffi-1.17.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": "docutils==0.19", - "sha256": "33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6", + "requirement": "cffi==1.17.1", + "sha256": "fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", "urls": [ - "https://files.pythonhosted.org/packages/6b/5c/330ea8d383eb2ce973df34d1239b3b21e91cd8c865d21ff82902d952f91f/docutils-0.19.tar.gz" + "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl" ] } }, - "rules_python_publish_deps_311_jeepney_sdist_5efe48d2": { + "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_f7b178f1": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -8135,17 +8194,17 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "jeepney-0.8.0.tar.gz", + "filename": "cryptography-43.0.3-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": "jeepney==0.8.0", - "sha256": "5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806", + "requirement": "cryptography==43.0.3", + "sha256": "f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7", "urls": [ - "https://files.pythonhosted.org/packages/d6/f4/154cf374c2daf2020e05c3c6a03c91348d59b23c5366e968feb198306fdf/jeepney-0.8.0.tar.gz" + "https://files.pythonhosted.org/packages/7c/04/2345ca92f7a22f601a9c62961741ef7dd0127c39f7310dffa0041c80f16f/cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl" ] } }, - "rules_python_publish_deps_311_requests_toolbelt_sdist_62e09f7f": { + "rules_python_publish_deps_311_docutils_py3_none_any_dafca5b9": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -8160,37 +8219,60 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "requests-toolbelt-0.10.1.tar.gz", + "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_pywin32_ctypes_py3_none_any_8a151337": { + "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.3-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": "62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d", + "requirement": "pywin32-ctypes==0.2.3", + "sha256": "8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", "urls": [ - "https://files.pythonhosted.org/packages/0c/4c/07f01c6ac44f7784fa399137fbc8d0cdc1b5d35304e8c0f278ad82105b58/requests-toolbelt-0.10.1.tar.gz" + "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_zipp_py3_none_any_f091755f": { + "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b": { "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": "zipp-3.19.2-py3-none-any.whl", + "filename": "nh3-0.2.18-cp37-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": "zipp==3.19.2", - "sha256": "f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c", + "requirement": "nh3==0.2.18", + "sha256": "36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204", "urls": [ - "https://files.pythonhosted.org/packages/20/38/f5c473fe9b90c8debdd29ea68d5add0289f1936d6f923b6b9cc0b931194c/zipp-3.19.2-py3-none-any.whl" + "https://files.pythonhosted.org/packages/eb/61/73a007c74c37895fdf66e0edcd881f5eaa17a348ff02f4bb4bc906d61085/nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl" ] } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_0c0a5902": { + "rules_python_publish_deps_311_jeepney_sdist_5efe48d2": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -8202,17 +8284,17 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", + "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": "charset-normalizer==3.0.1", - "sha256": "0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1", + "requirement": "jeepney==0.8.0", + "sha256": "5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806", "urls": [ - "https://files.pythonhosted.org/packages/12/e5/aa09a1c39c3e444dd223d63e2c816c18ed78d035cff954143b2a539bdc9e/charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + "https://files.pythonhosted.org/packages/d6/f4/154cf374c2daf2020e05c3c6a03c91348d59b23c5366e968feb198306fdf/jeepney-0.8.0.tar.gz" ] } }, - "rules_python_publish_deps_311_requests_sdist_98b1b278": { + "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_c2e6fc39": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -8222,18 +8304,15 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" + "cp311_linux_x86_64" ], - "filename": "requests-2.28.2.tar.gz", + "filename": "cryptography-43.0.3-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": "requests==2.28.2", - "sha256": "98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf", + "requirement": "cryptography==43.0.3", + "sha256": "c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405", "urls": [ - "https://files.pythonhosted.org/packages/9d/ee/391076f5937f0a8cdf5e53b701ffc91753e87b07d66bae4a09aa671897bf/requests-2.28.2.tar.gz" + "https://files.pythonhosted.org/packages/ac/25/e715fa0bc24ac2114ed69da33adf451a38abb6f3f24ec207908112e9ba53/cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl" ] } }, @@ -8262,54 +8341,83 @@ ] } }, + "rules_python_publish_deps_311_zipp_sdist_bc9eb26f": { + "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": "zipp-3.20.2.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "zipp==3.20.2", + "sha256": "bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29", + "urls": [ + "https://files.pythonhosted.org/packages/54/bf/5c0000c44ebc80123ecbdddba1f5dcd94a5ada602a9c225d84b5aaa55e86/zipp-3.20.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": { - "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\"}]", - "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\"}]", - "charset_normalizer": "[{\"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.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-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_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-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-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_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_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_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-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.4.0-cp311-cp311-macosx_10_9_universal2.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe\",\"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.4.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_sdist_223217c3\",\"target_platforms\":[\"cp311_osx_aarch64\",\"cp311_osx_x86_64\",\"cp311_windows_x86_64\"],\"version\":\"3.11\"}]", - "cryptography": "[{\"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-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-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-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-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-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-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_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.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cryptography_sdist_831a4b37\",\"target_platforms\":null,\"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\"}]", - "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\"}]", - "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\"}]", - "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\"}]", + "backports_tarfile": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"backports.tarfile-1.2.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"backports_tarfile-1.2.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "certifi": "[{\"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\":null,\"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\":null,\"version\":\"3.11\"}]", + "cffi": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_aarch64_a1ed2dd2\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_46bf4316\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_s390x_a24ed04c\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.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_610faea7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_aarch64_a9b15d49\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_fc48c783\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cffi_sdist_1c39c601\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "charset_normalizer": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_bf4475b8\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_ce031db0\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8ff4e7cd\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-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_3710a975\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_47334db7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_f1a2f519\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_63bc5c4a\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_bcb4f8ea\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_sdist_223217c3\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "cryptography": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_846da004\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-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_0f996e72\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_f7b178f1\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_c2e6fc39\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_e1be4655\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_df6b6c6d\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cryptography_sdist_315b9001\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "docutils": "[{\"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\":null,\"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\":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\":null,\"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\":null,\"version\":\"3.11\"}]", + "importlib_metadata": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"importlib_metadata-8.5.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_importlib_metadata_py3_none_any_45e54197\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"importlib_metadata-8.5.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_importlib_metadata_sdist_71522656\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "jaraco_classes": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.classes-3.4.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.classes-3.4.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "jaraco_context": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.context-6.0.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco_context-6.0.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "jaraco_functools": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.functools-4.1.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco_functools-4.1.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2\",\"target_platforms\":null,\"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\"}]", - "markdown_it_py": "[{\"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\"},{\"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\"}]", + "keyring": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"keyring-25.4.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_keyring_py3_none_any_5426f817\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"keyring-25.4.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_keyring_sdist_b07ebc55\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "markdown_it_py": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"markdown-it-py-3.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"markdown_it_py-3.0.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684\",\"target_platforms\":null,\"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\"}]", - "more_itertools": "[{\"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\"},{\"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\"}]", - "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\"}]", - "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\"}]", - "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\"}]", - "pywin32_ctypes": "[{\"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\"},{\"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\"}]", - "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": "[{\"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\"}]", - "requests_toolbelt": "[{\"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\"},{\"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\"}]", + "more_itertools": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"more-itertools-10.5.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_more_itertools_sdist_5482bfef\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"more_itertools-10.5.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_more_itertools_py3_none_any_037b0d32\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "nh3": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_armv7l_0411beb0\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64_5f36b271\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_armv7l_3a157ab1\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-win_amd64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18.tar.gz\",\"repo\":\"rules_python_publish_deps_311_nh3_sdist_94a16692\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "pkginfo": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pkginfo-1.10.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pkginfo-1.10.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pkginfo_sdist_5df73835\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "pycparser": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pycparser-2.22-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pycparser_py3_none_any_c3702b6d\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pycparser-2.22.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pycparser_sdist_491c8be9\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "pygments": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pygments-2.18.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pygments-2.18.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pygments_sdist_786ff802\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "pywin32_ctypes": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pywin32-ctypes-0.2.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pywin32_ctypes_sdist_d162dc04\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pywin32_ctypes-0.2.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pywin32_ctypes_py3_none_any_8a151337\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "readme_renderer": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"readme_renderer-44.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"readme_renderer-44.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_readme_renderer_sdist_8712034e\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "requests": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests-2.32.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_requests_py3_none_any_70761cfe\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests-2.32.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_requests_sdist_55365417\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "requests_toolbelt": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests-toolbelt-1.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests_toolbelt-1.0.0-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66\",\"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\"}]", - "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\"}]", + "rich": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"rich-13.9.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_rich_py3_none_any_9836f509\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"rich-13.9.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_rich_sdist_bc1e01b8\",\"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\"}]", - "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\"}]", - "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\"}]", - "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\"}]", - "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\"}]", - "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\"}]" + "twine": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"twine-5.1.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_twine_py3_none_any_215dbe7b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"twine-5.1.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_twine_sdist_9aa08251\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "urllib3": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"urllib3-2.2.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_urllib3_py3_none_any_ca899ca0\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"urllib3-2.2.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_urllib3_sdist_e7d814a8\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "zipp": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"zipp-3.20.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_zipp_py3_none_any_a817ac80\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"zipp-3.20.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_zipp_sdist_bc9eb26f\",\"target_platforms\":null,\"version\":\"3.11\"}]" }, "packages": [ - "bleach", + "backports_tarfile", "certifi", "charset_normalizer", "docutils", "idna", "importlib_metadata", "jaraco_classes", + "jaraco_context", + "jaraco_functools", "keyring", "markdown_it_py", "mdurl", "more_itertools", + "nh3", "pkginfo", "pygments", "readme_renderer", @@ -8317,10 +8425,8 @@ "requests_toolbelt", "rfc3986", "rich", - "six", "twine", "urllib3", - "webencodings", "zipp" ], "groups": {} @@ -8332,6 +8438,11 @@ "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" @@ -8346,7 +8457,7 @@ ] } }, - "rules_python_publish_deps_311_charset_normalizer_sdist_ebea339a": { + "rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -8356,19 +8467,22 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" ], - "filename": "charset-normalizer-3.0.1.tar.gz", + "filename": "jaraco.classes-3.4.0-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": "ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f", + "requirement": "jaraco-classes==3.4.0", + "sha256": "f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", "urls": [ - "https://files.pythonhosted.org/packages/96/d7/1675d9089a1f4677df5eb29c3f8b064aa1e70c1251a0a8a127803158942d/charset-normalizer-3.0.1.tar.gz" + "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl" ] } }, - "rules_python_publish_deps_311_webencodings_py2_none_any_a0af1213": { + "rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -8383,17 +8497,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "webencodings-0.5.1-py2.py3-none-any.whl", + "filename": "jaraco_context-6.0.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": "a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", + "requirement": "jaraco-context==6.0.1", + "sha256": "9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", "urls": [ - "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz" ] } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_1_aarch64_72966d1b": { + "rules_python_publish_deps_311_requests_py3_none_any_70761cfe": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -8403,19 +8517,47 @@ "cp311_linux_arm", "cp311_linux_ppc", "cp311_linux_s390x", - "cp311_linux_x86_64" + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "requests-2.32.3-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "requests==2.32.3", + "sha256": "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", + "urls": [ + "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_readme_renderer_sdist_8712034e": { + "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": "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", + "filename": "readme_renderer-44.0.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": "72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a", + "requirement": "readme-renderer==44.0", + "sha256": "8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1", "urls": [ - "https://files.pythonhosted.org/packages/01/ff/9ee4a44e8c32fe96dfc12daa42f29294608a55eadc88f327939327fb20fb/charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl" + "https://files.pythonhosted.org/packages/5a/a9/104ec9234c8448c4379768221ea6df01260cd6c2ce13182d4eac531c8342/readme_renderer-44.0.tar.gz" ] } }, - "rules_python_publish_deps_311_pycparser_sdist_e644fdec": { + "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_aarch64_a1ed2dd2": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -8427,17 +8569,42 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], - "filename": "pycparser-2.21.tar.gz", + "filename": "cffi-1.17.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": "pycparser==2.21", - "sha256": "e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206", + "requirement": "cffi==1.17.1", + "sha256": "a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", + "urls": [ + "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8ff4e7cd": { + "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": "charset_normalizer-3.4.0-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.4.0", + "sha256": "8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", "urls": [ - "https://files.pythonhosted.org/packages/5e/0b/95d387f5f4433cb0f53ff7ad859bd2c6051051cebbb564f139a999ab46de/pycparser-2.21.tar.gz" + "https://files.pythonhosted.org/packages/13/bc/87c2c9f2c144bedfa62f894c3007cd4530ba4b5351acb10dc786428a50f0/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" ] } }, - "rules_python_publish_deps_311_bleach_sdist_1a1a85c1": { + "rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -8452,13 +8619,13 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "bleach-6.0.0.tar.gz", + "filename": "jaraco.functools-4.1.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": "1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414", + "requirement": "jaraco-functools==4.1.0", + "sha256": "ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649", "urls": [ - "https://files.pythonhosted.org/packages/7e/e6/d5f220ca638f6a25557a611860482cb6e54b2d97f0332966b1b005742e1f/bleach-6.0.0.tar.gz" + "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl" ] } } @@ -8589,8 +8756,8 @@ }, "@@rules_python~//python/uv:extensions.bzl%uv": { "general": { - "bzlTransitiveDigest": "erdJbm7V7XAkG+eWOTPQdxCJy8aKLXh7jWB5ZQm63fo=", - "usagesDigest": "uLdEsM0i3cqtN+HXzxfaiFko1ilKeu6F8NWoY1IjdBw=", + "bzlTransitiveDigest": "umgu1yR4Wmqb1pJa+9hAcs9dPbeqBsPLceKiaEg3DdQ=", + "usagesDigest": "+2swUSSDNmjk5bxS7cNIRrfF+M/iuc8Zc7vI5xUBcRs=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, @@ -8599,7 +8766,7 @@ "bzlFile": "@@rules_python~//python/uv:repositories.bzl", "ruleClassName": "uv_repository", "attributes": { - "uv_version": "0.2.23", + "uv_version": "0.4.25", "platform": "aarch64-unknown-linux-gnu" } }, @@ -8607,7 +8774,7 @@ "bzlFile": "@@rules_python~//python/uv:repositories.bzl", "ruleClassName": "uv_repository", "attributes": { - "uv_version": "0.2.23", + "uv_version": "0.4.25", "platform": "aarch64-apple-darwin" } }, @@ -8615,7 +8782,7 @@ "bzlFile": "@@rules_python~//python/uv:repositories.bzl", "ruleClassName": "uv_repository", "attributes": { - "uv_version": "0.2.23", + "uv_version": "0.4.25", "platform": "s390x-unknown-linux-gnu" } }, @@ -8623,7 +8790,7 @@ "bzlFile": "@@rules_python~//python/uv:repositories.bzl", "ruleClassName": "uv_repository", "attributes": { - "uv_version": "0.2.23", + "uv_version": "0.4.25", "platform": "powerpc64le-unknown-linux-gnu" } }, @@ -8631,7 +8798,7 @@ "bzlFile": "@@rules_python~//python/uv:repositories.bzl", "ruleClassName": "uv_repository", "attributes": { - "uv_version": "0.2.23", + "uv_version": "0.4.25", "platform": "x86_64-unknown-linux-gnu" } }, @@ -8694,7 +8861,7 @@ "bzlFile": "@@rules_python~//python/uv:repositories.bzl", "ruleClassName": "uv_repository", "attributes": { - "uv_version": "0.2.23", + "uv_version": "0.4.25", "platform": "x86_64-apple-darwin" } }, @@ -8702,7 +8869,7 @@ "bzlFile": "@@rules_python~//python/uv:repositories.bzl", "ruleClassName": "uv_repository", "attributes": { - "uv_version": "0.2.23", + "uv_version": "0.4.25", "platform": "x86_64-pc-windows-msvc" } } diff --git a/internal_deps.bzl b/internal_deps.bzl index 9c2e6b2581..f92e029305 100644 --- a/internal_deps.bzl +++ b/internal_deps.bzl @@ -231,3 +231,9 @@ def rules_python_internal_deps(): 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"], ) + + 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/private/BUILD.bazel b/private/BUILD.bazel new file mode 100644 index 0000000000..c81dc94801 --- /dev/null +++ b/private/BUILD.bazel @@ -0,0 +1,28 @@ +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", + "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/uv/private/lock.bzl b/python/uv/private/lock.bzl index f0a66a1a93..217b6e4831 100644 --- a/python/uv/private/lock.bzl +++ b/python/uv/private/lock.bzl @@ -22,9 +22,12 @@ load("//python/private:bzlmod_enabled.bzl", "BZLMOD_ENABLED") # buildifier: dis 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 @@ def lock(*, name, srcs, out, upgrade = False, universal = True, python_version = 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 @@ def lock(*, name, srcs, out, upgrade = False, universal = True, python_version = 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 @@ def lock(*, name, srcs, out, upgrade = False, universal = True, python_version = "REQUIREMENTS_FILE": "$(rootpath {})".format(name), }, tags = ["manual"], + **kwargs ) diff --git a/python/uv/private/versions.bzl b/python/uv/private/versions.bzl index 6e7091b4c8..f13eae5cee 100644 --- a/python/uv/private/versions.bzl +++ b/python/uv/private/versions.bzl @@ -68,27 +68,27 @@ UV_PLATFORMS = { # From: https://github.com/astral-sh/uv/releases UV_TOOL_VERSIONS = { - "0.2.23": { + "0.4.25": { "aarch64-apple-darwin": struct( - sha256 = "1d41beb151ace9621a0e729d661cfb04d6375bffdaaf0e366d1653576ce3a687", + sha256 = "35786030f926e3d34d186edc0ea3989698e57755852af9ae4b39da5109abcbfa", ), "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/tools/private/BUILD.bazel b/tools/private/BUILD.bazel new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tools/private/publish_deps.bzl b/tools/private/publish_deps.bzl new file mode 100644 index 0000000000..538cc1d583 --- /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_deps/BUILD.bazel b/tools/private/update_deps/BUILD.bazel index c83deb03db..beecf82189 100644 --- a/tools/private/update_deps/BUILD.bazel +++ b/tools/private/update_deps/BUILD.bazel @@ -58,6 +58,7 @@ py_binary( "REQUIREMENTS_TXT": "$(rlocationpath //python/private/pypi:requirements_txt)", }, imports = ["../../.."], + visibility = ["//private:__pkg__"], deps = [ ":args", ":update_file", diff --git a/tools/publish/BUILD.bazel b/tools/publish/BUILD.bazel index a51693b9fc..3fd891c837 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", @@ -28,7 +21,24 @@ filegroup( "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.txt": "linux", # TODO: maybe deprecate + "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 index 2a9721df34..8fb51b9458 100644 --- a/tools/publish/requirements.txt +++ b/tools/publish/requirements.txt @@ -1,224 +1,245 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# +# This file was autogenerated by uv via 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 +--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.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 +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.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 +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==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 +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.19 \ - --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ - --hash=sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc +docutils==0.21.2 \ + --hash=sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f \ + --hash=sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 # via readme-renderer -idna==3.4 \ - --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ - --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 +idna==3.10 \ + --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 +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 \ @@ -226,81 +247,93 @@ jeepney==0.8.0 \ # via # keyring # secretstorage -keyring==23.13.1 \ - --hash=sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd \ - --hash=sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678 +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 -pycparser==2.21 \ - --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ - --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 +pycparser==2.22 \ + --hash=sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6 \ + --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc # via cffi -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 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 +twine==5.1.1 \ + --hash=sha256:215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997 \ + --hash=sha256:9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db # via -r tools/publish/requirements.in -urllib3==1.26.14 \ - --hash=sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72 \ - --hash=sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1 +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.11.0 \ - --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ - --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 +zipp==3.20.2 \ + --hash=sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350 \ + --hash=sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29 # via importlib-metadata diff --git a/tools/publish/requirements_darwin.txt b/tools/publish/requirements_darwin.txt index 32f3ecf8e5..2f8088e358 100644 --- a/tools/publish/requirements_darwin.txt +++ b/tools/publish/requirements_darwin.txt @@ -1,13 +1,11 @@ -# -# 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 @@ -127,83 +125,103 @@ idna==3.10 \ --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 +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==23.13.1 \ - --hash=sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd \ - --hash=sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678 +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 0000000000..785af7f9af --- /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 0000000000..06f93286f5 --- /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 d118065bac..23d298643f 100644 --- a/tools/publish/requirements_windows.txt +++ b/tools/publish/requirements_windows.txt @@ -1,13 +1,11 @@ -# -# 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 @@ -127,87 +125,107 @@ idna==3.10 \ --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 +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==23.13.1 \ - --hash=sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd \ - --hash=sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678 +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/tools/publish/requirementslinux.txt b/tools/publish/requirementslinux.txt new file mode 100644 index 0000000000..652890e06b --- /dev/null +++ b/tools/publish/requirementslinux.txt @@ -0,0 +1,352 @@ +# This file was autogenerated by uv via the following command: +# bazel run //tools/publish:requirements_darwin.update +--index-url https://pypi.org/simple + +bleach==6.0.0 \ + --hash=sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414 \ + --hash=sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4 + # via + # -r tools/publish/requirements.txt + # readme-renderer +certifi==2022.12.7 \ + --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \ + --hash=sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18 + # via + # -r tools/publish/requirements.txt + # 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 + # -r tools/publish/requirements.txt + # 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 + # -r tools/publish/requirements.txt + # 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 + # -r tools/publish/requirements.txt + # secretstorage +docutils==0.19 \ + --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ + --hash=sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc + # via + # -r tools/publish/requirements.txt + # readme-renderer +idna==3.4 \ + --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ + --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 + # via + # -r tools/publish/requirements.txt + # requests +importlib-metadata==6.0.0 \ + --hash=sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad \ + --hash=sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d + # via + # -r tools/publish/requirements.txt + # keyring + # twine +jaraco-classes==3.2.3 \ + --hash=sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158 \ + --hash=sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a + # via + # -r tools/publish/requirements.txt + # keyring +jeepney==0.8.0 \ + --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \ + --hash=sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755 + # via + # -r tools/publish/requirements.txt + # secretstorage +keyring==23.13.1 \ + --hash=sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd \ + --hash=sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678 + # via + # -r tools/publish/requirements.txt + # twine +markdown-it-py==2.1.0 \ + --hash=sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27 \ + --hash=sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da + # via + # -r tools/publish/requirements.txt + # rich +mdurl==0.1.2 \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ + --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba + # via + # -r tools/publish/requirements.txt + # markdown-it-py +more-itertools==9.0.0 \ + --hash=sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41 \ + --hash=sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab + # via + # -r tools/publish/requirements.txt + # jaraco-classes +pkginfo==1.9.6 \ + --hash=sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546 \ + --hash=sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046 + # via + # -r tools/publish/requirements.txt + # twine +pycparser==2.21 \ + --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ + --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 + # via + # -r tools/publish/requirements.txt + # cffi +pygments==2.14.0 \ + --hash=sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297 \ + --hash=sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717 + # via + # -r tools/publish/requirements.txt + # readme-renderer + # rich +readme-renderer==37.3 \ + --hash=sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273 \ + --hash=sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343 + # via + # -r tools/publish/requirements.txt + # twine +requests==2.28.2 \ + --hash=sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa \ + --hash=sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf + # via + # -r tools/publish/requirements.txt + # requests-toolbelt + # twine +requests-toolbelt==0.10.1 \ + --hash=sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7 \ + --hash=sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d + # via + # -r tools/publish/requirements.txt + # twine +rfc3986==2.0.0 \ + --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \ + --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c + # via + # -r tools/publish/requirements.txt + # twine +rich==13.2.0 \ + --hash=sha256:7c963f0d03819221e9ac561e1bc866e3f95a02248c1234daa48954e6d381c003 \ + --hash=sha256:f1a00cdd3eebf999a15d85ec498bfe0b1a77efe9b34f645768a54132ef444ac5 + # via + # -r tools/publish/requirements.txt + # twine +secretstorage==3.3.3 \ + --hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \ + --hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99 + # via -r tools/publish/requirements.txt +six==1.16.0 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + # via + # -r tools/publish/requirements.txt + # bleach +twine==4.0.2 \ + --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \ + --hash=sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8 + # via + # -r tools/publish/requirements.in + # -r tools/publish/requirements.txt +urllib3==1.26.14 \ + --hash=sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72 \ + --hash=sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1 + # via + # -r tools/publish/requirements.txt + # requests + # twine +webencodings==0.5.1 \ + --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ + --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923 + # via + # -r tools/publish/requirements.txt + # bleach +zipp==3.11.0 \ + --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ + --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 + # via + # -r tools/publish/requirements.txt + # importlib-metadata From 70caec742606ef8eb1b4fdd33b5c6915432ec4fa Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 26 Oct 2024 05:54:13 +0900 Subject: [PATCH 278/345] chore: remove an accidental file (#2348) This got accidentally committed in #2333. --- tools/publish/requirementslinux.txt | 352 ---------------------------- 1 file changed, 352 deletions(-) delete mode 100644 tools/publish/requirementslinux.txt diff --git a/tools/publish/requirementslinux.txt b/tools/publish/requirementslinux.txt deleted file mode 100644 index 652890e06b..0000000000 --- a/tools/publish/requirementslinux.txt +++ /dev/null @@ -1,352 +0,0 @@ -# This file was autogenerated by uv via the following command: -# bazel run //tools/publish:requirements_darwin.update ---index-url https://pypi.org/simple - -bleach==6.0.0 \ - --hash=sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414 \ - --hash=sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4 - # via - # -r tools/publish/requirements.txt - # readme-renderer -certifi==2022.12.7 \ - --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \ - --hash=sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18 - # via - # -r tools/publish/requirements.txt - # 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 - # -r tools/publish/requirements.txt - # 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 - # -r tools/publish/requirements.txt - # 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 - # -r tools/publish/requirements.txt - # secretstorage -docutils==0.19 \ - --hash=sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6 \ - --hash=sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc - # via - # -r tools/publish/requirements.txt - # readme-renderer -idna==3.4 \ - --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ - --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 - # via - # -r tools/publish/requirements.txt - # requests -importlib-metadata==6.0.0 \ - --hash=sha256:7efb448ec9a5e313a57655d35aa54cd3e01b7e1fbcf72dce1bf06119420f5bad \ - --hash=sha256:e354bedeb60efa6affdcc8ae121b73544a7aa74156d047311948f6d711cd378d - # via - # -r tools/publish/requirements.txt - # keyring - # twine -jaraco-classes==3.2.3 \ - --hash=sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158 \ - --hash=sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a - # via - # -r tools/publish/requirements.txt - # keyring -jeepney==0.8.0 \ - --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \ - --hash=sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755 - # via - # -r tools/publish/requirements.txt - # secretstorage -keyring==23.13.1 \ - --hash=sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd \ - --hash=sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678 - # via - # -r tools/publish/requirements.txt - # twine -markdown-it-py==2.1.0 \ - --hash=sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27 \ - --hash=sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da - # via - # -r tools/publish/requirements.txt - # rich -mdurl==0.1.2 \ - --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ - --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba - # via - # -r tools/publish/requirements.txt - # markdown-it-py -more-itertools==9.0.0 \ - --hash=sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41 \ - --hash=sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab - # via - # -r tools/publish/requirements.txt - # jaraco-classes -pkginfo==1.9.6 \ - --hash=sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546 \ - --hash=sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046 - # via - # -r tools/publish/requirements.txt - # twine -pycparser==2.21 \ - --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ - --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 - # via - # -r tools/publish/requirements.txt - # cffi -pygments==2.14.0 \ - --hash=sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297 \ - --hash=sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717 - # via - # -r tools/publish/requirements.txt - # readme-renderer - # rich -readme-renderer==37.3 \ - --hash=sha256:cd653186dfc73055656f090f227f5cb22a046d7f71a841dfa305f55c9a513273 \ - --hash=sha256:f67a16caedfa71eef48a31b39708637a6f4664c4394801a7b0d6432d13907343 - # via - # -r tools/publish/requirements.txt - # twine -requests==2.28.2 \ - --hash=sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa \ - --hash=sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf - # via - # -r tools/publish/requirements.txt - # requests-toolbelt - # twine -requests-toolbelt==0.10.1 \ - --hash=sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7 \ - --hash=sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d - # via - # -r tools/publish/requirements.txt - # twine -rfc3986==2.0.0 \ - --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd \ - --hash=sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c - # via - # -r tools/publish/requirements.txt - # twine -rich==13.2.0 \ - --hash=sha256:7c963f0d03819221e9ac561e1bc866e3f95a02248c1234daa48954e6d381c003 \ - --hash=sha256:f1a00cdd3eebf999a15d85ec498bfe0b1a77efe9b34f645768a54132ef444ac5 - # via - # -r tools/publish/requirements.txt - # twine -secretstorage==3.3.3 \ - --hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \ - --hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99 - # via -r tools/publish/requirements.txt -six==1.16.0 \ - --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ - --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 - # via - # -r tools/publish/requirements.txt - # bleach -twine==4.0.2 \ - --hash=sha256:929bc3c280033347a00f847236564d1c52a3e61b1ac2516c97c48f3ceab756d8 \ - --hash=sha256:9e102ef5fdd5a20661eb88fad46338806c3bd32cf1db729603fe3697b1bc83c8 - # via - # -r tools/publish/requirements.in - # -r tools/publish/requirements.txt -urllib3==1.26.14 \ - --hash=sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72 \ - --hash=sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1 - # via - # -r tools/publish/requirements.txt - # requests - # twine -webencodings==0.5.1 \ - --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ - --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923 - # via - # -r tools/publish/requirements.txt - # bleach -zipp==3.11.0 \ - --hash=sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa \ - --hash=sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766 - # via - # -r tools/publish/requirements.txt - # importlib-metadata From 9340a8199cac0912305dad427a5cdc72ee4fc7ff Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 27 Oct 2024 03:36:14 +0900 Subject: [PATCH 279/345] fix(bzlmod): generate config_setting values for all python toolchains (#2350) #2253 broke how the config settings are generated and only generated the config setting values for the python version values that we would have the registered toolchains for. This PR restores the previous behaviour. However, if the root module uses `python.override` to remove the allowed toolchains, then `config_settings` will be also affected. --- .bazelrc | 4 +- CHANGELOG.md | 4 +- examples/multi_python_versions/MODULE.bazel | 1 + .../multi_python_versions/tests/BUILD.bazel | 39 +++++++++++++++++++ python/private/python.bzl | 1 + 5 files changed, 46 insertions(+), 3 deletions(-) diff --git a/.bazelrc b/.bazelrc index 66a644e289..c44124d961 100644 --- a/.bazelrc +++ b/.bazelrc @@ -4,8 +4,8 @@ # (Note, we cannot use `common --deleted_packages` because the bazel version command doesn't support it) # To update these lines, execute # `bazel run @rules_bazel_integration_test//tools:update_deleted_packages` -build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered -query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered test --test_output=errors diff --git a/CHANGELOG.md b/CHANGELOG.md index 893e5e55f4..a1a2edc134 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,7 +36,9 @@ A brief description of the categories of changes: {#v0-0-0-fixed} ### Fixed -* Nothing yet +* (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-0-0-added} ### Added diff --git a/examples/multi_python_versions/MODULE.bazel b/examples/multi_python_versions/MODULE.bazel index 4223916d22..536940ba49 100644 --- a/examples/multi_python_versions/MODULE.bazel +++ b/examples/multi_python_versions/MODULE.bazel @@ -30,6 +30,7 @@ python.toolchain( ) use_repo( python, + "pythons_hub", python = "python_versions", ) diff --git a/examples/multi_python_versions/tests/BUILD.bazel b/examples/multi_python_versions/tests/BUILD.bazel index cf14bf0a3b..d5c66e026f 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 @@ sh_test( "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/python/private/python.bzl b/python/private/python.bzl index 12ab4bb48d..d2b1007231 100644 --- a/python/private/python.bzl +++ b/python/private/python.bzl @@ -241,6 +241,7 @@ def _python_impl(module_ctx): # 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) From 2f04951d055460947c461dc308a546ceb192f1a3 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sat, 26 Oct 2024 19:26:43 -0700 Subject: [PATCH 280/345] docs: document the is_python config settings (#2336) This documents the `//python/config_settings:is_python_*` config settings. It adds a disclaimer that the available targets may vary depending on the root module settings, and tells users how to match versions when one isn't available. --- .../python/config_settings/index.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/docs/api/rules_python/python/config_settings/index.md b/docs/api/rules_python/python/config_settings/index.md index 511a218eef..7c7421bf7e 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 @@ one of the values that `rules_python` maintains. 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. From 487796bbc21bdef3aedeb98435d274d3ec96ddc8 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sat, 26 Oct 2024 19:31:18 -0700 Subject: [PATCH 281/345] docs: tell how to create a release branch for patch releases (#2329) This adds some doc for how to create a branch when a patch release needs to be based on the original release and not from head. --------- Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> --- DEVELOPING.md | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/DEVELOPING.md b/DEVELOPING.md index 1041039f9d..ff0e110b3c 100644 --- a/DEVELOPING.md +++ b/DEVELOPING.md @@ -24,6 +24,8 @@ Start from a clean checkout at `main`. 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` @@ -42,9 +44,31 @@ To find if there were any features added or incompatible changes made, review the commit history. This can be done using github by going to the url: `https://github.com/bazelbuild/rules_python/compare/...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. If `MODULE.bazel.lock` conflicts occur, then + run `pre-commit run update-bzlmod-lockfiles -a` +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 From afecfd25a9236a2a94e302295ddc9e52a7ac08f8 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 28 Oct 2024 03:17:19 +0900 Subject: [PATCH 282/345] chore: add aignas to the BCR maintainers (#2352) It seems that it got removed in bazelbuild/bazel-central-registry#2838 --- .bcr/metadata.template.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.bcr/metadata.template.json b/.bcr/metadata.template.json index 7b16b53b62..eff7219bde 100644 --- a/.bcr/metadata.template.json +++ b/.bcr/metadata.template.json @@ -10,6 +10,11 @@ "name": "Thulio Ferraz Assis", "email": "thulio@aspect.dev", "github": "f0rmiga" + }, + { + "name": "Ignas Anikevicius", + "email": "bcr-ignas@use.startmail.com", + "github": "aignas" } ], "repository": [ From f8d41350786b1171f2e269a1ab4084c55483bc32 Mon Sep 17 00:00:00 2001 From: Oleh Prypin Date: Sun, 27 Oct 2024 21:07:17 +0100 Subject: [PATCH 283/345] fix: breakages in unused codepaths after recent refactors (#2353) * There is no such method `common_runfiles.add_runfiles`; use `add_targets()` instead. This only occurs when there are extra deps, which currently on Google-patches trigger. * The docs say that `BuiltinPyInfo` might be None, but that case is not handled here. This occurs in newer Bazel versions where the builtin PyInfo has been removed. --- python/private/py_executable.bzl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/private/py_executable.bzl b/python/private/py_executable.bzl index b81f07e01a..d5da922aa6 100644 --- a/python/private/py_executable.bzl +++ b/python/private/py_executable.bzl @@ -454,7 +454,7 @@ def _get_base_runfiles_for_binary( 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) @@ -471,7 +471,7 @@ def _get_base_runfiles_for_binary( 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) From 462399013e6dc32ba2a8e38e0adce50a58d92361 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 28 Oct 2024 11:22:17 +0900 Subject: [PATCH 284/345] refactor(pypi): use a macro to define whl_library targets (#2347) Summary: - refactor: Start implementing whl_library_targets - refactor: start using whl_library_targets macro - refactor: generate config settings in the new macro - refactor: copy_files in the new macro - refactor: move entry_point generation to the macro - refactor: move the py_library and whl generation to the new macro This makes the code more maintainable by reducing the amount of tests that are comparing BUILD.bazel outputs. --- examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/pypi/BUILD.bazel | 3 +- .../pypi/generate_whl_library_build_bazel.bzl | 403 +----------- python/private/pypi/whl_library.bzl | 2 +- python/private/pypi/whl_library_targets.bzl | 343 +++++++++++ ...generate_whl_library_build_bazel_tests.bzl | 579 ++---------------- tests/pypi/whl_library_targets/BUILD.bazel | 5 + .../whl_library_targets_tests.bzl | 349 +++++++++++ 8 files changed, 786 insertions(+), 902 deletions(-) create mode 100644 python/private/pypi/whl_library_targets.bzl create mode 100644 tests/pypi/whl_library_targets/BUILD.bazel create mode 100644 tests/pypi/whl_library_targets/whl_library_targets_tests.bzl diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 286e8c0b01..c41380c6be 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1392,7 +1392,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "KZzbwT5y7SPbM+MgbQWr309EUGjGXvXvQ4/FMn+fEGE=", + "bzlTransitiveDigest": "g9NnJTZcM2BjPelxHHLy0ZyhFd+8XAb86u9OvNIOhFo=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6299,7 +6299,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "mzsyVW4M380vwEPTn/pDXFMh5gtTHsv0sbqZCE7a1SY=", + "bzlTransitiveDigest": "ctc7nzMsQfNG16wSXLqbix2k99rf614qJRwcd/2RxGI=", "usagesDigest": "LYtSAPzhPjmfD9vF39mCED1UQSvHEo2Hv+aK5Z4ZWWc=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel index e76f9d36b1..9be355c0c3 100644 --- a/python/private/pypi/BUILD.bazel +++ b/python/private/pypi/BUILD.bazel @@ -110,8 +110,7 @@ bzl_library( 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", ], ) diff --git a/python/private/pypi/generate_whl_library_build_bazel.bzl b/python/private/pypi/generate_whl_library_build_bazel.bzl index 934fa00c69..8050cd22ad 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}, -) -""" -_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} +_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, +} + +# 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/whl_library.bzl b/python/private/pypi/whl_library.bzl index 82fe072655..62c0c6ded5 100644 --- a/python/private/pypi/whl_library.bzl +++ b/python/private/pypi/whl_library.bzl @@ -332,8 +332,8 @@ def _whl_library_impl(rctx): 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 0000000000..1798b9d775 --- /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: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", + ] + 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/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 94530117cd..b0d8f6d17e 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 @@ load("//python/private/pypi:generate_whl_library_build_bazel.bzl", "generate_whl _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", + }, + copy_files = { + "file_src": "file_dest", }, - constraint_values = [ - "@platforms//cpu:ppc", - "@platforms//os:linux", + data = ["extra_target"], + data_exclude = [ + "exclude_via_attr", + "data_exclude_all", ], - 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", + 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//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", + entry_points = { + "foo": "bar.py", }, - constraint_values = ["@platforms//os:linux"], - visibility = ["//visibility:private"], -) - -config_setting( - name = "is_linux_x86_64", - constraint_values = [ - "@platforms//cpu:x86_64", - "@platforms//os:linux", + 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 = {}, - annotation = struct( - copy_files = {"file_src": "file_dest"}, - copy_executables = {"exec_src": "exec_dest"}, - data = [], - 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", + 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, + 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 = ["extra_target"], + data_exclude_glob = ["data_exclude_all"], + srcs_exclude_glob = ["srcs_exclude_all"], + additive_build_content = """# SOMETHING SPECIAL AT THE END""", + ), 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/whl_library_targets/BUILD.bazel b/tests/pypi/whl_library_targets/BUILD.bazel new file mode 100644 index 0000000000..f3d25c2a52 --- /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 0000000000..9694eeec48 --- /dev/null +++ b/tests/pypi/whl_library_targets/whl_library_targets_tests.bzl @@ -0,0 +1,349 @@ +# 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: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"], + ), + "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"], + ), + "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) From 3e552df739b56ac4e4755a98094126fb7f125049 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Mon, 28 Oct 2024 23:26:10 -0700 Subject: [PATCH 285/345] feat: add features.version value (#2357) This adds a `features.version` value that is populated by git when `git archive` is run. This means it will be expanded when our release action runs to the tag name. Otherwise, it isn't expanded. When it isn't expanded, the value is set to the empty string. --- .gitattributes | 1 + CHANGELOG.md | 1 + python/features.bzl | 5 +++++ 3 files changed, 7 insertions(+) diff --git a/.gitattributes b/.gitattributes index e4e5d4bc3e..eae260e931 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,2 @@ +python/features.bzl export-subst tools/publish/*.txt linguist-generated=true diff --git a/CHANGELOG.md b/CHANGELOG.md index a1a2edc134..e85cfb46f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ A brief description of the categories of changes: `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` {#v0-0-0-removed} ### Removed diff --git a/python/features.bzl b/python/features.bzl index 3a10532c6e..90a1121909 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, ) From 7c5e7cfcef3ec262b5164bf6dcd09cd558fe57ba Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 29 Oct 2024 20:32:35 -0700 Subject: [PATCH 286/345] refactor: fold bazel-specific code into main files (#2358) This removes most of the `*_bazel.bzl` files and either renames them or folds them into the "regular" files. (common_bazel.bzl and py_executable_bazel.bzl turned out to be a bit more involved, so are left for a future change). This is part of simplifying the implementation and removing the complicated/convoluted "plugin" style design that was inherited from the original Bazel code to accommodate various Google changes. --- docs/BUILD.bazel | 6 +-- docs/conf.py | 4 +- python/BUILD.bazel | 6 +-- python/private/BUILD.bazel | 39 +++++++-------- python/private/attributes.bzl | 16 +++++++ python/private/attributes_bazel.bzl | 30 ------------ ...ry_macro_bazel.bzl => py_binary_macro.bzl} | 2 +- ...nary_rule_bazel.bzl => py_binary_rule.bzl} | 0 python/private/py_executable_bazel.bzl | 2 +- python/private/py_library.bzl | 4 +- ...y_macro_bazel.bzl => py_library_macro.bzl} | 4 +- python/private/py_library_rule.bzl | 32 +++++++++++++ python/private/py_library_rule_bazel.bzl | 47 ------------------- ...test_macro_bazel.bzl => py_test_macro.bzl} | 2 +- ...y_test_rule_bazel.bzl => py_test_rule.bzl} | 2 +- python/py_binary.bzl | 2 +- python/py_library.bzl | 2 +- python/py_test.bzl | 2 +- 18 files changed, 85 insertions(+), 117 deletions(-) delete mode 100644 python/private/attributes_bazel.bzl rename python/private/{py_binary_macro_bazel.bzl => py_binary_macro.bzl} (92%) rename python/private/{py_binary_rule_bazel.bzl => py_binary_rule.bzl} (100%) rename python/private/{py_library_macro_bazel.bzl => py_library_macro.bzl} (77%) create mode 100644 python/private/py_library_rule.bzl delete mode 100644 python/private/py_library_rule_bazel.bzl rename python/private/{py_test_macro_bazel.bzl => py_test_macro.bzl} (93%) rename python/private/{py_test_rule_bazel.bzl => py_test_rule.bzl} (97%) diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index d16a27e74f..a4b6a5a440 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -97,11 +97,11 @@ sphinx_stardocs( "//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 diff --git a/docs/conf.py b/docs/conf.py index 9d3378241e..4c8e4a2a6b 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/python/BUILD.bazel b/python/BUILD.bazel index f2f3374db3..f3b5b136a7 100644 --- a/python/BUILD.bazel +++ b/python/BUILD.bazel @@ -124,7 +124,7 @@ bzl_library( 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 @@ bzl_library( 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 @@ bzl_library( 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/private/BUILD.bazel b/python/private/BUILD.bazel index d3b9bf4aad..7741e553ce 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -51,12 +51,6 @@ filegroup( visibility = ["//python:__pkg__"], ) -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"], @@ -260,17 +254,17 @@ bzl_library( ) 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,7 +339,7 @@ bzl_library( name = "py_executable_bazel_bzl", srcs = ["py_executable_bazel.bzl"], deps = [ - ":attributes_bazel_bzl", + ":attributes_bzl", ":common_bazel_bzl", ":common_bzl", ":py_executable_bzl", @@ -420,16 +414,15 @@ bzl_library( ) 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", @@ -502,17 +495,17 @@ bzl_library( ) 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", diff --git a/python/private/attributes.bzl b/python/private/attributes.bzl index 424a2c5ad6..a863e195bb 100644 --- a/python/private/attributes.bzl +++ b/python/private/attributes.bzl @@ -270,6 +270,22 @@ COMMON_ATTRS = union_attrs( 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 f87245d6ff..0000000000 --- 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/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 a6c4e97dac..83b3c18677 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_executable_bazel.bzl b/python/private/py_executable_bazel.bzl index 53206bdbfd..6f9c0947a3 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", diff --git a/python/private/py_library.bzl b/python/private/py_library.bzl index 1bc96b5e4b..6a65038e8a 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", @@ -50,6 +51,7 @@ _py_builtins = py_internal 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), { 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 b4f51eff1d..981253d63a 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 0000000000..ed64716122 --- /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 453abcb816..0000000000 --- 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_test_macro_bazel.bzl b/python/private/py_test_macro.bzl similarity index 93% rename from python/private/py_test_macro_bazel.bzl rename to python/private/py_test_macro.bzl index 24b78fef96..1f9330f8e5 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 369360d90f..64d5f21f81 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/py_binary.bzl b/python/py_binary.bzl index 349610865f..c7d57dab49 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 4ec1da4b27..12354a7deb 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 2aa93ff54b..7f6626e0e5 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") From f40038e14b17ad2ea17292bb3a6438ec28a7fc3b Mon Sep 17 00:00:00 2001 From: Mark Elliot <123787712+mark-thm@users.noreply.github.com> Date: Wed, 30 Oct 2024 12:11:53 -0400 Subject: [PATCH 287/345] fix: allow spaces in whl_librarys (#2334) Fixes #617. Modern `setuptools` versions contain files critical to setuptools functionality loaded proactively on module load that contain spaces. Bazel 7.4.0+ now supports files with spaces in their names. --------- Co-authored-by: Richard Levasseur Co-authored-by: Richard Levasseur --- CHANGELOG.md | 2 ++ examples/bzlmod/MODULE.bazel.lock | 6 ++-- python/private/BUILD.bazel | 6 ++++ python/private/glob_excludes.bzl | 32 +++++++++++++++++++ .../private/hermetic_runtime_repo_setup.bzl | 4 +-- python/private/pypi/BUILD.bazel | 1 + python/private/pypi/deps.bzl | 4 +-- python/private/pypi/whl_library_targets.bzl | 4 +-- python/private/util.bzl | 2 ++ .../whl_library_targets_tests.bzl | 15 +++++++-- 10 files changed, 65 insertions(+), 11 deletions(-) create mode 100644 python/private/glob_excludes.bzl diff --git a/CHANGELOG.md b/CHANGELOG.md index e85cfb46f2..028f0ed0a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,8 @@ A brief description of the categories of changes: * (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. +* (pypi) (Bazel 7.4+) Allow spaces in filenames included in `whl_library`s + ([617](https://github.com/bazelbuild/rules_python/issues/617)). {#v0-0-0-added} ### Added diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index c41380c6be..d36ec9fa0f 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1392,13 +1392,13 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "g9NnJTZcM2BjPelxHHLy0ZyhFd+8XAb86u9OvNIOhFo=", + "bzlTransitiveDigest": "ovGr2x1QDHBffYRqtz5fRgBCvBIG9xO/6Lk2UEnqj48=", "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", + "@@rules_python~~internal_deps~pypi__packaging//BUILD.bazel": "16cf02cdc6cd989d8a92b551d406abea3fe597b1524ba5fa88f0410010671d7f", "@@//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", @@ -6299,7 +6299,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "ctc7nzMsQfNG16wSXLqbix2k99rf614qJRwcd/2RxGI=", + "bzlTransitiveDigest": "OP8sZohIIGi+NNlfo7dAnU3yGo3Ea4xAU6TgzbPbCgw=", "usagesDigest": "LYtSAPzhPjmfD9vF39mCED1UQSvHEo2Hv+aK5Z4ZWWc=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 7741e553ce..7399b104e0 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -173,6 +173,12 @@ bzl_library( srcs = ["full_version.bzl"], ) +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"], diff --git a/python/private/glob_excludes.bzl b/python/private/glob_excludes.bzl new file mode 100644 index 0000000000..c98afe0ae2 --- /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 4b5a3c6810..cf9a5a6b1d 100644 --- a/python/private/hermetic_runtime_repo_setup.bzl +++ b/python/private/hermetic_runtime_repo_setup.bzl @@ -17,6 +17,7 @@ load("@rules_cc//cc:defs.bzl", "cc_import", "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") @@ -64,7 +65,6 @@ def define_hermetic_runtime_toolchain_impl( # 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), @@ -74,7 +74,7 @@ def define_hermetic_runtime_toolchain_impl( "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, + ] + glob_excludes.version_dependent_exclusions() + extra_files_glob_exclude, ), ) cc_import( diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel index 9be355c0c3..20afe70771 100644 --- a/python/private/pypi/BUILD.bazel +++ b/python/private/pypi/BUILD.bazel @@ -86,6 +86,7 @@ bzl_library( srcs = ["deps.bzl"], deps = [ "//python/private:bazel_tools_bzl", + "//python/private:glob_excludes_bzl", ], ) diff --git a/python/private/pypi/deps.bzl b/python/private/pypi/deps.bzl index e07d9aa8db..8949ed4abe 100644 --- a/python/private/pypi/deps.bzl +++ b/python/private/pypi/deps.bzl @@ -101,6 +101,7 @@ _GENERIC_WHEEL = """\ 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_library( "**/*.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/whl_library_targets.bzl b/python/private/pypi/whl_library_targets.bzl index 1798b9d775..a303bdcd9a 100644 --- a/python/private/pypi/whl_library_targets.bzl +++ b/python/private/pypi/whl_library_targets.bzl @@ -17,6 +17,7 @@ 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", @@ -222,7 +223,6 @@ def whl_library_targets( if hasattr(rules, "py_library"): _data_exclude = [ - "**/* *", "**/*.py", "**/*.pyc", "**/*.pyc.*", # During pyc creation, temp files named *.pyc.NNNN are created @@ -230,7 +230,7 @@ def whl_library_targets( # 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) diff --git a/python/private/util.bzl b/python/private/util.bzl index 033920d3bf..33261befaf 100644 --- a/python/private/util.bzl +++ b/python/private/util.bzl @@ -99,6 +99,8 @@ def define_bazel_6_provider(doc, fields, **kwargs): 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/tests/pypi/whl_library_targets/whl_library_targets_tests.bzl b/tests/pypi/whl_library_targets/whl_library_targets_tests.bzl index 9694eeec48..e69eb0f0e9 100644 --- a/tests/pypi/whl_library_targets/whl_library_targets_tests.bzl +++ b/tests/pypi/whl_library_targets/whl_library_targets_tests.bzl @@ -15,6 +15,7 @@ "" 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 = [] @@ -246,7 +247,12 @@ def _test_whl_and_library_deps(env): ), "data": [] + _glob( ["site-packages/**/*"], - exclude = ["**/* *", "**/*.py", "**/*.pyc", "**/*.pyc.*", "**/*.dist-info/RECORD"], + exclude = [ + "**/*.py", + "**/*.pyc", + "**/*.pyc.*", + "**/*.dist-info/RECORD", + ] + glob_excludes.version_dependent_exclusions(), ), "imports": ["site-packages"], "deps": [ @@ -312,7 +318,12 @@ def _test_group(env): "srcs": _glob(["site-packages/**/*.py"], exclude = [], allow_empty = True), "data": [] + _glob( ["site-packages/**/*"], - exclude = ["**/* *", "**/*.py", "**/*.pyc", "**/*.pyc.*", "**/*.dist-info/RECORD"], + exclude = [ + "**/*.py", + "**/*.pyc", + "**/*.pyc.*", + "**/*.dist-info/RECORD", + ] + glob_excludes.version_dependent_exclusions(), ), "imports": ["site-packages"], "deps": ["@pypi_bar_baz//:pkg"] + _select({ From 2b6308c1b5cb4f069943e37fcedb13c423d79803 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 30 Oct 2024 16:27:07 -0700 Subject: [PATCH 288/345] tests: don't restrict python versions in bzlmod example (#2362) Under Bazel 8, the bzlmod example is failing because newer versions of some dependencies request Python 3.8 to be available. To fix, just comment out the restriction in the example. The example has a somewhat large dependency footprint, so enforcing this restriction seems untenable. The config is left commented out so users can discover the feature. Fixes https://github.com/bazelbuild/rules_python/issues/2361 Fixes https://github.com/bazelbuild/bazel-central-registry/issues/3056 --- examples/bzlmod/MODULE.bazel | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel index 0e5c2c8a2d..57e6b7e7b7 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -40,14 +40,16 @@ python.toolchain( # 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. From b6fc2a080d4884510dea02cc77b4e0b8fd3a0ccd Mon Sep 17 00:00:00 2001 From: Mark Elliot <123787712+mark-thm@users.noreply.github.com> Date: Wed, 30 Oct 2024 23:35:05 -0400 Subject: [PATCH 289/345] fix: Remove --no-build-isolation from pip install command (#2360) Fixes #2328. In #2126, we discussed and added `--no-build-isolation` to ensure that sdist builds pulled from rules_python supplied dependencies. An unanticipated/misunderstood side-effect of this is that pip will no longer resolve necessary, declared build time dependencies from a package index. That's a significant point of friction for users, and, it's much harder to opt-out of the behavior than to opt-in given the presence of `extra_pip_args`. --- CHANGELOG.md | 4 ++++ examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/whl_library.bzl | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 028f0ed0a3..004d92c7bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,10 @@ A brief description of the categories of changes: ([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) {#v0-0-0-fixed} ### Fixed diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index d36ec9fa0f..b8ce0dc1de 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1392,7 +1392,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "ovGr2x1QDHBffYRqtz5fRgBCvBIG9xO/6Lk2UEnqj48=", + "bzlTransitiveDigest": "45JfYNdHqP7vwP3B2J7fF5SOBX2ewmWdn0AmVfmIYT8=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6299,7 +6299,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "OP8sZohIIGi+NNlfo7dAnU3yGo3Ea4xAU6TgzbPbCgw=", + "bzlTransitiveDigest": "pgIPI+ouKZGvpe1ZWE13QCQ5n0E4veB3tzWhx5XURJ0=", "usagesDigest": "LYtSAPzhPjmfD9vF39mCED1UQSvHEo2Hv+aK5Z4ZWWc=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", diff --git a/python/private/pypi/whl_library.bzl b/python/private/pypi/whl_library.bzl index 62c0c6ded5..612ca2cfdf 100644 --- a/python/private/pypi/whl_library.bzl +++ b/python/private/pypi/whl_library.bzl @@ -230,7 +230,7 @@ def _whl_library_impl(rctx): # 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) From 4dc05182e69e197217244219ce4a9f64356f3141 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Fri, 1 Nov 2024 21:09:43 -0700 Subject: [PATCH 290/345] docs: clarify that PyInfo.transitive_sources may not include py files (#2367) The docs previously somewhat implied that the `srcs` were always present, which isn't true for e.g. pyc-only builds. --- python/private/py_info.bzl | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/python/private/py_info.bzl b/python/private/py_info.bzl index 7a0bdeaef8..4b2b8888c9 100644 --- a/python/private/py_info.bzl +++ b/python/private/py_info.bzl @@ -129,11 +129,14 @@ to always include these files, as the originating target expects them to exist. "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`. - -These are `.py` source files that are considered required and downstream -binaries (or equivalent) must include in their outputs. +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. + +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; From 3367f82e9174edccbb093d2c3159ad6c16faf583 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 3 Nov 2024 19:59:54 +0900 Subject: [PATCH 291/345] fix(pypi): correctly pass `extra_pip_args` when building sdists (#2368) Before this change the `extra_pip_args` would not be passed down the chain if `experimental_index_url` is set. This adds a test and fixes the bug. Work towards #260 --- CHANGELOG.md | 2 + examples/bzlmod/MODULE.bazel.lock | 406 ++++++++++++++++++++++- python/private/pypi/extension.bzl | 30 +- tests/pypi/extension/extension_tests.bzl | 44 ++- 4 files changed, 464 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 004d92c7bb..95d1dc8530 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,8 @@ A brief description of the categories of changes: `bzlmod` users would have observed. * (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`. {#v0-0-0-added} ### Added diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index b8ce0dc1de..6e7d780a26 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1392,7 +1392,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "45JfYNdHqP7vwP3B2J7fF5SOBX2ewmWdn0AmVfmIYT8=", + "bzlTransitiveDigest": "HF4Ob8+IVv7X7DHag07k47pv+QywfyjKF8Z6Q7M5/oU=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -1488,6 +1488,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "zipp-3.20.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -1623,6 +1629,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "sphinx-7.2.6.tar.gz", "group_deps": [ "sphinx", @@ -1690,6 +1702,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "s3cmd-2.1.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -1816,6 +1834,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "lazy-object-proxy-1.10.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -1844,6 +1868,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "websockets-11.0.3.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -1984,6 +2014,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "urllib3-1.26.18.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -2040,6 +2076,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "sphinxcontrib_applehelp-1.0.7.tar.gz", "group_deps": [ "sphinx", @@ -2267,6 +2309,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "jinja2-3.1.4.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -2295,6 +2343,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "sphinxcontrib_qthelp-1.0.6.tar.gz", "group_deps": [ "sphinx", @@ -2381,6 +2435,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "setuptools-65.6.3.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -2430,6 +2490,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "chardet-4.0.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -2458,6 +2524,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "mccabe-0.7.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -2486,6 +2558,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "sphinxcontrib_serializinghtml-1.1.9.tar.gz", "group_deps": [ "sphinx", @@ -2544,6 +2622,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "docutils-0.20.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -2621,6 +2705,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "tomli-2.0.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -2700,6 +2790,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "Pygments-2.16.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -2729,6 +2825,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "wheel-0.40.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -2844,6 +2946,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "colorama-0.4.6.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -2949,6 +3057,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "MarkupSafe-2.1.3.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -3005,6 +3119,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "sphinxcontrib_htmlhelp-2.0.4.tar.gz", "group_deps": [ "sphinx", @@ -3070,6 +3190,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "typing_extensions-4.12.2.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -3243,6 +3369,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "tomlkit-0.11.6.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -3308,6 +3440,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "pylint-2.15.9.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -3336,6 +3474,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "pathspec-0.10.3.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -3476,6 +3620,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "packaging-23.2.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -3532,6 +3682,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "idna-2.10.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -3581,6 +3737,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "snowballstemmer-2.2.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -3730,6 +3892,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "dill-0.3.6.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -3933,6 +4101,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "platformdirs-2.6.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -4335,6 +4509,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "yamllint-1.28.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -4363,6 +4543,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "python-dateutil-2.8.2.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -4506,6 +4692,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "importlib_metadata-8.4.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -4718,6 +4910,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "sphinxcontrib-jsmath-1.0.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -4746,6 +4944,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "alabaster-0.7.13.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -4802,6 +5006,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "six-1.16.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -4831,6 +5041,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "requests-2.25.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -4990,6 +5206,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "Babel-2.13.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -5109,6 +5331,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "isort-5.11.4.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -5137,6 +5365,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "python-magic-0.4.27.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -5242,6 +5476,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "certifi-2023.7.22.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -5328,6 +5568,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "PyYAML-6.0.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -5356,6 +5602,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "sphinxcontrib_devhelp-1.0.5.tar.gz", "group_deps": [ "sphinx", @@ -5451,6 +5703,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "tabulate-0.9.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -5517,6 +5775,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "imagesize-1.4.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -5770,6 +6034,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "astroid-2.12.13.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -5912,6 +6182,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "pylint-print-1.0.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -6010,6 +6286,12 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], "filename": "wrapt-1.14.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", @@ -6299,7 +6581,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "pgIPI+ouKZGvpe1ZWE13QCQ5n0E4veB3tzWhx5XURJ0=", + "bzlTransitiveDigest": "oEqeANhT7TnWlFpmzRhRdWn9kCRKTen7mIV72CWlAIA=", "usagesDigest": "LYtSAPzhPjmfD9vF39mCED1UQSvHEo2Hv+aK5Z4ZWWc=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", @@ -6349,6 +6631,10 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "cffi-1.17.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -6471,6 +6757,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "urllib3-2.2.3.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -6543,6 +6833,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "charset_normalizer-3.4.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -6637,6 +6931,10 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "cryptography-43.0.3.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -6684,6 +6982,10 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "SecretStorage-3.3.3.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -6709,6 +7011,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "jaraco_functools-4.1.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -6778,6 +7084,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "idna-3.10.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -6821,6 +7131,10 @@ "experimental_target_platforms": [ "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "pywin32-ctypes-0.2.3.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -6871,6 +7185,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "pygments-2.18.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -6971,6 +7289,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "backports_tarfile-1.2.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -7040,6 +7362,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "jaraco.classes-3.4.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -7137,6 +7463,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "requests-toolbelt-1.0.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -7237,6 +7567,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "docutils-0.21.2.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -7262,6 +7596,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "keyring-25.4.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -7337,6 +7675,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "more-itertools-10.5.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -7387,6 +7729,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "certifi-2024.8.30.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -7509,6 +7855,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "mdurl-0.1.2.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -7584,6 +7934,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "rfc3986-2.0.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -7609,6 +7963,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "twine-5.1.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -7634,6 +7992,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "pkginfo-1.10.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -7684,6 +8046,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "markdown-it-py-3.0.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -7809,6 +8175,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "nh3-0.2.18.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -7834,6 +8204,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "requests-2.32.3.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -7878,6 +8252,10 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "pycparser-2.22.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -7953,6 +8331,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "importlib_metadata-8.5.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -8103,6 +8485,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "rich-13.9.3.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -8284,6 +8670,10 @@ "cp311_linux_s390x", "cp311_linux_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "jeepney-0.8.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -8356,6 +8746,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "zipp-3.20.2.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -8497,6 +8891,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "jaraco_context-6.0.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", @@ -8547,6 +8945,10 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], "filename": "readme_renderer-44.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", "repo": "rules_python_publish_deps_311", diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index dc02392d50..fdc76d5750 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -274,28 +274,28 @@ def _create_whl_repos( found_something = True 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 @@ -303,7 +303,7 @@ def _create_whl_repos( if len(requirements) > 1: target_platforms = requirement.target_platforms - whl_libraries[repo_name] = dict(whl_library_args.items()) + whl_libraries[repo_name] = args whl_map.setdefault(whl_name, []).append( whl_alias( diff --git a/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index 3d79e10d73..27c6bba5e2 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -167,7 +167,14 @@ def _test_simple_get_index(env): got_simpleapi_download_kwargs.update(kwargs) return { "simple": struct( - whls = {}, + whls = { + "deadb00f": struct( + yanked = False, + filename = "simple-0.0.1-py3-none-any.whl", + sha256 = "deadb00f", + url = "example2.org", + ), + }, sdists = { "deadbeef": struct( yanked = False, @@ -190,9 +197,15 @@ def _test_simple_get_index(env): 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", + }[x], ), available_interpreters = { "python_3_15_host": "unit_test_interpreter_target", @@ -205,6 +218,13 @@ def _test_simple_get_index(env): pypi.hub_group_map().contains_exactly({"pypi": {}}) pypi.hub_whl_map().contains_exactly({"pypi": { "simple": [ + struct( + config_setting = "//_config:is_python_3.15", + filename = "simple-0.0.1-py3-none-any.whl", + repo = "pypi_315_simple_py3_none_any_deadb00f", + target_platforms = None, + version = "3.15", + ), struct( config_setting = "//_config:is_python_3.15", filename = "simple-0.0.1.tar.gz", @@ -215,6 +235,25 @@ def _test_simple_get_index(env): ], }}) 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": [ @@ -227,6 +266,9 @@ def _test_simple_get_index(env): "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", From ae0aeff673c89fbd6340cd0823d0325511aea40f Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 4 Nov 2024 09:43:35 +0900 Subject: [PATCH 292/345] fix(pypi): use local version specifiers for patched whl output (#2365) Before this change the installation of the patched wheels using `uv` or similar would break. This change fixes that by using local version specifier, which is better than using a build tag when installing the wheels. Before the change: ```console $ cd examples/bzlmod $ bazel build @pip//requests:whl $ uv pip install error: The wheel filename "requests-2.25.1-patched-py2.py3-none-any.whl" has an invalid build tag: must start with a digit ``` After: ``` $ uv pip install Resolved 5 packages in 288ms Prepared 5 packages in 152ms Installed 5 packages in 13ms + certifi==2024.8.30 + chardet==4.0.0 + idna==2.10 + requests==2.25.1+patched (from file:///home/aignas/src/github/aignas/rules_python/examples/bzlmod/bazel-bzlmod/external/rules_python~~pip~pip_39_requests_py2_none_any_c210084e/requests-2.25.1+patched-py2.py3-none-any.whl) + urllib3==1.26.20 ``` --- CHANGELOG.md | 2 ++ examples/bzlmod/MODULE.bazel.lock | 4 +-- python/private/pypi/patch_whl.bzl | 45 ++++++++++++++++++------ tests/pypi/patch_whl/BUILD.bazel | 3 ++ tests/pypi/patch_whl/patch_whl_tests.bzl | 40 +++++++++++++++++++++ 5 files changed, 81 insertions(+), 13 deletions(-) create mode 100644 tests/pypi/patch_whl/BUILD.bazel create mode 100644 tests/pypi/patch_whl/patch_whl_tests.bzl diff --git a/CHANGELOG.md b/CHANGELOG.md index 95d1dc8530..f21f9bb3cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,8 @@ A brief description of the categories of changes: ([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. {#v0-0-0-added} ### Added diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 6e7d780a26..d34f4ecb73 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1392,7 +1392,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "HF4Ob8+IVv7X7DHag07k47pv+QywfyjKF8Z6Q7M5/oU=", + "bzlTransitiveDigest": "qxyKk6sb6G2WeW3iUlRmVO5jafUab5qPwz66Y2anPp8=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -6581,7 +6581,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "oEqeANhT7TnWlFpmzRhRdWn9kCRKTen7mIV72CWlAIA=", + "bzlTransitiveDigest": "6NoEDGeQugmtzNzf4Emcb8Sb/cW3RTxSSA6DTHLB1/A=", "usagesDigest": "LYtSAPzhPjmfD9vF39mCED1UQSvHEo2Hv+aK5Z4ZWWc=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", diff --git a/python/private/pypi/patch_whl.bzl b/python/private/pypi/patch_whl.bzl index 74cd890bad..a7da224321 100644 --- a/python/private/pypi/patch_whl.bzl +++ b/python/private/pypi/patch_whl.bzl @@ -32,6 +32,39 @@ load(":parse_whl_name.bzl", "parse_whl_name") _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 @@ def patch_whl(rctx, *, python_interpreter, whl_path, patches, **kwargs): 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/tests/pypi/patch_whl/BUILD.bazel b/tests/pypi/patch_whl/BUILD.bazel new file mode 100644 index 0000000000..d6c4f47b36 --- /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 0000000000..f93fe459c9 --- /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) From 218f8e161830ccd4f731a6a8d2a6dd36efe4488a Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Tue, 5 Nov 2024 10:50:26 +0900 Subject: [PATCH 293/345] fix(bzlmod): allow users to specify extra targets to be added to hub repos (#2369) Before this change, it was impossible for users to use the targets created with `additive_build_content` whl annotation unless they relied on the implementation detail of the naming of the spoke repositories and had `use_repo` statements in their `MODULE.bazel` files importing the spoke repos. With #2325 in the works, users will have to change their `use_repo` statements, which is going to be disruptive. In order to offer them an alternative for not relying on the names of the spokes, there has to be a way to expose the extra targets created and this PR implements a method. Incidentally, the same would have happened if we wanted to stabilize the #260 work and mark `experimental_index_url` as non-experimental anymore. I was hoping we could autodetect them by parsing the build content ourselves in the `pip` extension, but it turned out to be extremely tricky and I figured that it was better to have an API rather than not have it. Whilst at it, also relax the naming requirements for the `whl_modifications` attribute. Fixes #2187 --- .bazelci/presubmit.yml | 19 ++-- CHANGELOG.md | 5 + examples/bzlmod/BUILD.bazel | 14 ++- examples/bzlmod/MODULE.bazel | 3 + examples/bzlmod/MODULE.bazel.lock | 13 ++- python/private/pypi/extension.bzl | 35 +++++-- python/private/pypi/hub_repository.bzl | 5 + python/private/pypi/render_pkg_aliases.bzl | 24 +++-- tests/pypi/extension/extension_tests.bzl | 112 ++++++++++++++++++++- 9 files changed, 196 insertions(+), 34 deletions(-) diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 5d51b106ed..a5f893fa89 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -65,15 +65,6 @@ buildifier: .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 @@ -268,17 +259,23 @@ tasks: integration_test_bzlmod_ubuntu_lockfile: <<: *reusable_build_test_all <<: *coverage_targets_example_bzlmod - <<: *lockfile_mode_error name: "examples/bzlmod: Ubuntu with lockfile" working_directory: examples/bzlmod platform: ubuntu2004 + shell_commands: + # Update the lockfiles and fail if it is different. + - "../../tools/private/update_bzlmod_lockfiles.sh" + - "git diff --exit-code" 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 + shell_commands: + # Update the lockfiles and fail if it is different. + - "../../tools/private/update_bzlmod_lockfiles.sh" + - "git diff --exit-code" integration_test_bzlmod_generate_build_file_generation_ubuntu_min: <<: *minimum_supported_version diff --git a/CHANGELOG.md b/CHANGELOG.md index f21f9bb3cc..d5b757e02e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,8 @@ A brief description of the categories of changes: 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. {#v0-0-0-fixed} ### Fixed @@ -58,6 +60,9 @@ A brief description of the categories of changes: 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). {#v0-0-0-removed} ### Removed diff --git a/examples/bzlmod/BUILD.bazel b/examples/bzlmod/BUILD.bazel index d684b9c31d..054b957b3b 100644 --- a/examples/bzlmod/BUILD.bazel +++ b/examples/bzlmod/BUILD.bazel @@ -69,16 +69,24 @@ py_test_with_transition( # 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 57e6b7e7b7..4381cb0d70 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -183,6 +183,9 @@ pip.parse( "cp39_linux_*", "cp39_*", ], + extra_hub_aliases = { + "wheel": ["generated_file"], + }, hub_name = "pip", python_version = "3.9", requirements_lock = "requirements_lock_3_9.txt", diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index d34f4ecb73..c115ef974f 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1392,8 +1392,8 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "qxyKk6sb6G2WeW3iUlRmVO5jafUab5qPwz66Y2anPp8=", - "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", + "bzlTransitiveDigest": "E5Yr6AjquyIy5ae3c7URmvtPPOm2j+7XOr58GOHp8vw=", + "usagesDigest": "iVxh/vcpGrSKpO8rafQwAe7uq+pHhasSXC7Pg4o/1dw=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", "@@rules_python~//python/private/pypi/whl_installer/platform.py": "b944b908b25a2f97d6d9f491504ad5d2507402d7e37c802ee878783f87f2aa11", @@ -3239,6 +3239,7 @@ "ruleClassName": "hub_repository", "attributes": { "repo_name": "other_module_pip", + "extra_hub_aliases": {}, "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\"}]" }, @@ -4564,6 +4565,11 @@ "ruleClassName": "hub_repository", "attributes": { "repo_name": "pip", + "extra_hub_aliases": { + "wheel": [ + "generated_file" + ] + }, "whl_map": { "alabaster": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_alabaster\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", "astroid": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_astroid\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", @@ -6581,7 +6587,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "6NoEDGeQugmtzNzf4Emcb8Sb/cW3RTxSSA6DTHLB1/A=", + "bzlTransitiveDigest": "wz5L+/+R6gOtD681pNVgPUUipqqPH0bP/b0e22JbSOI=", "usagesDigest": "LYtSAPzhPjmfD9vF39mCED1UQSvHEo2Hv+aK5Z4ZWWc=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", @@ -8765,6 +8771,7 @@ "ruleClassName": "hub_repository", "attributes": { "repo_name": "rules_python_publish_deps", + "extra_hub_aliases": {}, "whl_map": { "backports_tarfile": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"backports.tarfile-1.2.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"backports_tarfile-1.2.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2\",\"target_platforms\":null,\"version\":\"3.11\"}]", "certifi": "[{\"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\":null,\"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\":null,\"version\":\"3.11\"}]", diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index fdc76d5750..c5660272ec 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -104,6 +104,10 @@ def _create_whl_repos( # 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 @@ -136,7 +140,7 @@ def _create_whl_repos( 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 = { @@ -214,10 +218,6 @@ def _create_whl_repos( 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) @@ -231,7 +231,7 @@ def _create_whl_repos( ) 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, @@ -353,6 +353,7 @@ def _create_whl_repos( is_reproducible = is_reproducible, whl_map = whl_map, exposed_packages = exposed_packages, + extra_aliases = extra_aliases, whl_libraries = whl_libraries, ) @@ -437,6 +438,7 @@ You cannot use both the additive_build_content and additive_build_content_file a hub_whl_map = {} hub_group_map = {} exposed_packages = {} + extra_aliases = {} whl_libraries = {} is_reproducible = True @@ -486,6 +488,9 @@ You cannot use both the additive_build_content and additive_build_content_file a hub_whl_map.setdefault(hub_name, {}) for key, settings in out.whl_map.items(): hub_whl_map[hub_name].setdefault(key, []).extend(settings) + 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 @@ -514,6 +519,13 @@ You cannot use both the additive_build_content and additive_build_content_file a 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 = dict(sorted(whl_libraries.items())), is_reproducible = is_reproducible, ) @@ -598,6 +610,7 @@ def _pip_impl(module_ctx): 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() @@ -684,6 +697,16 @@ The indexes must support Simple API as described here: https://packaging.python.org/en/latest/specifications/simple-repository-api/ """, ), + "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, + ), "hub_name": attr.string( mandatory = True, doc = """ diff --git a/python/private/pypi/hub_repository.bzl b/python/private/pypi/hub_repository.bzl index 7afb616e3d..69d937142a 100644 --- a/python/private/pypi/hub_repository.bzl +++ b/python/private/pypi/hub_repository.bzl @@ -35,6 +35,7 @@ def _impl(rctx): key: [whl_alias(**v) for v in json.decode(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 +66,10 @@ def _impl(rctx): 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, ), diff --git a/python/private/pypi/render_pkg_aliases.bzl b/python/private/pypi/render_pkg_aliases.bzl index 0086bfff8f..60f4b54306 100644 --- a/python/private/pypi/render_pkg_aliases.bzl +++ b/python/private/pypi/render_pkg_aliases.bzl @@ -117,7 +117,7 @@ def _render_whl_library_alias( **kwargs ) -def _render_common_aliases(*, name, aliases, group_name = None): +def _render_common_aliases(*, name, aliases, extra_aliases = [], group_name = None): lines = [ """load("@bazel_skylib//lib:selects.bzl", "selects")""", """package(default_visibility = ["//visibility:public"])""", @@ -153,12 +153,17 @@ def _render_common_aliases(*, name, aliases, group_name = None): target_name = target_name, visibility = ["//_groups:__subpackages__"] if name.startswith("_") else None, ) - 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() + 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, + } | { + x: x + for x in extra_aliases + } + ).items() ], ) if group_name: @@ -177,7 +182,7 @@ def _render_common_aliases(*, name, aliases, group_name = None): return "\n\n".join(lines) -def render_pkg_aliases(*, aliases, requirement_cycles = None): +def render_pkg_aliases(*, aliases, requirement_cycles = None, extra_hub_aliases = {}): """Create alias declarations for each PyPI package. The aliases should be appended to the pip_repository BUILD.bazel file. These aliases @@ -188,6 +193,8 @@ def render_pkg_aliases(*, aliases, requirement_cycles = None): aliases: dict, the keys are normalized distribution names and values are the whl_alias 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. Returns: A dict of file paths and their contents. @@ -215,6 +222,7 @@ def render_pkg_aliases(*, aliases, requirement_cycles = None): "{}/BUILD.bazel".format(normalize_name(name)): _render_common_aliases( name = normalize_name(name), aliases = pkg_aliases, + extra_aliases = extra_hub_aliases.get(name, []), group_name = whl_group_mapping.get(normalize_name(name)), ).strip() for name, pkg_aliases in aliases.items() diff --git a/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index 27c6bba5e2..aa120af83d 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -20,12 +20,12 @@ load("//python/private/pypi:extension.bzl", "parse_modules") # buildifier: disa _tests = [] -def _mock_mctx(*modules, environ = {}, read = None): +def _mock_mctx(*modules, environ = {}, read = None, os_name = "unittest", os_arch = "exotic"): return struct( os = struct( environ = environ, - name = "unittest", - arch = "exotic", + name = os_name, + arch = os_arch, ), read = read or (lambda _: "simple==0.0.1 --hash=sha256:deadbeef"), modules = [ @@ -61,6 +61,7 @@ def _parse_modules(env, **kwargs): attrs = dict( is_reproducible = subjects.bool, exposed_packages = subjects.dict, + extra_aliases = subjects.dict, hub_group_map = subjects.dict, hub_whl_map = subjects.dict, whl_libraries = subjects.dict, @@ -68,6 +69,29 @@ def _parse_modules(env, **kwargs): ), ) +def _whl_mods( + *, + whl_name, + hub_name, + additive_build_content = None, + additive_build_content_file = None, + copy_executables = {}, + copy_files = {}, + data = [], + data_exclude_glob = [], + srcs_exclude_glob = []): + return struct( + additive_build_content = additive_build_content, + additive_build_content_file = additive_build_content_file, + copy_executables = copy_executables, + copy_files = copy_files, + data = data, + data_exclude_glob = data_exclude_glob, + hub_name = hub_name, + srcs_exclude_glob = srcs_exclude_glob, + whl_name = whl_name, + ) + def _parse( *, hub_name, @@ -81,6 +105,7 @@ def _parse( experimental_index_url = "", experimental_requirement_cycles = {}, experimental_target_platforms = [], + extra_hub_aliases = {}, extra_pip_args = [], isolated = True, netrc = None, @@ -106,6 +131,7 @@ def _parse( 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, @@ -158,6 +184,86 @@ def _test_simple(env): _tests.append(_test_simple) +def _test_simple_with_whl_mods(env): + pypi = _parse_modules( + env, + module_ctx = _mock_mctx( + _mod( + name = "rules_python", + whl_mods = [ + _whl_mods( + additive_build_content = """\ +filegroup( + name = "foo", + srcs = ["all"], +)""", + hub_name = "whl_mods_hub", + whl_name = "simple", + ), + ], + parse = [ + _parse( + hub_name = "pypi", + python_version = "3.15", + requirements_lock = "requirements.txt", + extra_hub_aliases = { + "simple": ["foo"], + }, + whl_modifications = { + "@whl_mods_hub//:simple.json": "simple", + }, + ), + ], + ), + os_name = "linux", + os_arch = "aarch64", + ), + available_interpreters = { + "python_3_15_host": "unit_test_interpreter_target", + }, + ) + + pypi.is_reproducible().equals(True) + pypi.exposed_packages().contains_exactly({"pypi": []}) + pypi.extra_aliases().contains_exactly({ + "pypi": {"simple": ["foo"]}, + }) + pypi.hub_group_map().contains_exactly({"pypi": {}}) + pypi.hub_whl_map().contains_exactly({"pypi": { + "simple": [ + struct( + config_setting = "//_config:is_python_3.15", + filename = None, + repo = "pypi_315_simple", + target_platforms = None, + version = "3.15", + ), + ], + }}) + pypi.whl_libraries().contains_exactly({ + "pypi_315_simple": { + "annotation": "@whl_mods_hub//:simple.json", + "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({ + "whl_mods_hub": { + "simple": struct( + build_content = "filegroup(\n name = \"foo\",\n srcs = [\"all\"],\n)", + copy_executables = {}, + copy_files = {}, + data = [], + data_exclude_glob = [], + srcs_exclude_glob = [], + ), + }, + }) + +_tests.append(_test_simple_with_whl_mods) + def _test_simple_get_index(env): got_simpleapi_download_args = [] got_simpleapi_download_kwargs = {} From 203897526e6ff85bd51a84efb3227137ce366fe3 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 6 Nov 2024 15:56:54 -0800 Subject: [PATCH 294/345] fix: make sphinxdocs support directory inputs (#2375) The logic to relocate files assumed that all the inputs were plain file artifacts. When a directory artifact was used, then `ctx.actions.symlink()` would fail because it requires the output artifact and input target artifact to be the same type of file (plain file or directory). To fix, use `File.is_directory` to detect if the input is a directory or file, then call `declare_file()` or `declare_directory()` as appropriate. The later `symlink()` call is then happy the two args match. Fixes https://github.com/bazelbuild/rules_python/issues/2374 --- sphinxdocs/private/sphinx.bzl | 7 +++- sphinxdocs/tests/sphinx_docs/BUILD.bazel | 45 ++++++++++++++++++++++++ sphinxdocs/tests/sphinx_docs/conf.py | 15 ++++++++ sphinxdocs/tests/sphinx_docs/defs.bzl | 19 ++++++++++ sphinxdocs/tests/sphinx_docs/index.md | 8 +++++ 5 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 sphinxdocs/tests/sphinx_docs/BUILD.bazel create mode 100644 sphinxdocs/tests/sphinx_docs/conf.py create mode 100644 sphinxdocs/tests/sphinx_docs/defs.bzl create mode 100644 sphinxdocs/tests/sphinx_docs/index.md diff --git a/sphinxdocs/private/sphinx.bzl b/sphinxdocs/private/sphinx.bzl index 2ee6cfccf1..678d01bca7 100644 --- a/sphinxdocs/private/sphinx.bzl +++ b/sphinxdocs/private/sphinx.bzl @@ -325,7 +325,12 @@ def _sphinx_source_tree_impl(ctx): 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 0000000000..1a05db0ea3 --- /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 0000000000..d96fa36690 --- /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 0000000000..2e47ecc0f7 --- /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 0000000000..cdce641fa1 --- /dev/null +++ b/sphinxdocs/tests/sphinx_docs/index.md @@ -0,0 +1,8 @@ +# Sphinx docs test + +:::{toctree} +:glob: + +** +genindex +::: From d66e55c920d50cc7b3c08a7589441ea366bcbc90 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:51:31 +0900 Subject: [PATCH 295/345] feat(bzlmod): cross-platform builds without experimental_index_url (#2325) With this change we finally generate the same lock file within the legacy code `pip.parse` code path and it allows to slowly transition to using the new code path as much as possible without user doing anything. This moves the selection of the host-compatible lock file from the extension evaluation to the build phase - note, we will generate extra repositories here which might not work on the host platform, however, if the users are consuming the `whl_library` repos through the hub repo only, then everything should work. A known issue is that it may break `bazel query` and in these usecases it is advisable to use `cquery` until we have `sdist` cross-building from source fully working. Summary: - feat: reuse the `render_pkg_aliases` for when filename is not known but platform is known - feat: support generating the extra config settings required - feat: `get_whl_flag_versions` now generates extra args for the rules - feat: make lock file generation the same irrespective of the host platform - test: add an extra test with multiple requirements files - feat: support cross-platform builds using `download_only = True` in legacy setups Note, that users depending on the naming of the whl libraries will need to start using `extra_hub_aliases` attribute instead to keep their setups not relying on this implementation detail. Fixes #2268 Work towards #260 --------- Co-authored-by: Richard Levasseur --- CHANGELOG.md | 17 + MODULE.bazel | 13 +- docs/pypi-dependencies.md | 53 +++ examples/bzlmod/MODULE.bazel | 3 + examples/bzlmod/MODULE.bazel.lock | 8 +- python/private/pypi/config_settings.bzl | 13 +- python/private/pypi/extension.bzl | 129 +++++--- python/private/pypi/parse_requirements.bzl | 6 +- python/private/pypi/render_pkg_aliases.bzl | 58 ++-- python/private/pypi/whl_repo_name.bzl | 27 +- tests/pypi/extension/extension_tests.bzl | 307 ++++++++++++------ .../parse_requirements_tests.bzl | 78 +++++ .../render_pkg_aliases_test.bzl | 92 +++++- 13 files changed, 630 insertions(+), 174 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5b757e02e..8eb269c39c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,12 @@ A brief description of the categories of changes: [`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 to avoid such breakage in the future. If `rules_python` is missing + features to allow one to do that, please raise tickets. {#v0-0-0-fixed} ### Fixed @@ -51,6 +57,12 @@ A brief description of the categories of changes: 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. 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-0-0-added} ### Added @@ -63,6 +75,11 @@ A brief description of the categories of changes: * (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-0-0-removed} ### Removed diff --git a/MODULE.bazel b/MODULE.bazel index de14b86f1b..50f137690c 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -56,6 +56,10 @@ register_toolchains("@pythons_hub//:all") pip = use_extension("//python/private/pypi:pip.bzl", "pip_internal") 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 = { @@ -90,17 +94,20 @@ dev_python.override( ) 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", diff --git a/docs/pypi-dependencies.md b/docs/pypi-dependencies.md index 636fefb33d..28e630c61d 100644 --- a/docs/pypi-dependencies.md +++ b/docs/pypi-dependencies.md @@ -307,6 +307,59 @@ leg of the dependency manually. For instance by making perhaps `apache-airflow-providers-common-sql`. +(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. diff --git a/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel index 4381cb0d70..1b8bbbf5e3 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -221,6 +221,9 @@ pip.parse( "host", ], hub_name = "pip", + # Parse all requirements files for the same lock file on all OSes, this will + # become the default with 1.0 release + parse_all_requirements_files = True, python_version = "3.10", # The requirements files for each platform that we want to support. requirements_by_platform = { diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index c115ef974f..eb578f681d 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1392,8 +1392,8 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "E5Yr6AjquyIy5ae3c7URmvtPPOm2j+7XOr58GOHp8vw=", - "usagesDigest": "iVxh/vcpGrSKpO8rafQwAe7uq+pHhasSXC7Pg4o/1dw=", + "bzlTransitiveDigest": "0Qn7Q9FuTxYCxMKm2DsW7mbXYcxL71sS/l1baXvY1vA=", + "usagesDigest": "GGeczTmsfE4YHAy32dV/jfOfbYmpyu/QGe35drFuZ5E=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", "@@rules_python~//python/private/pypi/whl_installer/platform.py": "b944b908b25a2f97d6d9f491504ad5d2507402d7e37c802ee878783f87f2aa11", @@ -6587,8 +6587,8 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "wz5L+/+R6gOtD681pNVgPUUipqqPH0bP/b0e22JbSOI=", - "usagesDigest": "LYtSAPzhPjmfD9vF39mCED1UQSvHEo2Hv+aK5Z4ZWWc=", + "bzlTransitiveDigest": "SnuwsgZv1SGZz4jVPvwaEUwPTnea18fXIueD9vSR3sQ=", + "usagesDigest": "O2O2oBIbKEglN2K3FECsRxUKVS/zg/6a86F3MO1ZtmY=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", "@@rules_python~//tools/publish/requirements_windows.txt": "7673adc71dc1a81d3661b90924d7a7c0fc998cd508b3cb4174337cef3f2de556", diff --git a/python/private/pypi/config_settings.bzl b/python/private/pypi/config_settings.bzl index 492acf1895..9f3f4d4e48 100644 --- a/python/private/pypi/config_settings.bzl +++ b/python/private/pypi/config_settings.bzl @@ -148,6 +148,13 @@ def config_settings( ) 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 @@ -277,7 +284,7 @@ def _plat_flag_values(os, cpu, osx_versions, glibc_versions, muslc_versions): 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 +317,10 @@ def _dist_config_setting(*, name, is_pip_whl, is_python, python_version, native # `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/extension.bzl b/python/private/pypi/extension.bzl index c5660272ec..7b31d0d50c 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -31,7 +31,7 @@ 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_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) @@ -260,10 +260,10 @@ def _create_whl_repos( 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 @@ -319,35 +319,69 @@ def _create_whl_repos( 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. + if not pip_attr.parse_all_requirements_files: + 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)) + + whl_library_args["requirement"] = requirement.requirement_line + if requirement.extra_pip_args: + whl_library_args["extra_pip_args"] = requirement.extra_pip_args + + # 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_libraries[repo_name] = dict(whl_library_args.items()) + whl_map.setdefault(whl_name, []).append( + whl_alias( + repo = repo_name, + version = major_minor, + ), + ) continue - elif 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 + 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)) + + 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, []).append( + whl_alias( + repo = repo_name, + version = major_minor, + target_platforms = target_platforms or None, + ), + ) - # 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_libraries[repo_name] = dict(whl_library_args.items()) - whl_map.setdefault(whl_name, []).append( - whl_alias( - repo = repo_name, - version = major_minor, - ), - ) + if is_exposed: + exposed_packages[whl_name] = None return struct( is_reproducible = is_reproducible, @@ -502,7 +536,8 @@ You cannot use both the additive_build_content and additive_build_content_file a hub_group_map[hub_name] = pip_attr.experimental_requirement_cycles return struct( - # We sort the output here so that the lock file is sorted + # 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. whl_mods = dict(sorted(whl_mods.items())), hub_whl_map = { hub_name: { @@ -518,7 +553,10 @@ You cannot use both the additive_build_content and additive_build_content_file a } for hub_name, group_map in sorted(hub_group_map.items()) }, - exposed_packages = {k: sorted(v) for k, v in sorted(exposed_packages.items())}, + exposed_packages = { + k: sorted(v) + for k, v in sorted(exposed_packages.items()) + }, extra_aliases = { hub_name: { whl_name: sorted(aliases) @@ -526,7 +564,10 @@ You cannot use both the additive_build_content and additive_build_content_file a } for hub_name, extra_whl_aliases in extra_aliases.items() }, - whl_libraries = dict(sorted(whl_libraries.items())), + whl_libraries = { + k: dict(sorted(args.items())) + for k, args in sorted(whl_libraries.items()) + }, is_reproducible = is_reproducible, ) @@ -601,10 +642,8 @@ def _pip_impl(module_ctx): # Build all of the wheel modifications if the tag class is called. _whl_mods_impl(mods.whl_mods) - for name, args in sorted(mods.whl_libraries.items()): - # 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. - whl_library(name = name, **dict(sorted(args.items()))) + for name, args in mods.whl_libraries.items(): + whl_library(name = name, **args) for hub_name, whl_map in mods.hub_whl_map.items(): hub_repository( @@ -746,6 +785,20 @@ find in case extra indexes are specified. """, default = True, ), + "parse_all_requirements_files": attr.bool( + default = False, + doc = """\ +A temporary flag to enable users to make `pip` extension result always +the same independent of the whether transitive dependencies use {bzl:attr}`experimental_index_url` or not. + +This enables users to migrate to a solution that fixes +[#2268](https://github.com/bazelbuild/rules_python/issues/2268). + +::::{deprecated} 0.38.0 +This is a transition flag and will be removed in a subsequent release. +:::: +""", + ), "python_version": attr.string( mandatory = True, doc = """ @@ -907,24 +960,22 @@ 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. + +TODO: will be removed before 1.0. """, implementation = _pip_non_reproducible, tag_classes = { diff --git a/python/private/pypi/parse_requirements.bzl b/python/private/pypi/parse_requirements.bzl index aacc8bdbc0..a43217dbc2 100644 --- a/python/private/pypi/parse_requirements.bzl +++ b/python/private/pypi/parse_requirements.bzl @@ -168,7 +168,7 @@ def parse_requirements( ) 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) @@ -212,6 +212,8 @@ def parse_requirements( 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. @@ -243,6 +245,8 @@ def select_requirement(requirements, *, platform): 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/render_pkg_aliases.bzl b/python/private/pypi/render_pkg_aliases.bzl index 60f4b54306..7a759799dd 100644 --- a/python/private/pypi/render_pkg_aliases.bzl +++ b/python/private/pypi/render_pkg_aliases.bzl @@ -326,16 +326,19 @@ def multiplatform_whl_aliases(*, aliases, **kwargs): ret = [] versioned_additions = {} for alias in aliases: - if not alias.filename: + if not alias.filename and not alias.target_platforms: 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, + 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 "", **kwargs ) @@ -437,10 +440,7 @@ def get_whl_flag_versions(aliases): if a.version: python_versions[a.version] = None - if not a.filename: - continue - - if a.filename.endswith(".whl") and not a.filename.endswith("-any.whl"): + if a.filename and a.filename.endswith(".whl") and not a.filename.endswith("-any.whl"): parsed = parse_whl_name(a.filename) else: for plat in a.target_platforms or []: @@ -499,10 +499,11 @@ def get_filename_config_settings( *, filename, target_platforms, - glibc_versions, - muslc_versions, - osx_versions, - python_version): + python_version, + glibc_versions = None, + muslc_versions = None, + osx_versions = None, + non_whl_prefix = "sdist"): """Get the filename config settings. Args: @@ -512,6 +513,8 @@ def get_filename_config_settings( 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: @@ -520,19 +523,20 @@ def get_filename_config_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"): + 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) + parsed = parse_whl_name(filename) if parsed.python_tag == "py2.py3": py = "py" @@ -547,10 +551,10 @@ def get_filename_config_settings( abi = parsed.abi_tag if parsed.platform_tag == "any": - prefixes = ["{}_{}_any".format(py, abi)] + prefixes = ["_{}_{}_any".format(py, abi)] suffixes = [_non_versioned_platform(p) for p in target_platforms or []] else: - prefixes = ["{}_{}".format(py, abi)] + prefixes = ["_{}_{}".format(py, abi)] suffixes = _whl_config_setting_suffixes( platform_tag = parsed.platform_tag, glibc_versions = glibc_versions, @@ -559,12 +563,12 @@ def get_filename_config_settings( setting_supported_versions = setting_supported_versions, ) else: - prefixes = ["sdist"] + prefixes = [""] if not non_whl_prefix else ["_" + non_whl_prefix] 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) + ":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 @@ -572,9 +576,9 @@ def get_filename_config_settings( } if suffixes or versioned: - return [":is_cp{}_{}_{}".format(python_version, p, s) for p in prefixes for s in suffixes], 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 + return [":is_cp{}{}".format(python_version, p) for p in prefixes], setting_supported_versions def _whl_config_setting_suffixes( platform_tag, diff --git a/python/private/pypi/whl_repo_name.bzl b/python/private/pypi/whl_repo_name.bzl index 295f5a45c4..38ed600cd1 100644 --- a/python/private/pypi/whl_repo_name.bzl +++ b/python/private/pypi/whl_repo_name.bzl @@ -22,12 +22,12 @@ def whl_repo_name(prefix, filename, sha256): """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 @@ def whl_repo_name(prefix, filename, sha256): 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/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index aa120af83d..0405bad4d8 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -20,14 +20,14 @@ load("//python/private/pypi:extension.bzl", "parse_modules") # buildifier: disa _tests = [] -def _mock_mctx(*modules, environ = {}, read = None, os_name = "unittest", os_arch = "exotic"): +def _mock_mctx(*modules, environ = {}, read = None): return struct( os = struct( environ = environ, - name = os_name, - arch = os_arch, + name = "unittest", + arch = "exotic", ), - read = read or (lambda _: "simple==0.0.1 --hash=sha256:deadbeef"), + read = read or (lambda _: "simple==0.0.1 --hash=sha256:deadbeef --hash=sha256:deadbaaf"), modules = [ struct( name = modules[0].name, @@ -61,7 +61,6 @@ def _parse_modules(env, **kwargs): attrs = dict( is_reproducible = subjects.bool, exposed_packages = subjects.dict, - extra_aliases = subjects.dict, hub_group_map = subjects.dict, hub_whl_map = subjects.dict, whl_libraries = subjects.dict, @@ -69,29 +68,6 @@ def _parse_modules(env, **kwargs): ), ) -def _whl_mods( - *, - whl_name, - hub_name, - additive_build_content = None, - additive_build_content_file = None, - copy_executables = {}, - copy_files = {}, - data = [], - data_exclude_glob = [], - srcs_exclude_glob = []): - return struct( - additive_build_content = additive_build_content, - additive_build_content_file = additive_build_content_file, - copy_executables = copy_executables, - copy_files = copy_files, - data = data, - data_exclude_glob = data_exclude_glob, - hub_name = hub_name, - srcs_exclude_glob = srcs_exclude_glob, - whl_name = whl_name, - ) - def _parse( *, hub_name, @@ -109,6 +85,7 @@ def _parse( extra_pip_args = [], isolated = True, netrc = None, + parse_all_requirements_files = True, pip_data_exclude = None, python_interpreter = None, python_interpreter_target = None, @@ -136,6 +113,7 @@ def _parse( 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, @@ -176,47 +154,137 @@ def _test_simple(env): ) pypi.is_reproducible().equals(True) - pypi.exposed_packages().contains_exactly({"pypi": []}) + pypi.exposed_packages().contains_exactly({"pypi": ["simple"]}) pypi.hub_group_map().contains_exactly({"pypi": {}}) - pypi.hub_whl_map().contains_exactly({"pypi": {}}) - pypi.whl_libraries().contains_exactly({}) + pypi.hub_whl_map().contains_exactly({"pypi": { + "simple": [ + struct( + config_setting = "//_config:is_python_3.15", + filename = None, + repo = "pypi_315_simple", + target_platforms = None, + 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_with_whl_mods(env): +def _test_simple_multiple_requirements(env): pypi = _parse_modules( env, module_ctx = _mock_mctx( _mod( name = "rules_python", - whl_mods = [ - _whl_mods( - additive_build_content = """\ -filegroup( - name = "foo", - srcs = ["all"], -)""", - hub_name = "whl_mods_hub", - whl_name = "simple", + 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": [ + struct( + config_setting = "//_config:is_python_3.15", + filename = None, + repo = "pypi_315_simple_windows_x86_64", + target_platforms = [ + "cp315_windows_x86_64", + ], + version = "3.15", + ), + struct( + config_setting = "//_config:is_python_3.15", + filename = None, + repo = "pypi_315_simple_osx_aarch64_osx_x86_64", + target_platforms = [ + "cp315_osx_aarch64", + "cp315_osx_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_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", - requirements_lock = "requirements.txt", - extra_hub_aliases = { - "simple": ["foo"], - }, - whl_modifications = { - "@whl_mods_hub//:simple.json": "simple", + download_only = True, + requirements_by_platform = { + "requirements.linux_x86_64.txt": "linux_x86_64", + "requirements.osx_aarch64.txt": "osx_aarch64", }, ), ], ), - os_name = "linux", - os_arch = "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", @@ -224,45 +292,67 @@ filegroup( ) pypi.is_reproducible().equals(True) - pypi.exposed_packages().contains_exactly({"pypi": []}) - pypi.extra_aliases().contains_exactly({ - "pypi": {"simple": ["foo"]}, - }) + pypi.exposed_packages().contains_exactly({"pypi": ["simple"]}) pypi.hub_group_map().contains_exactly({"pypi": {}}) pypi.hub_whl_map().contains_exactly({"pypi": { - "simple": [ + "extra": [ struct( config_setting = "//_config:is_python_3.15", filename = None, - repo = "pypi_315_simple", + repo = "pypi_315_extra", target_platforms = None, version = "3.15", ), ], + "simple": [ + struct( + config_setting = "//_config:is_python_3.15", + filename = None, + repo = "pypi_315_simple_linux_x86_64", + target_platforms = ["cp315_linux_x86_64"], + version = "3.15", + ), + struct( + config_setting = "//_config:is_python_3.15", + filename = None, + repo = "pypi_315_simple_osx_aarch64", + target_platforms = ["cp315_osx_aarch64"], + version = "3.15", + ), + ], }}) pypi.whl_libraries().contains_exactly({ - "pypi_315_simple": { - "annotation": "@whl_mods_hub//:simple.json", + "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.whl_mods().contains_exactly({ - "whl_mods_hub": { - "simple": struct( - build_content = "filegroup(\n name = \"foo\",\n srcs = [\"all\"],\n)", - copy_executables = {}, - copy_files = {}, - data = [], - data_exclude_glob = [], - srcs_exclude_glob = [], - ), + "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_simple_with_whl_mods) +_tests.append(_test_download_only_multiple) def _test_simple_get_index(env): got_simpleapi_download_args = [] @@ -310,7 +400,10 @@ def _test_simple_get_index(env): ], ), read = lambda x: { - "requirements.txt": "simple==0.0.1 --hash=sha256:deadbeef --hash=sha256:deadb00f", + "requirements.txt": """ +simple==0.0.1 --hash=sha256:deadbeef --hash=sha256:deadb00f +some_pkg==0.0.1 +""", }[x], ), available_interpreters = { @@ -320,26 +413,37 @@ def _test_simple_get_index(env): ) pypi.is_reproducible().equals(False) - pypi.exposed_packages().contains_exactly({"pypi": ["simple"]}) + pypi.exposed_packages().contains_exactly({"pypi": ["simple", "some_pkg"]}) pypi.hub_group_map().contains_exactly({"pypi": {}}) - pypi.hub_whl_map().contains_exactly({"pypi": { - "simple": [ - struct( - config_setting = "//_config:is_python_3.15", - filename = "simple-0.0.1-py3-none-any.whl", - repo = "pypi_315_simple_py3_none_any_deadb00f", - target_platforms = None, - version = "3.15", - ), - struct( - config_setting = "//_config:is_python_3.15", - filename = "simple-0.0.1.tar.gz", - repo = "pypi_315_simple_sdist_deadbeef", - target_platforms = None, - version = "3.15", - ), - ], - }}) + pypi.hub_whl_map().contains_exactly({ + "pypi": { + "simple": [ + struct( + config_setting = "//_config:is_python_3.15", + filename = "simple-0.0.1-py3-none-any.whl", + repo = "pypi_315_simple_py3_none_any_deadb00f", + target_platforms = None, + version = "3.15", + ), + struct( + config_setting = "//_config:is_python_3.15", + filename = "simple-0.0.1.tar.gz", + repo = "pypi_315_simple_sdist_deadbeef", + target_platforms = None, + version = "3.15", + ), + ], + "some_pkg": [ + struct( + config_setting = "//_config:is_python_3.15", + filename = None, + repo = "pypi_315_some_pkg", + target_platforms = None, + version = "3.15", + ), + ], + }, + }) pypi.whl_libraries().contains_exactly({ "pypi_315_simple_py3_none_any_deadb00f": { "dep_template": "@pypi//{name}:{target}", @@ -372,9 +476,7 @@ def _test_simple_get_index(env): "cp315_osx_x86_64", "cp315_windows_x86_64", ], - "extra_pip_args": [ - "--extra-args-for-sdist-building", - ], + "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", @@ -382,8 +484,29 @@ def _test_simple_get_index(env): "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) diff --git a/tests/pypi/parse_requirements/parse_requirements_tests.bzl b/tests/pypi/parse_requirements/parse_requirements_tests.bzl index c719ad6972..a6e17bebec 100644 --- a/tests/pypi/parse_requirements/parse_requirements_tests.bzl +++ b/tests/pypi/parse_requirements/parse_requirements_tests.bzl @@ -29,6 +29,16 @@ foo[extra]==0.0.1 --hash=sha256:deadbeef """, "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 @@ -43,6 +53,14 @@ foo[extra]==0.0.1 ;marker --hash=sha256:deadbeef bar==0.0.1 --hash=sha256:deadbeef """, "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": """\ @@ -229,6 +247,66 @@ def _test_multi_os(env): _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( [ 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 9de309b295..f5187788ea 100644 --- a/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl +++ b/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl @@ -387,6 +387,24 @@ def _test_get_python_versions(env): _tests.append(_test_get_python_versions) +def _test_get_python_versions_with_target_platforms(env): + got = get_whl_flag_versions( + aliases = [ + whl_alias(repo = "foo", version = "3.3", target_platforms = ["cp33_linux_x86_64"]), + whl_alias(repo = "foo", 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 = [ @@ -660,6 +678,29 @@ def _test_multiplatform_whl_aliases_nofilename(env): _tests.append(_test_multiplatform_whl_aliases_nofilename) +def _test_multiplatform_whl_aliases_nofilename_target_platforms(env): + aliases = [ + whl_alias( + repo = "foo", + config_setting = "//:ignored", + version = "3.1", + target_platforms = [ + "cp31_linux_x86_64", + "cp31_linux_aarch64", + ], + ), + ] + + got = multiplatform_whl_aliases(aliases = aliases) + + want = [ + whl_alias(config_setting = "//_config:is_cp3.1_linux_x86_64", repo = "foo", version = "3.1"), + whl_alias(config_setting = "//_config:is_cp3.1_linux_aarch64", repo = "foo", version = "3.1"), + ] + env.expect.that_collection(got).contains_exactly(want) + +_tests.append(_test_multiplatform_whl_aliases_nofilename_target_platforms) + def _test_multiplatform_whl_aliases_filename(env): aliases = [ whl_alias( @@ -734,6 +775,52 @@ def _test_multiplatform_whl_aliases_filename_versioned(env): _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_alias( + repo = "repo", + version = "3.11", + target_platforms = [ + "cp311_linux_aarch64", + "cp311_linux_x86_64", + ], + ), + ] + 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.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_legacy) + def _test_config_settings_exist(env): for py_tag in ["py2.py3", "py3", "py311", "cp311"]: if py_tag == "py2.py3": @@ -771,12 +858,11 @@ def _test_config_settings_exist(env): ), ] 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, + alias = _mock_alias(available_config_settings), + config_setting = _mock_config_setting(available_config_settings), ), **kwargs ) From 2d9a32190ee78a14d9ce1dfb59c7dec1023ecd66 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 7 Nov 2024 16:16:22 -0800 Subject: [PATCH 296/345] tests: fix the job name for the debian bzlmod gazelle job (#2382) The name was using "integration" when it should have been "generation" --- .bazelci/presubmit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index a5f893fa89..3724a56d71 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -301,7 +301,7 @@ tasks: 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: From 00d352b9d3b8155a64a4a333366aeb44768a1181 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 7 Nov 2024 16:17:18 -0800 Subject: [PATCH 297/345] chore: cleanup and fix some bzl_library deps in //python/private (#2381) After the move out of `python/private/common`, some dep entries didn't get renamed to use the idiomatic local naming (`:foo`) instead of absolute names. Along the way, add a missing dep entry to py_runtime_rule on skylib's common_settings. --- python/private/BUILD.bazel | 49 +++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 7399b104e0..bbee4def7c 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -56,13 +56,13 @@ bzl_library( 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", ], ) @@ -109,10 +109,10 @@ bzl_library( 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", ], ) @@ -122,11 +122,11 @@ bzl_library( 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", ], ) @@ -350,8 +350,8 @@ bzl_library( ":common_bzl", ":py_executable_bzl", ":py_internal_bzl", + ":py_runtime_info_bzl", ":semantics_bzl", - "//python/private:py_runtime_info_bzl", ], ) @@ -362,14 +362,14 @@ bzl_library( ":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,10 +410,10 @@ bzl_library( 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", ], @@ -473,13 +473,14 @@ bzl_library( name = "py_runtime_rule_bzl", srcs = ["py_runtime_rule.bzl"], deps = [ + ":attributes_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", ], ) From 78e2071d526fc76876b485aa45361000dcbc1e10 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 7 Nov 2024 16:18:20 -0800 Subject: [PATCH 298/345] chore: move code out of WORKSPACE.bzlmod and into MODULE (#2380) The WORKSPACE.bzlmod file will eventually be ignored by later Bazel versions. To support setup of the extra repos we rely on it for, create a dev-only module extension that invokes the necessary repo rules. Work towards https://github.com/bazelbuild/rules_python/issues/2378 --- MODULE.bazel | 16 +++++++ WORKSPACE.bzlmod | 62 ---------------------------- python/private/internal_dev_deps.bzl | 44 ++++++++++++++++++++ 3 files changed, 60 insertions(+), 62 deletions(-) create mode 100644 python/private/internal_dev_deps.bzl diff --git a/MODULE.bazel b/MODULE.bazel index 50f137690c..4d2f3c6a25 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -78,11 +78,27 @@ bazel_dep(name = "rules_bazel_integration_test", version = "0.20.0", dev_depende 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_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) + +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", diff --git a/WORKSPACE.bzlmod b/WORKSPACE.bzlmod index ca89afe8af..e69de29bb2 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/python/private/internal_dev_deps.bzl b/python/private/internal_dev_deps.bzl new file mode 100644 index 0000000000..2a3b84e7df --- /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.", +) From 251eb3792218d5b26ee86a88babc591161ce3c0c Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 8 Nov 2024 09:23:47 +0900 Subject: [PATCH 299/345] chore: prepare CHANGELOG for 0.38.0 release (#2384) --- CHANGELOG.md | 41 +++++++++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8eb269c39c..090eb259a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,27 @@ A brief description of the categories of changes: {#v0-0-0-changed} ### Changed +* Nothing yet + +{#v0-0-0-fixed} +### Fixed +* Nothing yet + +{#v0-0-0-added} +### Added +* Nothing yet + +{#v0-0-0-removed} +### Removed +* Nothing yet + +{#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) @@ -46,11 +67,8 @@ A brief description of the categories of changes: directly to avoid such breakage in the future. If `rules_python` is missing features to allow one to do that, please raise tickets. -{#v0-0-0-fixed} +{#v0-38-0-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. * (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 @@ -64,7 +82,7 @@ A brief description of the categories of changes: 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-0-0-added} +{#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`, @@ -81,9 +99,16 @@ A brief description of the categories of changes: 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-0-0-removed} -### Removed -* Nothing yet +{#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 From 772b1cc0a9fd8c6e36be08b0c98e2ad53673fb73 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 8 Nov 2024 11:32:30 +0900 Subject: [PATCH 300/345] chore: improve the CHANGELOG for the new release (#2385) When making a Slack announcement I noticed that the changelog could be clarified. --- CHANGELOG.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 090eb259a2..19a34eaa5c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,10 +62,10 @@ A brief description of the categories of changes: 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 to avoid such breakage in the future. If `rules_python` is missing - features to allow one to do that, please raise tickets. + 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 @@ -77,7 +77,9 @@ A brief description of the categories of changes: 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. Fixes + or not. To opt into this behavior, set + {bzl:obj}`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` From 70101489a35ec8995b9b753d1f4d357cc776af85 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Fri, 8 Nov 2024 12:24:53 -0800 Subject: [PATCH 301/345] chore(deps): upgrade some dependencies that will eventually be required by Bazel 8 (#2383) This upgrades some module dependencies to versions that will be needed in order to support Bazel 8. More upgrades will be necessary, but these are some easy ones that don't cause compatibility issues. * skylib 1.7.1 * (dev) rules_shell 0.3.0 * (dev) rules_bazel_integration_test 0.26.1 Work towards https://github.com/bazelbuild/rules_python/issues/2378 --- CHANGELOG.md | 2 +- MODULE.bazel | 6 +++--- examples/bzlmod/MODULE.bazel | 4 ++-- examples/bzlmod/MODULE.bazel.lock | 7 ++++--- examples/multi_python_versions/MODULE.bazel | 2 +- internal_deps.bzl | 9 +++------ 6 files changed, 14 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19a34eaa5c..93abc5b219 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,7 +27,7 @@ A brief description of the categories of changes: {#v0-0-0-changed} ### Changed -* Nothing yet +* (deps) bazel_skylib 1.6.1 -> 1.7.1 {#v0-0-0-fixed} ### Fixed diff --git a/MODULE.bazel b/MODULE.bazel index 4d2f3c6a25..f13d464871 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -5,7 +5,7 @@ module( ) bazel_dep(name = "bazel_features", version = "1.9.1") -bazel_dep(name = "bazel_skylib", version = "1.6.1") +bazel_dep(name = "bazel_skylib", version = "1.7.1") bazel_dep(name = "rules_cc", version = "0.0.9") bazel_dep(name = "platforms", version = "0.0.4") @@ -74,9 +74,9 @@ use_repo(pip, "rules_python_publish_deps") bazel_dep(name = "stardoc", version = "0.6.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.26.1", 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) diff --git a/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel index 1b8bbbf5e3..ba206df10d 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -4,7 +4,7 @@ module( 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", @@ -266,4 +266,4 @@ local_path_override( ) # 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 index eb578f681d..92030a094e 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -21,7 +21,8 @@ "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/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/source.json": "f121b43eeefc7c29efbd51b83d08631e2347297c95aac9764a701f2a6a2bb953", "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", @@ -65,8 +66,8 @@ "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/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", + "https://bcr.bazel.build/modules/rules_shell/0.3.0/source.json": "c55ed591aa5009401ddf80ded9762ac32c358d2517ee7820be981e2de9756cf3", "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", diff --git a/examples/multi_python_versions/MODULE.bazel b/examples/multi_python_versions/MODULE.bazel index 536940ba49..c1c0778b23 100644 --- a/examples/multi_python_versions/MODULE.bazel +++ b/examples/multi_python_versions/MODULE.bazel @@ -2,7 +2,7 @@ module( 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", diff --git a/internal_deps.bzl b/internal_deps.bzl index f92e029305..9f78a1db45 100644 --- a/internal_deps.bzl +++ b/internal_deps.bzl @@ -34,15 +34,12 @@ def http_file(name, **kwargs): def rules_python_internal_deps(): """Fetches all required dependencies for rules_python tests and tools.""" - # 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. 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", ], ) From 2af0020b38d0826191dd4b51ff6313a39f7259e3 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 11 Nov 2024 13:19:12 +0900 Subject: [PATCH 302/345] feat(toolchain): support freethreaded toolchains (#2372) Before this PR freethreaded toolchains were not possible to be used, this adds the minimum plumbing to get the things working. Coverage support is also added. Whilst at it: - Add plumbing to print checksums only for a particular python version. - Bump the remaining toolchain versions that used to use the 20241008 release - Pass around the loaded platform list so that we are only defining toolchains for the platforms that we have loaded the hermetic toolchain for. Tested: ``` $ bazel run --//python/config_settings:python_version=3.13.0 --//python/config_settings:py_freethreaded="yes" //python/private:current_interpreter_executable ... Python 3.13.0 experimental free-threading build (main, Oct 16 2024, 03:26:14) [Clang 18.1.8 ] on linux Type "help", "copyright", "credits" or "license" for more information. >>> ``` Closes #2129. Work towards #2386. --- .pre-commit-config.yaml | 4 + CHANGELOG.md | 12 +- .../python/config_settings/index.md | 10 + python/config_settings/BUILD.bazel | 14 + python/private/BUILD.bazel | 1 + python/private/coverage_deps.bzl | 12 + python/private/flags.bzl | 10 + .../private/hermetic_runtime_repo_setup.bzl | 82 +++- python/private/python.bzl | 6 +- python/private/python_register_toolchains.bzl | 7 +- python/private/python_repository.bzl | 8 +- python/private/pythons_hub.bzl | 13 +- python/private/toolchains_repo.bzl | 16 +- python/versions.bzl | 409 ++++++++++-------- .../update_deps/update_coverage_deps.py | 22 +- 15 files changed, 429 insertions(+), 197 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 38b9161e24..65389db797 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: diff --git a/CHANGELOG.md b/CHANGELOG.md index 93abc5b219..f3b2465c07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,14 @@ A brief description of the categories of changes: {#v0-0-0-changed} ### Changed * (deps) bazel_skylib 1.6.1 -> 1.7.1 +* (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 + +[20241016]: https://github.com/indygreg/python-build-standalone/releases/tag/20241016 {#v0-0-0-fixed} ### Fixed @@ -35,7 +43,9 @@ A brief description of the categories of changes: {#v0-0-0-added} ### Added -* Nothing yet +* (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. {#v0-0-0-removed} ### Removed diff --git a/docs/api/rules_python/python/config_settings/index.md b/docs/api/rules_python/python/config_settings/index.md index 7c7421bf7e..ef829bab76 100644 --- a/docs/api/rules_python/python/config_settings/index.md +++ b/docs/api/rules_python/python/config_settings/index.md @@ -149,6 +149,16 @@ Values: ::: :::: +::::{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/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel index c530afe98b..6d34ee95c7 100644 --- a/python/config_settings/BUILD.bazel +++ b/python/config_settings/BUILD.bazel @@ -5,6 +5,7 @@ load( "AddSrcsToRunfilesFlag", "BootstrapImplFlag", "ExecToolsToolchainFlag", + "FreeThreadedFlag", "PrecompileFlag", "PrecompileSourceRetentionFlag", ) @@ -92,6 +93,19 @@ string_flag( 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/private/BUILD.bazel b/python/private/BUILD.bazel index bbee4def7c..1e972c5e29 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -256,6 +256,7 @@ bzl_library( deps = [ ":py_toolchain_suite_bzl", ":text_util_bzl", + "//python:versions_bzl", ], ) diff --git a/python/private/coverage_deps.bzl b/python/private/coverage_deps.bzl index d3a6d96664..e80e8ee910 100644 --- a/python/private/coverage_deps.bzl +++ b/python/private/coverage_deps.bzl @@ -80,11 +80,23 @@ _coverage_deps = { "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/flags.bzl b/python/private/flags.bzl index c190cf682b..5239771d7e 100644 --- a/python/private/flags.bzl +++ b/python/private/flags.bzl @@ -122,3 +122,13 @@ PrecompileSourceRetentionFlag = enum( 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", +) diff --git a/python/private/hermetic_runtime_repo_setup.bzl b/python/private/hermetic_runtime_repo_setup.bzl index cf9a5a6b1d..3f7bb5d773 100644 --- a/python/private/hermetic_runtime_repo_setup.bzl +++ b/python/private/hermetic_runtime_repo_setup.bzl @@ -21,6 +21,8 @@ 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, @@ -45,7 +47,7 @@ def define_hermetic_runtime_toolchain_impl( 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. """ @@ -67,19 +69,23 @@ def define_hermetic_runtime_toolchain_impl( exclude = [ # 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 + "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, ) @@ -96,14 +102,62 @@ def define_hermetic_runtime_toolchain_impl( 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": [ + "python3.dll", + "libs/python{major}{minor}t.lib".format(**version_dict), + ], "@platforms//os:linux": [ "lib/libpython{major}.{minor}.so".format(**version_dict), "lib/libpython{major}.{minor}.so.1.0".format(**version_dict), @@ -132,12 +186,18 @@ def define_hermetic_runtime_toolchain_impl( "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/python.bzl b/python/private/python.bzl index d2b1007231..8632554c51 100644 --- a/python/private/python.bzl +++ b/python/private/python.bzl @@ -213,6 +213,7 @@ def parse_modules(*, module_ctx, _fail = fail): 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 @@ def _python_impl(module_ctx): 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 @@ -257,6 +258,7 @@ def _python_impl(module_ctx): 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 @@ -464,7 +466,7 @@ def _get_toolchain_config(*, modules, _fail = fail): "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 64b66d5a6f..98c8e5bfc3 100644 --- a/python/private/python_register_toolchains.bzl +++ b/python/private/python_register_toolchains.bzl @@ -73,6 +73,9 @@ def python_register_toolchains( 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: @@ -168,11 +171,13 @@ def python_register_toolchains( # 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 e44bdd151d..9ffa196a20 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", "PLATFORMS") load(":auth.bzl", "get_auth") load(":repo_utils.bzl", "REPO_DEBUG_ENV_VAR", "repo_utils") load(":text_util.bzl", "render") @@ -63,8 +63,12 @@ def _python_repository_impl(rctx): 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) diff --git a/python/private/pythons_hub.bzl b/python/private/pythons_hub.bzl index fdaad60e22..8afee5af17 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 @@ def _hub_build_file_content( 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 @@ def _hub_build_file_content( 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)) ], @@ -103,6 +110,7 @@ def _hub_repo_impl(rctx): rctx.attr.toolchain_set_python_version_constraints, rctx.attr.toolchain_user_repository_names, rctx.attr._rules_python_workspace, + rctx.attr.loaded_platforms, ), executable = False, ) @@ -149,6 +157,9 @@ This rule also writes out the various toolchains for the different Python versio 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/toolchains_repo.bzl b/python/private/toolchains_repo.bzl index d21e46ac48..d21fb53a41 100644 --- a/python/private/toolchains_repo.bzl +++ b/python/private/toolchains_repo.bzl @@ -41,7 +41,8 @@ def python_toolchain_build_file_content( 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 +52,8 @@ def python_toolchain_build_file_content( 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 +80,7 @@ py_toolchain_suite( 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 +103,11 @@ load("@{rules_python}//python/private:py_toolchain_suite.bzl", "py_toolchain_sui 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 +117,7 @@ toolchains_repo = repository_rule( 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"), @@ -390,6 +399,9 @@ def _get_host_platform(os_name, arch): """ host_platform = None for platform, meta in PLATFORMS.items(): + if "freethreaded" in platform: + continue + if meta.os_name == os_name and meta.arch == arch: host_platform = platform if not host_platform: diff --git a/python/versions.bzl b/python/versions.bzl index ae017e3d12..774c24d1b9 100644 --- a/python/versions.bzl +++ b/python/versions.bzl @@ -19,12 +19,13 @@ MACOS_NAME = "mac os" LINUX_NAME = "linux" WINDOWS_NAME = "windows" +FREETHREADED = "freethreaded" 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: @@ -237,15 +238,15 @@ TOOL_VERSIONS = { "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", }, "strip_prefix": "python", }, @@ -356,15 +357,15 @@ TOOL_VERSIONS = { "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", }, "strip_prefix": "python", }, @@ -470,15 +471,15 @@ TOOL_VERSIONS = { "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", }, "strip_prefix": "python", }, @@ -548,28 +549,35 @@ TOOL_VERSIONS = { "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", }, "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", + "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", }, @@ -585,123 +593,145 @@ MINOR_MAPPING = { "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 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 = { + 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 = { + libc: "glibc", + }, + os_name = LINUX_NAME, + arch = "armv7", + ), + "i386-unknown-linux-gnu": struct( + compatible_with = [ + "@platforms//os:linux", + "@platforms//cpu:i386", + ], + flag_values = { + libc: "glibc", + }, + os_name = LINUX_NAME, + arch = "i386", + ), + "ppc64le-unknown-linux-gnu": struct( + compatible_with = [ + "@platforms//os:linux", + "@platforms//cpu:ppc", + ], + flag_values = { + 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 = { + libc: "glibc", + }, + 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 +761,32 @@ def get_release_info(platform, python_version, base_url = DEFAULT_RELEASE_BASE_U 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 +812,18 @@ def get_release_info(platform, python_version, base_url = DEFAULT_RELEASE_BASE_U 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 +833,20 @@ echo "Fetching hashes..." {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/tools/private/update_deps/update_coverage_deps.py b/tools/private/update_deps/update_coverage_deps.py index a856b7acba..bbff67e927 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 @@ def __repr__(self): 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 @@ def main(): platforms = _get_platforms( u["filename"], - args.name, - args.version, u["python_version"], ) From daed352c843f714d4c27ed1c7e555ab3ecfbbf87 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 11 Nov 2024 14:41:30 +0900 Subject: [PATCH 303/345] chore: change the parse_all_requirements_files default value (#2389) With this PR we are changing the defaults in the upcoming `0.39` version, and if all goes well, the release after that will be `1.0`. Work towards #1361 --- CHANGELOG.md | 5 +++++ examples/bzlmod/MODULE.bazel.lock | 8 +++++--- python/private/pypi/extension.bzl | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3b2465c07..e896c541c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,11 @@ A brief description of the categories of changes: * 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 diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 92030a094e..fc90b22bbf 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1393,7 +1393,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "0Qn7Q9FuTxYCxMKm2DsW7mbXYcxL71sS/l1baXvY1vA=", + "bzlTransitiveDigest": "V0b+JF59twRuc1t2aujwxPmb29degf+X0HjTZzFI2lo=", "usagesDigest": "GGeczTmsfE4YHAy32dV/jfOfbYmpyu/QGe35drFuZ5E=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -3244,7 +3244,9 @@ "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": [], + "packages": [ + "absl_py" + ], "groups": {} } }, @@ -6588,7 +6590,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "SnuwsgZv1SGZz4jVPvwaEUwPTnea18fXIueD9vSR3sQ=", + "bzlTransitiveDigest": "9R8+CXzaV+FOv5NSr6mNrvF+hvnyouGXJh9E0JxC/7Q=", "usagesDigest": "O2O2oBIbKEglN2K3FECsRxUKVS/zg/6a86F3MO1ZtmY=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 7b31d0d50c..ea628ce4ad 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -786,7 +786,7 @@ find in case extra indexes are specified. default = True, ), "parse_all_requirements_files": attr.bool( - default = False, + default = True, doc = """\ A temporary flag to enable users to make `pip` extension result always the same independent of the whether transitive dependencies use {bzl:attr}`experimental_index_url` or not. From 4e610311c34ae39945766f0a74b082a66fefe1ca Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 10 Nov 2024 23:51:26 -0800 Subject: [PATCH 304/345] feat: add attrs/fields for the runtime's ABI flags (#2390) This adds attributes and fields for storing the runtimes ABI flags value, i.e. `sys.abiflags`. For freethreaded interpreters, the abi flags contain `t`, which is used creating e.g. virtualenvs. The attribute can be directly specified, or if it's not, will be computed based on the `--py_freethreaded` flag. --- CHANGELOG.md | 2 ++ python/private/BUILD.bazel | 1 + python/private/py_runtime_info.bzl | 9 ++++++++- python/private/py_runtime_rule.bzl | 20 ++++++++++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e896c541c2..88d17deec2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,8 @@ A brief description of the categories of changes: * (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-0-0-removed} ### Removed diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 1e972c5e29..6bb6a9f668 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -475,6 +475,7 @@ bzl_library( srcs = ["py_runtime_rule.bzl"], deps = [ ":attributes_bzl", + ":flags_bzl", ":py_internal_bzl", ":py_runtime_info_bzl", ":reexports_bzl", diff --git a/python/private/py_runtime_info.bzl b/python/private/py_runtime_info.bzl index 359a9e78cf..ff95c4a448 100644 --- a/python/private/py_runtime_info.bzl +++ b/python/private/py_runtime_info.bzl @@ -67,7 +67,8 @@ def _PyRuntimeInfo_init( bootstrap_template = None, interpreter_version_info = None, stage2_bootstrap_template = None, - zip_main_template = None): + zip_main_template = None, + abi_flags = ""): 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 +106,7 @@ def _PyRuntimeInfo_init( stub_shebang = DEFAULT_STUB_SHEBANG return { + "abi_flags": abi_flags, "bootstrap_template": bootstrap_template, "coverage_files": coverage_files, "coverage_tool": coverage_tool, @@ -133,6 +135,11 @@ the same conventions as the standard CPython interpreter. """, init = _PyRuntimeInfo_init, fields = { + "abi_flags": """ +:type: str + +The runtime's ABI flags, i.e. `sys.abiflags`. +""", "bootstrap_template": """ :type: File diff --git a/python/private/py_runtime_rule.bzl b/python/private/py_runtime_rule.bzl index ba9b36d13a..746cd19dcb 100644 --- a/python/private/py_runtime_rule.bzl +++ b/python/private/py_runtime_rule.bzl @@ -17,6 +17,7 @@ load("@bazel_skylib//lib:dicts.bzl", "dicts") 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 @@ def _py_runtime_impl(ctx): interpreter_version_info["minor"], ) + abi_flags = ctx.attr.abi_flags + if abi_flags == "": + 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,7 @@ def _py_runtime_impl(ctx): pyc_tag = pyc_tag, stage2_bootstrap_template = ctx.file.stage2_bootstrap_template, zip_main_template = ctx.file.zip_main_template, + abi_flags = abi_flags, )) if not IS_BAZEL_7_OR_HIGHER: @@ -179,6 +188,14 @@ py_runtime( """, fragments = ["py"], attrs = dicts.add(NATIVE_RULES_ALLOWLIST_ATTRS, { + "abi_flags": attr.string( + default = "", + 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, @@ -335,6 +352,9 @@ The {obj}`PyRuntimeInfo.zip_main_template` field. ::: """, ), + "_py_freethreaded_flag": attr.label( + default = "//python/config_settings:py_freethreaded", + ), "_python_version_flag": attr.label( default = "//python/config_settings:python_version", ), From 4864d6399b844776d73439e5894fbcadfd0b732a Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Mon, 11 Nov 2024 16:12:51 -0800 Subject: [PATCH 305/345] deps: updates for bazel 8 compatibility (#2379) Various changes to support Bazel 8. An important note is dependencies have forced us to change the versions of Bazel we support. Summary of changes: * rules_cc 0.0.14: Releases after 0.0.9 have some Bazel 8 fixes, but also broke some things. Things seemed to have settled by 0.0.14. * protobuf 29.0-rc1: Technically 28.0 works, however: 1. 29.0-rc1 is coming via a transitive dependency anyways, and 2. In protobuf 28.0, compile warnings are treated as errors, which our Debian CI respects (and thus fails), while other platforms ignore. * stardoc 0.7.1: Fixes an issue with Bazel 8 and stardoc using empty globs. * Bazel 7.4 is now the minimum supported Bazel version. This requirements comes via dependencies. * Drop Bazel 6 bzlmod support. This requirement comes via dependencies. * Add a presubmit job for `last_rc` Bazel (currently the 8.x RC). * Use a local patch so Gazelle works with Bazel 8. This can be removed once https://github.com/bazel-contrib/bazel-gazelle/issues/1959 is fixed and released. * Fix a `$(rpathlocation)` call in bootstrap tests. * Update bzl_library deps after upgrading deps: the set of targets that provide bzl sources changed in rules_cc and protobuf in these newer versions. Sorting this all out and finding the right combination of dependency versions was fairly involved. The details of that are in https://github.com/bazelbuild/rules_python/issues/2378. Work towards https://github.com/bazelbuild/rules_python/issues/2378, https://github.com/bazelbuild/rules_python/issues/2387 --- .bazelci/presubmit.yml | 30 +- CHANGELOG.md | 8 +- MODULE.bazel | 31 +- examples/bzlmod/.bazelversion | 2 +- examples/bzlmod/MODULE.bazel | 14 +- examples/bzlmod/MODULE.bazel.lock | 21448 ++++++++++++---- .../bzlmod_build_file_generation/MODULE.bazel | 3 + examples/multi_python_versions/MODULE.bazel | 4 + internal_deps.bzl | 12 +- patches/gazelle_native_sh.patch | 32 + python/private/BUILD.bazel | 11 +- python/private/py_repositories.bzl | 1 + .../ignore_root_user_error/bzlmod_test.py | 24 +- tests/support/sh_py_run_test.bzl | 2 +- 14 files changed, 16278 insertions(+), 5344 deletions(-) create mode 100644 patches/gazelle_native_sh.patch diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 3724a56d71..3c383497b6 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -18,6 +18,7 @@ buildifier: # 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 @@ -39,10 +40,12 @@ buildifier: 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" @@ -120,16 +123,22 @@ tasks: <<: *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 - + ubuntu_upcoming: + <<: *reusable_config + name: "Default: Ubuntu, upcoming Bazel" + platform: ubuntu2004 + bazel: last_rc pystar_ubuntu_workspace: <<: *reusable_config <<: *pystar_base @@ -171,6 +180,7 @@ tasks: <<: *reusable_config name: "RBE: Ubuntu, minimum Bazel" 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 @@ -232,24 +242,28 @@ tasks: 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_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_windows: <<: *reusable_build_test_all # coverage is not supported on Windows @@ -262,6 +276,7 @@ tasks: name: "examples/bzlmod: Ubuntu with lockfile" working_directory: examples/bzlmod platform: ubuntu2004 + bazel: 7.x shell_commands: # Update the lockfiles and fail if it is different. - "../../tools/private/update_bzlmod_lockfiles.sh" @@ -272,6 +287,7 @@ tasks: name: "examples/bzlmod: macOS with lockfile" working_directory: examples/bzlmod platform: macos + bazel: 7.x shell_commands: # Update the lockfiles and fail if it is different. - "../../tools/private/update_bzlmod_lockfiles.sh" @@ -284,6 +300,7 @@ tasks: 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 @@ -350,15 +367,16 @@ tasks: <<: *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" @@ -393,6 +411,7 @@ tasks: 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" @@ -573,6 +592,7 @@ tasks: 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/CHANGELOG.md b/CHANGELOG.md index 88d17deec2..e91eadf5a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,11 @@ A brief description of the categories of changes: {#v0-0-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 @@ -48,6 +53,7 @@ A brief description of the categories of changes: {#v0-0-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. @@ -56,7 +62,7 @@ A brief description of the categories of changes: {#v0-0-0-removed} ### Removed -* Nothing yet +* Support for Bazel 6 using bzlmod has been dropped. {#v0-38-0} ## [0.38.0] - 2024-11-08 diff --git a/MODULE.bazel b/MODULE.bazel index f13d464871..bed1787fc6 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -6,12 +6,12 @@ module( bazel_dep(name = "bazel_features", version = "1.9.1") bazel_dep(name = "bazel_skylib", version = "1.7.1") -bazel_dep(name = "rules_cc", version = "0.0.9") +bazel_dep(name = "rules_cc", version = "0.0.14") 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 = "6.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( @@ -71,7 +71,7 @@ pip.parse( 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.1", repo_name = "io_bazel_stardoc") # ===== DEV ONLY DEPS AND SETUP BELOW HERE ===== bazel_dep(name = "rules_bazel_integration_test", version = "0.26.1", dev_dependency = True) @@ -83,8 +83,18 @@ 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.33.0", dev_dependency = True, repo_name = "bazel_gazelle") +single_version_override( + module_name = "gazelle", + patch_strip = 1, + patches = [ + # Can be removed once https://github.com/bazel-contrib/bazel-gazelle/issues/1959 + # is fixed and released. + "patches/gazelle_native_sh.patch", + ], + version = "0.33.0", +) internal_dev_deps = use_extension( "//python/private:internal_dev_deps.bzl", @@ -144,8 +154,11 @@ bazel_binaries.local( 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", @@ -153,8 +166,8 @@ use_repo( # 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", ) diff --git a/examples/bzlmod/.bazelversion b/examples/bzlmod/.bazelversion index 643916c03f..35907cd9ca 100644 --- a/examples/bzlmod/.bazelversion +++ b/examples/bzlmod/.bazelversion @@ -1 +1 @@ -7.3.1 +7.x diff --git a/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel index ba206df10d..2843575c31 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -12,10 +12,20 @@ local_path_override( ) # (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.0") + +# 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. diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index fc90b22bbf..39e18a481c 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -6,14 +6,33 @@ "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/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/source.json": "9be551b8d4e3ef76875c0d744b5d6a504a27e3ae67bc6b28f46415fd2d2957da", + "https://bcr.bazel.build/modules/apple_support/1.13.0/MODULE.bazel": "7c8cdea7e031b7f9f67f0b497adf6d2c6a2675e9304ca93a9af6ed84eef5a524", + "https://bcr.bazel.build/modules/apple_support/1.13.0/source.json": "aef5da52fdcfa9173e02c0cb772c85be5b01b9d49f97f9bb0fe3efe738938ba4", "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/aspect_bazel_lib/1.31.2/MODULE.bazel": "7bee702b4862612f29333590f4b658a5832d433d6f8e4395f090e8f4e85d442f", + "https://bcr.bazel.build/modules/aspect_bazel_lib/1.38.0/MODULE.bazel": "6307fec451ba9962c1c969eb516ebfe1e46528f7fa92e1c9ac8646bef4cdaa3f", + "https://bcr.bazel.build/modules/aspect_bazel_lib/1.40.3/MODULE.bazel": "668e6bcb4d957fc0e284316dba546b705c8d43c857f87119619ee83c4555b859", + "https://bcr.bazel.build/modules/aspect_bazel_lib/1.40.3/source.json": "f5a28b1320e5f444e798b4afc1465c8b720bfaec7522cca38a23583dffe85e6d", + "https://bcr.bazel.build/modules/aspect_rules_js/1.33.1/MODULE.bazel": "db3e7f16e471cf6827059d03af7c21859e7a0d2bc65429a3a11f005d46fc501b", + "https://bcr.bazel.build/modules/aspect_rules_js/1.39.0/MODULE.bazel": "aece421d479e3c31dc3e5f6d49a12acc2700457c03c556650ec7a0ff23fc0d95", + "https://bcr.bazel.build/modules/aspect_rules_js/1.39.0/source.json": "a8f93e4ad8843e8aa407fa5fd7c8b63a63846c0ce255371ff23384582813b13d", + "https://bcr.bazel.build/modules/aspect_rules_lint/0.12.0/MODULE.bazel": "e767c5dbfeb254ec03275a7701b5cfde2c4d2873676804bc7cb27ddff3728fed", + "https://bcr.bazel.build/modules/aspect_rules_lint/0.12.0/source.json": "9a3668e1ee219170e22c0e7f3ab959724c6198fdd12cd503fa10b1c6923a2559", + "https://bcr.bazel.build/modules/bazel_features/0.1.0/MODULE.bazel": "47011d645b0f949f42ee67f2e8775188a9cf4a0a1528aa2fa4952f2fd00906fd", "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", + "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", + "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", "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.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", + "https://bcr.bazel.build/modules/bazel_features/1.19.0/source.json": "d7bf14517c1b25b9d9c580b0f8795fceeae08a7590f507b76aace528e941375d", + "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", "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.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", "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", @@ -21,13 +40,22 @@ "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.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/source.json": "f121b43eeefc7c29efbd51b83d08631e2347297c95aac9764a701f2a6a2bb953", "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/gazelle/0.27.0/MODULE.bazel": "3446abd608295de6d90b4a8a118ed64a9ce11dcb3dda2dc3290a22056bd20996", + "https://bcr.bazel.build/modules/gazelle/0.30.0/MODULE.bazel": "f888a1effe338491f35f0e0e85003b47bb9d8295ccba73c37e07702d8d31c65b", + "https://bcr.bazel.build/modules/gazelle/0.30.0/source.json": "7af0779f99120aafc73be127615d224f26da2fc5a606b52bdffb221fd9efb737", + "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", + "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", + "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/source.json": "41e9e129f80d8c8bf103a7acc337b76e54fad1214ac0a7084bf24f4cd924b8b4", "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/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", + "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", "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", @@ -37,67 +65,112 @@ "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/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", + "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", + "https://bcr.bazel.build/modules/protobuf/29.0-rc2/source.json": "52101bfd37e38f0d159dee47b71ccbd1f22f7a32192cef5ef2533bb6212f410f", "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", + "https://bcr.bazel.build/modules/protobuf/3.19.2/MODULE.bazel": "532ffe5f2186b69fdde039efe6df13ba726ff338c6bc82275ad433013fa10573", "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858", + "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", + "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/source.json": "be4789e951dd5301282729fe3d4938995dc4c1a81c2ff150afc9f1b0504c6022", + "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", + "https://bcr.bazel.build/modules/re2/2023-09-01/source.json": "e044ce89c2883cd957a2969a43e79f7752f9656f6b20050b62f90ede21ec6eb4", + "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", + "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", + "https://bcr.bazel.build/modules/rules_buf/0.1.1/MODULE.bazel": "6189aec18a4f7caff599ad41b851ab7645d4f1e114aa6431acf9b0666eb92162", + "https://bcr.bazel.build/modules/rules_buf/0.1.1/source.json": "021363d254f7438f3f10725355969c974bb2c67e0c28667782ade31a9cdb747f", "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", + "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", + "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", + "https://bcr.bazel.build/modules/rules_cc/0.0.14/MODULE.bazel": "5e343a3aac88b8d7af3b1b6d2093b55c347b8eefc2e7d1442f7a02dc8fea48ac", + "https://bcr.bazel.build/modules/rules_cc/0.0.14/source.json": "d22ad7e0f2c271a583b463b81cea83fd8afbf0012cad955c129b0e85662ec207", "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_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e", + "https://bcr.bazel.build/modules/rules_go/0.33.0/MODULE.bazel": "a2b11b64cd24bf94f57454f53288a5dacfe6cb86453eee7761b7637728c1910c", + "https://bcr.bazel.build/modules/rules_go/0.38.1/MODULE.bazel": "fb8e73dd3b6fc4ff9d260ceacd830114891d49904f5bda1c16bc147bcc254f71", + "https://bcr.bazel.build/modules/rules_go/0.39.1/MODULE.bazel": "d34fb2a249403a5f4339c754f1e63dc9e5ad70b47c5e97faee1441fc6636cd61", + "https://bcr.bazel.build/modules/rules_go/0.39.1/source.json": "f21e042154010ae2c944ab230d572b17d71cdb27c5255806d61df6ccaed4354c", "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/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", + "https://bcr.bazel.build/modules/rules_java/6.0.0/MODULE.bazel": "8a43b7df601a7ec1af61d79345c17b31ea1fedc6711fd4abfd013ea612978e39", + "https://bcr.bazel.build/modules/rules_java/6.4.0/MODULE.bazel": "e986a9fe25aeaa84ac17ca093ef13a4637f6107375f64667a15999f77db6c8f6", + "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", + "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", + "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", + "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", + "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", + "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", "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_java/8.3.0/MODULE.bazel": "cd0722696035d13523365e6a1eb1682c4b32c164aa3503f0731ef97bfad3df1e", + "https://bcr.bazel.build/modules/rules_java/8.3.0/source.json": "a2d2246ed61ea6391ca946b164d87c57644d4705072eda5b74531b48fb99b7d0", "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_jvm_external/5.3/MODULE.bazel": "bf93870767689637164657731849fb887ad086739bd5d360d90007a581d5527d", + "https://bcr.bazel.build/modules/rules_jvm_external/6.1/MODULE.bazel": "75b5fec090dbd46cf9b7d8ea08cf84a0472d92ba3585b476f44c326eda8059c4", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/source.json": "6f5f5a5a4419ae4e37c35a5bb0a6ae657ed40b7abc5a5189111b47fcebe43197", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", "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_license/0.0.8/MODULE.bazel": "5669c6fe49b5134dbf534db681ad3d67a2d49cfc197e4a95f1ca2fd7f3aebe96", + "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", + "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", + "https://bcr.bazel.build/modules/rules_nodejs/5.8.2/MODULE.bazel": "6bc03c8f37f69401b888023bf511cb6ee4781433b0cb56236b2e55a21e3a026a", + "https://bcr.bazel.build/modules/rules_nodejs/5.8.2/source.json": "6e82cf5753d835ea18308200bc79b9c2e782efe2e2a4edc004a9162ca93382ca", "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_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", "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_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", + "https://bcr.bazel.build/modules/rules_proto/6.0.2/source.json": "17a2e195f56cb28d6bbf763e49973d13890487c6945311ed141e196fb660426d", + "https://bcr.bazel.build/modules/rules_rust/0.54.1/MODULE.bazel": "388547bb0cd6a751437bb15c94c6725226f50100eec576e4354c3a8b48c754fb", + "https://bcr.bazel.build/modules/rules_rust/0.54.1/source.json": "9c5481b1abe4943457e6b2a475592d2e504b6b4355df603f24f64cde0a7f0f2d", + "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", "https://bcr.bazel.build/modules/rules_shell/0.3.0/source.json": "c55ed591aa5009401ddf80ded9762ac32c358d2517ee7820be981e2de9756cf3", + "https://bcr.bazel.build/modules/stardoc/0.5.0/MODULE.bazel": "f9f1f46ba8d9c3362648eea571c6f9100680efc44913618811b58cc9c02cd678", "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/stardoc/0.5.4/MODULE.bazel": "6569966df04610b8520957cb8e97cf2e9faac2c0309657c537ab51c16c18a2a4", + "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", + "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", + "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7", + "https://bcr.bazel.build/modules/stardoc/0.7.1/source.json": "b6500ffcd7b48cd72c29bb67bcac781e12701cc0d6d55d266a652583cfcdab01", "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" + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/source.json": "2be409ac3c7601245958cd4fcdff4288be79ed23bd690b4b951f500d54ee6e7d", + "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" }, "selectedYankedVersions": {}, "moduleExtensions": { "@@apple_support~//crosstool:setup.bzl%apple_cc_configure_extension": { "general": { - "bzlTransitiveDigest": "PjIds3feoYE8SGbbIq2SFTZy3zmxeO2tQevJZNDo7iY=", - "usagesDigest": "aLmqbvowmHkkBPve05yyDNGN7oh7QE9kBADr3QIZTZs=", + "bzlTransitiveDigest": "Co35oEwSoYZFy42IHjYfE7VkKR1WykyxhRlbUGSa3XA=", + "usagesDigest": "gVdmmfWVnB6JChQTMnM+gMpss+wokBBM/793mjFRycU=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, "generatedRepoSpecs": { - "local_config_apple_cc": { + "local_config_apple_cc_toolchains": { "bzlFile": "@@apple_support~//crosstool:setup.bzl", - "ruleClassName": "_apple_cc_autoconf", + "ruleClassName": "_apple_cc_autoconf_toolchains", "attributes": {} }, - "local_config_apple_cc_toolchains": { + "local_config_apple_cc": { "bzlFile": "@@apple_support~//crosstool:setup.bzl", - "ruleClassName": "_apple_cc_autoconf_toolchains", + "ruleClassName": "_apple_cc_autoconf", "attributes": {} } }, @@ -110,1281 +183,1374 @@ ] } }, - "@@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": { + "@@aspect_bazel_lib~//lib:extensions.bzl%toolchains": { "general": { - "bzlTransitiveDigest": "jsbfONl9OksDWiAs7KDFK5chH/tYI3DngdM30NKdk5Y=", - "usagesDigest": "eVrT3hFCIZNRuTKpfWDzSIwTi2p6U6PWbt+tNWl/Tqk=", + "bzlTransitiveDigest": "wbW/fEUW6Ya4TMFK5PPIgAwWuJm4AQFeqnOO5DbiZjw=", + "usagesDigest": "2yV4A8xZ6FZbGGe74q8xCktC2QFZ9qOJZI8VbIbhxtE=", "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", + "copy_directory_darwin_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_directory_toolchain.bzl", + "ruleClassName": "copy_directory_platform_repo", "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" + "platform": "darwin_amd64" } }, - "com_google_api_gax_1_60_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "copy_directory_darwin_arm64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_directory_toolchain.bzl", + "ruleClassName": "copy_directory_platform_repo", "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" + "platform": "darwin_arm64" } }, - "com_google_guava_failureaccess_1_0_1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "copy_directory_freebsd_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_directory_toolchain.bzl", + "ruleClassName": "copy_directory_platform_repo", "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" + "platform": "freebsd_amd64" } }, - "commons_logging_commons_logging_1_2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "copy_directory_linux_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_directory_toolchain.bzl", + "ruleClassName": "copy_directory_platform_repo", "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" + "platform": "linux_amd64" } }, - "com_google_http_client_google_http_client_appengine_1_38_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "copy_directory_linux_arm64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_directory_toolchain.bzl", + "ruleClassName": "copy_directory_platform_repo", "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" + "platform": "linux_arm64" } }, - "com_google_cloud_google_cloud_storage_1_113_4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "copy_directory_windows_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_directory_toolchain.bzl", + "ruleClassName": "copy_directory_platform_repo", "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" + "platform": "windows_amd64" } }, - "unpinned_stardoc_maven": { - "bzlFile": "@@rules_jvm_external~//:coursier.bzl", - "ruleClassName": "coursier_fetch", + "copy_directory_toolchains": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_directory_toolchain.bzl", + "ruleClassName": "copy_directory_toolchains_repo", "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" + "user_repository_name": "copy_directory" } }, - "io_grpc_grpc_context_1_33_1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "copy_to_directory_darwin_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", + "ruleClassName": "copy_to_directory_platform_repo", "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" + "platform": "darwin_amd64" } }, - "com_google_api_grpc_proto_google_iam_v1_1_0_3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "copy_to_directory_darwin_arm64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", + "ruleClassName": "copy_to_directory_platform_repo", "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" + "platform": "darwin_arm64" } }, - "com_google_api_api_common_1_10_1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "copy_to_directory_freebsd_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", + "ruleClassName": "copy_to_directory_platform_repo", "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" + "platform": "freebsd_amd64" } }, - "com_google_auth_google_auth_library_oauth2_http_0_22_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "copy_to_directory_linux_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", + "ruleClassName": "copy_to_directory_platform_repo", "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" + "platform": "linux_amd64" } }, - "com_typesafe_netty_netty_reactive_streams_2_0_5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "copy_to_directory_linux_arm64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", + "ruleClassName": "copy_to_directory_platform_repo", "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" + "platform": "linux_arm64" } }, - "com_typesafe_netty_netty_reactive_streams_http_2_0_5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "copy_to_directory_windows_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", + "ruleClassName": "copy_to_directory_platform_repo", "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" + "platform": "windows_amd64" } }, - "javax_annotation_javax_annotation_api_1_3_2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "copy_to_directory_toolchains": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", + "ruleClassName": "copy_to_directory_toolchains_repo", "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" + "user_repository_name": "copy_to_directory" } }, - "com_google_j2objc_j2objc_annotations_1_3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "jq_darwin_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", + "ruleClassName": "jq_platform_repo", "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" + "platform": "darwin_amd64", + "version": "1.6" } }, - "software_amazon_awssdk_metrics_spi_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "jq_darwin_arm64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", + "ruleClassName": "jq_platform_repo", "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" + "platform": "darwin_arm64", + "version": "1.6" } }, - "com_google_escapevelocity_escapevelocity_1_1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "jq_linux_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", + "ruleClassName": "jq_platform_repo", "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" + "platform": "linux_amd64", + "version": "1.6" } }, - "org_reactivestreams_reactive_streams_1_0_3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "jq_windows_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", + "ruleClassName": "jq_platform_repo", "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" + "platform": "windows_amd64", + "version": "1.6" } }, - "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" - } + "jq": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", + "ruleClassName": "jq_host_alias_repo", + "attributes": {} }, - "io_netty_netty_transport_4_1_72_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "jq_toolchains": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", + "ruleClassName": "jq_toolchains_repo", "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" + "user_repository_name": "jq" } }, - "com_beust_jcommander_1_82": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "yq_darwin_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", + "ruleClassName": "yq_platform_repo", "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" + "platform": "darwin_amd64", + "version": "4.25.2" } }, - "io_netty_netty_codec_http2_4_1_72_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "yq_darwin_arm64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", + "ruleClassName": "yq_platform_repo", "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" + "platform": "darwin_arm64", + "version": "4.25.2" } }, - "io_opencensus_opencensus_api_0_24_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "yq_linux_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", + "ruleClassName": "yq_platform_repo", "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" + "platform": "linux_amd64", + "version": "4.25.2" } }, - "rules_jvm_external_deps": { - "bzlFile": "@@rules_jvm_external~//:coursier.bzl", - "ruleClassName": "pinned_coursier_fetch", + "yq_linux_arm64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", + "ruleClassName": "yq_platform_repo", "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" + "platform": "linux_arm64", + "version": "4.25.2" } }, - "org_threeten_threetenbp_1_5_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "yq_linux_s390x": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", + "ruleClassName": "yq_platform_repo", "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" + "platform": "linux_s390x", + "version": "4.25.2" } }, - "software_amazon_awssdk_http_client_spi_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "yq_linux_ppc64le": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", + "ruleClassName": "yq_platform_repo", "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" + "platform": "linux_ppc64le", + "version": "4.25.2" } }, - "software_amazon_awssdk_third_party_jackson_core_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "yq_windows_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", + "ruleClassName": "yq_platform_repo", "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" + "platform": "windows_amd64", + "version": "4.25.2" } }, - "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" - } + "yq": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", + "ruleClassName": "yq_host_alias_repo", + "attributes": {} }, - "com_google_oauth_client_google_oauth_client_1_31_1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "yq_toolchains": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", + "ruleClassName": "yq_toolchains_repo", "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" + "user_repository_name": "yq" } }, - "maven": { - "bzlFile": "@@rules_jvm_external~//:coursier.bzl", - "ruleClassName": "coursier_fetch", + "coreutils_darwin_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:coreutils_toolchain.bzl", + "ruleClassName": "coreutils_platform_repo", "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" + "platform": "darwin_amd64", + "version": "0.0.16" } }, - "software_amazon_awssdk_aws_xml_protocol_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "coreutils_darwin_arm64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:coreutils_toolchain.bzl", + "ruleClassName": "coreutils_platform_repo", "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" + "platform": "darwin_arm64", + "version": "0.0.16" } }, - "software_amazon_awssdk_annotations_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "coreutils_linux_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:coreutils_toolchain.bzl", + "ruleClassName": "coreutils_platform_repo", "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" + "platform": "linux_amd64", + "version": "0.0.16" } }, - "software_amazon_awssdk_netty_nio_client_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "coreutils_linux_arm64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:coreutils_toolchain.bzl", + "ruleClassName": "coreutils_platform_repo", "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" + "platform": "linux_arm64", + "version": "0.0.16" } }, - "com_google_guava_guava_31_1_jre": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "coreutils_windows_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:coreutils_toolchain.bzl", + "ruleClassName": "coreutils_platform_repo", "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" + "platform": "windows_amd64", + "version": "0.0.16" } }, - "com_google_auto_value_auto_value_annotations_1_7_4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "coreutils_toolchains": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:coreutils_toolchain.bzl", + "ruleClassName": "coreutils_toolchains_repo", "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" + "user_repository_name": "coreutils" } }, - "io_netty_netty_transport_native_unix_common_4_1_72_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "expand_template_darwin_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:expand_template_toolchain.bzl", + "ruleClassName": "expand_template_platform_repo", "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" + "platform": "darwin_amd64" } }, - "junit_junit_4_13_2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "expand_template_darwin_arm64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:expand_template_toolchain.bzl", + "ruleClassName": "expand_template_platform_repo", "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" + "platform": "darwin_arm64" } }, - "io_opencensus_opencensus_contrib_http_util_0_24_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "expand_template_freebsd_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:expand_template_toolchain.bzl", + "ruleClassName": "expand_template_platform_repo", "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" + "platform": "freebsd_amd64" } }, - "com_fasterxml_jackson_core_jackson_core_2_11_3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "expand_template_linux_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:expand_template_toolchain.bzl", + "ruleClassName": "expand_template_platform_repo", "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" + "platform": "linux_amd64" } }, - "com_google_cloud_google_cloud_core_1_93_10": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "expand_template_linux_arm64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:expand_template_toolchain.bzl", + "ruleClassName": "expand_template_platform_repo", "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" + "platform": "linux_arm64" } }, - "com_google_auth_google_auth_library_credentials_0_22_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "expand_template_windows_amd64": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:expand_template_toolchain.bzl", + "ruleClassName": "expand_template_platform_repo", "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" + "platform": "windows_amd64" } }, - "software_amazon_awssdk_profiles_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "expand_template_toolchains": { + "bzlFile": "@@aspect_bazel_lib~//lib/private:expand_template_toolchain.bzl", + "ruleClassName": "expand_template_toolchains_repo", "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" + "user_repository_name": "expand_template" } - }, - "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" + } + }, + "recordedRepoMappingEntries": [ + [ + "aspect_bazel_lib~", + "aspect_bazel_lib", + "aspect_bazel_lib~" + ], + [ + "aspect_bazel_lib~", + "bazel_skylib", + "bazel_skylib~" + ], + [ + "aspect_bazel_lib~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@aspect_rules_js~//npm:extensions.bzl%pnpm": { + "general": { + "bzlTransitiveDigest": "roscSBlY/YuE46w1gEYQIkORMqkGdIyJVkxDfq/ZAtw=", + "usagesDigest": "1hU324o/rWis1wprOwPM+3YiIXklZvJ5jfmEbzKAClo=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "pnpm": { + "bzlFile": "@@aspect_rules_js~//npm/private:npm_import.bzl", + "ruleClassName": "npm_import_rule", + "attributes": { + "package": "pnpm", + "version": "8.6.7", + "root_package": "", + "link_workspace": "", + "link_packages": {}, + "integrity": "sha512-vRIWpD/L4phf9Bk2o/O2TDR8fFoJnpYrp2TKqTIZF/qZ2/rgL3qKXzHofHgbXsinwMoSEigz28sqk3pQ+yMEQQ==", + "url": "", + "commit": "", + "patch_args": [ + "-p0" + ], + "patches": [], + "custom_postinstall": "", + "npm_auth": "", + "npm_auth_basic": "", + "npm_auth_username": "", + "npm_auth_password": "", + "lifecycle_hooks": [], + "extra_build_content": "load(\"@aspect_rules_js//js:defs.bzl\", \"js_binary\")\njs_binary(name = \"pnpm\", data = glob([\"package/**\"]), entry_point = \"package/dist/pnpm.cjs\", visibility = [\"//visibility:public\"])", + "generate_bzl_library_targets": false + } + }, + "pnpm__links": { + "bzlFile": "@@aspect_rules_js~//npm/private:npm_import.bzl", + "ruleClassName": "npm_import_links", + "attributes": { + "package": "pnpm", + "version": "8.6.7", + "dev": false, + "root_package": "", + "link_packages": {}, + "deps": {}, + "transitive_closure": {}, + "lifecycle_build_target": false, + "lifecycle_hooks_env": [], + "lifecycle_hooks_execution_requirements": [ + "no-sandbox" + ], + "lifecycle_hooks_use_default_shell_env": false, + "bins": {}, + "npm_translate_lock_repo": "", + "package_visibility": [ + "//visibility:public" + ], + "replace_package": "" } - }, - "io_netty_netty_common_4_1_72_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + } + }, + "recordedRepoMappingEntries": [ + [ + "aspect_bazel_lib~", + "bazel_skylib", + "bazel_skylib~" + ], + [ + "aspect_bazel_lib~", + "bazel_tools", + "bazel_tools" + ], + [ + "aspect_rules_js~", + "aspect_bazel_lib", + "aspect_bazel_lib~" + ], + [ + "aspect_rules_js~", + "bazel_features", + "bazel_features~" + ], + [ + "aspect_rules_js~", + "bazel_skylib", + "bazel_skylib~" + ], + [ + "aspect_rules_js~", + "bazel_tools", + "bazel_tools" + ], + [ + "bazel_features~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@gazelle~//:extensions.bzl%go_deps": { + "general": { + "bzlTransitiveDigest": "KnJM36BNWe/NP/TKDbrmkLH1Oa6KLGvHqjuwR0tQom0=", + "usagesDigest": "bhzyFsFjm2VnoytfOA2/r1S4IqcYobOIKCgfPgNjsoo=", + "recordedFileInputs": { + "@@rules_go~//go.mod": "a7143f329c2a3e0b983ce74a96c0c25b0d0c59d236d75f7e1b069aadd988d55e", + "@@gazelle~//go.sum": "c9624aa41e5ffd61a8581d57a3c4046e62b46630dddc8b191e65017f34ff12a5", + "@@rules_go~//go.sum": "022d36c9ebcc7b5dee1e9b85b3da9c9f3a529ee6f979946d66e4955b8d54614a", + "@@gazelle~//go.mod": "5346019bf0673364b383d56ffbc9fced98b7b4ee921e865dfe905a1ebe82d326" + }, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "com_github_gogo_protobuf": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", + "attributes": { + "importpath": "github.com/gogo/protobuf", + "sum": "h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=", + "replace": "", + "version": "v1.3.2", + "build_directives": [ + "gazelle:proto disable" + ] + } + }, + "com_github_golang_mock": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", "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" + "importpath": "github.com/golang/mock", + "sum": "h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=", + "replace": "", + "version": "v1.6.0", + "build_directives": [] } }, - "io_netty_netty_transport_classes_epoll_4_1_72_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "com_github_golang_protobuf": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", "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" + "importpath": "github.com/golang/protobuf", + "sum": "h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=", + "replace": "", + "version": "v1.5.2", + "build_directives": [] } }, - "org_checkerframework_checker_qual_3_12_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "org_golang_google_protobuf": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", "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" + "importpath": "google.golang.org/protobuf", + "sum": "h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=", + "replace": "", + "version": "v1.28.0", + "build_directives": [] } }, - "org_hamcrest_hamcrest_core_1_3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "org_golang_x_net": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", "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" + "importpath": "golang.org/x/net", + "sum": "h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=", + "replace": "", + "version": "v0.0.0-20210405180319-a5a99cb37ef4", + "build_directives": [] } }, - "com_google_cloud_google_cloud_core_http_1_93_10": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "org_golang_x_sys": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", "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" + "importpath": "golang.org/x/sys", + "sum": "h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=", + "replace": "", + "version": "v0.6.0", + "build_directives": [] } }, - "software_amazon_awssdk_utils_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "org_golang_x_text": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", "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" + "importpath": "golang.org/x/text", + "sum": "h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=", + "replace": "", + "version": "v0.3.3", + "build_directives": [] } }, - "org_apache_commons_commons_lang3_3_8_1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "org_golang_google_genproto": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", "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" + "importpath": "google.golang.org/genproto", + "sum": "h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=", + "replace": "", + "version": "v0.0.0-20200526211855-cb27e3aa2013", + "build_directives": [] } }, - "software_amazon_awssdk_aws_core_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "org_golang_google_grpc": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", "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" + "importpath": "google.golang.org/grpc", + "sum": "h1:fPVVDxY9w++VjTZsYvXWqEf9Rqar/e+9zYfxKK+W+YU=", + "replace": "", + "version": "v1.50.0", + "build_directives": [ + "gazelle:proto disable" + ] } }, - "com_google_api_gax_httpjson_0_77_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "com_github_bazelbuild_buildtools": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", "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" + "importpath": "github.com/bazelbuild/buildtools", + "sum": "h1:XmPu4mXICgdGnC5dXGjUGbwUD/kUmS0l5Aop3LaevBM=", + "replace": "", + "version": "v0.0.0-20230317132445-9c3c1fc0106e", + "build_directives": [] } }, - "unpinned_rules_jvm_external_deps": { - "bzlFile": "@@rules_jvm_external~//:coursier.bzl", - "ruleClassName": "coursier_fetch", + "com_github_bmatcuk_doublestar_v4": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", "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" + "importpath": "github.com/bmatcuk/doublestar/v4", + "sum": "h1:HTuxyug8GyFbRkrffIpzNCSK4luc0TY3wzXvzIZhEXc=", + "replace": "", + "version": "v4.6.0", + "build_directives": [] + } + }, + "com_github_fsnotify_fsnotify": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", + "attributes": { + "importpath": "github.com/fsnotify/fsnotify", + "sum": "h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=", + "replace": "", + "version": "v1.6.0", + "build_directives": [] + } + }, + "com_github_google_go_cmp": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", + "attributes": { + "importpath": "github.com/google/go-cmp", + "sum": "h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=", + "replace": "", + "version": "v0.5.9", + "build_directives": [] + } + }, + "com_github_pelletier_go_toml": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", + "attributes": { + "importpath": "github.com/pelletier/go-toml", + "sum": "h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=", + "replace": "", + "version": "v1.9.5", + "build_directives": [] + } + }, + "com_github_pmezard_go_difflib": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", + "attributes": { + "importpath": "github.com/pmezard/go-difflib", + "sum": "h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=", + "replace": "", + "version": "v1.0.0", + "build_directives": [] + } + }, + "org_golang_x_mod": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", + "attributes": { + "importpath": "golang.org/x/mod", + "sum": "h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs=", + "replace": "", + "version": "v0.9.0", + "build_directives": [] + } + }, + "org_golang_x_sync": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", + "attributes": { + "importpath": "golang.org/x/sync", + "sum": "h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=", + "replace": "", + "version": "v0.1.0", + "build_directives": [] + } + }, + "org_golang_x_tools": { + "bzlFile": "@@gazelle~//internal:go_repository.bzl", + "ruleClassName": "go_repository", + "attributes": { + "importpath": "golang.org/x/tools", + "sum": "h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4=", + "replace": "", + "version": "v0.7.0", + "build_directives": [] + } + }, + "bazel_gazelle_go_repository_config": { + "bzlFile": "@@gazelle~//internal/bzlmod:go_deps.bzl", + "ruleClassName": "_go_repository_config", + "attributes": { + "importpaths": { + "com_github_gogo_protobuf": "github.com/gogo/protobuf", + "com_github_golang_mock": "github.com/golang/mock", + "com_github_golang_protobuf": "github.com/golang/protobuf", + "org_golang_google_protobuf": "google.golang.org/protobuf", + "org_golang_x_net": "golang.org/x/net", + "org_golang_x_sys": "golang.org/x/sys", + "org_golang_x_text": "golang.org/x/text", + "org_golang_google_genproto": "google.golang.org/genproto", + "org_golang_google_grpc": "google.golang.org/grpc", + "com_github_bazelbuild_buildtools": "github.com/bazelbuild/buildtools", + "com_github_bmatcuk_doublestar_v4": "github.com/bmatcuk/doublestar/v4", + "com_github_fsnotify_fsnotify": "github.com/fsnotify/fsnotify", + "com_github_google_go_cmp": "github.com/google/go-cmp", + "com_github_pelletier_go_toml": "github.com/pelletier/go-toml", + "com_github_pmezard_go_difflib": "github.com/pmezard/go-difflib", + "org_golang_x_mod": "golang.org/x/mod", + "org_golang_x_sync": "golang.org/x/sync", + "org_golang_x_tools": "golang.org/x/tools" + }, + "build_naming_conventions": {} + } + } + }, + "recordedRepoMappingEntries": [ + [ + "gazelle~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@gazelle~//internal/bzlmod:non_module_deps.bzl%non_module_deps": { + "general": { + "bzlTransitiveDigest": "30wev+wJfzc4s72MCfbP9U8W+3Js2b+Xbo5ofgZbHw8=", + "usagesDigest": "fc5f3E2W09BuRJ0CSEtVMiXtG+1TsfyLRdzjNNVOw3U=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "bazel_gazelle_go_repository_cache": { + "bzlFile": "@@gazelle~//internal:go_repository_cache.bzl", + "ruleClassName": "go_repository_cache", + "attributes": { + "go_sdk_name": "go_default_sdk", + "go_env": {} + } + }, + "bazel_gazelle_go_repository_tools": { + "bzlFile": "@@gazelle~//internal:go_repository_tools.bzl", + "ruleClassName": "go_repository_tools", + "attributes": { + "go_cache": "@@gazelle~~non_module_deps~bazel_gazelle_go_repository_cache//:go.env" } + } + }, + "recordedRepoMappingEntries": [ + [ + "gazelle~", + "bazel_gazelle_go_repository_cache", + "gazelle~~non_module_deps~bazel_gazelle_go_repository_cache" + ] + ] + } + }, + "@@platforms//host:extension.bzl%host_platform": { + "general": { + "bzlTransitiveDigest": "xelQcPZH8+tmuOHVjL9vDxMnnQNMlwj0SlvgoqBkm4U=", + "usagesDigest": "hgylFkgWSg0ulUwWZzEM1aIftlUnbmw2ynWLdEfHnZc=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "host_platform": { + "bzlFile": "@@platforms//host:extension.bzl", + "ruleClassName": "host_platform_repo", + "attributes": {} + } + }, + "recordedRepoMappingEntries": [] + } + }, + "@@pybind11_bazel~//:python_configure.bzl%extension": { + "general": { + "bzlTransitiveDigest": "whINYge95GgPtysKDbNHQ0ZlWYdtKybHs5y2tLF+x7Q=", + "usagesDigest": "gNvOHVcAlwgDsNXD0amkv2CC96mnaCThPQoE44y8K+w=", + "recordedFileInputs": { + "@@pybind11_bazel~//MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e" + }, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "local_config_python": { + "bzlFile": "@@pybind11_bazel~//:python_configure.bzl", + "ruleClassName": "python_configure", + "attributes": {} }, - "com_google_errorprone_error_prone_annotations_2_11_0": { + "pybind11": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "attributes": { - "sha256": "721cb91842b46fa056847d104d5225c8b8e1e8b62263b993051e1e5a0137b7ec", + "build_file": "@@pybind11_bazel~//:pybind11.BUILD", + "strip_prefix": "pybind11-2.11.1", "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" + "https://github.com/pybind/pybind11/archive/v2.11.1.zip" + ] } - }, - "software_amazon_awssdk_regions_2_17_183": { + } + }, + "recordedRepoMappingEntries": [ + [ + "pybind11_bazel~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@rules_buf~//buf:extensions.bzl%ext": { + "general": { + "bzlTransitiveDigest": "gmPmM7QT5Jez2VVFcwbbMf/QWSRag+nJ1elFJFFTcn0=", + "usagesDigest": "1E3NeLCRI6VyKiersXVtONCbNopc5jIVqoHBOpcWb0A=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "rules_buf_toolchains": { + "bzlFile": "@@rules_buf~//buf/internal:toolchain.bzl", + "ruleClassName": "buf_download_releases", + "attributes": { + "version": "v1.27.0" + } + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_buf~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@rules_fuzzing~//fuzzing/private:extensions.bzl%non_module_dependencies": { + "general": { + "bzlTransitiveDigest": "hVgJRQ3Er45/UUAgNn1Yp2Khcp/Y8WyafA2kXIYmQ5M=", + "usagesDigest": "YnIrdgwnf3iCLfChsltBdZ7yOJh706lpa2vww/i2pDI=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "platforms": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "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" + "https://mirror.bazel.build/github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz", + "https://github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz" ], - "downloaded_file_path": "software/amazon/awssdk/regions/2.17.183/regions-2.17.183.jar" + "sha256": "8150406605389ececb6da07cbcb509d5637a3ab9a24bc69b1101531367d89d74" } }, - "io_netty_netty_handler_4_1_72_Final": { + "rules_python": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "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" + "sha256": "d70cd72a7a4880f0000a6346253414825c19cdd40a28289bdf67b8e6480edff8", + "strip_prefix": "rules_python-0.28.0", + "url": "https://github.com/bazelbuild/rules_python/releases/download/0.28.0/rules_python-0.28.0.tar.gz" } }, - "software_amazon_awssdk_aws_query_protocol_2_17_183": { + "bazel_skylib": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "attributes": { - "sha256": "4dace03c76f80f3dec920cb3dedb2a95984c4366ef4fda728660cb90bed74848", + "sha256": "cd55a062e763b9349921f0f5db8c3933288dc8ba4f76dd9416aac68acee3cb94", "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" + "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.5.0/bazel-skylib-1.5.0.tar.gz", + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.5.0/bazel-skylib-1.5.0.tar.gz" + ] } }, - "io_netty_netty_codec_http_4_1_72_Final": { + "com_google_absl": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "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" + "https://github.com/abseil/abseil-cpp/archive/refs/tags/20240116.1.zip" ], - "downloaded_file_path": "io/netty/netty-codec-http/4.1.72.Final/netty-codec-http-4.1.72.Final.jar" + "strip_prefix": "abseil-cpp-20240116.1", + "integrity": "sha256-7capMWOvWyoYbUaHF/b+I2U6XLMaHmky8KugWvfXYuk=" } }, - "io_netty_netty_resolver_4_1_72_Final": { + "rules_fuzzing_oss_fuzz": { + "bzlFile": "@@rules_fuzzing~//fuzzing/private/oss_fuzz:repository.bzl", + "ruleClassName": "oss_fuzz_repository", + "attributes": {} + }, + "honggfuzz": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "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" + "build_file": "@@rules_fuzzing~//:honggfuzz.BUILD", + "sha256": "6b18ba13bc1f36b7b950c72d80f19ea67fbadc0ac0bb297ec89ad91f2eaa423e", + "url": "https://github.com/google/honggfuzz/archive/2.5.zip", + "strip_prefix": "honggfuzz-2.5" } }, - "software_amazon_awssdk_protocol_core_2_17_183": { + "rules_fuzzing_jazzer": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_jar", + "attributes": { + "sha256": "ee6feb569d88962d59cb59e8a31eb9d007c82683f3ebc64955fd5b96f277eec2", + "url": "https://repo1.maven.org/maven2/com/code-intelligence/jazzer/0.20.1/jazzer-0.20.1.jar" + } + }, + "rules_fuzzing_jazzer_api": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_jar", + "attributes": { + "sha256": "f5a60242bc408f7fa20fccf10d6c5c5ea1fcb3c6f44642fec5af88373ae7aa1b", + "url": "https://repo1.maven.org/maven2/com/code-intelligence/jazzer-api/0.20.1/jazzer-api-0.20.1.jar" + } + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_fuzzing~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@rules_go~//go:extensions.bzl%go_sdk": { + "general": { + "bzlTransitiveDigest": "8NkcgnML0idfe+aSUrahYJPXCAotWV11d+LSLMy+Pv4=", + "usagesDigest": "X5aqZFHzd1sdmeEDb7EhtLQxpfWCqdD+QovvCyIB8hw=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "go_default_sdk": { + "bzlFile": "@@rules_go~//go/private:sdk.bzl", + "ruleClassName": "go_download_sdk_rule", "attributes": { - "sha256": "10e7c4faa1f05e2d73055d0390dbd0bb6450e2e6cb85beda051b1e4693c826ce", + "goos": "", + "goarch": "", + "sdks": {}, "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" + "https://dl.google.com/go/{}" ], - "downloaded_file_path": "software/amazon/awssdk/protocol-core/2.17.183/protocol-core-2.17.183.jar" + "version": "1.19.8" } }, - "stardoc_maven": { - "bzlFile": "@@rules_jvm_external~//:coursier.bzl", - "ruleClassName": "pinned_coursier_fetch", + "go_toolchains": { + "bzlFile": "@@rules_go~//go/private:sdk.bzl", + "ruleClassName": "go_multiple_toolchains", "attributes": { - "repositories": [ - "{ \"repo_url\": \"https://repo1.maven.org/maven2\" }" + "prefixes": [ + "_0000_go_default_sdk_" ], - "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\" }" + "geese": [ + "" ], - "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" + "goarchs": [ + "" ], - "jetify": false, - "jetify_include_list": [ - "*" + "sdk_repos": [ + "go_default_sdk" ], - "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" + "sdk_types": [ + "remote" + ], + "sdk_versions": [ + "1.19.8" + ] } - }, - "com_google_truth_truth_1_1_3": { + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_go~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@rules_go~//go/private:extensions.bzl%non_module_dependencies": { + "general": { + "bzlTransitiveDigest": "FTGURJaxZ0zFih+z+h0k1eUyY5hJAwB/+M3KIzNbDWg=", + "usagesDigest": "l2146X4RaM7utp6nGByI3dH5YyCDzM3VOsYjDtSaZzk=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "bazel_skylib": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "attributes": { - "sha256": "fc0b67782289a2aabfddfdf99eff1dcd5edc890d49143fcd489214b107b8f4f3", "urls": [ - "https://repo1.maven.org/maven2/com/google/truth/truth/1.1.3/truth-1.1.3.jar" + "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.4.1/bazel-skylib-1.4.1.tar.gz", + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.4.1/bazel-skylib-1.4.1.tar.gz" ], - "downloaded_file_path": "com/google/truth/truth/1.1.3/truth-1.1.3.jar" + "sha256": "b8a1527901774180afc798aeb28c4634bdccf19c4d98e7bdd1ce79d1fe9aaad7", + "strip_prefix": "" } }, - "org_checkerframework_checker_compat_qual_2_5_5": { + "org_golang_x_tools": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "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" + "https://mirror.bazel.build/github.com/golang/tools/archive/refs/tags/v0.7.0.zip", + "https://github.com/golang/tools/archive/refs/tags/v0.7.0.zip" ], - "downloaded_file_path": "org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar" + "sha256": "9f20a20f29f4008d797a8be882ef82b69cf8f7f2b96dbdfe3814c57d8280fa4b", + "strip_prefix": "tools-0.7.0", + "patches": [ + "@@rules_go~//third_party:org_golang_x_tools-deletegopls.patch", + "@@rules_go~//third_party:org_golang_x_tools-gazelle.patch" + ], + "patch_args": [ + "-p1" + ] } }, - "com_google_apis_google_api_services_storage_v1_rev20200927_1_30_10": { + "org_golang_x_sys": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "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" + "https://mirror.bazel.build/github.com/golang/sys/archive/refs/tags/v0.6.0.zip", + "https://github.com/golang/sys/archive/refs/tags/v0.6.0.zip" ], - "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" + "sha256": "7f2399398b2eb4f1f495cc754d6353566e0ad934ee0eb46505e55162e0def56d", + "strip_prefix": "sys-0.6.0", + "patches": [ + "@@rules_go~//third_party:org_golang_x_sys-gazelle.patch" + ], + "patch_args": [ + "-p1" + ] } }, - "org_ow2_asm_asm_9_1": { + "org_golang_x_xerrors": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "attributes": { - "sha256": "cda4de455fab48ff0bcb7c48b4639447d4de859a7afc30a094a986f0936beba2", "urls": [ - "https://repo1.maven.org/maven2/org/ow2/asm/asm/9.1/asm-9.1.jar" + "https://mirror.bazel.build/github.com/golang/xerrors/archive/04be3eba64a22a838cdb17b8dca15a52871c08b4.zip", + "https://github.com/golang/xerrors/archive/04be3eba64a22a838cdb17b8dca15a52871c08b4.zip" ], - "downloaded_file_path": "org/ow2/asm/asm/9.1/asm-9.1.jar" + "sha256": "ffad2b06ef2e09d040da2ff08077865e99ab95d4d0451737fc8e33706bb01634", + "strip_prefix": "xerrors-04be3eba64a22a838cdb17b8dca15a52871c08b4", + "patches": [ + "@@rules_go~//third_party:org_golang_x_xerrors-gazelle.patch" + ], + "patch_args": [ + "-p1" + ] } }, - "com_google_api_client_google_api_client_1_30_11": { + "org_golang_google_protobuf": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "attributes": { - "sha256": "ee6f97865cc7de6c7c80955c3f37372cf3887bd75e4fc06f1058a6b4cd9bf4da", + "sha256": "cb1a05581c33b3705ede6c08edf9b9c1dbc579559ba30f532704c324e42bf801", "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" + "https://mirror.bazel.build/github.com/protocolbuffers/protobuf-go/archive/refs/tags/v1.30.0.zip", + "https://github.com/protocolbuffers/protobuf-go/archive/refs/tags/v1.30.0.zip" ], - "downloaded_file_path": "com/google/api-client/google-api-client/1.30.11/google-api-client-1.30.11.jar" + "strip_prefix": "protobuf-go-1.30.0", + "patches": [ + "@@rules_go~//third_party:org_golang_google_protobuf-gazelle.patch" + ], + "patch_args": [ + "-p1" + ] } }, - "software_amazon_awssdk_s3_2_17_183": { + "com_github_golang_protobuf": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "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" + "https://mirror.bazel.build/github.com/golang/protobuf/archive/refs/tags/v1.5.3.zip", + "https://github.com/golang/protobuf/archive/refs/tags/v1.5.3.zip" ], - "downloaded_file_path": "software/amazon/awssdk/s3/2.17.183/s3-2.17.183.jar" + "sha256": "2dced4544ae5372281e20f1e48ca76368355a01b31353724718c4d6e3dcbb430", + "strip_prefix": "protobuf-1.5.3", + "patches": [ + "@@rules_go~//third_party:com_github_golang_protobuf-gazelle.patch" + ], + "patch_args": [ + "-p1" + ] } }, - "org_apache_maven_maven_artifact_3_8_6": { + "com_github_mwitkow_go_proto_validators": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "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" + "https://mirror.bazel.build/github.com/mwitkow/go-proto-validators/archive/refs/tags/v0.3.2.zip", + "https://github.com/mwitkow/go-proto-validators/archive/refs/tags/v0.3.2.zip" ], - "downloaded_file_path": "org/apache/maven/maven-artifact/3.8.6/maven-artifact-3.8.6.jar" + "sha256": "d8697f05a2f0eaeb65261b480e1e6035301892d9fc07ed945622f41b12a68142", + "strip_prefix": "go-proto-validators-0.3.2" } }, - "com_google_googlejavaformat_google_java_format_1_15_0": { + "com_github_gogo_protobuf": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "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" + "https://mirror.bazel.build/github.com/gogo/protobuf/archive/refs/tags/v1.3.2.zip", + "https://github.com/gogo/protobuf/archive/refs/tags/v1.3.2.zip" ], - "downloaded_file_path": "com/google/googlejavaformat/google-java-format/1.15.0/google-java-format-1.15.0.jar" + "sha256": "f89f8241af909ce3226562d135c25b28e656ae173337b3e58ede917aa26e1e3c", + "strip_prefix": "protobuf-1.3.2", + "patches": [ + "@@rules_go~//third_party:com_github_gogo_protobuf-gazelle.patch" + ], + "patch_args": [ + "-p1" + ] } }, - "org_apache_httpcomponents_httpclient_4_5_13": { + "gogo_special_proto": { + "bzlFile": "@@rules_go~//proto:gogo.bzl", + "ruleClassName": "gogo_special_proto", + "attributes": {} + }, + "org_golang_google_genproto": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "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" + "https://mirror.bazel.build/github.com/googleapis/go-genproto/archive/6ac7f18bb9d5eeeb13a9f1ae4f21e4374a1952f8.zip", + "https://github.com/googleapis/go-genproto/archive/6ac7f18bb9d5eeeb13a9f1ae4f21e4374a1952f8.zip" ], - "downloaded_file_path": "org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar" + "sha256": "3470e7a89b24971b20c4bb8900a668df25279e4b741f72bc09418c1f22543215", + "strip_prefix": "go-genproto-6ac7f18bb9d5eeeb13a9f1ae4f21e4374a1952f8", + "patches": [ + "@@rules_go~//third_party:org_golang_google_genproto-gazelle.patch" + ], + "patch_args": [ + "-p1" + ] } }, - "com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava": { + "go_googleapis": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "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" + "https://mirror.bazel.build/github.com/googleapis/googleapis/archive/83c3605afb5a39952bf0a0809875d41cf2a558ca.zip", + "https://github.com/googleapis/googleapis/archive/83c3605afb5a39952bf0a0809875d41cf2a558ca.zip" ], - "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" + "sha256": "ba694861340e792fd31cb77274eacaf6e4ca8bda97707898f41d8bebfd8a4984", + "strip_prefix": "googleapis-83c3605afb5a39952bf0a0809875d41cf2a558ca", + "patches": [ + "@@rules_go~//third_party:go_googleapis-deletebuild.patch", + "@@rules_go~//third_party:go_googleapis-directives.patch", + "@@rules_go~//third_party:go_googleapis-gazelle.patch" + ], + "patch_args": [ + "-E", + "-p1" + ] } }, - "com_google_http_client_google_http_client_1_38_0": { + "com_github_golang_mock": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "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" + "https://mirror.bazel.build/github.com/golang/mock/archive/refs/tags/v1.7.0-rc.1.zip", + "https://github.com/golang/mock/archive/refs/tags/v1.7.0-rc.1.zip" + ], + "patches": [ + "@@rules_go~//third_party:com_github_golang_mock-gazelle.patch" + ], + "patch_args": [ + "-p1" ], - "downloaded_file_path": "com/google/http-client/google-http-client/1.38.0/google-http-client-1.38.0.jar" + "sha256": "5359c78b0c1649cf7beb3b48ff8b1d1aaf0243b22ea4789aba94805280075d8e", + "strip_prefix": "mock-1.7.0-rc.1" } }, - "software_amazon_awssdk_apache_client_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "io_bazel_rules_nogo": { + "bzlFile": "@@rules_go~//go/private:nogo.bzl", + "ruleClassName": "go_register_nogo", "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" + "nogo": "@io_bazel_rules_go//:default_nogo" } - }, - "software_amazon_awssdk_arns_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_go~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@rules_java~//java:extensions.bzl%compatibility_proxy": { + "general": { + "bzlTransitiveDigest": "2OrtzYUv5L7hfbpHdJ9GpoNfX11sIVm2d6HZmSg2J5c=", + "usagesDigest": "0/TyZruTcO4Acns2lBIfsdJDXcTS869yRn0gpAYMGww=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "compatibility_proxy": { + "bzlFile": "@@rules_java~//java:repositories.bzl", + "ruleClassName": "_compatibility_proxy_repo_rule", + "attributes": {} + } + }, + "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_java~", + "bazel_features", + "bazel_features~" + ], + [ + "rules_java~", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_java~", + "remote_java_tools", + "rules_java~~toolchains~remote_java_tools" + ] + ] + } + }, + "@@rules_kotlin~//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { + "general": { + "bzlTransitiveDigest": "fus14IFJ/1LGWWGKPH/U18VnJCoMjfDt1ckahqCnM0A=", + "usagesDigest": "aJF6fLy82rR95Ff5CZPAqxNoFgOMLMN5ImfBS0nhnkg=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "com_github_jetbrains_kotlin_git": { + "bzlFile": "@@rules_kotlin~//src/main/starlark/core/repositories:compiler.bzl", + "ruleClassName": "kotlin_compiler_git_repository", "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" + "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip" ], - "downloaded_file_path": "software/amazon/awssdk/arns/2.17.183/arns-2.17.183.jar" + "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88" } }, - "com_google_auto_value_auto_value_annotations_1_8_1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "com_github_jetbrains_kotlin": { + "bzlFile": "@@rules_kotlin~//src/main/starlark/core/repositories:compiler.bzl", + "ruleClassName": "kotlin_capabilities_repository", "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" + "git_repository_name": "com_github_jetbrains_kotlin_git", + "compiler_version": "1.9.23" } }, - "com_google_code_gson_gson_2_9_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "com_github_google_ksp": { + "bzlFile": "@@rules_kotlin~//src/main/starlark/core/repositories:ksp.bzl", + "ruleClassName": "ksp_compiler_plugin_repository", "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" + "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip" ], - "downloaded_file_path": "com/google/code/gson/gson/2.9.0/gson-2.9.0.jar" + "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d", + "strip_version": "1.9.23-1.0.20" } }, - "io_netty_netty_buffer_4_1_72_Final": { + "com_github_pinterest_ktlint": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_file", "attributes": { - "sha256": "568ff7cd9d8e2284ec980730c88924f686642929f8f219a74518b4e64755f3a1", + "sha256": "01b2e0ef893383a50dbeb13970fe7fa3be36ca3e83259e01649945b09d736985", "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" + "https://github.com/pinterest/ktlint/releases/download/1.3.0/ktlint" ], - "downloaded_file_path": "io/netty/netty-buffer/4.1.72.Final/netty-buffer-4.1.72.Final.jar" + "executable": true } }, - "com_google_code_findbugs_jsr305_3_0_2": { + "rules_android": { "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "ruleClassName": "http_archive", "attributes": { - "sha256": "766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7", + "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", + "strip_prefix": "rules_android-0.1.1", "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" + "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip" + ] } - }, - "commons_codec_commons_codec_1_11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_kotlin~", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@rules_nodejs~//nodejs:extensions.bzl%node": { + "general": { + "bzlTransitiveDigest": "xRRX0NuyvfLtjtzM4AqJgxdMSWWnLIw28rUUi10y6k0=", + "usagesDigest": "9IUJvk13jWE1kE+N3sP2y0mw9exjO9CGQ2oAgwKTNK4=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "nodejs_linux_amd64": { + "bzlFile": "@@rules_nodejs~//nodejs:repositories.bzl", + "ruleClassName": "node_repositories", "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" + "platform": "linux_amd64", + "node_version": "16.19.0" } }, - "software_amazon_awssdk_auth_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "nodejs_linux_arm64": { + "bzlFile": "@@rules_nodejs~//nodejs:repositories.bzl", + "ruleClassName": "node_repositories", "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" + "platform": "linux_arm64", + "node_version": "16.19.0" } }, - "software_amazon_awssdk_json_utils_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "nodejs_linux_s390x": { + "bzlFile": "@@rules_nodejs~//nodejs:repositories.bzl", + "ruleClassName": "node_repositories", "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" + "platform": "linux_s390x", + "node_version": "16.19.0" } }, - "org_codehaus_plexus_plexus_utils_3_3_1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "nodejs_linux_ppc64le": { + "bzlFile": "@@rules_nodejs~//nodejs:repositories.bzl", + "ruleClassName": "node_repositories", "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" + "platform": "linux_ppc64le", + "node_version": "16.19.0" } }, - "org_checkerframework_checker_qual_3_13_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "nodejs_darwin_amd64": { + "bzlFile": "@@rules_nodejs~//nodejs:repositories.bzl", + "ruleClassName": "node_repositories", "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" + "platform": "darwin_amd64", + "node_version": "16.19.0" } }, - "com_google_protobuf_protobuf_java_util_3_13_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "nodejs_darwin_arm64": { + "bzlFile": "@@rules_nodejs~//nodejs:repositories.bzl", + "ruleClassName": "node_repositories", "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" + "platform": "darwin_arm64", + "node_version": "16.19.0" } }, - "io_netty_netty_codec_4_1_72_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "nodejs_windows_amd64": { + "bzlFile": "@@rules_nodejs~//nodejs:repositories.bzl", + "ruleClassName": "node_repositories", "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" + "platform": "windows_amd64", + "node_version": "16.19.0" } }, - "com_google_protobuf_protobuf_java_3_13_0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "nodejs": { + "bzlFile": "@@rules_nodejs~//nodejs/private:nodejs_repo_host_os_alias.bzl", + "ruleClassName": "nodejs_repo_host_os_alias", "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" + "user_node_repository_name": "nodejs" } }, - "io_netty_netty_tcnative_classes_2_0_46_Final": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "nodejs_host": { + "bzlFile": "@@rules_nodejs~//nodejs/private:nodejs_repo_host_os_alias.bzl", + "ruleClassName": "nodejs_repo_host_os_alias", "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" + "user_node_repository_name": "nodejs" } }, - "software_amazon_awssdk_sdk_core_2_17_183": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", + "nodejs_toolchains": { + "bzlFile": "@@rules_nodejs~//nodejs/private:toolchains_repo.bzl", + "ruleClassName": "toolchains_repo", "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" + "user_node_repository_name": "nodejs" } } }, "recordedRepoMappingEntries": [ [ - "rules_jvm_external~", - "bazel_tools", - "bazel_tools" + "rules_nodejs~", + "bazel_skylib", + "bazel_skylib~" ], [ - "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~", + "rules_nodejs~", "bazel_tools", "bazel_tools" ] @@ -1393,20 +1559,22 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "V0b+JF59twRuc1t2aujwxPmb29degf+X0HjTZzFI2lo=", - "usagesDigest": "GGeczTmsfE4YHAy32dV/jfOfbYmpyu/QGe35drFuZ5E=", + "bzlTransitiveDigest": "xgvC1bRYiqApsCOY56grTCQ0/8pBZNRALXbjn+4q/hE=", + "usagesDigest": "VmrNvB/4EhzsYieLDka9584M+pYKPpjNLl3Wcb5rx/c=", "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": "16cf02cdc6cd989d8a92b551d406abea3fe597b1524ba5fa88f0410010671d7f", "@@//whl_mods/appended_build_content.BUILD": "87745b00382c66e5efbd7cb44a08fc3edbf7fd5099cf593f87599188f1557a9e", + "@@rules_python~//BUILD.bazel": "140002ce7e68de2fbf064bcdc37f854d4fa5b5d611a5fece6eb6cf19b8822bc4", + "@@rules_fuzzing~//fuzzing/requirements.txt": "ab04664be026b632a0d2a2446c4f65982b7654f5b6851d2f9d399a19b7242a5b", + "@@rules_python~//python/private/pypi/requirements_parser/resolve_target_platforms.py": "42bf51980528302373529bcdfddb8014e485182d6bc9d2f7d3bbe1f11d8d923d", + "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", + "@@rules_python~//python/private/pypi/whl_installer/platform.py": "b944b908b25a2f97d6d9f491504ad5d2507402d7e37c802ee878783f87f2aa11", "@@//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" + "@@protobuf~//python/requirements.txt": "983be60d3cec4b319dcab6d48aeb3f5b2f7c3350f26b3a9e97486c37967c73c5" }, "recordedDirentsInputs": {}, "envVariables": { @@ -1415,125 +1583,90 @@ "RULES_PYTHON_REPO_DEBUG_VERBOSITY": null }, "generatedRepoSpecs": { - "pip_39_snowballstemmer_py2_none_any_c8e1716e": { + "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\":[]}" + } + } + }, + "other_module_pip_311_absl_py": { "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" - ] + "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_wrapt_cp39_cp39_musllinux_1_1_aarch64_b9b7a708": { + "pip_310_alabaster": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], - "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" - ] + "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_39_zipp_sdist_0145e43d": { + "pip_310_astroid": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", "--extra-index-url", "https://pypi.org/simple/" ], - "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" - ] + "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_astroid_py3_none_any_10e0ad5f": { + "pip_310_babel": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], - "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" - ] + "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_310_docutils": { + "pip_310_certifi": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -1551,10 +1684,10 @@ ], "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" + "requirement": "certifi==2023.7.22 --hash=sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082 --hash=sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" } }, - "pip_310_sphinx": { + "pip_310_chardet": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -1570,92 +1703,54 @@ "--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" + "requirement": "chardet==4.0.0 --hash=sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa --hash=sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" } }, - "pip_39_tomlkit_py3_none_any_07de26b0": { + "pip_310_colorama": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], - "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" - ] + "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_sphinx_sdist_9a5160e1": { + "pip_310_dill": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", "--extra-index-url", "https://pypi.org/simple/" ], - "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" - ] + "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_310_sphinxcontrib_serializinghtml": { + "pip_310_docutils": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -1671,111 +1766,75 @@ "--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" + "requirement": "docutils==0.20.1 --hash=sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6 --hash=sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b" } }, - "pip_39_s3cmd_sdist_966b0a49": { + "pip_310_idna": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", "--extra-index-url", "https://pypi.org/simple/" ], - "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" - ] + "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_pygments_py3_none_any_13fc09fa": { + "pip_310_imagesize": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], - "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" - ] + "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_wrapt_cp39_cp39_manylinux_2_5_x86_64_40e7bc81": { + "pip_310_isort": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], - "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" - ] + "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_310_idna": { + "pip_310_jinja2": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -1793,10 +1852,10 @@ ], "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", "repo": "pip_310", - "requirement": "idna==2.10 --hash=sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6 --hash=sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" + "requirement": "jinja2==3.1.4 --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" } }, - "pip_310_astroid": { + "pip_310_lazy_object_proxy": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -1814,292 +1873,238 @@ ], "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" + "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_lazy_object_proxy_sdist_78247b6d": { + "pip_310_markupsafe": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", "--extra-index-url", "https://pypi.org/simple/" ], - "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" - ] + "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_websockets_sdist_88fc51d9": { + "pip_310_mccabe": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", "--extra-index-url", "https://pypi.org/simple/" ], - "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" - ] + "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_markupsafe_cp39_cp39_manylinux_2_17_x86_64_05fb2117": { + "pip_310_packaging": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], - "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" - ] + "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_39_pyyaml_cp39_cp39_macosx_10_9_x86_64_9eb6caa9": { + "pip_310_pathspec": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], - "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" - ] + "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_websockets_py3_none_any_6681ba9e": { + "pip_310_platformdirs": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], - "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" - ] + "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_markupsafe_cp39_cp39_macosx_10_9_universal2_8023faf4": { + "pip_310_pygments": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], - "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" - ] + "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_urllib3_sdist_f8ecc1bb": { + "pip_310_pylint": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", "--extra-index-url", "https://pypi.org/simple/" ], - "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" - ] + "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_platformdirs_py3_none_any_1a89a123": { + "pip_310_pylint_print": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], - "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" - ] + "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_sphinxcontrib_applehelp_sdist_39fdc8d7": { + "pip_310_python_dateutil": { "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": [ + "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_python_magic": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip//{name}:{target}", "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", "--extra-index-url", "https://pypi.org/simple/" ], - "filename": "sphinxcontrib_applehelp-1.0.7.tar.gz", - "group_deps": [ - "sphinx", - "sphinxcontrib_qthelp", - "sphinxcontrib_htmlhelp", - "sphinxcontrib_devhelp", - "sphinxcontrib_applehelp", - "sphinxcontrib_serializinghtml" + "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_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" ], - "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" - ] + "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_310_requests": { @@ -2129,88 +2134,46 @@ } } }, - "pip_39_pyyaml_cp39_cp39_win_amd64_510c9dee": { + "pip_310_s3cmd": { "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_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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], - "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" + "extra_pip_args": [ + "--extra-index-url", + "https://pypi.org/simple/" ], - "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" - ] + "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_typing_extensions_py3_none_any_04e5ca03": { + "pip_310_six": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], - "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" - ] + "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_310_snowballstemmer": { @@ -2234,7 +2197,7 @@ "requirement": "snowballstemmer==2.2.0 --hash=sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1 --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" } }, - "pip_310_sphinxcontrib_devhelp": { + "pip_310_sphinx": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2261,96 +2224,85 @@ "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" + "requirement": "sphinx==7.2.6 --hash=sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560 --hash=sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5" } }, - "pip_39_yamllint_py2_none_any_89bb5b5a": { + "pip_310_sphinxcontrib_applehelp": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], - "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" - ] + "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_jinja2_sdist_4a3aee7a": { + "pip_310_sphinxcontrib_devhelp": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", "--extra-index-url", "https://pypi.org/simple/" ], - "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" - ] + "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_sphinxcontrib_qthelp_sdist_62b9d1a1": { + "pip_310_sphinxcontrib_htmlhelp": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", "--extra-index-url", "https://pypi.org/simple/" ], - "filename": "sphinxcontrib_qthelp-1.0.6.tar.gz", "group_deps": [ "sphinx", "sphinxcontrib_qthelp", @@ -2360,44 +2312,12 @@ "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_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" - ] + "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_alabaster": { + "pip_310_sphinxcontrib_jsmath": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2415,44 +2335,40 @@ ], "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" + "requirement": "sphinxcontrib-jsmath==1.0.1 --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 --hash=sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" } }, - "pip_39_setuptools_sdist_a7620757": { + "pip_310_sphinxcontrib_qthelp": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", "--extra-index-url", "https://pypi.org/simple/" ], - "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" - ] + "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_python_magic": { + "pip_310_sphinxcontrib_serializinghtml": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2468,123 +2384,84 @@ "--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": "python-magic==0.4.27 --hash=sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b --hash=sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3" + "requirement": "sphinxcontrib-serializinghtml==1.1.9 --hash=sha256:0c64ff898339e1fac29abd2bf5f11078f3ec413cfe9c046d3120d7ca65530b54 --hash=sha256:9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1" } }, - "pip_39_chardet_sdist_0d6f53a1": { + "pip_310_tabulate": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", "--extra-index-url", "https://pypi.org/simple/" ], - "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" - ] + "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_mccabe_sdist_348e0240": { + "pip_310_tomli": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", "--extra-index-url", "https://pypi.org/simple/" ], - "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" - ] + "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_39_sphinxcontrib_serializinghtml_sdist_0c64ff89": { + "pip_310_tomlkit": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", "--extra-index-url", "https://pypi.org/simple/" ], - "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" - ] + "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_tabulate": { + "pip_310_typing_extensions": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2602,44 +2479,31 @@ ], "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" + "requirement": "typing-extensions==4.6.3 --hash=sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26 --hash=sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5" } }, - "pip_39_docutils_sdist_f08a4e27": { + "pip_310_urllib3": { "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", "--extra-index-url", "https://pypi.org/simple/" ], - "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" - ] + "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_lazy_object_proxy": { + "pip_310_websockets": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2657,72 +2521,32 @@ ], "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" + "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" } }, - "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_39_tomli_sdist_de526c12": { + "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}", - "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" + "linux_*", + "osx_*", + "windows_*", + "linux_x86_64", + "host" ], "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", "--extra-index-url", "https://pypi.org/simple/" ], - "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" - ] + "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_310_sphinxcontrib_htmlhelp": { + "pip_310_wrapt": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2738,21 +2562,12 @@ "--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" + "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_310_pylint": { + "pip_310_yamllint": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2770,10 +2585,10 @@ ], "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" + "requirement": "yamllint==1.32.0 --hash=sha256:d01dde008c65de5b235188ab3110bebc59d18e5c65fc8a58267cd211cd9df34a --hash=sha256:d97a66e48da820829d96077d76b8dfbe6c6140f106e558dae87e81ac4e6b30b7" } }, - "pip_39_pygments_sdist_1daff049": { + "pip_39_alabaster_py3_none_any_1ee19aca": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2791,27 +2606,20 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "filename": "Pygments-2.16.1.tar.gz", + "filename": "alabaster-0.7.13-py3-none-any.whl", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "pygments==2.16.1", - "sha256": "1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29", + "requirement": "alabaster==0.7.13", + "sha256": "1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3", "urls": [ - "https://files.pythonhosted.org/packages/d6/f7/4d461ddf9c2bcd6a4d7b2b139267ca32a69439387cc1f02a924ff8883825/Pygments-2.16.1.tar.gz" + "https://files.pythonhosted.org/packages/64/88/c7083fc61120ab661c5d0b82cb77079fc1429d3f913a456c1c82cf4658f7/alabaster-0.7.13-py3-none-any.whl" ] } }, - "pip_39_wheel_sdist_cd1196f3": { + "pip_39_alabaster_sdist_a27a4a08": { "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" @@ -2832,17 +2640,17 @@ "--extra-index-url", "https://pypi.org/simple/" ], - "filename": "wheel-0.40.0.tar.gz", + "filename": "alabaster-0.7.13.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "wheel==0.40.0", - "sha256": "cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873", + "requirement": "alabaster==0.7.13", + "sha256": "a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2", "urls": [ - "https://files.pythonhosted.org/packages/fc/ef/0335f7217dd1e8096a9e8383e1d472aa14717878ffe07c4772e68b6e8735/wheel-0.40.0.tar.gz" + "https://files.pythonhosted.org/packages/94/71/a8ee96d1fd95ca04a0d2e2d9c4081dac4c2d2b12f7ddb899c8cb9bfd1532/alabaster-0.7.13.tar.gz" ] } }, - "pip_39_idna_py2_none_any_b97d804b": { + "pip_39_astroid_py3_none_any_10e0ad5f": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2860,38 +2668,51 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "idna-2.10-py2.py3-none-any.whl", + "filename": "astroid-2.12.13-py3-none-any.whl", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "idna==2.10", - "sha256": "b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0", + "requirement": "astroid==2.12.13", + "sha256": "10e0ad5f7b79c435179d0d0f0df69998c4eef4597534aae44910db060baeb907", "urls": [ - "https://files.pythonhosted.org/packages/a2/38/928ddce2273eaa564f6f50de919327bf3a00f091b5baba8dfa9460f3a8a8/idna-2.10-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/b1/61/42e075b7d29ed4d452d91cbaaca142710d50d04e68eb7161ce5807a00a30/astroid-2.12.13-py3-none-any.whl" ] } }, - "pip_310_babel": { + "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": [ - "linux_*", - "osx_*", - "windows_*", - "linux_x86_64", - "host" + "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" ], "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", "--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" + "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_pylint_py3_none_any_349c8cd3": { + "pip_39_babel_py3_none_any_7077a498": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2909,27 +2730,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "pylint-2.15.9-py3-none-any.whl", + "filename": "Babel-2.13.1-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", + "requirement": "babel==2.13.1", + "sha256": "7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed", "urls": [ - "https://files.pythonhosted.org/packages/7d/df/0e50d5640ed4c6a492cdc6df0c281afee3f85d98209e7ec7b31243838b40/pylint-2.15.9-py3-none-any.whl" + "https://files.pythonhosted.org/packages/86/14/5dc2eb02b7cc87b2f95930310a2cc5229198414919a116b564832c747bc1/Babel-2.13.1-py3-none-any.whl" ] } }, - "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_colorama_sdist_08695f5c": { + "pip_39_babel_sdist_33e0952d": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2953,17 +2764,17 @@ "--extra-index-url", "https://pypi.org/simple/" ], - "filename": "colorama-0.4.6.tar.gz", + "filename": "Babel-2.13.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "colorama==0.4.6", - "sha256": "08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", + "requirement": "babel==2.13.1", + "sha256": "33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900", "urls": [ - "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz" + "https://files.pythonhosted.org/packages/aa/6c/737d2345d86741eeb594381394016b9c74c1253b4cbe274bb1e7b5e2138e/Babel-2.13.1.tar.gz" ] } }, - "pip_39_jinja2_py3_none_any_bc5dd2ab": { + "pip_39_certifi_py3_none_any_92d60375": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -2981,38 +2792,51 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "jinja2-3.1.4-py3-none-any.whl", + "filename": "certifi-2023.7.22-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", + "requirement": "certifi==2023.7.22", + "sha256": "92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9", "urls": [ - "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl" + "https://files.pythonhosted.org/packages/4c/dd/2234eab22353ffc7d94e8d13177aaa050113286e93e7b40eae01fbf7c3d9/certifi-2023.7.22-py3-none-any.whl" ] } }, - "pip_310_yamllint": { + "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": [ - "linux_*", - "osx_*", - "windows_*", - "linux_x86_64", - "host" + "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" ], "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", "--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" + "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_pathspec_py3_none_any_3c95343a": { + "pip_39_chardet_py2_none_any_f864054d": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3030,17 +2854,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "pathspec-0.10.3-py3-none-any.whl", + "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": "pathspec==0.10.3", - "sha256": "3c95343af8b756205e2aba76e843ba9520a24dd84f68c22b9f93251507509dd6", + "requirement": "chardet==4.0.0", + "sha256": "f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5", "urls": [ - "https://files.pythonhosted.org/packages/3c/29/c07c3a976dbe37c56e381e058c11e8738cb3a0416fc842a310461f8bb695/pathspec-0.10.3-py3-none-any.whl" + "https://files.pythonhosted.org/packages/19/c7/fa589626997dd07bd87d9269342ccb74b1720384a4d739a1872bd84fbe68/chardet-4.0.0-py2.py3-none-any.whl" ] } }, - "pip_39_markupsafe_sdist_af598ed3": { + "pip_39_chardet_sdist_0d6f53a1": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3064,17 +2888,17 @@ "--extra-index-url", "https://pypi.org/simple/" ], - "filename": "MarkupSafe-2.1.3.tar.gz", + "filename": "chardet-4.0.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "markupsafe==2.1.3", - "sha256": "af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad", + "requirement": "chardet==4.0.0", + "sha256": "0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", "urls": [ - "https://files.pythonhosted.org/packages/6d/7c/59a3248f411813f8ccba92a55feaac4bf360d29e2ff05ee7d8e1ef2d7dbf/MarkupSafe-2.1.3.tar.gz" + "https://files.pythonhosted.org/packages/ee/2d/9cdc2b527e127b4c9db64b86647d567985940ac3698eeabc7ffaccb4ea61/chardet-4.0.0.tar.gz" ] } }, - "pip_39_python_magic_py2_none_any_c212960a": { + "pip_39_colorama_py2_none_any_4f1d9991": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3092,17 +2916,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "python_magic-0.4.27-py2.py3-none-any.whl", + "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": "python-magic==0.4.27", - "sha256": "c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3", + "requirement": "colorama==0.4.6", + "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", "urls": [ - "https://files.pythonhosted.org/packages/6c/73/9f872cb81fc5c3bb48f7227872c28975f998f3e7c2b1c16e95e6432bbb90/python_magic-0.4.27-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl" ] } }, - "pip_39_sphinxcontrib_htmlhelp_sdist_6c26a118": { + "pip_39_colorama_sdist_08695f5c": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3126,26 +2950,17 @@ "--extra-index-url", "https://pypi.org/simple/" ], - "filename": "sphinxcontrib_htmlhelp-2.0.4.tar.gz", - "group_deps": [ - "sphinx", - "sphinxcontrib_qthelp", - "sphinxcontrib_htmlhelp", - "sphinxcontrib_devhelp", - "sphinxcontrib_applehelp", - "sphinxcontrib_serializinghtml" - ], - "group_name": "sphinx", + "filename": "colorama-0.4.6.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "sphinxcontrib-htmlhelp==2.0.4", - "sha256": "6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a", + "requirement": "colorama==0.4.6", + "sha256": "08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", "urls": [ - "https://files.pythonhosted.org/packages/fd/2d/abf5cd4cc1d5cd9842748b15a28295e4c4a927facfa8a0e173bd3f151bc5/sphinxcontrib_htmlhelp-2.0.4.tar.gz" + "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz" ] } }, - "pip_39_lazy_object_proxy_cp39_cp39_musllinux_1_1_x86_64_9a3a87cf": { + "pip_39_dill_py3_none_any_a07ffd23": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3163,17 +2978,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", + "filename": "dill-0.3.6-py3-none-any.whl", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "lazy-object-proxy==1.10.0", - "sha256": "9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658", + "requirement": "dill==0.3.6", + "sha256": "a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0", "urls": [ - "https://files.pythonhosted.org/packages/8e/ae/3e15cffacbdb64ac49930cdbc23cb0c67e1bb9e8a8ca7765fd8a8d2510c3/lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl" + "https://files.pythonhosted.org/packages/be/e3/a84bf2e561beed15813080d693b4b27573262433fced9c1d1fea59e60553/dill-0.3.6-py3-none-any.whl" ] } }, - "pip_39_typing_extensions_sdist_1a7ead55": { + "pip_39_dill_sdist_e5db55f3": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3197,17 +3012,17 @@ "--extra-index-url", "https://pypi.org/simple/" ], - "filename": "typing_extensions-4.12.2.tar.gz", + "filename": "dill-0.3.6.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", + "requirement": "dill==0.3.6", + "sha256": "e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373", "urls": [ - "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz" + "https://files.pythonhosted.org/packages/7c/e7/364a09134e1062d4d5ff69b853a56cf61c223e0afcc6906b6832bcd51ea8/dill-0.3.6.tar.gz" ] } }, - "pip_39_tabulate_py3_none_any_024ca478": { + "pip_39_docutils_py3_none_any_96f387a2": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3225,32 +3040,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "tabulate-0.9.0-py3-none-any.whl", + "filename": "docutils-0.20.1-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", + "requirement": "docutils==0.20.1", + "sha256": "96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", "urls": [ - "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-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", - "extra_hub_aliases": {}, - "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": [ - "absl_py" - ], - "groups": {} - } - }, - "pip_39_markupsafe_cp39_cp39_manylinux_2_17_aarch64_9dcdfd0e": { + "pip_39_docutils_sdist_f08a4e27": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3268,17 +3068,23 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "filename": "docutils-0.20.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "markupsafe==2.1.3", - "sha256": "9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", + "requirement": "docutils==0.20.1", + "sha256": "f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b", "urls": [ - "https://files.pythonhosted.org/packages/68/8d/c33c43c499c19f4b51181e196c9a497010908fc22c5de33551e298aa6a21/MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "https://files.pythonhosted.org/packages/1f/53/a5da4f2c5739cf66290fac1431ee52aff6851c7c8ffd8264f13affd7bcdd/docutils-0.20.1.tar.gz" ] } }, - "pip_39_lazy_object_proxy_cp39_cp39_musllinux_1_1_aarch64_21713819": { + "pip_39_idna_py2_none_any_b97d804b": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3296,17 +3102,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", + "filename": "idna-2.10-py2.py3-none-any.whl", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "lazy-object-proxy==1.10.0", - "sha256": "217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424", + "requirement": "idna==2.10", + "sha256": "b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0", "urls": [ - "https://files.pythonhosted.org/packages/d4/f8/d2d0d5caadf41c2d1fc9044dfc0e10d2831fb4ab6a077e68d25ea5bbff3b/lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl" + "https://files.pythonhosted.org/packages/a2/38/928ddce2273eaa564f6f50de919327bf3a00f091b5baba8dfa9460f3a8a8/idna-2.10-py2.py3-none-any.whl" ] } }, - "pip_39_wrapt_cp39_cp39_win_amd64_dee60e1d": { + "pip_39_idna_sdist_b307872f": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3324,38 +3130,51 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "wrapt-1.14.1-cp39-cp39-win_amd64.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "filename": "idna-2.10.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "wrapt==1.14.1", - "sha256": "dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb", + "requirement": "idna==2.10", + "sha256": "b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", "urls": [ - "https://files.pythonhosted.org/packages/5b/02/5ac7ea3b6722c84a2882d349ac581a9711b4047fe7a58475903832caa295/wrapt-1.14.1-cp39-cp39-win_amd64.whl" + "https://files.pythonhosted.org/packages/ea/b7/e0e3c1c467636186c39925827be42f16fee389dc404ac29e930e9136be70/idna-2.10.tar.gz" ] } }, - "pip_310_pylint_print": { + "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}", - "experimental_target_platforms": [ - "linux_*", - "osx_*", - "windows_*", - "linux_x86_64", - "host" + "envsubst": [ + "PIP_INDEX_URL" ], - "extra_pip_args": [ - "--extra-index-url", - "https://pypi.org/simple/" + "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" ], - "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" + "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_tomlkit_sdist_71b952e5": { + "pip_39_imagesize_sdist_69150444": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3379,17 +3198,17 @@ "--extra-index-url", "https://pypi.org/simple/" ], - "filename": "tomlkit-0.11.6.tar.gz", + "filename": "imagesize-1.4.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "tomlkit==0.11.6", - "sha256": "71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73", + "requirement": "imagesize==1.4.1", + "sha256": "69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", "urls": [ - "https://files.pythonhosted.org/packages/ff/04/58b4c11430ed4b7b8f1723a5e4f20929d59361e9b17f0872d69681fd8ffd/tomlkit-0.11.6.tar.gz" + "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz" ] } }, - "pip_39_sphinx_py3_none_any_1e09160a": { + "pip_39_importlib_metadata_py3_none_any_66f342cc": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3407,26 +3226,17 @@ "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", + "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": "sphinx==7.2.6", - "sha256": "1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560", + "requirement": "importlib-metadata==8.4.0 ;python_version < '3.10'", + "sha256": "66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1", "urls": [ - "https://files.pythonhosted.org/packages/b2/b6/8ed35256aa530a9d3da15d20bdc0ba888d5364441bb50a5a83ee7827affe/sphinx-7.2.6-py3-none-any.whl" + "https://files.pythonhosted.org/packages/c0/14/362d31bf1076b21e1bcdcb0dc61944822ff263937b804a79231df2774d28/importlib_metadata-8.4.0-py3-none-any.whl" ] } }, - "pip_39_pylint_sdist_18783cca": { + "pip_39_importlib_metadata_sdist_9a547d3b": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3450,17 +3260,17 @@ "--extra-index-url", "https://pypi.org/simple/" ], - "filename": "pylint-2.15.9.tar.gz", + "filename": "importlib_metadata-8.4.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "pylint==2.15.9", - "sha256": "18783cca3cfee5b83c6c5d10b3cdb66c6594520ffae61890858fe8d932e1c6b4", + "requirement": "importlib-metadata==8.4.0 ;python_version < '3.10'", + "sha256": "9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5", "urls": [ - "https://files.pythonhosted.org/packages/68/3a/1e61444eb8276ad962a7f300b6920b7ad391f4fbe551d34443f093a18899/pylint-2.15.9.tar.gz" + "https://files.pythonhosted.org/packages/c0/bd/fa8ce65b0a7d4b6d143ec23b0f5fd3f7ab80121078c465bc02baeaab22dc/importlib_metadata-8.4.0.tar.gz" ] } }, - "pip_39_pathspec_sdist_56200de4": { + "pip_39_isort_py3_none_any_c033fd0e": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3478,23 +3288,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "filename": "pathspec-0.10.3.tar.gz", + "filename": "isort-5.11.4-py3-none-any.whl", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "pathspec==0.10.3", - "sha256": "56200de4077d9d0791465aa9095a01d421861e405b5096955051deefd697d6f6", + "requirement": "isort==5.11.4", + "sha256": "c033fd0edb91000a7f09527fe5c75321878f98322a77ddcc81adbd83724afb7b", "urls": [ - "https://files.pythonhosted.org/packages/32/1a/6baf904503c3e943cae9605c9c88a43b964dea5b59785cf956091b341b08/pathspec-0.10.3.tar.gz" + "https://files.pythonhosted.org/packages/91/3b/a63bafb8141b67c397841b36ad46e7469716af2b2d00cb0be2dfb9667130/isort-5.11.4-py3-none-any.whl" ] } }, - "pip_39_alabaster_py3_none_any_1ee19aca": { + "pip_39_isort_sdist_6db30c5d": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3512,17 +3316,23 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "alabaster-0.7.13-py3-none-any.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "filename": "isort-5.11.4.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "alabaster==0.7.13", - "sha256": "1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3", + "requirement": "isort==5.11.4", + "sha256": "6db30c5ded9815d813932c04c2f85a360bcdd35fed496f4d8f35495ef0a261b6", "urls": [ - "https://files.pythonhosted.org/packages/64/88/c7083fc61120ab661c5d0b82cb77079fc1429d3f913a456c1c82cf4658f7/alabaster-0.7.13-py3-none-any.whl" + "https://files.pythonhosted.org/packages/76/46/004e2dd6c312e8bb7cb40a6c01b770956e0ef137857e82d47bd9c829356b/isort-5.11.4.tar.gz" ] } }, - "pip_39_wrapt_cp39_cp39_musllinux_1_1_x86_64_34aa51c4": { + "pip_39_jinja2_py3_none_any_bc5dd2ab": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3540,17 +3350,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", + "filename": "jinja2-3.1.4-py3-none-any.whl", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "wrapt==1.14.1", - "sha256": "34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe", + "requirement": "jinja2==3.1.4", + "sha256": "bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d", "urls": [ - "https://files.pythonhosted.org/packages/f9/3c/110e52b9da396a4ef3a0521552a1af9c7875a762361f48678c1ac272fd7e/wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl" + "https://files.pythonhosted.org/packages/31/80/3a54838c3fb461f6fec263ebf3a3a41771bd05190238de3486aae8540c36/jinja2-3.1.4-py3-none-any.whl" ] } }, - "pip_39_markupsafe_cp39_cp39_musllinux_1_1_aarch64_ab4a0df4": { + "pip_39_jinja2_sdist_4a3aee7a": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3568,17 +3378,23 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "filename": "jinja2-3.1.4.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "markupsafe==2.1.3", - "sha256": "ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636", + "requirement": "jinja2==3.1.4", + "sha256": "4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", "urls": [ - "https://files.pythonhosted.org/packages/03/65/3473d2cb84bb2cda08be95b97fc4f53e6bcd701a2d50ba7b7c905e1e9273/MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl" + "https://files.pythonhosted.org/packages/ed/55/39036716d19cab0747a5020fc7e907f362fbf48c984b14e62127f7e68e5d/jinja2-3.1.4.tar.gz" ] } }, - "pip_39_websockets_cp39_cp39_manylinux_2_17_aarch64_6f1a3f10": { + "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": { @@ -3596,17 +3412,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "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": "websockets==11.0.3", - "sha256": "6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61", + "requirement": "lazy-object-proxy==1.10.0", + "sha256": "366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94", "urls": [ - "https://files.pythonhosted.org/packages/d9/36/5741e62ccf629c8e38cc20f930491f8a33ce7dba972cae93dba3d6f02552/websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "https://files.pythonhosted.org/packages/bc/2f/b9230d00c2eaa629e67cc69f285bf6b5692cb1d0179a1f8764edd451da86/lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl" ] } }, - "pip_39_packaging_sdist_048fb0e9": { + "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": { @@ -3624,23 +3440,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "filename": "packaging-23.2.tar.gz", + "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": "packaging==23.2", - "sha256": "048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", + "requirement": "lazy-object-proxy==1.10.0", + "sha256": "2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b", "urls": [ - "https://files.pythonhosted.org/packages/fb/2b/9b9c33ffed44ee921d0967086d653047286054117d584f1b1a7c22ceaf7b/packaging-23.2.tar.gz" + "https://files.pythonhosted.org/packages/20/44/7d3b51ada1ddf873b136e2fa1d68bf3ee7b406b0bd9eeb97445932e2bfe1/lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" ] } }, - "pip_39_s3cmd_py2_none_any_49cd23d5": { + "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": { @@ -3658,17 +3468,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "s3cmd-2.1.0-py2.py3-none-any.whl", + "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": "s3cmd==2.1.0", - "sha256": "49cd23d516b17974b22b611a95ce4d93fe326feaa07320bd1d234fed68cbccfa", + "requirement": "lazy-object-proxy==1.10.0", + "sha256": "18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757", "urls": [ - "https://files.pythonhosted.org/packages/26/44/19e08f69b2169003f7307565f19449d997895251c6a6566ce21d5d636435/s3cmd-2.1.0-py2.py3-none-any.whl" + "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_39_idna_sdist_b307872f": { + "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": { @@ -3686,44 +3496,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "filename": "idna-2.10.tar.gz", + "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": "idna==2.10", - "sha256": "b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", + "requirement": "lazy-object-proxy==1.10.0", + "sha256": "217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424", "urls": [ - "https://files.pythonhosted.org/packages/ea/b7/e0e3c1c467636186c39925827be42f16fee389dc404ac29e930e9136be70/idna-2.10.tar.gz" + "https://files.pythonhosted.org/packages/d4/f8/d2d0d5caadf41c2d1fc9044dfc0e10d2831fb4ab6a077e68d25ea5bbff3b/lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl" ] } }, - "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_snowballstemmer_sdist_09b16deb": { + "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": { @@ -3741,23 +3524,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "filename": "snowballstemmer-2.2.0.tar.gz", + "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": "snowballstemmer==2.2.0", - "sha256": "09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", + "requirement": "lazy-object-proxy==1.10.0", + "sha256": "9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658", "urls": [ - "https://files.pythonhosted.org/packages/44/7b/af302bebf22c749c56c9c3e8ae13190b5b5db37a33d9068652e8f73b7089/snowballstemmer-2.2.0.tar.gz" + "https://files.pythonhosted.org/packages/8e/ae/3e15cffacbdb64ac49930cdbc23cb0c67e1bb9e8a8ca7765fd8a8d2510c3/lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl" ] } }, - "pip_39_imagesize_py2_none_any_0d8d18d0": { + "pip_39_lazy_object_proxy_cp39_cp39_win_amd64_a899b10e": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3775,17 +3552,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "imagesize-1.4.1-py2.py3-none-any.whl", + "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": "imagesize==1.4.1", - "sha256": "0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", + "requirement": "lazy-object-proxy==1.10.0", + "sha256": "a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd", "urls": [ - "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/fe/30/40879041ed6a3364bfa862c4237aa7fe94dcd4affa2175718acbbf4d29b9/lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl" ] } }, - "pip_39_setuptools_py3_none_any_57f6f22b": { + "pip_39_lazy_object_proxy_sdist_78247b6d": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3803,17 +3580,23 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "setuptools-65.6.3-py3-none-any.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "filename": "lazy-object-proxy-1.10.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "setuptools==65.6.3", - "sha256": "57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54", + "requirement": "lazy-object-proxy==1.10.0", + "sha256": "78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69", "urls": [ - "https://files.pythonhosted.org/packages/ef/e3/29d6e1a07e8d90ace4a522d9689d03e833b67b50d1588e693eec15f26251/setuptools-65.6.3-py3-none-any.whl" + "https://files.pythonhosted.org/packages/2c/f0/f02e2d150d581a294efded4020094a371bbab42423fe78625ac18854d89b/lazy-object-proxy-1.10.0.tar.gz" ] } }, - "pip_39_lazy_object_proxy_cp39_cp39_win_amd64_a899b10e": { + "pip_39_markupsafe_cp39_cp39_macosx_10_9_universal2_8023faf4": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3831,17 +3614,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl", + "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": "lazy-object-proxy==1.10.0", - "sha256": "a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd", + "requirement": "markupsafe==2.1.3", + "sha256": "8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", "urls": [ - "https://files.pythonhosted.org/packages/fe/30/40879041ed6a3364bfa862c4237aa7fe94dcd4affa2175718acbbf4d29b9/lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl" + "https://files.pythonhosted.org/packages/6a/86/654dc431513cd4417dfcead8102f22bece2d6abf2f584f0e1cc1524f7b94/MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl" ] } }, - "pip_39_sphinxcontrib_devhelp_py3_none_any_fe8009ae": { + "pip_39_markupsafe_cp39_cp39_macosx_10_9_x86_64_6b2b5695": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3859,26 +3642,17 @@ "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", + "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": "sphinxcontrib-devhelp==1.0.5", - "sha256": "fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f", + "requirement": "markupsafe==2.1.3", + "sha256": "6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", "urls": [ - "https://files.pythonhosted.org/packages/c0/03/010ac733ec7b7f71c1dc88e7115743ee466560d6d85373b56fb9916e4586/sphinxcontrib_devhelp-1.0.5-py3-none-any.whl" + "https://files.pythonhosted.org/packages/62/9b/4908a57acf39d8811836bc6776b309c2e07d63791485589acf0b6d7bc0c6/MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl" ] } }, - "pip_39_dill_sdist_e5db55f3": { + "pip_39_markupsafe_cp39_cp39_manylinux_2_17_aarch64_9dcdfd0e": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3896,23 +3670,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "filename": "dill-0.3.6.tar.gz", + "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": "dill==0.3.6", - "sha256": "e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373", + "requirement": "markupsafe==2.1.3", + "sha256": "9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", "urls": [ - "https://files.pythonhosted.org/packages/7c/e7/364a09134e1062d4d5ff69b853a56cf61c223e0afcc6906b6832bcd51ea8/dill-0.3.6.tar.gz" + "https://files.pythonhosted.org/packages/68/8d/c33c43c499c19f4b51181e196c9a497010908fc22c5de33551e298aa6a21/MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" ] } }, - "pip_39_colorama_py2_none_any_4f1d9991": { + "pip_39_markupsafe_cp39_cp39_manylinux_2_17_x86_64_05fb2117": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3930,17 +3698,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "colorama-0.4.6-py2.py3-none-any.whl", + "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": "colorama==0.4.6", - "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", + "requirement": "markupsafe==2.1.3", + "sha256": "05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", "urls": [ - "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl" + "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_chardet_py2_none_any_f864054d": { + "pip_39_markupsafe_cp39_cp39_musllinux_1_1_aarch64_ab4a0df4": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -3958,80 +3726,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "chardet-4.0.0-py2.py3-none-any.whl", + "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": "chardet==4.0.0", - "sha256": "f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5", + "requirement": "markupsafe==2.1.3", + "sha256": "ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636", "urls": [ - "https://files.pythonhosted.org/packages/19/c7/fa589626997dd07bd87d9269342ccb74b1720384a4d739a1872bd84fbe68/chardet-4.0.0-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/03/65/3473d2cb84bb2cda08be95b97fc4f53e6bcd701a2d50ba7b7c905e1e9273/MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.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_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_lazy_object_proxy_cp39_cp39_manylinux_2_5_x86_64_18dd842b": { + "pip_39_markupsafe_cp39_cp39_musllinux_1_1_x86_64_0a4e4a1a": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4049,17 +3754,17 @@ "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", + "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": "lazy-object-proxy==1.10.0", - "sha256": "18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757", + "requirement": "markupsafe==2.1.3", + "sha256": "0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", "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" + "https://files.pythonhosted.org/packages/ab/20/f59423543a8422cb8c69a579ebd0ef2c9dafa70cc8142b7372b5b4073caa/MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl" ] } }, - "pip_39_markupsafe_cp39_cp39_macosx_10_9_x86_64_6b2b5695": { + "pip_39_markupsafe_cp39_cp39_win_amd64_3fd4abcb": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4077,17 +3782,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", + "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": "6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", + "sha256": "3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba", "urls": [ - "https://files.pythonhosted.org/packages/62/9b/4908a57acf39d8811836bc6776b309c2e07d63791485589acf0b6d7bc0c6/MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl" + "https://files.pythonhosted.org/packages/a2/b2/624042cb58cc6b3529a6c3a7b7d230766e3ecb768cba118ba7befd18ed6f/MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl" ] } }, - "pip_39_platformdirs_sdist_b46ffafa": { + "pip_39_markupsafe_sdist_af598ed3": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4111,17 +3816,17 @@ "--extra-index-url", "https://pypi.org/simple/" ], - "filename": "platformdirs-2.6.0.tar.gz", + "filename": "MarkupSafe-2.1.3.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "platformdirs==2.6.0", - "sha256": "b46ffafa316e6b83b47489d240ce17173f123a9b9c83282141c3daf26ad9ac2e", + "requirement": "markupsafe==2.1.3", + "sha256": "af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad", "urls": [ - "https://files.pythonhosted.org/packages/ec/4c/9af851448e55c57b30a13a72580306e628c3b431d97fdae9e0b8d4fa3685/platformdirs-2.6.0.tar.gz" + "https://files.pythonhosted.org/packages/6d/7c/59a3248f411813f8ccba92a55feaac4bf360d29e2ff05ee7d8e1ef2d7dbf/MarkupSafe-2.1.3.tar.gz" ] } }, - "pip_39_lazy_object_proxy_cp39_cp39_macosx_10_9_x86_64_366c32fe": { + "pip_39_mccabe_py2_none_any_6c2d30ab": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4139,17 +3844,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", + "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": "lazy-object-proxy==1.10.0", - "sha256": "366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94", + "requirement": "mccabe==0.7.0", + "sha256": "6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", "urls": [ - "https://files.pythonhosted.org/packages/bc/2f/b9230d00c2eaa629e67cc69f285bf6b5692cb1d0179a1f8764edd451da86/lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl" + "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl" ] } }, - "pip_39_markupsafe_cp39_cp39_win_amd64_3fd4abcb": { + "pip_39_mccabe_sdist_348e0240": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4167,21 +3872,26 @@ "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", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "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/a2/b2/624042cb58cc6b3529a6c3a7b7d230766e3ecb768cba118ba7befd18ed6f/MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl" + "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz" ] } }, - "pip_39_wheel_py3_none_any_d236b20e": { + "pip_39_packaging_py3_none_any_8c491190": { "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" @@ -4196,17 +3906,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "wheel-0.40.0-py3-none-any.whl", + "filename": "packaging-23.2-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", + "requirement": "packaging==23.2", + "sha256": "8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7", "urls": [ - "https://files.pythonhosted.org/packages/61/86/cc8d1ff2ca31a312a25a708c891cf9facbad4eae493b3872638db6785eb5/wheel-0.40.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl" ] } }, - "pip_39_certifi_py3_none_any_92d60375": { + "pip_39_packaging_sdist_048fb0e9": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4224,17 +3934,23 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "certifi-2023.7.22-py3-none-any.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "filename": "packaging-23.2.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "certifi==2023.7.22", - "sha256": "92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9", + "requirement": "packaging==23.2", + "sha256": "048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", "urls": [ - "https://files.pythonhosted.org/packages/4c/dd/2234eab22353ffc7d94e8d13177aaa050113286e93e7b40eae01fbf7c3d9/certifi-2023.7.22-py3-none-any.whl" + "https://files.pythonhosted.org/packages/fb/2b/9b9c33ffed44ee921d0967086d653047286054117d584f1b1a7c22ceaf7b/packaging-23.2.tar.gz" ] } }, - "pip_39_wrapt_cp39_cp39_macosx_11_0_arm64_988635d1": { + "pip_39_pathspec_py3_none_any_3c95343a": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4252,59 +3968,51 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", + "filename": "pathspec-0.10.3-py3-none-any.whl", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "wrapt==1.14.1", - "sha256": "988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7", + "requirement": "pathspec==0.10.3", + "sha256": "3c95343af8b756205e2aba76e843ba9520a24dd84f68c22b9f93251507509dd6", "urls": [ - "https://files.pythonhosted.org/packages/bb/70/73c54e24ea69a8b06ae9649e61d5e64f2b4bdfc6f202fc7794abeac1ed20/wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl" + "https://files.pythonhosted.org/packages/3c/29/c07c3a976dbe37c56e381e058c11e8738cb3a0416fc842a310461f8bb695/pathspec-0.10.3-py3-none-any.whl" ] } }, - "pip_310_typing_extensions": { + "pip_39_pathspec_sdist_56200de4": { "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/" + "envsubst": [ + "PIP_INDEX_URL" ], - "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_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" + "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" ], "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", "--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" + "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_websockets_cp39_cp39_musllinux_1_1_x86_64_97b52894": { + "pip_39_platformdirs_py3_none_any_1a89a123": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4322,47 +4030,51 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", + "filename": "platformdirs-2.6.0-py3-none-any.whl", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "websockets==11.0.3", - "sha256": "97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311", + "requirement": "platformdirs==2.6.0", + "sha256": "1a89a12377800c81983db6be069ec068eee989748799b946cce2a6e80dcc54ca", "urls": [ - "https://files.pythonhosted.org/packages/72/89/0d150939f2e592ed78c071d69237ac1c872462cc62a750c5f592f3d4ab18/websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl" + "https://files.pythonhosted.org/packages/87/69/cd019a9473bcdfb38983e2d550ccb239264fc4c2fc32c42ac1b1cc2506b6/platformdirs-2.6.0-py3-none-any.whl" ] } }, - "pip_310_sphinxcontrib_qthelp": { + "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": [ - "linux_*", - "osx_*", - "windows_*", - "linux_x86_64", - "host" + "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" ], "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", "--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" + "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_pyyaml_cp39_cp39_musllinux_1_1_x86_64_04ac92ad": { + "pip_39_pygments_py3_none_any_13fc09fa": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4380,17 +4092,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", + "filename": "Pygments-2.16.1-py3-none-any.whl", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "pyyaml==6.0.1", - "sha256": "04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", + "requirement": "pygments==2.16.1", + "sha256": "13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692", "urls": [ - "https://files.pythonhosted.org/packages/40/da/a175a35cf5583580e90ac3e2a3dbca90e43011593ae62ce63f79d7b28d92/PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl" + "https://files.pythonhosted.org/packages/43/88/29adf0b44ba6ac85045e63734ae0997d3c58d8b1a91c914d240828d0d73d/Pygments-2.16.1-py3-none-any.whl" ] } }, - "pip_39_sphinxcontrib_jsmath_py2_none_any_2ec2eaeb": { + "pip_39_pygments_sdist_1daff049": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4408,17 +4120,23 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "filename": "Pygments-2.16.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "sphinxcontrib-jsmath==1.0.1", - "sha256": "2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", + "requirement": "pygments==2.16.1", + "sha256": "1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29", "urls": [ - "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/d6/f7/4d461ddf9c2bcd6a4d7b2b139267ca32a69439387cc1f02a924ff8883825/Pygments-2.16.1.tar.gz" ] } }, - "pip_39_wrapt_cp39_cp39_macosx_10_9_x86_64_3232822c": { + "pip_39_pylint_print_py3_none_any_a2b2599e": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4436,38 +4154,51 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", + "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": "wrapt==1.14.1", - "sha256": "3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383", + "requirement": "pylint-print==1.0.1", + "sha256": "a2b2599e7887b93e551db2624c523c1e6e9e58c3be8416cd98d41e4427e2669b", "urls": [ - "https://files.pythonhosted.org/packages/d9/ab/3ba5816dd466ffd7242913708771d258569825ab76fd29d7fd85b9361311/wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl" + "https://files.pythonhosted.org/packages/8f/a9/6f0687b575d502b4fa770cd52231e23462c548829e5f2e6f43a3d2b9c939/pylint_print-1.0.1-py3-none-any.whl" ] } }, - "pip_310_wrapt": { + "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": [ - "linux_*", - "osx_*", - "windows_*", - "linux_x86_64", - "host" + "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" ], "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", "--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" + "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_importlib_metadata_py3_none_any_66f342cc": { + "pip_39_pylint_py3_none_any_349c8cd3": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4485,17 +4216,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "importlib_metadata-8.4.0-py3-none-any.whl", + "filename": "pylint-2.15.9-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", + "requirement": "pylint==2.15.9", + "sha256": "349c8cd36aede4d50a0754a8c0218b43323d13d5d88f4b2952ddfe3e169681eb", "urls": [ - "https://files.pythonhosted.org/packages/c0/14/362d31bf1076b21e1bcdcb0dc61944822ff263937b804a79231df2774d28/importlib_metadata-8.4.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/7d/df/0e50d5640ed4c6a492cdc6df0c281afee3f85d98209e7ec7b31243838b40/pylint-2.15.9-py3-none-any.whl" ] } }, - "pip_39_yamllint_sdist_9e3d8ddd": { + "pip_39_pylint_sdist_18783cca": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4519,17 +4250,17 @@ "--extra-index-url", "https://pypi.org/simple/" ], - "filename": "yamllint-1.28.0.tar.gz", + "filename": "pylint-2.15.9.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "yamllint==1.28.0", - "sha256": "9e3d8ddd16d0583214c5fdffe806c9344086721f107435f68bad990e5a88826b", + "requirement": "pylint==2.15.9", + "sha256": "18783cca3cfee5b83c6c5d10b3cdb66c6594520ffae61890858fe8d932e1c6b4", "urls": [ - "https://files.pythonhosted.org/packages/c8/82/4cd3ec8f98d821e7cc7ef504add450623d5c86b656faf65e9b0cc46f4be6/yamllint-1.28.0.tar.gz" + "https://files.pythonhosted.org/packages/68/3a/1e61444eb8276ad962a7f300b6920b7ad391f4fbe551d34443f093a18899/pylint-2.15.9.tar.gz" ] } }, - "pip_39_python_dateutil_sdist_0123cacc": { + "pip_39_python_dateutil_py2_none_any_961d03dc": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4547,143 +4278,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "filename": "python-dateutil-2.8.2.tar.gz", + "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": "0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", + "sha256": "961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9", "urls": [ - "https://files.pythonhosted.org/packages/4c/c4/13b4776ea2d76c115c1d1b84579f3764ee6d57204f6be27119f13a61d0a9/python-dateutil-2.8.2.tar.gz" + "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl" ] } }, - "pip": { - "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", - "ruleClassName": "hub_repository", - "attributes": { - "repo_name": "pip", - "extra_hub_aliases": { - "wheel": [ - "generated_file" - ] - }, - "whl_map": { - "alabaster": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_alabaster\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "astroid": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_astroid\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "babel": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_babel\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "certifi": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_certifi\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "chardet": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_chardet\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "colorama": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_colorama\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "dill": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_dill\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "docutils": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_docutils\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "idna": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_idna\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "imagesize": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_imagesize\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "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\"}]", - "isort": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_isort\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "jinja2": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_jinja2\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "lazy_object_proxy": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_lazy_object_proxy\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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-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-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-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\"}]", - "markupsafe": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_markupsafe\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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-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-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-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_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-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.tar.gz\",\"repo\":\"pip_39_markupsafe_sdist_af598ed3\",\"target_platforms\":null,\"version\":\"3.9\"}]", - "mccabe": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_mccabe\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "packaging": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_packaging\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "pathspec": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pathspec\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "platformdirs": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_platformdirs\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "pygments": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pygments\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "pylint": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pylint\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "pylint_print": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pylint_print\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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\"}]", - "python_dateutil": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_python_dateutil\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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\"}]", - "python_magic": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_python_magic\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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\"}]", - "pyyaml": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pyyaml\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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-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-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-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-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.tar.gz\",\"repo\":\"pip_39_pyyaml_sdist_bfdf460b\",\"target_platforms\":null,\"version\":\"3.9\"}]", - "requests": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_requests\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "s3cmd": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_s3cmd\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "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\"}]", - "six": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_six\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "snowballstemmer": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_snowballstemmer\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "sphinx": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinx\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "sphinxcontrib_applehelp": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_applehelp\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "sphinxcontrib_devhelp": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_devhelp\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "sphinxcontrib_htmlhelp": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_htmlhelp\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "sphinxcontrib_jsmath": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_jsmath\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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\"}]", - "sphinxcontrib_qthelp": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_qthelp\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "sphinxcontrib_serializinghtml": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_serializinghtml\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "tabulate": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_tabulate\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "tomli": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_tomli\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "tomlkit": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_tomlkit\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "typing_extensions": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_typing_extensions\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "urllib3": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_urllib3\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "websockets": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_websockets\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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-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-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-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-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-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-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.tar.gz\",\"repo\":\"pip_39_websockets_sdist_88fc51d9\",\"target_platforms\":null,\"version\":\"3.9\"}]", - "wheel": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_wheel\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "wrapt": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_wrapt\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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-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-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-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-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-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\"}]", - "yamllint": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_yamllint\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "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\"}]" - }, - "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-applehelp", - "sphinxcontrib-devhelp", - "sphinxcontrib-htmlhelp", - "sphinxcontrib-qthelp", - "sphinxcontrib-serializinghtml" - ] - } - } - }, - "pip_39_importlib_metadata_sdist_9a547d3b": { + "pip_39_python_dateutil_sdist_0123cacc": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4707,17 +4312,17 @@ "--extra-index-url", "https://pypi.org/simple/" ], - "filename": "importlib_metadata-8.4.0.tar.gz", + "filename": "python-dateutil-2.8.2.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", + "requirement": "python-dateutil==2.8.2", + "sha256": "0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", "urls": [ - "https://files.pythonhosted.org/packages/c0/bd/fa8ce65b0a7d4b6d143ec23b0f5fd3f7ab80121078c465bc02baeaab22dc/importlib_metadata-8.4.0.tar.gz" + "https://files.pythonhosted.org/packages/4c/c4/13b4776ea2d76c115c1d1b84579f3764ee6d57204f6be27119f13a61d0a9/python-dateutil-2.8.2.tar.gz" ] } }, - "pip_39_pyyaml_cp39_cp39_manylinux_2_17_x86_64_bc1bf292": { + "pip_39_python_magic_py2_none_any_c212960a": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4735,17 +4340,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "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": "pyyaml==6.0.1", - "sha256": "bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", + "requirement": "python-magic==0.4.27", + "sha256": "c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3", "urls": [ - "https://files.pythonhosted.org/packages/7d/39/472f2554a0f1e825bd7c5afc11c817cd7a2f3657460f7159f691fbb37c51/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "https://files.pythonhosted.org/packages/6c/73/9f872cb81fc5c3bb48f7227872c28975f998f3e7c2b1c16e95e6432bbb90/python_magic-0.4.27-py2.py3-none-any.whl" ] } }, - "pip_39_tomli_py3_none_any_939de3e7": { + "pip_39_python_magic_sdist_c1ba14b0": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4763,17 +4368,23 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "tomli-2.0.1-py3-none-any.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "filename": "python-magic-0.4.27.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": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "requirement": "python-magic==0.4.27", + "sha256": "c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b", "urls": [ - "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl" + "https://files.pythonhosted.org/packages/da/db/0b3e28ac047452d079d375ec6798bf76a036a08182dbb39ed38116a49130/python-magic-0.4.27.tar.gz" ] } }, - "pip_39_sphinxcontrib_qthelp_py3_none_any_bf76886e": { + "pip_39_pyyaml_cp39_cp39_macosx_10_9_x86_64_9eb6caa9": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4791,26 +4402,17 @@ "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", + "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": "sphinxcontrib-qthelp==1.0.6", - "sha256": "bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4", + "requirement": "pyyaml==6.0.1", + "sha256": "9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", "urls": [ - "https://files.pythonhosted.org/packages/1f/e5/1850f3f118e95581c1e30b57028ac979badee1eb29e70ee72b0241f5a185/sphinxcontrib_qthelp-1.0.6-py3-none-any.whl" + "https://files.pythonhosted.org/packages/57/c5/5d09b66b41d549914802f482a2118d925d876dc2a35b2d127694c1345c34/PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl" ] } }, - "pip_39_websockets_cp39_cp39_win_amd64_c792ea4e": { + "pip_39_pyyaml_cp39_cp39_macosx_11_0_arm64_c8098ddc": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4828,80 +4430,45 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "websockets-11.0.3-cp39-cp39-win_amd64.whl", + "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": "websockets==11.0.3", - "sha256": "c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e", + "requirement": "pyyaml==6.0.1", + "sha256": "c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", "urls": [ - "https://files.pythonhosted.org/packages/f4/3f/65dfa50084a06ab0a05f3ca74195c2c17a1c075b8361327d831ccce0a483/websockets-11.0.3-cp39-cp39-win_amd64.whl" + "https://files.pythonhosted.org/packages/0e/88/21b2f16cb2123c1e9375f2c93486e35fdc86e63f02e274f0e99c589ef153/PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.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_imagesize": { + "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}", - "experimental_target_platforms": [ - "linux_*", - "osx_*", - "windows_*", - "linux_x86_64", - "host" - ], - "extra_pip_args": [ - "--extra-index-url", - "https://pypi.org/simple/" + "envsubst": [ + "PIP_INDEX_URL" ], - "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_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/" + "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" ], - "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" + "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_sphinxcontrib_jsmath_sdist_a9925e4a": { + "pip_39_pyyaml_cp39_cp39_manylinux_2_17_s390x_b786eecb": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4919,23 +4486,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "filename": "sphinxcontrib-jsmath-1.0.1.tar.gz", + "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": "sphinxcontrib-jsmath==1.0.1", - "sha256": "a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", + "requirement": "pyyaml==6.0.1", + "sha256": "b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", "urls": [ - "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz" + "https://files.pythonhosted.org/packages/4a/4b/c71ef18ef83c82f99e6da8332910692af78ea32bd1d1d76c9787dfa36aea/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl" ] } }, - "pip_39_alabaster_sdist_a27a4a08": { + "pip_39_pyyaml_cp39_cp39_manylinux_2_17_x86_64_bc1bf292": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4953,23 +4514,45 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" + "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_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" ], - "filename": "alabaster-0.7.13.tar.gz", + "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": "alabaster==0.7.13", - "sha256": "a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2", + "requirement": "pyyaml==6.0.1", + "sha256": "04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", "urls": [ - "https://files.pythonhosted.org/packages/94/71/a8ee96d1fd95ca04a0d2e2d9c4081dac4c2d2b12f7ddb899c8cb9bfd1532/alabaster-0.7.13.tar.gz" + "https://files.pythonhosted.org/packages/40/da/a175a35cf5583580e90ac3e2a3dbca90e43011593ae62ce63f79d7b28d92/PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl" ] } }, - "pip_39_pylint_print_py3_none_any_a2b2599e": { + "pip_39_pyyaml_cp39_cp39_win_amd64_510c9dee": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -4987,17 +4570,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "pylint_print-1.0.1-py3-none-any.whl", + "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": "pylint-print==1.0.1", - "sha256": "a2b2599e7887b93e551db2624c523c1e6e9e58c3be8416cd98d41e4427e2669b", + "requirement": "pyyaml==6.0.1", + "sha256": "510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", "urls": [ - "https://files.pythonhosted.org/packages/8f/a9/6f0687b575d502b4fa770cd52231e23462c548829e5f2e6f43a3d2b9c939/pylint_print-1.0.1-py3-none-any.whl" + "https://files.pythonhosted.org/packages/84/4d/82704d1ab9290b03da94e6425f5e87396b999fd7eb8e08f3a92c158402bf/PyYAML-6.0.1-cp39-cp39-win_amd64.whl" ] } }, - "pip_39_six_sdist_1e61c374": { + "pip_39_pyyaml_sdist_bfdf460b": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5021,17 +4604,17 @@ "--extra-index-url", "https://pypi.org/simple/" ], - "filename": "six-1.16.0.tar.gz", + "filename": "PyYAML-6.0.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "six==1.16.0", - "sha256": "1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "requirement": "pyyaml==6.0.1", + "sha256": "bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", "urls": [ - "https://files.pythonhosted.org/packages/71/39/171f1c67cd00715f190ba0b100d606d440a28c93c7714febeca8b79af85e/six-1.16.0.tar.gz" + "https://files.pythonhosted.org/packages/cd/e5/af35f7ea75cf72f2cd079c95ee16797de7cd71f29ea7c68ae5ce7be1eda0/PyYAML-6.0.1.tar.gz" ] } }, - "pip_39_requests_sdist_27973dd4": { + "pip_39_requests_py2_none_any_c210084e": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5050,19 +4633,13 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "filename": "requests-2.25.1.tar.gz", + "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": "27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804", + "sha256": "c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e", "urls": [ - "https://files.pythonhosted.org/packages/6b/47/c14abc08432ab22dc18b9892252efaf005ab44066de871e72a38d6af464b/requests-2.25.1.tar.gz" + "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\"]}", @@ -5071,28 +4648,47 @@ } } }, - "pip_310_platformdirs": { + "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": [ - "linux_*", - "osx_*", - "windows_*", - "linux_x86_64", - "host" + "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" ], "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", "--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" + "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_39_six_py2_none_any_8abb2f1d": { + "pip_39_s3cmd_py2_none_any_49cd23d5": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5110,38 +4706,51 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "six-1.16.0-py2.py3-none-any.whl", + "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": "six==1.16.0", - "sha256": "8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", + "requirement": "s3cmd==2.1.0", + "sha256": "49cd23d516b17974b22b611a95ce4d93fe326feaa07320bd1d234fed68cbccfa", "urls": [ - "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/26/44/19e08f69b2169003f7307565f19449d997895251c6a6566ce21d5d636435/s3cmd-2.1.0-py2.py3-none-any.whl" ] } }, - "pip_310_dill": { + "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": [ - "linux_*", - "osx_*", - "windows_*", - "linux_x86_64", - "host" + "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" ], "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", "--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" + "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_39_urllib3_py2_none_any_34b97092": { + "pip_39_setuptools_py3_none_any_57f6f22b": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5159,17 +4768,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "urllib3-1.26.18-py2.py3-none-any.whl", + "filename": "setuptools-65.6.3-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", + "requirement": "setuptools==65.6.3", + "sha256": "57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54", "urls": [ - "https://files.pythonhosted.org/packages/b0/53/aa91e163dcfd1e5b82d8a890ecf13314e3e149c05270cc644581f77f17fd/urllib3-1.26.18-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/ef/e3/29d6e1a07e8d90ace4a522d9689d03e833b67b50d1588e693eec15f26251/setuptools-65.6.3-py3-none-any.whl" ] } }, - "pip_39_websockets_cp39_cp39_macosx_11_0_arm64_3580dd9c": { + "pip_39_setuptools_sdist_a7620757": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5187,17 +4796,23 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "filename": "setuptools-65.6.3.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "websockets==11.0.3", - "sha256": "3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016", + "requirement": "setuptools==65.6.3", + "sha256": "a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75", "urls": [ - "https://files.pythonhosted.org/packages/a0/1a/3da73e69ebc00649d11ed836541c92c1a2df0b8a8aa641a2c8746e7c2b9c/websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl" + "https://files.pythonhosted.org/packages/b6/21/cb9a8d0b2c8597c83fce8e9c02884bce3d4951e41e807fc35791c6b23d9a/setuptools-65.6.3.tar.gz" ] } }, - "pip_39_babel_sdist_33e0952d": { + "pip_39_six_py2_none_any_8abb2f1d": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5215,44 +4830,51 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "filename": "Babel-2.13.1.tar.gz", + "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": "babel==2.13.1", - "sha256": "33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900", + "requirement": "six==1.16.0", + "sha256": "8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254", "urls": [ - "https://files.pythonhosted.org/packages/aa/6c/737d2345d86741eeb594381394016b9c74c1253b4cbe274bb1e7b5e2138e/Babel-2.13.1.tar.gz" + "https://files.pythonhosted.org/packages/d9/5a/e7c31adbe875f2abbb91bd84cf2dc52d792b5a01506781dbcf25c91daf11/six-1.16.0-py2.py3-none-any.whl" ] } }, - "pip_310_sphinxcontrib_jsmath": { + "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": [ - "linux_*", - "osx_*", - "windows_*", - "linux_x86_64", - "host" + "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" ], "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", "--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" + "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_mccabe_py2_none_any_6c2d30ab": { + "pip_39_snowballstemmer_py2_none_any_c8e1716e": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5270,66 +4892,24 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "mccabe-0.7.0-py2.py3-none-any.whl", + "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": "mccabe==0.7.0", - "sha256": "6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", + "requirement": "snowballstemmer==2.2.0", + "sha256": "c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", "urls": [ - "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl" ] } }, - "pip_310_tomlkit": { + "pip_39_snowballstemmer_sdist_09b16deb": { "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" - ], + "envsubst": [ + "PIP_INDEX_URL" + ], "experimental_target_platforms": [ "cp39_linux_aarch64", "cp39_linux_arm", @@ -5346,17 +4926,17 @@ "--extra-index-url", "https://pypi.org/simple/" ], - "filename": "isort-5.11.4.tar.gz", + "filename": "snowballstemmer-2.2.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "isort==5.11.4", - "sha256": "6db30c5ded9815d813932c04c2f85a360bcdd35fed496f4d8f35495ef0a261b6", + "requirement": "snowballstemmer==2.2.0", + "sha256": "09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", "urls": [ - "https://files.pythonhosted.org/packages/76/46/004e2dd6c312e8bb7cb40a6c01b770956e0ef137857e82d47bd9c829356b/isort-5.11.4.tar.gz" + "https://files.pythonhosted.org/packages/44/7b/af302bebf22c749c56c9c3e8ae13190b5b5db37a33d9068652e8f73b7089/snowballstemmer-2.2.0.tar.gz" ] } }, - "pip_39_python_magic_sdist_c1ba14b0": { + "pip_39_sphinx_py3_none_any_1e09160a": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5374,23 +4954,26 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" + "filename": "sphinx-7.2.6-py3-none-any.whl", + "group_deps": [ + "sphinx", + "sphinxcontrib_qthelp", + "sphinxcontrib_htmlhelp", + "sphinxcontrib_devhelp", + "sphinxcontrib_applehelp", + "sphinxcontrib_serializinghtml" ], - "filename": "python-magic-0.4.27.tar.gz", + "group_name": "sphinx", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "python-magic==0.4.27", - "sha256": "c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b", + "requirement": "sphinx==7.2.6", + "sha256": "1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560", "urls": [ - "https://files.pythonhosted.org/packages/da/db/0b3e28ac047452d079d375ec6798bf76a036a08182dbb39ed38116a49130/python-magic-0.4.27.tar.gz" + "https://files.pythonhosted.org/packages/b2/b6/8ed35256aa530a9d3da15d20bdc0ba888d5364441bb50a5a83ee7827affe/sphinx-7.2.6-py3-none-any.whl" ] } }, - "pip_39_lazy_object_proxy_cp39_cp39_manylinux_2_17_aarch64_2297f08f": { + "pip_39_sphinx_sdist_9a5160e1": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5408,17 +4991,32 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "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": "lazy-object-proxy==1.10.0", - "sha256": "2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b", + "requirement": "sphinx==7.2.6", + "sha256": "9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5", "urls": [ - "https://files.pythonhosted.org/packages/20/44/7d3b51ada1ddf873b136e2fa1d68bf3ee7b406b0bd9eeb97445932e2bfe1/lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "https://files.pythonhosted.org/packages/73/8e/6e51da4b26665b4b92b1944ea18b2d9c825e753e19180cc5bdc818d0ed3b/sphinx-7.2.6.tar.gz" ] } }, - "pip_39_wrapt_cp39_cp39_manylinux_2_17_aarch64_9cca3c2c": { + "pip_39_sphinxcontrib_applehelp_py3_none_any_094c4d56": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5436,38 +5034,26 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "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": "wrapt==1.14.1", - "sha256": "9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86", + "requirement": "sphinxcontrib-applehelp==1.0.7", + "sha256": "094c4d56209d1734e7d252f6e0b3ccc090bd52ee56807a5d9315b19c122ab15d", "urls": [ - "https://files.pythonhosted.org/packages/38/38/5b338163b3b4f1ab718306984678c3d180b85a25d72654ea4c61aa6b0968/wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "https://files.pythonhosted.org/packages/c0/0c/261c0949083c0ac635853528bb0070c89e927841d4e533ba0b5563365c06/sphinxcontrib_applehelp-1.0.7-py3-none-any.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": { + "pip_39_sphinxcontrib_applehelp_sdist_39fdc8d7": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5491,32 +5077,7 @@ "--extra-index-url", "https://pypi.org/simple/" ], - "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_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/" - ], + "filename": "sphinxcontrib_applehelp-1.0.7.tar.gz", "group_deps": [ "sphinx", "sphinxcontrib_qthelp", @@ -5526,40 +5087,16 @@ "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_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", + "requirement": "sphinxcontrib-applehelp==1.0.7", + "sha256": "39fdc8d762d33b01a7d8f026a3b7d71563ea3b72787d5f00ad8465bd9d6dfbfa", "urls": [ - "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/1c/5a/fce19be5d4db26edc853a0c34832b39db7b769b7689da027529767b0aa98/sphinxcontrib_applehelp-1.0.7.tar.gz" ] } }, - "pip_39_pyyaml_sdist_bfdf460b": { + "pip_39_sphinxcontrib_devhelp_py3_none_any_fe8009ae": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5577,19 +5114,22 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" + "filename": "sphinxcontrib_devhelp-1.0.5-py3-none-any.whl", + "group_deps": [ + "sphinx", + "sphinxcontrib_qthelp", + "sphinxcontrib_htmlhelp", + "sphinxcontrib_devhelp", + "sphinxcontrib_applehelp", + "sphinxcontrib_serializinghtml" ], - "filename": "PyYAML-6.0.1.tar.gz", + "group_name": "sphinx", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "pyyaml==6.0.1", - "sha256": "bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", + "requirement": "sphinxcontrib-devhelp==1.0.5", + "sha256": "fe8009aed765188f08fcaadbb3ea0d90ce8ae2d76710b7e29ea7d047177dae2f", "urls": [ - "https://files.pythonhosted.org/packages/cd/e5/af35f7ea75cf72f2cd079c95ee16797de7cd71f29ea7c68ae5ce7be1eda0/PyYAML-6.0.1.tar.gz" + "https://files.pythonhosted.org/packages/c0/03/010ac733ec7b7f71c1dc88e7115743ee466560d6d85373b56fb9916e4586/sphinxcontrib_devhelp-1.0.5-py3-none-any.whl" ] } }, @@ -5636,28 +5176,7 @@ ] } }, - "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_sphinxcontrib_serializinghtml_py3_none_any_9b36e503": { + "pip_39_sphinxcontrib_htmlhelp_py3_none_any_8001661c": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5675,7 +5194,7 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl", + "filename": "sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl", "group_deps": [ "sphinx", "sphinxcontrib_qthelp", @@ -5687,14 +5206,14 @@ "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", + "requirement": "sphinxcontrib-htmlhelp==2.0.4", + "sha256": "8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9", "urls": [ - "https://files.pythonhosted.org/packages/95/d6/2e0bda62b2a808070ac922d21a950aa2cb5e4fcfb87e5ff5f86bc43a2201/sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl" + "https://files.pythonhosted.org/packages/28/7a/958f8e3e6abe8219d0d1f1224886de847ab227b218f4a07b61bc337f64be/sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl" ] } }, - "pip_39_tabulate_sdist_0095b12b": { + "pip_39_sphinxcontrib_htmlhelp_sdist_6c26a118": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5718,27 +5237,26 @@ "--extra-index-url", "https://pypi.org/simple/" ], - "filename": "tabulate-0.9.0.tar.gz", + "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": "tabulate==0.9.0", - "sha256": "0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", + "requirement": "sphinxcontrib-htmlhelp==2.0.4", + "sha256": "6c26a118a05b76000738429b724a0568dbde5b72391a688577da08f11891092a", "urls": [ - "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz" + "https://files.pythonhosted.org/packages/fd/2d/abf5cd4cc1d5cd9842748b15a28295e4c4a927facfa8a0e173bd3f151bc5/sphinxcontrib_htmlhelp-2.0.4.tar.gz" ] } }, - "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": { + "pip_39_sphinxcontrib_jsmath_py2_none_any_2ec2eaeb": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5756,17 +5274,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", + "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": "markupsafe==2.1.3", - "sha256": "0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", + "requirement": "sphinxcontrib-jsmath==1.0.1", + "sha256": "2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", "urls": [ - "https://files.pythonhosted.org/packages/ab/20/f59423543a8422cb8c69a579ebd0ef2c9dafa70cc8142b7372b5b4073caa/MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl" + "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl" ] } }, - "pip_39_imagesize_sdist_69150444": { + "pip_39_sphinxcontrib_jsmath_sdist_a9925e4a": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5790,17 +5308,17 @@ "--extra-index-url", "https://pypi.org/simple/" ], - "filename": "imagesize-1.4.1.tar.gz", + "filename": "sphinxcontrib-jsmath-1.0.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "imagesize==1.4.1", - "sha256": "69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", + "requirement": "sphinxcontrib-jsmath==1.0.1", + "sha256": "a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", "urls": [ - "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz" + "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz" ] } }, - "pip_39_websockets_cp39_cp39_manylinux_2_5_x86_64_279e5de4": { + "pip_39_sphinxcontrib_qthelp_py3_none_any_bf76886e": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5818,17 +5336,26 @@ "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", + "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": "websockets==11.0.3", - "sha256": "279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd", + "requirement": "sphinxcontrib-qthelp==1.0.6", + "sha256": "bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4", "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" + "https://files.pythonhosted.org/packages/1f/e5/1850f3f118e95581c1e30b57028ac979badee1eb29e70ee72b0241f5a185/sphinxcontrib_qthelp-1.0.6-py3-none-any.whl" ] } }, - "pip_39_sphinxcontrib_applehelp_py3_none_any_094c4d56": { + "pip_39_sphinxcontrib_qthelp_sdist_62b9d1a1": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5846,7 +5373,13 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "sphinxcontrib_applehelp-1.0.7-py3-none-any.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "filename": "sphinxcontrib_qthelp-1.0.6.tar.gz", "group_deps": [ "sphinx", "sphinxcontrib_qthelp", @@ -5858,35 +5391,14 @@ "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", + "requirement": "sphinxcontrib-qthelp==1.0.6", + "sha256": "62b9d1a186ab7f5ee3356d906f648cacb7a6bdb94d201ee7adf26db55092982d", "urls": [ - "https://files.pythonhosted.org/packages/c0/0c/261c0949083c0ac635853528bb0070c89e927841d4e533ba0b5563365c06/sphinxcontrib_applehelp-1.0.7-py3-none-any.whl" + "https://files.pythonhosted.org/packages/4f/a2/53129fc967ac8402d5e4e83e23c959c3f7a07362ec154bdb2e197d8cc270/sphinxcontrib_qthelp-1.0.6.tar.gz" ] } }, - "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_39_zipp_py3_none_any_58da6168": { + "pip_39_sphinxcontrib_serializinghtml_py3_none_any_9b36e503": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5904,42 +5416,72 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "zipp-3.20.0-py3-none-any.whl", + "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": "zipp==3.20.0 ;python_version < '3.10'", - "sha256": "58da6168be89f0be59beb194da1250516fdaa062ccebd30127ac65d30045e10d", + "requirement": "sphinxcontrib-serializinghtml==1.1.9", + "sha256": "9b36e503703ff04f20e9675771df105e58aa029cfcbc23b8ed716019b7416ae1", "urls": [ - "https://files.pythonhosted.org/packages/da/cc/b9958af9f9c86b51f846d8487440af495ecf19b16e426fce1ed0b0796175/zipp-3.20.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/95/d6/2e0bda62b2a808070ac922d21a950aa2cb5e4fcfb87e5ff5f86bc43a2201/sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl" ] } }, - "pip_310_pyyaml": { + "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": [ - "linux_*", - "osx_*", - "windows_*", - "linux_x86_64", - "host" + "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" ], "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", "--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" + "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_requests_py2_none_any_c210084e": { + "pip_39_tabulate_py3_none_any_024ca478": { "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" @@ -5954,22 +5496,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "requests-2.25.1-py2.py3-none-any.whl", + "filename": "tabulate-0.9.0-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", + "requirement": "tabulate==0.9.0", + "sha256": "024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", "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\"]}" - } + "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl" + ] } }, - "pip_39_docutils_py3_none_any_96f387a2": { + "pip_39_tabulate_sdist_0095b12b": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -5987,17 +5524,23 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "docutils-0.20.1-py3-none-any.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "filename": "tabulate-0.9.0.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "docutils==0.20.1", - "sha256": "96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", + "requirement": "tabulate==0.9.0", + "sha256": "0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", "urls": [ - "https://files.pythonhosted.org/packages/26/87/f238c0670b94533ac0353a4e2a1a771a0cc73277b88bff23d3ae35a256c1/docutils-0.20.1-py3-none-any.whl" + "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz" ] } }, - "pip_39_isort_py3_none_any_c033fd0e": { + "pip_39_tomli_py3_none_any_939de3e7": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6015,17 +5558,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "isort-5.11.4-py3-none-any.whl", + "filename": "tomli-2.0.1-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", + "requirement": "tomli==2.0.1 ;python_version < '3.11'", + "sha256": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", "urls": [ - "https://files.pythonhosted.org/packages/91/3b/a63bafb8141b67c397841b36ad46e7469716af2b2d00cb0be2dfb9667130/isort-5.11.4-py3-none-any.whl" + "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl" ] } }, - "pip_39_astroid_sdist_1493fe8b": { + "pip_39_tomli_sdist_de526c12": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6049,17 +5592,17 @@ "--extra-index-url", "https://pypi.org/simple/" ], - "filename": "astroid-2.12.13.tar.gz", + "filename": "tomli-2.0.1.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "astroid==2.12.13", - "sha256": "1493fe8bd3dfd73dc35bd53c9d5b6e49ead98497c47b2307662556a5692d29d7", + "requirement": "tomli==2.0.1 ;python_version < '3.11'", + "sha256": "de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", "urls": [ - "https://files.pythonhosted.org/packages/61/d0/e7cfca72ec7d6c5e0da725c003db99bb056e9b6c2f4ee6fae1145adf28a6/astroid-2.12.13.tar.gz" + "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz" ] } }, - "pip_39_sphinxcontrib_htmlhelp_py3_none_any_8001661c": { + "pip_39_tomlkit_py3_none_any_07de26b0": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6077,47 +5620,51 @@ "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", + "filename": "tomlkit-0.11.6-py3-none-any.whl", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "sphinxcontrib-htmlhelp==2.0.4", - "sha256": "8001661c077a73c29beaf4a79968d0726103c5605e27db92b9ebed8bab1359e9", + "requirement": "tomlkit==0.11.6", + "sha256": "07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b", "urls": [ - "https://files.pythonhosted.org/packages/28/7a/958f8e3e6abe8219d0d1f1224886de847ab227b218f4a07b61bc337f64be/sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl" + "https://files.pythonhosted.org/packages/2b/df/971fa5db3250bb022105d17f340339370f73d502e65e687a94ca1a4c4b1f/tomlkit-0.11.6-py3-none-any.whl" ] } }, - "pip_310_chardet": { + "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": [ - "linux_*", - "osx_*", - "windows_*", - "linux_x86_64", - "host" + "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" ], "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", "--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" + "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_websockets_cp39_cp39_macosx_10_9_universal2_777354ee": { + "pip_39_typing_extensions_py3_none_any_04e5ca03": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6135,17 +5682,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", + "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": "websockets==11.0.3", - "sha256": "777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8", + "requirement": "typing-extensions==4.12.2 ;python_version < '3.10'", + "sha256": "04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", "urls": [ - "https://files.pythonhosted.org/packages/c0/21/cb9dfbbea8dc0ad89ced52630e7e61edb425fb9fdc6002f8d0c5dd26b94b/websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl" + "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl" ] } }, - "pip_39_pyyaml_cp39_cp39_manylinux_2_17_s390x_b786eecb": { + "pip_39_typing_extensions_sdist_1a7ead55": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6163,17 +5710,23 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "filename": "typing_extensions-4.12.2.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "pyyaml==6.0.1", - "sha256": "b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", + "requirement": "typing-extensions==4.12.2 ;python_version < '3.10'", + "sha256": "1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", "urls": [ - "https://files.pythonhosted.org/packages/4a/4b/c71ef18ef83c82f99e6da8332910692af78ea32bd1d1d76c9787dfa36aea/PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl" + "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz" ] } }, - "pip_39_pylint_print_sdist_30aa207e": { + "pip_39_urllib3_py2_none_any_34b97092": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6191,23 +5744,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "filename": "pylint-print-1.0.1.tar.gz", + "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": "pylint-print==1.0.1", - "sha256": "30aa207e9718ebf4ceb47fb87012092e6d8743aab932aa07aa14a73e750ad3d0", + "requirement": "urllib3==1.26.18", + "sha256": "34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07", "urls": [ - "https://files.pythonhosted.org/packages/60/76/8fd24bfcbd5130b487990c6ec5eab2a053f1ec8f7d33ef6c38fee7e22b70/pylint-print-1.0.1.tar.gz" + "https://files.pythonhosted.org/packages/b0/53/aa91e163dcfd1e5b82d8a890ecf13314e3e149c05270cc644581f77f17fd/urllib3-1.26.18-py2.py3-none-any.whl" ] } }, - "pip_39_websockets_cp39_cp39_macosx_10_9_x86_64_8c82f119": { + "pip_39_urllib3_sdist_f8ecc1bb": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6225,59 +5772,79 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "filename": "urllib3-1.26.18.tar.gz", "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", "repo": "pip_39", - "requirement": "websockets==11.0.3", - "sha256": "8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd", + "requirement": "urllib3==1.26.18", + "sha256": "f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0", "urls": [ - "https://files.pythonhosted.org/packages/8f/f2/8a3eb016be19743c7eb9e67c855df0fdfa5912534ffaf83a05b62667d761/websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl" + "https://files.pythonhosted.org/packages/0c/39/64487bf07df2ed854cc06078c27c0d0abc59bd27b32232876e403c333a08/urllib3-1.26.18.tar.gz" ] } }, - "pip_310_urllib3": { + "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}", - "experimental_target_platforms": [ - "linux_*", - "osx_*", - "windows_*", - "linux_x86_64", - "host" + "envsubst": [ + "PIP_INDEX_URL" ], - "extra_pip_args": [ - "--extra-index-url", - "https://pypi.org/simple/" + "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" ], - "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" + "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_six": { + "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}", - "experimental_target_platforms": [ - "linux_*", - "osx_*", - "windows_*", - "linux_x86_64", - "host" + "envsubst": [ + "PIP_INDEX_URL" ], - "extra_pip_args": [ - "--extra-index-url", - "https://pypi.org/simple/" + "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" ], - "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" + "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_39_wrapt_sdist_380a85cf": { + "pip_39_websockets_cp39_cp39_macosx_11_0_arm64_3580dd9c": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6295,45 +5862,45 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "filename": "wrapt-1.14.1.tar.gz", + "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": "wrapt==1.14.1", - "sha256": "380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d", + "requirement": "websockets==11.0.3", + "sha256": "3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016", "urls": [ - "https://files.pythonhosted.org/packages/11/eb/e06e77394d6cf09977d92bff310cb0392930c08a338f99af6066a5a98f92/wrapt-1.14.1.tar.gz" + "https://files.pythonhosted.org/packages/a0/1a/3da73e69ebc00649d11ed836541c92c1a2df0b8a8aa641a2c8746e7c2b9c/websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl" ] } }, - "pip_310_wheel": { + "pip_39_websockets_cp39_cp39_manylinux_2_17_aarch64_6f1a3f10": { "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" + "envsubst": [ + "PIP_INDEX_URL" ], - "extra_pip_args": [ - "--extra-index-url", - "https://pypi.org/simple/" + "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" ], - "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" + "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_pyyaml_cp39_cp39_macosx_11_0_arm64_c8098ddc": { + "pip_39_websockets_cp39_cp39_manylinux_2_5_x86_64_279e5de4": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6351,17 +5918,17 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", + "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": "pyyaml==6.0.1", - "sha256": "c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", + "requirement": "websockets==11.0.3", + "sha256": "279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd", "urls": [ - "https://files.pythonhosted.org/packages/0e/88/21b2f16cb2123c1e9375f2c93486e35fdc86e63f02e274f0e99c589ef153/PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl" + "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_dill_py3_none_any_a07ffd23": { + "pip_39_websockets_cp39_cp39_musllinux_1_1_aarch64_1fdf26fa": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6379,38 +5946,45 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "dill-0.3.6-py3-none-any.whl", + "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": "dill==0.3.6", - "sha256": "a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0", + "requirement": "websockets==11.0.3", + "sha256": "1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7", "urls": [ - "https://files.pythonhosted.org/packages/be/e3/a84bf2e561beed15813080d693b4b27573262433fced9c1d1fea59e60553/dill-0.3.6-py3-none-any.whl" + "https://files.pythonhosted.org/packages/c4/f5/15998b164c183af0513bba744b51ecb08d396ff86c0db3b55d62624d1f15/websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl" ] } }, - "pip_310_jinja2": { + "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}", - "experimental_target_platforms": [ - "linux_*", - "osx_*", - "windows_*", - "linux_x86_64", - "host" + "envsubst": [ + "PIP_INDEX_URL" ], - "extra_pip_args": [ - "--extra-index-url", - "https://pypi.org/simple/" + "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" ], - "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" + "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_39_babel_py3_none_any_7077a498": { + "pip_39_websockets_cp39_cp39_win_amd64_c792ea4e": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -6428,2892 +6002,14160 @@ "cp39_osx_x86_64", "cp39_windows_x86_64" ], - "filename": "Babel-2.13.1-py3-none-any.whl", + "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": "babel==2.13.1", - "sha256": "7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed", + "requirement": "websockets==11.0.3", + "sha256": "c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e", "urls": [ - "https://files.pythonhosted.org/packages/86/14/5dc2eb02b7cc87b2f95930310a2cc5229198414919a116b564832c747bc1/Babel-2.13.1-py3-none-any.whl" + "https://files.pythonhosted.org/packages/f4/3f/65dfa50084a06ab0a05f3ca74195c2c17a1c075b8361327d831ccce0a483/websockets-11.0.3-cp39-cp39-win_amd64.whl" ] } }, - "pip_310_websockets": { + "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": [ - "linux_*", - "osx_*", - "windows_*", - "linux_x86_64", - "host" + "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_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" ], "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", "--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" + "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" + ] } - } - }, - "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": "9R8+CXzaV+FOv5NSr6mNrvF+hvnyouGXJh9E0JxC/7Q=", - "usagesDigest": "O2O2oBIbKEglN2K3FECsRxUKVS/zg/6a86F3MO1ZtmY=", - "recordedFileInputs": { - "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", - "@@rules_python~//tools/publish/requirements_windows.txt": "7673adc71dc1a81d3661b90924d7a7c0fc998cd508b3cb4174337cef3f2de556", - "@@rules_python~//tools/publish/requirements_darwin.txt": "2994136eab7e57b083c3de76faf46f70fad130bc8e7360a7fed2b288b69e79dc" - }, - "recordedDirentsInputs": {}, - "envVariables": { - "RULES_PYTHON_REPO_DEBUG": null, - "RULES_PYTHON_REPO_DEBUG_VERBOSITY": null - }, - "generatedRepoSpecs": { - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5": { + }, + "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_wheel_sdist_cd1196f3": { "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" + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "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_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_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_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_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_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_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_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_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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "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_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_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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "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_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_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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--extra-index-url", + "https://pypi.org/simple/" + ], + "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_deps_310_numpy": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "pip_deps_310", + "requirement": "numpy<=1.26.1" + } + }, + "pip_deps_310_setuptools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "pip_deps_310", + "requirement": "setuptools<=70.3.0" + } + }, + "pip_deps_311_numpy": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "pip_deps_311", + "requirement": "numpy<=1.26.1" + } + }, + "pip_deps_311_setuptools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "pip_deps_311", + "requirement": "setuptools<=70.3.0" + } + }, + "pip_deps_312_numpy": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "pip_deps_312", + "requirement": "numpy<=1.26.1" + } + }, + "pip_deps_312_setuptools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "pip_deps_312", + "requirement": "setuptools<=70.3.0" + } + }, + "pip_deps_38_numpy": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "pip_deps_38", + "requirement": "numpy<=1.26.1" + } + }, + "pip_deps_38_setuptools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "pip_deps_38", + "requirement": "setuptools<=70.3.0" + } + }, + "pip_deps_39_numpy": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "pip_deps_39", + "requirement": "numpy<=1.26.1" + } + }, + "pip_deps_39_setuptools": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "pip_deps_39", + "requirement": "setuptools<=70.3.0" + } + }, + "rules_fuzzing_py_deps_310_absl_py": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "rules_fuzzing_py_deps_310", + "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" + } + }, + "rules_fuzzing_py_deps_310_six": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", + "repo": "rules_fuzzing_py_deps_310", + "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + } + }, + "rules_fuzzing_py_deps_311_absl_py": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_fuzzing_py_deps_311", + "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" + } + }, + "rules_fuzzing_py_deps_311_six": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_fuzzing_py_deps_311", + "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + } + }, + "rules_fuzzing_py_deps_312_absl_py": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "rules_fuzzing_py_deps_312", + "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" + } + }, + "rules_fuzzing_py_deps_312_six": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", + "repo": "rules_fuzzing_py_deps_312", + "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + } + }, + "rules_fuzzing_py_deps_38_absl_py": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "rules_fuzzing_py_deps_38", + "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" + } + }, + "rules_fuzzing_py_deps_38_six": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", + "repo": "rules_fuzzing_py_deps_38", + "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + } + }, + "rules_fuzzing_py_deps_39_absl_py": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "rules_fuzzing_py_deps_39", + "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" + } + }, + "rules_fuzzing_py_deps_39_six": { + "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", + "ruleClassName": "whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", + "repo": "rules_fuzzing_py_deps_39", + "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + } + }, + "other_module_pip": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "other_module_pip", + "extra_hub_aliases": {}, + "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": [ + "absl_py" + ], + "groups": {} + } + }, + "pip": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "pip", + "extra_hub_aliases": { + "wheel": [ + "generated_file" + ] + }, + "whl_map": { + "alabaster": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_alabaster\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "astroid": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_astroid\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "babel": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_babel\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "certifi": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_certifi\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "chardet": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_chardet\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "colorama": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_colorama\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "dill": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_dill\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "docutils": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_docutils\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "idna": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_idna\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "imagesize": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_imagesize\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "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\"}]", + "isort": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_isort\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "jinja2": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_jinja2\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "lazy_object_proxy": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_lazy_object_proxy\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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-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-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-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\"}]", + "markupsafe": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_markupsafe\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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-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-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-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_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-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.tar.gz\",\"repo\":\"pip_39_markupsafe_sdist_af598ed3\",\"target_platforms\":null,\"version\":\"3.9\"}]", + "mccabe": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_mccabe\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "packaging": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_packaging\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "pathspec": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pathspec\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "platformdirs": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_platformdirs\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "pygments": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pygments\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "pylint": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pylint\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "pylint_print": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pylint_print\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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\"}]", + "python_dateutil": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_python_dateutil\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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\"}]", + "python_magic": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_python_magic\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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\"}]", + "pyyaml": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pyyaml\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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-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-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-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-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.tar.gz\",\"repo\":\"pip_39_pyyaml_sdist_bfdf460b\",\"target_platforms\":null,\"version\":\"3.9\"}]", + "requests": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_requests\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "s3cmd": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_s3cmd\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "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\"}]", + "six": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_six\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "snowballstemmer": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_snowballstemmer\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "sphinx": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinx\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "sphinxcontrib_applehelp": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_applehelp\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "sphinxcontrib_devhelp": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_devhelp\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "sphinxcontrib_htmlhelp": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_htmlhelp\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "sphinxcontrib_jsmath": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_jsmath\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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\"}]", + "sphinxcontrib_qthelp": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_qthelp\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "sphinxcontrib_serializinghtml": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_serializinghtml\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "tabulate": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_tabulate\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "tomli": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_tomli\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "tomlkit": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_tomlkit\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "typing_extensions": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_typing_extensions\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "urllib3": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_urllib3\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "websockets": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_websockets\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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-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-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-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-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-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-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.tar.gz\",\"repo\":\"pip_39_websockets_sdist_88fc51d9\",\"target_platforms\":null,\"version\":\"3.9\"}]", + "wheel": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_wheel\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "wrapt": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_wrapt\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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-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-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-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-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-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\"}]", + "yamllint": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_yamllint\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", + "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\"}]" + }, + "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-applehelp", + "sphinxcontrib-devhelp", + "sphinxcontrib-htmlhelp", + "sphinxcontrib-qthelp", + "sphinxcontrib-serializinghtml" + ] + } + } + }, + "pip_deps": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "pip_deps", + "extra_hub_aliases": {}, + "whl_map": { + "numpy": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_deps_310_numpy\",\"target_platforms\":null,\"version\":\"3.10\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":null,\"repo\":\"pip_deps_311_numpy\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.12\",\"filename\":null,\"repo\":\"pip_deps_312_numpy\",\"target_platforms\":null,\"version\":\"3.12\"},{\"config_setting\":\"//_config:is_python_3.8\",\"filename\":null,\"repo\":\"pip_deps_38_numpy\",\"target_platforms\":null,\"version\":\"3.8\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":null,\"repo\":\"pip_deps_39_numpy\",\"target_platforms\":null,\"version\":\"3.9\"}]", + "setuptools": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_deps_310_setuptools\",\"target_platforms\":null,\"version\":\"3.10\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":null,\"repo\":\"pip_deps_311_setuptools\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.12\",\"filename\":null,\"repo\":\"pip_deps_312_setuptools\",\"target_platforms\":null,\"version\":\"3.12\"},{\"config_setting\":\"//_config:is_python_3.8\",\"filename\":null,\"repo\":\"pip_deps_38_setuptools\",\"target_platforms\":null,\"version\":\"3.8\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":null,\"repo\":\"pip_deps_39_setuptools\",\"target_platforms\":null,\"version\":\"3.9\"}]" + }, + "packages": [ + "numpy", + "setuptools" + ], + "groups": {} + } + }, + "rules_fuzzing_py_deps": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "rules_fuzzing_py_deps", + "extra_hub_aliases": {}, + "whl_map": { + "absl_py": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_310_absl_py\",\"target_platforms\":null,\"version\":\"3.10\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_311_absl_py\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.12\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_312_absl_py\",\"target_platforms\":null,\"version\":\"3.12\"},{\"config_setting\":\"//_config:is_python_3.8\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_38_absl_py\",\"target_platforms\":null,\"version\":\"3.8\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_39_absl_py\",\"target_platforms\":null,\"version\":\"3.9\"}]", + "six": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_310_six\",\"target_platforms\":null,\"version\":\"3.10\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_311_six\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.12\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_312_six\",\"target_platforms\":null,\"version\":\"3.12\"},{\"config_setting\":\"//_config:is_python_3.8\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_38_six\",\"target_platforms\":null,\"version\":\"3.8\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_39_six\",\"target_platforms\":null,\"version\":\"3.9\"}]" + }, + "packages": [ + "absl_py", + "six" + ], + "groups": {} + } + } + }, + "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_12_host", + "rules_python~~python~python_3_12_host" + ], + [ + "rules_python~~python~pythons_hub", + "python_3_8_host", + "rules_python~~python~python_3_8_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": "OoT+AuxNb9Ej3Cn/GFgSHa1NlVBY27sJhilKvy+3WJI=", + "usagesDigest": "/lZXl/ZgP+u5PE8WkeWTyYBsvX9XQWFn1antj5qrBzQ=", + "recordedFileInputs": { + "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", + "@@rules_python~//tools/publish/requirements_windows.txt": "7673adc71dc1a81d3661b90924d7a7c0fc998cd508b3cb4174337cef3f2de556", + "@@rules_python~//tools/publish/requirements_darwin.txt": "2994136eab7e57b083c3de76faf46f70fad130bc8e7360a7fed2b288b69e79dc" + }, + "recordedDirentsInputs": {}, + "envVariables": { + "RULES_PYTHON_REPO_DEBUG": null, + "RULES_PYTHON_REPO_DEBUG_VERBOSITY": null + }, + "generatedRepoSpecs": { + "rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7": { + "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": "backports.tarfile-1.2.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "backports-tarfile==1.2.0", + "sha256": "77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", + "urls": [ + "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "backports_tarfile-1.2.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "backports-tarfile==1.2.0", + "sha256": "d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", + "urls": [ + "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.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_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": "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_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_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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "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_cffi_cp311_cp311_manylinux_2_17_aarch64_a1ed2dd2": { + "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.17.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.17.1", + "sha256": "a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", + "urls": [ + "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_46bf4316": { + "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.17.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.17.1", + "sha256": "46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", + "urls": [ + "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + ] + } + }, + "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_s390x_a24ed04c": { + "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.17.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": "cffi==1.17.1", + "sha256": "a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", + "urls": [ + "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" + ] + } + }, + "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_x86_64_610faea7": { + "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.17.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.17.1", + "sha256": "610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", + "urls": [ + "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_aarch64_a9b15d49": { + "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.17.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": "cffi==1.17.1", + "sha256": "a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", + "urls": [ + "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_fc48c783": { + "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.17.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.17.1", + "sha256": "fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", + "urls": [ + "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_cffi_sdist_1c39c601": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "cffi-1.17.1.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "cffi==1.17.1", + "sha256": "1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", + "urls": [ + "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f": { + "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": "charset_normalizer-3.4.0-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.4.0", + "sha256": "0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", + "urls": [ + "https://files.pythonhosted.org/packages/9c/61/73589dcc7a719582bf56aae309b6103d2762b526bffe189d635a7fcfd998/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5": { + "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": "charset_normalizer-3.4.0-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.4.0", + "sha256": "c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", + "urls": [ + "https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19": { + "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": "charset_normalizer-3.4.0-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.4.0", + "sha256": "6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", + "urls": [ + "https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_bf4475b8": { + "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": "charset_normalizer-3.4.0-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.4.0", + "sha256": "bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", + "urls": [ + "https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_ce031db0": { + "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": "charset_normalizer-3.4.0-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.4.0", + "sha256": "ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", + "urls": [ + "https://files.pythonhosted.org/packages/e2/29/d227805bff72ed6d6cb1ce08eec707f7cfbd9868044893617eb331f16295/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8ff4e7cd": { + "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": "charset_normalizer-3.4.0-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.4.0", + "sha256": "8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", + "urls": [ + "https://files.pythonhosted.org/packages/13/bc/87c2c9f2c144bedfa62f894c3007cd4530ba4b5351acb10dc786428a50f0/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_3710a975": { + "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": "charset_normalizer-3.4.0-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.4.0", + "sha256": "3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", + "urls": [ + "https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_47334db7": { + "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": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", + "urls": [ + "https://files.pythonhosted.org/packages/d7/a1/493919799446464ed0299c8eef3c3fad0daf1c3cd48bff9263c731b0d9e2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_f1a2f519": { + "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": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", + "urls": [ + "https://files.pythonhosted.org/packages/75/d2/0ab54463d3410709c09266dfb416d032a08f97fd7d60e94b8c6ef54ae14b/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_63bc5c4a": { + "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": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", + "urls": [ + "https://files.pythonhosted.org/packages/8d/c9/27e41d481557be53d51e60750b85aa40eaf52b841946b3cdeff363105737/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_bcb4f8ea": { + "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": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", + "urls": [ + "https://files.pythonhosted.org/packages/ee/44/4f62042ca8cdc0cabf87c0fc00ae27cd8b53ab68be3605ba6d071f742ad3/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f": { + "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": "charset_normalizer-3.4.0-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.4.0", + "sha256": "cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", + "urls": [ + "https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe": { + "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": "charset_normalizer-3.4.0-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.4.0", + "sha256": "fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", + "urls": [ + "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_sdist_223217c3": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "charset_normalizer-3.4.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "charset-normalizer==3.4.0", + "sha256": "223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", + "urls": [ + "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_846da004": { + "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-43.0.3-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==43.0.3", + "sha256": "846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5", + "urls": [ + "https://files.pythonhosted.org/packages/2f/78/55356eb9075d0be6e81b59f45c7b48df87f76a20e73893872170471f3ee8/cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_x86_64_0f996e72": { + "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-43.0.3-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==43.0.3", + "sha256": "0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4", + "urls": [ + "https://files.pythonhosted.org/packages/2a/2c/488776a3dc843f95f86d2f957ca0fc3407d0242b50bede7fad1e339be03f/cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_f7b178f1": { + "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-43.0.3-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==43.0.3", + "sha256": "f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7", + "urls": [ + "https://files.pythonhosted.org/packages/7c/04/2345ca92f7a22f601a9c62961741ef7dd0127c39f7310dffa0041c80f16f/cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_c2e6fc39": { + "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-43.0.3-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==43.0.3", + "sha256": "c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405", + "urls": [ + "https://files.pythonhosted.org/packages/ac/25/e715fa0bc24ac2114ed69da33adf451a38abb6f3f24ec207908112e9ba53/cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_e1be4655": { + "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-43.0.3-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==43.0.3", + "sha256": "e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16", + "urls": [ + "https://files.pythonhosted.org/packages/21/ce/b9c9ff56c7164d8e2edfb6c9305045fbc0df4508ccfdb13ee66eb8c95b0e/cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_df6b6c6d": { + "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-43.0.3-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==43.0.3", + "sha256": "df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73", + "urls": [ + "https://files.pythonhosted.org/packages/2a/33/b3682992ab2e9476b9c81fff22f02c8b0a1e6e1d49ee1750a67d85fd7ed2/cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_cryptography_sdist_315b9001": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "cryptography-43.0.3.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "cryptography==43.0.3", + "sha256": "315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", + "urls": [ + "https://files.pythonhosted.org/packages/0d/05/07b55d1fa21ac18c3a8c79f764e2514e6f6a9698f1be44994f5adf0d29db/cryptography-43.0.3.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_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": "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_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_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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "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_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_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": "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_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_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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "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_importlib_metadata_py3_none_any_45e54197": { + "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-8.5.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==8.5.0", + "sha256": "45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", + "urls": [ + "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_importlib_metadata_sdist_71522656": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "importlib_metadata-8.5.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "importlib-metadata==8.5.0", + "sha256": "71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", + "urls": [ + "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b": { + "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.4.0-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.4.0", + "sha256": "f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", + "urls": [ + "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "jaraco.classes-3.4.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "jaraco-classes==3.4.0", + "sha256": "47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", + "urls": [ + "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48": { + "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.context-6.0.1-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "jaraco-context==6.0.1", + "sha256": "f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", + "urls": [ + "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "jaraco_context-6.0.1.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "jaraco-context==6.0.1", + "sha256": "9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", + "urls": [ + "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13": { + "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.functools-4.1.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "jaraco-functools==4.1.0", + "sha256": "ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649", + "urls": [ + "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "jaraco_functools-4.1.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "jaraco-functools==4.1.0", + "sha256": "70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d", + "urls": [ + "https://files.pythonhosted.org/packages/ab/23/9894b3df5d0a6eb44611c36aec777823fc2e07740dabbd0b810e19594013/jaraco_functools-4.1.0.tar.gz" + ] + } + }, + "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_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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "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_keyring_py3_none_any_5426f817": { + "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-25.4.1-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "keyring==25.4.1", + "sha256": "5426f817cf7f6f007ba5ec722b1bcad95a75b27d780343772ad76b17cb47b0bf", + "urls": [ + "https://files.pythonhosted.org/packages/83/25/e6d59e5f0a0508d0dca8bb98c7f7fd3772fc943ac3f53d5ab18a218d32c0/keyring-25.4.1-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_keyring_sdist_b07ebc55": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "keyring-25.4.1.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "keyring==25.4.1", + "sha256": "b07ebc55f3e8ed86ac81dd31ef14e81ace9dd9c3d4b5d77a6e9a2016d0d71a1b", + "urls": [ + "https://files.pythonhosted.org/packages/a5/1c/2bdbcfd5d59dc6274ffb175bc29aa07ecbfab196830e0cfbde7bd861a2ea/keyring-25.4.1.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684": { + "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-3.0.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==3.0.0", + "sha256": "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", + "urls": [ + "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "markdown-it-py-3.0.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "markdown-it-py==3.0.0", + "sha256": "e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", + "urls": [ + "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.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_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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "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_more_itertools_py3_none_any_037b0d32": { + "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-10.5.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==10.5.0", + "sha256": "037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef", + "urls": [ + "https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_more_itertools_sdist_5482bfef": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "more-itertools-10.5.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "more-itertools==10.5.0", + "sha256": "5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6", + "urls": [ + "https://files.pythonhosted.org/packages/51/78/65922308c4248e0eb08ebcbe67c95d48615cc6f27854b6f2e57143e9178f/more-itertools-10.5.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e": { + "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": "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86", + "urls": [ + "https://files.pythonhosted.org/packages/b3/89/1daff5d9ba5a95a157c092c7c5f39b8dd2b1ddb4559966f808d31cfb67e0/nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c": { + "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": "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811", + "urls": [ + "https://files.pythonhosted.org/packages/2c/b6/42fc3c69cabf86b6b81e4c051a9b6e249c5ba9f8155590222c2622961f58/nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511": { + "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": "nh3-0.2.18-cp37-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": "nh3==0.2.18", + "sha256": "42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200", + "urls": [ + "https://files.pythonhosted.org/packages/45/b9/833f385403abaf0023c6547389ec7a7acf141ddd9d1f21573723a6eab39a/nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_armv7l_0411beb0": { + "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": "nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164", + "urls": [ + "https://files.pythonhosted.org/packages/05/2b/85977d9e11713b5747595ee61f381bc820749daf83f07b90b6c9964cf932/nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64_5f36b271": { + "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": "nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189", + "urls": [ + "https://files.pythonhosted.org/packages/72/f2/5c894d5265ab80a97c68ca36f25c8f6f0308abac649aaf152b74e7e854a8/nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7": { + "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": "nh3-0.2.18-cp37-abi3-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": "nh3==0.2.18", + "sha256": "34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad", + "urls": [ + "https://files.pythonhosted.org/packages/ab/a7/375afcc710dbe2d64cfbd69e31f82f3e423d43737258af01f6a56d844085/nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96": { + "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": "nh3-0.2.18-cp37-abi3-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": "nh3==0.2.18", + "sha256": "19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b", + "urls": [ + "https://files.pythonhosted.org/packages/c2/a8/3bb02d0c60a03ad3a112b76c46971e9480efa98a8946677b5a59f60130ca/nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6": { + "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": "nh3-0.2.18-cp37-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": "nh3==0.2.18", + "sha256": "de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307", + "urls": [ + "https://files.pythonhosted.org/packages/1b/63/6ab90d0e5225ab9780f6c9fb52254fa36b52bb7c188df9201d05b647e5e1/nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca": { + "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": "nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe", + "urls": [ + "https://files.pythonhosted.org/packages/a3/da/0c4e282bc3cff4a0adf37005fa1fb42257673fbc1bbf7d1ff639ec3d255a/nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_armv7l_3a157ab1": { + "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": "nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a", + "urls": [ + "https://files.pythonhosted.org/packages/de/81/c291231463d21da5f8bba82c8167a6d6893cc5419b0639801ee5d3aeb8a9/nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b": { + "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": "nh3-0.2.18-cp37-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": "nh3==0.2.18", + "sha256": "36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204", + "urls": [ + "https://files.pythonhosted.org/packages/eb/61/73a007c74c37895fdf66e0edcd881f5eaa17a348ff02f4bb4bc906d61085/nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819": { + "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": "nh3-0.2.18-cp37-abi3-win_amd64.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844", + "urls": [ + "https://files.pythonhosted.org/packages/26/8d/53c5b19c4999bdc6ba95f246f4ef35ca83d7d7423e5e38be43ad66544e5d/nh3-0.2.18-cp37-abi3-win_amd64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_sdist_94a16692": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "nh3-0.2.18.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "nh3==0.2.18", + "sha256": "94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4", + "urls": [ + "https://files.pythonhosted.org/packages/62/73/10df50b42ddb547a907deeb2f3c9823022580a7a47281e8eae8e003a9639/nh3-0.2.18.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2": { + "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.10.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "pkginfo==1.10.0", + "sha256": "889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097", + "urls": [ + "https://files.pythonhosted.org/packages/56/09/054aea9b7534a15ad38a363a2bd974c20646ab1582a387a95b8df1bfea1c/pkginfo-1.10.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_pkginfo_sdist_5df73835": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "pkginfo-1.10.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "pkginfo==1.10.0", + "sha256": "5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297", + "urls": [ + "https://files.pythonhosted.org/packages/2f/72/347ec5be4adc85c182ed2823d8d1c7b51e13b9a6b0c1aae59582eca652df/pkginfo-1.10.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_pycparser_py3_none_any_c3702b6d": { + "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.22-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "pycparser==2.22", + "sha256": "c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", + "urls": [ + "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_pycparser_sdist_491c8be9": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "pycparser-2.22.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "pycparser==2.22", + "sha256": "491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", + "urls": [ + "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0": { + "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.18.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.18.0", + "sha256": "b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", + "urls": [ + "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_pygments_sdist_786ff802": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "pygments-2.18.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "pygments==2.18.0", + "sha256": "786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", + "urls": [ + "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_pywin32_ctypes_py3_none_any_8a151337": { + "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.3-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.3", + "sha256": "8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", + "urls": [ + "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_pywin32_ctypes_sdist_d162dc04": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "pywin32-ctypes-0.2.3.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "pywin32-ctypes==0.2.3", + "sha256": "d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", + "urls": [ + "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b": { + "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-44.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "readme-renderer==44.0", + "sha256": "2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151", + "urls": [ + "https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_readme_renderer_sdist_8712034e": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "readme_renderer-44.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "readme-renderer==44.0", + "sha256": "8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1", + "urls": [ + "https://files.pythonhosted.org/packages/5a/a9/104ec9234c8448c4379768221ea6df01260cd6c2ce13182d4eac531c8342/readme_renderer-44.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_requests_py3_none_any_70761cfe": { + "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.32.3-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "requests==2.32.3", + "sha256": "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", + "urls": [ + "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_requests_sdist_55365417": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "requests-2.32.3.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "requests==2.32.3", + "sha256": "55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", + "urls": [ + "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66": { + "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-1.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": "requests-toolbelt==1.0.0", + "sha256": "cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", + "urls": [ + "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "requests-toolbelt-1.0.0.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "requests-toolbelt==1.0.0", + "sha256": "7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", + "urls": [ + "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz" + ] + } + }, + "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_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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "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_rich_py3_none_any_9836f509": { + "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.9.3-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "rich==13.9.3", + "sha256": "9836f5096eb2172c9e77df411c1b009bace4193d6a481d534fea75ebba758283", + "urls": [ + "https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_rich_sdist_bc1e01b8": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "rich-13.9.3.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "rich==13.9.3", + "sha256": "bc1e01b899537598cf02579d2b9f4a415104d3fc439313a7a2c165d76557a08e", + "urls": [ + "https://files.pythonhosted.org/packages/d9/e9/cf9ef5245d835065e6673781dbd4b8911d352fb770d56cf0879cf11b7ee1/rich-13.9.3.tar.gz" + ] + } + }, + "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_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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "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_twine_py3_none_any_215dbe7b": { + "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-5.1.1-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "twine==5.1.1", + "sha256": "215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997", + "urls": [ + "https://files.pythonhosted.org/packages/5d/ec/00f9d5fd040ae29867355e559a94e9a8429225a0284a3f5f091a3878bfc0/twine-5.1.1-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_twine_sdist_9aa08251": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "twine-5.1.1.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "twine==5.1.1", + "sha256": "9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db", + "urls": [ + "https://files.pythonhosted.org/packages/77/68/bd982e5e949ef8334e6f7dcf76ae40922a8750aa2e347291ae1477a4782b/twine-5.1.1.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_urllib3_py3_none_any_ca899ca0": { + "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": "urllib3-2.2.3-py3-none-any.whl", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "urllib3==2.2.3", + "sha256": "ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", + "urls": [ + "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_urllib3_sdist_e7d814a8": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "urllib3-2.2.3.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "urllib3==2.2.3", + "sha256": "e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", + "urls": [ + "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_zipp_py3_none_any_a817ac80": { + "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": "zipp-3.20.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.20.2", + "sha256": "a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", + "urls": [ + "https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_zipp_sdist_bc9eb26f": { + "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" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "zipp-3.20.2.tar.gz", + "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", + "repo": "rules_python_publish_deps_311", + "requirement": "zipp==3.20.2", + "sha256": "bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29", + "urls": [ + "https://files.pythonhosted.org/packages/54/bf/5c0000c44ebc80123ecbdddba1f5dcd94a5ada602a9c225d84b5aaa55e86/zipp-3.20.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", + "extra_hub_aliases": {}, + "whl_map": { + "backports_tarfile": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"backports.tarfile-1.2.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"backports_tarfile-1.2.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "certifi": "[{\"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\":null,\"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\":null,\"version\":\"3.11\"}]", + "cffi": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_aarch64_a1ed2dd2\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_46bf4316\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_s390x_a24ed04c\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.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_610faea7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_aarch64_a9b15d49\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_fc48c783\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cffi_sdist_1c39c601\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "charset_normalizer": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_bf4475b8\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_ce031db0\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8ff4e7cd\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-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_3710a975\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_47334db7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_f1a2f519\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_63bc5c4a\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_bcb4f8ea\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_sdist_223217c3\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "cryptography": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_846da004\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-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_0f996e72\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_f7b178f1\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_c2e6fc39\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_e1be4655\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_df6b6c6d\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cryptography_sdist_315b9001\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "docutils": "[{\"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\":null,\"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\":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\":null,\"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\":null,\"version\":\"3.11\"}]", + "importlib_metadata": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"importlib_metadata-8.5.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_importlib_metadata_py3_none_any_45e54197\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"importlib_metadata-8.5.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_importlib_metadata_sdist_71522656\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "jaraco_classes": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.classes-3.4.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.classes-3.4.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "jaraco_context": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.context-6.0.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco_context-6.0.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "jaraco_functools": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.functools-4.1.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco_functools-4.1.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2\",\"target_platforms\":null,\"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-25.4.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_keyring_py3_none_any_5426f817\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"keyring-25.4.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_keyring_sdist_b07ebc55\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "markdown_it_py": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"markdown-it-py-3.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"markdown_it_py-3.0.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684\",\"target_platforms\":null,\"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\"}]", + "more_itertools": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"more-itertools-10.5.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_more_itertools_sdist_5482bfef\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"more_itertools-10.5.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_more_itertools_py3_none_any_037b0d32\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "nh3": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_armv7l_0411beb0\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64_5f36b271\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_armv7l_3a157ab1\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-win_amd64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18.tar.gz\",\"repo\":\"rules_python_publish_deps_311_nh3_sdist_94a16692\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "pkginfo": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pkginfo-1.10.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pkginfo-1.10.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pkginfo_sdist_5df73835\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "pycparser": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pycparser-2.22-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pycparser_py3_none_any_c3702b6d\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pycparser-2.22.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pycparser_sdist_491c8be9\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "pygments": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pygments-2.18.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pygments-2.18.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pygments_sdist_786ff802\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "pywin32_ctypes": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pywin32-ctypes-0.2.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pywin32_ctypes_sdist_d162dc04\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pywin32_ctypes-0.2.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pywin32_ctypes_py3_none_any_8a151337\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "readme_renderer": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"readme_renderer-44.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"readme_renderer-44.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_readme_renderer_sdist_8712034e\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "requests": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests-2.32.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_requests_py3_none_any_70761cfe\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests-2.32.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_requests_sdist_55365417\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "requests_toolbelt": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests-toolbelt-1.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests_toolbelt-1.0.0-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66\",\"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\"}]", + "rich": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"rich-13.9.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_rich_py3_none_any_9836f509\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"rich-13.9.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_rich_sdist_bc1e01b8\",\"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\"}]", + "twine": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"twine-5.1.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_twine_py3_none_any_215dbe7b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"twine-5.1.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_twine_sdist_9aa08251\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "urllib3": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"urllib3-2.2.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_urllib3_py3_none_any_ca899ca0\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"urllib3-2.2.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_urllib3_sdist_e7d814a8\",\"target_platforms\":null,\"version\":\"3.11\"}]", + "zipp": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"zipp-3.20.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_zipp_py3_none_any_a817ac80\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"zipp-3.20.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_zipp_sdist_bc9eb26f\",\"target_platforms\":null,\"version\":\"3.11\"}]" + }, + "packages": [ + "backports_tarfile", + "certifi", + "charset_normalizer", + "docutils", + "idna", + "importlib_metadata", + "jaraco_classes", + "jaraco_context", + "jaraco_functools", + "keyring", + "markdown_it_py", + "mdurl", + "more_itertools", + "nh3", + "pkginfo", + "pygments", + "readme_renderer", + "requests", + "requests_toolbelt", + "rfc3986", + "rich", + "twine", + "urllib3", + "zipp" + ], + "groups": {} + } + } + }, + "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_12_host", + "rules_python~~python~python_3_12_host" + ], + [ + "rules_python~~python~pythons_hub", + "python_3_8_host", + "rules_python~~python~python_3_8_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": "umgu1yR4Wmqb1pJa+9hAcs9dPbeqBsPLceKiaEg3DdQ=", + "usagesDigest": "wWx9DCrTsAgJQmDRUcO+EJrPKJEDsXpZbjzC0HVdde0=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "uv_darwin_aarch64": { + "bzlFile": "@@rules_python~//python/uv:repositories.bzl", + "ruleClassName": "uv_repository", + "attributes": { + "uv_version": "0.4.25", + "platform": "aarch64-apple-darwin" + } + }, + "uv_linux_aarch64": { + "bzlFile": "@@rules_python~//python/uv:repositories.bzl", + "ruleClassName": "uv_repository", + "attributes": { + "uv_version": "0.4.25", + "platform": "aarch64-unknown-linux-gnu" + } + }, + "uv_linux_ppc": { + "bzlFile": "@@rules_python~//python/uv:repositories.bzl", + "ruleClassName": "uv_repository", + "attributes": { + "uv_version": "0.4.25", + "platform": "powerpc64le-unknown-linux-gnu" + } + }, + "uv_linux_s390x": { + "bzlFile": "@@rules_python~//python/uv:repositories.bzl", + "ruleClassName": "uv_repository", + "attributes": { + "uv_version": "0.4.25", + "platform": "s390x-unknown-linux-gnu" + } + }, + "uv_darwin_x86_64": { + "bzlFile": "@@rules_python~//python/uv:repositories.bzl", + "ruleClassName": "uv_repository", + "attributes": { + "uv_version": "0.4.25", + "platform": "x86_64-apple-darwin" + } + }, + "uv_windows_x86_64": { + "bzlFile": "@@rules_python~//python/uv:repositories.bzl", + "ruleClassName": "uv_repository", + "attributes": { + "uv_version": "0.4.25", + "platform": "x86_64-pc-windows-msvc" + } + }, + "uv_linux_x86_64": { + "bzlFile": "@@rules_python~//python/uv:repositories.bzl", + "ruleClassName": "uv_repository", + "attributes": { + "uv_version": "0.4.25", + "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" + ] + } + } + } + }, + "recordedRepoMappingEntries": [] + } + }, + "@@rules_rust~//crate_universe/private/module_extensions:cargo_bazel_bootstrap.bzl%cargo_bazel_bootstrap": { + "general": { + "bzlTransitiveDigest": "B8WsJBV07QocRZyJpcpPrz2sBEXnuRX/NkMzzdK7VGo=", + "usagesDigest": "Px5eLkmOaPhHIX5H4XHyIjcMMK3q6EPBhh+eyBRU01M=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "cargo_bazel_bootstrap": { + "bzlFile": "@@rules_rust~//cargo/private:cargo_bootstrap.bzl", + "ruleClassName": "cargo_bootstrap_repository", + "attributes": { + "srcs": [ + "@@rules_rust~//crate_universe:src/api.rs", + "@@rules_rust~//crate_universe:src/api/lockfile.rs", + "@@rules_rust~//crate_universe:src/cli.rs", + "@@rules_rust~//crate_universe:src/cli/generate.rs", + "@@rules_rust~//crate_universe:src/cli/query.rs", + "@@rules_rust~//crate_universe:src/cli/splice.rs", + "@@rules_rust~//crate_universe:src/cli/vendor.rs", + "@@rules_rust~//crate_universe:src/config.rs", + "@@rules_rust~//crate_universe:src/context.rs", + "@@rules_rust~//crate_universe:src/context/crate_context.rs", + "@@rules_rust~//crate_universe:src/context/platforms.rs", + "@@rules_rust~//crate_universe:src/lib.rs", + "@@rules_rust~//crate_universe:src/lockfile.rs", + "@@rules_rust~//crate_universe:src/main.rs", + "@@rules_rust~//crate_universe:src/metadata.rs", + "@@rules_rust~//crate_universe:src/metadata/cargo_bin.rs", + "@@rules_rust~//crate_universe:src/metadata/cargo_tree_resolver.rs", + "@@rules_rust~//crate_universe:src/metadata/cargo_tree_rustc_wrapper.bat", + "@@rules_rust~//crate_universe:src/metadata/cargo_tree_rustc_wrapper.sh", + "@@rules_rust~//crate_universe:src/metadata/dependency.rs", + "@@rules_rust~//crate_universe:src/metadata/metadata_annotation.rs", + "@@rules_rust~//crate_universe:src/rendering.rs", + "@@rules_rust~//crate_universe:src/rendering/template_engine.rs", + "@@rules_rust~//crate_universe:src/rendering/templates/module_bzl.j2", + "@@rules_rust~//crate_universe:src/rendering/templates/partials/header.j2", + "@@rules_rust~//crate_universe:src/rendering/templates/partials/module/aliases_map.j2", + "@@rules_rust~//crate_universe:src/rendering/templates/partials/module/deps_map.j2", + "@@rules_rust~//crate_universe:src/rendering/templates/partials/module/repo_git.j2", + "@@rules_rust~//crate_universe:src/rendering/templates/partials/module/repo_http.j2", + "@@rules_rust~//crate_universe:src/rendering/templates/vendor_module.j2", + "@@rules_rust~//crate_universe:src/rendering/verbatim/alias_rules.bzl", + "@@rules_rust~//crate_universe:src/select.rs", + "@@rules_rust~//crate_universe:src/splicing.rs", + "@@rules_rust~//crate_universe:src/splicing/cargo_config.rs", + "@@rules_rust~//crate_universe:src/splicing/crate_index_lookup.rs", + "@@rules_rust~//crate_universe:src/splicing/splicer.rs", + "@@rules_rust~//crate_universe:src/test.rs", + "@@rules_rust~//crate_universe:src/utils.rs", + "@@rules_rust~//crate_universe:src/utils/starlark.rs", + "@@rules_rust~//crate_universe:src/utils/starlark/glob.rs", + "@@rules_rust~//crate_universe:src/utils/starlark/label.rs", + "@@rules_rust~//crate_universe:src/utils/starlark/select.rs", + "@@rules_rust~//crate_universe:src/utils/starlark/select_dict.rs", + "@@rules_rust~//crate_universe:src/utils/starlark/select_list.rs", + "@@rules_rust~//crate_universe:src/utils/starlark/select_scalar.rs", + "@@rules_rust~//crate_universe:src/utils/starlark/select_set.rs", + "@@rules_rust~//crate_universe:src/utils/starlark/serialize.rs", + "@@rules_rust~//crate_universe:src/utils/starlark/target_compatible_with.rs", + "@@rules_rust~//crate_universe:src/utils/symlink.rs", + "@@rules_rust~//crate_universe:src/utils/target_triple.rs" + ], + "binary": "cargo-bazel", + "cargo_lockfile": "@@rules_rust~//crate_universe:Cargo.lock", + "cargo_toml": "@@rules_rust~//crate_universe:Cargo.toml", + "version": "1.82.0", + "timeout": 900, + "rust_toolchain_cargo_template": "@rust_host_tools//:bin/{tool}", + "rust_toolchain_rustc_template": "@rust_host_tools//:bin/{tool}" + } + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_rust~", + "bazel_skylib", + "bazel_skylib~" + ], + [ + "rules_rust~", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_rust~", + "rules_cc", + "rules_cc~" + ], + [ + "rules_rust~", + "rules_rust", + "rules_rust~" + ] + ] + } + }, + "@@rules_rust~//rust/private:extensions.bzl%i": { + "general": { + "bzlTransitiveDigest": "7THCCXEgTD5rKhzOeXPXMKTpneJiPj3KWvzc3a4vfIQ=", + "usagesDigest": "Byp71qgn+okZohgPAMBnJSfC0Zakvovpovv2vJ2y0pI=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "rules_rust_tinyjson": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9ab95735ea2c8fd51154d01e39cf13912a78071c2d89abc49a7ef102a7dd725a", + "url": "https://static.crates.io/crates/tinyjson/tinyjson-2.5.1.crate", + "strip_prefix": "tinyjson-2.5.1", + "type": "tar.gz", + "build_file": "@@rules_rust~//util/process_wrapper:BUILD.tinyjson.bazel" + } + }, + "cui": { + "bzlFile": "@@rules_rust~//crate_universe/private:crates_vendor.bzl", + "ruleClassName": "crates_vendor_remote_repository", + "attributes": { + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.bazel", + "defs_module": "@@rules_rust~//crate_universe/3rdparty/crates:defs.bzl" + } + }, + "cui__adler-1.0.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/adler/1.0.2/download" + ], + "strip_prefix": "adler-1.0.2", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.adler-1.0.2.bazel" + } + }, + "cui__ahash-0.8.11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/ahash/0.8.11/download" + ], + "strip_prefix": "ahash-0.8.11", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.ahash-0.8.11.bazel" + } + }, + "cui__aho-corasick-1.0.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/aho-corasick/1.0.2/download" + ], + "strip_prefix": "aho-corasick-1.0.2", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.aho-corasick-1.0.2.bazel" + } + }, + "cui__allocator-api2-0.2.18": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/allocator-api2/0.2.18/download" + ], + "strip_prefix": "allocator-api2-0.2.18", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.allocator-api2-0.2.18.bazel" + } + }, + "cui__anstream-0.3.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anstream/0.3.2/download" + ], + "strip_prefix": "anstream-0.3.2", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.anstream-0.3.2.bazel" + } + }, + "cui__anstyle-1.0.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anstyle/1.0.1/download" + ], + "strip_prefix": "anstyle-1.0.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.anstyle-1.0.1.bazel" + } + }, + "cui__anstyle-parse-0.2.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anstyle-parse/0.2.1/download" + ], + "strip_prefix": "anstyle-parse-0.2.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.anstyle-parse-0.2.1.bazel" + } + }, + "cui__anstyle-query-1.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anstyle-query/1.0.0/download" + ], + "strip_prefix": "anstyle-query-1.0.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.anstyle-query-1.0.0.bazel" + } + }, + "cui__anstyle-wincon-1.0.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anstyle-wincon/1.0.1/download" + ], + "strip_prefix": "anstyle-wincon-1.0.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.anstyle-wincon-1.0.1.bazel" + } + }, + "cui__anyhow-1.0.89": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anyhow/1.0.89/download" + ], + "strip_prefix": "anyhow-1.0.89", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.anyhow-1.0.89.bazel" + } + }, + "cui__arc-swap-1.6.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/arc-swap/1.6.0/download" + ], + "strip_prefix": "arc-swap-1.6.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.arc-swap-1.6.0.bazel" + } + }, + "cui__arrayvec-0.7.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/arrayvec/0.7.4/download" + ], + "strip_prefix": "arrayvec-0.7.4", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.arrayvec-0.7.4.bazel" + } + }, + "cui__autocfg-1.1.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/autocfg/1.1.0/download" + ], + "strip_prefix": "autocfg-1.1.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.autocfg-1.1.0.bazel" + } + }, + "cui__bitflags-1.3.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bitflags/1.3.2/download" + ], + "strip_prefix": "bitflags-1.3.2", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.bitflags-1.3.2.bazel" + } + }, + "cui__bitflags-2.4.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bitflags/2.4.1/download" + ], + "strip_prefix": "bitflags-2.4.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.bitflags-2.4.1.bazel" + } + }, + "cui__block-buffer-0.10.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/block-buffer/0.10.4/download" + ], + "strip_prefix": "block-buffer-0.10.4", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.block-buffer-0.10.4.bazel" + } + }, + "cui__bstr-1.6.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bstr/1.6.0/download" + ], + "strip_prefix": "bstr-1.6.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.bstr-1.6.0.bazel" + } + }, + "cui__camino-1.1.9": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/camino/1.1.9/download" + ], + "strip_prefix": "camino-1.1.9", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.camino-1.1.9.bazel" + } + }, + "cui__cargo-lock-10.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "49f8d8bb8836f681fe20ad10faa7796a11e67dbb6125e5a38f88ddd725c217e8", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cargo-lock/10.0.0/download" + ], + "strip_prefix": "cargo-lock-10.0.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.cargo-lock-10.0.0.bazel" + } + }, + "cui__cargo-platform-0.1.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cargo-platform/0.1.7/download" + ], + "strip_prefix": "cargo-platform-0.1.7", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.cargo-platform-0.1.7.bazel" + } + }, + "cui__cargo_metadata-0.18.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cargo_metadata/0.18.1/download" + ], + "strip_prefix": "cargo_metadata-0.18.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.cargo_metadata-0.18.1.bazel" + } + }, + "cui__cargo_toml-0.20.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "88da5a13c620b4ca0078845707ea9c3faf11edbc3ffd8497d11d686211cd1ac0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cargo_toml/0.20.5/download" + ], + "strip_prefix": "cargo_toml-0.20.5", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.cargo_toml-0.20.5.bazel" + } + }, + "cui__cfg-expr-0.17.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d0890061c4d3223e7267f3bad2ec40b997d64faac1c2815a4a9d95018e2b9e9c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cfg-expr/0.17.0/download" + ], + "strip_prefix": "cfg-expr-0.17.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.cfg-expr-0.17.0.bazel" + } + }, + "cui__cfg-if-1.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cfg-if/1.0.0/download" + ], + "strip_prefix": "cfg-if-1.0.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.cfg-if-1.0.0.bazel" + } + }, + "cui__clap-4.3.11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1640e5cc7fb47dbb8338fd471b105e7ed6c3cb2aeb00c2e067127ffd3764a05d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/clap/4.3.11/download" + ], + "strip_prefix": "clap-4.3.11", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.clap-4.3.11.bazel" + } + }, + "cui__clap_builder-4.3.11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "98c59138d527eeaf9b53f35a77fcc1fad9d883116070c63d5de1c7dc7b00c72b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/clap_builder/4.3.11/download" + ], + "strip_prefix": "clap_builder-4.3.11", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.clap_builder-4.3.11.bazel" + } + }, + "cui__clap_derive-4.3.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/clap_derive/4.3.2/download" + ], + "strip_prefix": "clap_derive-4.3.2", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.clap_derive-4.3.2.bazel" + } + }, + "cui__clap_lex-0.5.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/clap_lex/0.5.0/download" + ], + "strip_prefix": "clap_lex-0.5.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.clap_lex-0.5.0.bazel" + } + }, + "cui__clru-0.6.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/clru/0.6.1/download" + ], + "strip_prefix": "clru-0.6.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.clru-0.6.1.bazel" + } + }, + "cui__colorchoice-1.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/colorchoice/1.0.0/download" + ], + "strip_prefix": "colorchoice-1.0.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.colorchoice-1.0.0.bazel" + } + }, + "cui__cpufeatures-0.2.9": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cpufeatures/0.2.9/download" + ], + "strip_prefix": "cpufeatures-0.2.9", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.cpufeatures-0.2.9.bazel" + } + }, + "cui__crates-index-3.2.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "45fbf3a2a2f3435363fb343f30ee31d9f63ea3862d6eab639446c1393d82cd32", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/crates-index/3.2.0/download" + ], + "strip_prefix": "crates-index-3.2.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.crates-index-3.2.0.bazel" + } + }, + "cui__crc32fast-1.3.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/crc32fast/1.3.2/download" + ], + "strip_prefix": "crc32fast-1.3.2", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.crc32fast-1.3.2.bazel" + } + }, + "cui__crossbeam-channel-0.5.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/crossbeam-channel/0.5.8/download" + ], + "strip_prefix": "crossbeam-channel-0.5.8", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.crossbeam-channel-0.5.8.bazel" + } + }, + "cui__crossbeam-utils-0.8.16": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/crossbeam-utils/0.8.16/download" + ], + "strip_prefix": "crossbeam-utils-0.8.16", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.crossbeam-utils-0.8.16.bazel" + } + }, + "cui__crypto-common-0.1.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/crypto-common/0.1.6/download" + ], + "strip_prefix": "crypto-common-0.1.6", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.crypto-common-0.1.6.bazel" + } + }, + "cui__digest-0.10.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/digest/0.10.7/download" + ], + "strip_prefix": "digest-0.10.7", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.digest-0.10.7.bazel" + } + }, + "cui__dunce-1.0.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/dunce/1.0.4/download" + ], + "strip_prefix": "dunce-1.0.4", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.dunce-1.0.4.bazel" + } + }, + "cui__either-1.9.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/either/1.9.0/download" + ], + "strip_prefix": "either-1.9.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.either-1.9.0.bazel" + } + }, + "cui__encoding_rs-0.8.33": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/encoding_rs/0.8.33/download" + ], + "strip_prefix": "encoding_rs-0.8.33", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.encoding_rs-0.8.33.bazel" + } + }, + "cui__equivalent-1.0.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/equivalent/1.0.1/download" + ], + "strip_prefix": "equivalent-1.0.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.equivalent-1.0.1.bazel" + } + }, + "cui__errno-0.3.9": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/errno/0.3.9/download" + ], + "strip_prefix": "errno-0.3.9", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.errno-0.3.9.bazel" + } + }, + "cui__faster-hex-0.9.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a2a2b11eda1d40935b26cf18f6833c526845ae8c41e58d09af6adeb6f0269183", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/faster-hex/0.9.0/download" + ], + "strip_prefix": "faster-hex-0.9.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.faster-hex-0.9.0.bazel" + } + }, + "cui__fastrand-2.1.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/fastrand/2.1.1/download" + ], + "strip_prefix": "fastrand-2.1.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.fastrand-2.1.1.bazel" + } + }, + "cui__filetime-0.2.22": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/filetime/0.2.22/download" + ], + "strip_prefix": "filetime-0.2.22", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.filetime-0.2.22.bazel" + } + }, + "cui__flate2-1.0.28": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/flate2/1.0.28/download" + ], + "strip_prefix": "flate2-1.0.28", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.flate2-1.0.28.bazel" + } + }, + "cui__fnv-1.0.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/fnv/1.0.7/download" + ], + "strip_prefix": "fnv-1.0.7", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.fnv-1.0.7.bazel" + } + }, + "cui__form_urlencoded-1.2.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/form_urlencoded/1.2.1/download" + ], + "strip_prefix": "form_urlencoded-1.2.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.form_urlencoded-1.2.1.bazel" + } + }, + "cui__generic-array-0.14.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/generic-array/0.14.7/download" + ], + "strip_prefix": "generic-array-0.14.7", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.generic-array-0.14.7.bazel" + } + }, + "cui__gix-0.66.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9048b8d1ae2104f045cb37e5c450fc49d5d8af22609386bfc739c11ba88995eb", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix/0.66.0/download" + ], + "strip_prefix": "gix-0.66.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-0.66.0.bazel" + } + }, + "cui__gix-actor-0.32.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "fc19e312cd45c4a66cd003f909163dc2f8e1623e30a0c0c6df3776e89b308665", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-actor/0.32.0/download" + ], + "strip_prefix": "gix-actor-0.32.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-actor-0.32.0.bazel" + } + }, + "cui__gix-attributes-0.22.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ebccbf25aa4a973dd352564a9000af69edca90623e8a16dad9cbc03713131311", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-attributes/0.22.5/download" + ], + "strip_prefix": "gix-attributes-0.22.5", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-attributes-0.22.5.bazel" + } + }, + "cui__gix-bitmap-0.2.11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a371db66cbd4e13f0ed9dc4c0fea712d7276805fccc877f77e96374d317e87ae", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-bitmap/0.2.11/download" + ], + "strip_prefix": "gix-bitmap-0.2.11", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-bitmap-0.2.11.bazel" + } + }, + "cui__gix-chunk-0.4.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "45c8751169961ba7640b513c3b24af61aa962c967aaf04116734975cd5af0c52", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-chunk/0.4.8/download" + ], + "strip_prefix": "gix-chunk-0.4.8", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-chunk-0.4.8.bazel" + } + }, + "cui__gix-command-0.3.9": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "dff2e692b36bbcf09286c70803006ca3fd56551a311de450be317a0ab8ea92e7", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-command/0.3.9/download" + ], + "strip_prefix": "gix-command-0.3.9", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-command-0.3.9.bazel" + } + }, + "cui__gix-commitgraph-0.24.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "133b06f67f565836ec0c473e2116a60fb74f80b6435e21d88013ac0e3c60fc78", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-commitgraph/0.24.3/download" + ], + "strip_prefix": "gix-commitgraph-0.24.3", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-commitgraph-0.24.3.bazel" + } + }, + "cui__gix-config-0.40.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "78e797487e6ca3552491de1131b4f72202f282fb33f198b1c34406d765b42bb0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-config/0.40.0/download" + ], + "strip_prefix": "gix-config-0.40.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-config-0.40.0.bazel" + } + }, + "cui__gix-config-value-0.14.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "03f76169faa0dec598eac60f83d7fcdd739ec16596eca8fb144c88973dbe6f8c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-config-value/0.14.8/download" + ], + "strip_prefix": "gix-config-value-0.14.8", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-config-value-0.14.8.bazel" + } + }, + "cui__gix-credentials-0.24.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8ce391d305968782f1ae301c4a3d42c5701df7ff1d8bc03740300f6fd12bce78", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-credentials/0.24.5/download" + ], + "strip_prefix": "gix-credentials-0.24.5", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-credentials-0.24.5.bazel" + } + }, + "cui__gix-date-0.9.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "35c84b7af01e68daf7a6bb8bb909c1ff5edb3ce4326f1f43063a5a96d3c3c8a5", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-date/0.9.0/download" + ], + "strip_prefix": "gix-date-0.9.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-date-0.9.0.bazel" + } + }, + "cui__gix-diff-0.46.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "92c9afd80fff00f8b38b1c1928442feb4cd6d2232a6ed806b6b193151a3d336c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-diff/0.46.0/download" + ], + "strip_prefix": "gix-diff-0.46.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-diff-0.46.0.bazel" + } + }, + "cui__gix-discover-0.35.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0577366b9567376bc26e815fd74451ebd0e6218814e242f8e5b7072c58d956d2", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-discover/0.35.0/download" + ], + "strip_prefix": "gix-discover-0.35.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-discover-0.35.0.bazel" + } + }, + "cui__gix-features-0.38.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ac7045ac9fe5f9c727f38799d002a7ed3583cd777e3322a7c4b43e3cf437dc69", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-features/0.38.2/download" + ], + "strip_prefix": "gix-features-0.38.2", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-features-0.38.2.bazel" + } + }, + "cui__gix-filter-0.13.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4121790ae140066e5b953becc72e7496278138d19239be2e63b5067b0843119e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-filter/0.13.0/download" + ], + "strip_prefix": "gix-filter-0.13.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-filter-0.13.0.bazel" + } + }, + "cui__gix-fs-0.11.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "f2bfe6249cfea6d0c0e0990d5226a4cb36f030444ba9e35e0639275db8f98575", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-fs/0.11.3/download" + ], + "strip_prefix": "gix-fs-0.11.3", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-fs-0.11.3.bazel" + } + }, + "cui__gix-glob-0.16.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "74908b4bbc0a0a40852737e5d7889f676f081e340d5451a16e5b4c50d592f111", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-glob/0.16.5/download" + ], + "strip_prefix": "gix-glob-0.16.5", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-glob-0.16.5.bazel" + } + }, + "cui__gix-hash-0.14.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "f93d7df7366121b5018f947a04d37f034717e113dcf9ccd85c34b58e57a74d5e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-hash/0.14.2/download" + ], + "strip_prefix": "gix-hash-0.14.2", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-hash-0.14.2.bazel" + } + }, + "cui__gix-hashtable-0.5.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "7ddf80e16f3c19ac06ce415a38b8591993d3f73aede049cb561becb5b3a8e242", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-hashtable/0.5.2/download" + ], + "strip_prefix": "gix-hashtable-0.5.2", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-hashtable-0.5.2.bazel" + } + }, + "cui__gix-ignore-0.11.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e447cd96598460f5906a0f6c75e950a39f98c2705fc755ad2f2020c9e937fab7", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-ignore/0.11.4/download" + ], + "strip_prefix": "gix-ignore-0.11.4", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-ignore-0.11.4.bazel" + } + }, + "cui__gix-index-0.35.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0cd4203244444017682176e65fd0180be9298e58ed90bd4a8489a357795ed22d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-index/0.35.0/download" + ], + "strip_prefix": "gix-index-0.35.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-index-0.35.0.bazel" + } + }, + "cui__gix-lock-14.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e3bc7fe297f1f4614774989c00ec8b1add59571dc9b024b4c00acb7dedd4e19d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-lock/14.0.0/download" + ], + "strip_prefix": "gix-lock-14.0.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-lock-14.0.0.bazel" + } + }, + "cui__gix-negotiate-0.15.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b4063bf329a191a9e24b6f948a17ccf6698c0380297f5e169cee4f1d2ab9475b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-negotiate/0.15.0/download" + ], + "strip_prefix": "gix-negotiate-0.15.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-negotiate-0.15.0.bazel" + } + }, + "cui__gix-object-0.44.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2f5b801834f1de7640731820c2df6ba88d95480dc4ab166a5882f8ff12b88efa", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-object/0.44.0/download" + ], + "strip_prefix": "gix-object-0.44.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-object-0.44.0.bazel" + } + }, + "cui__gix-odb-0.63.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a3158068701c17df54f0ab2adda527f5a6aca38fd5fd80ceb7e3c0a2717ec747", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-odb/0.63.0/download" + ], + "strip_prefix": "gix-odb-0.63.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-odb-0.63.0.bazel" + } + }, + "cui__gix-pack-0.53.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3223aa342eee21e1e0e403cad8ae9caf9edca55ef84c347738d10681676fd954", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-pack/0.53.0/download" + ], + "strip_prefix": "gix-pack-0.53.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-pack-0.53.0.bazel" + } + }, + "cui__gix-packetline-0.17.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8c43ef4d5fe2fa222c606731c8bdbf4481413ee4ef46d61340ec39e4df4c5e49", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-packetline/0.17.6/download" + ], + "strip_prefix": "gix-packetline-0.17.6", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-packetline-0.17.6.bazel" + } + }, + "cui__gix-packetline-blocking-0.17.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b9802304baa798dd6f5ff8008a2b6516d54b74a69ca2d3a2b9e2d6c3b5556b40", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-packetline-blocking/0.17.5/download" + ], + "strip_prefix": "gix-packetline-blocking-0.17.5", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-packetline-blocking-0.17.5.bazel" + } + }, + "cui__gix-path-0.10.11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ebfc4febd088abdcbc9f1246896e57e37b7a34f6909840045a1767c6dafac7af", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-path/0.10.11/download" + ], + "strip_prefix": "gix-path-0.10.11", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-path-0.10.11.bazel" + } + }, + "cui__gix-pathspec-0.7.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5d23bf239532b4414d0e63b8ab3a65481881f7237ed9647bb10c1e3cc54c5ceb", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-pathspec/0.7.7/download" + ], + "strip_prefix": "gix-pathspec-0.7.7", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-pathspec-0.7.7.bazel" + } + }, + "cui__gix-prompt-0.8.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "74fde865cdb46b30d8dad1293385d9bcf998d3a39cbf41bee67d0dab026fe6b1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-prompt/0.8.7/download" + ], + "strip_prefix": "gix-prompt-0.8.7", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-prompt-0.8.7.bazel" + } + }, + "cui__gix-protocol-0.45.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "cc43a1006f01b5efee22a003928c9eb83dde2f52779ded9d4c0732ad93164e3e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-protocol/0.45.3/download" + ], + "strip_prefix": "gix-protocol-0.45.3", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-protocol-0.45.3.bazel" + } + }, + "cui__gix-quote-0.4.12": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "cbff4f9b9ea3fa7a25a70ee62f545143abef624ac6aa5884344e70c8b0a1d9ff", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-quote/0.4.12/download" + ], + "strip_prefix": "gix-quote-0.4.12", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-quote-0.4.12.bazel" + } + }, + "cui__gix-ref-0.47.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ae0d8406ebf9aaa91f55a57f053c5a1ad1a39f60fdf0303142b7be7ea44311e5", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-ref/0.47.0/download" + ], + "strip_prefix": "gix-ref-0.47.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-ref-0.47.0.bazel" + } + }, + "cui__gix-refspec-0.25.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ebb005f82341ba67615ffdd9f7742c87787544441c88090878393d0682869ca6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-refspec/0.25.0/download" + ], + "strip_prefix": "gix-refspec-0.25.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-refspec-0.25.0.bazel" + } + }, + "cui__gix-revision-0.29.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ba4621b219ac0cdb9256883030c3d56a6c64a6deaa829a92da73b9a576825e1e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-revision/0.29.0/download" + ], + "strip_prefix": "gix-revision-0.29.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-revision-0.29.0.bazel" + } + }, + "cui__gix-revwalk-0.15.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b41e72544b93084ee682ef3d5b31b1ba4d8fa27a017482900e5e044d5b1b3984", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-revwalk/0.15.0/download" + ], + "strip_prefix": "gix-revwalk-0.15.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-revwalk-0.15.0.bazel" + } + }, + "cui__gix-sec-0.10.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0fe4d52f30a737bbece5276fab5d3a8b276dc2650df963e293d0673be34e7a5f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-sec/0.10.8/download" + ], + "strip_prefix": "gix-sec-0.10.8", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-sec-0.10.8.bazel" + } + }, + "cui__gix-submodule-0.14.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "529d0af78cc2f372b3218f15eb1e3d1635a21c8937c12e2dd0b6fc80c2ca874b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-submodule/0.14.0/download" + ], + "strip_prefix": "gix-submodule-0.14.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-submodule-0.14.0.bazel" + } + }, + "cui__gix-tempfile-14.0.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "046b4927969fa816a150a0cda2e62c80016fe11fb3c3184e4dddf4e542f108aa", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-tempfile/14.0.2/download" + ], + "strip_prefix": "gix-tempfile-14.0.2", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-tempfile-14.0.2.bazel" + } + }, + "cui__gix-trace-0.1.10": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "6cae0e8661c3ff92688ce1c8b8058b3efb312aba9492bbe93661a21705ab431b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-trace/0.1.10/download" + ], + "strip_prefix": "gix-trace-0.1.10", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-trace-0.1.10.bazel" + } + }, + "cui__gix-transport-0.42.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "421dcccab01b41a15d97b226ad97a8f9262295044e34fbd37b10e493b0a6481f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-transport/0.42.3/download" + ], + "strip_prefix": "gix-transport-0.42.3", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-transport-0.42.3.bazel" + } + }, + "cui__gix-traverse-0.41.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "030da39af94e4df35472e9318228f36530989327906f38e27807df305fccb780", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-traverse/0.41.0/download" + ], + "strip_prefix": "gix-traverse-0.41.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-traverse-0.41.0.bazel" + } + }, + "cui__gix-url-0.27.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "fd280c5e84fb22e128ed2a053a0daeacb6379469be6a85e3d518a0636e160c89", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-url/0.27.5/download" + ], + "strip_prefix": "gix-url-0.27.5", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-url-0.27.5.bazel" + } + }, + "cui__gix-utils-0.1.12": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "35192df7fd0fa112263bad8021e2df7167df4cc2a6e6d15892e1e55621d3d4dc", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-utils/0.1.12/download" + ], + "strip_prefix": "gix-utils-0.1.12", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-utils-0.1.12.bazel" + } + }, + "cui__gix-validate-0.9.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "81f2badbb64e57b404593ee26b752c26991910fd0d81fe6f9a71c1a8309b6c86", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-validate/0.9.0/download" + ], + "strip_prefix": "gix-validate-0.9.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-validate-0.9.0.bazel" + } + }, + "cui__gix-worktree-0.36.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "c312ad76a3f2ba8e865b360d5cb3aa04660971d16dec6dd0ce717938d903149a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gix-worktree/0.36.0/download" + ], + "strip_prefix": "gix-worktree-0.36.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-worktree-0.36.0.bazel" + } + }, + "cui__globset-0.4.11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1391ab1f92ffcc08911957149833e682aa3fe252b9f45f966d2ef972274c97df", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/globset/0.4.11/download" + ], + "strip_prefix": "globset-0.4.11", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.globset-0.4.11.bazel" + } + }, + "cui__globwalk-0.8.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/globwalk/0.8.1/download" + ], + "strip_prefix": "globwalk-0.8.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.globwalk-0.8.1.bazel" + } + }, + "cui__hashbrown-0.14.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/hashbrown/0.14.3/download" + ], + "strip_prefix": "hashbrown-0.14.3", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.hashbrown-0.14.3.bazel" + } + }, + "cui__hashbrown-0.15.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/hashbrown/0.15.0/download" + ], + "strip_prefix": "hashbrown-0.15.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.hashbrown-0.15.0.bazel" + } + }, + "cui__heck-0.4.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/heck/0.4.1/download" + ], + "strip_prefix": "heck-0.4.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.heck-0.4.1.bazel" + } + }, + "cui__hermit-abi-0.3.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/hermit-abi/0.3.2/download" + ], + "strip_prefix": "hermit-abi-0.3.2", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.hermit-abi-0.3.2.bazel" + } + }, + "cui__hex-0.4.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/hex/0.4.3/download" + ], + "strip_prefix": "hex-0.4.3", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.hex-0.4.3.bazel" + } + }, + "cui__home-0.5.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/home/0.5.5/download" + ], + "strip_prefix": "home-0.5.5", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.home-0.5.5.bazel" + } + }, + "cui__idna-0.5.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/idna/0.5.0/download" + ], + "strip_prefix": "idna-0.5.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.idna-0.5.0.bazel" + } + }, + "cui__ignore-0.4.18": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/ignore/0.4.18/download" + ], + "strip_prefix": "ignore-0.4.18", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.ignore-0.4.18.bazel" + } + }, + "cui__indexmap-2.6.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/indexmap/2.6.0/download" + ], + "strip_prefix": "indexmap-2.6.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.indexmap-2.6.0.bazel" + } + }, + "cui__indoc-2.0.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/indoc/2.0.5/download" + ], + "strip_prefix": "indoc-2.0.5", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.indoc-2.0.5.bazel" + } + }, + "cui__io-lifetimes-1.0.11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/io-lifetimes/1.0.11/download" + ], + "strip_prefix": "io-lifetimes-1.0.11", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.io-lifetimes-1.0.11.bazel" + } + }, + "cui__is-terminal-0.4.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/is-terminal/0.4.7/download" + ], + "strip_prefix": "is-terminal-0.4.7", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.is-terminal-0.4.7.bazel" + } + }, + "cui__itertools-0.13.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/itertools/0.13.0/download" + ], + "strip_prefix": "itertools-0.13.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.itertools-0.13.0.bazel" + } + }, + "cui__itoa-1.0.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/itoa/1.0.8/download" + ], + "strip_prefix": "itoa-1.0.8", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.itoa-1.0.8.bazel" + } + }, + "cui__jiff-0.1.13": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8a45489186a6123c128fdf6016183fcfab7113e1820eb813127e036e287233fb", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/jiff/0.1.13/download" + ], + "strip_prefix": "jiff-0.1.13", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.jiff-0.1.13.bazel" + } + }, + "cui__jiff-tzdb-0.1.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "91335e575850c5c4c673b9bd467b0e025f164ca59d0564f69d0c2ee0ffad4653", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/jiff-tzdb/0.1.1/download" + ], + "strip_prefix": "jiff-tzdb-0.1.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.jiff-tzdb-0.1.1.bazel" + } + }, + "cui__jiff-tzdb-platform-0.1.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9835f0060a626fe59f160437bc725491a6af23133ea906500027d1bd2f8f4329", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/jiff-tzdb-platform/0.1.1/download" + ], + "strip_prefix": "jiff-tzdb-platform-0.1.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.jiff-tzdb-platform-0.1.1.bazel" + } + }, + "cui__kstring-2.0.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "558bf9508a558512042d3095138b1f7b8fe90c5467d94f9f1da28b3731c5dbd1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/kstring/2.0.2/download" + ], + "strip_prefix": "kstring-2.0.2", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.kstring-2.0.2.bazel" + } + }, + "cui__lazy_static-1.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/lazy_static/1.4.0/download" + ], + "strip_prefix": "lazy_static-1.4.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.lazy_static-1.4.0.bazel" + } + }, + "cui__libc-0.2.161": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/libc/0.2.161/download" + ], + "strip_prefix": "libc-0.2.161", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.libc-0.2.161.bazel" + } + }, + "cui__linux-raw-sys-0.3.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/linux-raw-sys/0.3.8/download" + ], + "strip_prefix": "linux-raw-sys-0.3.8", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.linux-raw-sys-0.3.8.bazel" + } + }, + "cui__linux-raw-sys-0.4.14": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/linux-raw-sys/0.4.14/download" + ], + "strip_prefix": "linux-raw-sys-0.4.14", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.linux-raw-sys-0.4.14.bazel" + } + }, + "cui__lock_api-0.4.11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/lock_api/0.4.11/download" + ], + "strip_prefix": "lock_api-0.4.11", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.lock_api-0.4.11.bazel" + } + }, + "cui__log-0.4.19": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/log/0.4.19/download" + ], + "strip_prefix": "log-0.4.19", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.log-0.4.19.bazel" + } + }, + "cui__maplit-1.0.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/maplit/1.0.2/download" + ], + "strip_prefix": "maplit-1.0.2", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.maplit-1.0.2.bazel" + } + }, + "cui__maybe-async-0.2.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0f1b8c13cb1f814b634a96b2c725449fe7ed464a7b8781de8688be5ffbd3f305", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/maybe-async/0.2.7/download" + ], + "strip_prefix": "maybe-async-0.2.7", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.maybe-async-0.2.7.bazel" + } + }, + "cui__memchr-2.6.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/memchr/2.6.4/download" + ], + "strip_prefix": "memchr-2.6.4", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.memchr-2.6.4.bazel" + } + }, + "cui__memmap2-0.9.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/memmap2/0.9.5/download" + ], + "strip_prefix": "memmap2-0.9.5", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.memmap2-0.9.5.bazel" + } + }, + "cui__miniz_oxide-0.7.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/miniz_oxide/0.7.1/download" + ], + "strip_prefix": "miniz_oxide-0.7.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.miniz_oxide-0.7.1.bazel" + } + }, + "cui__normpath-1.3.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "c8911957c4b1549ac0dc74e30db9c8b0e66ddcd6d7acc33098f4c63a64a6d7ed", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/normpath/1.3.0/download" + ], + "strip_prefix": "normpath-1.3.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.normpath-1.3.0.bazel" + } + }, + "cui__nu-ansi-term-0.46.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/nu-ansi-term/0.46.0/download" + ], + "strip_prefix": "nu-ansi-term-0.46.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.nu-ansi-term-0.46.0.bazel" + } + }, + "cui__once_cell-1.20.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/once_cell/1.20.2/download" + ], + "strip_prefix": "once_cell-1.20.2", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.once_cell-1.20.2.bazel" + } + }, + "cui__overload-0.1.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/overload/0.1.1/download" + ], + "strip_prefix": "overload-0.1.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.overload-0.1.1.bazel" + } + }, + "cui__parking_lot-0.12.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/parking_lot/0.12.1/download" + ], + "strip_prefix": "parking_lot-0.12.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.parking_lot-0.12.1.bazel" + } + }, + "cui__parking_lot_core-0.9.9": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/parking_lot_core/0.9.9/download" + ], + "strip_prefix": "parking_lot_core-0.9.9", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.parking_lot_core-0.9.9.bazel" + } + }, + "cui__pathdiff-0.2.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/pathdiff/0.2.2/download" + ], + "strip_prefix": "pathdiff-0.2.2", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.pathdiff-0.2.2.bazel" + } + }, + "cui__percent-encoding-2.3.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/percent-encoding/2.3.1/download" + ], + "strip_prefix": "percent-encoding-2.3.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.percent-encoding-2.3.1.bazel" + } + }, + "cui__pest-2.7.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "f73935e4d55e2abf7f130186537b19e7a4abc886a0252380b59248af473a3fc9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/pest/2.7.0/download" + ], + "strip_prefix": "pest-2.7.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.pest-2.7.0.bazel" + } + }, + "cui__pest_derive-2.7.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "aef623c9bbfa0eedf5a0efba11a5ee83209c326653ca31ff019bec3a95bfff2b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/pest_derive/2.7.0/download" + ], + "strip_prefix": "pest_derive-2.7.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.pest_derive-2.7.0.bazel" + } + }, + "cui__pest_generator-2.7.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b3e8cba4ec22bada7fc55ffe51e2deb6a0e0db2d0b7ab0b103acc80d2510c190", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/pest_generator/2.7.0/download" + ], + "strip_prefix": "pest_generator-2.7.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.pest_generator-2.7.0.bazel" + } + }, + "cui__pest_meta-2.7.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a01f71cb40bd8bb94232df14b946909e14660e33fc05db3e50ae2a82d7ea0ca0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/pest_meta/2.7.0/download" + ], + "strip_prefix": "pest_meta-2.7.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.pest_meta-2.7.0.bazel" + } + }, + "cui__pin-project-lite-0.2.13": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/pin-project-lite/0.2.13/download" + ], + "strip_prefix": "pin-project-lite-0.2.13", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.pin-project-lite-0.2.13.bazel" + } + }, + "cui__proc-macro2-1.0.88": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/proc-macro2/1.0.88/download" + ], + "strip_prefix": "proc-macro2-1.0.88", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.proc-macro2-1.0.88.bazel" + } + }, + "cui__prodash-28.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "744a264d26b88a6a7e37cbad97953fa233b94d585236310bcbc88474b4092d79", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/prodash/28.0.0/download" + ], + "strip_prefix": "prodash-28.0.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.prodash-28.0.0.bazel" + } + }, + "cui__quote-1.0.37": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/quote/1.0.37/download" + ], + "strip_prefix": "quote-1.0.37", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.quote-1.0.37.bazel" + } + }, + "cui__redox_syscall-0.3.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/redox_syscall/0.3.5/download" + ], + "strip_prefix": "redox_syscall-0.3.5", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.redox_syscall-0.3.5.bazel" + } + }, + "cui__redox_syscall-0.4.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/redox_syscall/0.4.1/download" + ], + "strip_prefix": "redox_syscall-0.4.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.redox_syscall-0.4.1.bazel" + } + }, + "cui__regex-1.11.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/regex/1.11.0/download" + ], + "strip_prefix": "regex-1.11.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.regex-1.11.0.bazel" + } + }, + "cui__regex-automata-0.3.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/regex-automata/0.3.3/download" + ], + "strip_prefix": "regex-automata-0.3.3", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.regex-automata-0.3.3.bazel" + } + }, + "cui__regex-automata-0.4.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/regex-automata/0.4.8/download" + ], + "strip_prefix": "regex-automata-0.4.8", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.regex-automata-0.4.8.bazel" + } + }, + "cui__regex-syntax-0.8.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/regex-syntax/0.8.5/download" + ], + "strip_prefix": "regex-syntax-0.8.5", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.regex-syntax-0.8.5.bazel" + } + }, + "cui__rustc-hash-2.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rustc-hash/2.0.0/download" + ], + "strip_prefix": "rustc-hash-2.0.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.rustc-hash-2.0.0.bazel" + } + }, + "cui__rustix-0.37.23": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rustix/0.37.23/download" + ], + "strip_prefix": "rustix-0.37.23", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.rustix-0.37.23.bazel" + } + }, + "cui__rustix-0.38.37": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rustix/0.38.37/download" + ], + "strip_prefix": "rustix-0.38.37", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.rustix-0.38.37.bazel" + } + }, + "cui__ryu-1.0.14": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/ryu/1.0.14/download" + ], + "strip_prefix": "ryu-1.0.14", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.ryu-1.0.14.bazel" + } + }, + "cui__same-file-1.0.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/same-file/1.0.6/download" + ], + "strip_prefix": "same-file-1.0.6", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.same-file-1.0.6.bazel" + } + }, + "cui__scopeguard-1.2.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/scopeguard/1.2.0/download" + ], + "strip_prefix": "scopeguard-1.2.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.scopeguard-1.2.0.bazel" + } + }, + "cui__semver-1.0.23": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/semver/1.0.23/download" + ], + "strip_prefix": "semver-1.0.23", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.semver-1.0.23.bazel" + } + }, + "cui__serde-1.0.210": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/serde/1.0.210/download" + ], + "strip_prefix": "serde-1.0.210", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.serde-1.0.210.bazel" + } + }, + "cui__serde_derive-1.0.210": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/serde_derive/1.0.210/download" + ], + "strip_prefix": "serde_derive-1.0.210", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.serde_derive-1.0.210.bazel" + } + }, + "cui__serde_json-1.0.129": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "6dbcf9b78a125ee667ae19388837dd12294b858d101fdd393cb9d5501ef09eb2", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/serde_json/1.0.129/download" + ], + "strip_prefix": "serde_json-1.0.129", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.serde_json-1.0.129.bazel" + } + }, + "cui__serde_spanned-0.6.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/serde_spanned/0.6.8/download" + ], + "strip_prefix": "serde_spanned-0.6.8", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.serde_spanned-0.6.8.bazel" + } + }, + "cui__serde_starlark-0.1.16": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "43f25f26c1c853647016b862c1734e0ad68c4f9f752b5f792220d38b1369ed4a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/serde_starlark/0.1.16/download" + ], + "strip_prefix": "serde_starlark-0.1.16", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.serde_starlark-0.1.16.bazel" + } + }, + "cui__sha1_smol-1.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/sha1_smol/1.0.0/download" + ], + "strip_prefix": "sha1_smol-1.0.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.sha1_smol-1.0.0.bazel" + } + }, + "cui__sha2-0.10.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/sha2/0.10.8/download" + ], + "strip_prefix": "sha2-0.10.8", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.sha2-0.10.8.bazel" + } + }, + "cui__sharded-slab-0.1.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/sharded-slab/0.1.7/download" + ], + "strip_prefix": "sharded-slab-0.1.7", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.sharded-slab-0.1.7.bazel" + } + }, + "cui__shell-words-1.1.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/shell-words/1.1.0/download" + ], + "strip_prefix": "shell-words-1.1.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.shell-words-1.1.0.bazel" + } + }, + "cui__smallvec-1.11.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/smallvec/1.11.0/download" + ], + "strip_prefix": "smallvec-1.11.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.smallvec-1.11.0.bazel" + } + }, + "cui__smawk-0.3.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "f67ad224767faa3c7d8b6d91985b78e70a1324408abcb1cfcc2be4c06bc06043", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/smawk/0.3.1/download" + ], + "strip_prefix": "smawk-0.3.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.smawk-0.3.1.bazel" + } + }, + "cui__smol_str-0.2.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/smol_str/0.2.0/download" + ], + "strip_prefix": "smol_str-0.2.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.smol_str-0.2.0.bazel" + } + }, + "cui__spdx-0.10.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "47317bbaf63785b53861e1ae2d11b80d6b624211d42cb20efcd210ee6f8a14bc", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/spdx/0.10.6/download" + ], + "strip_prefix": "spdx-0.10.6", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.spdx-0.10.6.bazel" + } + }, + "cui__static_assertions-1.1.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/static_assertions/1.1.0/download" + ], + "strip_prefix": "static_assertions-1.1.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.static_assertions-1.1.0.bazel" + } + }, + "cui__strsim-0.10.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/strsim/0.10.0/download" + ], + "strip_prefix": "strsim-0.10.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.strsim-0.10.0.bazel" + } + }, + "cui__syn-1.0.109": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/syn/1.0.109/download" + ], + "strip_prefix": "syn-1.0.109", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.syn-1.0.109.bazel" + } + }, + "cui__syn-2.0.79": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/syn/2.0.79/download" + ], + "strip_prefix": "syn-2.0.79", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.syn-2.0.79.bazel" + } + }, + "cui__tempfile-3.13.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tempfile/3.13.0/download" + ], + "strip_prefix": "tempfile-3.13.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tempfile-3.13.0.bazel" + } + }, + "cui__tera-1.19.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "970dff17c11e884a4a09bc76e3a17ef71e01bb13447a11e85226e254fe6d10b8", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tera/1.19.1/download" + ], + "strip_prefix": "tera-1.19.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tera-1.19.1.bazel" + } + }, + "cui__textwrap-0.16.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/textwrap/0.16.1/download" + ], + "strip_prefix": "textwrap-0.16.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.textwrap-0.16.1.bazel" + } + }, + "cui__thiserror-1.0.50": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/thiserror/1.0.50/download" + ], + "strip_prefix": "thiserror-1.0.50", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.thiserror-1.0.50.bazel" + } + }, + "cui__thiserror-impl-1.0.50": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/thiserror-impl/1.0.50/download" + ], + "strip_prefix": "thiserror-impl-1.0.50", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.thiserror-impl-1.0.50.bazel" + } + }, + "cui__thread_local-1.1.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/thread_local/1.1.4/download" + ], + "strip_prefix": "thread_local-1.1.4", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.thread_local-1.1.4.bazel" + } + }, + "cui__tinyvec-1.6.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tinyvec/1.6.0/download" + ], + "strip_prefix": "tinyvec-1.6.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tinyvec-1.6.0.bazel" + } + }, + "cui__tinyvec_macros-0.1.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tinyvec_macros/0.1.1/download" + ], + "strip_prefix": "tinyvec_macros-0.1.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tinyvec_macros-0.1.1.bazel" + } + }, + "cui__toml-0.8.19": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/toml/0.8.19/download" + ], + "strip_prefix": "toml-0.8.19", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.toml-0.8.19.bazel" + } + }, + "cui__toml_datetime-0.6.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/toml_datetime/0.6.8/download" + ], + "strip_prefix": "toml_datetime-0.6.8", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.toml_datetime-0.6.8.bazel" + } + }, + "cui__toml_edit-0.22.22": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/toml_edit/0.22.22/download" + ], + "strip_prefix": "toml_edit-0.22.22", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.toml_edit-0.22.22.bazel" + } + }, + "cui__tracing-0.1.40": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tracing/0.1.40/download" + ], + "strip_prefix": "tracing-0.1.40", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tracing-0.1.40.bazel" + } + }, + "cui__tracing-attributes-0.1.27": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tracing-attributes/0.1.27/download" + ], + "strip_prefix": "tracing-attributes-0.1.27", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tracing-attributes-0.1.27.bazel" + } + }, + "cui__tracing-core-0.1.32": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tracing-core/0.1.32/download" + ], + "strip_prefix": "tracing-core-0.1.32", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tracing-core-0.1.32.bazel" + } + }, + "cui__tracing-log-0.2.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tracing-log/0.2.0/download" + ], + "strip_prefix": "tracing-log-0.2.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tracing-log-0.2.0.bazel" + } + }, + "cui__tracing-subscriber-0.3.18": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tracing-subscriber/0.3.18/download" + ], + "strip_prefix": "tracing-subscriber-0.3.18", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tracing-subscriber-0.3.18.bazel" + } + }, + "cui__typenum-1.16.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/typenum/1.16.0/download" + ], + "strip_prefix": "typenum-1.16.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.typenum-1.16.0.bazel" + } + }, + "cui__ucd-trie-0.1.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/ucd-trie/0.1.6/download" + ], + "strip_prefix": "ucd-trie-0.1.6", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.ucd-trie-0.1.6.bazel" + } + }, + "cui__uluru-3.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "794a32261a1f5eb6a4462c81b59cec87b5c27d5deea7dd1ac8fc781c41d226db", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/uluru/3.0.0/download" + ], + "strip_prefix": "uluru-3.0.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.uluru-3.0.0.bazel" + } + }, + "cui__unic-char-property-0.9.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unic-char-property/0.9.0/download" + ], + "strip_prefix": "unic-char-property-0.9.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unic-char-property-0.9.0.bazel" + } + }, + "cui__unic-char-range-0.9.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unic-char-range/0.9.0/download" + ], + "strip_prefix": "unic-char-range-0.9.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unic-char-range-0.9.0.bazel" + } + }, + "cui__unic-common-0.9.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unic-common/0.9.0/download" + ], + "strip_prefix": "unic-common-0.9.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unic-common-0.9.0.bazel" + } + }, + "cui__unic-segment-0.9.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unic-segment/0.9.0/download" + ], + "strip_prefix": "unic-segment-0.9.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unic-segment-0.9.0.bazel" + } + }, + "cui__unic-ucd-segment-0.9.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unic-ucd-segment/0.9.0/download" + ], + "strip_prefix": "unic-ucd-segment-0.9.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unic-ucd-segment-0.9.0.bazel" + } + }, + "cui__unic-ucd-version-0.9.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unic-ucd-version/0.9.0/download" + ], + "strip_prefix": "unic-ucd-version-0.9.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unic-ucd-version-0.9.0.bazel" + } + }, + "cui__unicode-bidi-0.3.13": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unicode-bidi/0.3.13/download" + ], + "strip_prefix": "unicode-bidi-0.3.13", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unicode-bidi-0.3.13.bazel" + } + }, + "cui__unicode-bom-2.0.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "98e90c70c9f0d4d1ee6d0a7d04aa06cb9bbd53d8cfbdd62a0269a7c2eb640552", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unicode-bom/2.0.2/download" + ], + "strip_prefix": "unicode-bom-2.0.2", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unicode-bom-2.0.2.bazel" + } + }, + "cui__unicode-ident-1.0.10": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unicode-ident/1.0.10/download" + ], + "strip_prefix": "unicode-ident-1.0.10", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unicode-ident-1.0.10.bazel" + } + }, + "cui__unicode-linebreak-0.1.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unicode-linebreak/0.1.5/download" + ], + "strip_prefix": "unicode-linebreak-0.1.5", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unicode-linebreak-0.1.5.bazel" + } + }, + "cui__unicode-normalization-0.1.22": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unicode-normalization/0.1.22/download" + ], + "strip_prefix": "unicode-normalization-0.1.22", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unicode-normalization-0.1.22.bazel" + } + }, + "cui__unicode-width-0.1.10": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unicode-width/0.1.10/download" + ], + "strip_prefix": "unicode-width-0.1.10", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unicode-width-0.1.10.bazel" + } + }, + "cui__url-2.5.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/url/2.5.2/download" + ], + "strip_prefix": "url-2.5.2", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.url-2.5.2.bazel" + } + }, + "cui__utf8parse-0.2.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/utf8parse/0.2.1/download" + ], + "strip_prefix": "utf8parse-0.2.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.utf8parse-0.2.1.bazel" + } + }, + "cui__valuable-0.1.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/valuable/0.1.0/download" + ], + "strip_prefix": "valuable-0.1.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.valuable-0.1.0.bazel" + } + }, + "cui__version_check-0.9.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/version_check/0.9.4/download" + ], + "strip_prefix": "version_check-0.9.4", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.version_check-0.9.4.bazel" + } + }, + "cui__walkdir-2.3.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/walkdir/2.3.3/download" + ], + "strip_prefix": "walkdir-2.3.3", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.walkdir-2.3.3.bazel" + } + }, + "cui__winapi-0.3.9": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winapi/0.3.9/download" + ], + "strip_prefix": "winapi-0.3.9", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.winapi-0.3.9.bazel" + } + }, + "cui__winapi-i686-pc-windows-gnu-0.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winapi-i686-pc-windows-gnu/0.4.0/download" + ], + "strip_prefix": "winapi-i686-pc-windows-gnu-0.4.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.winapi-i686-pc-windows-gnu-0.4.0.bazel" + } + }, + "cui__winapi-util-0.1.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winapi-util/0.1.5/download" + ], + "strip_prefix": "winapi-util-0.1.5", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.winapi-util-0.1.5.bazel" + } + }, + "cui__winapi-x86_64-pc-windows-gnu-0.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download" + ], + "strip_prefix": "winapi-x86_64-pc-windows-gnu-0.4.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.winapi-x86_64-pc-windows-gnu-0.4.0.bazel" + } + }, + "cui__windows-sys-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows-sys/0.48.0/download" + ], + "strip_prefix": "windows-sys-0.48.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows-sys-0.48.0.bazel" + } + }, + "cui__windows-sys-0.52.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows-sys/0.52.0/download" + ], + "strip_prefix": "windows-sys-0.52.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows-sys-0.52.0.bazel" + } + }, + "cui__windows-sys-0.59.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows-sys/0.59.0/download" + ], + "strip_prefix": "windows-sys-0.59.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows-sys-0.59.0.bazel" + } + }, + "cui__windows-targets-0.48.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows-targets/0.48.1/download" + ], + "strip_prefix": "windows-targets-0.48.1", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows-targets-0.48.1.bazel" + } + }, + "cui__windows-targets-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows-targets/0.52.6/download" + ], + "strip_prefix": "windows-targets-0.52.6", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows-targets-0.52.6.bazel" + } + }, + "cui__windows_aarch64_gnullvm-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.0/download" + ], + "strip_prefix": "windows_aarch64_gnullvm-0.48.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_aarch64_gnullvm-0.48.0.bazel" + } + }, + "cui__windows_aarch64_gnullvm-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download" + ], + "strip_prefix": "windows_aarch64_gnullvm-0.52.6", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel" + } + }, + "cui__windows_aarch64_msvc-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_aarch64_msvc/0.48.0/download" + ], + "strip_prefix": "windows_aarch64_msvc-0.48.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_aarch64_msvc-0.48.0.bazel" + } + }, + "cui__windows_aarch64_msvc-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download" + ], + "strip_prefix": "windows_aarch64_msvc-0.52.6", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_aarch64_msvc-0.52.6.bazel" + } + }, + "cui__windows_i686_gnu-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_i686_gnu/0.48.0/download" + ], + "strip_prefix": "windows_i686_gnu-0.48.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_i686_gnu-0.48.0.bazel" + } + }, + "cui__windows_i686_gnu-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_i686_gnu/0.52.6/download" + ], + "strip_prefix": "windows_i686_gnu-0.52.6", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_i686_gnu-0.52.6.bazel" + } + }, + "cui__windows_i686_gnullvm-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download" + ], + "strip_prefix": "windows_i686_gnullvm-0.52.6", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_i686_gnullvm-0.52.6.bazel" + } + }, + "cui__windows_i686_msvc-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_i686_msvc/0.48.0/download" + ], + "strip_prefix": "windows_i686_msvc-0.48.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_i686_msvc-0.48.0.bazel" + } + }, + "cui__windows_i686_msvc-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_i686_msvc/0.52.6/download" + ], + "strip_prefix": "windows_i686_msvc-0.52.6", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_i686_msvc-0.52.6.bazel" + } + }, + "cui__windows_x86_64_gnu-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_x86_64_gnu/0.48.0/download" + ], + "strip_prefix": "windows_x86_64_gnu-0.48.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_x86_64_gnu-0.48.0.bazel" + } + }, + "cui__windows_x86_64_gnu-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download" + ], + "strip_prefix": "windows_x86_64_gnu-0.52.6", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_x86_64_gnu-0.52.6.bazel" + } + }, + "cui__windows_x86_64_gnullvm-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.0/download" + ], + "strip_prefix": "windows_x86_64_gnullvm-0.48.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_x86_64_gnullvm-0.48.0.bazel" + } + }, + "cui__windows_x86_64_gnullvm-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download" + ], + "strip_prefix": "windows_x86_64_gnullvm-0.52.6", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel" + } + }, + "cui__windows_x86_64_msvc-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_x86_64_msvc/0.48.0/download" + ], + "strip_prefix": "windows_x86_64_msvc-0.48.0", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_x86_64_msvc-0.48.0.bazel" + } + }, + "cui__windows_x86_64_msvc-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download" + ], + "strip_prefix": "windows_x86_64_msvc-0.52.6", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_x86_64_msvc-0.52.6.bazel" + } + }, + "cui__winnow-0.6.20": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winnow/0.6.20/download" + ], + "strip_prefix": "winnow-0.6.20", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.winnow-0.6.20.bazel" + } + }, + "cui__zerocopy-0.7.35": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/zerocopy/0.7.35/download" + ], + "strip_prefix": "zerocopy-0.7.35", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.zerocopy-0.7.35.bazel" + } + }, + "cui__zerocopy-derive-0.7.35": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/zerocopy-derive/0.7.35/download" + ], + "strip_prefix": "zerocopy-derive-0.7.35", + "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.zerocopy-derive-0.7.35.bazel" + } + }, + "cargo_bazel.buildifier-darwin-amd64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "urls": [ + "https://github.com/bazelbuild/buildtools/releases/download/v7.3.1/buildifier-darwin-amd64" + ], + "integrity": "sha256-N1+CMQPQFiCq7CCgwpxsvKmfT9ByWuMLk2VcZwT0TXE=", + "downloaded_file_path": "buildifier", + "executable": true + } + }, + "cargo_bazel.buildifier-darwin-arm64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "urls": [ + "https://github.com/bazelbuild/buildtools/releases/download/v7.3.1/buildifier-darwin-arm64" + ], + "integrity": "sha256-Wmr8asegn1RVuguJvZnVriO0F03F3J1sDtXOjKrD+BM=", + "downloaded_file_path": "buildifier", + "executable": true + } + }, + "cargo_bazel.buildifier-linux-amd64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "urls": [ + "https://github.com/bazelbuild/buildtools/releases/download/v7.3.1/buildifier-linux-amd64" + ], + "integrity": "sha256-VHTMUSinToBng9VAgfWBZixL6K5lAi9VfpKB7V3IgAk=", + "downloaded_file_path": "buildifier", + "executable": true + } + }, + "cargo_bazel.buildifier-linux-arm64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "urls": [ + "https://github.com/bazelbuild/buildtools/releases/download/v7.3.1/buildifier-linux-arm64" + ], + "integrity": "sha256-C/hsS//69PCO7Xe95bIILkrlA5oR4uiwOYTBc8NKVhw=", + "downloaded_file_path": "buildifier", + "executable": true + } + }, + "cargo_bazel.buildifier-linux-s390x": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "urls": [ + "https://github.com/bazelbuild/buildtools/releases/download/v7.3.1/buildifier-linux-s390x" + ], + "integrity": "sha256-4tef9YhdRSdPdlMfGtvHtzoSn1nnZ/d36PveYz2dTi4=", + "downloaded_file_path": "buildifier", + "executable": true + } + }, + "cargo_bazel.buildifier-windows-amd64.exe": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_file", + "attributes": { + "urls": [ + "https://github.com/bazelbuild/buildtools/releases/download/v7.3.1/buildifier-windows-amd64.exe" + ], + "integrity": "sha256-NwzVdgda0pkwqC9d4TLxod5AhMeEqCUUvU2oDIWs9Kg=", + "downloaded_file_path": "buildifier.exe", + "executable": true + } + }, + "rules_rust_prost": { + "bzlFile": "@@rules_rust~//crate_universe/private:crates_vendor.bzl", + "ruleClassName": "crates_vendor_remote_repository", + "attributes": { + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.bazel", + "defs_module": "@@rules_rust~//proto/prost/private/3rdparty/crates:defs.bzl" + } + }, + "rules_rust_prost__addr2line-0.22.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/addr2line/0.22.0/download" + ], + "strip_prefix": "addr2line-0.22.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.addr2line-0.22.0.bazel" + } + }, + "rules_rust_prost__adler-1.0.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/adler/1.0.2/download" + ], + "strip_prefix": "adler-1.0.2", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.adler-1.0.2.bazel" + } + }, + "rules_rust_prost__aho-corasick-1.1.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/aho-corasick/1.1.3/download" + ], + "strip_prefix": "aho-corasick-1.1.3", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.aho-corasick-1.1.3.bazel" + } + }, + "rules_rust_prost__anyhow-1.0.86": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anyhow/1.0.86/download" + ], + "strip_prefix": "anyhow-1.0.86", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.anyhow-1.0.86.bazel" + } + }, + "rules_rust_prost__async-stream-0.3.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/async-stream/0.3.5/download" + ], + "strip_prefix": "async-stream-0.3.5", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.async-stream-0.3.5.bazel" + } + }, + "rules_rust_prost__async-stream-impl-0.3.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/async-stream-impl/0.3.5/download" + ], + "strip_prefix": "async-stream-impl-0.3.5", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.async-stream-impl-0.3.5.bazel" + } + }, + "rules_rust_prost__async-trait-0.1.81": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/async-trait/0.1.81/download" + ], + "strip_prefix": "async-trait-0.1.81", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.async-trait-0.1.81.bazel" + } + }, + "rules_rust_prost__atomic-waker-1.1.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/atomic-waker/1.1.2/download" + ], + "strip_prefix": "atomic-waker-1.1.2", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.atomic-waker-1.1.2.bazel" + } + }, + "rules_rust_prost__autocfg-1.3.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/autocfg/1.3.0/download" + ], + "strip_prefix": "autocfg-1.3.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.autocfg-1.3.0.bazel" + } + }, + "rules_rust_prost__axum-0.7.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/axum/0.7.5/download" + ], + "strip_prefix": "axum-0.7.5", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.axum-0.7.5.bazel" + } + }, + "rules_rust_prost__axum-core-0.4.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/axum-core/0.4.3/download" + ], + "strip_prefix": "axum-core-0.4.3", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.axum-core-0.4.3.bazel" + } + }, + "rules_rust_prost__backtrace-0.3.73": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/backtrace/0.3.73/download" + ], + "strip_prefix": "backtrace-0.3.73", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.backtrace-0.3.73.bazel" + } + }, + "rules_rust_prost__base64-0.22.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/base64/0.22.1/download" + ], + "strip_prefix": "base64-0.22.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.base64-0.22.1.bazel" + } + }, + "rules_rust_prost__bitflags-2.6.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bitflags/2.6.0/download" + ], + "strip_prefix": "bitflags-2.6.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.bitflags-2.6.0.bazel" + } + }, + "rules_rust_prost__byteorder-1.5.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/byteorder/1.5.0/download" + ], + "strip_prefix": "byteorder-1.5.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.byteorder-1.5.0.bazel" + } + }, + "rules_rust_prost__bytes-1.7.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bytes/1.7.1/download" + ], + "strip_prefix": "bytes-1.7.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.bytes-1.7.1.bazel" + } + }, + "rules_rust_prost__cc-1.1.14": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "50d2eb3cd3d1bf4529e31c215ee6f93ec5a3d536d9f578f93d9d33ee19562932", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cc/1.1.14/download" + ], + "strip_prefix": "cc-1.1.14", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.cc-1.1.14.bazel" + } + }, + "rules_rust_prost__cfg-if-1.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cfg-if/1.0.0/download" + ], + "strip_prefix": "cfg-if-1.0.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.cfg-if-1.0.0.bazel" + } + }, + "rules_rust_prost__either-1.13.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/either/1.13.0/download" + ], + "strip_prefix": "either-1.13.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.either-1.13.0.bazel" + } + }, + "rules_rust_prost__equivalent-1.0.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/equivalent/1.0.1/download" + ], + "strip_prefix": "equivalent-1.0.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.equivalent-1.0.1.bazel" + } + }, + "rules_rust_prost__errno-0.3.9": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/errno/0.3.9/download" + ], + "strip_prefix": "errno-0.3.9", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.errno-0.3.9.bazel" + } + }, + "rules_rust_prost__fastrand-2.1.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/fastrand/2.1.1/download" + ], + "strip_prefix": "fastrand-2.1.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.fastrand-2.1.1.bazel" + } + }, + "rules_rust_prost__fixedbitset-0.4.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/fixedbitset/0.4.2/download" + ], + "strip_prefix": "fixedbitset-0.4.2", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.fixedbitset-0.4.2.bazel" + } + }, + "rules_rust_prost__fnv-1.0.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/fnv/1.0.7/download" + ], + "strip_prefix": "fnv-1.0.7", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.fnv-1.0.7.bazel" + } + }, + "rules_rust_prost__futures-channel-0.3.30": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/futures-channel/0.3.30/download" + ], + "strip_prefix": "futures-channel-0.3.30", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.futures-channel-0.3.30.bazel" + } + }, + "rules_rust_prost__futures-core-0.3.30": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/futures-core/0.3.30/download" + ], + "strip_prefix": "futures-core-0.3.30", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.futures-core-0.3.30.bazel" + } + }, + "rules_rust_prost__futures-sink-0.3.30": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/futures-sink/0.3.30/download" + ], + "strip_prefix": "futures-sink-0.3.30", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.futures-sink-0.3.30.bazel" + } + }, + "rules_rust_prost__futures-task-0.3.30": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/futures-task/0.3.30/download" + ], + "strip_prefix": "futures-task-0.3.30", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.futures-task-0.3.30.bazel" + } + }, + "rules_rust_prost__futures-util-0.3.30": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/futures-util/0.3.30/download" + ], + "strip_prefix": "futures-util-0.3.30", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.futures-util-0.3.30.bazel" + } + }, + "rules_rust_prost__getrandom-0.2.15": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/getrandom/0.2.15/download" + ], + "strip_prefix": "getrandom-0.2.15", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.getrandom-0.2.15.bazel" + } + }, + "rules_rust_prost__gimli-0.29.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/gimli/0.29.0/download" + ], + "strip_prefix": "gimli-0.29.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.gimli-0.29.0.bazel" + } + }, + "rules_rust_prost__h2-0.4.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/h2/0.4.6/download" + ], + "strip_prefix": "h2-0.4.6", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.h2-0.4.6.bazel" + } + }, + "rules_rust_prost__hashbrown-0.12.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/hashbrown/0.12.3/download" + ], + "strip_prefix": "hashbrown-0.12.3", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.hashbrown-0.12.3.bazel" + } + }, + "rules_rust_prost__hashbrown-0.14.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/hashbrown/0.14.5/download" + ], + "strip_prefix": "hashbrown-0.14.5", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.hashbrown-0.14.5.bazel" + } + }, + "rules_rust_prost__heck-0.5.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/heck/0.5.0/download" + ], + "strip_prefix": "heck-0.5.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.heck-0.5.0.bazel" + } + }, + "rules_rust_prost__hermit-abi-0.3.9": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/hermit-abi/0.3.9/download" + ], + "strip_prefix": "hermit-abi-0.3.9", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.hermit-abi-0.3.9.bazel" + } + }, + "rules_rust_prost__http-1.1.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/http/1.1.0/download" + ], + "strip_prefix": "http-1.1.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.http-1.1.0.bazel" + } + }, + "rules_rust_prost__http-body-1.0.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/http-body/1.0.1/download" + ], + "strip_prefix": "http-body-1.0.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.http-body-1.0.1.bazel" + } + }, + "rules_rust_prost__http-body-util-0.1.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/http-body-util/0.1.2/download" + ], + "strip_prefix": "http-body-util-0.1.2", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.http-body-util-0.1.2.bazel" + } + }, + "rules_rust_prost__httparse-1.9.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/httparse/1.9.4/download" + ], + "strip_prefix": "httparse-1.9.4", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.httparse-1.9.4.bazel" + } + }, + "rules_rust_prost__httpdate-1.0.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/httpdate/1.0.3/download" + ], + "strip_prefix": "httpdate-1.0.3", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.httpdate-1.0.3.bazel" + } + }, + "rules_rust_prost__hyper-1.4.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/hyper/1.4.1/download" + ], + "strip_prefix": "hyper-1.4.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.hyper-1.4.1.bazel" + } + }, + "rules_rust_prost__hyper-timeout-0.5.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/hyper-timeout/0.5.1/download" + ], + "strip_prefix": "hyper-timeout-0.5.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.hyper-timeout-0.5.1.bazel" + } + }, + "rules_rust_prost__hyper-util-0.1.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/hyper-util/0.1.7/download" + ], + "strip_prefix": "hyper-util-0.1.7", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.hyper-util-0.1.7.bazel" + } + }, + "rules_rust_prost__indexmap-1.9.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/indexmap/1.9.3/download" + ], + "strip_prefix": "indexmap-1.9.3", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.indexmap-1.9.3.bazel" + } + }, + "rules_rust_prost__indexmap-2.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/indexmap/2.4.0/download" + ], + "strip_prefix": "indexmap-2.4.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.indexmap-2.4.0.bazel" + } + }, + "rules_rust_prost__itertools-0.13.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/itertools/0.13.0/download" + ], + "strip_prefix": "itertools-0.13.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.itertools-0.13.0.bazel" + } + }, + "rules_rust_prost__itoa-1.0.11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/itoa/1.0.11/download" + ], + "strip_prefix": "itoa-1.0.11", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.itoa-1.0.11.bazel" + } + }, + "rules_rust_prost__libc-0.2.158": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/libc/0.2.158/download" + ], + "strip_prefix": "libc-0.2.158", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.libc-0.2.158.bazel" + } + }, + "rules_rust_prost__linux-raw-sys-0.4.14": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/linux-raw-sys/0.4.14/download" + ], + "strip_prefix": "linux-raw-sys-0.4.14", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.linux-raw-sys-0.4.14.bazel" + } + }, + "rules_rust_prost__lock_api-0.4.12": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/lock_api/0.4.12/download" + ], + "strip_prefix": "lock_api-0.4.12", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.lock_api-0.4.12.bazel" + } + }, + "rules_rust_prost__log-0.4.22": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/log/0.4.22/download" + ], + "strip_prefix": "log-0.4.22", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.log-0.4.22.bazel" + } + }, + "rules_rust_prost__matchit-0.7.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/matchit/0.7.3/download" + ], + "strip_prefix": "matchit-0.7.3", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.matchit-0.7.3.bazel" + } + }, + "rules_rust_prost__memchr-2.7.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/memchr/2.7.4/download" + ], + "strip_prefix": "memchr-2.7.4", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.memchr-2.7.4.bazel" + } + }, + "rules_rust_prost__mime-0.3.17": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/mime/0.3.17/download" + ], + "strip_prefix": "mime-0.3.17", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.mime-0.3.17.bazel" + } + }, + "rules_rust_prost__miniz_oxide-0.7.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/miniz_oxide/0.7.4/download" + ], + "strip_prefix": "miniz_oxide-0.7.4", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.miniz_oxide-0.7.4.bazel" + } + }, + "rules_rust_prost__mio-1.0.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/mio/1.0.2/download" + ], + "strip_prefix": "mio-1.0.2", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.mio-1.0.2.bazel" + } + }, + "rules_rust_prost__multimap-0.10.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/multimap/0.10.0/download" + ], + "strip_prefix": "multimap-0.10.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.multimap-0.10.0.bazel" + } + }, + "rules_rust_prost__object-0.36.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/object/0.36.3/download" + ], + "strip_prefix": "object-0.36.3", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.object-0.36.3.bazel" + } + }, + "rules_rust_prost__once_cell-1.19.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/once_cell/1.19.0/download" + ], + "strip_prefix": "once_cell-1.19.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.once_cell-1.19.0.bazel" + } + }, + "rules_rust_prost__parking_lot-0.12.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/parking_lot/0.12.3/download" + ], + "strip_prefix": "parking_lot-0.12.3", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.parking_lot-0.12.3.bazel" + } + }, + "rules_rust_prost__parking_lot_core-0.9.10": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/parking_lot_core/0.9.10/download" + ], + "strip_prefix": "parking_lot_core-0.9.10", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.parking_lot_core-0.9.10.bazel" + } + }, + "rules_rust_prost__percent-encoding-2.3.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/percent-encoding/2.3.1/download" + ], + "strip_prefix": "percent-encoding-2.3.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.percent-encoding-2.3.1.bazel" + } + }, + "rules_rust_prost__petgraph-0.6.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/petgraph/0.6.5/download" + ], + "strip_prefix": "petgraph-0.6.5", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.petgraph-0.6.5.bazel" + } + }, + "rules_rust_prost__pin-project-1.1.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/pin-project/1.1.5/download" + ], + "strip_prefix": "pin-project-1.1.5", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.pin-project-1.1.5.bazel" + } + }, + "rules_rust_prost__pin-project-internal-1.1.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/pin-project-internal/1.1.5/download" + ], + "strip_prefix": "pin-project-internal-1.1.5", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.pin-project-internal-1.1.5.bazel" + } + }, + "rules_rust_prost__pin-project-lite-0.2.14": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/pin-project-lite/0.2.14/download" + ], + "strip_prefix": "pin-project-lite-0.2.14", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.pin-project-lite-0.2.14.bazel" + } + }, + "rules_rust_prost__pin-utils-0.1.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/pin-utils/0.1.0/download" + ], + "strip_prefix": "pin-utils-0.1.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.pin-utils-0.1.0.bazel" + } + }, + "rules_rust_prost__ppv-lite86-0.2.20": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/ppv-lite86/0.2.20/download" + ], + "strip_prefix": "ppv-lite86-0.2.20", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.ppv-lite86-0.2.20.bazel" + } + }, + "rules_rust_prost__prettyplease-0.2.22": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/prettyplease/0.2.22/download" + ], + "strip_prefix": "prettyplease-0.2.22", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.prettyplease-0.2.22.bazel" + } + }, + "rules_rust_prost__proc-macro2-1.0.86": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/proc-macro2/1.0.86/download" + ], + "strip_prefix": "proc-macro2-1.0.86", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.proc-macro2-1.0.86.bazel" + } + }, + "rules_rust_prost__prost-0.13.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e13db3d3fde688c61e2446b4d843bc27a7e8af269a69440c0308021dc92333cc", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/prost/0.13.1/download" + ], + "strip_prefix": "prost-0.13.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.prost-0.13.1.bazel" + } + }, + "rules_rust_prost__prost-build-0.13.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5bb182580f71dd070f88d01ce3de9f4da5021db7115d2e1c3605a754153b77c1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/prost-build/0.13.1/download" + ], + "strip_prefix": "prost-build-0.13.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.prost-build-0.13.1.bazel" + } + }, + "rules_rust_prost__prost-derive-0.13.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "18bec9b0adc4eba778b33684b7ba3e7137789434769ee3ce3930463ef904cfca", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/prost-derive/0.13.1/download" + ], + "strip_prefix": "prost-derive-0.13.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.prost-derive-0.13.1.bazel" + } + }, + "rules_rust_prost__prost-types-0.13.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "cee5168b05f49d4b0ca581206eb14a7b22fafd963efe729ac48eb03266e25cc2", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/prost-types/0.13.1/download" + ], + "strip_prefix": "prost-types-0.13.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.prost-types-0.13.1.bazel" + } + }, + "rules_rust_prost__protoc-gen-prost-0.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "77eb17a7657a703f30cb9b7ba4d981e4037b8af2d819ab0077514b0bef537406", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/protoc-gen-prost/0.4.0/download" + ], + "strip_prefix": "protoc-gen-prost-0.4.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.protoc-gen-prost-0.4.0.bazel" + } + }, + "rules_rust_prost__protoc-gen-tonic-0.4.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "6ab6a0d73a0914752ed8fd7cc51afe169e28da87be3efef292de5676cc527634", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/protoc-gen-tonic/0.4.1/download" + ], + "strip_prefix": "protoc-gen-tonic-0.4.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.protoc-gen-tonic-0.4.1.bazel" + } + }, + "rules_rust_prost__quote-1.0.37": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/quote/1.0.37/download" + ], + "strip_prefix": "quote-1.0.37", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.quote-1.0.37.bazel" + } + }, + "rules_rust_prost__rand-0.8.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rand/0.8.5/download" + ], + "strip_prefix": "rand-0.8.5", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.rand-0.8.5.bazel" + } + }, + "rules_rust_prost__rand_chacha-0.3.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rand_chacha/0.3.1/download" + ], + "strip_prefix": "rand_chacha-0.3.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.rand_chacha-0.3.1.bazel" + } + }, + "rules_rust_prost__rand_core-0.6.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rand_core/0.6.4/download" + ], + "strip_prefix": "rand_core-0.6.4", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.rand_core-0.6.4.bazel" + } + }, + "rules_rust_prost__redox_syscall-0.5.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/redox_syscall/0.5.3/download" + ], + "strip_prefix": "redox_syscall-0.5.3", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.redox_syscall-0.5.3.bazel" + } + }, + "rules_rust_prost__regex-1.10.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/regex/1.10.6/download" + ], + "strip_prefix": "regex-1.10.6", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.regex-1.10.6.bazel" + } + }, + "rules_rust_prost__regex-automata-0.4.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/regex-automata/0.4.7/download" + ], + "strip_prefix": "regex-automata-0.4.7", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.regex-automata-0.4.7.bazel" + } + }, + "rules_rust_prost__regex-syntax-0.8.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/regex-syntax/0.8.4/download" + ], + "strip_prefix": "regex-syntax-0.8.4", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.regex-syntax-0.8.4.bazel" + } + }, + "rules_rust_prost__rustc-demangle-0.1.24": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rustc-demangle/0.1.24/download" + ], + "strip_prefix": "rustc-demangle-0.1.24", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.rustc-demangle-0.1.24.bazel" + } + }, + "rules_rust_prost__rustix-0.38.34": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rustix/0.38.34/download" + ], + "strip_prefix": "rustix-0.38.34", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.rustix-0.38.34.bazel" + } + }, + "rules_rust_prost__rustversion-1.0.17": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rustversion/1.0.17/download" + ], + "strip_prefix": "rustversion-1.0.17", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.rustversion-1.0.17.bazel" + } + }, + "rules_rust_prost__scopeguard-1.2.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/scopeguard/1.2.0/download" + ], + "strip_prefix": "scopeguard-1.2.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.scopeguard-1.2.0.bazel" + } + }, + "rules_rust_prost__serde-1.0.209": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/serde/1.0.209/download" + ], + "strip_prefix": "serde-1.0.209", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.serde-1.0.209.bazel" + } + }, + "rules_rust_prost__serde_derive-1.0.209": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/serde_derive/1.0.209/download" + ], + "strip_prefix": "serde_derive-1.0.209", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.serde_derive-1.0.209.bazel" + } + }, + "rules_rust_prost__shlex-1.3.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/shlex/1.3.0/download" + ], + "strip_prefix": "shlex-1.3.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.shlex-1.3.0.bazel" + } + }, + "rules_rust_prost__signal-hook-registry-1.4.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/signal-hook-registry/1.4.2/download" + ], + "strip_prefix": "signal-hook-registry-1.4.2", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.signal-hook-registry-1.4.2.bazel" + } + }, + "rules_rust_prost__slab-0.4.9": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/slab/0.4.9/download" + ], + "strip_prefix": "slab-0.4.9", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.slab-0.4.9.bazel" + } + }, + "rules_rust_prost__smallvec-1.13.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/smallvec/1.13.2/download" + ], + "strip_prefix": "smallvec-1.13.2", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.smallvec-1.13.2.bazel" + } + }, + "rules_rust_prost__socket2-0.5.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/socket2/0.5.7/download" + ], + "strip_prefix": "socket2-0.5.7", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.socket2-0.5.7.bazel" + } + }, + "rules_rust_prost__syn-2.0.76": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/syn/2.0.76/download" + ], + "strip_prefix": "syn-2.0.76", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.syn-2.0.76.bazel" + } + }, + "rules_rust_prost__sync_wrapper-0.1.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/sync_wrapper/0.1.2/download" + ], + "strip_prefix": "sync_wrapper-0.1.2", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.sync_wrapper-0.1.2.bazel" + } + }, + "rules_rust_prost__sync_wrapper-1.0.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/sync_wrapper/1.0.1/download" + ], + "strip_prefix": "sync_wrapper-1.0.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.sync_wrapper-1.0.1.bazel" + } + }, + "rules_rust_prost__tempfile-3.12.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tempfile/3.12.0/download" + ], + "strip_prefix": "tempfile-3.12.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tempfile-3.12.0.bazel" + } + }, + "rules_rust_prost__tokio-1.39.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio/1.39.3/download" + ], + "strip_prefix": "tokio-1.39.3", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tokio-1.39.3.bazel" + } + }, + "rules_rust_prost__tokio-macros-2.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-macros/2.4.0/download" + ], + "strip_prefix": "tokio-macros-2.4.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tokio-macros-2.4.0.bazel" + } + }, + "rules_rust_prost__tokio-stream-0.1.15": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-stream/0.1.15/download" + ], + "strip_prefix": "tokio-stream-0.1.15", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tokio-stream-0.1.15.bazel" + } + }, + "rules_rust_prost__tokio-util-0.7.11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-util/0.7.11/download" + ], + "strip_prefix": "tokio-util-0.7.11", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tokio-util-0.7.11.bazel" + } + }, + "rules_rust_prost__tonic-0.12.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "38659f4a91aba8598d27821589f5db7dddd94601e7a01b1e485a50e5484c7401", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tonic/0.12.1/download" + ], + "strip_prefix": "tonic-0.12.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tonic-0.12.1.bazel" + } + }, + "rules_rust_prost__tonic-build-0.12.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "568392c5a2bd0020723e3f387891176aabafe36fd9fcd074ad309dfa0c8eb964", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tonic-build/0.12.1/download" + ], + "strip_prefix": "tonic-build-0.12.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tonic-build-0.12.1.bazel" + } + }, + "rules_rust_prost__tower-0.4.13": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tower/0.4.13/download" + ], + "strip_prefix": "tower-0.4.13", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tower-0.4.13.bazel" + } + }, + "rules_rust_prost__tower-layer-0.3.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tower-layer/0.3.3/download" + ], + "strip_prefix": "tower-layer-0.3.3", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tower-layer-0.3.3.bazel" + } + }, + "rules_rust_prost__tower-service-0.3.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tower-service/0.3.3/download" + ], + "strip_prefix": "tower-service-0.3.3", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tower-service-0.3.3.bazel" + } + }, + "rules_rust_prost__tracing-0.1.40": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tracing/0.1.40/download" + ], + "strip_prefix": "tracing-0.1.40", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tracing-0.1.40.bazel" + } + }, + "rules_rust_prost__tracing-attributes-0.1.27": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tracing-attributes/0.1.27/download" + ], + "strip_prefix": "tracing-attributes-0.1.27", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tracing-attributes-0.1.27.bazel" + } + }, + "rules_rust_prost__tracing-core-0.1.32": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tracing-core/0.1.32/download" + ], + "strip_prefix": "tracing-core-0.1.32", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tracing-core-0.1.32.bazel" + } + }, + "rules_rust_prost__try-lock-0.2.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/try-lock/0.2.5/download" + ], + "strip_prefix": "try-lock-0.2.5", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.try-lock-0.2.5.bazel" + } + }, + "rules_rust_prost__unicode-ident-1.0.12": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unicode-ident/1.0.12/download" + ], + "strip_prefix": "unicode-ident-1.0.12", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.unicode-ident-1.0.12.bazel" + } + }, + "rules_rust_prost__want-0.3.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/want/0.3.1/download" + ], + "strip_prefix": "want-0.3.1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.want-0.3.1.bazel" + } + }, + "rules_rust_prost__wasi-0.11.0-wasi-snapshot-preview1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wasi/0.11.0+wasi-snapshot-preview1/download" + ], + "strip_prefix": "wasi-0.11.0+wasi-snapshot-preview1", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.wasi-0.11.0+wasi-snapshot-preview1.bazel" + } + }, + "rules_rust_prost__windows-sys-0.52.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows-sys/0.52.0/download" + ], + "strip_prefix": "windows-sys-0.52.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows-sys-0.52.0.bazel" + } + }, + "rules_rust_prost__windows-sys-0.59.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows-sys/0.59.0/download" + ], + "strip_prefix": "windows-sys-0.59.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows-sys-0.59.0.bazel" + } + }, + "rules_rust_prost__windows-targets-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows-targets/0.52.6/download" + ], + "strip_prefix": "windows-targets-0.52.6", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows-targets-0.52.6.bazel" + } + }, + "rules_rust_prost__windows_aarch64_gnullvm-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download" + ], + "strip_prefix": "windows_aarch64_gnullvm-0.52.6", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel" + } + }, + "rules_rust_prost__windows_aarch64_msvc-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download" + ], + "strip_prefix": "windows_aarch64_msvc-0.52.6", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows_aarch64_msvc-0.52.6.bazel" + } + }, + "rules_rust_prost__windows_i686_gnu-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_i686_gnu/0.52.6/download" + ], + "strip_prefix": "windows_i686_gnu-0.52.6", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows_i686_gnu-0.52.6.bazel" + } + }, + "rules_rust_prost__windows_i686_gnullvm-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download" + ], + "strip_prefix": "windows_i686_gnullvm-0.52.6", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows_i686_gnullvm-0.52.6.bazel" + } + }, + "rules_rust_prost__windows_i686_msvc-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_i686_msvc/0.52.6/download" + ], + "strip_prefix": "windows_i686_msvc-0.52.6", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows_i686_msvc-0.52.6.bazel" + } + }, + "rules_rust_prost__windows_x86_64_gnu-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download" + ], + "strip_prefix": "windows_x86_64_gnu-0.52.6", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows_x86_64_gnu-0.52.6.bazel" + } + }, + "rules_rust_prost__windows_x86_64_gnullvm-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download" + ], + "strip_prefix": "windows_x86_64_gnullvm-0.52.6", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel" + } + }, + "rules_rust_prost__windows_x86_64_msvc-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download" + ], + "strip_prefix": "windows_x86_64_msvc-0.52.6", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows_x86_64_msvc-0.52.6.bazel" + } + }, + "rules_rust_prost__zerocopy-0.7.35": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/zerocopy/0.7.35/download" + ], + "strip_prefix": "zerocopy-0.7.35", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.zerocopy-0.7.35.bazel" + } + }, + "rules_rust_prost__zerocopy-derive-0.7.35": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/zerocopy-derive/0.7.35/download" + ], + "strip_prefix": "zerocopy-derive-0.7.35", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.zerocopy-derive-0.7.35.bazel" + } + }, + "rules_rust_prost__heck": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "integrity": "sha256-IwTgCYP4f/s4tVtES147YKiEtdMMD8p9gv4zRJu+Veo=", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/heck/heck-0.5.0.crate" + ], + "strip_prefix": "heck-0.5.0", + "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.heck-0.5.0.bazel" + } + }, + "rules_rust_proto__autocfg-1.1.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/autocfg/1.1.0/download" + ], + "strip_prefix": "autocfg-1.1.0", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.autocfg-1.1.0.bazel" + } + }, + "rules_rust_proto__base64-0.9.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/base64/0.9.3/download" + ], + "strip_prefix": "base64-0.9.3", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.base64-0.9.3.bazel" + } + }, + "rules_rust_proto__bitflags-1.3.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bitflags/1.3.2/download" + ], + "strip_prefix": "bitflags-1.3.2", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.bitflags-1.3.2.bazel" + } + }, + "rules_rust_proto__byteorder-1.4.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/byteorder/1.4.3/download" + ], + "strip_prefix": "byteorder-1.4.3", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.byteorder-1.4.3.bazel" + } + }, + "rules_rust_proto__bytes-0.4.12": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bytes/0.4.12/download" + ], + "strip_prefix": "bytes-0.4.12", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.bytes-0.4.12.bazel" + } + }, + "rules_rust_proto__cfg-if-0.1.10": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cfg-if/0.1.10/download" + ], + "strip_prefix": "cfg-if-0.1.10", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.cfg-if-0.1.10.bazel" + } + }, + "rules_rust_proto__cfg-if-1.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cfg-if/1.0.0/download" + ], + "strip_prefix": "cfg-if-1.0.0", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.cfg-if-1.0.0.bazel" + } + }, + "rules_rust_proto__cloudabi-0.0.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cloudabi/0.0.3/download" + ], + "strip_prefix": "cloudabi-0.0.3", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.cloudabi-0.0.3.bazel" + } + }, + "rules_rust_proto__crossbeam-deque-0.7.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "c20ff29ded3204c5106278a81a38f4b482636ed4fa1e6cfbeef193291beb29ed", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/crossbeam-deque/0.7.4/download" + ], + "strip_prefix": "crossbeam-deque-0.7.4", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.crossbeam-deque-0.7.4.bazel" + } + }, + "rules_rust_proto__crossbeam-epoch-0.8.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/crossbeam-epoch/0.8.2/download" + ], + "strip_prefix": "crossbeam-epoch-0.8.2", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.crossbeam-epoch-0.8.2.bazel" + } + }, + "rules_rust_proto__crossbeam-queue-0.2.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/crossbeam-queue/0.2.3/download" + ], + "strip_prefix": "crossbeam-queue-0.2.3", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.crossbeam-queue-0.2.3.bazel" + } + }, + "rules_rust_proto__crossbeam-utils-0.7.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/crossbeam-utils/0.7.2/download" + ], + "strip_prefix": "crossbeam-utils-0.7.2", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.crossbeam-utils-0.7.2.bazel" + } + }, + "rules_rust_proto__fnv-1.0.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/fnv/1.0.7/download" + ], + "strip_prefix": "fnv-1.0.7", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.fnv-1.0.7.bazel" + } + }, + "rules_rust_proto__fuchsia-zircon-0.3.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/fuchsia-zircon/0.3.3/download" + ], + "strip_prefix": "fuchsia-zircon-0.3.3", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.fuchsia-zircon-0.3.3.bazel" + } + }, + "rules_rust_proto__fuchsia-zircon-sys-0.3.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/fuchsia-zircon-sys/0.3.3/download" + ], + "strip_prefix": "fuchsia-zircon-sys-0.3.3", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.fuchsia-zircon-sys-0.3.3.bazel" + } + }, + "rules_rust_proto__futures-0.1.31": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/futures/0.1.31/download" + ], + "strip_prefix": "futures-0.1.31", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.futures-0.1.31.bazel" + } + }, + "rules_rust_proto__futures-cpupool-0.1.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/futures-cpupool/0.1.8/download" + ], + "strip_prefix": "futures-cpupool-0.1.8", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.futures-cpupool-0.1.8.bazel" + } + }, + "rules_rust_proto__grpc-0.6.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2aaf1d741fe6f3413f1f9f71b99f5e4e26776d563475a8a53ce53a73a8534c1d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/grpc/0.6.2/download" + ], + "strip_prefix": "grpc-0.6.2", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.grpc-0.6.2.bazel" + } + }, + "rules_rust_proto__grpc-compiler-0.6.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "907274ce8ee7b40a0d0b0db09022ea22846a47cfb1fc8ad2c983c70001b4ffb1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/grpc-compiler/0.6.2/download" + ], + "strip_prefix": "grpc-compiler-0.6.2", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.grpc-compiler-0.6.2.bazel" + } + }, + "rules_rust_proto__hermit-abi-0.2.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/hermit-abi/0.2.6/download" + ], + "strip_prefix": "hermit-abi-0.2.6", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.hermit-abi-0.2.6.bazel" + } + }, + "rules_rust_proto__httpbis-0.7.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "7689cfa896b2a71da4f16206af167542b75d242b6906313e53857972a92d5614", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/httpbis/0.7.0/download" + ], + "strip_prefix": "httpbis-0.7.0", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.httpbis-0.7.0.bazel" + } + }, + "rules_rust_proto__iovec-0.1.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/iovec/0.1.4/download" + ], + "strip_prefix": "iovec-0.1.4", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.iovec-0.1.4.bazel" + } + }, + "rules_rust_proto__kernel32-sys-0.2.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/kernel32-sys/0.2.2/download" + ], + "strip_prefix": "kernel32-sys-0.2.2", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.kernel32-sys-0.2.2.bazel" + } + }, + "rules_rust_proto__lazy_static-1.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/lazy_static/1.4.0/download" + ], + "strip_prefix": "lazy_static-1.4.0", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.lazy_static-1.4.0.bazel" + } + }, + "rules_rust_proto__libc-0.2.139": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/libc/0.2.139/download" + ], + "strip_prefix": "libc-0.2.139", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.libc-0.2.139.bazel" + } + }, + "rules_rust_proto__lock_api-0.3.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/lock_api/0.3.4/download" + ], + "strip_prefix": "lock_api-0.3.4", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.lock_api-0.3.4.bazel" + } + }, + "rules_rust_proto__log-0.3.9": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/log/0.3.9/download" + ], + "strip_prefix": "log-0.3.9", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.log-0.3.9.bazel" + } + }, + "rules_rust_proto__log-0.4.17": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/log/0.4.17/download" + ], + "strip_prefix": "log-0.4.17", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.log-0.4.17.bazel" + } + }, + "rules_rust_proto__maybe-uninit-2.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/maybe-uninit/2.0.0/download" + ], + "strip_prefix": "maybe-uninit-2.0.0", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.maybe-uninit-2.0.0.bazel" + } + }, + "rules_rust_proto__memoffset-0.5.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/memoffset/0.5.6/download" + ], + "strip_prefix": "memoffset-0.5.6", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.memoffset-0.5.6.bazel" + } + }, + "rules_rust_proto__mio-0.6.23": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/mio/0.6.23/download" + ], + "strip_prefix": "mio-0.6.23", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.mio-0.6.23.bazel" + } + }, + "rules_rust_proto__mio-uds-0.6.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/mio-uds/0.6.8/download" + ], + "strip_prefix": "mio-uds-0.6.8", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.mio-uds-0.6.8.bazel" + } + }, + "rules_rust_proto__miow-0.2.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/miow/0.2.2/download" + ], + "strip_prefix": "miow-0.2.2", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.miow-0.2.2.bazel" + } + }, + "rules_rust_proto__net2-0.2.38": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/net2/0.2.38/download" + ], + "strip_prefix": "net2-0.2.38", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.net2-0.2.38.bazel" + } + }, + "rules_rust_proto__num_cpus-1.15.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/num_cpus/1.15.0/download" + ], + "strip_prefix": "num_cpus-1.15.0", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.num_cpus-1.15.0.bazel" + } + }, + "rules_rust_proto__parking_lot-0.9.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/parking_lot/0.9.0/download" + ], + "strip_prefix": "parking_lot-0.9.0", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.parking_lot-0.9.0.bazel" + } + }, + "rules_rust_proto__parking_lot_core-0.6.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "bda66b810a62be75176a80873726630147a5ca780cd33921e0b5709033e66b0a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/parking_lot_core/0.6.3/download" + ], + "strip_prefix": "parking_lot_core-0.6.3", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.parking_lot_core-0.6.3.bazel" + } + }, + "rules_rust_proto__protobuf-2.8.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "patch_args": [ + "-p1" + ], + "patches": [ + "@@rules_rust~//proto/protobuf/3rdparty/patches:protobuf-2.8.2.patch" + ], + "sha256": "70731852eec72c56d11226c8a5f96ad5058a3dab73647ca5f7ee351e464f2571", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/protobuf/2.8.2/download" + ], + "strip_prefix": "protobuf-2.8.2", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.protobuf-2.8.2.bazel" + } + }, + "rules_rust_proto__protobuf-codegen-2.8.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3d74b9cbbf2ac9a7169c85a3714ec16c51ee9ec7cfd511549527e9a7df720795", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/protobuf-codegen/2.8.2/download" + ], + "strip_prefix": "protobuf-codegen-2.8.2", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.protobuf-codegen-2.8.2.bazel" + } + }, + "rules_rust_proto__redox_syscall-0.1.57": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/redox_syscall/0.1.57/download" + ], + "strip_prefix": "redox_syscall-0.1.57", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.redox_syscall-0.1.57.bazel" + } + }, + "rules_rust_proto__rustc_version-0.2.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rustc_version/0.2.3/download" + ], + "strip_prefix": "rustc_version-0.2.3", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.rustc_version-0.2.3.bazel" + } + }, + "rules_rust_proto__safemem-0.3.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/safemem/0.3.3/download" + ], + "strip_prefix": "safemem-0.3.3", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.safemem-0.3.3.bazel" + } + }, + "rules_rust_proto__scoped-tls-0.1.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "332ffa32bf586782a3efaeb58f127980944bbc8c4d6913a86107ac2a5ab24b28", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/scoped-tls/0.1.2/download" + ], + "strip_prefix": "scoped-tls-0.1.2", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.scoped-tls-0.1.2.bazel" + } + }, + "rules_rust_proto__scopeguard-1.1.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/scopeguard/1.1.0/download" + ], + "strip_prefix": "scopeguard-1.1.0", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.scopeguard-1.1.0.bazel" + } + }, + "rules_rust_proto__semver-0.9.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/semver/0.9.0/download" + ], + "strip_prefix": "semver-0.9.0", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.semver-0.9.0.bazel" + } + }, + "rules_rust_proto__semver-parser-0.7.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/semver-parser/0.7.0/download" + ], + "strip_prefix": "semver-parser-0.7.0", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.semver-parser-0.7.0.bazel" + } + }, + "rules_rust_proto__slab-0.3.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/slab/0.3.0/download" + ], + "strip_prefix": "slab-0.3.0", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.slab-0.3.0.bazel" + } + }, + "rules_rust_proto__slab-0.4.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/slab/0.4.7/download" + ], + "strip_prefix": "slab-0.4.7", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.slab-0.4.7.bazel" + } + }, + "rules_rust_proto__smallvec-0.6.14": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/smallvec/0.6.14/download" + ], + "strip_prefix": "smallvec-0.6.14", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.smallvec-0.6.14.bazel" + } + }, + "rules_rust_proto__tls-api-0.1.22": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "049c03787a0595182357fbd487577947f4351b78ce20c3668f6d49f17feb13d1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tls-api/0.1.22/download" + ], + "strip_prefix": "tls-api-0.1.22", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tls-api-0.1.22.bazel" + } + }, + "rules_rust_proto__tls-api-stub-0.1.22": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "c9a0cc8c149724db9de7d73a0e1bc80b1a74f5394f08c6f301e11f9c35fa061e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tls-api-stub/0.1.22/download" + ], + "strip_prefix": "tls-api-stub-0.1.22", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tls-api-stub-0.1.22.bazel" + } + }, + "rules_rust_proto__tokio-0.1.22": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio/0.1.22/download" + ], + "strip_prefix": "tokio-0.1.22", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-0.1.22.bazel" + } + }, + "rules_rust_proto__tokio-codec-0.1.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "25b2998660ba0e70d18684de5d06b70b70a3a747469af9dea7618cc59e75976b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-codec/0.1.2/download" + ], + "strip_prefix": "tokio-codec-0.1.2", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-codec-0.1.2.bazel" + } + }, + "rules_rust_proto__tokio-core-0.1.18": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "87b1395334443abca552f63d4f61d0486f12377c2ba8b368e523f89e828cffd4", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-core/0.1.18/download" + ], + "strip_prefix": "tokio-core-0.1.18", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-core-0.1.18.bazel" + } + }, + "rules_rust_proto__tokio-current-thread-0.1.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-current-thread/0.1.7/download" + ], + "strip_prefix": "tokio-current-thread-0.1.7", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-current-thread-0.1.7.bazel" + } + }, + "rules_rust_proto__tokio-executor-0.1.10": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-executor/0.1.10/download" + ], + "strip_prefix": "tokio-executor-0.1.10", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-executor-0.1.10.bazel" + } + }, + "rules_rust_proto__tokio-fs-0.1.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "297a1206e0ca6302a0eed35b700d292b275256f596e2f3fea7729d5e629b6ff4", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-fs/0.1.7/download" + ], + "strip_prefix": "tokio-fs-0.1.7", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-fs-0.1.7.bazel" + } + }, + "rules_rust_proto__tokio-io-0.1.13": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-io/0.1.13/download" + ], + "strip_prefix": "tokio-io-0.1.13", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-io-0.1.13.bazel" + } + }, + "rules_rust_proto__tokio-reactor-0.1.12": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-reactor/0.1.12/download" + ], + "strip_prefix": "tokio-reactor-0.1.12", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-reactor-0.1.12.bazel" + } + }, + "rules_rust_proto__tokio-sync-0.1.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-sync/0.1.8/download" + ], + "strip_prefix": "tokio-sync-0.1.8", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-sync-0.1.8.bazel" + } + }, + "rules_rust_proto__tokio-tcp-0.1.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-tcp/0.1.4/download" + ], + "strip_prefix": "tokio-tcp-0.1.4", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-tcp-0.1.4.bazel" + } + }, + "rules_rust_proto__tokio-threadpool-0.1.18": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-threadpool/0.1.18/download" + ], + "strip_prefix": "tokio-threadpool-0.1.18", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-threadpool-0.1.18.bazel" + } + }, + "rules_rust_proto__tokio-timer-0.1.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "6131e780037787ff1b3f8aad9da83bca02438b72277850dd6ad0d455e0e20efc", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-timer/0.1.2/download" + ], + "strip_prefix": "tokio-timer-0.1.2", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-timer-0.1.2.bazel" + } + }, + "rules_rust_proto__tokio-timer-0.2.13": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-timer/0.2.13/download" + ], + "strip_prefix": "tokio-timer-0.2.13", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-timer-0.2.13.bazel" + } + }, + "rules_rust_proto__tokio-tls-api-0.1.22": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "68d0e040d5b1f4cfca70ec4f371229886a5de5bb554d272a4a8da73004a7b2c9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-tls-api/0.1.22/download" + ], + "strip_prefix": "tokio-tls-api-0.1.22", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-tls-api-0.1.22.bazel" + } + }, + "rules_rust_proto__tokio-udp-0.1.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e2a0b10e610b39c38b031a2fcab08e4b82f16ece36504988dcbd81dbba650d82", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-udp/0.1.6/download" + ], + "strip_prefix": "tokio-udp-0.1.6", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-udp-0.1.6.bazel" + } + }, + "rules_rust_proto__tokio-uds-0.1.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "65ae5d255ce739e8537221ed2942e0445f4b3b813daebac1c0050ddaaa3587f9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-uds/0.1.7/download" + ], + "strip_prefix": "tokio-uds-0.1.7", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-uds-0.1.7.bazel" + } + }, + "rules_rust_proto__tokio-uds-0.2.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ab57a4ac4111c8c9dbcf70779f6fc8bc35ae4b2454809febac840ad19bd7e4e0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tokio-uds/0.2.7/download" + ], + "strip_prefix": "tokio-uds-0.2.7", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-uds-0.2.7.bazel" + } + }, + "rules_rust_proto__unix_socket-0.5.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "6aa2700417c405c38f5e6902d699345241c28c0b7ade4abaad71e35a87eb1564", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unix_socket/0.5.0/download" + ], + "strip_prefix": "unix_socket-0.5.0", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.unix_socket-0.5.0.bazel" + } + }, + "rules_rust_proto__void-1.0.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/void/1.0.2/download" + ], + "strip_prefix": "void-1.0.2", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.void-1.0.2.bazel" + } + }, + "rules_rust_proto__winapi-0.2.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winapi/0.2.8/download" + ], + "strip_prefix": "winapi-0.2.8", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.winapi-0.2.8.bazel" + } + }, + "rules_rust_proto__winapi-0.3.9": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winapi/0.3.9/download" + ], + "strip_prefix": "winapi-0.3.9", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.winapi-0.3.9.bazel" + } + }, + "rules_rust_proto__winapi-build-0.1.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winapi-build/0.1.1/download" + ], + "strip_prefix": "winapi-build-0.1.1", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.winapi-build-0.1.1.bazel" + } + }, + "rules_rust_proto__winapi-i686-pc-windows-gnu-0.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winapi-i686-pc-windows-gnu/0.4.0/download" + ], + "strip_prefix": "winapi-i686-pc-windows-gnu-0.4.0", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.winapi-i686-pc-windows-gnu-0.4.0.bazel" + } + }, + "rules_rust_proto__winapi-x86_64-pc-windows-gnu-0.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download" + ], + "strip_prefix": "winapi-x86_64-pc-windows-gnu-0.4.0", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.winapi-x86_64-pc-windows-gnu-0.4.0.bazel" + } + }, + "rules_rust_proto__ws2_32-sys-0.2.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/ws2_32-sys/0.2.1/download" + ], + "strip_prefix": "ws2_32-sys-0.2.1", + "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.ws2_32-sys-0.2.1.bazel" + } + }, + "llvm-raw": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.6/llvm-project-14.0.6.src.tar.xz" + ], + "strip_prefix": "llvm-project-14.0.6.src", + "sha256": "8b3cfd7bc695bd6cea0f37f53f0981f34f87496e79e2529874fd03a2f9dd3a8a", + "build_file_content": "# empty", + "patch_args": [ + "-p1" + ], + "patches": [ + "@@rules_rust~//bindgen/3rdparty/patches:llvm-project.cxx17.patch", + "@@rules_rust~//bindgen/3rdparty/patches:llvm-project.incompatible_disallow_empty_glob.patch" + ] + } + }, + "rules_rust_bindgen__bindgen-cli-0.70.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "integrity": "sha256-Mz+eRtWNh1r7irkjwi27fmF4j1WtKPK12Yv5ENkL1ao=", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bindgen-cli/bindgen-cli-0.70.1.crate" + ], + "strip_prefix": "bindgen-cli-0.70.1", + "build_file": "@@rules_rust~//bindgen/3rdparty:BUILD.bindgen-cli.bazel" + } + }, + "rules_rust_bindgen__aho-corasick-1.1.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/aho-corasick/1.1.3/download" + ], + "strip_prefix": "aho-corasick-1.1.3", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.aho-corasick-1.1.3.bazel" + } + }, + "rules_rust_bindgen__annotate-snippets-0.9.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ccaf7e9dfbb6ab22c82e473cd1a8a7bd313c19a5b7e40970f3d89ef5a5c9e81e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/annotate-snippets/0.9.2/download" + ], + "strip_prefix": "annotate-snippets-0.9.2", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.annotate-snippets-0.9.2.bazel" + } + }, + "rules_rust_bindgen__anstream-0.6.15": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anstream/0.6.15/download" + ], + "strip_prefix": "anstream-0.6.15", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.anstream-0.6.15.bazel" + } + }, + "rules_rust_bindgen__anstyle-1.0.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anstyle/1.0.8/download" + ], + "strip_prefix": "anstyle-1.0.8", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.anstyle-1.0.8.bazel" + } + }, + "rules_rust_bindgen__anstyle-parse-0.2.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anstyle-parse/0.2.5/download" + ], + "strip_prefix": "anstyle-parse-0.2.5", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.anstyle-parse-0.2.5.bazel" + } + }, + "rules_rust_bindgen__anstyle-query-1.1.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anstyle-query/1.1.1/download" + ], + "strip_prefix": "anstyle-query-1.1.1", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.anstyle-query-1.1.1.bazel" + } + }, + "rules_rust_bindgen__anstyle-wincon-3.0.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anstyle-wincon/3.0.4/download" + ], + "strip_prefix": "anstyle-wincon-3.0.4", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.anstyle-wincon-3.0.4.bazel" + } + }, + "rules_rust_bindgen__bindgen-0.70.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bindgen/0.70.1/download" + ], + "strip_prefix": "bindgen-0.70.1", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.bindgen-0.70.1.bazel" + } + }, + "rules_rust_bindgen__bitflags-2.6.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bitflags/2.6.0/download" + ], + "strip_prefix": "bitflags-2.6.0", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.bitflags-2.6.0.bazel" + } + }, + "rules_rust_bindgen__cexpr-0.6.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cexpr/0.6.0/download" + ], + "strip_prefix": "cexpr-0.6.0", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.cexpr-0.6.0.bazel" + } + }, + "rules_rust_bindgen__cfg-if-1.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cfg-if/1.0.0/download" + ], + "strip_prefix": "cfg-if-1.0.0", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.cfg-if-1.0.0.bazel" + } + }, + "rules_rust_bindgen__clang-sys-1.8.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/clang-sys/1.8.1/download" + ], + "strip_prefix": "clang-sys-1.8.1", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.clang-sys-1.8.1.bazel" + } + }, + "rules_rust_bindgen__clap-4.5.17": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/clap/4.5.17/download" + ], + "strip_prefix": "clap-4.5.17", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.clap-4.5.17.bazel" + } + }, + "rules_rust_bindgen__clap_builder-4.5.17": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/clap_builder/4.5.17/download" + ], + "strip_prefix": "clap_builder-4.5.17", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.clap_builder-4.5.17.bazel" + } + }, + "rules_rust_bindgen__clap_complete-4.5.26": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "205d5ef6d485fa47606b98b0ddc4ead26eb850aaa86abfb562a94fb3280ecba0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/clap_complete/4.5.26/download" + ], + "strip_prefix": "clap_complete-4.5.26", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.clap_complete-4.5.26.bazel" + } + }, + "rules_rust_bindgen__clap_derive-4.5.13": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/clap_derive/4.5.13/download" + ], + "strip_prefix": "clap_derive-4.5.13", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.clap_derive-4.5.13.bazel" + } + }, + "rules_rust_bindgen__clap_lex-0.7.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/clap_lex/0.7.2/download" + ], + "strip_prefix": "clap_lex-0.7.2", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.clap_lex-0.7.2.bazel" + } + }, + "rules_rust_bindgen__colorchoice-1.0.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/colorchoice/1.0.2/download" + ], + "strip_prefix": "colorchoice-1.0.2", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.colorchoice-1.0.2.bazel" + } + }, + "rules_rust_bindgen__either-1.13.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/either/1.13.0/download" + ], + "strip_prefix": "either-1.13.0", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.either-1.13.0.bazel" + } + }, + "rules_rust_bindgen__env_logger-0.10.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/env_logger/0.10.2/download" + ], + "strip_prefix": "env_logger-0.10.2", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.env_logger-0.10.2.bazel" + } + }, + "rules_rust_bindgen__glob-0.3.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/glob/0.3.1/download" + ], + "strip_prefix": "glob-0.3.1", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.glob-0.3.1.bazel" + } + }, + "rules_rust_bindgen__heck-0.5.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/heck/0.5.0/download" + ], + "strip_prefix": "heck-0.5.0", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.heck-0.5.0.bazel" + } + }, + "rules_rust_bindgen__hermit-abi-0.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/hermit-abi/0.4.0/download" + ], + "strip_prefix": "hermit-abi-0.4.0", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.hermit-abi-0.4.0.bazel" + } + }, + "rules_rust_bindgen__humantime-2.1.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/humantime/2.1.0/download" + ], + "strip_prefix": "humantime-2.1.0", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.humantime-2.1.0.bazel" + } + }, + "rules_rust_bindgen__is-terminal-0.4.13": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/is-terminal/0.4.13/download" + ], + "strip_prefix": "is-terminal-0.4.13", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.is-terminal-0.4.13.bazel" + } + }, + "rules_rust_bindgen__is_terminal_polyfill-1.70.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/is_terminal_polyfill/1.70.1/download" + ], + "strip_prefix": "is_terminal_polyfill-1.70.1", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.is_terminal_polyfill-1.70.1.bazel" + } + }, + "rules_rust_bindgen__itertools-0.13.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/itertools/0.13.0/download" + ], + "strip_prefix": "itertools-0.13.0", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.itertools-0.13.0.bazel" + } + }, + "rules_rust_bindgen__libc-0.2.158": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/libc/0.2.158/download" + ], + "strip_prefix": "libc-0.2.158", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.libc-0.2.158.bazel" + } + }, + "rules_rust_bindgen__libloading-0.8.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/libloading/0.8.5/download" + ], + "strip_prefix": "libloading-0.8.5", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.libloading-0.8.5.bazel" + } + }, + "rules_rust_bindgen__log-0.4.22": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/log/0.4.22/download" + ], + "strip_prefix": "log-0.4.22", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.log-0.4.22.bazel" + } + }, + "rules_rust_bindgen__memchr-2.7.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/memchr/2.7.4/download" + ], + "strip_prefix": "memchr-2.7.4", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.memchr-2.7.4.bazel" + } + }, + "rules_rust_bindgen__minimal-lexical-0.2.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/minimal-lexical/0.2.1/download" + ], + "strip_prefix": "minimal-lexical-0.2.1", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.minimal-lexical-0.2.1.bazel" + } + }, + "rules_rust_bindgen__nom-7.1.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/nom/7.1.3/download" + ], + "strip_prefix": "nom-7.1.3", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.nom-7.1.3.bazel" + } + }, + "rules_rust_bindgen__prettyplease-0.2.22": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/prettyplease/0.2.22/download" + ], + "strip_prefix": "prettyplease-0.2.22", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.prettyplease-0.2.22.bazel" + } + }, + "rules_rust_bindgen__proc-macro2-1.0.86": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/proc-macro2/1.0.86/download" + ], + "strip_prefix": "proc-macro2-1.0.86", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.proc-macro2-1.0.86.bazel" + } + }, + "rules_rust_bindgen__quote-1.0.37": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/quote/1.0.37/download" + ], + "strip_prefix": "quote-1.0.37", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.quote-1.0.37.bazel" + } + }, + "rules_rust_bindgen__regex-1.10.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/regex/1.10.6/download" + ], + "strip_prefix": "regex-1.10.6", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.regex-1.10.6.bazel" + } + }, + "rules_rust_bindgen__regex-automata-0.4.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/regex-automata/0.4.7/download" + ], + "strip_prefix": "regex-automata-0.4.7", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.regex-automata-0.4.7.bazel" + } + }, + "rules_rust_bindgen__regex-syntax-0.8.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/regex-syntax/0.8.4/download" + ], + "strip_prefix": "regex-syntax-0.8.4", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.regex-syntax-0.8.4.bazel" + } + }, + "rules_rust_bindgen__rustc-hash-1.1.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rustc-hash/1.1.0/download" + ], + "strip_prefix": "rustc-hash-1.1.0", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.rustc-hash-1.1.0.bazel" + } + }, + "rules_rust_bindgen__shlex-1.3.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/shlex/1.3.0/download" + ], + "strip_prefix": "shlex-1.3.0", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.shlex-1.3.0.bazel" + } + }, + "rules_rust_bindgen__strsim-0.11.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/strsim/0.11.1/download" + ], + "strip_prefix": "strsim-0.11.1", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.strsim-0.11.1.bazel" + } + }, + "rules_rust_bindgen__syn-2.0.77": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/syn/2.0.77/download" + ], + "strip_prefix": "syn-2.0.77", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.syn-2.0.77.bazel" + } + }, + "rules_rust_bindgen__termcolor-1.4.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/termcolor/1.4.1/download" + ], + "strip_prefix": "termcolor-1.4.1", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.termcolor-1.4.1.bazel" + } + }, + "rules_rust_bindgen__unicode-ident-1.0.13": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unicode-ident/1.0.13/download" + ], + "strip_prefix": "unicode-ident-1.0.13", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.unicode-ident-1.0.13.bazel" + } + }, + "rules_rust_bindgen__unicode-width-0.1.13": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unicode-width/0.1.13/download" + ], + "strip_prefix": "unicode-width-0.1.13", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.unicode-width-0.1.13.bazel" + } + }, + "rules_rust_bindgen__utf8parse-0.2.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/utf8parse/0.2.2/download" + ], + "strip_prefix": "utf8parse-0.2.2", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.utf8parse-0.2.2.bazel" + } + }, + "rules_rust_bindgen__winapi-0.3.9": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winapi/0.3.9/download" + ], + "strip_prefix": "winapi-0.3.9", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.winapi-0.3.9.bazel" + } + }, + "rules_rust_bindgen__winapi-i686-pc-windows-gnu-0.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winapi-i686-pc-windows-gnu/0.4.0/download" + ], + "strip_prefix": "winapi-i686-pc-windows-gnu-0.4.0", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.winapi-i686-pc-windows-gnu-0.4.0.bazel" + } + }, + "rules_rust_bindgen__winapi-util-0.1.9": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winapi-util/0.1.9/download" + ], + "strip_prefix": "winapi-util-0.1.9", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.winapi-util-0.1.9.bazel" + } + }, + "rules_rust_bindgen__winapi-x86_64-pc-windows-gnu-0.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download" + ], + "strip_prefix": "winapi-x86_64-pc-windows-gnu-0.4.0", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.winapi-x86_64-pc-windows-gnu-0.4.0.bazel" + } + }, + "rules_rust_bindgen__windows-sys-0.52.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows-sys/0.52.0/download" + ], + "strip_prefix": "windows-sys-0.52.0", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows-sys-0.52.0.bazel" + } + }, + "rules_rust_bindgen__windows-sys-0.59.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows-sys/0.59.0/download" + ], + "strip_prefix": "windows-sys-0.59.0", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows-sys-0.59.0.bazel" + } + }, + "rules_rust_bindgen__windows-targets-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows-targets/0.52.6/download" + ], + "strip_prefix": "windows-targets-0.52.6", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows-targets-0.52.6.bazel" + } + }, + "rules_rust_bindgen__windows_aarch64_gnullvm-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download" + ], + "strip_prefix": "windows_aarch64_gnullvm-0.52.6", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel" + } + }, + "rules_rust_bindgen__windows_aarch64_msvc-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download" + ], + "strip_prefix": "windows_aarch64_msvc-0.52.6", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows_aarch64_msvc-0.52.6.bazel" + } + }, + "rules_rust_bindgen__windows_i686_gnu-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_i686_gnu/0.52.6/download" + ], + "strip_prefix": "windows_i686_gnu-0.52.6", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows_i686_gnu-0.52.6.bazel" + } + }, + "rules_rust_bindgen__windows_i686_gnullvm-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download" + ], + "strip_prefix": "windows_i686_gnullvm-0.52.6", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows_i686_gnullvm-0.52.6.bazel" + } + }, + "rules_rust_bindgen__windows_i686_msvc-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_i686_msvc/0.52.6/download" + ], + "strip_prefix": "windows_i686_msvc-0.52.6", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows_i686_msvc-0.52.6.bazel" + } + }, + "rules_rust_bindgen__windows_x86_64_gnu-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download" + ], + "strip_prefix": "windows_x86_64_gnu-0.52.6", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows_x86_64_gnu-0.52.6.bazel" + } + }, + "rules_rust_bindgen__windows_x86_64_gnullvm-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download" + ], + "strip_prefix": "windows_x86_64_gnullvm-0.52.6", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel" + } + }, + "rules_rust_bindgen__windows_x86_64_msvc-0.52.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download" + ], + "strip_prefix": "windows_x86_64_msvc-0.52.6", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows_x86_64_msvc-0.52.6.bazel" + } + }, + "rules_rust_bindgen__yansi-term-0.1.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/yansi-term/0.1.2/download" + ], + "strip_prefix": "yansi-term-0.1.2", + "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.yansi-term-0.1.2.bazel" + } + }, + "rrra__aho-corasick-1.0.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/aho-corasick/1.0.2/download" + ], + "strip_prefix": "aho-corasick-1.0.2", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.aho-corasick-1.0.2.bazel" + } + }, + "rrra__anstream-0.3.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anstream/0.3.2/download" + ], + "strip_prefix": "anstream-0.3.2", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.anstream-0.3.2.bazel" + } + }, + "rrra__anstyle-1.0.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anstyle/1.0.1/download" + ], + "strip_prefix": "anstyle-1.0.1", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.anstyle-1.0.1.bazel" + } + }, + "rrra__anstyle-parse-0.2.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anstyle-parse/0.2.1/download" + ], + "strip_prefix": "anstyle-parse-0.2.1", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.anstyle-parse-0.2.1.bazel" + } + }, + "rrra__anstyle-query-1.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anstyle-query/1.0.0/download" + ], + "strip_prefix": "anstyle-query-1.0.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.anstyle-query-1.0.0.bazel" + } + }, + "rrra__anstyle-wincon-1.0.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anstyle-wincon/1.0.1/download" + ], + "strip_prefix": "anstyle-wincon-1.0.1", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.anstyle-wincon-1.0.1.bazel" + } + }, + "rrra__anyhow-1.0.71": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/anyhow/1.0.71/download" + ], + "strip_prefix": "anyhow-1.0.71", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.anyhow-1.0.71.bazel" + } + }, + "rrra__bitflags-1.3.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bitflags/1.3.2/download" + ], + "strip_prefix": "bitflags-1.3.2", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.bitflags-1.3.2.bazel" + } + }, + "rrra__cc-1.0.79": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cc/1.0.79/download" + ], + "strip_prefix": "cc-1.0.79", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.cc-1.0.79.bazel" + } + }, + "rrra__clap-4.3.11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1640e5cc7fb47dbb8338fd471b105e7ed6c3cb2aeb00c2e067127ffd3764a05d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/clap/4.3.11/download" + ], + "strip_prefix": "clap-4.3.11", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.clap-4.3.11.bazel" + } + }, + "rrra__clap_builder-4.3.11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "98c59138d527eeaf9b53f35a77fcc1fad9d883116070c63d5de1c7dc7b00c72b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/clap_builder/4.3.11/download" + ], + "strip_prefix": "clap_builder-4.3.11", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.clap_builder-4.3.11.bazel" + } + }, + "rrra__clap_derive-4.3.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/clap_derive/4.3.2/download" + ], + "strip_prefix": "clap_derive-4.3.2", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.clap_derive-4.3.2.bazel" + } + }, + "rrra__clap_lex-0.5.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/clap_lex/0.5.0/download" + ], + "strip_prefix": "clap_lex-0.5.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.clap_lex-0.5.0.bazel" + } + }, + "rrra__colorchoice-1.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/colorchoice/1.0.0/download" + ], + "strip_prefix": "colorchoice-1.0.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.colorchoice-1.0.0.bazel" + } + }, + "rrra__either-1.8.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/either/1.8.1/download" + ], + "strip_prefix": "either-1.8.1", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.either-1.8.1.bazel" + } + }, + "rrra__env_logger-0.10.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/env_logger/0.10.0/download" + ], + "strip_prefix": "env_logger-0.10.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.env_logger-0.10.0.bazel" + } + }, + "rrra__errno-0.3.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/errno/0.3.1/download" + ], + "strip_prefix": "errno-0.3.1", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.errno-0.3.1.bazel" + } + }, + "rrra__errno-dragonfly-0.1.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/errno-dragonfly/0.1.2/download" ], - "filename": "charset_normalizer-3.4.0-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.4.0", - "sha256": "c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", + "strip_prefix": "errno-dragonfly-0.1.2", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.errno-dragonfly-0.1.2.bazel" + } + }, + "rrra__heck-0.4.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl" - ] + "https://static.crates.io/crates/heck/0.4.1/download" + ], + "strip_prefix": "heck-0.4.1", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.heck-0.4.1.bazel" } }, - "rules_python_publish_deps_311_cffi_sdist_1c39c601": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rrra__hermit-abi-0.3.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/hermit-abi/0.3.2/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "hermit-abi-0.3.2", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.hermit-abi-0.3.2.bazel" + } + }, + "rrra__humantime-2.1.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/humantime/2.1.0/download" ], - "filename": "cffi-1.17.1.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cffi==1.17.1", - "sha256": "1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", + "strip_prefix": "humantime-2.1.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.humantime-2.1.0.bazel" + } + }, + "rrra__io-lifetimes-1.0.11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz" - ] + "https://static.crates.io/crates/io-lifetimes/1.0.11/download" + ], + "strip_prefix": "io-lifetimes-1.0.11", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.io-lifetimes-1.0.11.bazel" } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rrra__is-terminal-0.4.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/is-terminal/0.4.7/download" ], - "filename": "charset_normalizer-3.4.0-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.4.0", - "sha256": "6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", + "strip_prefix": "is-terminal-0.4.7", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.is-terminal-0.4.7.bazel" + } + }, + "rrra__itertools-0.11.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl" - ] + "https://static.crates.io/crates/itertools/0.11.0/download" + ], + "strip_prefix": "itertools-0.11.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.itertools-0.11.0.bazel" } }, - "rules_python_publish_deps_311_urllib3_py3_none_any_ca899ca0": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rrra__itoa-1.0.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/itoa/1.0.8/download" ], - "filename": "urllib3-2.2.3-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "urllib3==2.2.3", - "sha256": "ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", + "strip_prefix": "itoa-1.0.8", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.itoa-1.0.8.bazel" + } + }, + "rrra__libc-0.2.147": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl" - ] + "https://static.crates.io/crates/libc/0.2.147/download" + ], + "strip_prefix": "libc-0.2.147", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.libc-0.2.147.bazel" } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_3710a975": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rrra__linux-raw-sys-0.3.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/linux-raw-sys/0.3.8/download" ], - "filename": "charset_normalizer-3.4.0-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.4.0", - "sha256": "3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", + "strip_prefix": "linux-raw-sys-0.3.8", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.linux-raw-sys-0.3.8.bazel" + } + }, + "rrra__log-0.4.19": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - ] + "https://static.crates.io/crates/log/0.4.19/download" + ], + "strip_prefix": "log-0.4.19", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.log-0.4.19.bazel" } }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_x86_64_0f996e72": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rrra__memchr-2.5.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/memchr/2.5.0/download" ], - "filename": "cryptography-43.0.3-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==43.0.3", - "sha256": "0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4", + "strip_prefix": "memchr-2.5.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.memchr-2.5.0.bazel" + } + }, + "rrra__once_cell-1.18.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/2a/2c/488776a3dc843f95f86d2f957ca0fc3407d0242b50bede7fad1e339be03f/cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - ] + "https://static.crates.io/crates/once_cell/1.18.0/download" + ], + "strip_prefix": "once_cell-1.18.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.once_cell-1.18.0.bazel" } }, - "rules_python_publish_deps_311_urllib3_sdist_e7d814a8": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rrra__proc-macro2-1.0.64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/proc-macro2/1.0.64/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "proc-macro2-1.0.64", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.proc-macro2-1.0.64.bazel" + } + }, + "rrra__quote-1.0.29": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/quote/1.0.29/download" ], - "filename": "urllib3-2.2.3.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "urllib3==2.2.3", - "sha256": "e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", + "strip_prefix": "quote-1.0.29", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.quote-1.0.29.bazel" + } + }, + "rrra__regex-1.9.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz" - ] + "https://static.crates.io/crates/regex/1.9.1/download" + ], + "strip_prefix": "regex-1.9.1", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.regex-1.9.1.bazel" } }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_e1be4655": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rrra__regex-automata-0.3.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/regex-automata/0.3.3/download" ], - "filename": "cryptography-43.0.3-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==43.0.3", - "sha256": "e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16", + "strip_prefix": "regex-automata-0.3.3", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.regex-automata-0.3.3.bazel" + } + }, + "rrra__regex-syntax-0.7.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/regex-syntax/0.7.4/download" + ], + "strip_prefix": "regex-syntax-0.7.4", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.regex-syntax-0.7.4.bazel" + } + }, + "rrra__rustix-0.37.23": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rustix/0.37.23/download" + ], + "strip_prefix": "rustix-0.37.23", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.rustix-0.37.23.bazel" + } + }, + "rrra__ryu-1.0.14": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/ryu/1.0.14/download" + ], + "strip_prefix": "ryu-1.0.14", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.ryu-1.0.14.bazel" + } + }, + "rrra__serde-1.0.171": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/serde/1.0.171/download" + ], + "strip_prefix": "serde-1.0.171", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.serde-1.0.171.bazel" + } + }, + "rrra__serde_derive-1.0.171": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/21/ce/b9c9ff56c7164d8e2edfb6c9305045fbc0df4508ccfdb13ee66eb8c95b0e/cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl" - ] + "https://static.crates.io/crates/serde_derive/1.0.171/download" + ], + "strip_prefix": "serde_derive-1.0.171", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.serde_derive-1.0.171.bazel" } }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_armv7l_0411beb0": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rrra__serde_json-1.0.102": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "b5062a995d481b2308b6064e9af76011f2921c35f97b0468811ed9f6cd91dfed", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/serde_json/1.0.102/download" ], - "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164", + "strip_prefix": "serde_json-1.0.102", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.serde_json-1.0.102.bazel" + } + }, + "rrra__strsim-0.10.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/05/2b/85977d9e11713b5747595ee61f381bc820749daf83f07b90b6c9964cf932/nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" - ] + "https://static.crates.io/crates/strsim/0.10.0/download" + ], + "strip_prefix": "strsim-0.10.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.strsim-0.10.0.bazel" } }, - "rules_python_publish_deps_311_charset_normalizer_sdist_223217c3": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rrra__syn-2.0.25": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "15e3fc8c0c74267e2df136e5e5fb656a464158aa57624053375eb9c8c6e25ae2", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/syn/2.0.25/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "syn-2.0.25", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.syn-2.0.25.bazel" + } + }, + "rrra__termcolor-1.2.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/termcolor/1.2.0/download" ], - "filename": "charset_normalizer-3.4.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", + "strip_prefix": "termcolor-1.2.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.termcolor-1.2.0.bazel" + } + }, + "rrra__unicode-ident-1.0.10": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz" - ] + "https://static.crates.io/crates/unicode-ident/1.0.10/download" + ], + "strip_prefix": "unicode-ident-1.0.10", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.unicode-ident-1.0.10.bazel" } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_47334db7": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rrra__utf8parse-0.2.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/utf8parse/0.2.1/download" ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", + "strip_prefix": "utf8parse-0.2.1", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.utf8parse-0.2.1.bazel" + } + }, + "rrra__winapi-0.3.9": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/d7/a1/493919799446464ed0299c8eef3c3fad0daf1c3cd48bff9263c731b0d9e2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl" - ] + "https://static.crates.io/crates/winapi/0.3.9/download" + ], + "strip_prefix": "winapi-0.3.9", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.winapi-0.3.9.bazel" } }, - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_46bf4316": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rrra__winapi-i686-pc-windows-gnu-0.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winapi-i686-pc-windows-gnu/0.4.0/download" ], - "filename": "cffi-1.17.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.17.1", - "sha256": "46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", + "strip_prefix": "winapi-i686-pc-windows-gnu-0.4.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.winapi-i686-pc-windows-gnu-0.4.0.bazel" + } + }, + "rrra__winapi-util-0.1.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" - ] + "https://static.crates.io/crates/winapi-util/0.1.5/download" + ], + "strip_prefix": "winapi-util-0.1.5", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.winapi-util-0.1.5.bazel" } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_bf4475b8": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rrra__winapi-x86_64-pc-windows-gnu-0.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download" ], - "filename": "charset_normalizer-3.4.0-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.4.0", - "sha256": "bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", + "strip_prefix": "winapi-x86_64-pc-windows-gnu-0.4.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.winapi-x86_64-pc-windows-gnu-0.4.0.bazel" + } + }, + "rrra__windows-sys-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - ] + "https://static.crates.io/crates/windows-sys/0.48.0/download" + ], + "strip_prefix": "windows-sys-0.48.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows-sys-0.48.0.bazel" } }, - "rules_python_publish_deps_311_cryptography_sdist_315b9001": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rrra__windows-targets-0.48.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows-targets/0.48.1/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "windows-targets-0.48.1", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows-targets-0.48.1.bazel" + } + }, + "rrra__windows_aarch64_gnullvm-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.0/download" ], - "filename": "cryptography-43.0.3.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cryptography==43.0.3", - "sha256": "315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", + "strip_prefix": "windows_aarch64_gnullvm-0.48.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows_aarch64_gnullvm-0.48.0.bazel" + } + }, + "rrra__windows_aarch64_msvc-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/0d/05/07b55d1fa21ac18c3a8c79f764e2514e6f6a9698f1be44994f5adf0d29db/cryptography-43.0.3.tar.gz" - ] + "https://static.crates.io/crates/windows_aarch64_msvc/0.48.0/download" + ], + "strip_prefix": "windows_aarch64_msvc-0.48.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows_aarch64_msvc-0.48.0.bazel" } }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64_5f36b271": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rrra__windows_i686_gnu-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_i686_gnu/0.48.0/download" ], - "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189", + "strip_prefix": "windows_i686_gnu-0.48.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows_i686_gnu-0.48.0.bazel" + } + }, + "rrra__windows_i686_msvc-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/72/f2/5c894d5265ab80a97c68ca36f25c8f6f0308abac649aaf152b74e7e854a8/nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl" - ] + "https://static.crates.io/crates/windows_i686_msvc/0.48.0/download" + ], + "strip_prefix": "windows_i686_msvc-0.48.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows_i686_msvc-0.48.0.bazel" } }, - "rules_python_publish_deps_311_secretstorage_sdist_2403533e": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rrra__windows_x86_64_gnu-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_x86_64_gnu/0.48.0/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "windows_x86_64_gnu-0.48.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows_x86_64_gnu-0.48.0.bazel" + } + }, + "rrra__windows_x86_64_gnullvm-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.0/download" ], - "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", + "strip_prefix": "windows_x86_64_gnullvm-0.48.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows_x86_64_gnullvm-0.48.0.bazel" + } + }, + "rrra__windows_x86_64_msvc-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_x86_64_msvc/0.48.0/download" + ], + "strip_prefix": "windows_x86_64_msvc-0.48.0", + "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows_x86_64_msvc-0.48.0.bazel" + } + }, + "rules_rust_wasm_bindgen_cli": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "08f61e21873f51e3059a8c7c3eef81ede7513d161cfc60751c7b2ffa6ed28270", "urls": [ - "https://files.pythonhosted.org/packages/53/a4/f48c9d79cb507ed1373477dbceaba7401fd8a23af63b837fa61f1dcd3691/SecretStorage-3.3.3.tar.gz" + "https://static.crates.io/crates/wasm-bindgen-cli/wasm-bindgen-cli-0.2.92.crate" + ], + "type": "tar.gz", + "strip_prefix": "wasm-bindgen-cli-0.2.92", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty:BUILD.wasm-bindgen-cli.bazel", + "patch_args": [ + "-p1" + ], + "patches": [ + "@@rules_rust~//wasm_bindgen/3rdparty/patches:resolver.patch" ] } }, - "rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__adler-1.0.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/adler/1.0.2/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "adler-1.0.2", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.adler-1.0.2.bazel" + } + }, + "rules_rust_wasm_bindgen__aho-corasick-1.0.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/aho-corasick/1.0.2/download" ], - "filename": "jaraco_functools-4.1.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-functools==4.1.0", - "sha256": "70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d", + "strip_prefix": "aho-corasick-1.0.2", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.aho-corasick-1.0.2.bazel" + } + }, + "rules_rust_wasm_bindgen__alloc-no-stdlib-2.0.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/ab/23/9894b3df5d0a6eb44611c36aec777823fc2e07740dabbd0b810e19594013/jaraco_functools-4.1.0.tar.gz" - ] + "https://static.crates.io/crates/alloc-no-stdlib/2.0.4/download" + ], + "strip_prefix": "alloc-no-stdlib-2.0.4", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.alloc-no-stdlib-2.0.4.bazel" } }, - "rules_python_publish_deps_311_pycparser_py3_none_any_c3702b6d": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__alloc-stdlib-0.2.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/alloc-stdlib/0.2.2/download" ], - "filename": "pycparser-2.22-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pycparser==2.22", - "sha256": "c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", + "strip_prefix": "alloc-stdlib-0.2.2", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.alloc-stdlib-0.2.2.bazel" + } + }, + "rules_rust_wasm_bindgen__android-tzdata-0.1.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl" - ] + "https://static.crates.io/crates/android-tzdata/0.1.1/download" + ], + "strip_prefix": "android-tzdata-0.1.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.android-tzdata-0.1.1.bazel" } }, - "rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_aarch64_a9b15d49": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__android_system_properties-0.1.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/android_system_properties/0.1.5/download" ], - "filename": "cffi-1.17.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": "cffi==1.17.1", - "sha256": "a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", + "strip_prefix": "android_system_properties-0.1.5", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.android_system_properties-0.1.5.bazel" + } + }, + "rules_rust_wasm_bindgen__anyhow-1.0.71": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl" - ] + "https://static.crates.io/crates/anyhow/1.0.71/download" + ], + "strip_prefix": "anyhow-1.0.71", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.anyhow-1.0.71.bazel" } }, - "rules_python_publish_deps_311_idna_sdist_12f65c9b": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__ascii-1.1.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/ascii/1.1.0/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "ascii-1.1.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.ascii-1.1.0.bazel" + } + }, + "rules_rust_wasm_bindgen__assert_cmd-1.0.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "c98233c6673d8601ab23e77eb38f999c51100d46c5703b17288c57fddf3a1ffe", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/assert_cmd/1.0.8/download" ], - "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", + "strip_prefix": "assert_cmd-1.0.8", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.assert_cmd-1.0.8.bazel" + } + }, + "rules_rust_wasm_bindgen__atty-0.2.14": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz" - ] + "https://static.crates.io/crates/atty/0.2.14/download" + ], + "strip_prefix": "atty-0.2.14", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.atty-0.2.14.bazel" } }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__autocfg-1.1.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/autocfg/1.1.0/download" ], - "filename": "nh3-0.2.18-cp37-abi3-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": "nh3==0.2.18", - "sha256": "19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b", + "strip_prefix": "autocfg-1.1.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.autocfg-1.1.0.bazel" + } + }, + "rules_rust_wasm_bindgen__base64-0.13.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/c2/a8/3bb02d0c60a03ad3a112b76c46971e9480efa98a8946677b5a59f60130ca/nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl" - ] + "https://static.crates.io/crates/base64/0.13.1/download" + ], + "strip_prefix": "base64-0.13.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.base64-0.13.1.bazel" } }, - "rules_python_publish_deps_311_pywin32_ctypes_sdist_d162dc04": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__base64-0.21.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_windows_x86_64" + "sha256": "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/base64/0.21.5/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "base64-0.21.5", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.base64-0.21.5.bazel" + } + }, + "rules_rust_wasm_bindgen__bitflags-1.3.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bitflags/1.3.2/download" ], - "filename": "pywin32-ctypes-0.2.3.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pywin32-ctypes==0.2.3", - "sha256": "d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", + "strip_prefix": "bitflags-1.3.2", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.bitflags-1.3.2.bazel" + } + }, + "rules_rust_wasm_bindgen__brotli-decompressor-2.5.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz" - ] + "https://static.crates.io/crates/brotli-decompressor/2.5.1/download" + ], + "strip_prefix": "brotli-decompressor-2.5.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.brotli-decompressor-2.5.1.bazel" } }, - "rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__bstr-0.2.17": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bstr/0.2.17/download" ], - "filename": "readme_renderer-44.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "readme-renderer==44.0", - "sha256": "2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151", + "strip_prefix": "bstr-0.2.17", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.bstr-0.2.17.bazel" + } + }, + "rules_rust_wasm_bindgen__buf_redux-0.8.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl" - ] + "https://static.crates.io/crates/buf_redux/0.8.4/download" + ], + "strip_prefix": "buf_redux-0.8.4", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.buf_redux-0.8.4.bazel" } }, - "rules_python_publish_deps_311_pygments_sdist_786ff802": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__bumpalo-3.13.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/bumpalo/3.13.0/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "bumpalo-3.13.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.bumpalo-3.13.0.bazel" + } + }, + "rules_rust_wasm_bindgen__cc-1.0.83": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cc/1.0.83/download" + ], + "strip_prefix": "cc-1.0.83", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.cc-1.0.83.bazel" + } + }, + "rules_rust_wasm_bindgen__cfg-if-1.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/cfg-if/1.0.0/download" ], - "filename": "pygments-2.18.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pygments==2.18.0", - "sha256": "786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", + "strip_prefix": "cfg-if-1.0.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.cfg-if-1.0.0.bazel" + } + }, + "rules_rust_wasm_bindgen__chrono-0.4.26": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz" - ] + "https://static.crates.io/crates/chrono/0.4.26/download" + ], + "strip_prefix": "chrono-0.4.26", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.chrono-0.4.26.bazel" } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_f1a2f519": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__chunked_transfer-1.4.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "cca491388666e04d7248af3f60f0c40cfb0991c72205595d7c396e3510207d1a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/chunked_transfer/1.4.1/download" ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", + "strip_prefix": "chunked_transfer-1.4.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.chunked_transfer-1.4.1.bazel" + } + }, + "rules_rust_wasm_bindgen__core-foundation-sys-0.8.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/75/d2/0ab54463d3410709c09266dfb416d032a08f97fd7d60e94b8c6ef54ae14b/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl" - ] + "https://static.crates.io/crates/core-foundation-sys/0.8.4/download" + ], + "strip_prefix": "core-foundation-sys-0.8.4", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.core-foundation-sys-0.8.4.bazel" } }, - "rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__crc32fast-1.3.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/crc32fast/1.3.2/download" ], - "filename": "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86", + "strip_prefix": "crc32fast-1.3.2", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.crc32fast-1.3.2.bazel" + } + }, + "rules_rust_wasm_bindgen__crossbeam-channel-0.5.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/b3/89/1daff5d9ba5a95a157c092c7c5f39b8dd2b1ddb4559966f808d31cfb67e0/nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl" - ] + "https://static.crates.io/crates/crossbeam-channel/0.5.8/download" + ], + "strip_prefix": "crossbeam-channel-0.5.8", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.crossbeam-channel-0.5.8.bazel" } }, - "rules_python_publish_deps_311_zipp_py3_none_any_a817ac80": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__crossbeam-deque-0.8.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/crossbeam-deque/0.8.3/download" ], - "filename": "zipp-3.20.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.20.2", - "sha256": "a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", + "strip_prefix": "crossbeam-deque-0.8.3", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.crossbeam-deque-0.8.3.bazel" + } + }, + "rules_rust_wasm_bindgen__crossbeam-epoch-0.9.15": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl" - ] + "https://static.crates.io/crates/crossbeam-epoch/0.9.15/download" + ], + "strip_prefix": "crossbeam-epoch-0.9.15", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.crossbeam-epoch-0.9.15.bazel" } }, - "rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__crossbeam-utils-0.8.16": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/crossbeam-utils/0.8.16/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "crossbeam-utils-0.8.16", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.crossbeam-utils-0.8.16.bazel" + } + }, + "rules_rust_wasm_bindgen__diff-0.1.13": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/diff/0.1.13/download" ], - "filename": "backports_tarfile-1.2.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "backports-tarfile==1.2.0", - "sha256": "d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", + "strip_prefix": "diff-0.1.13", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.diff-0.1.13.bazel" + } + }, + "rules_rust_wasm_bindgen__difference-2.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz" - ] + "https://static.crates.io/crates/difference/2.0.0/download" + ], + "strip_prefix": "difference-2.0.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.difference-2.0.0.bazel" } }, - "rules_python_publish_deps_311_jeepney_py3_none_any_c0a454ad": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__difflib-0.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/difflib/0.4.0/download" ], - "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", + "strip_prefix": "difflib-0.4.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.difflib-0.4.0.bazel" + } + }, + "rules_rust_wasm_bindgen__doc-comment-0.3.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/ae/72/2a1e2290f1ab1e06f71f3d0f1646c9e4634e70e1d37491535e19266e8dc9/jeepney-0.8.0-py3-none-any.whl" - ] + "https://static.crates.io/crates/doc-comment/0.3.3/download" + ], + "strip_prefix": "doc-comment-0.3.3", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.doc-comment-0.3.3.bazel" } }, - "rules_python_publish_deps_311_secretstorage_py3_none_any_f356e662": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__docopt-1.1.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "7f3f119846c823f9eafcf953a8f6ffb6ed69bf6240883261a7f13b634579a51f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/docopt/1.1.1/download" ], - "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", + "strip_prefix": "docopt-1.1.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.docopt-1.1.1.bazel" + } + }, + "rules_rust_wasm_bindgen__either-1.8.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/54/24/b4293291fa1dd830f353d2cb163295742fa87f179fcc8a20a306a81978b7/SecretStorage-3.3.3-py3-none-any.whl" - ] + "https://static.crates.io/crates/either/1.8.1/download" + ], + "strip_prefix": "either-1.8.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.either-1.8.1.bazel" } }, - "rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__env_logger-0.8.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/env_logger/0.8.4/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "env_logger-0.8.4", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.env_logger-0.8.4.bazel" + } + }, + "rules_rust_wasm_bindgen__equivalent-1.0.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/equivalent/1.0.1/download" ], - "filename": "jaraco.classes-3.4.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-classes==3.4.0", - "sha256": "47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", + "strip_prefix": "equivalent-1.0.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.equivalent-1.0.1.bazel" + } + }, + "rules_rust_wasm_bindgen__errno-0.3.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz" - ] + "https://static.crates.io/crates/errno/0.3.1/download" + ], + "strip_prefix": "errno-0.3.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.errno-0.3.1.bazel" } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__errno-dragonfly-0.1.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/errno-dragonfly/0.1.2/download" ], - "filename": "charset_normalizer-3.4.0-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.4.0", - "sha256": "cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", + "strip_prefix": "errno-dragonfly-0.1.2", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.errno-dragonfly-0.1.2.bazel" + } + }, + "rules_rust_wasm_bindgen__fallible-iterator-0.2.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl" - ] + "https://static.crates.io/crates/fallible-iterator/0.2.0/download" + ], + "strip_prefix": "fallible-iterator-0.2.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.fallible-iterator-0.2.0.bazel" } }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_df6b6c6d": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__fastrand-1.9.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/fastrand/1.9.0/download" ], - "filename": "cryptography-43.0.3-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==43.0.3", - "sha256": "df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73", + "strip_prefix": "fastrand-1.9.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.fastrand-1.9.0.bazel" + } + }, + "rules_rust_wasm_bindgen__filetime-0.2.21": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/2a/33/b3682992ab2e9476b9c81fff22f02c8b0a1e6e1d49ee1750a67d85fd7ed2/cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl" - ] + "https://static.crates.io/crates/filetime/0.2.21/download" + ], + "strip_prefix": "filetime-0.2.21", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.filetime-0.2.21.bazel" } }, - "rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__flate2-1.0.28": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/flate2/1.0.28/download" ], - "filename": "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811", + "strip_prefix": "flate2-1.0.28", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.flate2-1.0.28.bazel" + } + }, + "rules_rust_wasm_bindgen__float-cmp-0.8.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e1267f4ac4f343772758f7b1bdcbe767c218bbab93bb432acbf5162bbf85a6c4", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/2c/b6/42fc3c69cabf86b6b81e4c051a9b6e249c5ba9f8155590222c2622961f58/nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl" - ] + "https://static.crates.io/crates/float-cmp/0.8.0/download" + ], + "strip_prefix": "float-cmp-0.8.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.float-cmp-0.8.0.bazel" } }, - "rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__form_urlencoded-1.2.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/form_urlencoded/1.2.0/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "form_urlencoded-1.2.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.form_urlencoded-1.2.0.bazel" + } + }, + "rules_rust_wasm_bindgen__getrandom-0.2.10": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/getrandom/0.2.10/download" ], - "filename": "requests-toolbelt-1.0.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "requests-toolbelt==1.0.0", - "sha256": "7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", + "strip_prefix": "getrandom-0.2.10", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.getrandom-0.2.10.bazel" + } + }, + "rules_rust_wasm_bindgen__gimli-0.26.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz" - ] + "https://static.crates.io/crates/gimli/0.26.2/download" + ], + "strip_prefix": "gimli-0.26.2", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.gimli-0.26.2.bazel" } }, - "rules_python_publish_deps_311_rich_py3_none_any_9836f509": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__hashbrown-0.12.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/hashbrown/0.12.3/download" ], - "filename": "rich-13.9.3-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "rich==13.9.3", - "sha256": "9836f5096eb2172c9e77df411c1b009bace4193d6a481d534fea75ebba758283", + "strip_prefix": "hashbrown-0.12.3", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.hashbrown-0.12.3.bazel" + } + }, + "rules_rust_wasm_bindgen__hashbrown-0.14.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl" - ] + "https://static.crates.io/crates/hashbrown/0.14.0/download" + ], + "strip_prefix": "hashbrown-0.14.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.hashbrown-0.14.0.bazel" } }, - "rules_python_publish_deps_311_importlib_metadata_py3_none_any_45e54197": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__heck-0.3.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/heck/0.3.3/download" ], - "filename": "importlib_metadata-8.5.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==8.5.0", - "sha256": "45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", + "strip_prefix": "heck-0.3.3", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.heck-0.3.3.bazel" + } + }, + "rules_rust_wasm_bindgen__hermit-abi-0.1.19": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl" - ] + "https://static.crates.io/crates/hermit-abi/0.1.19/download" + ], + "strip_prefix": "hermit-abi-0.1.19", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.hermit-abi-0.1.19.bazel" } }, - "rules_python_publish_deps_311_twine_py3_none_any_215dbe7b": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__hermit-abi-0.3.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/hermit-abi/0.3.2/download" ], - "filename": "twine-5.1.1-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "twine==5.1.1", - "sha256": "215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997", + "strip_prefix": "hermit-abi-0.3.2", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.hermit-abi-0.3.2.bazel" + } + }, + "rules_rust_wasm_bindgen__httparse-1.8.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/5d/ec/00f9d5fd040ae29867355e559a94e9a8429225a0284a3f5f091a3878bfc0/twine-5.1.1-py3-none-any.whl" - ] + "https://static.crates.io/crates/httparse/1.8.0/download" + ], + "strip_prefix": "httparse-1.8.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.httparse-1.8.0.bazel" } }, - "rules_python_publish_deps_311_docutils_sdist_3a6b1873": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__httpdate-1.0.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/httpdate/1.0.2/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "httpdate-1.0.2", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.httpdate-1.0.2.bazel" + } + }, + "rules_rust_wasm_bindgen__humantime-2.1.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/humantime/2.1.0/download" ], - "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", + "strip_prefix": "humantime-2.1.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.humantime-2.1.0.bazel" + } + }, + "rules_rust_wasm_bindgen__iana-time-zone-0.1.57": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz" - ] + "https://static.crates.io/crates/iana-time-zone/0.1.57/download" + ], + "strip_prefix": "iana-time-zone-0.1.57", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.iana-time-zone-0.1.57.bazel" } }, - "rules_python_publish_deps_311_keyring_sdist_b07ebc55": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__iana-time-zone-haiku-0.1.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/iana-time-zone-haiku/0.1.2/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "iana-time-zone-haiku-0.1.2", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.iana-time-zone-haiku-0.1.2.bazel" + } + }, + "rules_rust_wasm_bindgen__id-arena-2.2.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/id-arena/2.2.1/download" ], - "filename": "keyring-25.4.1.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "keyring==25.4.1", - "sha256": "b07ebc55f3e8ed86ac81dd31ef14e81ace9dd9c3d4b5d77a6e9a2016d0d71a1b", + "strip_prefix": "id-arena-2.2.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.id-arena-2.2.1.bazel" + } + }, + "rules_rust_wasm_bindgen__idna-0.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/a5/1c/2bdbcfd5d59dc6274ffb175bc29aa07ecbfab196830e0cfbde7bd861a2ea/keyring-25.4.1.tar.gz" - ] + "https://static.crates.io/crates/idna/0.4.0/download" + ], + "strip_prefix": "idna-0.4.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.idna-0.4.0.bazel" } }, - "rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__indexmap-1.9.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/indexmap/1.9.3/download" ], - "filename": "markdown_it_py-3.0.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==3.0.0", - "sha256": "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", + "strip_prefix": "indexmap-1.9.3", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.indexmap-1.9.3.bazel" + } + }, + "rules_rust_wasm_bindgen__indexmap-2.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl" - ] + "https://static.crates.io/crates/indexmap/2.0.0/download" + ], + "strip_prefix": "indexmap-2.0.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.indexmap-2.0.0.bazel" } }, - "rules_python_publish_deps_311_certifi_py3_none_any_922820b5": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__instant-0.1.12": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/instant/0.1.12/download" ], - "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", + "strip_prefix": "instant-0.1.12", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.instant-0.1.12.bazel" + } + }, + "rules_rust_wasm_bindgen__io-lifetimes-1.0.11": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl" - ] + "https://static.crates.io/crates/io-lifetimes/1.0.11/download" + ], + "strip_prefix": "io-lifetimes-1.0.11", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.io-lifetimes-1.0.11.bazel" } }, - "rules_python_publish_deps_311_more_itertools_sdist_5482bfef": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__itertools-0.10.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/itertools/0.10.5/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "itertools-0.10.5", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.itertools-0.10.5.bazel" + } + }, + "rules_rust_wasm_bindgen__itoa-1.0.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/itoa/1.0.8/download" ], - "filename": "more-itertools-10.5.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "more-itertools==10.5.0", - "sha256": "5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6", + "strip_prefix": "itoa-1.0.8", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.itoa-1.0.8.bazel" + } + }, + "rules_rust_wasm_bindgen__js-sys-0.3.64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/51/78/65922308c4248e0eb08ebcbe67c95d48615cc6f27854b6f2e57143e9178f/more-itertools-10.5.0.tar.gz" - ] + "https://static.crates.io/crates/js-sys/0.3.64/download" + ], + "strip_prefix": "js-sys-0.3.64", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.js-sys-0.3.64.bazel" } }, - "rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__lazy_static-1.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/lazy_static/1.4.0/download" ], - "filename": "nh3-0.2.18-cp37-abi3-win_amd64.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844", + "strip_prefix": "lazy_static-1.4.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.lazy_static-1.4.0.bazel" + } + }, + "rules_rust_wasm_bindgen__leb128-0.2.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/26/8d/53c5b19c4999bdc6ba95f246f4ef35ca83d7d7423e5e38be43ad66544e5d/nh3-0.2.18-cp37-abi3-win_amd64.whl" - ] + "https://static.crates.io/crates/leb128/0.2.5/download" + ], + "strip_prefix": "leb128-0.2.5", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.leb128-0.2.5.bazel" } }, - "rules_python_publish_deps_311_certifi_sdist_bec941d2": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__libc-0.2.150": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/libc/0.2.150/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "libc-0.2.150", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.libc-0.2.150.bazel" + } + }, + "rules_rust_wasm_bindgen__linux-raw-sys-0.3.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/linux-raw-sys/0.3.8/download" ], - "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", + "strip_prefix": "linux-raw-sys-0.3.8", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.linux-raw-sys-0.3.8.bazel" + } + }, + "rules_rust_wasm_bindgen__log-0.4.19": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz" - ] + "https://static.crates.io/crates/log/0.4.19/download" + ], + "strip_prefix": "log-0.4.19", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.log-0.4.19.bazel" } }, - "rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__memchr-2.5.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/memchr/2.5.0/download" ], - "filename": "charset_normalizer-3.4.0-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.4.0", - "sha256": "fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", + "strip_prefix": "memchr-2.5.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.memchr-2.5.0.bazel" + } + }, + "rules_rust_wasm_bindgen__memoffset-0.9.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl" - ] + "https://static.crates.io/crates/memoffset/0.9.0/download" + ], + "strip_prefix": "memoffset-0.9.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.memoffset-0.9.0.bazel" } }, - "rules_python_publish_deps_311_mdurl_py3_none_any_84008a41": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__mime-0.3.17": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/mime/0.3.17/download" ], - "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", + "strip_prefix": "mime-0.3.17", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.mime-0.3.17.bazel" + } + }, + "rules_rust_wasm_bindgen__mime_guess-2.0.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl" - ] + "https://static.crates.io/crates/mime_guess/2.0.4/download" + ], + "strip_prefix": "mime_guess-2.0.4", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.mime_guess-2.0.4.bazel" } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_bcb4f8ea": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__miniz_oxide-0.7.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/miniz_oxide/0.7.1/download" ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", + "strip_prefix": "miniz_oxide-0.7.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.miniz_oxide-0.7.1.bazel" + } + }, + "rules_rust_wasm_bindgen__multipart-0.18.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "00dec633863867f29cb39df64a397cdf4a6354708ddd7759f70c7fb51c5f9182", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/multipart/0.18.0/download" + ], + "strip_prefix": "multipart-0.18.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.multipart-0.18.0.bazel" + } + }, + "rules_rust_wasm_bindgen__normalize-line-endings-0.3.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/ee/44/4f62042ca8cdc0cabf87c0fc00ae27cd8b53ab68be3605ba6d071f742ad3/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl" - ] + "https://static.crates.io/crates/normalize-line-endings/0.3.0/download" + ], + "strip_prefix": "normalize-line-endings-0.3.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.normalize-line-endings-0.3.0.bazel" } }, - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_s390x_a24ed04c": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__num-traits-0.2.15": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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.17.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": "cffi==1.17.1", - "sha256": "a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", + "sha256": "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" - ] + "https://static.crates.io/crates/num-traits/0.2.15/download" + ], + "strip_prefix": "num-traits-0.2.15", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.num-traits-0.2.15.bazel" } }, - "rules_python_publish_deps_311_mdurl_sdist_bb413d29": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__num_cpus-1.16.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "sha256": "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/num_cpus/1.16.0/download" ], - "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", + "strip_prefix": "num_cpus-1.16.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.num_cpus-1.16.0.bazel" + } + }, + "rules_rust_wasm_bindgen__num_threads-0.1.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz" - ] + "https://static.crates.io/crates/num_threads/0.1.6/download" + ], + "strip_prefix": "num_threads-0.1.6", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.num_threads-0.1.6.bazel" } }, - "rules_python_publish_deps_311_keyring_py3_none_any_5426f817": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__once_cell-1.18.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/once_cell/1.18.0/download" ], - "filename": "keyring-25.4.1-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "keyring==25.4.1", - "sha256": "5426f817cf7f6f007ba5ec722b1bcad95a75b27d780343772ad76b17cb47b0bf", + "strip_prefix": "once_cell-1.18.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.once_cell-1.18.0.bazel" + } + }, + "rules_rust_wasm_bindgen__percent-encoding-2.3.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/83/25/e6d59e5f0a0508d0dca8bb98c7f7fd3772fc943ac3f53d5ab18a218d32c0/keyring-25.4.1-py3-none-any.whl" - ] + "https://static.crates.io/crates/percent-encoding/2.3.0/download" + ], + "strip_prefix": "percent-encoding-2.3.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.percent-encoding-2.3.0.bazel" } }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__ppv-lite86-0.2.17": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/ppv-lite86/0.2.17/download" ], - "filename": "nh3-0.2.18-cp37-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": "nh3==0.2.18", - "sha256": "42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200", + "strip_prefix": "ppv-lite86-0.2.17", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.ppv-lite86-0.2.17.bazel" + } + }, + "rules_rust_wasm_bindgen__predicates-1.0.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "f49cfaf7fdaa3bfacc6fa3e7054e65148878354a5cfddcf661df4c851f8021df", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/45/b9/833f385403abaf0023c6547389ec7a7acf141ddd9d1f21573723a6eab39a/nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - ] + "https://static.crates.io/crates/predicates/1.0.8/download" + ], + "strip_prefix": "predicates-1.0.8", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.predicates-1.0.8.bazel" } }, - "rules_python_publish_deps_311_rfc3986_sdist_97aacf9d": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__predicates-2.1.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/predicates/2.1.5/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "predicates-2.1.5", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.predicates-2.1.5.bazel" + } + }, + "rules_rust_wasm_bindgen__predicates-core-1.0.6": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/predicates-core/1.0.6/download" ], - "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", + "strip_prefix": "predicates-core-1.0.6", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.predicates-core-1.0.6.bazel" + } + }, + "rules_rust_wasm_bindgen__predicates-tree-1.0.9": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz" - ] + "https://static.crates.io/crates/predicates-tree/1.0.9/download" + ], + "strip_prefix": "predicates-tree-1.0.9", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.predicates-tree-1.0.9.bazel" } }, - "rules_python_publish_deps_311_twine_sdist_9aa08251": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__proc-macro2-1.0.64": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/proc-macro2/1.0.64/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "proc-macro2-1.0.64", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.proc-macro2-1.0.64.bazel" + } + }, + "rules_rust_wasm_bindgen__quick-error-1.2.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/quick-error/1.2.3/download" ], - "filename": "twine-5.1.1.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "twine==5.1.1", - "sha256": "9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db", + "strip_prefix": "quick-error-1.2.3", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.quick-error-1.2.3.bazel" + } + }, + "rules_rust_wasm_bindgen__quote-1.0.29": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/77/68/bd982e5e949ef8334e6f7dcf76ae40922a8750aa2e347291ae1477a4782b/twine-5.1.1.tar.gz" - ] + "https://static.crates.io/crates/quote/1.0.29/download" + ], + "strip_prefix": "quote-1.0.29", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.quote-1.0.29.bazel" } }, - "rules_python_publish_deps_311_pkginfo_sdist_5df73835": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__rand-0.8.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rand/0.8.5/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "rand-0.8.5", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rand-0.8.5.bazel" + } + }, + "rules_rust_wasm_bindgen__rand_chacha-0.3.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rand_chacha/0.3.1/download" ], - "filename": "pkginfo-1.10.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pkginfo==1.10.0", - "sha256": "5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297", + "strip_prefix": "rand_chacha-0.3.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rand_chacha-0.3.1.bazel" + } + }, + "rules_rust_wasm_bindgen__rand_core-0.6.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/2f/72/347ec5be4adc85c182ed2823d8d1c7b51e13b9a6b0c1aae59582eca652df/pkginfo-1.10.0.tar.gz" - ] + "https://static.crates.io/crates/rand_core/0.6.4/download" + ], + "strip_prefix": "rand_core-0.6.4", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rand_core-0.6.4.bazel" } }, - "rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__rayon-1.7.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rayon/1.7.0/download" ], - "filename": "backports.tarfile-1.2.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "backports-tarfile==1.2.0", - "sha256": "77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", + "strip_prefix": "rayon-1.7.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rayon-1.7.0.bazel" + } + }, + "rules_rust_wasm_bindgen__rayon-core-1.11.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl" - ] + "https://static.crates.io/crates/rayon-core/1.11.0/download" + ], + "strip_prefix": "rayon-core-1.11.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rayon-core-1.11.0.bazel" } }, - "rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__redox_syscall-0.2.16": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/redox_syscall/0.2.16/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "redox_syscall-0.2.16", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.redox_syscall-0.2.16.bazel" + } + }, + "rules_rust_wasm_bindgen__redox_syscall-0.3.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/redox_syscall/0.3.5/download" ], - "filename": "markdown-it-py-3.0.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "markdown-it-py==3.0.0", - "sha256": "e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", + "strip_prefix": "redox_syscall-0.3.5", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.redox_syscall-0.3.5.bazel" + } + }, + "rules_rust_wasm_bindgen__regex-1.9.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz" - ] + "https://static.crates.io/crates/regex/1.9.1/download" + ], + "strip_prefix": "regex-1.9.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.regex-1.9.1.bazel" } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_ce031db0": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__regex-automata-0.1.10": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/regex-automata/0.1.10/download" ], - "filename": "charset_normalizer-3.4.0-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.4.0", - "sha256": "ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", + "strip_prefix": "regex-automata-0.1.10", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.regex-automata-0.1.10.bazel" + } + }, + "rules_rust_wasm_bindgen__regex-automata-0.3.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/e2/29/d227805bff72ed6d6cb1ce08eec707f7cfbd9868044893617eb331f16295/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" - ] + "https://static.crates.io/crates/regex-automata/0.3.3/download" + ], + "strip_prefix": "regex-automata-0.3.3", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.regex-automata-0.3.3.bazel" } }, - "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__regex-syntax-0.7.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/regex-syntax/0.7.4/download" ], - "filename": "nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe", + "strip_prefix": "regex-syntax-0.7.4", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.regex-syntax-0.7.4.bazel" + } + }, + "rules_rust_wasm_bindgen__ring-0.17.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/a3/da/0c4e282bc3cff4a0adf37005fa1fb42257673fbc1bbf7d1ff639ec3d255a/nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl" - ] + "https://static.crates.io/crates/ring/0.17.5/download" + ], + "strip_prefix": "ring-0.17.5", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.ring-0.17.5.bazel" } }, - "rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__rouille-3.6.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "3716fbf57fc1084d7a706adf4e445298d123e4a44294c4e8213caf1b85fcc921", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rouille/3.6.2/download" ], - "filename": "pkginfo-1.10.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pkginfo==1.10.0", - "sha256": "889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097", + "strip_prefix": "rouille-3.6.2", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rouille-3.6.2.bazel" + } + }, + "rules_rust_wasm_bindgen__rustc-demangle-0.1.23": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/56/09/054aea9b7534a15ad38a363a2bd974c20646ab1582a387a95b8df1bfea1c/pkginfo-1.10.0-py3-none-any.whl" - ] + "https://static.crates.io/crates/rustc-demangle/0.1.23/download" + ], + "strip_prefix": "rustc-demangle-0.1.23", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rustc-demangle-0.1.23.bazel" } }, - "rules_python_publish_deps_311_idna_py3_none_any_946d195a": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__rustix-0.37.23": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rustix/0.37.23/download" ], - "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", + "strip_prefix": "rustix-0.37.23", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rustix-0.37.23.bazel" + } + }, + "rules_rust_wasm_bindgen__rustls-0.21.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl" - ] + "https://static.crates.io/crates/rustls/0.21.8/download" + ], + "strip_prefix": "rustls-0.21.8", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rustls-0.21.8.bazel" } }, - "rules_python_publish_deps_311_nh3_sdist_94a16692": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__rustls-webpki-0.101.7": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/rustls-webpki/0.101.7/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "rustls-webpki-0.101.7", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rustls-webpki-0.101.7.bazel" + } + }, + "rules_rust_wasm_bindgen__ryu-1.0.14": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/ryu/1.0.14/download" ], - "filename": "nh3-0.2.18.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4", + "strip_prefix": "ryu-1.0.14", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.ryu-1.0.14.bazel" + } + }, + "rules_rust_wasm_bindgen__safemem-0.3.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/62/73/10df50b42ddb547a907deeb2f3c9823022580a7a47281e8eae8e003a9639/nh3-0.2.18.tar.gz" - ] + "https://static.crates.io/crates/safemem/0.3.3/download" + ], + "strip_prefix": "safemem-0.3.3", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.safemem-0.3.3.bazel" } }, - "rules_python_publish_deps_311_requests_sdist_55365417": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__scopeguard-1.1.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/scopeguard/1.1.0/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "scopeguard-1.1.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.scopeguard-1.1.0.bazel" + } + }, + "rules_rust_wasm_bindgen__sct-0.7.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/sct/0.7.1/download" ], - "filename": "requests-2.32.3.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "requests==2.32.3", - "sha256": "55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", + "strip_prefix": "sct-0.7.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.sct-0.7.1.bazel" + } + }, + "rules_rust_wasm_bindgen__semver-1.0.17": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz" - ] + "https://static.crates.io/crates/semver/1.0.17/download" + ], + "strip_prefix": "semver-1.0.17", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.semver-1.0.17.bazel" } }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_846da004": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__serde-1.0.171": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/serde/1.0.171/download" ], - "filename": "cryptography-43.0.3-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==43.0.3", - "sha256": "846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5", + "strip_prefix": "serde-1.0.171", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.serde-1.0.171.bazel" + } + }, + "rules_rust_wasm_bindgen__serde_derive-1.0.171": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/2f/78/55356eb9075d0be6e81b59f45c7b48df87f76a20e73893872170471f3ee8/cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - ] + "https://static.crates.io/crates/serde_derive/1.0.171/download" + ], + "strip_prefix": "serde_derive-1.0.171", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.serde_derive-1.0.171.bazel" } }, - "rules_python_publish_deps_311_pycparser_sdist_491c8be9": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__serde_json-1.0.102": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "pycparser-2.22.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pycparser==2.22", - "sha256": "491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", + "sha256": "b5062a995d481b2308b6064e9af76011f2921c35f97b0468811ed9f6cd91dfed", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz" - ] + "https://static.crates.io/crates/serde_json/1.0.102/download" + ], + "strip_prefix": "serde_json-1.0.102", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.serde_json-1.0.102.bazel" } }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__sha1_smol-1.0.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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": "nh3-0.2.18-cp37-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": "nh3==0.2.18", - "sha256": "de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307", + "sha256": "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/1b/63/6ab90d0e5225ab9780f6c9fb52254fa36b52bb7c188df9201d05b647e5e1/nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - ] + "https://static.crates.io/crates/sha1_smol/1.0.0/download" + ], + "strip_prefix": "sha1_smol-1.0.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.sha1_smol-1.0.0.bazel" } }, - "rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__spin-0.9.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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.18.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.18.0", - "sha256": "b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", + "sha256": "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl" - ] + "https://static.crates.io/crates/spin/0.9.8/download" + ], + "strip_prefix": "spin-0.9.8", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.spin-0.9.8.bazel" } }, - "rules_python_publish_deps_311_importlib_metadata_sdist_71522656": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__stable_deref_trait-1.2.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/stable_deref_trait/1.2.0/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "stable_deref_trait-1.2.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.stable_deref_trait-1.2.0.bazel" + } + }, + "rules_rust_wasm_bindgen__strsim-0.10.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/strsim/0.10.0/download" ], - "filename": "importlib_metadata-8.5.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "importlib-metadata==8.5.0", - "sha256": "71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", + "strip_prefix": "strsim-0.10.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.strsim-0.10.0.bazel" + } + }, + "rules_rust_wasm_bindgen__syn-1.0.109": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz" - ] + "https://static.crates.io/crates/syn/1.0.109/download" + ], + "strip_prefix": "syn-1.0.109", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.syn-1.0.109.bazel" } }, - "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_armv7l_3a157ab1": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__syn-2.0.25": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "15e3fc8c0c74267e2df136e5e5fb656a464158aa57624053375eb9c8c6e25ae2", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/syn/2.0.25/download" ], - "filename": "nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a", + "strip_prefix": "syn-2.0.25", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.syn-2.0.25.bazel" + } + }, + "rules_rust_wasm_bindgen__tempfile-3.6.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/de/81/c291231463d21da5f8bba82c8167a6d6893cc5419b0639801ee5d3aeb8a9/nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl" - ] + "https://static.crates.io/crates/tempfile/3.6.0/download" + ], + "strip_prefix": "tempfile-3.6.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.tempfile-3.6.0.bazel" } }, - "rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__termcolor-1.2.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/termcolor/1.2.0/download" ], - "filename": "jaraco.context-6.0.1-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-context==6.0.1", - "sha256": "f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", + "strip_prefix": "termcolor-1.2.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.termcolor-1.2.0.bazel" + } + }, + "rules_rust_wasm_bindgen__termtree-0.4.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl" - ] + "https://static.crates.io/crates/termtree/0.4.1/download" + ], + "strip_prefix": "termtree-0.4.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.termtree-0.4.1.bazel" } }, - "rules_python_publish_deps_311_more_itertools_py3_none_any_037b0d32": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__threadpool-1.8.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/threadpool/1.8.1/download" ], - "filename": "more_itertools-10.5.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==10.5.0", - "sha256": "037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef", + "strip_prefix": "threadpool-1.8.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.threadpool-1.8.1.bazel" + } + }, + "rules_rust_wasm_bindgen__time-0.3.23": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl" - ] + "https://static.crates.io/crates/time/0.3.23/download" + ], + "strip_prefix": "time-0.3.23", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.time-0.3.23.bazel" } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_63bc5c4a": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__time-core-0.1.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/time-core/0.1.1/download" ], - "filename": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", + "strip_prefix": "time-core-0.1.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.time-core-0.1.1.bazel" + } + }, + "rules_rust_wasm_bindgen__tiny_http-0.12.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "389915df6413a2e74fb181895f933386023c71110878cd0825588928e64cdc82", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/8d/c9/27e41d481557be53d51e60750b85aa40eaf52b841946b3cdeff363105737/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl" - ] + "https://static.crates.io/crates/tiny_http/0.12.0/download" + ], + "strip_prefix": "tiny_http-0.12.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.tiny_http-0.12.0.bazel" } }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__tinyvec-1.6.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/tinyvec/1.6.0/download" ], - "filename": "nh3-0.2.18-cp37-abi3-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": "nh3==0.2.18", - "sha256": "34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad", + "strip_prefix": "tinyvec-1.6.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.tinyvec-1.6.0.bazel" + } + }, + "rules_rust_wasm_bindgen__tinyvec_macros-0.1.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/ab/a7/375afcc710dbe2d64cfbd69e31f82f3e423d43737258af01f6a56d844085/nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" - ] + "https://static.crates.io/crates/tinyvec_macros/0.1.1/download" + ], + "strip_prefix": "tinyvec_macros-0.1.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.tinyvec_macros-0.1.1.bazel" } }, - "rules_python_publish_deps_311_rich_sdist_bc1e01b8": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__twoway-0.1.8": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "sha256": "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/twoway/0.1.8/download" ], - "filename": "rich-13.9.3.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "rich==13.9.3", - "sha256": "bc1e01b899537598cf02579d2b9f4a415104d3fc439313a7a2c165d76557a08e", + "strip_prefix": "twoway-0.1.8", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.twoway-0.1.8.bazel" + } + }, + "rules_rust_wasm_bindgen__unicase-2.6.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/d9/e9/cf9ef5245d835065e6673781dbd4b8911d352fb770d56cf0879cf11b7ee1/rich-13.9.3.tar.gz" - ] + "https://static.crates.io/crates/unicase/2.6.0/download" + ], + "strip_prefix": "unicase-2.6.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.unicase-2.6.0.bazel" } }, - "rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__unicode-bidi-0.3.13": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unicode-bidi/0.3.13/download" ], - "filename": "requests_toolbelt-1.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": "requests-toolbelt==1.0.0", - "sha256": "cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", + "strip_prefix": "unicode-bidi-0.3.13", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.unicode-bidi-0.3.13.bazel" + } + }, + "rules_rust_wasm_bindgen__unicode-ident-1.0.10": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl" - ] + "https://static.crates.io/crates/unicode-ident/1.0.10/download" + ], + "strip_prefix": "unicode-ident-1.0.10", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.unicode-ident-1.0.10.bazel" } }, - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_x86_64_610faea7": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__unicode-normalization-0.1.22": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/unicode-normalization/0.1.22/download" ], - "filename": "cffi-1.17.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.17.1", - "sha256": "610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", + "strip_prefix": "unicode-normalization-0.1.22", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.unicode-normalization-0.1.22.bazel" + } + }, + "rules_rust_wasm_bindgen__unicode-segmentation-1.10.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - ] + "https://static.crates.io/crates/unicode-segmentation/1.10.1/download" + ], + "strip_prefix": "unicode-segmentation-1.10.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.unicode-segmentation-1.10.1.bazel" } }, - "rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_fc48c783": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__untrusted-0.9.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/untrusted/0.9.0/download" ], - "filename": "cffi-1.17.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.17.1", - "sha256": "fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", + "strip_prefix": "untrusted-0.9.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.untrusted-0.9.0.bazel" + } + }, + "rules_rust_wasm_bindgen__ureq-2.8.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "f5ccd538d4a604753ebc2f17cd9946e89b77bf87f6a8e2309667c6f2e87855e3", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl" - ] + "https://static.crates.io/crates/ureq/2.8.0/download" + ], + "strip_prefix": "ureq-2.8.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.ureq-2.8.0.bazel" } }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_f7b178f1": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__url-2.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/url/2.4.0/download" ], - "filename": "cryptography-43.0.3-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==43.0.3", - "sha256": "f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7", + "strip_prefix": "url-2.4.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.url-2.4.0.bazel" + } + }, + "rules_rust_wasm_bindgen__version_check-0.9.4": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/7c/04/2345ca92f7a22f601a9c62961741ef7dd0127c39f7310dffa0041c80f16f/cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl" - ] + "https://static.crates.io/crates/version_check/0.9.4/download" + ], + "strip_prefix": "version_check-0.9.4", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.version_check-0.9.4.bazel" } }, - "rules_python_publish_deps_311_docutils_py3_none_any_dafca5b9": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__wait-timeout-0.2.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wait-timeout/0.2.0/download" ], - "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", + "strip_prefix": "wait-timeout-0.2.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wait-timeout-0.2.0.bazel" + } + }, + "rules_rust_wasm_bindgen__walrus-0.20.3": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "2c03529cd0c4400a2449f640d2f27cd1b48c3065226d15e26d98e4429ab0adb7", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl" - ] + "https://static.crates.io/crates/walrus/0.20.3/download" + ], + "strip_prefix": "walrus-0.20.3", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.walrus-0.20.3.bazel" } }, - "rules_python_publish_deps_311_pywin32_ctypes_py3_none_any_8a151337": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__walrus-macro-0.19.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "attributes": { - "dep_template": "@rules_python_publish_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_windows_x86_64" + "sha256": "0a6e5bd22c71e77d60140b0bd5be56155a37e5bd14e24f5f87298040d0cc40d7", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/walrus-macro/0.19.0/download" ], - "filename": "pywin32_ctypes-0.2.3-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.3", - "sha256": "8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", + "strip_prefix": "walrus-macro-0.19.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.walrus-macro-0.19.0.bazel" + } + }, + "rules_rust_wasm_bindgen__wasi-0.11.0-wasi-snapshot-preview1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl" - ] + "https://static.crates.io/crates/wasi/0.11.0+wasi-snapshot-preview1/download" + ], + "strip_prefix": "wasi-0.11.0+wasi-snapshot-preview1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasi-0.11.0+wasi-snapshot-preview1.bazel" } }, - "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__wasm-bindgen-0.2.92": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wasm-bindgen/0.2.92/download" ], - "filename": "nh3-0.2.18-cp37-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": "nh3==0.2.18", - "sha256": "36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204", + "strip_prefix": "wasm-bindgen-0.2.92", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-0.2.92.bazel" + } + }, + "rules_rust_wasm_bindgen__wasm-bindgen-backend-0.2.92": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/eb/61/73a007c74c37895fdf66e0edcd881f5eaa17a348ff02f4bb4bc906d61085/nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl" - ] + "https://static.crates.io/crates/wasm-bindgen-backend/0.2.92/download" + ], + "strip_prefix": "wasm-bindgen-backend-0.2.92", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-backend-0.2.92.bazel" } }, - "rules_python_publish_deps_311_jeepney_sdist_5efe48d2": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__wasm-bindgen-cli-support-0.2.92": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "ca821da8c1ae6c87c5e94493939a206daa8587caff227c6032e0061a3d80817f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wasm-bindgen-cli-support/0.2.92/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "wasm-bindgen-cli-support-0.2.92", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-cli-support-0.2.92.bazel" + } + }, + "rules_rust_wasm_bindgen__wasm-bindgen-externref-xform-0.2.92": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "102582726b35a30d53157fbf8de3d0f0fed4c40c0c7951d69a034e9ef01da725", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wasm-bindgen-externref-xform/0.2.92/download" ], - "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", + "strip_prefix": "wasm-bindgen-externref-xform-0.2.92", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-externref-xform-0.2.92.bazel" + } + }, + "rules_rust_wasm_bindgen__wasm-bindgen-macro-0.2.92": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wasm-bindgen-macro/0.2.92/download" + ], + "strip_prefix": "wasm-bindgen-macro-0.2.92", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-macro-0.2.92.bazel" + } + }, + "rules_rust_wasm_bindgen__wasm-bindgen-macro-support-0.2.92": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/d6/f4/154cf374c2daf2020e05c3c6a03c91348d59b23c5366e968feb198306fdf/jeepney-0.8.0.tar.gz" - ] + "https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.92/download" + ], + "strip_prefix": "wasm-bindgen-macro-support-0.2.92", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-macro-support-0.2.92.bazel" } }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_c2e6fc39": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__wasm-bindgen-multi-value-xform-0.2.92": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "3498e4799f43523d780ceff498f04d882a8dbc9719c28020034822e5952f32a4", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wasm-bindgen-multi-value-xform/0.2.92/download" ], - "filename": "cryptography-43.0.3-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==43.0.3", - "sha256": "c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405", + "strip_prefix": "wasm-bindgen-multi-value-xform-0.2.92", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-multi-value-xform-0.2.92.bazel" + } + }, + "rules_rust_wasm_bindgen__wasm-bindgen-shared-0.2.92": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/ac/25/e715fa0bc24ac2114ed69da33adf451a38abb6f3f24ec207908112e9ba53/cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl" - ] + "https://static.crates.io/crates/wasm-bindgen-shared/0.2.92/download" + ], + "strip_prefix": "wasm-bindgen-shared-0.2.92", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-shared-0.2.92.bazel" } }, - "rules_python_publish_deps_311_rfc3986_py2_none_any_50b1502b": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__wasm-bindgen-threads-xform-0.2.92": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "2d5add359b7f7d09a55299a9d29be54414264f2b8cf84f8c8fda5be9269b5dd9", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wasm-bindgen-threads-xform/0.2.92/download" ], - "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", + "strip_prefix": "wasm-bindgen-threads-xform-0.2.92", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-threads-xform-0.2.92.bazel" + } + }, + "rules_rust_wasm_bindgen__wasm-bindgen-wasm-conventions-0.2.92": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "8c04e3607b810e76768260db3a5f2e8beb477cb089ef8726da85c8eb9bd3b575", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl" - ] + "https://static.crates.io/crates/wasm-bindgen-wasm-conventions/0.2.92/download" + ], + "strip_prefix": "wasm-bindgen-wasm-conventions-0.2.92", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-wasm-conventions-0.2.92.bazel" } }, - "rules_python_publish_deps_311_zipp_sdist_bc9eb26f": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__wasm-bindgen-wasm-interpreter-0.2.92": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "9ea966593c8243a33eb4d643254eb97a69de04e89462f46cf6b4f506aae89b3a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wasm-bindgen-wasm-interpreter/0.2.92/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "wasm-bindgen-wasm-interpreter-0.2.92", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-wasm-interpreter-0.2.92.bazel" + } + }, + "rules_rust_wasm_bindgen__wasm-encoder-0.29.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "18c41dbd92eaebf3612a39be316540b8377c871cb9bde6b064af962984912881", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wasm-encoder/0.29.0/download" ], - "filename": "zipp-3.20.2.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "zipp==3.20.2", - "sha256": "bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29", + "strip_prefix": "wasm-encoder-0.29.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-encoder-0.29.0.bazel" + } + }, + "rules_rust_wasm_bindgen__wasmparser-0.102.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/54/bf/5c0000c44ebc80123ecbdddba1f5dcd94a5ada602a9c225d84b5aaa55e86/zipp-3.20.2.tar.gz" - ] + "https://static.crates.io/crates/wasmparser/0.102.0/download" + ], + "strip_prefix": "wasmparser-0.102.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasmparser-0.102.0.bazel" } }, - "rules_python_publish_deps": { - "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", - "ruleClassName": "hub_repository", + "rules_rust_wasm_bindgen__wasmparser-0.108.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "attributes": { - "repo_name": "rules_python_publish_deps", - "extra_hub_aliases": {}, - "whl_map": { - "backports_tarfile": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"backports.tarfile-1.2.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"backports_tarfile-1.2.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "certifi": "[{\"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\":null,\"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\":null,\"version\":\"3.11\"}]", - "cffi": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_aarch64_a1ed2dd2\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_46bf4316\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_s390x_a24ed04c\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.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_610faea7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_aarch64_a9b15d49\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_fc48c783\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cffi_sdist_1c39c601\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "charset_normalizer": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_bf4475b8\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_ce031db0\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8ff4e7cd\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-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_3710a975\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_47334db7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_f1a2f519\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_63bc5c4a\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_bcb4f8ea\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_sdist_223217c3\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "cryptography": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_846da004\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-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_0f996e72\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_f7b178f1\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_c2e6fc39\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_e1be4655\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_df6b6c6d\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cryptography_sdist_315b9001\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "docutils": "[{\"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\":null,\"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\":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\":null,\"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\":null,\"version\":\"3.11\"}]", - "importlib_metadata": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"importlib_metadata-8.5.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_importlib_metadata_py3_none_any_45e54197\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"importlib_metadata-8.5.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_importlib_metadata_sdist_71522656\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "jaraco_classes": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.classes-3.4.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.classes-3.4.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "jaraco_context": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.context-6.0.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco_context-6.0.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "jaraco_functools": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.functools-4.1.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco_functools-4.1.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2\",\"target_platforms\":null,\"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-25.4.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_keyring_py3_none_any_5426f817\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"keyring-25.4.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_keyring_sdist_b07ebc55\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "markdown_it_py": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"markdown-it-py-3.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"markdown_it_py-3.0.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684\",\"target_platforms\":null,\"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\"}]", - "more_itertools": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"more-itertools-10.5.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_more_itertools_sdist_5482bfef\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"more_itertools-10.5.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_more_itertools_py3_none_any_037b0d32\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "nh3": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_armv7l_0411beb0\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64_5f36b271\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_armv7l_3a157ab1\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-win_amd64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18.tar.gz\",\"repo\":\"rules_python_publish_deps_311_nh3_sdist_94a16692\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "pkginfo": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pkginfo-1.10.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pkginfo-1.10.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pkginfo_sdist_5df73835\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "pycparser": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pycparser-2.22-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pycparser_py3_none_any_c3702b6d\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pycparser-2.22.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pycparser_sdist_491c8be9\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "pygments": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pygments-2.18.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pygments-2.18.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pygments_sdist_786ff802\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "pywin32_ctypes": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pywin32-ctypes-0.2.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pywin32_ctypes_sdist_d162dc04\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pywin32_ctypes-0.2.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pywin32_ctypes_py3_none_any_8a151337\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "readme_renderer": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"readme_renderer-44.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"readme_renderer-44.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_readme_renderer_sdist_8712034e\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "requests": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests-2.32.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_requests_py3_none_any_70761cfe\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests-2.32.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_requests_sdist_55365417\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "requests_toolbelt": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests-toolbelt-1.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests_toolbelt-1.0.0-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66\",\"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\"}]", - "rich": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"rich-13.9.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_rich_py3_none_any_9836f509\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"rich-13.9.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_rich_sdist_bc1e01b8\",\"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\"}]", - "twine": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"twine-5.1.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_twine_py3_none_any_215dbe7b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"twine-5.1.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_twine_sdist_9aa08251\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "urllib3": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"urllib3-2.2.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_urllib3_py3_none_any_ca899ca0\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"urllib3-2.2.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_urllib3_sdist_e7d814a8\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "zipp": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"zipp-3.20.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_zipp_py3_none_any_a817ac80\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"zipp-3.20.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_zipp_sdist_bc9eb26f\",\"target_platforms\":null,\"version\":\"3.11\"}]" - }, - "packages": [ - "backports_tarfile", - "certifi", - "charset_normalizer", - "docutils", - "idna", - "importlib_metadata", - "jaraco_classes", - "jaraco_context", - "jaraco_functools", - "keyring", - "markdown_it_py", - "mdurl", - "more_itertools", - "nh3", - "pkginfo", - "pygments", - "readme_renderer", - "requests", - "requests_toolbelt", - "rfc3986", - "rich", - "twine", - "urllib3", - "zipp" + "sha256": "76c956109dcb41436a39391139d9b6e2d0a5e0b158e1293ef352ec977e5e36c5", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wasmparser/0.108.0/download" ], - "groups": {} + "strip_prefix": "wasmparser-0.108.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasmparser-0.108.0.bazel" } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__wasmparser-0.80.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "449167e2832691a1bff24cde28d2804e90e09586a448c8e76984792c44334a6b", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/wasmparser/0.80.2/download" ], - "filename": "charset_normalizer-3.4.0-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.4.0", - "sha256": "0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", + "strip_prefix": "wasmparser-0.80.2", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasmparser-0.80.2.bazel" + } + }, + "rules_rust_wasm_bindgen__wasmprinter-0.2.60": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b76cb909fe3d9b0de58cee1f4072247e680ff5cc1558ccad2790a9de14a23993", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/9c/61/73589dcc7a719582bf56aae309b6103d2762b526bffe189d635a7fcfd998/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl" - ] + "https://static.crates.io/crates/wasmprinter/0.2.60/download" + ], + "strip_prefix": "wasmprinter-0.2.60", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasmprinter-0.2.60.bazel" } }, - "rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__webpki-roots-0.25.2": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/webpki-roots/0.25.2/download" ], - "filename": "jaraco.classes-3.4.0-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.4.0", - "sha256": "f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", + "strip_prefix": "webpki-roots-0.25.2", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.webpki-roots-0.25.2.bazel" + } + }, + "rules_rust_wasm_bindgen__winapi-0.3.9": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl" - ] + "https://static.crates.io/crates/winapi/0.3.9/download" + ], + "strip_prefix": "winapi-0.3.9", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.winapi-0.3.9.bazel" } }, - "rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__winapi-i686-pc-windows-gnu-0.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winapi-i686-pc-windows-gnu/0.4.0/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "winapi-i686-pc-windows-gnu-0.4.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.winapi-i686-pc-windows-gnu-0.4.0.bazel" + } + }, + "rules_rust_wasm_bindgen__winapi-util-0.1.5": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/winapi-util/0.1.5/download" ], - "filename": "jaraco_context-6.0.1.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-context==6.0.1", - "sha256": "9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", + "strip_prefix": "winapi-util-0.1.5", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.winapi-util-0.1.5.bazel" + } + }, + "rules_rust_wasm_bindgen__winapi-x86_64-pc-windows-gnu-0.4.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz" - ] + "https://static.crates.io/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download" + ], + "strip_prefix": "winapi-x86_64-pc-windows-gnu-0.4.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.winapi-x86_64-pc-windows-gnu-0.4.0.bazel" } }, - "rules_python_publish_deps_311_requests_py3_none_any_70761cfe": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__windows-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows/0.48.0/download" ], - "filename": "requests-2.32.3-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "requests==2.32.3", - "sha256": "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", + "strip_prefix": "windows-0.48.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows-0.48.0.bazel" + } + }, + "rules_rust_wasm_bindgen__windows-sys-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl" - ] + "https://static.crates.io/crates/windows-sys/0.48.0/download" + ], + "strip_prefix": "windows-sys-0.48.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows-sys-0.48.0.bazel" } }, - "rules_python_publish_deps_311_readme_renderer_sdist_8712034e": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__windows-targets-0.48.1": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows-targets/0.48.1/download" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" + "strip_prefix": "windows-targets-0.48.1", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows-targets-0.48.1.bazel" + } + }, + "rules_rust_wasm_bindgen__windows_aarch64_gnullvm-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.0/download" ], - "filename": "readme_renderer-44.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "readme-renderer==44.0", - "sha256": "8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1", + "strip_prefix": "windows_aarch64_gnullvm-0.48.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows_aarch64_gnullvm-0.48.0.bazel" + } + }, + "rules_rust_wasm_bindgen__windows_aarch64_msvc-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/5a/a9/104ec9234c8448c4379768221ea6df01260cd6c2ce13182d4eac531c8342/readme_renderer-44.0.tar.gz" - ] + "https://static.crates.io/crates/windows_aarch64_msvc/0.48.0/download" + ], + "strip_prefix": "windows_aarch64_msvc-0.48.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows_aarch64_msvc-0.48.0.bazel" } }, - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_aarch64_a1ed2dd2": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__windows_i686_gnu-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_i686_gnu/0.48.0/download" ], - "filename": "cffi-1.17.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.17.1", - "sha256": "a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", + "strip_prefix": "windows_i686_gnu-0.48.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows_i686_gnu-0.48.0.bazel" + } + }, + "rules_rust_wasm_bindgen__windows_i686_msvc-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - ] + "https://static.crates.io/crates/windows_i686_msvc/0.48.0/download" + ], + "strip_prefix": "windows_i686_msvc-0.48.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows_i686_msvc-0.48.0.bazel" } }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8ff4e7cd": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__windows_x86_64_gnu-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_x86_64_gnu/0.48.0/download" ], - "filename": "charset_normalizer-3.4.0-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.4.0", - "sha256": "8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", + "strip_prefix": "windows_x86_64_gnu-0.48.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows_x86_64_gnu-0.48.0.bazel" + } + }, + "rules_rust_wasm_bindgen__windows_x86_64_gnullvm-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953", + "type": "tar.gz", "urls": [ - "https://files.pythonhosted.org/packages/13/bc/87c2c9f2c144bedfa62f894c3007cd4530ba4b5351acb10dc786428a50f0/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" - ] + "https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.0/download" + ], + "strip_prefix": "windows_x86_64_gnullvm-0.48.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows_x86_64_gnullvm-0.48.0.bazel" } }, - "rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", + "rules_rust_wasm_bindgen__windows_x86_64_msvc-0.48.0": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", "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" + "sha256": "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a", + "type": "tar.gz", + "urls": [ + "https://static.crates.io/crates/windows_x86_64_msvc/0.48.0/download" ], - "filename": "jaraco.functools-4.1.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-functools==4.1.0", - "sha256": "ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649", + "strip_prefix": "windows_x86_64_msvc-0.48.0", + "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows_x86_64_msvc-0.48.0.bazel" + } + }, + "rules_rust_test_load_arbitrary_tool": { + "bzlFile": "@@rules_rust~//test/load_arbitrary_tool:load_arbitrary_tool_test.bzl", + "ruleClassName": "_load_arbitrary_tool_test", + "attributes": {} + }, + "generated_inputs_in_external_repo": { + "bzlFile": "@@rules_rust~//test/generated_inputs:external_repo.bzl", + "ruleClassName": "_generated_inputs_in_external_repo", + "attributes": {} + }, + "libc": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "build_file_content": "load(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\nrust_library(\n name = \"libc\",\n srcs = glob([\"src/**/*.rs\"]),\n edition = \"2015\",\n rustc_flags = [\n # In most cases, warnings in 3rd party crates are not interesting as\n # they're out of the control of consumers. The flag here silences\n # warnings. For more details see:\n # https://doc.rust-lang.org/rustc/lints/levels.html\n \"--cap-lints=allow\",\n ],\n visibility = [\"//visibility:public\"],\n)\n", + "sha256": "1ac4c2ac6ed5a8fb9020c166bc63316205f1dc78d4b964ad31f4f21eb73f0c6d", + "strip_prefix": "libc-0.2.20", "urls": [ - "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl" + "https://mirror.bazel.build/github.com/rust-lang/libc/archive/0.2.20.zip", + "https://github.com/rust-lang/libc/archive/0.2.20.zip" ] } + }, + "rules_rust_toolchain_test_target_json": { + "bzlFile": "@@rules_rust~//test/unit/toolchain:toolchain_test_utils.bzl", + "ruleClassName": "rules_rust_toolchain_test_target_json_repository", + "attributes": { + "target_json": "@@rules_rust~//test/unit/toolchain:toolchain-test-triple.json" + } + }, + "com_google_googleapis": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "urls": [ + "https://github.com/googleapis/googleapis/archive/18becb1d1426feb7399db144d7beeb3284f1ccb0.zip" + ], + "strip_prefix": "googleapis-18becb1d1426feb7399db144d7beeb3284f1ccb0", + "sha256": "b8c487191eb942361af905e40172644eab490190e717c3d09bf83e87f3994fff" + } + }, + "rules_python": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "sha256": "778aaeab3e6cfd56d681c89f5c10d7ad6bf8d2f1a72de9de55b23081b2d31618", + "strip_prefix": "rules_python-0.34.0", + "url": "https://github.com/bazelbuild/rules_python/releases/download/0.34.0/rules_python-0.34.0.tar.gz" + } } }, + "moduleExtensionMetadata": { + "explicitRootModuleDirectDeps": [ + "rules_rust_tinyjson", + "cui", + "cui__anyhow-1.0.89", + "cui__camino-1.1.9", + "cui__cargo-lock-10.0.0", + "cui__cargo-platform-0.1.7", + "cui__cargo_metadata-0.18.1", + "cui__cargo_toml-0.20.5", + "cui__cfg-expr-0.17.0", + "cui__clap-4.3.11", + "cui__crates-index-3.2.0", + "cui__hex-0.4.3", + "cui__indoc-2.0.5", + "cui__itertools-0.13.0", + "cui__normpath-1.3.0", + "cui__once_cell-1.20.2", + "cui__pathdiff-0.2.2", + "cui__regex-1.11.0", + "cui__semver-1.0.23", + "cui__serde-1.0.210", + "cui__serde_json-1.0.129", + "cui__serde_starlark-0.1.16", + "cui__sha2-0.10.8", + "cui__spdx-0.10.6", + "cui__tempfile-3.13.0", + "cui__tera-1.19.1", + "cui__textwrap-0.16.1", + "cui__toml-0.8.19", + "cui__tracing-0.1.40", + "cui__tracing-subscriber-0.3.18", + "cui__url-2.5.2", + "cui__maplit-1.0.2", + "cargo_bazel.buildifier-darwin-amd64", + "cargo_bazel.buildifier-darwin-arm64", + "cargo_bazel.buildifier-linux-amd64", + "cargo_bazel.buildifier-linux-arm64", + "cargo_bazel.buildifier-linux-s390x", + "cargo_bazel.buildifier-windows-amd64.exe", + "rules_rust_prost__heck", + "rules_rust_prost", + "rules_rust_prost__h2-0.4.6", + "rules_rust_prost__prost-0.13.1", + "rules_rust_prost__prost-types-0.13.1", + "rules_rust_prost__protoc-gen-prost-0.4.0", + "rules_rust_prost__protoc-gen-tonic-0.4.1", + "rules_rust_prost__tokio-1.39.3", + "rules_rust_prost__tokio-stream-0.1.15", + "rules_rust_prost__tonic-0.12.1", + "rules_rust_proto__grpc-0.6.2", + "rules_rust_proto__grpc-compiler-0.6.2", + "rules_rust_proto__log-0.4.17", + "rules_rust_proto__protobuf-2.8.2", + "rules_rust_proto__protobuf-codegen-2.8.2", + "rules_rust_proto__tls-api-0.1.22", + "rules_rust_proto__tls-api-stub-0.1.22", + "llvm-raw", + "rules_rust_bindgen__bindgen-cli-0.70.1", + "rules_rust_bindgen__bindgen-0.70.1", + "rules_rust_bindgen__clang-sys-1.8.1", + "rules_rust_bindgen__clap-4.5.17", + "rules_rust_bindgen__clap_complete-4.5.26", + "rules_rust_bindgen__env_logger-0.10.2", + "rrra__anyhow-1.0.71", + "rrra__clap-4.3.11", + "rrra__env_logger-0.10.0", + "rrra__itertools-0.11.0", + "rrra__log-0.4.19", + "rrra__serde-1.0.171", + "rrra__serde_json-1.0.102", + "rules_rust_wasm_bindgen_cli", + "rules_rust_wasm_bindgen__anyhow-1.0.71", + "rules_rust_wasm_bindgen__docopt-1.1.1", + "rules_rust_wasm_bindgen__env_logger-0.8.4", + "rules_rust_wasm_bindgen__log-0.4.19", + "rules_rust_wasm_bindgen__rouille-3.6.2", + "rules_rust_wasm_bindgen__serde-1.0.171", + "rules_rust_wasm_bindgen__serde_derive-1.0.171", + "rules_rust_wasm_bindgen__serde_json-1.0.102", + "rules_rust_wasm_bindgen__ureq-2.8.0", + "rules_rust_wasm_bindgen__walrus-0.20.3", + "rules_rust_wasm_bindgen__wasm-bindgen-0.2.92", + "rules_rust_wasm_bindgen__wasm-bindgen-cli-support-0.2.92", + "rules_rust_wasm_bindgen__wasm-bindgen-shared-0.2.92", + "rules_rust_wasm_bindgen__assert_cmd-1.0.8", + "rules_rust_wasm_bindgen__diff-0.1.13", + "rules_rust_wasm_bindgen__predicates-1.0.8", + "rules_rust_wasm_bindgen__rayon-1.7.0", + "rules_rust_wasm_bindgen__tempfile-3.6.0", + "rules_rust_wasm_bindgen__wasmparser-0.102.0", + "rules_rust_wasm_bindgen__wasmprinter-0.2.60", + "rules_rust_test_load_arbitrary_tool", + "generated_inputs_in_external_repo", + "libc", + "rules_rust_toolchain_test_target_json", + "com_google_googleapis", + "rules_python" + ], + "explicitRootModuleDirectDevDeps": [], + "useAllRepos": "NO", + "reproducible": false + }, "recordedRepoMappingEntries": [ [ - "bazel_features~", - "bazel_features_globals", - "bazel_features~~version_extension~bazel_features_globals" + "rules_rust~", + "bazel_skylib", + "bazel_skylib~" + ], + [ + "rules_rust~", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_rust~", + "cui__anyhow-1.0.89", + "rules_rust~~i~cui__anyhow-1.0.89" + ], + [ + "rules_rust~", + "cui__camino-1.1.9", + "rules_rust~~i~cui__camino-1.1.9" + ], + [ + "rules_rust~", + "cui__cargo-lock-10.0.0", + "rules_rust~~i~cui__cargo-lock-10.0.0" + ], + [ + "rules_rust~", + "cui__cargo-platform-0.1.7", + "rules_rust~~i~cui__cargo-platform-0.1.7" + ], + [ + "rules_rust~", + "cui__cargo_metadata-0.18.1", + "rules_rust~~i~cui__cargo_metadata-0.18.1" + ], + [ + "rules_rust~", + "cui__cargo_toml-0.20.5", + "rules_rust~~i~cui__cargo_toml-0.20.5" + ], + [ + "rules_rust~", + "cui__cfg-expr-0.17.0", + "rules_rust~~i~cui__cfg-expr-0.17.0" + ], + [ + "rules_rust~", + "cui__clap-4.3.11", + "rules_rust~~i~cui__clap-4.3.11" + ], + [ + "rules_rust~", + "cui__crates-index-3.2.0", + "rules_rust~~i~cui__crates-index-3.2.0" + ], + [ + "rules_rust~", + "cui__hex-0.4.3", + "rules_rust~~i~cui__hex-0.4.3" + ], + [ + "rules_rust~", + "cui__indoc-2.0.5", + "rules_rust~~i~cui__indoc-2.0.5" + ], + [ + "rules_rust~", + "cui__itertools-0.13.0", + "rules_rust~~i~cui__itertools-0.13.0" + ], + [ + "rules_rust~", + "cui__maplit-1.0.2", + "rules_rust~~i~cui__maplit-1.0.2" + ], + [ + "rules_rust~", + "cui__normpath-1.3.0", + "rules_rust~~i~cui__normpath-1.3.0" + ], + [ + "rules_rust~", + "cui__once_cell-1.20.2", + "rules_rust~~i~cui__once_cell-1.20.2" + ], + [ + "rules_rust~", + "cui__pathdiff-0.2.2", + "rules_rust~~i~cui__pathdiff-0.2.2" + ], + [ + "rules_rust~", + "cui__regex-1.11.0", + "rules_rust~~i~cui__regex-1.11.0" + ], + [ + "rules_rust~", + "cui__semver-1.0.23", + "rules_rust~~i~cui__semver-1.0.23" + ], + [ + "rules_rust~", + "cui__serde-1.0.210", + "rules_rust~~i~cui__serde-1.0.210" + ], + [ + "rules_rust~", + "cui__serde_json-1.0.129", + "rules_rust~~i~cui__serde_json-1.0.129" + ], + [ + "rules_rust~", + "cui__serde_starlark-0.1.16", + "rules_rust~~i~cui__serde_starlark-0.1.16" + ], + [ + "rules_rust~", + "cui__sha2-0.10.8", + "rules_rust~~i~cui__sha2-0.10.8" + ], + [ + "rules_rust~", + "cui__spdx-0.10.6", + "rules_rust~~i~cui__spdx-0.10.6" + ], + [ + "rules_rust~", + "cui__tempfile-3.13.0", + "rules_rust~~i~cui__tempfile-3.13.0" + ], + [ + "rules_rust~", + "cui__tera-1.19.1", + "rules_rust~~i~cui__tera-1.19.1" + ], + [ + "rules_rust~", + "cui__textwrap-0.16.1", + "rules_rust~~i~cui__textwrap-0.16.1" + ], + [ + "rules_rust~", + "cui__toml-0.8.19", + "rules_rust~~i~cui__toml-0.8.19" + ], + [ + "rules_rust~", + "cui__tracing-0.1.40", + "rules_rust~~i~cui__tracing-0.1.40" + ], + [ + "rules_rust~", + "cui__tracing-subscriber-0.3.18", + "rules_rust~~i~cui__tracing-subscriber-0.3.18" + ], + [ + "rules_rust~", + "cui__url-2.5.2", + "rules_rust~~i~cui__url-2.5.2" + ], + [ + "rules_rust~", + "rrra__anyhow-1.0.71", + "rules_rust~~i~rrra__anyhow-1.0.71" + ], + [ + "rules_rust~", + "rrra__clap-4.3.11", + "rules_rust~~i~rrra__clap-4.3.11" + ], + [ + "rules_rust~", + "rrra__env_logger-0.10.0", + "rules_rust~~i~rrra__env_logger-0.10.0" + ], + [ + "rules_rust~", + "rrra__itertools-0.11.0", + "rules_rust~~i~rrra__itertools-0.11.0" + ], + [ + "rules_rust~", + "rrra__log-0.4.19", + "rules_rust~~i~rrra__log-0.4.19" ], [ - "bazel_features~", - "bazel_features_version", - "bazel_features~~version_extension~bazel_features_version" + "rules_rust~", + "rrra__serde-1.0.171", + "rules_rust~~i~rrra__serde-1.0.171" ], [ - "rules_python~", - "bazel_features", - "bazel_features~" + "rules_rust~", + "rrra__serde_json-1.0.102", + "rules_rust~~i~rrra__serde_json-1.0.102" ], [ - "rules_python~", - "bazel_skylib", - "bazel_skylib~" + "rules_rust~", + "rules_cc", + "rules_cc~" ], [ - "rules_python~", - "bazel_tools", - "bazel_tools" + "rules_rust~", + "rules_rust", + "rules_rust~" ], [ - "rules_python~", - "pypi__build", - "rules_python~~internal_deps~pypi__build" + "rules_rust~", + "rules_rust_bindgen__bindgen-0.70.1", + "rules_rust~~i~rules_rust_bindgen__bindgen-0.70.1" ], [ - "rules_python~", - "pypi__click", - "rules_python~~internal_deps~pypi__click" + "rules_rust~", + "rules_rust_bindgen__clang-sys-1.8.1", + "rules_rust~~i~rules_rust_bindgen__clang-sys-1.8.1" ], [ - "rules_python~", - "pypi__colorama", - "rules_python~~internal_deps~pypi__colorama" + "rules_rust~", + "rules_rust_bindgen__clap-4.5.17", + "rules_rust~~i~rules_rust_bindgen__clap-4.5.17" ], [ - "rules_python~", - "pypi__importlib_metadata", - "rules_python~~internal_deps~pypi__importlib_metadata" + "rules_rust~", + "rules_rust_bindgen__clap_complete-4.5.26", + "rules_rust~~i~rules_rust_bindgen__clap_complete-4.5.26" ], [ - "rules_python~", - "pypi__installer", - "rules_python~~internal_deps~pypi__installer" + "rules_rust~", + "rules_rust_bindgen__env_logger-0.10.2", + "rules_rust~~i~rules_rust_bindgen__env_logger-0.10.2" ], [ - "rules_python~", - "pypi__more_itertools", - "rules_python~~internal_deps~pypi__more_itertools" + "rules_rust~", + "rules_rust_prost__h2-0.4.6", + "rules_rust~~i~rules_rust_prost__h2-0.4.6" ], [ - "rules_python~", - "pypi__packaging", - "rules_python~~internal_deps~pypi__packaging" + "rules_rust~", + "rules_rust_prost__prost-0.13.1", + "rules_rust~~i~rules_rust_prost__prost-0.13.1" ], [ - "rules_python~", - "pypi__pep517", - "rules_python~~internal_deps~pypi__pep517" + "rules_rust~", + "rules_rust_prost__prost-types-0.13.1", + "rules_rust~~i~rules_rust_prost__prost-types-0.13.1" ], [ - "rules_python~", - "pypi__pip", - "rules_python~~internal_deps~pypi__pip" + "rules_rust~", + "rules_rust_prost__protoc-gen-prost-0.4.0", + "rules_rust~~i~rules_rust_prost__protoc-gen-prost-0.4.0" ], [ - "rules_python~", - "pypi__pip_tools", - "rules_python~~internal_deps~pypi__pip_tools" + "rules_rust~", + "rules_rust_prost__protoc-gen-tonic-0.4.1", + "rules_rust~~i~rules_rust_prost__protoc-gen-tonic-0.4.1" ], [ - "rules_python~", - "pypi__pyproject_hooks", - "rules_python~~internal_deps~pypi__pyproject_hooks" + "rules_rust~", + "rules_rust_prost__tokio-1.39.3", + "rules_rust~~i~rules_rust_prost__tokio-1.39.3" ], [ - "rules_python~", - "pypi__setuptools", - "rules_python~~internal_deps~pypi__setuptools" + "rules_rust~", + "rules_rust_prost__tokio-stream-0.1.15", + "rules_rust~~i~rules_rust_prost__tokio-stream-0.1.15" ], [ - "rules_python~", - "pypi__tomli", - "rules_python~~internal_deps~pypi__tomli" + "rules_rust~", + "rules_rust_prost__tonic-0.12.1", + "rules_rust~~i~rules_rust_prost__tonic-0.12.1" ], [ - "rules_python~", - "pypi__wheel", - "rules_python~~internal_deps~pypi__wheel" + "rules_rust~", + "rules_rust_proto__grpc-0.6.2", + "rules_rust~~i~rules_rust_proto__grpc-0.6.2" ], [ - "rules_python~", - "pypi__zipp", - "rules_python~~internal_deps~pypi__zipp" + "rules_rust~", + "rules_rust_proto__grpc-compiler-0.6.2", + "rules_rust~~i~rules_rust_proto__grpc-compiler-0.6.2" ], [ - "rules_python~", - "pythons_hub", - "rules_python~~python~pythons_hub" + "rules_rust~", + "rules_rust_proto__log-0.4.17", + "rules_rust~~i~rules_rust_proto__log-0.4.17" ], [ - "rules_python~~python~pythons_hub", - "python_3_10_host", - "rules_python~~python~python_3_10_host" + "rules_rust~", + "rules_rust_proto__protobuf-2.8.2", + "rules_rust~~i~rules_rust_proto__protobuf-2.8.2" ], [ - "rules_python~~python~pythons_hub", - "python_3_11_host", - "rules_python~~python~python_3_11_host" + "rules_rust~", + "rules_rust_proto__protobuf-codegen-2.8.2", + "rules_rust~~i~rules_rust_proto__protobuf-codegen-2.8.2" ], [ - "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": "umgu1yR4Wmqb1pJa+9hAcs9dPbeqBsPLceKiaEg3DdQ=", - "usagesDigest": "+2swUSSDNmjk5bxS7cNIRrfF+M/iuc8Zc7vI5xUBcRs=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "uv_linux_aarch64": { - "bzlFile": "@@rules_python~//python/uv:repositories.bzl", - "ruleClassName": "uv_repository", - "attributes": { - "uv_version": "0.4.25", - "platform": "aarch64-unknown-linux-gnu" - } - }, - "uv_darwin_aarch64": { - "bzlFile": "@@rules_python~//python/uv:repositories.bzl", - "ruleClassName": "uv_repository", - "attributes": { - "uv_version": "0.4.25", - "platform": "aarch64-apple-darwin" - } - }, - "uv_linux_s390x": { - "bzlFile": "@@rules_python~//python/uv:repositories.bzl", - "ruleClassName": "uv_repository", - "attributes": { - "uv_version": "0.4.25", - "platform": "s390x-unknown-linux-gnu" - } - }, - "uv_linux_ppc": { - "bzlFile": "@@rules_python~//python/uv:repositories.bzl", - "ruleClassName": "uv_repository", - "attributes": { - "uv_version": "0.4.25", - "platform": "powerpc64le-unknown-linux-gnu" - } - }, - "uv_linux_x86_64": { - "bzlFile": "@@rules_python~//python/uv:repositories.bzl", - "ruleClassName": "uv_repository", - "attributes": { - "uv_version": "0.4.25", - "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.4.25", - "platform": "x86_64-apple-darwin" - } - }, - "uv_windows_x86_64": { - "bzlFile": "@@rules_python~//python/uv:repositories.bzl", - "ruleClassName": "uv_repository", - "attributes": { - "uv_version": "0.4.25", - "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": [ + "rules_rust~", + "rules_rust_proto__tls-api-0.1.22", + "rules_rust~~i~rules_rust_proto__tls-api-0.1.22" + ], [ - "upb~", - "bazel_tools", - "bazel_tools" + "rules_rust~", + "rules_rust_proto__tls-api-stub-0.1.22", + "rules_rust~~i~rules_rust_proto__tls-api-stub-0.1.22" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__anyhow-1.0.71", + "rules_rust~~i~rules_rust_wasm_bindgen__anyhow-1.0.71" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__assert_cmd-1.0.8", + "rules_rust~~i~rules_rust_wasm_bindgen__assert_cmd-1.0.8" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__diff-0.1.13", + "rules_rust~~i~rules_rust_wasm_bindgen__diff-0.1.13" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__docopt-1.1.1", + "rules_rust~~i~rules_rust_wasm_bindgen__docopt-1.1.1" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__env_logger-0.8.4", + "rules_rust~~i~rules_rust_wasm_bindgen__env_logger-0.8.4" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__log-0.4.19", + "rules_rust~~i~rules_rust_wasm_bindgen__log-0.4.19" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__predicates-1.0.8", + "rules_rust~~i~rules_rust_wasm_bindgen__predicates-1.0.8" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__rayon-1.7.0", + "rules_rust~~i~rules_rust_wasm_bindgen__rayon-1.7.0" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__rouille-3.6.2", + "rules_rust~~i~rules_rust_wasm_bindgen__rouille-3.6.2" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__serde-1.0.171", + "rules_rust~~i~rules_rust_wasm_bindgen__serde-1.0.171" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__serde_derive-1.0.171", + "rules_rust~~i~rules_rust_wasm_bindgen__serde_derive-1.0.171" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__serde_json-1.0.102", + "rules_rust~~i~rules_rust_wasm_bindgen__serde_json-1.0.102" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__tempfile-3.6.0", + "rules_rust~~i~rules_rust_wasm_bindgen__tempfile-3.6.0" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__ureq-2.8.0", + "rules_rust~~i~rules_rust_wasm_bindgen__ureq-2.8.0" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__walrus-0.20.3", + "rules_rust~~i~rules_rust_wasm_bindgen__walrus-0.20.3" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__wasm-bindgen-0.2.92", + "rules_rust~~i~rules_rust_wasm_bindgen__wasm-bindgen-0.2.92" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__wasm-bindgen-cli-support-0.2.92", + "rules_rust~~i~rules_rust_wasm_bindgen__wasm-bindgen-cli-support-0.2.92" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__wasm-bindgen-shared-0.2.92", + "rules_rust~~i~rules_rust_wasm_bindgen__wasm-bindgen-shared-0.2.92" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__wasmparser-0.102.0", + "rules_rust~~i~rules_rust_wasm_bindgen__wasmparser-0.102.0" + ], + [ + "rules_rust~", + "rules_rust_wasm_bindgen__wasmprinter-0.2.60", + "rules_rust~~i~rules_rust_wasm_bindgen__wasmprinter-0.2.60" ] ] } diff --git a/examples/bzlmod_build_file_generation/MODULE.bazel b/examples/bzlmod_build_file_generation/MODULE.bazel index 6bc5880792..2ba52466ae 100644 --- a/examples/bzlmod_build_file_generation/MODULE.bazel +++ b/examples/bzlmod_build_file_generation/MODULE.bazel @@ -85,3 +85,6 @@ local_path_override( module_name = "other_module", path = "other_module", ) + +# Only needed to make rules_python's CI happy +bazel_dep(name = "rules_java", version = "8.3.0") diff --git a/examples/multi_python_versions/MODULE.bazel b/examples/multi_python_versions/MODULE.bazel index c1c0778b23..51ed6f134d 100644 --- a/examples/multi_python_versions/MODULE.bazel +++ b/examples/multi_python_versions/MODULE.bazel @@ -59,3 +59,7 @@ pip.parse( # 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.0") diff --git a/internal_deps.bzl b/internal_deps.bzl index 9f78a1db45..33decba9fc 100644 --- a/internal_deps.bzl +++ b/internal_deps.bzl @@ -178,10 +178,10 @@ def rules_python_internal_deps(): http_archive( name = "com_google_protobuf", - sha256 = "616bb3536ac1fff3fb1a141450fa28b875e985712170ea7f1bfe5e5fc41e2cd8", - strip_prefix = "protobuf-24.4", + sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", + strip_prefix = "protobuf-27.0", urls = [ - "https://github.com/protocolbuffers/protobuf/releases/download/v24.4/protobuf-24.4.tar.gz", + "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protobuf-27.0.tar.gz", ], ) @@ -224,9 +224,9 @@ def rules_python_internal_deps(): 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.14/rules_cc-0.0.14.tar.gz"], + sha256 = "906e89286acc67c20819c3c88b3283de0d5868afda33635d70acae0de9777bb7", + strip_prefix = "rules_cc-0.0.14", ) http_archive( diff --git a/patches/gazelle_native_sh.patch b/patches/gazelle_native_sh.patch new file mode 100644 index 0000000000..836fe7ca8c --- /dev/null +++ b/patches/gazelle_native_sh.patch @@ -0,0 +1,32 @@ + +diff -u -r a/def.bzl b/def.bzl +--- a/def.bzl 2024-11-08 13:42:27.733022366 -0800 ++++ b/def.bzl 2024-11-08 13:44:45.089900166 -0800 +@@ -16,6 +16,7 @@ + "@bazel_skylib//lib:shell.bzl", + "shell", + ) ++load("@rules_shell//shell:sh_binary.bzl", "sh_binary") + load( + "@bazel_gazelle_is_bazel_module//:defs.bzl", + "GAZELLE_IS_BAZEL_MODULE", +@@ -185,7 +186,7 @@ + tags = tags, + **kwargs + ) +- native.sh_binary( ++ sh_binary( + name = name, + srcs = [runner_name], + tags = tags, +diff -u -r a/MODULE.bazel b/MODULE.bazel +--- a/MODULE.bazel 2024-11-08 13:42:23.860997684 -0800 ++++ b/MODULE.bazel 2024-11-08 13:43:46.961528172 -0800 +@@ -8,6 +8,7 @@ + bazel_dep(name = "protobuf", version = "3.19.6", repo_name = "com_google_protobuf") + bazel_dep(name = "rules_go", version = "0.41.0", repo_name = "io_bazel_rules_go") + bazel_dep(name = "rules_proto", version = "4.0.0") ++bazel_dep(name = "rules_shell", version = "0.2.0") + + go_sdk = use_extension("@io_bazel_rules_go//go:extensions.bzl", "go_sdk") + diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 6bb6a9f668..8410f3154e 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -634,7 +634,16 @@ bzl_library( # @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"], + 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"], ) diff --git a/python/private/py_repositories.bzl b/python/private/py_repositories.bzl index 26b2c780a3..f11d3d1b56 100644 --- a/python/private/py_repositories.bzl +++ b/python/private/py_repositories.bzl @@ -59,6 +59,7 @@ def py_repositories(): strip_prefix = "rules_cc-0.0.13", urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.13/rules_cc-0.0.13.tar.gz"], ) + http_archive( name = "protobuf", sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", diff --git a/tests/integration/ignore_root_user_error/bzlmod_test.py b/tests/integration/ignore_root_user_error/bzlmod_test.py index 1283415987..a1d6dc0630 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/support/sh_py_run_test.bzl b/tests/support/sh_py_run_test.bzl index 066f091650..c191b3974b 100644 --- a/tests/support/sh_py_run_test.bzl +++ b/tests/support/sh_py_run_test.bzl @@ -158,7 +158,7 @@ def sh_py_run_test(*, name, sh_src, py_src, **kwargs): "@bazel_tools//tools/bash/runfiles", ], env = { - "BIN_RLOCATION": "$(rlocationpath {})".format(bin_name), + "BIN_RLOCATION": "$(rlocationpaths {})".format(bin_name), }, ) From 576e6dcf950c783382bdba477fe30b53799b3ca5 Mon Sep 17 00:00:00 2001 From: Ivo List Date: Tue, 12 Nov 2024 09:14:54 +0100 Subject: [PATCH 306/345] chore: remove references to @rules_cc//cc:defs.bzl (#2293) Referring to @rules_cc//cc:defs.bzl, refers to @protobuf//bazel:cc_proto_library.bzl, which fetches protobuf repository. Referring directly to what's needed limits the fetches just to rules_cc. Fix reference to bzl libs in rules_cc that are needed for docs generation. This requires rules_cc 0.0.13 or higher. Work towards https://github.com/bazelbuild/rules_python/issues/2387, https://github.com/bazelbuild/rules_python/issues/2378 --------- Co-authored-by: Richard Levasseur --- python/private/BUILD.bazel | 6 ++++-- python/private/attributes.bzl | 2 +- python/private/common_bazel.bzl | 3 ++- python/private/current_py_cc_headers.bzl | 2 +- python/private/current_py_cc_libs.bzl | 2 +- python/private/hermetic_runtime_repo_setup.bzl | 3 ++- python/private/local_runtime_repo_setup.bzl | 2 +- python/private/py_cc_link_params_info.bzl | 2 +- python/private/py_cc_toolchain_rule.bzl | 2 +- python/private/py_executable.bzl | 2 +- python/private/py_repositories.bzl | 1 + python/private/runtime_env_toolchain.bzl | 2 +- python/private/whl_filegroup/whl_filegroup.bzl | 2 +- .../current_py_cc_headers/current_py_cc_headers_tests.bzl | 2 +- tests/cc/current_py_cc_libs/current_py_cc_libs_tests.bzl | 2 +- tests/support/cc_toolchains/BUILD.bazel | 3 ++- tests/support/cc_toolchains/fake_cc_toolchain_config.bzl | 2 +- tests/whl_filegroup/BUILD.bazel | 3 ++- 18 files changed, 25 insertions(+), 18 deletions(-) diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 8410f3154e..39af217bfe 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -631,7 +631,6 @@ bzl_library( ], ) -# @rules_cc does not offer a bzl_library target for @rules_cc//cc:defs.bzl bzl_library( name = "rules_cc_srcs_bzl", srcs = [ @@ -644,7 +643,10 @@ bzl_library( "@rules_cc//cc/common", "@rules_cc//cc/toolchains:toolchain_rules", ], - deps = [":bazel_tools_bzl"], + deps = [ + ":bazel_tools_bzl", + "@rules_cc//cc/common", + ], ) bzl_library( diff --git a/python/private/attributes.bzl b/python/private/attributes.bzl index a863e195bb..e62abf9f71 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") diff --git a/python/private/common_bazel.bzl b/python/private/common_bazel.bzl index 642cfd86cc..9e1f3a8578 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") diff --git a/python/private/current_py_cc_headers.bzl b/python/private/current_py_cc_headers.bzl index e72199efcd..217904c22f 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 d66c401863..ca68346bcb 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/hermetic_runtime_repo_setup.bzl b/python/private/hermetic_runtime_repo_setup.bzl index 3f7bb5d773..d041be5964 100644 --- a/python/private/hermetic_runtime_repo_setup.bzl +++ b/python/private/hermetic_runtime_repo_setup.bzl @@ -13,7 +13,8 @@ # 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") diff --git a/python/private/local_runtime_repo_setup.bzl b/python/private/local_runtime_repo_setup.bzl index 3fa484e7c7..37eab59575 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") diff --git a/python/private/py_cc_link_params_info.bzl b/python/private/py_cc_link_params_info.bzl index e5f4534c70..bfa2de5978 100644 --- a/python/private/py_cc_link_params_info.bzl +++ b/python/private/py_cc_link_params_info.bzl @@ -13,7 +13,7 @@ # 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" diff --git a/python/private/py_cc_toolchain_rule.bzl b/python/private/py_cc_toolchain_rule.bzl index 279f86cc14..d5f3b685a4 100644 --- a/python/private/py_cc_toolchain_rule.bzl +++ b/python/private/py_cc_toolchain_rule.bzl @@ -19,7 +19,7 @@ https://github.com/bazelbuild/rules_python/issues/824 is considered done. """ 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 d5da922aa6..8c0487d6a1 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", diff --git a/python/private/py_repositories.bzl b/python/private/py_repositories.bzl index f11d3d1b56..6283ad7cbc 100644 --- a/python/private/py_repositories.bzl +++ b/python/private/py_repositories.bzl @@ -60,6 +60,7 @@ def py_repositories(): urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.13/rules_cc-0.0.13.tar.gz"], ) + # Needed by rules_cc, triggerred by @rules_java_prebuilt in Bazel by using @rules_cc//cc:defs.bzl http_archive( name = "protobuf", sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", diff --git a/python/private/runtime_env_toolchain.bzl b/python/private/runtime_env_toolchain.bzl index 1601926178..2116012c03 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/whl_filegroup/whl_filegroup.bzl b/python/private/whl_filegroup/whl_filegroup.bzl index c5f97e697b..d2e6e43b91 100644 --- a/python/private/whl_filegroup/whl_filegroup.bzl +++ b/python/private/whl_filegroup/whl_filegroup.bzl @@ -27,7 +27,7 @@ An empty pattern will match all files. 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/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 8bbdaceaf0..d07d08ac61 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/current_py_cc_libs_tests.bzl b/tests/cc/current_py_cc_libs/current_py_cc_libs_tests.bzl index 4a08ce745e..26f97244d8 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/support/cc_toolchains/BUILD.bazel b/tests/support/cc_toolchains/BUILD.bazel index 889f9e02d2..f6e6654d09 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 a2ad615e6e..8240f09e04 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/whl_filegroup/BUILD.bazel b/tests/whl_filegroup/BUILD.bazel index d8b711d120..2176e9e03a 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") From 91e5751eacd5443728dba16d38d1136375c2b51a Mon Sep 17 00:00:00 2001 From: Ivo List Date: Tue, 12 Nov 2024 15:45:50 +0100 Subject: [PATCH 307/345] fix: Bazel version check (#2393) Version check needs to work on Bazel@HEAD as well and version later than Bazel 8. --- python/private/internal_config_repo.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/private/internal_config_repo.bzl b/python/private/internal_config_repo.bzl index e2fa8f6af1..7b6869e9a5 100644 --- a/python/private/internal_config_repo.bzl +++ b/python/private/internal_config_repo.bzl @@ -68,7 +68,7 @@ def _internal_config_repo_impl(rctx): 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" From 1b2714e119e0cb4cf48c32b6e87978784a00460d Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 12 Nov 2024 15:25:01 -0800 Subject: [PATCH 308/345] tests: use $(rootpaths) to get executable files paths for Bazel 8 compatibility (#2395) In Bazel 8, the singular `$(rootpath)` expansions require that the target expands to a single file. The py rules have an unfortunate legacy behavior where their default outputs are the executable and the main py file, thus causing an error. To fix, use the plural `$(rootpaths)`, then post-process the space-separated string to get just the executable portion of it. Along the way... * Add tests/integration/py_cc_toolchain_registered/bazel-* symlink to Bazel ignore. This avoids an infinite symlink expansions error and performance issues when those symlinks exist. Work towards https://github.com/bazelbuild/rules_python/issues/2378 --------- Co-authored-by: Ivo List --- .bazelignore | 1 + examples/bzlmod/MODULE.bazel.lock | 6 +++--- examples/bzlmod/tests/BUILD.bazel | 6 +++--- examples/bzlmod/tests/version_test.sh | 6 +++++- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.bazelignore b/.bazelignore index 95391738c1..d5fe879e83 100644 --- a/.bazelignore +++ b/.bazelignore @@ -26,3 +26,4 @@ examples/py_proto_library/bazel-py_proto_library 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/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 39e18a481c..4c8ee34349 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1347,7 +1347,7 @@ }, "@@rules_java~//java:extensions.bzl%compatibility_proxy": { "general": { - "bzlTransitiveDigest": "2OrtzYUv5L7hfbpHdJ9GpoNfX11sIVm2d6HZmSg2J5c=", + "bzlTransitiveDigest": "tOgQSybDmdV5ILDExAWYtVmkUV75YJN0iaLnD+0RizQ=", "usagesDigest": "0/TyZruTcO4Acns2lBIfsdJDXcTS869yRn0gpAYMGww=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, @@ -1559,7 +1559,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "xgvC1bRYiqApsCOY56grTCQ0/8pBZNRALXbjn+4q/hE=", + "bzlTransitiveDigest": "uhOIVyackokcEIDJC2WkpI/7kfic15bCrbJpHVdGzww=", "usagesDigest": "VmrNvB/4EhzsYieLDka9584M+pYKPpjNLl3Wcb5rx/c=", "recordedFileInputs": { "@@//requirements_lock_3_10.txt": "5e7083982a7e60f34998579a0ae83b520d46ab8f2552cc51337217f024e6def5", @@ -7032,7 +7032,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "OoT+AuxNb9Ej3Cn/GFgSHa1NlVBY27sJhilKvy+3WJI=", + "bzlTransitiveDigest": "NR9GE3DP+UNE8cw1rKlqXaQ8vkM3QXNti7Yd9CPuH1Y=", "usagesDigest": "/lZXl/ZgP+u5PE8WkeWTyYBsvX9XQWFn1antj5qrBzQ=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", diff --git a/examples/bzlmod/tests/BUILD.bazel b/examples/bzlmod/tests/BUILD.bazel index 7cbc8d47b7..96e4cdde25 100644 --- a/examples/bzlmod/tests/BUILD.bazel +++ b/examples/bzlmod/tests/BUILD.bazel @@ -163,7 +163,7 @@ sh_test( 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 @@ sh_test( 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 @@ sh_test( 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 3bedb95ef9..3f5fd960cb 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}'" From 2f6ca17d79c0016d307197c4e155eb32df08a542 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 12 Nov 2024 15:47:04 -0800 Subject: [PATCH 309/345] fix: skip precompiling if using Bazel-builtin PyRuntimeInfo (#2394) When the `@bazel_tools//python/tools:python_autodetecting` toolchain is used, it returns the Bazel-builtin PyRuntimeInfo provider. Because this provider doesn't support the additional fields needed for precompiling (`pyc_tag`, among others), it would result in an attribute error. To fix, detect the absence of the `pyc_tag` attribute and return early, as is done when the pyc_tag field is empty. Fixes https://github.com/bazelbuild/rules_python/issues/2364 --- CHANGELOG.md | 4 +++- python/private/common_bazel.bzl | 11 +++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e91eadf5a1..9ecf3442ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,7 +49,9 @@ A brief description of the categories of changes: {#v0-0-0-fixed} ### Fixed -* Nothing yet +* (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-0-0-added} ### Added diff --git a/python/private/common_bazel.bzl b/python/private/common_bazel.bzl index 9e1f3a8578..efbebd0252 100644 --- a/python/private/common_bazel.bzl +++ b/python/private/common_bazel.bzl @@ -166,10 +166,13 @@ def _precompile(ctx, src, *, use_pycache): 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( From 497945d7ecde5d8aed6b1d99fccac102c48a59df Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:29:52 +0900 Subject: [PATCH 310/345] chore: remove Thulio from BCR app configs (#2397) Just tidy up the config. I've put my name in there, but I am happy to make the BCR app use someone else's name as well. @oprypin, @rickeylev, what do you think? --- .bcr/gazelle/metadata.template.json | 6 +++--- .bcr/metadata.template.json | 5 ----- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/.bcr/gazelle/metadata.template.json b/.bcr/gazelle/metadata.template.json index 9cd4291e5a..687f78e977 100644 --- a/.bcr/gazelle/metadata.template.json +++ b/.bcr/gazelle/metadata.template.json @@ -7,9 +7,9 @@ "github": "rickeylev" }, { - "name": "Thulio Ferraz Assis", - "email": "thulio@aspect.dev", - "github": "f0rmiga" + "name": "Ignas Anikevicius", + "email": "bcr-ignas@use.startmail.com", + "github": "aignas" } ], "repository": [ diff --git a/.bcr/metadata.template.json b/.bcr/metadata.template.json index eff7219bde..b164e70443 100644 --- a/.bcr/metadata.template.json +++ b/.bcr/metadata.template.json @@ -6,11 +6,6 @@ "email": "rlevasseur@google.com", "github": "rickeylev" }, - { - "name": "Thulio Ferraz Assis", - "email": "thulio@aspect.dev", - "github": "f0rmiga" - }, { "name": "Ignas Anikevicius", "email": "bcr-ignas@use.startmail.com", From 07593223363d68ad8eedd1d5a28910ddd17bd15b Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Tue, 12 Nov 2024 17:09:01 -0800 Subject: [PATCH 311/345] chore: update changelog for 0.39.0 (#2398) Update changelog for 0.39.0 release Along the away, stash a template for the "Unreleased" text in a comment for easier copy/pasting in the future. --- CHANGELOG.md | 52 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ecf3442ea..143a20a8cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,31 @@ A brief description of the categories of changes: * Particular sub-systems are identified using parentheses, e.g. `(bzlmod)` or `(docs)`. + + {#v0-0-0} ## Unreleased @@ -27,6 +52,27 @@ A brief description of the categories of changes: {#v0-0-0-changed} ### Changed +* Nothing yet. + +{#v0-0-0-fixed} +### Fixed +* Nothing yet. + +{#v0-0-0-added} +### Added +* Nothing yet. + +{#v0-0-0-removed} +### Removed +* Nothing yet. + +{#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 @@ -47,13 +93,13 @@ A brief description of the categories of changes: [20241016]: https://github.com/indygreg/python-build-standalone/releases/tag/20241016 -{#v0-0-0-fixed} +{#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-0-0-added} +{#v0-39-0-added} ### Added * Bazel 8 is now supported. * (toolchain) Support for freethreaded Python toolchains is now available. Use @@ -62,7 +108,7 @@ A brief description of the categories of changes: * (toolchain) {obj}`py_runtime.abi_flags` attribute and {obj}`PyRuntimeInfo.abi_flags` field added. -{#v0-0-0-removed} +{#v0-39-0-removed} ### Removed * Support for Bazel 6 using bzlmod has been dropped. From 7b95ea6e2ceb6d59dc507c8285155c5bf32ebce9 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Wed, 13 Nov 2024 14:57:56 +0900 Subject: [PATCH 312/345] refactor(pkg_aliases): create a macro for creating whl aliases (#2391) This just cleans up the code and moves more logic from the repository_rule (i.e. generation of `BUILD.bazel` files) to loading time (macro evaluation). This makes the unit testing easier and I plan to also move the code that is generating config setting names from filenames to this new macro, but wanted to submit this PR to reduce the review chunks. Summary: - Add a new `pkg_aliases` macro. - Move logic and tests for creating WORKSPACE aliases. - Move logic and tests bzlmod aliases. - Move logic and tests bzlmod aliases with groups. - Add a test for extra alias creation. - Use `whl_alias` in `pypi` extension integration tests. - Improve the serialization of `whl_alias` for passing to the pypi hub repo. Related to #260, #2386, #2337, #2319 - hopefully cleaning the code up will make it easier to address those feature requests later. --------- Co-authored-by: Richard Levasseur --- examples/bzlmod/MODULE.bazel.lock | 168 +++++++------- python/private/pypi/BUILD.bazel | 1 - python/private/pypi/extension.bzl | 18 +- python/private/pypi/pkg_aliases.bzl | 134 +++++++++++ python/private/pypi/render_pkg_aliases.bzl | 144 ++---------- tests/pypi/extension/extension_tests.bzl | 40 +--- tests/pypi/pkg_aliases/BUILD.bazel | 3 + tests/pypi/pkg_aliases/pkg_aliases_test.bzl | 217 +++++++++++++++++ .../render_pkg_aliases_test.bzl | 219 ++---------------- 9 files changed, 501 insertions(+), 443 deletions(-) create mode 100644 python/private/pypi/pkg_aliases.bzl create mode 100644 tests/pypi/pkg_aliases/BUILD.bazel create mode 100644 tests/pypi/pkg_aliases/pkg_aliases_test.bzl diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 4c8ee34349..ee745d56d2 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1559,7 +1559,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "uhOIVyackokcEIDJC2WkpI/7kfic15bCrbJpHVdGzww=", + "bzlTransitiveDigest": "MwmpiMn2qoAVC+3E9MF3E98fB8v1utYBfMa0frXyi7g=", "usagesDigest": "VmrNvB/4EhzsYieLDka9584M+pYKPpjNLl3Wcb5rx/c=", "recordedFileInputs": { "@@//requirements_lock_3_10.txt": "5e7083982a7e60f34998579a0ae83b520d46ab8f2552cc51337217f024e6def5", @@ -6729,7 +6729,7 @@ "repo_name": "other_module_pip", "extra_hub_aliases": {}, "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\"}]" + "absl_py": "[{\"repo\":\"other_module_pip_311_absl_py\",\"version\":\"3.11\"}]" }, "packages": [ "absl_py" @@ -6748,53 +6748,53 @@ ] }, "whl_map": { - "alabaster": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_alabaster\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "astroid": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_astroid\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "babel": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_babel\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "certifi": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_certifi\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "chardet": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_chardet\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "colorama": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_colorama\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "dill": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_dill\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "docutils": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_docutils\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "idna": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_idna\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "imagesize": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_imagesize\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "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\"}]", - "isort": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_isort\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "jinja2": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_jinja2\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "lazy_object_proxy": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_lazy_object_proxy\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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-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-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-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\"}]", - "markupsafe": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_markupsafe\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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-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-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-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_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-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.tar.gz\",\"repo\":\"pip_39_markupsafe_sdist_af598ed3\",\"target_platforms\":null,\"version\":\"3.9\"}]", - "mccabe": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_mccabe\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "packaging": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_packaging\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "pathspec": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pathspec\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "platformdirs": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_platformdirs\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "pygments": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pygments\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "pylint": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pylint\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "pylint_print": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pylint_print\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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\"}]", - "python_dateutil": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_python_dateutil\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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\"}]", - "python_magic": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_python_magic\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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\"}]", - "pyyaml": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_pyyaml\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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-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-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-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-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.tar.gz\",\"repo\":\"pip_39_pyyaml_sdist_bfdf460b\",\"target_platforms\":null,\"version\":\"3.9\"}]", - "requests": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_requests\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "s3cmd": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_s3cmd\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "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\"}]", - "six": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_six\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "snowballstemmer": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_snowballstemmer\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "sphinx": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinx\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "sphinxcontrib_applehelp": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_applehelp\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "sphinxcontrib_devhelp": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_devhelp\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "sphinxcontrib_htmlhelp": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_htmlhelp\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "sphinxcontrib_jsmath": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_jsmath\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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.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\"}]", - "sphinxcontrib_qthelp": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_qthelp\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "sphinxcontrib_serializinghtml": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_sphinxcontrib_serializinghtml\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "tabulate": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_tabulate\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "tomli": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_tomli\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "tomlkit": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_tomlkit\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "typing_extensions": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_typing_extensions\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "urllib3": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_urllib3\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "websockets": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_websockets\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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-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-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-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-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-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-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.tar.gz\",\"repo\":\"pip_39_websockets_sdist_88fc51d9\",\"target_platforms\":null,\"version\":\"3.9\"}]", - "wheel": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_wheel\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "wrapt": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_wrapt\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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-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-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-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-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-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\"}]", - "yamllint": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_310_yamllint\",\"target_platforms\":null,\"version\":\"3.10\"},{\"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\"}]", - "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\"}]" + "alabaster": "[{\"repo\":\"pip_310_alabaster\",\"version\":\"3.10\"},{\"filename\":\"alabaster-0.7.13-py3-none-any.whl\",\"repo\":\"pip_39_alabaster_py3_none_any_1ee19aca\",\"version\":\"3.9\"},{\"filename\":\"alabaster-0.7.13.tar.gz\",\"repo\":\"pip_39_alabaster_sdist_a27a4a08\",\"version\":\"3.9\"}]", + "astroid": "[{\"repo\":\"pip_310_astroid\",\"version\":\"3.10\"},{\"filename\":\"astroid-2.12.13-py3-none-any.whl\",\"repo\":\"pip_39_astroid_py3_none_any_10e0ad5f\",\"version\":\"3.9\"},{\"filename\":\"astroid-2.12.13.tar.gz\",\"repo\":\"pip_39_astroid_sdist_1493fe8b\",\"version\":\"3.9\"}]", + "babel": "[{\"repo\":\"pip_310_babel\",\"version\":\"3.10\"},{\"filename\":\"Babel-2.13.1-py3-none-any.whl\",\"repo\":\"pip_39_babel_py3_none_any_7077a498\",\"version\":\"3.9\"},{\"filename\":\"Babel-2.13.1.tar.gz\",\"repo\":\"pip_39_babel_sdist_33e0952d\",\"version\":\"3.9\"}]", + "certifi": "[{\"repo\":\"pip_310_certifi\",\"version\":\"3.10\"},{\"filename\":\"certifi-2023.7.22-py3-none-any.whl\",\"repo\":\"pip_39_certifi_py3_none_any_92d60375\",\"version\":\"3.9\"},{\"filename\":\"certifi-2023.7.22.tar.gz\",\"repo\":\"pip_39_certifi_sdist_539cc1d1\",\"version\":\"3.9\"}]", + "chardet": "[{\"repo\":\"pip_310_chardet\",\"version\":\"3.10\"},{\"filename\":\"chardet-4.0.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_chardet_py2_none_any_f864054d\",\"version\":\"3.9\"},{\"filename\":\"chardet-4.0.0.tar.gz\",\"repo\":\"pip_39_chardet_sdist_0d6f53a1\",\"version\":\"3.9\"}]", + "colorama": "[{\"repo\":\"pip_310_colorama\",\"version\":\"3.10\"},{\"filename\":\"colorama-0.4.6-py2.py3-none-any.whl\",\"repo\":\"pip_39_colorama_py2_none_any_4f1d9991\",\"version\":\"3.9\"},{\"filename\":\"colorama-0.4.6.tar.gz\",\"repo\":\"pip_39_colorama_sdist_08695f5c\",\"version\":\"3.9\"}]", + "dill": "[{\"repo\":\"pip_310_dill\",\"version\":\"3.10\"},{\"filename\":\"dill-0.3.6-py3-none-any.whl\",\"repo\":\"pip_39_dill_py3_none_any_a07ffd23\",\"version\":\"3.9\"},{\"filename\":\"dill-0.3.6.tar.gz\",\"repo\":\"pip_39_dill_sdist_e5db55f3\",\"version\":\"3.9\"}]", + "docutils": "[{\"repo\":\"pip_310_docutils\",\"version\":\"3.10\"},{\"filename\":\"docutils-0.20.1-py3-none-any.whl\",\"repo\":\"pip_39_docutils_py3_none_any_96f387a2\",\"version\":\"3.9\"},{\"filename\":\"docutils-0.20.1.tar.gz\",\"repo\":\"pip_39_docutils_sdist_f08a4e27\",\"version\":\"3.9\"}]", + "idna": "[{\"repo\":\"pip_310_idna\",\"version\":\"3.10\"},{\"filename\":\"idna-2.10-py2.py3-none-any.whl\",\"repo\":\"pip_39_idna_py2_none_any_b97d804b\",\"version\":\"3.9\"},{\"filename\":\"idna-2.10.tar.gz\",\"repo\":\"pip_39_idna_sdist_b307872f\",\"version\":\"3.9\"}]", + "imagesize": "[{\"repo\":\"pip_310_imagesize\",\"version\":\"3.10\"},{\"filename\":\"imagesize-1.4.1-py2.py3-none-any.whl\",\"repo\":\"pip_39_imagesize_py2_none_any_0d8d18d0\",\"version\":\"3.9\"},{\"filename\":\"imagesize-1.4.1.tar.gz\",\"repo\":\"pip_39_imagesize_sdist_69150444\",\"version\":\"3.9\"}]", + "importlib_metadata": "[{\"filename\":\"importlib_metadata-8.4.0-py3-none-any.whl\",\"repo\":\"pip_39_importlib_metadata_py3_none_any_66f342cc\",\"version\":\"3.9\"},{\"filename\":\"importlib_metadata-8.4.0.tar.gz\",\"repo\":\"pip_39_importlib_metadata_sdist_9a547d3b\",\"version\":\"3.9\"}]", + "isort": "[{\"repo\":\"pip_310_isort\",\"version\":\"3.10\"},{\"filename\":\"isort-5.11.4-py3-none-any.whl\",\"repo\":\"pip_39_isort_py3_none_any_c033fd0e\",\"version\":\"3.9\"},{\"filename\":\"isort-5.11.4.tar.gz\",\"repo\":\"pip_39_isort_sdist_6db30c5d\",\"version\":\"3.9\"}]", + "jinja2": "[{\"repo\":\"pip_310_jinja2\",\"version\":\"3.10\"},{\"filename\":\"jinja2-3.1.4-py3-none-any.whl\",\"repo\":\"pip_39_jinja2_py3_none_any_bc5dd2ab\",\"version\":\"3.9\"},{\"filename\":\"jinja2-3.1.4.tar.gz\",\"repo\":\"pip_39_jinja2_sdist_4a3aee7a\",\"version\":\"3.9\"}]", + "lazy_object_proxy": "[{\"repo\":\"pip_310_lazy_object_proxy\",\"version\":\"3.10\"},{\"filename\":\"lazy-object-proxy-1.10.0.tar.gz\",\"repo\":\"pip_39_lazy_object_proxy_sdist_78247b6d\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"}]", + "markupsafe": "[{\"repo\":\"pip_310_markupsafe\",\"version\":\"3.10\"},{\"filename\":\"MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl\",\"repo\":\"pip_39_markupsafe_cp39_cp39_macosx_10_9_universal2_8023faf4\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"},{\"filename\":\"MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_markupsafe_cp39_cp39_win_amd64_3fd4abcb\",\"version\":\"3.9\"},{\"filename\":\"MarkupSafe-2.1.3.tar.gz\",\"repo\":\"pip_39_markupsafe_sdist_af598ed3\",\"version\":\"3.9\"}]", + "mccabe": "[{\"repo\":\"pip_310_mccabe\",\"version\":\"3.10\"},{\"filename\":\"mccabe-0.7.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_mccabe_py2_none_any_6c2d30ab\",\"version\":\"3.9\"},{\"filename\":\"mccabe-0.7.0.tar.gz\",\"repo\":\"pip_39_mccabe_sdist_348e0240\",\"version\":\"3.9\"}]", + "packaging": "[{\"repo\":\"pip_310_packaging\",\"version\":\"3.10\"},{\"filename\":\"packaging-23.2-py3-none-any.whl\",\"repo\":\"pip_39_packaging_py3_none_any_8c491190\",\"version\":\"3.9\"},{\"filename\":\"packaging-23.2.tar.gz\",\"repo\":\"pip_39_packaging_sdist_048fb0e9\",\"version\":\"3.9\"}]", + "pathspec": "[{\"repo\":\"pip_310_pathspec\",\"version\":\"3.10\"},{\"filename\":\"pathspec-0.10.3-py3-none-any.whl\",\"repo\":\"pip_39_pathspec_py3_none_any_3c95343a\",\"version\":\"3.9\"},{\"filename\":\"pathspec-0.10.3.tar.gz\",\"repo\":\"pip_39_pathspec_sdist_56200de4\",\"version\":\"3.9\"}]", + "platformdirs": "[{\"repo\":\"pip_310_platformdirs\",\"version\":\"3.10\"},{\"filename\":\"platformdirs-2.6.0-py3-none-any.whl\",\"repo\":\"pip_39_platformdirs_py3_none_any_1a89a123\",\"version\":\"3.9\"},{\"filename\":\"platformdirs-2.6.0.tar.gz\",\"repo\":\"pip_39_platformdirs_sdist_b46ffafa\",\"version\":\"3.9\"}]", + "pygments": "[{\"repo\":\"pip_310_pygments\",\"version\":\"3.10\"},{\"filename\":\"Pygments-2.16.1-py3-none-any.whl\",\"repo\":\"pip_39_pygments_py3_none_any_13fc09fa\",\"version\":\"3.9\"},{\"filename\":\"Pygments-2.16.1.tar.gz\",\"repo\":\"pip_39_pygments_sdist_1daff049\",\"version\":\"3.9\"}]", + "pylint": "[{\"repo\":\"pip_310_pylint\",\"version\":\"3.10\"},{\"filename\":\"pylint-2.15.9-py3-none-any.whl\",\"repo\":\"pip_39_pylint_py3_none_any_349c8cd3\",\"version\":\"3.9\"},{\"filename\":\"pylint-2.15.9.tar.gz\",\"repo\":\"pip_39_pylint_sdist_18783cca\",\"version\":\"3.9\"}]", + "pylint_print": "[{\"repo\":\"pip_310_pylint_print\",\"version\":\"3.10\"},{\"filename\":\"pylint-print-1.0.1.tar.gz\",\"repo\":\"pip_39_pylint_print_sdist_30aa207e\",\"version\":\"3.9\"},{\"filename\":\"pylint_print-1.0.1-py3-none-any.whl\",\"repo\":\"pip_39_pylint_print_py3_none_any_a2b2599e\",\"version\":\"3.9\"}]", + "python_dateutil": "[{\"repo\":\"pip_310_python_dateutil\",\"version\":\"3.10\"},{\"filename\":\"python-dateutil-2.8.2.tar.gz\",\"repo\":\"pip_39_python_dateutil_sdist_0123cacc\",\"version\":\"3.9\"},{\"filename\":\"python_dateutil-2.8.2-py2.py3-none-any.whl\",\"repo\":\"pip_39_python_dateutil_py2_none_any_961d03dc\",\"version\":\"3.9\"}]", + "python_magic": "[{\"repo\":\"pip_310_python_magic\",\"version\":\"3.10\"},{\"filename\":\"python-magic-0.4.27.tar.gz\",\"repo\":\"pip_39_python_magic_sdist_c1ba14b0\",\"version\":\"3.9\"},{\"filename\":\"python_magic-0.4.27-py2.py3-none-any.whl\",\"repo\":\"pip_39_python_magic_py2_none_any_c212960a\",\"version\":\"3.9\"}]", + "pyyaml": "[{\"repo\":\"pip_310_pyyaml\",\"version\":\"3.10\"},{\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"},{\"filename\":\"PyYAML-6.0.1-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_pyyaml_cp39_cp39_win_amd64_510c9dee\",\"version\":\"3.9\"},{\"filename\":\"PyYAML-6.0.1.tar.gz\",\"repo\":\"pip_39_pyyaml_sdist_bfdf460b\",\"version\":\"3.9\"}]", + "requests": "[{\"repo\":\"pip_310_requests\",\"version\":\"3.10\"},{\"filename\":\"requests-2.25.1-py2.py3-none-any.whl\",\"repo\":\"pip_39_requests_py2_none_any_c210084e\",\"version\":\"3.9\"},{\"filename\":\"requests-2.25.1.tar.gz\",\"repo\":\"pip_39_requests_sdist_27973dd4\",\"version\":\"3.9\"}]", + "s3cmd": "[{\"repo\":\"pip_310_s3cmd\",\"version\":\"3.10\"},{\"filename\":\"s3cmd-2.1.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_s3cmd_py2_none_any_49cd23d5\",\"version\":\"3.9\"},{\"filename\":\"s3cmd-2.1.0.tar.gz\",\"repo\":\"pip_39_s3cmd_sdist_966b0a49\",\"version\":\"3.9\"}]", + "setuptools": "[{\"filename\":\"setuptools-65.6.3-py3-none-any.whl\",\"repo\":\"pip_39_setuptools_py3_none_any_57f6f22b\",\"version\":\"3.9\"},{\"filename\":\"setuptools-65.6.3.tar.gz\",\"repo\":\"pip_39_setuptools_sdist_a7620757\",\"version\":\"3.9\"}]", + "six": "[{\"repo\":\"pip_310_six\",\"version\":\"3.10\"},{\"filename\":\"six-1.16.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_six_py2_none_any_8abb2f1d\",\"version\":\"3.9\"},{\"filename\":\"six-1.16.0.tar.gz\",\"repo\":\"pip_39_six_sdist_1e61c374\",\"version\":\"3.9\"}]", + "snowballstemmer": "[{\"repo\":\"pip_310_snowballstemmer\",\"version\":\"3.10\"},{\"filename\":\"snowballstemmer-2.2.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_snowballstemmer_py2_none_any_c8e1716e\",\"version\":\"3.9\"},{\"filename\":\"snowballstemmer-2.2.0.tar.gz\",\"repo\":\"pip_39_snowballstemmer_sdist_09b16deb\",\"version\":\"3.9\"}]", + "sphinx": "[{\"repo\":\"pip_310_sphinx\",\"version\":\"3.10\"},{\"filename\":\"sphinx-7.2.6-py3-none-any.whl\",\"repo\":\"pip_39_sphinx_py3_none_any_1e09160a\",\"version\":\"3.9\"},{\"filename\":\"sphinx-7.2.6.tar.gz\",\"repo\":\"pip_39_sphinx_sdist_9a5160e1\",\"version\":\"3.9\"}]", + "sphinxcontrib_applehelp": "[{\"repo\":\"pip_310_sphinxcontrib_applehelp\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_applehelp-1.0.7-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_applehelp_py3_none_any_094c4d56\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_applehelp-1.0.7.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_applehelp_sdist_39fdc8d7\",\"version\":\"3.9\"}]", + "sphinxcontrib_devhelp": "[{\"repo\":\"pip_310_sphinxcontrib_devhelp\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_devhelp-1.0.5-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_devhelp_py3_none_any_fe8009ae\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_devhelp-1.0.5.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_devhelp_sdist_63b41e0d\",\"version\":\"3.9\"}]", + "sphinxcontrib_htmlhelp": "[{\"repo\":\"pip_310_sphinxcontrib_htmlhelp\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_htmlhelp_py3_none_any_8001661c\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_htmlhelp-2.0.4.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_htmlhelp_sdist_6c26a118\",\"version\":\"3.9\"}]", + "sphinxcontrib_jsmath": "[{\"repo\":\"pip_310_sphinxcontrib_jsmath\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib-jsmath-1.0.1.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_jsmath_sdist_a9925e4a\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_jsmath_py2_none_any_2ec2eaeb\",\"version\":\"3.9\"}]", + "sphinxcontrib_qthelp": "[{\"repo\":\"pip_310_sphinxcontrib_qthelp\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_qthelp-1.0.6-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_qthelp_py3_none_any_bf76886e\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_qthelp-1.0.6.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_qthelp_sdist_62b9d1a1\",\"version\":\"3.9\"}]", + "sphinxcontrib_serializinghtml": "[{\"repo\":\"pip_310_sphinxcontrib_serializinghtml\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_serializinghtml_py3_none_any_9b36e503\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_serializinghtml-1.1.9.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_serializinghtml_sdist_0c64ff89\",\"version\":\"3.9\"}]", + "tabulate": "[{\"repo\":\"pip_310_tabulate\",\"version\":\"3.10\"},{\"filename\":\"tabulate-0.9.0-py3-none-any.whl\",\"repo\":\"pip_39_tabulate_py3_none_any_024ca478\",\"version\":\"3.9\"},{\"filename\":\"tabulate-0.9.0.tar.gz\",\"repo\":\"pip_39_tabulate_sdist_0095b12b\",\"version\":\"3.9\"}]", + "tomli": "[{\"repo\":\"pip_310_tomli\",\"version\":\"3.10\"},{\"filename\":\"tomli-2.0.1-py3-none-any.whl\",\"repo\":\"pip_39_tomli_py3_none_any_939de3e7\",\"version\":\"3.9\"},{\"filename\":\"tomli-2.0.1.tar.gz\",\"repo\":\"pip_39_tomli_sdist_de526c12\",\"version\":\"3.9\"}]", + "tomlkit": "[{\"repo\":\"pip_310_tomlkit\",\"version\":\"3.10\"},{\"filename\":\"tomlkit-0.11.6-py3-none-any.whl\",\"repo\":\"pip_39_tomlkit_py3_none_any_07de26b0\",\"version\":\"3.9\"},{\"filename\":\"tomlkit-0.11.6.tar.gz\",\"repo\":\"pip_39_tomlkit_sdist_71b952e5\",\"version\":\"3.9\"}]", + "typing_extensions": "[{\"repo\":\"pip_310_typing_extensions\",\"version\":\"3.10\"},{\"filename\":\"typing_extensions-4.12.2-py3-none-any.whl\",\"repo\":\"pip_39_typing_extensions_py3_none_any_04e5ca03\",\"version\":\"3.9\"},{\"filename\":\"typing_extensions-4.12.2.tar.gz\",\"repo\":\"pip_39_typing_extensions_sdist_1a7ead55\",\"version\":\"3.9\"}]", + "urllib3": "[{\"repo\":\"pip_310_urllib3\",\"version\":\"3.10\"},{\"filename\":\"urllib3-1.26.18-py2.py3-none-any.whl\",\"repo\":\"pip_39_urllib3_py2_none_any_34b97092\",\"version\":\"3.9\"},{\"filename\":\"urllib3-1.26.18.tar.gz\",\"repo\":\"pip_39_urllib3_sdist_f8ecc1bb\",\"version\":\"3.9\"}]", + "websockets": "[{\"repo\":\"pip_310_websockets\",\"version\":\"3.10\"},{\"filename\":\"websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl\",\"repo\":\"pip_39_websockets_cp39_cp39_macosx_10_9_universal2_777354ee\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"},{\"filename\":\"websockets-11.0.3-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_websockets_cp39_cp39_win_amd64_c792ea4e\",\"version\":\"3.9\"},{\"filename\":\"websockets-11.0.3-py3-none-any.whl\",\"repo\":\"pip_39_websockets_py3_none_any_6681ba9e\",\"version\":\"3.9\"},{\"filename\":\"websockets-11.0.3.tar.gz\",\"repo\":\"pip_39_websockets_sdist_88fc51d9\",\"version\":\"3.9\"}]", + "wheel": "[{\"repo\":\"pip_310_wheel\",\"version\":\"3.10\"},{\"filename\":\"wheel-0.40.0-py3-none-any.whl\",\"repo\":\"pip_39_wheel_py3_none_any_d236b20e\",\"version\":\"3.9\"},{\"filename\":\"wheel-0.40.0.tar.gz\",\"repo\":\"pip_39_wheel_sdist_cd1196f3\",\"version\":\"3.9\"}]", + "wrapt": "[{\"repo\":\"pip_310_wrapt\",\"version\":\"3.10\"},{\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"},{\"filename\":\"wrapt-1.14.1-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_wrapt_cp39_cp39_win_amd64_dee60e1d\",\"version\":\"3.9\"},{\"filename\":\"wrapt-1.14.1.tar.gz\",\"repo\":\"pip_39_wrapt_sdist_380a85cf\",\"version\":\"3.9\"}]", + "yamllint": "[{\"repo\":\"pip_310_yamllint\",\"version\":\"3.10\"},{\"filename\":\"yamllint-1.28.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_yamllint_py2_none_any_89bb5b5a\",\"version\":\"3.9\"},{\"filename\":\"yamllint-1.28.0.tar.gz\",\"repo\":\"pip_39_yamllint_sdist_9e3d8ddd\",\"version\":\"3.9\"}]", + "zipp": "[{\"filename\":\"zipp-3.20.0-py3-none-any.whl\",\"repo\":\"pip_39_zipp_py3_none_any_58da6168\",\"version\":\"3.9\"},{\"filename\":\"zipp-3.20.0.tar.gz\",\"repo\":\"pip_39_zipp_sdist_0145e43d\",\"version\":\"3.9\"}]" }, "packages": [ "alabaster", @@ -6864,8 +6864,8 @@ "repo_name": "pip_deps", "extra_hub_aliases": {}, "whl_map": { - "numpy": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_deps_310_numpy\",\"target_platforms\":null,\"version\":\"3.10\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":null,\"repo\":\"pip_deps_311_numpy\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.12\",\"filename\":null,\"repo\":\"pip_deps_312_numpy\",\"target_platforms\":null,\"version\":\"3.12\"},{\"config_setting\":\"//_config:is_python_3.8\",\"filename\":null,\"repo\":\"pip_deps_38_numpy\",\"target_platforms\":null,\"version\":\"3.8\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":null,\"repo\":\"pip_deps_39_numpy\",\"target_platforms\":null,\"version\":\"3.9\"}]", - "setuptools": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"pip_deps_310_setuptools\",\"target_platforms\":null,\"version\":\"3.10\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":null,\"repo\":\"pip_deps_311_setuptools\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.12\",\"filename\":null,\"repo\":\"pip_deps_312_setuptools\",\"target_platforms\":null,\"version\":\"3.12\"},{\"config_setting\":\"//_config:is_python_3.8\",\"filename\":null,\"repo\":\"pip_deps_38_setuptools\",\"target_platforms\":null,\"version\":\"3.8\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":null,\"repo\":\"pip_deps_39_setuptools\",\"target_platforms\":null,\"version\":\"3.9\"}]" + "numpy": "[{\"repo\":\"pip_deps_310_numpy\",\"version\":\"3.10\"},{\"repo\":\"pip_deps_311_numpy\",\"version\":\"3.11\"},{\"repo\":\"pip_deps_312_numpy\",\"version\":\"3.12\"},{\"repo\":\"pip_deps_38_numpy\",\"version\":\"3.8\"},{\"repo\":\"pip_deps_39_numpy\",\"version\":\"3.9\"}]", + "setuptools": "[{\"repo\":\"pip_deps_310_setuptools\",\"version\":\"3.10\"},{\"repo\":\"pip_deps_311_setuptools\",\"version\":\"3.11\"},{\"repo\":\"pip_deps_312_setuptools\",\"version\":\"3.12\"},{\"repo\":\"pip_deps_38_setuptools\",\"version\":\"3.8\"},{\"repo\":\"pip_deps_39_setuptools\",\"version\":\"3.9\"}]" }, "packages": [ "numpy", @@ -6881,8 +6881,8 @@ "repo_name": "rules_fuzzing_py_deps", "extra_hub_aliases": {}, "whl_map": { - "absl_py": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_310_absl_py\",\"target_platforms\":null,\"version\":\"3.10\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_311_absl_py\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.12\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_312_absl_py\",\"target_platforms\":null,\"version\":\"3.12\"},{\"config_setting\":\"//_config:is_python_3.8\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_38_absl_py\",\"target_platforms\":null,\"version\":\"3.8\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_39_absl_py\",\"target_platforms\":null,\"version\":\"3.9\"}]", - "six": "[{\"config_setting\":\"//_config:is_python_3.10\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_310_six\",\"target_platforms\":null,\"version\":\"3.10\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_311_six\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.12\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_312_six\",\"target_platforms\":null,\"version\":\"3.12\"},{\"config_setting\":\"//_config:is_python_3.8\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_38_six\",\"target_platforms\":null,\"version\":\"3.8\"},{\"config_setting\":\"//_config:is_python_3.9\",\"filename\":null,\"repo\":\"rules_fuzzing_py_deps_39_six\",\"target_platforms\":null,\"version\":\"3.9\"}]" + "absl_py": "[{\"repo\":\"rules_fuzzing_py_deps_310_absl_py\",\"version\":\"3.10\"},{\"repo\":\"rules_fuzzing_py_deps_311_absl_py\",\"version\":\"3.11\"},{\"repo\":\"rules_fuzzing_py_deps_312_absl_py\",\"version\":\"3.12\"},{\"repo\":\"rules_fuzzing_py_deps_38_absl_py\",\"version\":\"3.8\"},{\"repo\":\"rules_fuzzing_py_deps_39_absl_py\",\"version\":\"3.9\"}]", + "six": "[{\"repo\":\"rules_fuzzing_py_deps_310_six\",\"version\":\"3.10\"},{\"repo\":\"rules_fuzzing_py_deps_311_six\",\"version\":\"3.11\"},{\"repo\":\"rules_fuzzing_py_deps_312_six\",\"version\":\"3.12\"},{\"repo\":\"rules_fuzzing_py_deps_38_six\",\"version\":\"3.8\"},{\"repo\":\"rules_fuzzing_py_deps_39_six\",\"version\":\"3.9\"}]" }, "packages": [ "absl_py", @@ -7032,7 +7032,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "NR9GE3DP+UNE8cw1rKlqXaQ8vkM3QXNti7Yd9CPuH1Y=", + "bzlTransitiveDigest": "Kx383BMHUpAHEjRiU5aWU4QTRQVg+Uu+Mgi7jVxuz0c=", "usagesDigest": "/lZXl/ZgP+u5PE8WkeWTyYBsvX9XQWFn1antj5qrBzQ=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", @@ -9423,36 +9423,36 @@ "repo_name": "rules_python_publish_deps", "extra_hub_aliases": {}, "whl_map": { - "backports_tarfile": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"backports.tarfile-1.2.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"backports_tarfile-1.2.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "certifi": "[{\"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\":null,\"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\":null,\"version\":\"3.11\"}]", - "cffi": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_aarch64_a1ed2dd2\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_46bf4316\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_s390x_a24ed04c\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.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_610faea7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_aarch64_a9b15d49\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_fc48c783\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cffi-1.17.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cffi_sdist_1c39c601\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "charset_normalizer": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_bf4475b8\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_ce031db0\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8ff4e7cd\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-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_3710a975\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_47334db7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_f1a2f519\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_63bc5c4a\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_bcb4f8ea\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"charset_normalizer-3.4.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_sdist_223217c3\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "cryptography": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_846da004\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-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_0f996e72\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_f7b178f1\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_c2e6fc39\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_e1be4655\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_df6b6c6d\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"cryptography-43.0.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cryptography_sdist_315b9001\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "docutils": "[{\"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\":null,\"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\":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\":null,\"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\":null,\"version\":\"3.11\"}]", - "importlib_metadata": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"importlib_metadata-8.5.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_importlib_metadata_py3_none_any_45e54197\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"importlib_metadata-8.5.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_importlib_metadata_sdist_71522656\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "jaraco_classes": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.classes-3.4.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.classes-3.4.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "jaraco_context": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.context-6.0.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco_context-6.0.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "jaraco_functools": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco.functools-4.1.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"jaraco_functools-4.1.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2\",\"target_platforms\":null,\"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-25.4.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_keyring_py3_none_any_5426f817\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"keyring-25.4.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_keyring_sdist_b07ebc55\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "markdown_it_py": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"markdown-it-py-3.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"markdown_it_py-3.0.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684\",\"target_platforms\":null,\"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\"}]", - "more_itertools": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"more-itertools-10.5.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_more_itertools_sdist_5482bfef\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"more_itertools-10.5.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_more_itertools_py3_none_any_037b0d32\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "nh3": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_armv7l_0411beb0\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64_5f36b271\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_armv7l_3a157ab1\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18-cp37-abi3-win_amd64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"nh3-0.2.18.tar.gz\",\"repo\":\"rules_python_publish_deps_311_nh3_sdist_94a16692\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "pkginfo": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pkginfo-1.10.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pkginfo-1.10.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pkginfo_sdist_5df73835\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "pycparser": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pycparser-2.22-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pycparser_py3_none_any_c3702b6d\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pycparser-2.22.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pycparser_sdist_491c8be9\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "pygments": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pygments-2.18.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pygments-2.18.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pygments_sdist_786ff802\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "pywin32_ctypes": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pywin32-ctypes-0.2.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pywin32_ctypes_sdist_d162dc04\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"pywin32_ctypes-0.2.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pywin32_ctypes_py3_none_any_8a151337\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "readme_renderer": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"readme_renderer-44.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"readme_renderer-44.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_readme_renderer_sdist_8712034e\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "requests": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests-2.32.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_requests_py3_none_any_70761cfe\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests-2.32.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_requests_sdist_55365417\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "requests_toolbelt": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests-toolbelt-1.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"requests_toolbelt-1.0.0-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66\",\"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\"}]", - "rich": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"rich-13.9.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_rich_py3_none_any_9836f509\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"rich-13.9.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_rich_sdist_bc1e01b8\",\"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\"}]", - "twine": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"twine-5.1.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_twine_py3_none_any_215dbe7b\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"twine-5.1.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_twine_sdist_9aa08251\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "urllib3": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"urllib3-2.2.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_urllib3_py3_none_any_ca899ca0\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"urllib3-2.2.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_urllib3_sdist_e7d814a8\",\"target_platforms\":null,\"version\":\"3.11\"}]", - "zipp": "[{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"zipp-3.20.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_zipp_py3_none_any_a817ac80\",\"target_platforms\":null,\"version\":\"3.11\"},{\"config_setting\":\"//_config:is_python_3.11\",\"filename\":\"zipp-3.20.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_zipp_sdist_bc9eb26f\",\"target_platforms\":null,\"version\":\"3.11\"}]" + "backports_tarfile": "[{\"filename\":\"backports.tarfile-1.2.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7\",\"version\":\"3.11\"},{\"filename\":\"backports_tarfile-1.2.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2\",\"version\":\"3.11\"}]", + "certifi": "[{\"filename\":\"certifi-2024.8.30-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_certifi_py3_none_any_922820b5\",\"version\":\"3.11\"},{\"filename\":\"certifi-2024.8.30.tar.gz\",\"repo\":\"rules_python_publish_deps_311_certifi_sdist_bec941d2\",\"version\":\"3.11\"}]", + "cffi": "[{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_aarch64_a1ed2dd2\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_46bf4316\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_s390x_a24ed04c\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.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_610faea7\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_aarch64_a9b15d49\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_fc48c783\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cffi_sdist_1c39c601\",\"version\":\"3.11\"}]", + "charset_normalizer": "[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_bf4475b8\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_ce031db0\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8ff4e7cd\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-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_3710a975\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_47334db7\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_f1a2f519\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_63bc5c4a\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_bcb4f8ea\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_sdist_223217c3\",\"version\":\"3.11\"}]", + "cryptography": "[{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_846da004\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3-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_0f996e72\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_f7b178f1\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_c2e6fc39\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_e1be4655\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_df6b6c6d\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cryptography_sdist_315b9001\",\"version\":\"3.11\"}]", + "docutils": "[{\"filename\":\"docutils-0.21.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_docutils_py3_none_any_dafca5b9\",\"version\":\"3.11\"},{\"filename\":\"docutils-0.21.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_docutils_sdist_3a6b1873\",\"version\":\"3.11\"}]", + "idna": "[{\"filename\":\"idna-3.10-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_idna_py3_none_any_946d195a\",\"version\":\"3.11\"},{\"filename\":\"idna-3.10.tar.gz\",\"repo\":\"rules_python_publish_deps_311_idna_sdist_12f65c9b\",\"version\":\"3.11\"}]", + "importlib_metadata": "[{\"filename\":\"importlib_metadata-8.5.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_importlib_metadata_py3_none_any_45e54197\",\"version\":\"3.11\"},{\"filename\":\"importlib_metadata-8.5.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_importlib_metadata_sdist_71522656\",\"version\":\"3.11\"}]", + "jaraco_classes": "[{\"filename\":\"jaraco.classes-3.4.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b\",\"version\":\"3.11\"},{\"filename\":\"jaraco.classes-3.4.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5\",\"version\":\"3.11\"}]", + "jaraco_context": "[{\"filename\":\"jaraco.context-6.0.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48\",\"version\":\"3.11\"},{\"filename\":\"jaraco_context-6.0.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5\",\"version\":\"3.11\"}]", + "jaraco_functools": "[{\"filename\":\"jaraco.functools-4.1.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13\",\"version\":\"3.11\"},{\"filename\":\"jaraco_functools-4.1.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2\",\"version\":\"3.11\"}]", + "jeepney": "[{\"filename\":\"jeepney-0.8.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jeepney_py3_none_any_c0a454ad\",\"version\":\"3.11\"},{\"filename\":\"jeepney-0.8.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jeepney_sdist_5efe48d2\",\"version\":\"3.11\"}]", + "keyring": "[{\"filename\":\"keyring-25.4.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_keyring_py3_none_any_5426f817\",\"version\":\"3.11\"},{\"filename\":\"keyring-25.4.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_keyring_sdist_b07ebc55\",\"version\":\"3.11\"}]", + "markdown_it_py": "[{\"filename\":\"markdown-it-py-3.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94\",\"version\":\"3.11\"},{\"filename\":\"markdown_it_py-3.0.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684\",\"version\":\"3.11\"}]", + "mdurl": "[{\"filename\":\"mdurl-0.1.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_mdurl_py3_none_any_84008a41\",\"version\":\"3.11\"},{\"filename\":\"mdurl-0.1.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_mdurl_sdist_bb413d29\",\"version\":\"3.11\"}]", + "more_itertools": "[{\"filename\":\"more-itertools-10.5.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_more_itertools_sdist_5482bfef\",\"version\":\"3.11\"},{\"filename\":\"more_itertools-10.5.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_more_itertools_py3_none_any_037b0d32\",\"version\":\"3.11\"}]", + "nh3": "[{\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_armv7l_0411beb0\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64_5f36b271\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_armv7l_3a157ab1\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-win_amd64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18.tar.gz\",\"repo\":\"rules_python_publish_deps_311_nh3_sdist_94a16692\",\"version\":\"3.11\"}]", + "pkginfo": "[{\"filename\":\"pkginfo-1.10.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2\",\"version\":\"3.11\"},{\"filename\":\"pkginfo-1.10.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pkginfo_sdist_5df73835\",\"version\":\"3.11\"}]", + "pycparser": "[{\"filename\":\"pycparser-2.22-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pycparser_py3_none_any_c3702b6d\",\"version\":\"3.11\"},{\"filename\":\"pycparser-2.22.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pycparser_sdist_491c8be9\",\"version\":\"3.11\"}]", + "pygments": "[{\"filename\":\"pygments-2.18.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0\",\"version\":\"3.11\"},{\"filename\":\"pygments-2.18.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pygments_sdist_786ff802\",\"version\":\"3.11\"}]", + "pywin32_ctypes": "[{\"filename\":\"pywin32-ctypes-0.2.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pywin32_ctypes_sdist_d162dc04\",\"version\":\"3.11\"},{\"filename\":\"pywin32_ctypes-0.2.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pywin32_ctypes_py3_none_any_8a151337\",\"version\":\"3.11\"}]", + "readme_renderer": "[{\"filename\":\"readme_renderer-44.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b\",\"version\":\"3.11\"},{\"filename\":\"readme_renderer-44.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_readme_renderer_sdist_8712034e\",\"version\":\"3.11\"}]", + "requests": "[{\"filename\":\"requests-2.32.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_requests_py3_none_any_70761cfe\",\"version\":\"3.11\"},{\"filename\":\"requests-2.32.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_requests_sdist_55365417\",\"version\":\"3.11\"}]", + "requests_toolbelt": "[{\"filename\":\"requests-toolbelt-1.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3\",\"version\":\"3.11\"},{\"filename\":\"requests_toolbelt-1.0.0-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66\",\"version\":\"3.11\"}]", + "rfc3986": "[{\"filename\":\"rfc3986-2.0.0-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_rfc3986_py2_none_any_50b1502b\",\"version\":\"3.11\"},{\"filename\":\"rfc3986-2.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_rfc3986_sdist_97aacf9d\",\"version\":\"3.11\"}]", + "rich": "[{\"filename\":\"rich-13.9.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_rich_py3_none_any_9836f509\",\"version\":\"3.11\"},{\"filename\":\"rich-13.9.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_rich_sdist_bc1e01b8\",\"version\":\"3.11\"}]", + "secretstorage": "[{\"filename\":\"SecretStorage-3.3.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_secretstorage_py3_none_any_f356e662\",\"version\":\"3.11\"},{\"filename\":\"SecretStorage-3.3.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_secretstorage_sdist_2403533e\",\"version\":\"3.11\"}]", + "twine": "[{\"filename\":\"twine-5.1.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_twine_py3_none_any_215dbe7b\",\"version\":\"3.11\"},{\"filename\":\"twine-5.1.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_twine_sdist_9aa08251\",\"version\":\"3.11\"}]", + "urllib3": "[{\"filename\":\"urllib3-2.2.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_urllib3_py3_none_any_ca899ca0\",\"version\":\"3.11\"},{\"filename\":\"urllib3-2.2.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_urllib3_sdist_e7d814a8\",\"version\":\"3.11\"}]", + "zipp": "[{\"filename\":\"zipp-3.20.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_zipp_py3_none_any_a817ac80\",\"version\":\"3.11\"},{\"filename\":\"zipp-3.20.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_zipp_sdist_bc9eb26f\",\"version\":\"3.11\"}]" }, "packages": [ "backports_tarfile", diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel index 20afe70771..dafbcfb757 100644 --- a/python/private/pypi/BUILD.bazel +++ b/python/private/pypi/BUILD.bazel @@ -256,7 +256,6 @@ bzl_library( srcs = ["render_pkg_aliases.bzl"], deps = [ ":generate_group_library_build_bazel_bzl", - ":labels_bzl", ":parse_whl_name_bzl", ":whl_target_platforms_bzl", "//python/private:normalize_name_bzl", diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index ea628ce4ad..ea2bafdb77 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -571,6 +571,20 @@ You cannot use both the additive_build_content and additive_build_content_file a is_reproducible = is_reproducible, ) +def _alias_dict(a): + ret = { + "repo": a.repo, + } + 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 + def _pip_impl(module_ctx): """Implementation of a class tag that creates the pip hub and corresponding pip spoke whl repositories. @@ -651,8 +665,8 @@ def _pip_impl(module_ctx): 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: json.encode([_alias_dict(a) for a in aliases]) + for key, aliases in whl_map.items() }, packages = mods.exposed_packages.get(hub_name, []), groups = mods.hub_group_map.get(hub_name), diff --git a/python/private/pypi/pkg_aliases.bzl b/python/private/pypi/pkg_aliases.bzl new file mode 100644 index 0000000000..de9545e986 --- /dev/null +++ b/python/private/pypi/pkg_aliases.bzl @@ -0,0 +1,134 @@ +# 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("//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", +) + +_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 wheel. This wheel supports the following Python +configuration settings: + {config_settings} + +To determine the current configuration's Python version, run: + `bazel config ` (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 _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(actual.keys())), + ).lstrip(), + rules_python = "rules_python", + ) + +def pkg_aliases( + *, + name, + actual, + group_name = None, + extra_aliases = None, + native = native, + select = select): + """Create aliases for an actual package. + + Args: + name: {type}`str` The name of the package. + actual: {type}`dict[Label, 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. + 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. + """ + 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 [] + } + 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( + { + config_setting: "@{repo}//:{target_name}".format( + repo = repo, + target_name = name, + ) + for config_setting, 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), + ) diff --git a/python/private/pypi/render_pkg_aliases.bzl b/python/private/pypi/render_pkg_aliases.bzl index 7a759799dd..98c9d0906f 100644 --- a/python/private/pypi/render_pkg_aliases.bzl +++ b/python/private/pypi/render_pkg_aliases.bzl @@ -22,15 +22,6 @@ load( ":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") @@ -70,117 +61,32 @@ 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) +def _repr_actual(aliases): + if len(aliases) == 1 and not aliases[0].version and not aliases[0].config_setting: + return repr(aliases[0].repo) - 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 - ) + actual = {} + for alias in aliases: + actual[alias.config_setting or ("//_config:is_python_" + alias.version)] = alias.repo + return render.indent(render.dict(actual)).lstrip() def _render_common_aliases(*, name, aliases, extra_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", - ) + return """\ +load("@rules_python//python/private/pypi:pkg_aliases.bzl", "pkg_aliases") - lines.append("_NO_MATCH_ERROR = \"\"\"\\\n{error_msg}\"\"\"".format( - error_msg = error_msg, - )) +package(default_visibility = ["//visibility:public"]) - 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, - ) - 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, - } | { - x: x - for x in extra_aliases - } - ).items() - ], +pkg_aliases( + name = "{name}", + actual = {actual}, + group_name = {group_name}, + extra_aliases = {extra_aliases}, +)""".format( + name = name, + actual = _repr_actual(aliases), + group_name = repr(group_name), + extra_aliases = repr(extra_aliases), ) - 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)), - ), - ], - ) - - return "\n\n".join(lines) def render_pkg_aliases(*, aliases, requirement_cycles = None, extra_hub_aliases = {}): """Create alias declarations for each PyPI package. @@ -222,7 +128,7 @@ def render_pkg_aliases(*, aliases, requirement_cycles = None, extra_hub_aliases "{}/BUILD.bazel".format(normalize_name(name)): _render_common_aliases( name = normalize_name(name), aliases = pkg_aliases, - extra_aliases = extra_hub_aliases.get(name, []), + extra_aliases = extra_hub_aliases.get(normalize_name(name), []), group_name = whl_group_mapping.get(normalize_name(name)), ).strip() for name, pkg_aliases in aliases.items() @@ -256,21 +162,17 @@ def whl_alias(*, repo, version = None, config_setting = None, filename = None, t 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, + repo = repo, target_platforms = target_platforms, + version = version, ) def render_multiplatform_pkg_aliases(*, aliases, **kwargs): diff --git a/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index 0405bad4d8..39670cd71f 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -17,6 +17,7 @@ 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:render_pkg_aliases.bzl", "whl_alias") # buildifier: disable=bzl-visibility _tests = [] @@ -158,11 +159,8 @@ def _test_simple(env): pypi.hub_group_map().contains_exactly({"pypi": {}}) pypi.hub_whl_map().contains_exactly({"pypi": { "simple": [ - struct( - config_setting = "//_config:is_python_3.15", - filename = None, + whl_alias( repo = "pypi_315_simple", - target_platforms = None, version = "3.15", ), ], @@ -209,18 +207,14 @@ def _test_simple_multiple_requirements(env): pypi.hub_group_map().contains_exactly({"pypi": {}}) pypi.hub_whl_map().contains_exactly({"pypi": { "simple": [ - struct( - config_setting = "//_config:is_python_3.15", - filename = None, + whl_alias( repo = "pypi_315_simple_windows_x86_64", target_platforms = [ "cp315_windows_x86_64", ], version = "3.15", ), - struct( - config_setting = "//_config:is_python_3.15", - filename = None, + whl_alias( repo = "pypi_315_simple_osx_aarch64_osx_x86_64", target_platforms = [ "cp315_osx_aarch64", @@ -296,25 +290,18 @@ simple==0.0.3 --hash=sha256:deadbaaf pypi.hub_group_map().contains_exactly({"pypi": {}}) pypi.hub_whl_map().contains_exactly({"pypi": { "extra": [ - struct( - config_setting = "//_config:is_python_3.15", - filename = None, + whl_alias( repo = "pypi_315_extra", - target_platforms = None, version = "3.15", ), ], "simple": [ - struct( - config_setting = "//_config:is_python_3.15", - filename = None, + whl_alias( repo = "pypi_315_simple_linux_x86_64", target_platforms = ["cp315_linux_x86_64"], version = "3.15", ), - struct( - config_setting = "//_config:is_python_3.15", - filename = None, + whl_alias( repo = "pypi_315_simple_osx_aarch64", target_platforms = ["cp315_osx_aarch64"], version = "3.15", @@ -418,27 +405,20 @@ some_pkg==0.0.1 pypi.hub_whl_map().contains_exactly({ "pypi": { "simple": [ - struct( - config_setting = "//_config:is_python_3.15", + whl_alias( filename = "simple-0.0.1-py3-none-any.whl", repo = "pypi_315_simple_py3_none_any_deadb00f", - target_platforms = None, version = "3.15", ), - struct( - config_setting = "//_config:is_python_3.15", + whl_alias( filename = "simple-0.0.1.tar.gz", repo = "pypi_315_simple_sdist_deadbeef", - target_platforms = None, version = "3.15", ), ], "some_pkg": [ - struct( - config_setting = "//_config:is_python_3.15", - filename = None, + whl_alias( repo = "pypi_315_some_pkg", - target_platforms = None, version = "3.15", ), ], diff --git a/tests/pypi/pkg_aliases/BUILD.bazel b/tests/pypi/pkg_aliases/BUILD.bazel new file mode 100644 index 0000000000..e1a015cf1f --- /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 0000000000..cf801ae643 --- /dev/null +++ b/tests/pypi/pkg_aliases/pkg_aliases_test.bzl @@ -0,0 +1,217 @@ +# 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:pkg_aliases.bzl", + "pkg_aliases", +) # buildifier: disable=bzl-visibility + +_tests = [] + +def _test_legacy_aliases(env): + actual = [] + pkg_aliases( + name = "foo", + actual = "repo", + native = struct( + alias = lambda **kwargs: actual.append(kwargs), + ), + extra_aliases = ["my_special"], + ) + + # buildifier: disable=unsorted-dict-items + want = [ + { + "name": "foo", + "actual": ":pkg", + }, + { + "name": "pkg", + "actual": "@repo//:pkg", + }, + { + "name": "whl", + "actual": "@repo//:whl", + }, + { + "name": "data", + "actual": "@repo//:data", + }, + { + "name": "dist_info", + "actual": "@repo//:dist_info", + }, + { + "name": "my_special", + "actual": "@repo//:my_special", + }, + ] + + env.expect.that_collection(actual).contains_exactly(want) + +_tests.append(_test_legacy_aliases) + +def _test_config_setting_aliases(env): + # Use this function as it is used in pip_repository + actual = [] + 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).equals("""\ +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 ` (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. +""") + return struct(value = value, no_match_error = no_match_error != None) + + pkg_aliases( + name = "bar_baz", + actual = { + "//:my_config_setting": "bar_baz_repo", + }, + extra_aliases = ["my_special"], + native = struct( + alias = lambda **kwargs: actual.append(kwargs), + ), + select = mock_select, + ) + + # buildifier: disable=unsorted-dict-items + want = [ + { + "name": "bar_baz", + "actual": ":pkg", + }, + { + "name": "pkg", + "actual": struct( + value = { + "//:my_config_setting": "@bar_baz_repo//:pkg", + }, + no_match_error = True, + ), + }, + { + "name": "whl", + "actual": struct( + value = { + "//:my_config_setting": "@bar_baz_repo//:whl", + }, + no_match_error = True, + ), + }, + { + "name": "data", + "actual": struct( + value = { + "//:my_config_setting": "@bar_baz_repo//:data", + }, + no_match_error = True, + ), + }, + { + "name": "dist_info", + "actual": struct( + value = { + "//:my_config_setting": "@bar_baz_repo//:dist_info", + }, + no_match_error = True, + ), + }, + { + "name": "my_special", + "actual": struct( + value = { + "//:my_config_setting": "@bar_baz_repo//:my_special", + }, + no_match_error = True, + ), + }, + ] + env.expect.that_collection(actual).contains_exactly(want) + +_tests.append(_test_config_setting_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 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 f5187788ea..4741df04b4 100644 --- a/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl +++ b/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl @@ -15,7 +15,6 @@ """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:render_pkg_aliases.bzl", @@ -27,29 +26,6 @@ load( "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("@@", "@") - _tests = [] def _test_empty(env): @@ -74,33 +50,15 @@ def _test_legacy_aliases(env): 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", + group_name = None, + extra_aliases = [], )""" env.expect.that_dict(actual).contains_exactly({want_key: want_content}) @@ -119,70 +77,17 @@ def _test_bzlmod_aliases(env): 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") 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 ` (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", + }, + group_name = None, + extra_aliases = [], )""" env.expect.that_str(actual.pop("_config/BUILD.bazel")).equals( @@ -204,100 +109,6 @@ config_settings( _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 ` (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 = { @@ -357,10 +168,8 @@ def _test_aliases_with_groups(env): 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) From 1738faf6aa07909718b3caeaabe9fab15b17fa36 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 13 Nov 2024 15:51:51 -0800 Subject: [PATCH 313/345] chore: change bcr presubmit to drop bazel 6, add last_rc (bazel 8) (#2404) This removes Bazel 6 and adds last_rc (Bazel 8) in our BCR presubmit config. Right now, BCR releases fail because they try to test with Bazel 6, which doesn't work. --- .bcr/gazelle/presubmit.yml | 3 ++- .bcr/presubmit.yml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.bcr/gazelle/presubmit.yml b/.bcr/gazelle/presubmit.yml index 659beab525..bceed4f9e1 100644 --- a/.bcr/gazelle/presubmit.yml +++ b/.bcr/gazelle/presubmit.yml @@ -16,7 +16,8 @@ bcr_test_module: 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/presubmit.yml b/.bcr/presubmit.yml index 875ea93043..e1ddb7a1aa 100644 --- a/.bcr/presubmit.yml +++ b/.bcr/presubmit.yml @@ -16,7 +16,8 @@ bcr_test_module: 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" From 541bcba2fc47ee43defe25f09be10a05434fdf9d Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 13 Nov 2024 15:53:26 -0800 Subject: [PATCH 314/345] deps: update to gazelle 0.40.0 (#2403) This allows us to drop the patch for removing native.sh_binary Work towards https://github.com/bazelbuild/rules_python/issues/2378 --- MODULE.bazel | 12 +----------- patches/gazelle_native_sh.patch | 32 -------------------------------- 2 files changed, 1 insertion(+), 43 deletions(-) delete mode 100644 patches/gazelle_native_sh.patch diff --git a/MODULE.bazel b/MODULE.bazel index bed1787fc6..f9f173d8f1 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -84,17 +84,7 @@ bazel_dep(name = "bazel_ci_rules", version = "1.0.0", dev_dependency = True) # 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 = "rules_python_gazelle_plugin", version = "0", dev_dependency = True) -bazel_dep(name = "gazelle", version = "0.33.0", dev_dependency = True, repo_name = "bazel_gazelle") -single_version_override( - module_name = "gazelle", - patch_strip = 1, - patches = [ - # Can be removed once https://github.com/bazel-contrib/bazel-gazelle/issues/1959 - # is fixed and released. - "patches/gazelle_native_sh.patch", - ], - version = "0.33.0", -) +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", diff --git a/patches/gazelle_native_sh.patch b/patches/gazelle_native_sh.patch deleted file mode 100644 index 836fe7ca8c..0000000000 --- a/patches/gazelle_native_sh.patch +++ /dev/null @@ -1,32 +0,0 @@ - -diff -u -r a/def.bzl b/def.bzl ---- a/def.bzl 2024-11-08 13:42:27.733022366 -0800 -+++ b/def.bzl 2024-11-08 13:44:45.089900166 -0800 -@@ -16,6 +16,7 @@ - "@bazel_skylib//lib:shell.bzl", - "shell", - ) -+load("@rules_shell//shell:sh_binary.bzl", "sh_binary") - load( - "@bazel_gazelle_is_bazel_module//:defs.bzl", - "GAZELLE_IS_BAZEL_MODULE", -@@ -185,7 +186,7 @@ - tags = tags, - **kwargs - ) -- native.sh_binary( -+ sh_binary( - name = name, - srcs = [runner_name], - tags = tags, -diff -u -r a/MODULE.bazel b/MODULE.bazel ---- a/MODULE.bazel 2024-11-08 13:42:23.860997684 -0800 -+++ b/MODULE.bazel 2024-11-08 13:43:46.961528172 -0800 -@@ -8,6 +8,7 @@ - bazel_dep(name = "protobuf", version = "3.19.6", repo_name = "com_google_protobuf") - bazel_dep(name = "rules_go", version = "0.41.0", repo_name = "io_bazel_rules_go") - bazel_dep(name = "rules_proto", version = "4.0.0") -+bazel_dep(name = "rules_shell", version = "0.2.0") - - go_sdk = use_extension("@io_bazel_rules_go//go:extensions.bzl", "go_sdk") - From c8ccd22069951cb7944dc9223981f20d50d61500 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Thu, 14 Nov 2024 09:40:28 +0900 Subject: [PATCH 315/345] chore!: remove requirements.txt for the twine publishing tool (#2401) `requirements_linux.txt` in the same folder should be used instead. Fixes #2242 --- CHANGELOG.md | 3 +- WORKSPACE | 2 +- private/BUILD.bazel | 1 - tools/publish/BUILD.bazel | 2 - tools/publish/requirements.txt | 339 --------------------------------- 5 files changed, 3 insertions(+), 344 deletions(-) delete mode 100644 tools/publish/requirements.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 143a20a8cd..c351487605 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -64,7 +64,8 @@ Unreleased changes template. {#v0-0-0-removed} ### Removed -* Nothing yet. +* (publish) Remove deprecated `requirements.txt` for the `twine` dependencies. + Please use `requirements_linux.txt` instead. {#v0-39-0} ## [0.39.0] - 2024-11-13 diff --git a/WORKSPACE b/WORKSPACE index 33ab37f292..b77918f5ef 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -98,7 +98,7 @@ pip_parse( 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/private/BUILD.bazel b/private/BUILD.bazel index c81dc94801..68fefe910f 100644 --- a/private/BUILD.bazel +++ b/private/BUILD.bazel @@ -8,7 +8,6 @@ multirun( "//tools/publish:{}.update".format(r) for r in [ "requirements_universal", - "requirements", "requirements_darwin", "requirements_windows", "requirements_linux", diff --git a/tools/publish/BUILD.bazel b/tools/publish/BUILD.bazel index 3fd891c837..1648ac85df 100644 --- a/tools/publish/BUILD.bazel +++ b/tools/publish/BUILD.bazel @@ -19,7 +19,6 @@ filegroup( name = "distribution", srcs = [ "BUILD.bazel", - "requirements.txt", "requirements_darwin.txt", "requirements_linux.txt", "requirements_universal.txt", @@ -33,7 +32,6 @@ publish_deps( name = "requirements", srcs = ["requirements.in"], outs = { - "requirements.txt": "linux", # TODO: maybe deprecate "requirements_darwin.txt": "macos", "requirements_linux.txt": "linux", "requirements_universal.txt": "", # universal diff --git a/tools/publish/requirements.txt b/tools/publish/requirements.txt deleted file mode 100644 index 8fb51b9458..0000000000 --- a/tools/publish/requirements.txt +++ /dev/null @@ -1,339 +0,0 @@ -# This file was autogenerated by uv via the following command: -# bazel run //tools/publish:requirements.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 From 273cbd122a86895c155a8978b0abdc1e64f8cfcd Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 13 Nov 2024 18:29:02 -0800 Subject: [PATCH 316/345] ci: add last_rc, remove extraneous pystar configs (#2405) Run the bzlmod example with last_rc to match the BCR config. This should help catch any issues before a BCR release occurs. Along the way, cleanup the extraneous pystar configs. The rules_python Starlark implementation is enabled by default, and disabling it is unsupported. --- .bazelci/presubmit.yml | 53 +++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 3c383497b6..1808824109 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -34,6 +34,7 @@ buildifier: build_flags: - "--keep_going" - "--build_tag_filters=-integration-test" + - "--config=bazel7.x" test_targets: - "--" - "..." @@ -84,16 +85,6 @@ buildifier: - //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" - build_flags: - - "--config=bazel7.x" - 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 @@ -139,26 +130,18 @@ tasks: name: "Default: Ubuntu, upcoming Bazel" platform: ubuntu2004 bazel: last_rc - pystar_ubuntu_workspace: - <<: *reusable_config - <<: *pystar_base - name: "Default test: Ubuntu, Pystar, workspace" - platform: ubuntu2004 - pystar_ubuntu_bzlmod: + ubuntu_workspace: <<: *reusable_config - <<: *pystar_base - name: "Default test: Ubuntu, Pystar, bzlmod" + name: "Default: Ubuntu, workspace" platform: ubuntu2004 - pystar_mac_workspace: + mac_workspace: <<: *reusable_config <<: *common_workspace_flags - <<: *pystar_base - name: "Default test: Mac, Pystar, workspace" + name: "Default: Mac, workspace" platform: macos - pystar_windows_workspace: + windows_workspace: <<: *reusable_config - <<: *pystar_base - name: "Default test: Windows, Pystar, workspace" + name: "Default: Windows, workspace" platform: windows debian: @@ -250,6 +233,13 @@ tasks: 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 @@ -264,12 +254,27 @@ tasks: 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 + bazel: 7.x + integration_test_bzlmod_windows_upcoming: + <<: *reusable_build_test_all + # coverage is not supported on Windows + name: "examples/bzlmod: Windows, upcoming Bazel" + working_directory: examples/bzlmod + platform: windows + bazel: last_rc integration_test_bzlmod_ubuntu_lockfile: <<: *reusable_build_test_all <<: *coverage_targets_example_bzlmod From 155efce562f14d46530fb5bec698a11e2ee889f5 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 14 Nov 2024 01:28:33 -0800 Subject: [PATCH 317/345] fix: upgrade to rules_proto 7.0.2 to pickup fix for Bazel 9 (#2408) The ProtoInfo was removed in Bazel 9, but earlier versions of rules_proto still refer to it. This was fixed in rules_proto 7.0.0. Fixes https://github.com/bazelbuild/rules_python/issues/2400 --------- Co-authored-by: Ivo List --- MODULE.bazel | 2 +- examples/bzlmod/MODULE.bazel.lock | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index f9f173d8f1..ef173bc83b 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -10,7 +10,7 @@ bazel_dep(name = "rules_cc", version = "0.0.14") 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.2") +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") diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index ee745d56d2..5a546c2f7a 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -66,6 +66,7 @@ "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/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", + "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d", "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", "https://bcr.bazel.build/modules/protobuf/29.0-rc2/source.json": "52101bfd37e38f0d159dee47b71ccbd1f22f7a32192cef5ef2533bb6212f410f", "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", @@ -83,7 +84,8 @@ "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", "https://bcr.bazel.build/modules/rules_cc/0.0.14/MODULE.bazel": "5e343a3aac88b8d7af3b1b6d2093b55c347b8eefc2e7d1442f7a02dc8fea48ac", - "https://bcr.bazel.build/modules/rules_cc/0.0.14/source.json": "d22ad7e0f2c271a583b463b81cea83fd8afbf0012cad955c129b0e85662ec207", + "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", + "https://bcr.bazel.build/modules/rules_cc/0.0.15/source.json": "48e606af0e02a716974a8b74fba6988d9f0c93af9177e28cf474bfc5fa26ab10", "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", @@ -132,7 +134,8 @@ "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.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", - "https://bcr.bazel.build/modules/rules_proto/6.0.2/source.json": "17a2e195f56cb28d6bbf763e49973d13890487c6945311ed141e196fb660426d", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/source.json": "1e5e7260ae32ef4f2b52fd1d0de8d03b606a44c91b694d2f1afb1d3b28a48ce1", "https://bcr.bazel.build/modules/rules_rust/0.54.1/MODULE.bazel": "388547bb0cd6a751437bb15c94c6725226f50100eec576e4354c3a8b48c754fb", "https://bcr.bazel.build/modules/rules_rust/0.54.1/source.json": "9c5481b1abe4943457e6b2a475592d2e504b6b4355df603f24f64cde0a7f0f2d", "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", From b304fc66888b9a8266e31de928469d39dce55743 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Fri, 15 Nov 2024 18:35:01 -0800 Subject: [PATCH 318/345] fix: keep import path values if Bazel-builtin PyInfo is removed (#2415) The collect_imports() function added import strings from BuiltinPyInfo if it was non-None. However, operator precedence caused the `if-else` ternary to ignore both list comprehensions (one for PyInfo and one for BuiltinPyInfo) if BuiltinPyInfo was None. To fix, I rewrote the function as a regular for loop to eliminate the ambiguous looking ternary expression. Fixes: https://github.com/bazelbuild/rules_python/issues/2414 --- CHANGELOG.md | 3 ++- python/private/common.bzl | 25 ++++++++++++++++--------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c351487605..1acb12fb4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,7 +56,8 @@ Unreleased changes template. {#v0-0-0-fixed} ### Fixed -* Nothing yet. +* (rules) Don't drop custom import paths if Bazel-builtin PyInfo is removed. + ([2414](https://github.com/bazelbuild/rules_python/issues/2414)). {#v0-0-0-added} ### Added diff --git a/python/private/common.bzl b/python/private/common.bzl index 837cd19097..97fabcebcb 100644 --- a/python/private/common.bzl +++ b/python/private/common.bzl @@ -263,15 +263,22 @@ def filter_to_py_srcs(srcs): 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. From 7467c6fccc8d48973ab403bd398bf4c158ceeddb Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sat, 16 Nov 2024 18:23:26 -0800 Subject: [PATCH 319/345] docs: tell how to do pyc-only builds (#2417) Someone one Slack asked if this was possible and how to do, so document it for better visibility. There's a lot of flags, so its easy to not see how to do this. --- docs/precompiling.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/precompiling.md b/docs/precompiling.md index a6711f3b76..9b2e816ec4 100644 --- a/docs/precompiling.md +++ b/docs/precompiling.md @@ -39,6 +39,30 @@ can use an opt-in or opt-out approach by setting its value: * 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 +{obj}`--@rules_python//python/config_settings:precompile_source_retention=omit_source` +flag on the command line or the {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, From 1944874f6ba507f70d8c5e70df84622e0c783254 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sat, 16 Nov 2024 20:03:31 -0800 Subject: [PATCH 320/345] chore: update changelog for 0.40.0 (#2416) Add new version links and headers --- CHANGELOG.md | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1acb12fb4d..65a7d992cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,19 +30,19 @@ Unreleased changes template. {#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} @@ -52,19 +52,40 @@ Unreleased changes template. {#v0-0-0-changed} ### Changed -* Nothing yet. +* Nothing changed. {#v0-0-0-fixed} ### Fixed -* (rules) Don't drop custom import paths if Bazel-builtin PyInfo is removed. - ([2414](https://github.com/bazelbuild/rules_python/issues/2414)). +* Nothing fixed. {#v0-0-0-added} ### Added -* Nothing yet. +* Nothing added. {#v0-0-0-removed} ### Removed +* Nothing removed. + +{#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. From 15e9b4ab1dd8ced4dc468a307417e2fdcbd47314 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Sun, 17 Nov 2024 16:26:04 -0800 Subject: [PATCH 321/345] docs: fix refs to precompile source retention flag/attr in precompiling docs (#2419) Regular md docs need the `bzl:` prefix. Without it, the string doesn't render at all. --- docs/precompiling.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/precompiling.md b/docs/precompiling.md index 9b2e816ec4..a46608f77e 100644 --- a/docs/precompiling.md +++ b/docs/precompiling.md @@ -45,8 +45,8 @@ 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 -{obj}`--@rules_python//python/config_settings:precompile_source_retention=omit_source` -flag on the command line or the {attr}`precompile_source_retention=omit_source` +{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: From b28db698f50a82bf861b76e7ad6d75c31f1a820e Mon Sep 17 00:00:00 2001 From: Douglas Thor Date: Sun, 17 Nov 2024 16:38:57 -0800 Subject: [PATCH 322/345] refactor: Add GAZELLE_VERBOSE env and log parser failures (#2420) While investigating #2396 and why #2413 doesn't appear to be working for us, I realized that one of the things I was making heavy use of was additional parser logging that I had added. This adds some of that logging. I also throw in some documentation because I found it helpful. Users can (attempt to) get additional parse failure information by setting the `GAZELLE_VERBOSE` environment variable to `1`. Eg: ```console $ GAZELLE_VERBOSE=1 bazel run //:gazelle ``` Here are some example logs: ```console $ GAZELLE_VERBOSE=1 bazel run //:gazelle INFO: Invocation ID: a4e026d8-17df-426c-b1cc-d3980690dd53 ... INFO: Running command line: bazel-bin/gazelle INFO: Streaming build results to: https://btx.cloud.google.com/invocations/a4e026d8-17df-426c-b1cc-d3980690dd53 gazelle: WARNING: failed to parse "hello/get_deps.py". The resulting BUILD target may be incorrect. gazelle: Parse error at {Row:1 Column:0}: def search_one_more_level[T](): gazelle: The above was parsed as: (ERROR (identifier) (call function: (list (identifier)) arguments: (argument_list))) gazelle: ERROR: failed to generate target "//hello:get_deps" of kind "py_library": a target of kind "pyle_py_binary" with the same name already exists. Use the '# gazelle:python_library_naming_convention' directive to change the naming convention. $ $ bazel run //:gazelle INFO: Invocation ID: 726c9fd6-f566-4c30-95ef-c4781ad155de ... INFO: Running command line: bazel-bin/gazelle INFO: Streaming build results to: https://btx.cloud.google.com/invocations/726c9fd6-f566-4c30-95ef-c4781ad155de gazelle: WARNING: failed to parse "hello/get_deps.py". The resulting BUILD target may be incorrect. gazelle: ERROR: failed to generate target "//hello:get_deps" of kind "py_library": a target of kind "pyle_py_binary" with the same name already exists. Use the '# gazelle:python_library_naming_convention' directive to change the naming convention. ``` --------- Co-authored-by: Richard Levasseur Co-authored-by: Richard Levasseur --- CHANGELOG.md | 3 ++- gazelle/python/file_parser.go | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65a7d992cb..dd1c2ff67e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,7 +60,8 @@ Unreleased changes template. {#v0-0-0-added} ### Added -* Nothing added. +* (gazelle): Parser failures will now be logged to the terminal. Additional + details can be logged by setting `GAZELLE_VERBOSE=1`. {#v0-0-0-removed} ### Removed diff --git a/gazelle/python/file_parser.go b/gazelle/python/file_parser.go index a2b22c2b8f..9101621639 100644 --- a/gazelle/python/file_parser.go +++ b/gazelle/python/file_parser.go @@ -17,6 +17,7 @@ package python import ( "context" "fmt" + "log" "os" "path/filepath" "strings" @@ -55,7 +56,10 @@ func NewFileParser() *FileParser { 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,27 @@ func ParseCode(code []byte) (*sitter.Node, error) { return nil, err } - return tree.RootNode(), nil + root := tree.RootNode() + if root.HasError() { + log.Printf("WARNING: failed to parse %q. The resulting BUILD target may be incorrect.", path) + + verbose, envExists := os.LookupEnv("GAZELLE_VERBOSE") + if envExists && verbose == "1" { + for i := 0; i < int(root.ChildCount()); i++ { + child := root.Child(i) + if child.IsError() { + log.Printf("Parse error at %+v:\n%+v", child.StartPoint(), child.Content(code)) + 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 +116,8 @@ func (p *FileParser) parseMain(ctx context.Context, node *sitter.Node) bool { 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 +136,9 @@ func parseImportStatement(node *sitter.Node, code []byte) (module, bool) { 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 +173,8 @@ func (p *FileParser) parseImportStatements(node *sitter.Node) bool { 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 +209,7 @@ func (p *FileParser) parse(ctx context.Context, node *sitter.Node) { } 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 } From 79bd1f5f44e0dac4e9654a3007a69f4950469fa8 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 18 Nov 2024 10:17:24 +0900 Subject: [PATCH 323/345] refactor(toolchain): use bazel to extract `zstd` archives (#2412) Here we remove the dependence on the `zstd` archive downloaded from GH for extracting `zstd` toolchains because bazel now supports `zstd` extraction for a long time. This mainly cleans up the code which is again used a lot more due to #2386. Co-authored-by: Richard Levasseur --- CHANGELOG.md | 7 +++- python/private/python.bzl | 2 +- python/private/python_repository.bzl | 61 +++++----------------------- python/versions.bzl | 22 ++++++++-- 4 files changed, 36 insertions(+), 56 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd1c2ff67e..5eaa3fadf8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,7 +52,7 @@ Unreleased changes template. {#v0-0-0-changed} ### Changed -* Nothing changed. +* (python_repository) Start honoring the `strip_prefix` field for `zstd` archives. {#v0-0-0-fixed} ### Fixed @@ -89,6 +89,11 @@ Unreleased changes template. ### 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 diff --git a/python/private/python.bzl b/python/private/python.bzl index 8632554c51..ec6f73e41f 100644 --- a/python/private/python.bzl +++ b/python/private/python.bzl @@ -462,7 +462,7 @@ def _get_toolchain_config(*, modules, _fail = fail): "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"] diff --git a/python/private/python_repository.bzl b/python/private/python_repository.bzl index 9ffa196a20..c7407c8f2c 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", "FREETHREADED", "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") @@ -72,51 +72,13 @@ def _python_repository_impl(rctx): 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, @@ -125,6 +87,12 @@ def _python_repository_impl(rctx): 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: @@ -378,15 +346,6 @@ function defaults (e.g. `single_version_override` for `MODULE.bazel` files. "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/versions.bzl b/python/versions.bzl index 774c24d1b9..688c4e2ceb 100644 --- a/python/versions.bzl +++ b/python/versions.bzl @@ -20,6 +20,7 @@ MACOS_NAME = "mac os" 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" @@ -52,7 +53,7 @@ TOOL_VERSIONS = { "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", @@ -579,7 +580,22 @@ TOOL_VERSIONS = { "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", + "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", + }, }, } @@ -777,7 +793,7 @@ def get_release_info(platform, python_version, base_url = DEFAULT_RELEASE_BASE_U }[p], ) else: - build = "install_only" + build = INSTALL_ONLY if WINDOWS_NAME in platform: build = "shared-" + build From 68d1b4104f1d6f72ed0f3a8a5bf0a75d94cb74ec Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 18 Nov 2024 11:01:19 +0900 Subject: [PATCH 324/345] refactor!(toolchain): remove uname dep in the repository_rule stage (#2406) Before this PR we would shell out to `uname` on UNIX systems to get the `arch` of the toolchain - on Windows we would not need to do it because there used to be only a single Windows platform. With this change we can correctly support the resolution of the python interpreter on various platforms and I have also added an env variable to customize the selection, so that users can use `musl` or a `freethreaded` interpreter if they wish. As part of this change, I have restricted visibility of the config settings used in the toolchain alias repo so that we are creating fewer targets. This is a very good time to do this before `1.0.0`. Fixes #2145 Work towards #2276 Work towards #2386 Work towards #1211 to unblock #2402 Work towards #1361 --------- Co-authored-by: Richard Levasseur --- CHANGELOG.md | 25 +++- WORKSPACE | 2 +- docs/environment-variables.md | 10 ++ examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/python_register_toolchains.bzl | 6 +- python/private/repo_utils.bzl | 6 +- python/private/toolchain_aliases.bzl | 74 +++++++++ python/private/toolchains_repo.bzl | 141 +++++++----------- python/versions.bzl | 33 ++-- .../WORKSPACE | 3 +- 10 files changed, 195 insertions(+), 109 deletions(-) create mode 100644 python/private/toolchain_aliases.bzl diff --git a/CHANGELOG.md b/CHANGELOG.md index 5eaa3fadf8..16ea38b3ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,16 +52,39 @@ Unreleased changes template. {#v0-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. + +Other changes: * (python_repository) Start honoring the `strip_prefix` field for `zstd` archives. {#v0-0-0-fixed} ### Fixed -* Nothing fixed. +* (toolchains) stop depending on `uname` to get the value of the host platform. {#v0-0-0-added} ### Added * (gazelle): Parser failures will now be logged to the terminal. Additional details can be logged by setting `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`. {#v0-0-0-removed} ### Removed diff --git a/WORKSPACE b/WORKSPACE index b77918f5ef..46ebbc8cde 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -86,7 +86,7 @@ load("@rules_python_gazelle_plugin//:deps.bzl", _py_gazelle_deps = "gazelle_deps _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. diff --git a/docs/environment-variables.md b/docs/environment-variables.md index 2a0052923c..906281d56f 100644 --- a/docs/environment-variables.md +++ b/docs/environment-variables.md @@ -15,6 +15,16 @@ Determines the verbosity of logging output for repo rules. Valid values: * `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. diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 5a546c2f7a..8bad32a07b 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1562,7 +1562,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "MwmpiMn2qoAVC+3E9MF3E98fB8v1utYBfMa0frXyi7g=", + "bzlTransitiveDigest": "mCwiXbsZmReVgs884fZHYfxaZaL9mFG+prEnH/lpE9g=", "usagesDigest": "VmrNvB/4EhzsYieLDka9584M+pYKPpjNLl3Wcb5rx/c=", "recordedFileInputs": { "@@//requirements_lock_3_10.txt": "5e7083982a7e60f34998579a0ae83b520d46ab8f2552cc51337217f024e6def5", @@ -7035,7 +7035,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "Kx383BMHUpAHEjRiU5aWU4QTRQVg+Uu+Mgi7jVxuz0c=", + "bzlTransitiveDigest": "Xu1N6572iHVqGChH12PpMhprC21k3CpjRZVpm3FmE2c=", "usagesDigest": "/lZXl/ZgP+u5PE8WkeWTyYBsvX9XQWFn1antj5qrBzQ=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", diff --git a/python/private/python_register_toolchains.bzl b/python/private/python_register_toolchains.bzl index 98c8e5bfc3..cd3e9cbed7 100644 --- a/python/private/python_register_toolchains.bzl +++ b/python/private/python_register_toolchains.bzl @@ -160,7 +160,11 @@ def python_register_toolchains( platform = platform, )) - host_toolchain(name = name + "_host") + host_toolchain( + name = name + "_host", + platforms = loaded_platforms, + python_version = python_version, + ) toolchain_aliases( name = name, diff --git a/python/private/repo_utils.bzl b/python/private/repo_utils.bzl index e0bf69acac..0e3f7b024b 100644 --- a/python/private/repo_utils.bzl +++ b/python/private/repo_utils.bzl @@ -41,6 +41,10 @@ def _logger(mrctx, name = None): 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 @@ def _execute_internal( 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/toolchain_aliases.bzl b/python/private/toolchain_aliases.bzl new file mode 100644 index 0000000000..31ac4a8fdf --- /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 d21fb53a41..7e9a0c7ff9 100644 --- a/python/private/toolchains_repo.bzl +++ b/python/private/toolchains_repo.bzl @@ -25,8 +25,6 @@ platform-specific repositories. load( "//python:versions.bzl", - "LINUX_NAME", - "MACOS_NAME", "PLATFORMS", "WINDOWS_NAME", ) @@ -126,43 +124,26 @@ toolchains_repo = repository_rule( ) 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 @@ -181,9 +162,6 @@ load( ) 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, @@ -214,10 +192,7 @@ def compile_pip_requirements(name, **kwargs): ) """.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), )) @@ -243,15 +218,21 @@ actions.""", ) 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, @@ -320,6 +301,8 @@ toolchain_aliases repo because referencing the `python` interpreter target from 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")), }, @@ -336,16 +319,12 @@ def _multi_toolchain_aliases_impl(rctx): 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 @@ -388,57 +367,51 @@ multi_toolchain_aliases = repository_rule( 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 "freethreaded" in platform: - continue - - 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 - - # We assume the arch for Windows is always x86_64. - if "windows" in os_name.lower(): - arch = "x86_64" - - # 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) + 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] + + if candidates: + return candidates[0] + + 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/versions.bzl b/python/versions.bzl index 688c4e2ceb..d229b9d1db 100644 --- a/python/versions.bzl +++ b/python/versions.bzl @@ -15,8 +15,8 @@ """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" @@ -620,9 +620,8 @@ def _generate_platforms(): ], flag_values = {}, os_name = MACOS_NAME, - # Matches the value returned from: - # repository_ctx.execute(["uname", "-m"]).stdout.strip() - arch = "arm64", + # Matches the value in @platforms//cpu package + arch = "aarch64", ), "aarch64-unknown-linux-gnu": struct( compatible_with = [ @@ -633,9 +632,7 @@ def _generate_platforms(): 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() + # Matches the value in @platforms//cpu package arch = "aarch64", ), "armv7-unknown-linux-gnu": struct( @@ -647,7 +644,8 @@ def _generate_platforms(): libc: "glibc", }, os_name = LINUX_NAME, - arch = "armv7", + # Matches the value in @platforms//cpu package + arch = "arm", ), "i386-unknown-linux-gnu": struct( compatible_with = [ @@ -658,7 +656,8 @@ def _generate_platforms(): libc: "glibc", }, os_name = LINUX_NAME, - arch = "i386", + # Matches the value in @platforms//cpu package + arch = "x86_32", ), "ppc64le-unknown-linux-gnu": struct( compatible_with = [ @@ -669,10 +668,8 @@ def _generate_platforms(): 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", + # Matches the value in @platforms//cpu package + arch = "ppc", ), "riscv64-unknown-linux-gnu": struct( compatible_with = [ @@ -683,6 +680,7 @@ def _generate_platforms(): 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( @@ -694,9 +692,7 @@ def _generate_platforms(): 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() + # Matches the value in @platforms//cpu package arch = "s390x", ), "x86_64-apple-darwin": struct( @@ -706,6 +702,7 @@ def _generate_platforms(): ], flag_values = {}, os_name = MACOS_NAME, + # Matches the value in @platforms//cpu package arch = "x86_64", ), "x86_64-pc-windows-msvc": struct( @@ -715,6 +712,7 @@ def _generate_platforms(): ], flag_values = {}, os_name = WINDOWS_NAME, + # Matches the value in @platforms//cpu package arch = "x86_64", ), "x86_64-unknown-linux-gnu": struct( @@ -726,6 +724,7 @@ def _generate_platforms(): libc: "glibc", }, os_name = LINUX_NAME, + # Matches the value in @platforms//cpu package arch = "x86_64", ), } 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 48caeb442f..7834000854 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_register_toolchains( python_version = "3.9", ) -load("@python39//:defs.bzl", "interpreter") load("@rules_python//python:pip.bzl", "pip_parse") local_repository( @@ -22,7 +21,7 @@ local_repository( pip_parse( name = "pypi", - python_interpreter_target = interpreter, + python_interpreter_target = "@python39_host//:python", requirements_lock = "@compile_pip_requirements//:requirements_lock.txt", ) From f88e083e0f7659126d34d2249c7f89bea66db94b Mon Sep 17 00:00:00 2001 From: "Elvis M. Wianda" <7077790+ewianda@users.noreply.github.com> Date: Sun, 17 Nov 2024 22:10:40 -0500 Subject: [PATCH 325/345] fix(pypi): handle multiple versions of the same package when parsing requirements files (#2377) This change makes it possible to handle local versions of packages, which is extremely useful with PyTorch. With this change, it is possible to have different local versions of the same package in the `requirements.txt` file translated to valid `whl_library` repositories. Fixes #2337 --- .bazelrc | 4 +- CHANGELOG.md | 3 ++ examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/pypi/parse_requirements.bzl | 16 ++++++- .../parse_requirements_tests.bzl | 46 +++++++++++++++++++ 5 files changed, 68 insertions(+), 5 deletions(-) diff --git a/.bazelrc b/.bazelrc index c44124d961..66a644e289 100644 --- a/.bazelrc +++ b/.bazelrc @@ -4,8 +4,8 @@ # (Note, we cannot use `common --deleted_packages` because the bazel version command doesn't support it) # To update these lines, execute # `bazel run @rules_bazel_integration_test//tools:update_deleted_packages` -build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered -query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered test --test_output=errors diff --git a/CHANGELOG.md b/CHANGELOG.md index 16ea38b3ca..65504b357b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -75,6 +75,9 @@ Other changes: {#v0-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. vs ) for different target platforms. + Fixes ([2337](https://github.com/bazelbuild/rules_python/issues/2337)). {#v0-0-0-added} ### Added diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 8bad32a07b..51d23098f7 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1562,7 +1562,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "mCwiXbsZmReVgs884fZHYfxaZaL9mFG+prEnH/lpE9g=", + "bzlTransitiveDigest": "pwyX8REqPzcGLCGxpBHKvPiXm+kZooA+w1EfP3jA0Dc=", "usagesDigest": "VmrNvB/4EhzsYieLDka9584M+pYKPpjNLl3Wcb5rx/c=", "recordedFileInputs": { "@@//requirements_lock_3_10.txt": "5e7083982a7e60f34998579a0ae83b520d46ab8f2552cc51337217f024e6def5", @@ -7035,7 +7035,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "Xu1N6572iHVqGChH12PpMhprC21k3CpjRZVpm3FmE2c=", + "bzlTransitiveDigest": "XbkLEmpZ7PqBehe0QCZ4xvdtEesh5rpQLTvZg/+zWyI=", "usagesDigest": "/lZXl/ZgP+u5PE8WkeWTyYBsvX9XQWFn1antj5qrBzQ=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", diff --git a/python/private/pypi/parse_requirements.bzl b/python/private/pypi/parse_requirements.bzl index a43217dbc2..133ed18db8 100644 --- a/python/private/pypi/parse_requirements.bzl +++ b/python/private/pypi/parse_requirements.bzl @@ -32,6 +32,20 @@ load(":index_sources.bzl", "index_sources") 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, *, @@ -92,7 +106,7 @@ def parse_requirements( # 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, diff --git a/tests/pypi/parse_requirements/parse_requirements_tests.bzl b/tests/pypi/parse_requirements/parse_requirements_tests.bzl index a6e17bebec..dfa1fef5c3 100644 --- a/tests/pypi/parse_requirements/parse_requirements_tests.bzl +++ b/tests/pypi/parse_requirements/parse_requirements_tests.bzl @@ -19,6 +19,10 @@ load("//python/private/pypi:parse_requirements.bzl", "parse_requirements", "sele 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 """, @@ -382,6 +386,48 @@ def _test_env_marker_resolution(env): _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. From 0e9f97dad945ef2a954d199a94516f30e18c036d Mon Sep 17 00:00:00 2001 From: Mark Schulte Date: Mon, 18 Nov 2024 00:01:56 -0800 Subject: [PATCH 326/345] fix(uv): Fix sha256 for uv binary for aarch64-apple-darwin (#2422) `uv` cannot be used on aarch64-apple-darwin computers because the sha256sum is incorrect. The correct version can be seen [here](https://github.com/astral-sh/uv/releases/download/0.4.25/uv-aarch64-apple-darwin.tar.gz.sha256). Fixes #2411 --- CHANGELOG.md | 2 ++ examples/bzlmod/MODULE.bazel.lock | 2 +- python/uv/private/versions.bzl | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65504b357b..157be3e762 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -78,6 +78,8 @@ Other changes: * (pypi): Correctly handle multiple versions of the same package in the requirements files which is useful when including different PyTorch builds (e.g. vs ) 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)). {#v0-0-0-added} ### Added diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 51d23098f7..59d04d8320 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -9623,7 +9623,7 @@ }, "@@rules_python~//python/uv:extensions.bzl%uv": { "general": { - "bzlTransitiveDigest": "umgu1yR4Wmqb1pJa+9hAcs9dPbeqBsPLceKiaEg3DdQ=", + "bzlTransitiveDigest": "wVkXn96Vi6Bn1BRJ4R0bOAbUFvh4k54kimcXSd11Y3g=", "usagesDigest": "wWx9DCrTsAgJQmDRUcO+EJrPKJEDsXpZbjzC0HVdde0=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, diff --git a/python/uv/private/versions.bzl b/python/uv/private/versions.bzl index f13eae5cee..1d68302c74 100644 --- a/python/uv/private/versions.bzl +++ b/python/uv/private/versions.bzl @@ -70,7 +70,7 @@ UV_PLATFORMS = { UV_TOOL_VERSIONS = { "0.4.25": { "aarch64-apple-darwin": struct( - sha256 = "35786030f926e3d34d186edc0ea3989698e57755852af9ae4b39da5109abcbfa", + sha256 = "bb2ff4348114ef220ca52e44d5086640c4a1a18f797a5f1ab6f8559fc37b1230", ), "aarch64-unknown-linux-gnu": struct( sha256 = "4485852eb8013530c4275cd222c0056ce123f92742321f012610f1b241463f39", From e7c306de56860d5bd4693628c0f51d056698a82d Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 18 Nov 2024 17:57:05 +0900 Subject: [PATCH 327/345] feat(musl): add musl toolchain (#2402) With this and the previously landed #2406 users can use this in `sdist` or `whl`-only setups alike. The PR itself is very simple and just adds `musl` toolchains. Whilst at it also move the `WhlLibc` flag out of the `pypi` namespace since it is also used for `toolchain` matching now. Fixes #1211 --- CHANGELOG.md | 4 ++++ docs/toolchains.md | 7 +++++++ python/config_settings/BUILD.bazel | 6 +++--- python/private/flags.bzl | 11 +++++++++++ python/private/pypi/config_settings.bzl | 13 +++++++------ python/private/pypi/flags.bzl | 10 ---------- python/versions.bzl | 17 +++++++++++++++++ 7 files changed, 49 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 157be3e762..4a73766d7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -90,6 +90,10 @@ Other changes: `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. {#v0-0-0-removed} ### Removed diff --git a/docs/toolchains.md b/docs/toolchains.md index 6df6f22a2a..d6c59544a8 100644 --- a/docs/toolchains.md +++ b/docs/toolchains.md @@ -451,3 +451,10 @@ 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/python/config_settings/BUILD.bazel b/python/config_settings/BUILD.bazel index 6d34ee95c7..aa26e6e669 100644 --- a/python/config_settings/BUILD.bazel +++ b/python/config_settings/BUILD.bazel @@ -6,6 +6,7 @@ load( "BootstrapImplFlag", "ExecToolsToolchainFlag", "FreeThreadedFlag", + "LibcFlag", "PrecompileFlag", "PrecompileSourceRetentionFlag", ) @@ -13,7 +14,6 @@ load( "//python/private/pypi:flags.bzl", "UniversalWhlFlag", "UseWhlFlag", - "WhlLibcFlag", "define_pypi_internal_flags", ) load(":config_settings.bzl", "construct_config_settings") @@ -87,8 +87,8 @@ string_flag( # 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"], ) diff --git a/python/private/flags.bzl b/python/private/flags.bzl index 5239771d7e..9070f113ac 100644 --- a/python/private/flags.bzl +++ b/python/private/flags.bzl @@ -132,3 +132,14 @@ FreeThreadedFlag = enum( # 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/pypi/config_settings.bzl b/python/private/pypi/config_settings.bzl index 9f3f4d4e48..6f927f2a4c 100644 --- a/python/private/pypi/config_settings.bzl +++ b/python/private/pypi/config_settings.bzl @@ -39,7 +39,8 @@ Note, that here the specialization of musl vs manylinux wheels is the same in 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( **{ @@ -251,14 +252,14 @@ def _plat_flag_values(os, cpu, osx_versions, glibc_versions, muslc_versions): 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: diff --git a/python/private/pypi/flags.bzl b/python/private/pypi/flags.bzl index 1e380625ce..11727b5853 100644 --- a/python/private/pypi/flags.bzl +++ b/python/private/pypi/flags.bzl @@ -44,16 +44,6 @@ UniversalWhlFlag = enum( 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/versions.bzl b/python/versions.bzl index d229b9d1db..1fd0649f12 100644 --- a/python/versions.bzl +++ b/python/versions.bzl @@ -248,6 +248,7 @@ TOOL_VERSIONS = { "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", }, @@ -367,6 +368,7 @@ TOOL_VERSIONS = { "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", }, @@ -481,6 +483,7 @@ TOOL_VERSIONS = { "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", }, @@ -559,6 +562,7 @@ TOOL_VERSIONS = { "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", }, @@ -572,6 +576,7 @@ TOOL_VERSIONS = { "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", @@ -588,6 +593,7 @@ TOOL_VERSIONS = { "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", @@ -727,6 +733,17 @@ def _generate_platforms(): # 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") From 9766cb680e0645a9345facbcf08794a589f4aacc Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 18 Nov 2024 17:58:58 +0900 Subject: [PATCH 328/345] chore: extra code removals before 1.0 (#2421) Alternatives have existed for a long time and we just ensure that we remove before the 1.0 release. Summary: - remove pip_install_dependencies - remove DEFAULT_PYTHON_VERSION from interpreters.bzl Work towards #1361 --- CHANGELOG.md | 5 ++++- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/pip_install/BUILD.bazel | 8 -------- python/pip_install/repositories.bzl | 19 ------------------- python/private/pythons_hub.bzl | 3 --- tests/integration/pip_parse/WORKSPACE | 9 --------- 6 files changed, 6 insertions(+), 42 deletions(-) delete mode 100644 python/pip_install/repositories.bzl diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a73766d7f..4c6a08db2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -97,7 +97,10 @@ Other changes: {#v0-0-0-removed} ### Removed -* Nothing 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 diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 59d04d8320..9cad5952d7 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1562,7 +1562,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "pwyX8REqPzcGLCGxpBHKvPiXm+kZooA+w1EfP3jA0Dc=", + "bzlTransitiveDigest": "i5dWUNj1rZ4NKXmzLiGceV+1gAsDWtpJED1w1tdB7WY=", "usagesDigest": "VmrNvB/4EhzsYieLDka9584M+pYKPpjNLl3Wcb5rx/c=", "recordedFileInputs": { "@@//requirements_lock_3_10.txt": "5e7083982a7e60f34998579a0ae83b520d46ab8f2552cc51337217f024e6def5", @@ -7035,7 +7035,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "XbkLEmpZ7PqBehe0QCZ4xvdtEesh5rpQLTvZg/+zWyI=", + "bzlTransitiveDigest": "ltVKFX5LXgwSpZtjuyF02xZspYIWHEFmpxmzvnyMbQ8=", "usagesDigest": "/lZXl/ZgP+u5PE8WkeWTyYBsvX9XQWFn1antj5qrBzQ=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", diff --git a/python/pip_install/BUILD.bazel b/python/pip_install/BUILD.bazel index 683199f807..09bc46eea7 100644 --- a/python/pip_install/BUILD.bazel +++ b/python/pip_install/BUILD.bazel @@ -35,14 +35,6 @@ bzl_library( 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/pip_install/repositories.bzl b/python/pip_install/repositories.bzl deleted file mode 100644 index 5231d1f0a1..0000000000 --- a/python/pip_install/repositories.bzl +++ /dev/null @@ -1,19 +0,0 @@ -# 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. - -"" - -load("//python/private/pypi:deps.bzl", "pypi_deps") - -pip_install_dependencies = pypi_deps diff --git a/python/private/pythons_hub.bzl b/python/private/pythons_hub.bzl index 8afee5af17..ac928ffc96 100644 --- a/python/private/pythons_hub.bzl +++ b/python/private/pythons_hub.bzl @@ -86,7 +86,6 @@ _interpreters_bzl_template = """ INTERPRETER_LABELS = {{ {interpreter_labels} }} -DEFAULT_PYTHON_VERSION = "{default_python_version}" """ _line_for_hub_template = """\ @@ -125,8 +124,6 @@ def _hub_repo_impl(rctx): 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, diff --git a/tests/integration/pip_parse/WORKSPACE b/tests/integration/pip_parse/WORKSPACE index db0cd0c7c8..e31655dbe4 100644 --- a/tests/integration/pip_parse/WORKSPACE +++ b/tests/integration/pip_parse/WORKSPACE @@ -7,15 +7,6 @@ load("@rules_python//python:repositories.bzl", "py_repositories", "python_regist 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", From d52b964e4cb11a9495643fd7da19b0d648705f28 Mon Sep 17 00:00:00 2001 From: Garrett Holmstrom Date: Mon, 18 Nov 2024 16:56:51 -0800 Subject: [PATCH 329/345] feat(pypi): Add extra_hub_aliases to pip_repository too (#2426) The extra_hub_aliases feature from #2369 has bindings in the pip extension for bzlmod users, but not pip_repository for WORKSPACE users. But it _can_ work for either, so this patch moves it to the list of attrs the two share and makes it work with the latter. --------- Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> --- CHANGELOG.md | 1 + examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/attrs.bzl | 10 ++++++++++ python/private/pypi/extension.bzl | 10 ---------- python/private/pypi/pip_repository.bzl | 1 + 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c6a08db2c..f067b4f698 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -71,6 +71,7 @@ Unreleased changes template. 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. {#v0-0-0-fixed} ### Fixed diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 9cad5952d7..18538d929a 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1562,7 +1562,7 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "i5dWUNj1rZ4NKXmzLiGceV+1gAsDWtpJED1w1tdB7WY=", + "bzlTransitiveDigest": "c3HURsyNEdAN0fRo5BXiCkhhZSPfl1zNBcQOQbpgJ64=", "usagesDigest": "VmrNvB/4EhzsYieLDka9584M+pYKPpjNLl3Wcb5rx/c=", "recordedFileInputs": { "@@//requirements_lock_3_10.txt": "5e7083982a7e60f34998579a0ae83b520d46ab8f2552cc51337217f024e6def5", @@ -7035,7 +7035,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "ltVKFX5LXgwSpZtjuyF02xZspYIWHEFmpxmzvnyMbQ8=", + "bzlTransitiveDigest": "H9pnwH6wHRp4Xy2CN6NSo0mDMHFDvpqspLNW6Xbqnhc=", "usagesDigest": "/lZXl/ZgP+u5PE8WkeWTyYBsvX9XQWFn1antj5qrBzQ=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", diff --git a/python/private/pypi/attrs.bzl b/python/private/pypi/attrs.bzl index c6132cb6c1..c9b7ea66a9 100644 --- a/python/private/pypi/attrs.bzl +++ b/python/private/pypi/attrs.bzl @@ -141,6 +141,16 @@ Special values: `host` (for generating deps for the host platform only) and 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/extension.bzl b/python/private/pypi/extension.bzl index ea2bafdb77..3df7b52e8a 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -750,16 +750,6 @@ The indexes must support Simple API as described here: https://packaging.python.org/en/latest/specifications/simple-repository-api/ """, ), - "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, - ), "hub_name": attr.string( mandatory = True, doc = """ diff --git a/python/private/pypi/pip_repository.bzl b/python/private/pypi/pip_repository.bzl index 90cda77465..597b37f52c 100644 --- a/python/private/pypi/pip_repository.bzl +++ b/python/private/pypi/pip_repository.bzl @@ -177,6 +177,7 @@ def _pip_repository_impl(rctx): pkg: [whl_alias(repo = 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) From b9b0948234216cf43bb898eec078b1c71a37c1f9 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Tue, 19 Nov 2024 10:47:56 +0900 Subject: [PATCH 330/345] chore!(pip.parse): remove parse_all_requirements_files attribute (#2407) Remove the deprecated symbol and use the default `pip` extension in `rules_python` to pull `twine` as part of the dependencies. Work towards #1361 Fixes #2268 for all the users by default --- CHANGELOG.md | 4 +- MODULE.bazel | 2 +- examples/bzlmod/MODULE.bazel | 3 - examples/bzlmod/MODULE.bazel.lock | 519 +++++++++++------------------- python/private/pypi/extension.bzl | 103 +----- python/private/pypi/pip.bzl | 3 +- 6 files changed, 197 insertions(+), 437 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f067b4f698..1a1c17d8b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -68,6 +68,8 @@ Unreleased changes template. {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. Other changes: * (python_repository) Start honoring the `strip_prefix` field for `zstd` archives. @@ -214,7 +216,7 @@ Other changes: * (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 - {bzl:obj}`pip.parse.parse_all_requirements_files`, which will become the + `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 diff --git a/MODULE.bazel b/MODULE.bazel index ef173bc83b..d3edb0356c 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -54,7 +54,7 @@ register_toolchains("@pythons_hub//:all") ##################### # 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. diff --git a/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel index 2843575c31..27dd513762 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -231,9 +231,6 @@ pip.parse( "host", ], hub_name = "pip", - # Parse all requirements files for the same lock file on all OSes, this will - # become the default with 1.0 release - parse_all_requirements_files = True, python_version = "3.10", # The requirements files for each platform that we want to support. requirements_by_platform = { diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 18538d929a..6e4d6e180b 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -1562,10 +1562,11 @@ }, "@@rules_python~//python/extensions:pip.bzl%pip": { "general": { - "bzlTransitiveDigest": "c3HURsyNEdAN0fRo5BXiCkhhZSPfl1zNBcQOQbpgJ64=", - "usagesDigest": "VmrNvB/4EhzsYieLDka9584M+pYKPpjNLl3Wcb5rx/c=", + "bzlTransitiveDigest": "qoC5CyCn6Cm4Ytk6NW1xqwmeHlT403IcVg6JXDuLjRU=", + "usagesDigest": "/LXEbF0D40bNgP95ES+IlHqvpiKbQBuGdNECrFAUXqk=", "recordedFileInputs": { "@@//requirements_lock_3_10.txt": "5e7083982a7e60f34998579a0ae83b520d46ab8f2552cc51337217f024e6def5", + "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", "@@rules_python~~internal_deps~pypi__packaging//BUILD.bazel": "16cf02cdc6cd989d8a92b551d406abea3fe597b1524ba5fa88f0410010671d7f", "@@//whl_mods/appended_build_content.BUILD": "87745b00382c66e5efbd7cb44a08fc3edbf7fd5099cf593f87599188f1557a9e", "@@rules_python~//BUILD.bazel": "140002ce7e68de2fbf064bcdc37f854d4fa5b5d611a5fece6eb6cf19b8822bc4", @@ -1577,7 +1578,9 @@ "@@rules_python~~internal_deps~pypi__packaging//packaging-24.0.dist-info/RECORD": "be1aea790359b4c2c9ea83d153c1a57c407742a35b95ee36d00723509f5ed5dd", "@@//requirements_windows_3_10.txt": "c79f04bfaca147b8330275911a3328b81fc80828b9050a6bebdb15477627dabc", "@@rules_python~~python~python_3_9_host//BUILD.bazel": "cf97d5763b728ce5ba8fdc3243350b967658ba4e3879734504aee002cec0d2b3", - "@@protobuf~//python/requirements.txt": "983be60d3cec4b319dcab6d48aeb3f5b2f7c3350f26b3a9e97486c37967c73c5" + "@@rules_python~//tools/publish/requirements_windows.txt": "7673adc71dc1a81d3661b90924d7a7c0fc998cd508b3cb4174337cef3f2de556", + "@@protobuf~//python/requirements.txt": "983be60d3cec4b319dcab6d48aeb3f5b2f7c3350f26b3a9e97486c37967c73c5", + "@@rules_python~//tools/publish/requirements_darwin.txt": "2994136eab7e57b083c3de76faf46f70fad130bc8e7360a7fed2b288b69e79dc" }, "recordedDirentsInputs": {}, "envVariables": { @@ -6725,329 +6728,6 @@ "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" } }, - "other_module_pip": { - "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", - "ruleClassName": "hub_repository", - "attributes": { - "repo_name": "other_module_pip", - "extra_hub_aliases": {}, - "whl_map": { - "absl_py": "[{\"repo\":\"other_module_pip_311_absl_py\",\"version\":\"3.11\"}]" - }, - "packages": [ - "absl_py" - ], - "groups": {} - } - }, - "pip": { - "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", - "ruleClassName": "hub_repository", - "attributes": { - "repo_name": "pip", - "extra_hub_aliases": { - "wheel": [ - "generated_file" - ] - }, - "whl_map": { - "alabaster": "[{\"repo\":\"pip_310_alabaster\",\"version\":\"3.10\"},{\"filename\":\"alabaster-0.7.13-py3-none-any.whl\",\"repo\":\"pip_39_alabaster_py3_none_any_1ee19aca\",\"version\":\"3.9\"},{\"filename\":\"alabaster-0.7.13.tar.gz\",\"repo\":\"pip_39_alabaster_sdist_a27a4a08\",\"version\":\"3.9\"}]", - "astroid": "[{\"repo\":\"pip_310_astroid\",\"version\":\"3.10\"},{\"filename\":\"astroid-2.12.13-py3-none-any.whl\",\"repo\":\"pip_39_astroid_py3_none_any_10e0ad5f\",\"version\":\"3.9\"},{\"filename\":\"astroid-2.12.13.tar.gz\",\"repo\":\"pip_39_astroid_sdist_1493fe8b\",\"version\":\"3.9\"}]", - "babel": "[{\"repo\":\"pip_310_babel\",\"version\":\"3.10\"},{\"filename\":\"Babel-2.13.1-py3-none-any.whl\",\"repo\":\"pip_39_babel_py3_none_any_7077a498\",\"version\":\"3.9\"},{\"filename\":\"Babel-2.13.1.tar.gz\",\"repo\":\"pip_39_babel_sdist_33e0952d\",\"version\":\"3.9\"}]", - "certifi": "[{\"repo\":\"pip_310_certifi\",\"version\":\"3.10\"},{\"filename\":\"certifi-2023.7.22-py3-none-any.whl\",\"repo\":\"pip_39_certifi_py3_none_any_92d60375\",\"version\":\"3.9\"},{\"filename\":\"certifi-2023.7.22.tar.gz\",\"repo\":\"pip_39_certifi_sdist_539cc1d1\",\"version\":\"3.9\"}]", - "chardet": "[{\"repo\":\"pip_310_chardet\",\"version\":\"3.10\"},{\"filename\":\"chardet-4.0.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_chardet_py2_none_any_f864054d\",\"version\":\"3.9\"},{\"filename\":\"chardet-4.0.0.tar.gz\",\"repo\":\"pip_39_chardet_sdist_0d6f53a1\",\"version\":\"3.9\"}]", - "colorama": "[{\"repo\":\"pip_310_colorama\",\"version\":\"3.10\"},{\"filename\":\"colorama-0.4.6-py2.py3-none-any.whl\",\"repo\":\"pip_39_colorama_py2_none_any_4f1d9991\",\"version\":\"3.9\"},{\"filename\":\"colorama-0.4.6.tar.gz\",\"repo\":\"pip_39_colorama_sdist_08695f5c\",\"version\":\"3.9\"}]", - "dill": "[{\"repo\":\"pip_310_dill\",\"version\":\"3.10\"},{\"filename\":\"dill-0.3.6-py3-none-any.whl\",\"repo\":\"pip_39_dill_py3_none_any_a07ffd23\",\"version\":\"3.9\"},{\"filename\":\"dill-0.3.6.tar.gz\",\"repo\":\"pip_39_dill_sdist_e5db55f3\",\"version\":\"3.9\"}]", - "docutils": "[{\"repo\":\"pip_310_docutils\",\"version\":\"3.10\"},{\"filename\":\"docutils-0.20.1-py3-none-any.whl\",\"repo\":\"pip_39_docutils_py3_none_any_96f387a2\",\"version\":\"3.9\"},{\"filename\":\"docutils-0.20.1.tar.gz\",\"repo\":\"pip_39_docutils_sdist_f08a4e27\",\"version\":\"3.9\"}]", - "idna": "[{\"repo\":\"pip_310_idna\",\"version\":\"3.10\"},{\"filename\":\"idna-2.10-py2.py3-none-any.whl\",\"repo\":\"pip_39_idna_py2_none_any_b97d804b\",\"version\":\"3.9\"},{\"filename\":\"idna-2.10.tar.gz\",\"repo\":\"pip_39_idna_sdist_b307872f\",\"version\":\"3.9\"}]", - "imagesize": "[{\"repo\":\"pip_310_imagesize\",\"version\":\"3.10\"},{\"filename\":\"imagesize-1.4.1-py2.py3-none-any.whl\",\"repo\":\"pip_39_imagesize_py2_none_any_0d8d18d0\",\"version\":\"3.9\"},{\"filename\":\"imagesize-1.4.1.tar.gz\",\"repo\":\"pip_39_imagesize_sdist_69150444\",\"version\":\"3.9\"}]", - "importlib_metadata": "[{\"filename\":\"importlib_metadata-8.4.0-py3-none-any.whl\",\"repo\":\"pip_39_importlib_metadata_py3_none_any_66f342cc\",\"version\":\"3.9\"},{\"filename\":\"importlib_metadata-8.4.0.tar.gz\",\"repo\":\"pip_39_importlib_metadata_sdist_9a547d3b\",\"version\":\"3.9\"}]", - "isort": "[{\"repo\":\"pip_310_isort\",\"version\":\"3.10\"},{\"filename\":\"isort-5.11.4-py3-none-any.whl\",\"repo\":\"pip_39_isort_py3_none_any_c033fd0e\",\"version\":\"3.9\"},{\"filename\":\"isort-5.11.4.tar.gz\",\"repo\":\"pip_39_isort_sdist_6db30c5d\",\"version\":\"3.9\"}]", - "jinja2": "[{\"repo\":\"pip_310_jinja2\",\"version\":\"3.10\"},{\"filename\":\"jinja2-3.1.4-py3-none-any.whl\",\"repo\":\"pip_39_jinja2_py3_none_any_bc5dd2ab\",\"version\":\"3.9\"},{\"filename\":\"jinja2-3.1.4.tar.gz\",\"repo\":\"pip_39_jinja2_sdist_4a3aee7a\",\"version\":\"3.9\"}]", - "lazy_object_proxy": "[{\"repo\":\"pip_310_lazy_object_proxy\",\"version\":\"3.10\"},{\"filename\":\"lazy-object-proxy-1.10.0.tar.gz\",\"repo\":\"pip_39_lazy_object_proxy_sdist_78247b6d\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"}]", - "markupsafe": "[{\"repo\":\"pip_310_markupsafe\",\"version\":\"3.10\"},{\"filename\":\"MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl\",\"repo\":\"pip_39_markupsafe_cp39_cp39_macosx_10_9_universal2_8023faf4\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"},{\"filename\":\"MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_markupsafe_cp39_cp39_win_amd64_3fd4abcb\",\"version\":\"3.9\"},{\"filename\":\"MarkupSafe-2.1.3.tar.gz\",\"repo\":\"pip_39_markupsafe_sdist_af598ed3\",\"version\":\"3.9\"}]", - "mccabe": "[{\"repo\":\"pip_310_mccabe\",\"version\":\"3.10\"},{\"filename\":\"mccabe-0.7.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_mccabe_py2_none_any_6c2d30ab\",\"version\":\"3.9\"},{\"filename\":\"mccabe-0.7.0.tar.gz\",\"repo\":\"pip_39_mccabe_sdist_348e0240\",\"version\":\"3.9\"}]", - "packaging": "[{\"repo\":\"pip_310_packaging\",\"version\":\"3.10\"},{\"filename\":\"packaging-23.2-py3-none-any.whl\",\"repo\":\"pip_39_packaging_py3_none_any_8c491190\",\"version\":\"3.9\"},{\"filename\":\"packaging-23.2.tar.gz\",\"repo\":\"pip_39_packaging_sdist_048fb0e9\",\"version\":\"3.9\"}]", - "pathspec": "[{\"repo\":\"pip_310_pathspec\",\"version\":\"3.10\"},{\"filename\":\"pathspec-0.10.3-py3-none-any.whl\",\"repo\":\"pip_39_pathspec_py3_none_any_3c95343a\",\"version\":\"3.9\"},{\"filename\":\"pathspec-0.10.3.tar.gz\",\"repo\":\"pip_39_pathspec_sdist_56200de4\",\"version\":\"3.9\"}]", - "platformdirs": "[{\"repo\":\"pip_310_platformdirs\",\"version\":\"3.10\"},{\"filename\":\"platformdirs-2.6.0-py3-none-any.whl\",\"repo\":\"pip_39_platformdirs_py3_none_any_1a89a123\",\"version\":\"3.9\"},{\"filename\":\"platformdirs-2.6.0.tar.gz\",\"repo\":\"pip_39_platformdirs_sdist_b46ffafa\",\"version\":\"3.9\"}]", - "pygments": "[{\"repo\":\"pip_310_pygments\",\"version\":\"3.10\"},{\"filename\":\"Pygments-2.16.1-py3-none-any.whl\",\"repo\":\"pip_39_pygments_py3_none_any_13fc09fa\",\"version\":\"3.9\"},{\"filename\":\"Pygments-2.16.1.tar.gz\",\"repo\":\"pip_39_pygments_sdist_1daff049\",\"version\":\"3.9\"}]", - "pylint": "[{\"repo\":\"pip_310_pylint\",\"version\":\"3.10\"},{\"filename\":\"pylint-2.15.9-py3-none-any.whl\",\"repo\":\"pip_39_pylint_py3_none_any_349c8cd3\",\"version\":\"3.9\"},{\"filename\":\"pylint-2.15.9.tar.gz\",\"repo\":\"pip_39_pylint_sdist_18783cca\",\"version\":\"3.9\"}]", - "pylint_print": "[{\"repo\":\"pip_310_pylint_print\",\"version\":\"3.10\"},{\"filename\":\"pylint-print-1.0.1.tar.gz\",\"repo\":\"pip_39_pylint_print_sdist_30aa207e\",\"version\":\"3.9\"},{\"filename\":\"pylint_print-1.0.1-py3-none-any.whl\",\"repo\":\"pip_39_pylint_print_py3_none_any_a2b2599e\",\"version\":\"3.9\"}]", - "python_dateutil": "[{\"repo\":\"pip_310_python_dateutil\",\"version\":\"3.10\"},{\"filename\":\"python-dateutil-2.8.2.tar.gz\",\"repo\":\"pip_39_python_dateutil_sdist_0123cacc\",\"version\":\"3.9\"},{\"filename\":\"python_dateutil-2.8.2-py2.py3-none-any.whl\",\"repo\":\"pip_39_python_dateutil_py2_none_any_961d03dc\",\"version\":\"3.9\"}]", - "python_magic": "[{\"repo\":\"pip_310_python_magic\",\"version\":\"3.10\"},{\"filename\":\"python-magic-0.4.27.tar.gz\",\"repo\":\"pip_39_python_magic_sdist_c1ba14b0\",\"version\":\"3.9\"},{\"filename\":\"python_magic-0.4.27-py2.py3-none-any.whl\",\"repo\":\"pip_39_python_magic_py2_none_any_c212960a\",\"version\":\"3.9\"}]", - "pyyaml": "[{\"repo\":\"pip_310_pyyaml\",\"version\":\"3.10\"},{\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"},{\"filename\":\"PyYAML-6.0.1-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_pyyaml_cp39_cp39_win_amd64_510c9dee\",\"version\":\"3.9\"},{\"filename\":\"PyYAML-6.0.1.tar.gz\",\"repo\":\"pip_39_pyyaml_sdist_bfdf460b\",\"version\":\"3.9\"}]", - "requests": "[{\"repo\":\"pip_310_requests\",\"version\":\"3.10\"},{\"filename\":\"requests-2.25.1-py2.py3-none-any.whl\",\"repo\":\"pip_39_requests_py2_none_any_c210084e\",\"version\":\"3.9\"},{\"filename\":\"requests-2.25.1.tar.gz\",\"repo\":\"pip_39_requests_sdist_27973dd4\",\"version\":\"3.9\"}]", - "s3cmd": "[{\"repo\":\"pip_310_s3cmd\",\"version\":\"3.10\"},{\"filename\":\"s3cmd-2.1.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_s3cmd_py2_none_any_49cd23d5\",\"version\":\"3.9\"},{\"filename\":\"s3cmd-2.1.0.tar.gz\",\"repo\":\"pip_39_s3cmd_sdist_966b0a49\",\"version\":\"3.9\"}]", - "setuptools": "[{\"filename\":\"setuptools-65.6.3-py3-none-any.whl\",\"repo\":\"pip_39_setuptools_py3_none_any_57f6f22b\",\"version\":\"3.9\"},{\"filename\":\"setuptools-65.6.3.tar.gz\",\"repo\":\"pip_39_setuptools_sdist_a7620757\",\"version\":\"3.9\"}]", - "six": "[{\"repo\":\"pip_310_six\",\"version\":\"3.10\"},{\"filename\":\"six-1.16.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_six_py2_none_any_8abb2f1d\",\"version\":\"3.9\"},{\"filename\":\"six-1.16.0.tar.gz\",\"repo\":\"pip_39_six_sdist_1e61c374\",\"version\":\"3.9\"}]", - "snowballstemmer": "[{\"repo\":\"pip_310_snowballstemmer\",\"version\":\"3.10\"},{\"filename\":\"snowballstemmer-2.2.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_snowballstemmer_py2_none_any_c8e1716e\",\"version\":\"3.9\"},{\"filename\":\"snowballstemmer-2.2.0.tar.gz\",\"repo\":\"pip_39_snowballstemmer_sdist_09b16deb\",\"version\":\"3.9\"}]", - "sphinx": "[{\"repo\":\"pip_310_sphinx\",\"version\":\"3.10\"},{\"filename\":\"sphinx-7.2.6-py3-none-any.whl\",\"repo\":\"pip_39_sphinx_py3_none_any_1e09160a\",\"version\":\"3.9\"},{\"filename\":\"sphinx-7.2.6.tar.gz\",\"repo\":\"pip_39_sphinx_sdist_9a5160e1\",\"version\":\"3.9\"}]", - "sphinxcontrib_applehelp": "[{\"repo\":\"pip_310_sphinxcontrib_applehelp\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_applehelp-1.0.7-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_applehelp_py3_none_any_094c4d56\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_applehelp-1.0.7.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_applehelp_sdist_39fdc8d7\",\"version\":\"3.9\"}]", - "sphinxcontrib_devhelp": "[{\"repo\":\"pip_310_sphinxcontrib_devhelp\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_devhelp-1.0.5-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_devhelp_py3_none_any_fe8009ae\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_devhelp-1.0.5.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_devhelp_sdist_63b41e0d\",\"version\":\"3.9\"}]", - "sphinxcontrib_htmlhelp": "[{\"repo\":\"pip_310_sphinxcontrib_htmlhelp\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_htmlhelp_py3_none_any_8001661c\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_htmlhelp-2.0.4.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_htmlhelp_sdist_6c26a118\",\"version\":\"3.9\"}]", - "sphinxcontrib_jsmath": "[{\"repo\":\"pip_310_sphinxcontrib_jsmath\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib-jsmath-1.0.1.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_jsmath_sdist_a9925e4a\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_jsmath_py2_none_any_2ec2eaeb\",\"version\":\"3.9\"}]", - "sphinxcontrib_qthelp": "[{\"repo\":\"pip_310_sphinxcontrib_qthelp\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_qthelp-1.0.6-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_qthelp_py3_none_any_bf76886e\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_qthelp-1.0.6.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_qthelp_sdist_62b9d1a1\",\"version\":\"3.9\"}]", - "sphinxcontrib_serializinghtml": "[{\"repo\":\"pip_310_sphinxcontrib_serializinghtml\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_serializinghtml_py3_none_any_9b36e503\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_serializinghtml-1.1.9.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_serializinghtml_sdist_0c64ff89\",\"version\":\"3.9\"}]", - "tabulate": "[{\"repo\":\"pip_310_tabulate\",\"version\":\"3.10\"},{\"filename\":\"tabulate-0.9.0-py3-none-any.whl\",\"repo\":\"pip_39_tabulate_py3_none_any_024ca478\",\"version\":\"3.9\"},{\"filename\":\"tabulate-0.9.0.tar.gz\",\"repo\":\"pip_39_tabulate_sdist_0095b12b\",\"version\":\"3.9\"}]", - "tomli": "[{\"repo\":\"pip_310_tomli\",\"version\":\"3.10\"},{\"filename\":\"tomli-2.0.1-py3-none-any.whl\",\"repo\":\"pip_39_tomli_py3_none_any_939de3e7\",\"version\":\"3.9\"},{\"filename\":\"tomli-2.0.1.tar.gz\",\"repo\":\"pip_39_tomli_sdist_de526c12\",\"version\":\"3.9\"}]", - "tomlkit": "[{\"repo\":\"pip_310_tomlkit\",\"version\":\"3.10\"},{\"filename\":\"tomlkit-0.11.6-py3-none-any.whl\",\"repo\":\"pip_39_tomlkit_py3_none_any_07de26b0\",\"version\":\"3.9\"},{\"filename\":\"tomlkit-0.11.6.tar.gz\",\"repo\":\"pip_39_tomlkit_sdist_71b952e5\",\"version\":\"3.9\"}]", - "typing_extensions": "[{\"repo\":\"pip_310_typing_extensions\",\"version\":\"3.10\"},{\"filename\":\"typing_extensions-4.12.2-py3-none-any.whl\",\"repo\":\"pip_39_typing_extensions_py3_none_any_04e5ca03\",\"version\":\"3.9\"},{\"filename\":\"typing_extensions-4.12.2.tar.gz\",\"repo\":\"pip_39_typing_extensions_sdist_1a7ead55\",\"version\":\"3.9\"}]", - "urllib3": "[{\"repo\":\"pip_310_urllib3\",\"version\":\"3.10\"},{\"filename\":\"urllib3-1.26.18-py2.py3-none-any.whl\",\"repo\":\"pip_39_urllib3_py2_none_any_34b97092\",\"version\":\"3.9\"},{\"filename\":\"urllib3-1.26.18.tar.gz\",\"repo\":\"pip_39_urllib3_sdist_f8ecc1bb\",\"version\":\"3.9\"}]", - "websockets": "[{\"repo\":\"pip_310_websockets\",\"version\":\"3.10\"},{\"filename\":\"websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl\",\"repo\":\"pip_39_websockets_cp39_cp39_macosx_10_9_universal2_777354ee\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"},{\"filename\":\"websockets-11.0.3-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_websockets_cp39_cp39_win_amd64_c792ea4e\",\"version\":\"3.9\"},{\"filename\":\"websockets-11.0.3-py3-none-any.whl\",\"repo\":\"pip_39_websockets_py3_none_any_6681ba9e\",\"version\":\"3.9\"},{\"filename\":\"websockets-11.0.3.tar.gz\",\"repo\":\"pip_39_websockets_sdist_88fc51d9\",\"version\":\"3.9\"}]", - "wheel": "[{\"repo\":\"pip_310_wheel\",\"version\":\"3.10\"},{\"filename\":\"wheel-0.40.0-py3-none-any.whl\",\"repo\":\"pip_39_wheel_py3_none_any_d236b20e\",\"version\":\"3.9\"},{\"filename\":\"wheel-0.40.0.tar.gz\",\"repo\":\"pip_39_wheel_sdist_cd1196f3\",\"version\":\"3.9\"}]", - "wrapt": "[{\"repo\":\"pip_310_wrapt\",\"version\":\"3.10\"},{\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"},{\"filename\":\"wrapt-1.14.1-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_wrapt_cp39_cp39_win_amd64_dee60e1d\",\"version\":\"3.9\"},{\"filename\":\"wrapt-1.14.1.tar.gz\",\"repo\":\"pip_39_wrapt_sdist_380a85cf\",\"version\":\"3.9\"}]", - "yamllint": "[{\"repo\":\"pip_310_yamllint\",\"version\":\"3.10\"},{\"filename\":\"yamllint-1.28.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_yamllint_py2_none_any_89bb5b5a\",\"version\":\"3.9\"},{\"filename\":\"yamllint-1.28.0.tar.gz\",\"repo\":\"pip_39_yamllint_sdist_9e3d8ddd\",\"version\":\"3.9\"}]", - "zipp": "[{\"filename\":\"zipp-3.20.0-py3-none-any.whl\",\"repo\":\"pip_39_zipp_py3_none_any_58da6168\",\"version\":\"3.9\"},{\"filename\":\"zipp-3.20.0.tar.gz\",\"repo\":\"pip_39_zipp_sdist_0145e43d\",\"version\":\"3.9\"}]" - }, - "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-applehelp", - "sphinxcontrib-devhelp", - "sphinxcontrib-htmlhelp", - "sphinxcontrib-qthelp", - "sphinxcontrib-serializinghtml" - ] - } - } - }, - "pip_deps": { - "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", - "ruleClassName": "hub_repository", - "attributes": { - "repo_name": "pip_deps", - "extra_hub_aliases": {}, - "whl_map": { - "numpy": "[{\"repo\":\"pip_deps_310_numpy\",\"version\":\"3.10\"},{\"repo\":\"pip_deps_311_numpy\",\"version\":\"3.11\"},{\"repo\":\"pip_deps_312_numpy\",\"version\":\"3.12\"},{\"repo\":\"pip_deps_38_numpy\",\"version\":\"3.8\"},{\"repo\":\"pip_deps_39_numpy\",\"version\":\"3.9\"}]", - "setuptools": "[{\"repo\":\"pip_deps_310_setuptools\",\"version\":\"3.10\"},{\"repo\":\"pip_deps_311_setuptools\",\"version\":\"3.11\"},{\"repo\":\"pip_deps_312_setuptools\",\"version\":\"3.12\"},{\"repo\":\"pip_deps_38_setuptools\",\"version\":\"3.8\"},{\"repo\":\"pip_deps_39_setuptools\",\"version\":\"3.9\"}]" - }, - "packages": [ - "numpy", - "setuptools" - ], - "groups": {} - } - }, - "rules_fuzzing_py_deps": { - "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", - "ruleClassName": "hub_repository", - "attributes": { - "repo_name": "rules_fuzzing_py_deps", - "extra_hub_aliases": {}, - "whl_map": { - "absl_py": "[{\"repo\":\"rules_fuzzing_py_deps_310_absl_py\",\"version\":\"3.10\"},{\"repo\":\"rules_fuzzing_py_deps_311_absl_py\",\"version\":\"3.11\"},{\"repo\":\"rules_fuzzing_py_deps_312_absl_py\",\"version\":\"3.12\"},{\"repo\":\"rules_fuzzing_py_deps_38_absl_py\",\"version\":\"3.8\"},{\"repo\":\"rules_fuzzing_py_deps_39_absl_py\",\"version\":\"3.9\"}]", - "six": "[{\"repo\":\"rules_fuzzing_py_deps_310_six\",\"version\":\"3.10\"},{\"repo\":\"rules_fuzzing_py_deps_311_six\",\"version\":\"3.11\"},{\"repo\":\"rules_fuzzing_py_deps_312_six\",\"version\":\"3.12\"},{\"repo\":\"rules_fuzzing_py_deps_38_six\",\"version\":\"3.8\"},{\"repo\":\"rules_fuzzing_py_deps_39_six\",\"version\":\"3.9\"}]" - }, - "packages": [ - "absl_py", - "six" - ], - "groups": {} - } - } - }, - "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_12_host", - "rules_python~~python~python_3_12_host" - ], - [ - "rules_python~~python~pythons_hub", - "python_3_8_host", - "rules_python~~python~python_3_8_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": "H9pnwH6wHRp4Xy2CN6NSo0mDMHFDvpqspLNW6Xbqnhc=", - "usagesDigest": "/lZXl/ZgP+u5PE8WkeWTyYBsvX9XQWFn1antj5qrBzQ=", - "recordedFileInputs": { - "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", - "@@rules_python~//tools/publish/requirements_windows.txt": "7673adc71dc1a81d3661b90924d7a7c0fc998cd508b3cb4174337cef3f2de556", - "@@rules_python~//tools/publish/requirements_darwin.txt": "2994136eab7e57b083c3de76faf46f70fad130bc8e7360a7fed2b288b69e79dc" - }, - "recordedDirentsInputs": {}, - "envVariables": { - "RULES_PYTHON_REPO_DEBUG": null, - "RULES_PYTHON_REPO_DEBUG_VERBOSITY": null - }, - "generatedRepoSpecs": { "rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -9015,7 +8695,12 @@ "sha256": "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", "urls": [ "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-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\"]}" + } } }, "rules_python_publish_deps_311_requests_sdist_55365417": { @@ -9044,7 +8729,12 @@ "sha256": "55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", "urls": [ "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.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\"]}" + } } }, "rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66": { @@ -9419,6 +9109,175 @@ ] } }, + "other_module_pip": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "other_module_pip", + "extra_hub_aliases": {}, + "whl_map": { + "absl_py": "[{\"repo\":\"other_module_pip_311_absl_py\",\"version\":\"3.11\"}]" + }, + "packages": [ + "absl_py" + ], + "groups": {} + } + }, + "pip": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "pip", + "extra_hub_aliases": { + "wheel": [ + "generated_file" + ] + }, + "whl_map": { + "alabaster": "[{\"repo\":\"pip_310_alabaster\",\"version\":\"3.10\"},{\"filename\":\"alabaster-0.7.13-py3-none-any.whl\",\"repo\":\"pip_39_alabaster_py3_none_any_1ee19aca\",\"version\":\"3.9\"},{\"filename\":\"alabaster-0.7.13.tar.gz\",\"repo\":\"pip_39_alabaster_sdist_a27a4a08\",\"version\":\"3.9\"}]", + "astroid": "[{\"repo\":\"pip_310_astroid\",\"version\":\"3.10\"},{\"filename\":\"astroid-2.12.13-py3-none-any.whl\",\"repo\":\"pip_39_astroid_py3_none_any_10e0ad5f\",\"version\":\"3.9\"},{\"filename\":\"astroid-2.12.13.tar.gz\",\"repo\":\"pip_39_astroid_sdist_1493fe8b\",\"version\":\"3.9\"}]", + "babel": "[{\"repo\":\"pip_310_babel\",\"version\":\"3.10\"},{\"filename\":\"Babel-2.13.1-py3-none-any.whl\",\"repo\":\"pip_39_babel_py3_none_any_7077a498\",\"version\":\"3.9\"},{\"filename\":\"Babel-2.13.1.tar.gz\",\"repo\":\"pip_39_babel_sdist_33e0952d\",\"version\":\"3.9\"}]", + "certifi": "[{\"repo\":\"pip_310_certifi\",\"version\":\"3.10\"},{\"filename\":\"certifi-2023.7.22-py3-none-any.whl\",\"repo\":\"pip_39_certifi_py3_none_any_92d60375\",\"version\":\"3.9\"},{\"filename\":\"certifi-2023.7.22.tar.gz\",\"repo\":\"pip_39_certifi_sdist_539cc1d1\",\"version\":\"3.9\"}]", + "chardet": "[{\"repo\":\"pip_310_chardet\",\"version\":\"3.10\"},{\"filename\":\"chardet-4.0.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_chardet_py2_none_any_f864054d\",\"version\":\"3.9\"},{\"filename\":\"chardet-4.0.0.tar.gz\",\"repo\":\"pip_39_chardet_sdist_0d6f53a1\",\"version\":\"3.9\"}]", + "colorama": "[{\"repo\":\"pip_310_colorama\",\"version\":\"3.10\"},{\"filename\":\"colorama-0.4.6-py2.py3-none-any.whl\",\"repo\":\"pip_39_colorama_py2_none_any_4f1d9991\",\"version\":\"3.9\"},{\"filename\":\"colorama-0.4.6.tar.gz\",\"repo\":\"pip_39_colorama_sdist_08695f5c\",\"version\":\"3.9\"}]", + "dill": "[{\"repo\":\"pip_310_dill\",\"version\":\"3.10\"},{\"filename\":\"dill-0.3.6-py3-none-any.whl\",\"repo\":\"pip_39_dill_py3_none_any_a07ffd23\",\"version\":\"3.9\"},{\"filename\":\"dill-0.3.6.tar.gz\",\"repo\":\"pip_39_dill_sdist_e5db55f3\",\"version\":\"3.9\"}]", + "docutils": "[{\"repo\":\"pip_310_docutils\",\"version\":\"3.10\"},{\"filename\":\"docutils-0.20.1-py3-none-any.whl\",\"repo\":\"pip_39_docutils_py3_none_any_96f387a2\",\"version\":\"3.9\"},{\"filename\":\"docutils-0.20.1.tar.gz\",\"repo\":\"pip_39_docutils_sdist_f08a4e27\",\"version\":\"3.9\"}]", + "idna": "[{\"repo\":\"pip_310_idna\",\"version\":\"3.10\"},{\"filename\":\"idna-2.10-py2.py3-none-any.whl\",\"repo\":\"pip_39_idna_py2_none_any_b97d804b\",\"version\":\"3.9\"},{\"filename\":\"idna-2.10.tar.gz\",\"repo\":\"pip_39_idna_sdist_b307872f\",\"version\":\"3.9\"}]", + "imagesize": "[{\"repo\":\"pip_310_imagesize\",\"version\":\"3.10\"},{\"filename\":\"imagesize-1.4.1-py2.py3-none-any.whl\",\"repo\":\"pip_39_imagesize_py2_none_any_0d8d18d0\",\"version\":\"3.9\"},{\"filename\":\"imagesize-1.4.1.tar.gz\",\"repo\":\"pip_39_imagesize_sdist_69150444\",\"version\":\"3.9\"}]", + "importlib_metadata": "[{\"filename\":\"importlib_metadata-8.4.0-py3-none-any.whl\",\"repo\":\"pip_39_importlib_metadata_py3_none_any_66f342cc\",\"version\":\"3.9\"},{\"filename\":\"importlib_metadata-8.4.0.tar.gz\",\"repo\":\"pip_39_importlib_metadata_sdist_9a547d3b\",\"version\":\"3.9\"}]", + "isort": "[{\"repo\":\"pip_310_isort\",\"version\":\"3.10\"},{\"filename\":\"isort-5.11.4-py3-none-any.whl\",\"repo\":\"pip_39_isort_py3_none_any_c033fd0e\",\"version\":\"3.9\"},{\"filename\":\"isort-5.11.4.tar.gz\",\"repo\":\"pip_39_isort_sdist_6db30c5d\",\"version\":\"3.9\"}]", + "jinja2": "[{\"repo\":\"pip_310_jinja2\",\"version\":\"3.10\"},{\"filename\":\"jinja2-3.1.4-py3-none-any.whl\",\"repo\":\"pip_39_jinja2_py3_none_any_bc5dd2ab\",\"version\":\"3.9\"},{\"filename\":\"jinja2-3.1.4.tar.gz\",\"repo\":\"pip_39_jinja2_sdist_4a3aee7a\",\"version\":\"3.9\"}]", + "lazy_object_proxy": "[{\"repo\":\"pip_310_lazy_object_proxy\",\"version\":\"3.10\"},{\"filename\":\"lazy-object-proxy-1.10.0.tar.gz\",\"repo\":\"pip_39_lazy_object_proxy_sdist_78247b6d\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"}]", + "markupsafe": "[{\"repo\":\"pip_310_markupsafe\",\"version\":\"3.10\"},{\"filename\":\"MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl\",\"repo\":\"pip_39_markupsafe_cp39_cp39_macosx_10_9_universal2_8023faf4\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"},{\"filename\":\"MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_markupsafe_cp39_cp39_win_amd64_3fd4abcb\",\"version\":\"3.9\"},{\"filename\":\"MarkupSafe-2.1.3.tar.gz\",\"repo\":\"pip_39_markupsafe_sdist_af598ed3\",\"version\":\"3.9\"}]", + "mccabe": "[{\"repo\":\"pip_310_mccabe\",\"version\":\"3.10\"},{\"filename\":\"mccabe-0.7.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_mccabe_py2_none_any_6c2d30ab\",\"version\":\"3.9\"},{\"filename\":\"mccabe-0.7.0.tar.gz\",\"repo\":\"pip_39_mccabe_sdist_348e0240\",\"version\":\"3.9\"}]", + "packaging": "[{\"repo\":\"pip_310_packaging\",\"version\":\"3.10\"},{\"filename\":\"packaging-23.2-py3-none-any.whl\",\"repo\":\"pip_39_packaging_py3_none_any_8c491190\",\"version\":\"3.9\"},{\"filename\":\"packaging-23.2.tar.gz\",\"repo\":\"pip_39_packaging_sdist_048fb0e9\",\"version\":\"3.9\"}]", + "pathspec": "[{\"repo\":\"pip_310_pathspec\",\"version\":\"3.10\"},{\"filename\":\"pathspec-0.10.3-py3-none-any.whl\",\"repo\":\"pip_39_pathspec_py3_none_any_3c95343a\",\"version\":\"3.9\"},{\"filename\":\"pathspec-0.10.3.tar.gz\",\"repo\":\"pip_39_pathspec_sdist_56200de4\",\"version\":\"3.9\"}]", + "platformdirs": "[{\"repo\":\"pip_310_platformdirs\",\"version\":\"3.10\"},{\"filename\":\"platformdirs-2.6.0-py3-none-any.whl\",\"repo\":\"pip_39_platformdirs_py3_none_any_1a89a123\",\"version\":\"3.9\"},{\"filename\":\"platformdirs-2.6.0.tar.gz\",\"repo\":\"pip_39_platformdirs_sdist_b46ffafa\",\"version\":\"3.9\"}]", + "pygments": "[{\"repo\":\"pip_310_pygments\",\"version\":\"3.10\"},{\"filename\":\"Pygments-2.16.1-py3-none-any.whl\",\"repo\":\"pip_39_pygments_py3_none_any_13fc09fa\",\"version\":\"3.9\"},{\"filename\":\"Pygments-2.16.1.tar.gz\",\"repo\":\"pip_39_pygments_sdist_1daff049\",\"version\":\"3.9\"}]", + "pylint": "[{\"repo\":\"pip_310_pylint\",\"version\":\"3.10\"},{\"filename\":\"pylint-2.15.9-py3-none-any.whl\",\"repo\":\"pip_39_pylint_py3_none_any_349c8cd3\",\"version\":\"3.9\"},{\"filename\":\"pylint-2.15.9.tar.gz\",\"repo\":\"pip_39_pylint_sdist_18783cca\",\"version\":\"3.9\"}]", + "pylint_print": "[{\"repo\":\"pip_310_pylint_print\",\"version\":\"3.10\"},{\"filename\":\"pylint-print-1.0.1.tar.gz\",\"repo\":\"pip_39_pylint_print_sdist_30aa207e\",\"version\":\"3.9\"},{\"filename\":\"pylint_print-1.0.1-py3-none-any.whl\",\"repo\":\"pip_39_pylint_print_py3_none_any_a2b2599e\",\"version\":\"3.9\"}]", + "python_dateutil": "[{\"repo\":\"pip_310_python_dateutil\",\"version\":\"3.10\"},{\"filename\":\"python-dateutil-2.8.2.tar.gz\",\"repo\":\"pip_39_python_dateutil_sdist_0123cacc\",\"version\":\"3.9\"},{\"filename\":\"python_dateutil-2.8.2-py2.py3-none-any.whl\",\"repo\":\"pip_39_python_dateutil_py2_none_any_961d03dc\",\"version\":\"3.9\"}]", + "python_magic": "[{\"repo\":\"pip_310_python_magic\",\"version\":\"3.10\"},{\"filename\":\"python-magic-0.4.27.tar.gz\",\"repo\":\"pip_39_python_magic_sdist_c1ba14b0\",\"version\":\"3.9\"},{\"filename\":\"python_magic-0.4.27-py2.py3-none-any.whl\",\"repo\":\"pip_39_python_magic_py2_none_any_c212960a\",\"version\":\"3.9\"}]", + "pyyaml": "[{\"repo\":\"pip_310_pyyaml\",\"version\":\"3.10\"},{\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"},{\"filename\":\"PyYAML-6.0.1-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_pyyaml_cp39_cp39_win_amd64_510c9dee\",\"version\":\"3.9\"},{\"filename\":\"PyYAML-6.0.1.tar.gz\",\"repo\":\"pip_39_pyyaml_sdist_bfdf460b\",\"version\":\"3.9\"}]", + "requests": "[{\"repo\":\"pip_310_requests\",\"version\":\"3.10\"},{\"filename\":\"requests-2.25.1-py2.py3-none-any.whl\",\"repo\":\"pip_39_requests_py2_none_any_c210084e\",\"version\":\"3.9\"},{\"filename\":\"requests-2.25.1.tar.gz\",\"repo\":\"pip_39_requests_sdist_27973dd4\",\"version\":\"3.9\"}]", + "s3cmd": "[{\"repo\":\"pip_310_s3cmd\",\"version\":\"3.10\"},{\"filename\":\"s3cmd-2.1.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_s3cmd_py2_none_any_49cd23d5\",\"version\":\"3.9\"},{\"filename\":\"s3cmd-2.1.0.tar.gz\",\"repo\":\"pip_39_s3cmd_sdist_966b0a49\",\"version\":\"3.9\"}]", + "setuptools": "[{\"filename\":\"setuptools-65.6.3-py3-none-any.whl\",\"repo\":\"pip_39_setuptools_py3_none_any_57f6f22b\",\"version\":\"3.9\"},{\"filename\":\"setuptools-65.6.3.tar.gz\",\"repo\":\"pip_39_setuptools_sdist_a7620757\",\"version\":\"3.9\"}]", + "six": "[{\"repo\":\"pip_310_six\",\"version\":\"3.10\"},{\"filename\":\"six-1.16.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_six_py2_none_any_8abb2f1d\",\"version\":\"3.9\"},{\"filename\":\"six-1.16.0.tar.gz\",\"repo\":\"pip_39_six_sdist_1e61c374\",\"version\":\"3.9\"}]", + "snowballstemmer": "[{\"repo\":\"pip_310_snowballstemmer\",\"version\":\"3.10\"},{\"filename\":\"snowballstemmer-2.2.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_snowballstemmer_py2_none_any_c8e1716e\",\"version\":\"3.9\"},{\"filename\":\"snowballstemmer-2.2.0.tar.gz\",\"repo\":\"pip_39_snowballstemmer_sdist_09b16deb\",\"version\":\"3.9\"}]", + "sphinx": "[{\"repo\":\"pip_310_sphinx\",\"version\":\"3.10\"},{\"filename\":\"sphinx-7.2.6-py3-none-any.whl\",\"repo\":\"pip_39_sphinx_py3_none_any_1e09160a\",\"version\":\"3.9\"},{\"filename\":\"sphinx-7.2.6.tar.gz\",\"repo\":\"pip_39_sphinx_sdist_9a5160e1\",\"version\":\"3.9\"}]", + "sphinxcontrib_applehelp": "[{\"repo\":\"pip_310_sphinxcontrib_applehelp\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_applehelp-1.0.7-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_applehelp_py3_none_any_094c4d56\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_applehelp-1.0.7.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_applehelp_sdist_39fdc8d7\",\"version\":\"3.9\"}]", + "sphinxcontrib_devhelp": "[{\"repo\":\"pip_310_sphinxcontrib_devhelp\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_devhelp-1.0.5-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_devhelp_py3_none_any_fe8009ae\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_devhelp-1.0.5.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_devhelp_sdist_63b41e0d\",\"version\":\"3.9\"}]", + "sphinxcontrib_htmlhelp": "[{\"repo\":\"pip_310_sphinxcontrib_htmlhelp\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_htmlhelp_py3_none_any_8001661c\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_htmlhelp-2.0.4.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_htmlhelp_sdist_6c26a118\",\"version\":\"3.9\"}]", + "sphinxcontrib_jsmath": "[{\"repo\":\"pip_310_sphinxcontrib_jsmath\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib-jsmath-1.0.1.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_jsmath_sdist_a9925e4a\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_jsmath_py2_none_any_2ec2eaeb\",\"version\":\"3.9\"}]", + "sphinxcontrib_qthelp": "[{\"repo\":\"pip_310_sphinxcontrib_qthelp\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_qthelp-1.0.6-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_qthelp_py3_none_any_bf76886e\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_qthelp-1.0.6.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_qthelp_sdist_62b9d1a1\",\"version\":\"3.9\"}]", + "sphinxcontrib_serializinghtml": "[{\"repo\":\"pip_310_sphinxcontrib_serializinghtml\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_serializinghtml_py3_none_any_9b36e503\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_serializinghtml-1.1.9.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_serializinghtml_sdist_0c64ff89\",\"version\":\"3.9\"}]", + "tabulate": "[{\"repo\":\"pip_310_tabulate\",\"version\":\"3.10\"},{\"filename\":\"tabulate-0.9.0-py3-none-any.whl\",\"repo\":\"pip_39_tabulate_py3_none_any_024ca478\",\"version\":\"3.9\"},{\"filename\":\"tabulate-0.9.0.tar.gz\",\"repo\":\"pip_39_tabulate_sdist_0095b12b\",\"version\":\"3.9\"}]", + "tomli": "[{\"repo\":\"pip_310_tomli\",\"version\":\"3.10\"},{\"filename\":\"tomli-2.0.1-py3-none-any.whl\",\"repo\":\"pip_39_tomli_py3_none_any_939de3e7\",\"version\":\"3.9\"},{\"filename\":\"tomli-2.0.1.tar.gz\",\"repo\":\"pip_39_tomli_sdist_de526c12\",\"version\":\"3.9\"}]", + "tomlkit": "[{\"repo\":\"pip_310_tomlkit\",\"version\":\"3.10\"},{\"filename\":\"tomlkit-0.11.6-py3-none-any.whl\",\"repo\":\"pip_39_tomlkit_py3_none_any_07de26b0\",\"version\":\"3.9\"},{\"filename\":\"tomlkit-0.11.6.tar.gz\",\"repo\":\"pip_39_tomlkit_sdist_71b952e5\",\"version\":\"3.9\"}]", + "typing_extensions": "[{\"repo\":\"pip_310_typing_extensions\",\"version\":\"3.10\"},{\"filename\":\"typing_extensions-4.12.2-py3-none-any.whl\",\"repo\":\"pip_39_typing_extensions_py3_none_any_04e5ca03\",\"version\":\"3.9\"},{\"filename\":\"typing_extensions-4.12.2.tar.gz\",\"repo\":\"pip_39_typing_extensions_sdist_1a7ead55\",\"version\":\"3.9\"}]", + "urllib3": "[{\"repo\":\"pip_310_urllib3\",\"version\":\"3.10\"},{\"filename\":\"urllib3-1.26.18-py2.py3-none-any.whl\",\"repo\":\"pip_39_urllib3_py2_none_any_34b97092\",\"version\":\"3.9\"},{\"filename\":\"urllib3-1.26.18.tar.gz\",\"repo\":\"pip_39_urllib3_sdist_f8ecc1bb\",\"version\":\"3.9\"}]", + "websockets": "[{\"repo\":\"pip_310_websockets\",\"version\":\"3.10\"},{\"filename\":\"websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl\",\"repo\":\"pip_39_websockets_cp39_cp39_macosx_10_9_universal2_777354ee\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"},{\"filename\":\"websockets-11.0.3-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_websockets_cp39_cp39_win_amd64_c792ea4e\",\"version\":\"3.9\"},{\"filename\":\"websockets-11.0.3-py3-none-any.whl\",\"repo\":\"pip_39_websockets_py3_none_any_6681ba9e\",\"version\":\"3.9\"},{\"filename\":\"websockets-11.0.3.tar.gz\",\"repo\":\"pip_39_websockets_sdist_88fc51d9\",\"version\":\"3.9\"}]", + "wheel": "[{\"repo\":\"pip_310_wheel\",\"version\":\"3.10\"},{\"filename\":\"wheel-0.40.0-py3-none-any.whl\",\"repo\":\"pip_39_wheel_py3_none_any_d236b20e\",\"version\":\"3.9\"},{\"filename\":\"wheel-0.40.0.tar.gz\",\"repo\":\"pip_39_wheel_sdist_cd1196f3\",\"version\":\"3.9\"}]", + "wrapt": "[{\"repo\":\"pip_310_wrapt\",\"version\":\"3.10\"},{\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"},{\"filename\":\"wrapt-1.14.1-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_wrapt_cp39_cp39_win_amd64_dee60e1d\",\"version\":\"3.9\"},{\"filename\":\"wrapt-1.14.1.tar.gz\",\"repo\":\"pip_39_wrapt_sdist_380a85cf\",\"version\":\"3.9\"}]", + "yamllint": "[{\"repo\":\"pip_310_yamllint\",\"version\":\"3.10\"},{\"filename\":\"yamllint-1.28.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_yamllint_py2_none_any_89bb5b5a\",\"version\":\"3.9\"},{\"filename\":\"yamllint-1.28.0.tar.gz\",\"repo\":\"pip_39_yamllint_sdist_9e3d8ddd\",\"version\":\"3.9\"}]", + "zipp": "[{\"filename\":\"zipp-3.20.0-py3-none-any.whl\",\"repo\":\"pip_39_zipp_py3_none_any_58da6168\",\"version\":\"3.9\"},{\"filename\":\"zipp-3.20.0.tar.gz\",\"repo\":\"pip_39_zipp_sdist_0145e43d\",\"version\":\"3.9\"}]" + }, + "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-applehelp", + "sphinxcontrib-devhelp", + "sphinxcontrib-htmlhelp", + "sphinxcontrib-qthelp", + "sphinxcontrib-serializinghtml" + ] + } + } + }, + "pip_deps": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "pip_deps", + "extra_hub_aliases": {}, + "whl_map": { + "numpy": "[{\"repo\":\"pip_deps_310_numpy\",\"version\":\"3.10\"},{\"repo\":\"pip_deps_311_numpy\",\"version\":\"3.11\"},{\"repo\":\"pip_deps_312_numpy\",\"version\":\"3.12\"},{\"repo\":\"pip_deps_38_numpy\",\"version\":\"3.8\"},{\"repo\":\"pip_deps_39_numpy\",\"version\":\"3.9\"}]", + "setuptools": "[{\"repo\":\"pip_deps_310_setuptools\",\"version\":\"3.10\"},{\"repo\":\"pip_deps_311_setuptools\",\"version\":\"3.11\"},{\"repo\":\"pip_deps_312_setuptools\",\"version\":\"3.12\"},{\"repo\":\"pip_deps_38_setuptools\",\"version\":\"3.8\"},{\"repo\":\"pip_deps_39_setuptools\",\"version\":\"3.9\"}]" + }, + "packages": [ + "numpy", + "setuptools" + ], + "groups": {} + } + }, + "rules_fuzzing_py_deps": { + "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", + "ruleClassName": "hub_repository", + "attributes": { + "repo_name": "rules_fuzzing_py_deps", + "extra_hub_aliases": {}, + "whl_map": { + "absl_py": "[{\"repo\":\"rules_fuzzing_py_deps_310_absl_py\",\"version\":\"3.10\"},{\"repo\":\"rules_fuzzing_py_deps_311_absl_py\",\"version\":\"3.11\"},{\"repo\":\"rules_fuzzing_py_deps_312_absl_py\",\"version\":\"3.12\"},{\"repo\":\"rules_fuzzing_py_deps_38_absl_py\",\"version\":\"3.8\"},{\"repo\":\"rules_fuzzing_py_deps_39_absl_py\",\"version\":\"3.9\"}]", + "six": "[{\"repo\":\"rules_fuzzing_py_deps_310_six\",\"version\":\"3.10\"},{\"repo\":\"rules_fuzzing_py_deps_311_six\",\"version\":\"3.11\"},{\"repo\":\"rules_fuzzing_py_deps_312_six\",\"version\":\"3.12\"},{\"repo\":\"rules_fuzzing_py_deps_38_six\",\"version\":\"3.8\"},{\"repo\":\"rules_fuzzing_py_deps_39_six\",\"version\":\"3.9\"}]" + }, + "packages": [ + "absl_py", + "six" + ], + "groups": {} + } + }, "rules_python_publish_deps": { "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", "ruleClassName": "hub_repository", @@ -9487,6 +9346,10 @@ } } }, + "moduleExtensionMetadata": { + "useAllRepos": "NO", + "reproducible": false + }, "recordedRepoMappingEntries": [ [ "bazel_features~", diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 3df7b52e8a..2ed946fbca 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -24,7 +24,7 @@ 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(":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") @@ -216,7 +216,6 @@ def _create_whl_repos( logger = logger, ) - repository_platform = host_platform(module_ctx) for whl_name, requirements in requirements_by_platform.items(): whl_name = normalize_name(whl_name) @@ -319,38 +318,6 @@ def _create_whl_repos( exposed_packages[whl_name] = None continue - if not pip_attr.parse_all_requirements_files: - 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)) - - whl_library_args["requirement"] = requirement.requirement_line - if requirement.extra_pip_args: - whl_library_args["extra_pip_args"] = requirement.extra_pip_args - - # 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_libraries[repo_name] = dict(whl_library_args.items()) - whl_map.setdefault(whl_name, []).append( - whl_alias( - repo = repo_name, - version = major_minor, - ), - ) - continue - is_exposed = False for requirement in requirements: is_exposed = is_exposed or requirement.is_exposed @@ -683,13 +650,6 @@ def _pip_impl(module_ctx): 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. @@ -789,20 +749,6 @@ find in case extra indexes are specified. """, default = True, ), - "parse_all_requirements_files": attr.bool( - default = True, - doc = """\ -A temporary flag to enable users to make `pip` extension result always -the same independent of the whether transitive dependencies use {bzl:attr}`experimental_index_url` or not. - -This enables users to migrate to a solution that fixes -[#2268](https://github.com/bazelbuild/rules_python/issues/2268). - -::::{deprecated} 0.38.0 -This is a transition flag and will be removed in a subsequent release. -:::: -""", - ), "python_version": attr.string( mandatory = True, doc = """ @@ -961,53 +907,6 @@ 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. - -TODO: will be removed before 1.0. -""", - 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 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. -""", - ), - "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. -""", - ), - }, -) - def _whl_mods_repo_impl(rctx): rctx.file("BUILD.bazel", "") for whl_name, mods in rctx.attr.whl_mods.items(): diff --git a/python/private/pypi/pip.bzl b/python/private/pypi/pip.bzl index cb8e111e0e..3ff6b0f51f 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 From 4a55ef4c2363f7ffc1ec9ba511fba7b2547ccefc Mon Sep 17 00:00:00 2001 From: Douglas Thor Date: Tue, 19 Nov 2024 21:00:26 -0800 Subject: [PATCH 331/345] chore(gazelle): Rename GAZELLE_VERBOSE env var; use idiomatic go; add comments (#2428) Address PR comments from #2420: + Add and update comments + idiomatic go: return early + rename and document env var --- CHANGELOG.md | 2 +- docs/environment-variables.md | 6 ++++++ gazelle/python/file_parser.go | 35 +++++++++++++++++++++++------------ 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a1c17d8b8..9cd6b82759 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -87,7 +87,7 @@ Other changes: {#v0-0-0-added} ### Added * (gazelle): Parser failures will now be logged to the terminal. Additional - details can be logged by setting `GAZELLE_VERBOSE=1`. + 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 diff --git a/docs/environment-variables.md b/docs/environment-variables.md index 906281d56f..12c1bcf0c2 100644 --- a/docs/environment-variables.md +++ b/docs/environment-variables.md @@ -56,3 +56,9 @@ stderr. 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/gazelle/python/file_parser.go b/gazelle/python/file_parser.go index 9101621639..a1f47f400c 100644 --- a/gazelle/python/file_parser.go +++ b/gazelle/python/file_parser.go @@ -69,18 +69,29 @@ func ParseCode(code []byte, path string) (*sitter.Node, error) { } root := tree.RootNode() - if root.HasError() { - log.Printf("WARNING: failed to parse %q. The resulting BUILD target may be incorrect.", path) - - verbose, envExists := os.LookupEnv("GAZELLE_VERBOSE") - if envExists && verbose == "1" { - for i := 0; i < int(root.ChildCount()); i++ { - child := root.Child(i) - if child.IsError() { - log.Printf("Parse error at %+v:\n%+v", child.StartPoint(), child.Content(code)) - log.Printf("The above was parsed as: %v", child.String()) - } - } + 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()) } } From 8ff4386335e5c50d9507fe364b4f0cc6a90f02e6 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 20 Nov 2024 20:33:00 -0800 Subject: [PATCH 332/345] fix: make sys.executable work with script bootstrap (#2409) When `--bootstrap_impl=script` is used, `PYTHONPATH` is no longer used to set the import paths, which means subprocesses no longer inherit the Bazel paths. This is generally a good thing, but breaks when `sys.executable` is used to directly invoke the interpreter. Such an invocation assumes the interpreter will have the same packages available and works with the system_python bootstrap. To fix, have the script bootstrap use a basic virtual env. This allows it to intercept interpreter startup even when the Bazel executable isn't invoked. Under the hood, there's two pieces to make this work. The first is a binary uses `declare_symlink()` to write a relative-path based symlink that points to the underlying Python interpreter. The second piece is a site init hook (triggered by a `.pth` file using an `import` line) performs sys.path setup as part of site (`import site`) initialization. Fixes https://github.com/bazelbuild/rules_python/issues/2169 --------- Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> --- .bazelrc | 4 +- CHANGELOG.md | 8 + python/private/BUILD.bazel | 8 + python/private/py_executable_bazel.bzl | 139 ++++++++++++- python/private/py_runtime_info.bzl | 37 +++- python/private/py_runtime_rule.bzl | 12 ++ python/private/site_init_template.py | 196 ++++++++++++++++++ python/private/stage1_bootstrap_template.sh | 48 ++++- python/private/stage2_bootstrap_template.py | 149 +------------ python/private/zip_main_template.py | 33 ++- tests/bootstrap_impls/BUILD.bazel | 11 +- tests/bootstrap_impls/call_sys_exe.py | 51 +++++ .../sys_executable_inherits_sys_path_test.sh | 47 +++++ tests/bootstrap_impls/sys_path_order_test.py | 16 +- tests/support/sh_py_run_test.bzl | 17 +- 15 files changed, 617 insertions(+), 159 deletions(-) create mode 100644 python/private/site_init_template.py create mode 100644 tests/bootstrap_impls/call_sys_exe.py create mode 100755 tests/bootstrap_impls/sys_executable_inherits_sys_path_test.sh diff --git a/.bazelrc b/.bazelrc index 66a644e289..c44124d961 100644 --- a/.bazelrc +++ b/.bazelrc @@ -4,8 +4,8 @@ # (Note, we cannot use `common --deleted_packages` because the bazel version command doesn't support it) # To update these lines, execute # `bazel run @rules_bazel_integration_test//tools:update_deleted_packages` -build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered -query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/python/private,gazelle/pythonconfig,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +build --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered +query --deleted_packages=examples/build_file_generation,examples/build_file_generation/random_number_generator,examples/bzlmod,examples/bzlmod_build_file_generation,examples/bzlmod_build_file_generation/other_module/other_module/pkg,examples/bzlmod_build_file_generation/runfiles,examples/bzlmod/entry_points,examples/bzlmod/entry_points/tests,examples/bzlmod/libs/my_lib,examples/bzlmod/other_module,examples/bzlmod/other_module/other_module/pkg,examples/bzlmod/patches,examples/bzlmod/py_proto_library,examples/bzlmod/py_proto_library/example.com/another_proto,examples/bzlmod/py_proto_library/example.com/proto,examples/bzlmod/runfiles,examples/bzlmod/tests,examples/bzlmod/tests/other_module,examples/bzlmod/whl_mods,examples/multi_python_versions/libs/my_lib,examples/multi_python_versions/requirements,examples/multi_python_versions/tests,examples/pip_parse,examples/pip_parse_vendored,examples/pip_repository_annotations,examples/py_proto_library,examples/py_proto_library/example.com/another_proto,examples/py_proto_library/example.com/proto,gazelle,gazelle/manifest,gazelle/manifest/generate,gazelle/manifest/hasher,gazelle/manifest/test,gazelle/modules_mapping,gazelle/python,gazelle/pythonconfig,gazelle/python/private,tests/integration/compile_pip_requirements,tests/integration/compile_pip_requirements_test_from_external_repo,tests/integration/custom_commands,tests/integration/ignore_root_user_error,tests/integration/ignore_root_user_error/submodule,tests/integration/local_toolchains,tests/integration/pip_parse,tests/integration/pip_parse/empty,tests/integration/py_cc_toolchain_registered test --test_output=errors diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cd6b82759..5b5d045edc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -74,6 +74,8 @@ Unreleased changes template. 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. {#v0-0-0-fixed} ### Fixed @@ -83,6 +85,9 @@ Other changes: 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)). {#v0-0-0-added} ### Added @@ -97,6 +102,9 @@ Other changes: 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. {#v0-0-0-removed} ### Removed diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 39af217bfe..9772089e97 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -702,6 +702,14 @@ filegroup( 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/py_executable_bazel.bzl b/python/private/py_executable_bazel.bzl index 6f9c0947a3..60c3815c99 100644 --- a/python/private/py_executable_bazel.bzl +++ b/python/private/py_executable_bazel.bzl @@ -81,6 +81,9 @@ the `srcs` of Python targets as required. "_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 @@ def _create_executable( 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 @@ def _create_executable( 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 @@ def _create_executable( 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 @@ def _create_executable( zip_file = zip_file, stage2_bootstrap = stage2_bootstrap, runtime_details = runtime_details, + venv = venv, ) elif bootstrap_output: _create_stage1_bootstrap( @@ -282,6 +296,7 @@ def _create_executable( 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 @@ def _create_executable( 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 = _runfiles_root_path(ctx, 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 @@ def _create_zip_main(ctx, *, stage2_bootstrap, runtime_details): 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,82 @@ def _create_zip_main(ctx, *, stage2_bootstrap, runtime_details): ) return output +# 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 = runtime.interpreter.short_path + parent = "/".join([".."] * (interpreter_actual_path.count("/") + 1)) + rel_path = parent + "/" + 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-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 +462,13 @@ def _create_stage2_bootstrap( ) return output +def _runfiles_root_path(ctx, path): + # The ../ comes from short_path for files in other repos. + if path.startswith("../"): + return path[3:] + else: + return "{}/{}".format(ctx.workspace_name, path) + def _create_stage1_bootstrap( ctx, *, @@ -371,12 +477,24 @@ def _create_stage1_bootstrap( 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 = _runfiles_root_path(ctx, 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 +565,7 @@ def _create_windows_exe_launcher( ) 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 +643,14 @@ def _get_zip_runfiles_path(path, workspace_name, legacy_external_runfiles): 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 +662,7 @@ def _create_executable_zip_file(ctx, *, output, zip_file, stage2_bootstrap, runt 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_runtime_info.bzl b/python/private/py_runtime_info.bzl index ff95c4a448..34be0db69b 100644 --- a/python/private/py_runtime_info.bzl +++ b/python/private/py_runtime_info.bzl @@ -68,7 +68,8 @@ def _PyRuntimeInfo_init( interpreter_version_info = None, stage2_bootstrap_template = None, zip_main_template = None, - abi_flags = ""): + 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") @@ -117,6 +118,7 @@ def _PyRuntimeInfo_init( "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, @@ -126,6 +128,11 @@ 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. +:::{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 @@ -139,6 +146,9 @@ the same conventions as the standard CPython interpreter. :type: str The runtime's ABI flags, i.e. `sys.abiflags`. + +:::{versionadded} 0.41.0 +::: """, "bootstrap_template": """ :type: File @@ -160,7 +170,8 @@ is expected to behave and the substutitions performed. `%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: @@ -172,6 +183,19 @@ Substitution definitions: * 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. @@ -250,6 +274,15 @@ correctly. 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 746cd19dcb..5ce8161cf0 100644 --- a/python/private/py_runtime_rule.bzl +++ b/python/private/py_runtime_rule.bzl @@ -129,6 +129,7 @@ def _py_runtime_impl(ctx): 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: @@ -316,6 +317,17 @@ However, in the future this attribute will be mandatory and have no default 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, diff --git a/python/private/site_init_template.py b/python/private/site_init_template.py new file mode 100644 index 0000000000..7a32210bff --- /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 `/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 e7e418cafb..afa1ee84bd 100644 --- a/python/private/stage1_bootstrap_template.sh +++ b/python/private/stage1_bootstrap_template.sh @@ -9,8 +9,12 @@ fi # 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,48 @@ function find_python_interpreter() { } 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" + 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 f66c28bd51..d2c7497795 100644 --- a/python/private/stage2_bootstrap_template.py +++ b/python/private/stage2_bootstrap_template.py @@ -16,7 +16,6 @@ import os import re import runpy -import subprocess import uuid # ===== Template substitutions start ===== @@ -24,14 +23,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 +111,6 @@ def is_verbose_coverage(): 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 +155,6 @@ def find_runfiles_root(main_rel_path): 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 +194,6 @@ def runfiles_envvar(module_space): 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 +370,7 @@ def main(): ] 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 +384,17 @@ def main(): "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/zip_main_template.py b/python/private/zip_main_template.py index 2d3aea7b7b..b4c9d279a6 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 @@ def main(): "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/tests/bootstrap_impls/BUILD.bazel b/tests/bootstrap_impls/BUILD.bazel index cd5771533d..1586821896 100644 --- a/tests/bootstrap_impls/BUILD.bazel +++ b/tests/bootstrap_impls/BUILD.bazel @@ -57,7 +57,7 @@ py_reconfig_test( 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, ) @@ -78,3 +78,12 @@ sh_py_run_test( sh_src = "inherit_pythonsafepath_env_test.sh", 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, +) diff --git a/tests/bootstrap_impls/call_sys_exe.py b/tests/bootstrap_impls/call_sys_exe.py new file mode 100644 index 0000000000..0c6157048c --- /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 0000000000..ca4d7aa0a8 --- /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 2e33464155..97c62a6be5 100644 --- a/tests/bootstrap_impls/sys_path_order_test.py +++ b/tests/bootstrap_impls/sys_path_order_test.py @@ -35,9 +35,9 @@ def test_sys_path_order(self): 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 @@ def test_sys_path_order(self): 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/support/sh_py_run_test.bzl b/tests/support/sh_py_run_test.bzl index c191b3974b..7fb7016eec 100644 --- a/tests/support/sh_py_run_test.bzl +++ b/tests/support/sh_py_run_test.bzl @@ -136,7 +136,7 @@ def py_reconfig_test(*, name, **kwargs): 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 py_reconfig_test(*, name, **kwargs): ) 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, @@ -162,6 +170,12 @@ def sh_py_run_test(*, name, sh_src, py_src, **kwargs): }, ) + 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 @@ def sh_py_run_test(*, name, sh_src, py_src, **kwargs): srcs = [py_src], main = py_src, tags = ["manual"], + **py_binary_kwargs ) def _current_build_settings_impl(ctx): From d73a74fe47ce61d63197f9dae794272ac01a4135 Mon Sep 17 00:00:00 2001 From: Ivo List Date: Thu, 21 Nov 2024 20:27:53 +0100 Subject: [PATCH 333/345] tests: make workspace CI jobs enable workspace mode (#2435) The CI setups claiming to run in WORKSPACE mode were wrong. This fixes it. Disable integration tests on Windows WORKSPACE mode. They are failing: https://buildkite.com/bazel/rules-python-python/builds/9791#01934eac-3a03-445d-ad53-6683371ca289 Example failure: `java.lang.UnsatisfiedLinkError: 'int com.google.devtools.build.lib.windows.WindowsFileOperations.nativeIsSymlinkOrJunction(java.lang.String, boolean[], java.lang.String[])'` --------- Co-authored-by: Richard Levasseur --- .bazelci/presubmit.yml | 23 ++++++++++++++++++++++ tests/integration/local_toolchains/test.py | 5 +++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 1808824109..3d992ea477 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -132,6 +132,7 @@ tasks: bazel: last_rc ubuntu_workspace: <<: *reusable_config + <<: *common_workspace_flags name: "Default: Ubuntu, workspace" platform: ubuntu2004 mac_workspace: @@ -141,8 +142,30 @@ tasks: 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 diff --git a/tests/integration/local_toolchains/test.py b/tests/integration/local_toolchains/test.py index 63771cf78d..d85a4c386b 100644 --- a/tests/integration/local_toolchains/test.py +++ b/tests/integration/local_toolchains/test.py @@ -18,8 +18,9 @@ def test_python_from_path_used(self): [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__": From e6a6a3aa0c6a7e051c7a3b7573befc5b710dc189 Mon Sep 17 00:00:00 2001 From: Ivo List Date: Thu, 21 Nov 2024 23:39:59 +0100 Subject: [PATCH 334/345] fix: use com_google_protobuf in WORKSPACE (#2432) The only way to support both workspace and bzlmod mode, is to call protobuf com_google_protobuf. This is because old Bazel's encode it in default values of `--protoco_compiler` flag, and so new Bazel 8 needs to do the same. For bzlmod, upgrade rules_cc to 0.0.16 and rules_java (dev dep) to 8.3.1. Those are minimal versions that are also calling protobuf again com_google_protobuf. For workspace, upgrade rules_cc to 0.1.0. This is an incompatible version that doesn't call Protobuf. rules_python users may use it. In case they need cc_proto_library in `@rules_cc//cc/defs.bzl`, they can overwrite the version to 0.0.16 in WORKSPACE (or use protobuf_deps that already does that). Disable docs generation targets on WORKSPACE CI setups. They are broken by rules_java upgrade. Upgrades dependencies: * rules_cc 0.0.16 (Bzlmod) and rules_cc 0.1.0 (WORKSPACE) * rules_java 8.3.1 * bazel_skylib 1.7.0 (workspace; bzlmod already specifying that version) * protobuf 29.0-rc2 (workspace; bzlmod already specifying that version) Fixes https://github.com/bazelbuild/rules_python/issues/2429 --------- Co-authored-by: Richard Levasseur --- CHANGELOG.md | 5 ++++ MODULE.bazel | 2 +- docs/BUILD.bazel | 2 +- examples/bzlmod/MODULE.bazel | 2 +- examples/bzlmod/MODULE.bazel.lock | 12 +++++----- .../bzlmod_build_file_generation/MODULE.bazel | 2 +- examples/multi_python_versions/MODULE.bazel | 2 +- gazelle/MODULE.bazel | 1 + internal_deps.bzl | 20 +++++++--------- internal_setup.bzl | 4 ++++ python/private/py_repositories.bzl | 24 ++++++++++--------- sphinxdocs/docs/BUILD.bazel | 4 ++-- 12 files changed, 45 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b5d045edc..5d8398b835 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -70,12 +70,15 @@ Unreleased changes template. 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) {#v0-0-0-fixed} ### Fixed @@ -88,6 +91,8 @@ Other changes: * (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. {#v0-0-0-added} ### Added diff --git a/MODULE.bazel b/MODULE.bazel index d3edb0356c..913a7c49cb 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -6,7 +6,7 @@ module( bazel_dep(name = "bazel_features", version = "1.9.1") bazel_dep(name = "bazel_skylib", version = "1.7.1") -bazel_dep(name = "rules_cc", version = "0.0.14") +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 diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index a4b6a5a440..a9a1db02a8 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -36,7 +36,7 @@ _TARGET_COMPATIBLE_WITH = select({ "@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 diff --git a/examples/bzlmod/MODULE.bazel b/examples/bzlmod/MODULE.bazel index 27dd513762..0a31c3beb8 100644 --- a/examples/bzlmod/MODULE.bazel +++ b/examples/bzlmod/MODULE.bazel @@ -19,7 +19,7 @@ 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.0") +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 diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 6e4d6e180b..41c52e888c 100644 --- a/examples/bzlmod/MODULE.bazel.lock +++ b/examples/bzlmod/MODULE.bazel.lock @@ -83,9 +83,9 @@ "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", - "https://bcr.bazel.build/modules/rules_cc/0.0.14/MODULE.bazel": "5e343a3aac88b8d7af3b1b6d2093b55c347b8eefc2e7d1442f7a02dc8fea48ac", "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", - "https://bcr.bazel.build/modules/rules_cc/0.0.15/source.json": "48e606af0e02a716974a8b74fba6988d9f0c93af9177e28cf474bfc5fa26ab10", + "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", + "https://bcr.bazel.build/modules/rules_cc/0.0.16/source.json": "227e83737046aa4f50015da48e98e0d8ab42fd0ec74d8d653b6cc9f9a357f200", "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", @@ -108,8 +108,8 @@ "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", "https://bcr.bazel.build/modules/rules_java/7.6.5/MODULE.bazel": "481164be5e02e4cab6e77a36927683263be56b7e36fef918b458d7a8a1ebadb1", - "https://bcr.bazel.build/modules/rules_java/8.3.0/MODULE.bazel": "cd0722696035d13523365e6a1eb1682c4b32c164aa3503f0731ef97bfad3df1e", - "https://bcr.bazel.build/modules/rules_java/8.3.0/source.json": "a2d2246ed61ea6391ca946b164d87c57644d4705072eda5b74531b48fb99b7d0", + "https://bcr.bazel.build/modules/rules_java/8.3.1/MODULE.bazel": "6df154d6cd5f9ede100d40621cc2f487071017f539caee021b24ecd91cf21034", + "https://bcr.bazel.build/modules/rules_java/8.3.1/source.json": "560c2e0e9586d38b3fe93e59ee1dee6ec39c194548eea4e619a5b37ebe6324af", "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", @@ -1350,8 +1350,8 @@ }, "@@rules_java~//java:extensions.bzl%compatibility_proxy": { "general": { - "bzlTransitiveDigest": "tOgQSybDmdV5ILDExAWYtVmkUV75YJN0iaLnD+0RizQ=", - "usagesDigest": "0/TyZruTcO4Acns2lBIfsdJDXcTS869yRn0gpAYMGww=", + "bzlTransitiveDigest": "4UrimEM7gTMnaF+uFyxkxI5Rm+iPRtuuQcf5X3BCIes=", + "usagesDigest": "xpjtNTHKNTxqBkAIM8kCjwvcMhXBoxJptRhR8vXpaoE=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": {}, diff --git a/examples/bzlmod_build_file_generation/MODULE.bazel b/examples/bzlmod_build_file_generation/MODULE.bazel index 2ba52466ae..30ad567879 100644 --- a/examples/bzlmod_build_file_generation/MODULE.bazel +++ b/examples/bzlmod_build_file_generation/MODULE.bazel @@ -87,4 +87,4 @@ local_path_override( ) # Only needed to make rules_python's CI happy -bazel_dep(name = "rules_java", version = "8.3.0") +bazel_dep(name = "rules_java", version = "8.3.1") diff --git a/examples/multi_python_versions/MODULE.bazel b/examples/multi_python_versions/MODULE.bazel index 51ed6f134d..578315741f 100644 --- a/examples/multi_python_versions/MODULE.bazel +++ b/examples/multi_python_versions/MODULE.bazel @@ -62,4 +62,4 @@ 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.0") +bazel_dep(name = "rules_java", version = "8.3.1") diff --git a/gazelle/MODULE.bazel b/gazelle/MODULE.bazel index 0418b39036..d216ad5dc1 100644 --- a/gazelle/MODULE.bazel +++ b/gazelle/MODULE.bazel @@ -8,6 +8,7 @@ bazel_dep(name = "bazel_skylib", version = "1.6.1") 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/internal_deps.bzl b/internal_deps.bzl index 33decba9fc..f7c363c8c6 100644 --- a/internal_deps.bzl +++ b/internal_deps.bzl @@ -178,21 +178,19 @@ def rules_python_internal_deps(): http_archive( name = "com_google_protobuf", - sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", - strip_prefix = "protobuf-27.0", - urls = [ - "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protobuf-27.0.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" @@ -224,9 +222,9 @@ def rules_python_internal_deps(): http_archive( name = "rules_cc", - urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.14/rules_cc-0.0.14.tar.gz"], - sha256 = "906e89286acc67c20819c3c88b3283de0d5868afda33635d70acae0de9777bb7", - strip_prefix = "rules_cc-0.0.14", + 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( diff --git a/internal_setup.bzl b/internal_setup.bzl index b28c0e28b7..03b3c02e98 100644 --- a/internal_setup.bzl +++ b/internal_setup.bzl @@ -20,6 +20,7 @@ load("@cgrindel_bazel_starlib//:deps.bzl", "bazel_starlib_dependencies") 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") @@ -52,6 +53,9 @@ def rules_python_internal_setup(): 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/python/private/py_repositories.bzl b/python/private/py_repositories.bzl index 6283ad7cbc..46ca903df4 100644 --- a/python/private/py_repositories.bzl +++ b/python/private/py_repositories.bzl @@ -47,24 +47,26 @@ def py_repositories(): ) 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", - sha256 = "d9bdd3ec66b6871456ec9c965809f43a0901e692d754885e89293807762d3d80", - strip_prefix = "rules_cc-0.0.13", - urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.0.13/rules_cc-0.0.13.tar.gz"], + 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, triggerred by @rules_java_prebuilt in Bazel by using @rules_cc//cc:defs.bzl + # 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 = "protobuf", - sha256 = "da288bf1daa6c04d03a9051781caa52aceb9163586bff9aa6cfb12f69b9395aa", - strip_prefix = "protobuf-27.0", - url = "https://github.com/protocolbuffers/protobuf/releases/download/v27.0/protobuf-27.0.tar.gz", + 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/sphinxdocs/docs/BUILD.bazel b/sphinxdocs/docs/BUILD.bazel index 6af908dc4c..070e0485d7 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 @@ _TARGET_COMPATIBLE_WITH = select({ "@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", From 1aee4bff6f4f6b9ea3cdc5c83f35d38329e7e17c Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 22 Nov 2024 08:01:23 +0900 Subject: [PATCH 335/345] chore: add dougthor42 as one of the gazelle owners (#2427) Related #2231 @Geethree, @ewianda, let me know if you would also like to start reviewing PRs for `gazelle`. If you would otherwise like to do adhoc PR reviews, feel free to chime in whenever you like. --- .github/CODEOWNERS | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6a8a48fb16..4df29bacdf 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 From fe3f7a48c4c1b6cd72d413077f3719a0759841f4 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 22 Nov 2024 08:07:33 +0900 Subject: [PATCH 336/345] ci: rm the lock file testing (#2430) This was not something that turned out to be useful and it is causing enough friction that it makes it not worth it. Summary: - remove presubmit checks checking lockfile - remove the pre-commit hooks for lock file updating - remove the note about the lock file - remove the MODULE.bazel.lock --------- Co-authored-by: Richard Levasseur --- .bazelci/presubmit.yml | 22 - .gitignore | 1 - .pre-commit-config.yaml | 6 - DEVELOPING.md | 3 +- examples/bzlmod/MODULE.bazel.lock | 20030 --------------------- tools/private/update_bzlmod_lockfiles.sh | 5 - 6 files changed, 1 insertion(+), 20066 deletions(-) delete mode 100644 examples/bzlmod/MODULE.bazel.lock delete mode 100755 tools/private/update_bzlmod_lockfiles.sh diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 3d992ea477..c45fc78990 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -298,28 +298,6 @@ tasks: working_directory: examples/bzlmod platform: windows bazel: last_rc - integration_test_bzlmod_ubuntu_lockfile: - <<: *reusable_build_test_all - <<: *coverage_targets_example_bzlmod - name: "examples/bzlmod: Ubuntu with lockfile" - working_directory: examples/bzlmod - platform: ubuntu2004 - bazel: 7.x - shell_commands: - # Update the lockfiles and fail if it is different. - - "../../tools/private/update_bzlmod_lockfiles.sh" - - "git diff --exit-code" - integration_test_bzlmod_macos_lockfile: - <<: *reusable_build_test_all - <<: *coverage_targets_example_bzlmod - name: "examples/bzlmod: macOS with lockfile" - working_directory: examples/bzlmod - platform: macos - bazel: 7.x - shell_commands: - # Update the lockfiles and fail if it is different. - - "../../tools/private/update_bzlmod_lockfiles.sh" - - "git diff --exit-code" integration_test_bzlmod_generate_build_file_generation_ubuntu_min: <<: *minimum_supported_version diff --git a/.gitignore b/.gitignore index 92b5801a52..863b0e9c3f 100644 --- a/.gitignore +++ b/.gitignore @@ -52,4 +52,3 @@ user.bazelrc # 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 65389db797..707a8d78aa 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -49,9 +49,3 @@ repos: 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/DEVELOPING.md b/DEVELOPING.md index ff0e110b3c..d816fba57f 100644 --- a/DEVELOPING.md +++ b/DEVELOPING.md @@ -56,8 +56,7 @@ 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. If `MODULE.bazel.lock` conflicts occur, then - run `pre-commit run update-bzlmod-lockfiles -a` +1. Fix merge conflicts, if any. 1. `git cherry-pick --continue` (if applicable) 1. `git push upstream` diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock deleted file mode 100644 index 41c52e888c..0000000000 --- a/examples/bzlmod/MODULE.bazel.lock +++ /dev/null @@ -1,20030 +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/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", - "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", - "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/source.json": "9be551b8d4e3ef76875c0d744b5d6a504a27e3ae67bc6b28f46415fd2d2957da", - "https://bcr.bazel.build/modules/apple_support/1.13.0/MODULE.bazel": "7c8cdea7e031b7f9f67f0b497adf6d2c6a2675e9304ca93a9af6ed84eef5a524", - "https://bcr.bazel.build/modules/apple_support/1.13.0/source.json": "aef5da52fdcfa9173e02c0cb772c85be5b01b9d49f97f9bb0fe3efe738938ba4", - "https://bcr.bazel.build/modules/apple_support/1.5.0/MODULE.bazel": "50341a62efbc483e8a2a6aec30994a58749bd7b885e18dd96aa8c33031e558ef", - "https://bcr.bazel.build/modules/aspect_bazel_lib/1.31.2/MODULE.bazel": "7bee702b4862612f29333590f4b658a5832d433d6f8e4395f090e8f4e85d442f", - "https://bcr.bazel.build/modules/aspect_bazel_lib/1.38.0/MODULE.bazel": "6307fec451ba9962c1c969eb516ebfe1e46528f7fa92e1c9ac8646bef4cdaa3f", - "https://bcr.bazel.build/modules/aspect_bazel_lib/1.40.3/MODULE.bazel": "668e6bcb4d957fc0e284316dba546b705c8d43c857f87119619ee83c4555b859", - "https://bcr.bazel.build/modules/aspect_bazel_lib/1.40.3/source.json": "f5a28b1320e5f444e798b4afc1465c8b720bfaec7522cca38a23583dffe85e6d", - "https://bcr.bazel.build/modules/aspect_rules_js/1.33.1/MODULE.bazel": "db3e7f16e471cf6827059d03af7c21859e7a0d2bc65429a3a11f005d46fc501b", - "https://bcr.bazel.build/modules/aspect_rules_js/1.39.0/MODULE.bazel": "aece421d479e3c31dc3e5f6d49a12acc2700457c03c556650ec7a0ff23fc0d95", - "https://bcr.bazel.build/modules/aspect_rules_js/1.39.0/source.json": "a8f93e4ad8843e8aa407fa5fd7c8b63a63846c0ce255371ff23384582813b13d", - "https://bcr.bazel.build/modules/aspect_rules_lint/0.12.0/MODULE.bazel": "e767c5dbfeb254ec03275a7701b5cfde2c4d2873676804bc7cb27ddff3728fed", - "https://bcr.bazel.build/modules/aspect_rules_lint/0.12.0/source.json": "9a3668e1ee219170e22c0e7f3ab959724c6198fdd12cd503fa10b1c6923a2559", - "https://bcr.bazel.build/modules/bazel_features/0.1.0/MODULE.bazel": "47011d645b0f949f42ee67f2e8775188a9cf4a0a1528aa2fa4952f2fd00906fd", - "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", - "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", - "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", - "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", - "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", - "https://bcr.bazel.build/modules/bazel_features/1.19.0/source.json": "d7bf14517c1b25b9d9c580b0f8795fceeae08a7590f507b76aace528e941375d", - "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", - "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.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", - "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.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", - "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", - "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/source.json": "f121b43eeefc7c29efbd51b83d08631e2347297c95aac9764a701f2a6a2bb953", - "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/gazelle/0.27.0/MODULE.bazel": "3446abd608295de6d90b4a8a118ed64a9ce11dcb3dda2dc3290a22056bd20996", - "https://bcr.bazel.build/modules/gazelle/0.30.0/MODULE.bazel": "f888a1effe338491f35f0e0e85003b47bb9d8295ccba73c37e07702d8d31c65b", - "https://bcr.bazel.build/modules/gazelle/0.30.0/source.json": "7af0779f99120aafc73be127615d224f26da2fc5a606b52bdffb221fd9efb737", - "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", - "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", - "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", - "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/source.json": "41e9e129f80d8c8bf103a7acc337b76e54fad1214ac0a7084bf24f4cd924b8b4", - "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", - "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", - "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", - "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", - "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/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", - "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d", - "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", - "https://bcr.bazel.build/modules/protobuf/29.0-rc2/source.json": "52101bfd37e38f0d159dee47b71ccbd1f22f7a32192cef5ef2533bb6212f410f", - "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", - "https://bcr.bazel.build/modules/protobuf/3.19.2/MODULE.bazel": "532ffe5f2186b69fdde039efe6df13ba726ff338c6bc82275ad433013fa10573", - "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858", - "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", - "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/source.json": "be4789e951dd5301282729fe3d4938995dc4c1a81c2ff150afc9f1b0504c6022", - "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", - "https://bcr.bazel.build/modules/re2/2023-09-01/source.json": "e044ce89c2883cd957a2969a43e79f7752f9656f6b20050b62f90ede21ec6eb4", - "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", - "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", - "https://bcr.bazel.build/modules/rules_buf/0.1.1/MODULE.bazel": "6189aec18a4f7caff599ad41b851ab7645d4f1e114aa6431acf9b0666eb92162", - "https://bcr.bazel.build/modules/rules_buf/0.1.1/source.json": "021363d254f7438f3f10725355969c974bb2c67e0c28667782ade31a9cdb747f", - "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", - "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", - "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", - "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", - "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", - "https://bcr.bazel.build/modules/rules_cc/0.0.16/source.json": "227e83737046aa4f50015da48e98e0d8ab42fd0ec74d8d653b6cc9f9a357f200", - "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_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", - "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", - "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e", - "https://bcr.bazel.build/modules/rules_go/0.33.0/MODULE.bazel": "a2b11b64cd24bf94f57454f53288a5dacfe6cb86453eee7761b7637728c1910c", - "https://bcr.bazel.build/modules/rules_go/0.38.1/MODULE.bazel": "fb8e73dd3b6fc4ff9d260ceacd830114891d49904f5bda1c16bc147bcc254f71", - "https://bcr.bazel.build/modules/rules_go/0.39.1/MODULE.bazel": "d34fb2a249403a5f4339c754f1e63dc9e5ad70b47c5e97faee1441fc6636cd61", - "https://bcr.bazel.build/modules/rules_go/0.39.1/source.json": "f21e042154010ae2c944ab230d572b17d71cdb27c5255806d61df6ccaed4354c", - "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", - "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", - "https://bcr.bazel.build/modules/rules_java/6.0.0/MODULE.bazel": "8a43b7df601a7ec1af61d79345c17b31ea1fedc6711fd4abfd013ea612978e39", - "https://bcr.bazel.build/modules/rules_java/6.4.0/MODULE.bazel": "e986a9fe25aeaa84ac17ca093ef13a4637f6107375f64667a15999f77db6c8f6", - "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", - "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", - "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", - "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", - "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2", - "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", - "https://bcr.bazel.build/modules/rules_java/7.6.5/MODULE.bazel": "481164be5e02e4cab6e77a36927683263be56b7e36fef918b458d7a8a1ebadb1", - "https://bcr.bazel.build/modules/rules_java/8.3.1/MODULE.bazel": "6df154d6cd5f9ede100d40621cc2f487071017f539caee021b24ecd91cf21034", - "https://bcr.bazel.build/modules/rules_java/8.3.1/source.json": "560c2e0e9586d38b3fe93e59ee1dee6ec39c194548eea4e619a5b37ebe6324af", - "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.3/MODULE.bazel": "bf93870767689637164657731849fb887ad086739bd5d360d90007a581d5527d", - "https://bcr.bazel.build/modules/rules_jvm_external/6.1/MODULE.bazel": "75b5fec090dbd46cf9b7d8ea08cf84a0472d92ba3585b476f44c326eda8059c4", - "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", - "https://bcr.bazel.build/modules/rules_jvm_external/6.3/source.json": "6f5f5a5a4419ae4e37c35a5bb0a6ae657ed40b7abc5a5189111b47fcebe43197", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", - "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", - "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.8/MODULE.bazel": "5669c6fe49b5134dbf534db681ad3d67a2d49cfc197e4a95f1ca2fd7f3aebe96", - "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", - "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", - "https://bcr.bazel.build/modules/rules_nodejs/5.8.2/MODULE.bazel": "6bc03c8f37f69401b888023bf511cb6ee4781433b0cb56236b2e55a21e3a026a", - "https://bcr.bazel.build/modules/rules_nodejs/5.8.2/source.json": "6e82cf5753d835ea18308200bc79b9c2e782efe2e2a4edc004a9162ca93382ca", - "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", - "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", - "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", - "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.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", - "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", - "https://bcr.bazel.build/modules/rules_proto/7.0.2/source.json": "1e5e7260ae32ef4f2b52fd1d0de8d03b606a44c91b694d2f1afb1d3b28a48ce1", - "https://bcr.bazel.build/modules/rules_rust/0.54.1/MODULE.bazel": "388547bb0cd6a751437bb15c94c6725226f50100eec576e4354c3a8b48c754fb", - "https://bcr.bazel.build/modules/rules_rust/0.54.1/source.json": "9c5481b1abe4943457e6b2a475592d2e504b6b4355df603f24f64cde0a7f0f2d", - "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", - "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", - "https://bcr.bazel.build/modules/rules_shell/0.3.0/source.json": "c55ed591aa5009401ddf80ded9762ac32c358d2517ee7820be981e2de9756cf3", - "https://bcr.bazel.build/modules/stardoc/0.5.0/MODULE.bazel": "f9f1f46ba8d9c3362648eea571c6f9100680efc44913618811b58cc9c02cd678", - "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.5.4/MODULE.bazel": "6569966df04610b8520957cb8e97cf2e9faac2c0309657c537ab51c16c18a2a4", - "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", - "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", - "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7", - "https://bcr.bazel.build/modules/stardoc/0.7.1/source.json": "b6500ffcd7b48cd72c29bb67bcac781e12701cc0d6d55d266a652583cfcdab01", - "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", - "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", - "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" - }, - "selectedYankedVersions": {}, - "moduleExtensions": { - "@@apple_support~//crosstool:setup.bzl%apple_cc_configure_extension": { - "general": { - "bzlTransitiveDigest": "Co35oEwSoYZFy42IHjYfE7VkKR1WykyxhRlbUGSa3XA=", - "usagesDigest": "gVdmmfWVnB6JChQTMnM+gMpss+wokBBM/793mjFRycU=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "local_config_apple_cc_toolchains": { - "bzlFile": "@@apple_support~//crosstool:setup.bzl", - "ruleClassName": "_apple_cc_autoconf_toolchains", - "attributes": {} - }, - "local_config_apple_cc": { - "bzlFile": "@@apple_support~//crosstool:setup.bzl", - "ruleClassName": "_apple_cc_autoconf", - "attributes": {} - } - }, - "recordedRepoMappingEntries": [ - [ - "apple_support~", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, - "@@aspect_bazel_lib~//lib:extensions.bzl%toolchains": { - "general": { - "bzlTransitiveDigest": "wbW/fEUW6Ya4TMFK5PPIgAwWuJm4AQFeqnOO5DbiZjw=", - "usagesDigest": "2yV4A8xZ6FZbGGe74q8xCktC2QFZ9qOJZI8VbIbhxtE=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "copy_directory_darwin_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_directory_toolchain.bzl", - "ruleClassName": "copy_directory_platform_repo", - "attributes": { - "platform": "darwin_amd64" - } - }, - "copy_directory_darwin_arm64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_directory_toolchain.bzl", - "ruleClassName": "copy_directory_platform_repo", - "attributes": { - "platform": "darwin_arm64" - } - }, - "copy_directory_freebsd_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_directory_toolchain.bzl", - "ruleClassName": "copy_directory_platform_repo", - "attributes": { - "platform": "freebsd_amd64" - } - }, - "copy_directory_linux_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_directory_toolchain.bzl", - "ruleClassName": "copy_directory_platform_repo", - "attributes": { - "platform": "linux_amd64" - } - }, - "copy_directory_linux_arm64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_directory_toolchain.bzl", - "ruleClassName": "copy_directory_platform_repo", - "attributes": { - "platform": "linux_arm64" - } - }, - "copy_directory_windows_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_directory_toolchain.bzl", - "ruleClassName": "copy_directory_platform_repo", - "attributes": { - "platform": "windows_amd64" - } - }, - "copy_directory_toolchains": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_directory_toolchain.bzl", - "ruleClassName": "copy_directory_toolchains_repo", - "attributes": { - "user_repository_name": "copy_directory" - } - }, - "copy_to_directory_darwin_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", - "ruleClassName": "copy_to_directory_platform_repo", - "attributes": { - "platform": "darwin_amd64" - } - }, - "copy_to_directory_darwin_arm64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", - "ruleClassName": "copy_to_directory_platform_repo", - "attributes": { - "platform": "darwin_arm64" - } - }, - "copy_to_directory_freebsd_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", - "ruleClassName": "copy_to_directory_platform_repo", - "attributes": { - "platform": "freebsd_amd64" - } - }, - "copy_to_directory_linux_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", - "ruleClassName": "copy_to_directory_platform_repo", - "attributes": { - "platform": "linux_amd64" - } - }, - "copy_to_directory_linux_arm64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", - "ruleClassName": "copy_to_directory_platform_repo", - "attributes": { - "platform": "linux_arm64" - } - }, - "copy_to_directory_windows_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", - "ruleClassName": "copy_to_directory_platform_repo", - "attributes": { - "platform": "windows_amd64" - } - }, - "copy_to_directory_toolchains": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:copy_to_directory_toolchain.bzl", - "ruleClassName": "copy_to_directory_toolchains_repo", - "attributes": { - "user_repository_name": "copy_to_directory" - } - }, - "jq_darwin_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", - "ruleClassName": "jq_platform_repo", - "attributes": { - "platform": "darwin_amd64", - "version": "1.6" - } - }, - "jq_darwin_arm64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", - "ruleClassName": "jq_platform_repo", - "attributes": { - "platform": "darwin_arm64", - "version": "1.6" - } - }, - "jq_linux_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", - "ruleClassName": "jq_platform_repo", - "attributes": { - "platform": "linux_amd64", - "version": "1.6" - } - }, - "jq_windows_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", - "ruleClassName": "jq_platform_repo", - "attributes": { - "platform": "windows_amd64", - "version": "1.6" - } - }, - "jq": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", - "ruleClassName": "jq_host_alias_repo", - "attributes": {} - }, - "jq_toolchains": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:jq_toolchain.bzl", - "ruleClassName": "jq_toolchains_repo", - "attributes": { - "user_repository_name": "jq" - } - }, - "yq_darwin_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", - "ruleClassName": "yq_platform_repo", - "attributes": { - "platform": "darwin_amd64", - "version": "4.25.2" - } - }, - "yq_darwin_arm64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", - "ruleClassName": "yq_platform_repo", - "attributes": { - "platform": "darwin_arm64", - "version": "4.25.2" - } - }, - "yq_linux_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", - "ruleClassName": "yq_platform_repo", - "attributes": { - "platform": "linux_amd64", - "version": "4.25.2" - } - }, - "yq_linux_arm64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", - "ruleClassName": "yq_platform_repo", - "attributes": { - "platform": "linux_arm64", - "version": "4.25.2" - } - }, - "yq_linux_s390x": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", - "ruleClassName": "yq_platform_repo", - "attributes": { - "platform": "linux_s390x", - "version": "4.25.2" - } - }, - "yq_linux_ppc64le": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", - "ruleClassName": "yq_platform_repo", - "attributes": { - "platform": "linux_ppc64le", - "version": "4.25.2" - } - }, - "yq_windows_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", - "ruleClassName": "yq_platform_repo", - "attributes": { - "platform": "windows_amd64", - "version": "4.25.2" - } - }, - "yq": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", - "ruleClassName": "yq_host_alias_repo", - "attributes": {} - }, - "yq_toolchains": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:yq_toolchain.bzl", - "ruleClassName": "yq_toolchains_repo", - "attributes": { - "user_repository_name": "yq" - } - }, - "coreutils_darwin_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:coreutils_toolchain.bzl", - "ruleClassName": "coreutils_platform_repo", - "attributes": { - "platform": "darwin_amd64", - "version": "0.0.16" - } - }, - "coreutils_darwin_arm64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:coreutils_toolchain.bzl", - "ruleClassName": "coreutils_platform_repo", - "attributes": { - "platform": "darwin_arm64", - "version": "0.0.16" - } - }, - "coreutils_linux_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:coreutils_toolchain.bzl", - "ruleClassName": "coreutils_platform_repo", - "attributes": { - "platform": "linux_amd64", - "version": "0.0.16" - } - }, - "coreutils_linux_arm64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:coreutils_toolchain.bzl", - "ruleClassName": "coreutils_platform_repo", - "attributes": { - "platform": "linux_arm64", - "version": "0.0.16" - } - }, - "coreutils_windows_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:coreutils_toolchain.bzl", - "ruleClassName": "coreutils_platform_repo", - "attributes": { - "platform": "windows_amd64", - "version": "0.0.16" - } - }, - "coreutils_toolchains": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:coreutils_toolchain.bzl", - "ruleClassName": "coreutils_toolchains_repo", - "attributes": { - "user_repository_name": "coreutils" - } - }, - "expand_template_darwin_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:expand_template_toolchain.bzl", - "ruleClassName": "expand_template_platform_repo", - "attributes": { - "platform": "darwin_amd64" - } - }, - "expand_template_darwin_arm64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:expand_template_toolchain.bzl", - "ruleClassName": "expand_template_platform_repo", - "attributes": { - "platform": "darwin_arm64" - } - }, - "expand_template_freebsd_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:expand_template_toolchain.bzl", - "ruleClassName": "expand_template_platform_repo", - "attributes": { - "platform": "freebsd_amd64" - } - }, - "expand_template_linux_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:expand_template_toolchain.bzl", - "ruleClassName": "expand_template_platform_repo", - "attributes": { - "platform": "linux_amd64" - } - }, - "expand_template_linux_arm64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:expand_template_toolchain.bzl", - "ruleClassName": "expand_template_platform_repo", - "attributes": { - "platform": "linux_arm64" - } - }, - "expand_template_windows_amd64": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:expand_template_toolchain.bzl", - "ruleClassName": "expand_template_platform_repo", - "attributes": { - "platform": "windows_amd64" - } - }, - "expand_template_toolchains": { - "bzlFile": "@@aspect_bazel_lib~//lib/private:expand_template_toolchain.bzl", - "ruleClassName": "expand_template_toolchains_repo", - "attributes": { - "user_repository_name": "expand_template" - } - } - }, - "recordedRepoMappingEntries": [ - [ - "aspect_bazel_lib~", - "aspect_bazel_lib", - "aspect_bazel_lib~" - ], - [ - "aspect_bazel_lib~", - "bazel_skylib", - "bazel_skylib~" - ], - [ - "aspect_bazel_lib~", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, - "@@aspect_rules_js~//npm:extensions.bzl%pnpm": { - "general": { - "bzlTransitiveDigest": "roscSBlY/YuE46w1gEYQIkORMqkGdIyJVkxDfq/ZAtw=", - "usagesDigest": "1hU324o/rWis1wprOwPM+3YiIXklZvJ5jfmEbzKAClo=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "pnpm": { - "bzlFile": "@@aspect_rules_js~//npm/private:npm_import.bzl", - "ruleClassName": "npm_import_rule", - "attributes": { - "package": "pnpm", - "version": "8.6.7", - "root_package": "", - "link_workspace": "", - "link_packages": {}, - "integrity": "sha512-vRIWpD/L4phf9Bk2o/O2TDR8fFoJnpYrp2TKqTIZF/qZ2/rgL3qKXzHofHgbXsinwMoSEigz28sqk3pQ+yMEQQ==", - "url": "", - "commit": "", - "patch_args": [ - "-p0" - ], - "patches": [], - "custom_postinstall": "", - "npm_auth": "", - "npm_auth_basic": "", - "npm_auth_username": "", - "npm_auth_password": "", - "lifecycle_hooks": [], - "extra_build_content": "load(\"@aspect_rules_js//js:defs.bzl\", \"js_binary\")\njs_binary(name = \"pnpm\", data = glob([\"package/**\"]), entry_point = \"package/dist/pnpm.cjs\", visibility = [\"//visibility:public\"])", - "generate_bzl_library_targets": false - } - }, - "pnpm__links": { - "bzlFile": "@@aspect_rules_js~//npm/private:npm_import.bzl", - "ruleClassName": "npm_import_links", - "attributes": { - "package": "pnpm", - "version": "8.6.7", - "dev": false, - "root_package": "", - "link_packages": {}, - "deps": {}, - "transitive_closure": {}, - "lifecycle_build_target": false, - "lifecycle_hooks_env": [], - "lifecycle_hooks_execution_requirements": [ - "no-sandbox" - ], - "lifecycle_hooks_use_default_shell_env": false, - "bins": {}, - "npm_translate_lock_repo": "", - "package_visibility": [ - "//visibility:public" - ], - "replace_package": "" - } - } - }, - "recordedRepoMappingEntries": [ - [ - "aspect_bazel_lib~", - "bazel_skylib", - "bazel_skylib~" - ], - [ - "aspect_bazel_lib~", - "bazel_tools", - "bazel_tools" - ], - [ - "aspect_rules_js~", - "aspect_bazel_lib", - "aspect_bazel_lib~" - ], - [ - "aspect_rules_js~", - "bazel_features", - "bazel_features~" - ], - [ - "aspect_rules_js~", - "bazel_skylib", - "bazel_skylib~" - ], - [ - "aspect_rules_js~", - "bazel_tools", - "bazel_tools" - ], - [ - "bazel_features~", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, - "@@gazelle~//:extensions.bzl%go_deps": { - "general": { - "bzlTransitiveDigest": "KnJM36BNWe/NP/TKDbrmkLH1Oa6KLGvHqjuwR0tQom0=", - "usagesDigest": "bhzyFsFjm2VnoytfOA2/r1S4IqcYobOIKCgfPgNjsoo=", - "recordedFileInputs": { - "@@rules_go~//go.mod": "a7143f329c2a3e0b983ce74a96c0c25b0d0c59d236d75f7e1b069aadd988d55e", - "@@gazelle~//go.sum": "c9624aa41e5ffd61a8581d57a3c4046e62b46630dddc8b191e65017f34ff12a5", - "@@rules_go~//go.sum": "022d36c9ebcc7b5dee1e9b85b3da9c9f3a529ee6f979946d66e4955b8d54614a", - "@@gazelle~//go.mod": "5346019bf0673364b383d56ffbc9fced98b7b4ee921e865dfe905a1ebe82d326" - }, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "com_github_gogo_protobuf": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "github.com/gogo/protobuf", - "sum": "h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=", - "replace": "", - "version": "v1.3.2", - "build_directives": [ - "gazelle:proto disable" - ] - } - }, - "com_github_golang_mock": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "github.com/golang/mock", - "sum": "h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=", - "replace": "", - "version": "v1.6.0", - "build_directives": [] - } - }, - "com_github_golang_protobuf": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "github.com/golang/protobuf", - "sum": "h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=", - "replace": "", - "version": "v1.5.2", - "build_directives": [] - } - }, - "org_golang_google_protobuf": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "google.golang.org/protobuf", - "sum": "h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=", - "replace": "", - "version": "v1.28.0", - "build_directives": [] - } - }, - "org_golang_x_net": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "golang.org/x/net", - "sum": "h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=", - "replace": "", - "version": "v0.0.0-20210405180319-a5a99cb37ef4", - "build_directives": [] - } - }, - "org_golang_x_sys": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "golang.org/x/sys", - "sum": "h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=", - "replace": "", - "version": "v0.6.0", - "build_directives": [] - } - }, - "org_golang_x_text": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "golang.org/x/text", - "sum": "h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=", - "replace": "", - "version": "v0.3.3", - "build_directives": [] - } - }, - "org_golang_google_genproto": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "google.golang.org/genproto", - "sum": "h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=", - "replace": "", - "version": "v0.0.0-20200526211855-cb27e3aa2013", - "build_directives": [] - } - }, - "org_golang_google_grpc": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "google.golang.org/grpc", - "sum": "h1:fPVVDxY9w++VjTZsYvXWqEf9Rqar/e+9zYfxKK+W+YU=", - "replace": "", - "version": "v1.50.0", - "build_directives": [ - "gazelle:proto disable" - ] - } - }, - "com_github_bazelbuild_buildtools": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "github.com/bazelbuild/buildtools", - "sum": "h1:XmPu4mXICgdGnC5dXGjUGbwUD/kUmS0l5Aop3LaevBM=", - "replace": "", - "version": "v0.0.0-20230317132445-9c3c1fc0106e", - "build_directives": [] - } - }, - "com_github_bmatcuk_doublestar_v4": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "github.com/bmatcuk/doublestar/v4", - "sum": "h1:HTuxyug8GyFbRkrffIpzNCSK4luc0TY3wzXvzIZhEXc=", - "replace": "", - "version": "v4.6.0", - "build_directives": [] - } - }, - "com_github_fsnotify_fsnotify": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "github.com/fsnotify/fsnotify", - "sum": "h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=", - "replace": "", - "version": "v1.6.0", - "build_directives": [] - } - }, - "com_github_google_go_cmp": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "github.com/google/go-cmp", - "sum": "h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=", - "replace": "", - "version": "v0.5.9", - "build_directives": [] - } - }, - "com_github_pelletier_go_toml": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "github.com/pelletier/go-toml", - "sum": "h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=", - "replace": "", - "version": "v1.9.5", - "build_directives": [] - } - }, - "com_github_pmezard_go_difflib": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "github.com/pmezard/go-difflib", - "sum": "h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=", - "replace": "", - "version": "v1.0.0", - "build_directives": [] - } - }, - "org_golang_x_mod": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "golang.org/x/mod", - "sum": "h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs=", - "replace": "", - "version": "v0.9.0", - "build_directives": [] - } - }, - "org_golang_x_sync": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "golang.org/x/sync", - "sum": "h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=", - "replace": "", - "version": "v0.1.0", - "build_directives": [] - } - }, - "org_golang_x_tools": { - "bzlFile": "@@gazelle~//internal:go_repository.bzl", - "ruleClassName": "go_repository", - "attributes": { - "importpath": "golang.org/x/tools", - "sum": "h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4=", - "replace": "", - "version": "v0.7.0", - "build_directives": [] - } - }, - "bazel_gazelle_go_repository_config": { - "bzlFile": "@@gazelle~//internal/bzlmod:go_deps.bzl", - "ruleClassName": "_go_repository_config", - "attributes": { - "importpaths": { - "com_github_gogo_protobuf": "github.com/gogo/protobuf", - "com_github_golang_mock": "github.com/golang/mock", - "com_github_golang_protobuf": "github.com/golang/protobuf", - "org_golang_google_protobuf": "google.golang.org/protobuf", - "org_golang_x_net": "golang.org/x/net", - "org_golang_x_sys": "golang.org/x/sys", - "org_golang_x_text": "golang.org/x/text", - "org_golang_google_genproto": "google.golang.org/genproto", - "org_golang_google_grpc": "google.golang.org/grpc", - "com_github_bazelbuild_buildtools": "github.com/bazelbuild/buildtools", - "com_github_bmatcuk_doublestar_v4": "github.com/bmatcuk/doublestar/v4", - "com_github_fsnotify_fsnotify": "github.com/fsnotify/fsnotify", - "com_github_google_go_cmp": "github.com/google/go-cmp", - "com_github_pelletier_go_toml": "github.com/pelletier/go-toml", - "com_github_pmezard_go_difflib": "github.com/pmezard/go-difflib", - "org_golang_x_mod": "golang.org/x/mod", - "org_golang_x_sync": "golang.org/x/sync", - "org_golang_x_tools": "golang.org/x/tools" - }, - "build_naming_conventions": {} - } - } - }, - "recordedRepoMappingEntries": [ - [ - "gazelle~", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, - "@@gazelle~//internal/bzlmod:non_module_deps.bzl%non_module_deps": { - "general": { - "bzlTransitiveDigest": "30wev+wJfzc4s72MCfbP9U8W+3Js2b+Xbo5ofgZbHw8=", - "usagesDigest": "fc5f3E2W09BuRJ0CSEtVMiXtG+1TsfyLRdzjNNVOw3U=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "bazel_gazelle_go_repository_cache": { - "bzlFile": "@@gazelle~//internal:go_repository_cache.bzl", - "ruleClassName": "go_repository_cache", - "attributes": { - "go_sdk_name": "go_default_sdk", - "go_env": {} - } - }, - "bazel_gazelle_go_repository_tools": { - "bzlFile": "@@gazelle~//internal:go_repository_tools.bzl", - "ruleClassName": "go_repository_tools", - "attributes": { - "go_cache": "@@gazelle~~non_module_deps~bazel_gazelle_go_repository_cache//:go.env" - } - } - }, - "recordedRepoMappingEntries": [ - [ - "gazelle~", - "bazel_gazelle_go_repository_cache", - "gazelle~~non_module_deps~bazel_gazelle_go_repository_cache" - ] - ] - } - }, - "@@platforms//host:extension.bzl%host_platform": { - "general": { - "bzlTransitiveDigest": "xelQcPZH8+tmuOHVjL9vDxMnnQNMlwj0SlvgoqBkm4U=", - "usagesDigest": "hgylFkgWSg0ulUwWZzEM1aIftlUnbmw2ynWLdEfHnZc=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "host_platform": { - "bzlFile": "@@platforms//host:extension.bzl", - "ruleClassName": "host_platform_repo", - "attributes": {} - } - }, - "recordedRepoMappingEntries": [] - } - }, - "@@pybind11_bazel~//:python_configure.bzl%extension": { - "general": { - "bzlTransitiveDigest": "whINYge95GgPtysKDbNHQ0ZlWYdtKybHs5y2tLF+x7Q=", - "usagesDigest": "gNvOHVcAlwgDsNXD0amkv2CC96mnaCThPQoE44y8K+w=", - "recordedFileInputs": { - "@@pybind11_bazel~//MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e" - }, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "local_config_python": { - "bzlFile": "@@pybind11_bazel~//:python_configure.bzl", - "ruleClassName": "python_configure", - "attributes": {} - }, - "pybind11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "build_file": "@@pybind11_bazel~//:pybind11.BUILD", - "strip_prefix": "pybind11-2.11.1", - "urls": [ - "https://github.com/pybind/pybind11/archive/v2.11.1.zip" - ] - } - } - }, - "recordedRepoMappingEntries": [ - [ - "pybind11_bazel~", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, - "@@rules_buf~//buf:extensions.bzl%ext": { - "general": { - "bzlTransitiveDigest": "gmPmM7QT5Jez2VVFcwbbMf/QWSRag+nJ1elFJFFTcn0=", - "usagesDigest": "1E3NeLCRI6VyKiersXVtONCbNopc5jIVqoHBOpcWb0A=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "rules_buf_toolchains": { - "bzlFile": "@@rules_buf~//buf/internal:toolchain.bzl", - "ruleClassName": "buf_download_releases", - "attributes": { - "version": "v1.27.0" - } - } - }, - "recordedRepoMappingEntries": [ - [ - "rules_buf~", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, - "@@rules_fuzzing~//fuzzing/private:extensions.bzl%non_module_dependencies": { - "general": { - "bzlTransitiveDigest": "hVgJRQ3Er45/UUAgNn1Yp2Khcp/Y8WyafA2kXIYmQ5M=", - "usagesDigest": "YnIrdgwnf3iCLfChsltBdZ7yOJh706lpa2vww/i2pDI=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "platforms": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "urls": [ - "https://mirror.bazel.build/github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz", - "https://github.com/bazelbuild/platforms/releases/download/0.0.8/platforms-0.0.8.tar.gz" - ], - "sha256": "8150406605389ececb6da07cbcb509d5637a3ab9a24bc69b1101531367d89d74" - } - }, - "rules_python": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d70cd72a7a4880f0000a6346253414825c19cdd40a28289bdf67b8e6480edff8", - "strip_prefix": "rules_python-0.28.0", - "url": "https://github.com/bazelbuild/rules_python/releases/download/0.28.0/rules_python-0.28.0.tar.gz" - } - }, - "bazel_skylib": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "cd55a062e763b9349921f0f5db8c3933288dc8ba4f76dd9416aac68acee3cb94", - "urls": [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.5.0/bazel-skylib-1.5.0.tar.gz", - "https://github.com/bazelbuild/bazel-skylib/releases/download/1.5.0/bazel-skylib-1.5.0.tar.gz" - ] - } - }, - "com_google_absl": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "urls": [ - "https://github.com/abseil/abseil-cpp/archive/refs/tags/20240116.1.zip" - ], - "strip_prefix": "abseil-cpp-20240116.1", - "integrity": "sha256-7capMWOvWyoYbUaHF/b+I2U6XLMaHmky8KugWvfXYuk=" - } - }, - "rules_fuzzing_oss_fuzz": { - "bzlFile": "@@rules_fuzzing~//fuzzing/private/oss_fuzz:repository.bzl", - "ruleClassName": "oss_fuzz_repository", - "attributes": {} - }, - "honggfuzz": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "build_file": "@@rules_fuzzing~//:honggfuzz.BUILD", - "sha256": "6b18ba13bc1f36b7b950c72d80f19ea67fbadc0ac0bb297ec89ad91f2eaa423e", - "url": "https://github.com/google/honggfuzz/archive/2.5.zip", - "strip_prefix": "honggfuzz-2.5" - } - }, - "rules_fuzzing_jazzer": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_jar", - "attributes": { - "sha256": "ee6feb569d88962d59cb59e8a31eb9d007c82683f3ebc64955fd5b96f277eec2", - "url": "https://repo1.maven.org/maven2/com/code-intelligence/jazzer/0.20.1/jazzer-0.20.1.jar" - } - }, - "rules_fuzzing_jazzer_api": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_jar", - "attributes": { - "sha256": "f5a60242bc408f7fa20fccf10d6c5c5ea1fcb3c6f44642fec5af88373ae7aa1b", - "url": "https://repo1.maven.org/maven2/com/code-intelligence/jazzer-api/0.20.1/jazzer-api-0.20.1.jar" - } - } - }, - "recordedRepoMappingEntries": [ - [ - "rules_fuzzing~", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, - "@@rules_go~//go:extensions.bzl%go_sdk": { - "general": { - "bzlTransitiveDigest": "8NkcgnML0idfe+aSUrahYJPXCAotWV11d+LSLMy+Pv4=", - "usagesDigest": "X5aqZFHzd1sdmeEDb7EhtLQxpfWCqdD+QovvCyIB8hw=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "go_default_sdk": { - "bzlFile": "@@rules_go~//go/private:sdk.bzl", - "ruleClassName": "go_download_sdk_rule", - "attributes": { - "goos": "", - "goarch": "", - "sdks": {}, - "urls": [ - "https://dl.google.com/go/{}" - ], - "version": "1.19.8" - } - }, - "go_toolchains": { - "bzlFile": "@@rules_go~//go/private:sdk.bzl", - "ruleClassName": "go_multiple_toolchains", - "attributes": { - "prefixes": [ - "_0000_go_default_sdk_" - ], - "geese": [ - "" - ], - "goarchs": [ - "" - ], - "sdk_repos": [ - "go_default_sdk" - ], - "sdk_types": [ - "remote" - ], - "sdk_versions": [ - "1.19.8" - ] - } - } - }, - "recordedRepoMappingEntries": [ - [ - "rules_go~", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, - "@@rules_go~//go/private:extensions.bzl%non_module_dependencies": { - "general": { - "bzlTransitiveDigest": "FTGURJaxZ0zFih+z+h0k1eUyY5hJAwB/+M3KIzNbDWg=", - "usagesDigest": "l2146X4RaM7utp6nGByI3dH5YyCDzM3VOsYjDtSaZzk=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "bazel_skylib": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "urls": [ - "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.4.1/bazel-skylib-1.4.1.tar.gz", - "https://github.com/bazelbuild/bazel-skylib/releases/download/1.4.1/bazel-skylib-1.4.1.tar.gz" - ], - "sha256": "b8a1527901774180afc798aeb28c4634bdccf19c4d98e7bdd1ce79d1fe9aaad7", - "strip_prefix": "" - } - }, - "org_golang_x_tools": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "urls": [ - "https://mirror.bazel.build/github.com/golang/tools/archive/refs/tags/v0.7.0.zip", - "https://github.com/golang/tools/archive/refs/tags/v0.7.0.zip" - ], - "sha256": "9f20a20f29f4008d797a8be882ef82b69cf8f7f2b96dbdfe3814c57d8280fa4b", - "strip_prefix": "tools-0.7.0", - "patches": [ - "@@rules_go~//third_party:org_golang_x_tools-deletegopls.patch", - "@@rules_go~//third_party:org_golang_x_tools-gazelle.patch" - ], - "patch_args": [ - "-p1" - ] - } - }, - "org_golang_x_sys": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "urls": [ - "https://mirror.bazel.build/github.com/golang/sys/archive/refs/tags/v0.6.0.zip", - "https://github.com/golang/sys/archive/refs/tags/v0.6.0.zip" - ], - "sha256": "7f2399398b2eb4f1f495cc754d6353566e0ad934ee0eb46505e55162e0def56d", - "strip_prefix": "sys-0.6.0", - "patches": [ - "@@rules_go~//third_party:org_golang_x_sys-gazelle.patch" - ], - "patch_args": [ - "-p1" - ] - } - }, - "org_golang_x_xerrors": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "urls": [ - "https://mirror.bazel.build/github.com/golang/xerrors/archive/04be3eba64a22a838cdb17b8dca15a52871c08b4.zip", - "https://github.com/golang/xerrors/archive/04be3eba64a22a838cdb17b8dca15a52871c08b4.zip" - ], - "sha256": "ffad2b06ef2e09d040da2ff08077865e99ab95d4d0451737fc8e33706bb01634", - "strip_prefix": "xerrors-04be3eba64a22a838cdb17b8dca15a52871c08b4", - "patches": [ - "@@rules_go~//third_party:org_golang_x_xerrors-gazelle.patch" - ], - "patch_args": [ - "-p1" - ] - } - }, - "org_golang_google_protobuf": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "cb1a05581c33b3705ede6c08edf9b9c1dbc579559ba30f532704c324e42bf801", - "urls": [ - "https://mirror.bazel.build/github.com/protocolbuffers/protobuf-go/archive/refs/tags/v1.30.0.zip", - "https://github.com/protocolbuffers/protobuf-go/archive/refs/tags/v1.30.0.zip" - ], - "strip_prefix": "protobuf-go-1.30.0", - "patches": [ - "@@rules_go~//third_party:org_golang_google_protobuf-gazelle.patch" - ], - "patch_args": [ - "-p1" - ] - } - }, - "com_github_golang_protobuf": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "urls": [ - "https://mirror.bazel.build/github.com/golang/protobuf/archive/refs/tags/v1.5.3.zip", - "https://github.com/golang/protobuf/archive/refs/tags/v1.5.3.zip" - ], - "sha256": "2dced4544ae5372281e20f1e48ca76368355a01b31353724718c4d6e3dcbb430", - "strip_prefix": "protobuf-1.5.3", - "patches": [ - "@@rules_go~//third_party:com_github_golang_protobuf-gazelle.patch" - ], - "patch_args": [ - "-p1" - ] - } - }, - "com_github_mwitkow_go_proto_validators": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "urls": [ - "https://mirror.bazel.build/github.com/mwitkow/go-proto-validators/archive/refs/tags/v0.3.2.zip", - "https://github.com/mwitkow/go-proto-validators/archive/refs/tags/v0.3.2.zip" - ], - "sha256": "d8697f05a2f0eaeb65261b480e1e6035301892d9fc07ed945622f41b12a68142", - "strip_prefix": "go-proto-validators-0.3.2" - } - }, - "com_github_gogo_protobuf": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "urls": [ - "https://mirror.bazel.build/github.com/gogo/protobuf/archive/refs/tags/v1.3.2.zip", - "https://github.com/gogo/protobuf/archive/refs/tags/v1.3.2.zip" - ], - "sha256": "f89f8241af909ce3226562d135c25b28e656ae173337b3e58ede917aa26e1e3c", - "strip_prefix": "protobuf-1.3.2", - "patches": [ - "@@rules_go~//third_party:com_github_gogo_protobuf-gazelle.patch" - ], - "patch_args": [ - "-p1" - ] - } - }, - "gogo_special_proto": { - "bzlFile": "@@rules_go~//proto:gogo.bzl", - "ruleClassName": "gogo_special_proto", - "attributes": {} - }, - "org_golang_google_genproto": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "urls": [ - "https://mirror.bazel.build/github.com/googleapis/go-genproto/archive/6ac7f18bb9d5eeeb13a9f1ae4f21e4374a1952f8.zip", - "https://github.com/googleapis/go-genproto/archive/6ac7f18bb9d5eeeb13a9f1ae4f21e4374a1952f8.zip" - ], - "sha256": "3470e7a89b24971b20c4bb8900a668df25279e4b741f72bc09418c1f22543215", - "strip_prefix": "go-genproto-6ac7f18bb9d5eeeb13a9f1ae4f21e4374a1952f8", - "patches": [ - "@@rules_go~//third_party:org_golang_google_genproto-gazelle.patch" - ], - "patch_args": [ - "-p1" - ] - } - }, - "go_googleapis": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "urls": [ - "https://mirror.bazel.build/github.com/googleapis/googleapis/archive/83c3605afb5a39952bf0a0809875d41cf2a558ca.zip", - "https://github.com/googleapis/googleapis/archive/83c3605afb5a39952bf0a0809875d41cf2a558ca.zip" - ], - "sha256": "ba694861340e792fd31cb77274eacaf6e4ca8bda97707898f41d8bebfd8a4984", - "strip_prefix": "googleapis-83c3605afb5a39952bf0a0809875d41cf2a558ca", - "patches": [ - "@@rules_go~//third_party:go_googleapis-deletebuild.patch", - "@@rules_go~//third_party:go_googleapis-directives.patch", - "@@rules_go~//third_party:go_googleapis-gazelle.patch" - ], - "patch_args": [ - "-E", - "-p1" - ] - } - }, - "com_github_golang_mock": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "urls": [ - "https://mirror.bazel.build/github.com/golang/mock/archive/refs/tags/v1.7.0-rc.1.zip", - "https://github.com/golang/mock/archive/refs/tags/v1.7.0-rc.1.zip" - ], - "patches": [ - "@@rules_go~//third_party:com_github_golang_mock-gazelle.patch" - ], - "patch_args": [ - "-p1" - ], - "sha256": "5359c78b0c1649cf7beb3b48ff8b1d1aaf0243b22ea4789aba94805280075d8e", - "strip_prefix": "mock-1.7.0-rc.1" - } - }, - "io_bazel_rules_nogo": { - "bzlFile": "@@rules_go~//go/private:nogo.bzl", - "ruleClassName": "go_register_nogo", - "attributes": { - "nogo": "@io_bazel_rules_go//:default_nogo" - } - } - }, - "recordedRepoMappingEntries": [ - [ - "rules_go~", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, - "@@rules_java~//java:extensions.bzl%compatibility_proxy": { - "general": { - "bzlTransitiveDigest": "4UrimEM7gTMnaF+uFyxkxI5Rm+iPRtuuQcf5X3BCIes=", - "usagesDigest": "xpjtNTHKNTxqBkAIM8kCjwvcMhXBoxJptRhR8vXpaoE=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "compatibility_proxy": { - "bzlFile": "@@rules_java~//java:repositories.bzl", - "ruleClassName": "_compatibility_proxy_repo_rule", - "attributes": {} - } - }, - "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_java~", - "bazel_features", - "bazel_features~" - ], - [ - "rules_java~", - "bazel_tools", - "bazel_tools" - ], - [ - "rules_java~", - "remote_java_tools", - "rules_java~~toolchains~remote_java_tools" - ] - ] - } - }, - "@@rules_kotlin~//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { - "general": { - "bzlTransitiveDigest": "fus14IFJ/1LGWWGKPH/U18VnJCoMjfDt1ckahqCnM0A=", - "usagesDigest": "aJF6fLy82rR95Ff5CZPAqxNoFgOMLMN5ImfBS0nhnkg=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "com_github_jetbrains_kotlin_git": { - "bzlFile": "@@rules_kotlin~//src/main/starlark/core/repositories:compiler.bzl", - "ruleClassName": "kotlin_compiler_git_repository", - "attributes": { - "urls": [ - "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip" - ], - "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88" - } - }, - "com_github_jetbrains_kotlin": { - "bzlFile": "@@rules_kotlin~//src/main/starlark/core/repositories:compiler.bzl", - "ruleClassName": "kotlin_capabilities_repository", - "attributes": { - "git_repository_name": "com_github_jetbrains_kotlin_git", - "compiler_version": "1.9.23" - } - }, - "com_github_google_ksp": { - "bzlFile": "@@rules_kotlin~//src/main/starlark/core/repositories:ksp.bzl", - "ruleClassName": "ksp_compiler_plugin_repository", - "attributes": { - "urls": [ - "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip" - ], - "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d", - "strip_version": "1.9.23-1.0.20" - } - }, - "com_github_pinterest_ktlint": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "sha256": "01b2e0ef893383a50dbeb13970fe7fa3be36ca3e83259e01649945b09d736985", - "urls": [ - "https://github.com/pinterest/ktlint/releases/download/1.3.0/ktlint" - ], - "executable": true - } - }, - "rules_android": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", - "strip_prefix": "rules_android-0.1.1", - "urls": [ - "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip" - ] - } - } - }, - "recordedRepoMappingEntries": [ - [ - "rules_kotlin~", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, - "@@rules_nodejs~//nodejs:extensions.bzl%node": { - "general": { - "bzlTransitiveDigest": "xRRX0NuyvfLtjtzM4AqJgxdMSWWnLIw28rUUi10y6k0=", - "usagesDigest": "9IUJvk13jWE1kE+N3sP2y0mw9exjO9CGQ2oAgwKTNK4=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "nodejs_linux_amd64": { - "bzlFile": "@@rules_nodejs~//nodejs:repositories.bzl", - "ruleClassName": "node_repositories", - "attributes": { - "platform": "linux_amd64", - "node_version": "16.19.0" - } - }, - "nodejs_linux_arm64": { - "bzlFile": "@@rules_nodejs~//nodejs:repositories.bzl", - "ruleClassName": "node_repositories", - "attributes": { - "platform": "linux_arm64", - "node_version": "16.19.0" - } - }, - "nodejs_linux_s390x": { - "bzlFile": "@@rules_nodejs~//nodejs:repositories.bzl", - "ruleClassName": "node_repositories", - "attributes": { - "platform": "linux_s390x", - "node_version": "16.19.0" - } - }, - "nodejs_linux_ppc64le": { - "bzlFile": "@@rules_nodejs~//nodejs:repositories.bzl", - "ruleClassName": "node_repositories", - "attributes": { - "platform": "linux_ppc64le", - "node_version": "16.19.0" - } - }, - "nodejs_darwin_amd64": { - "bzlFile": "@@rules_nodejs~//nodejs:repositories.bzl", - "ruleClassName": "node_repositories", - "attributes": { - "platform": "darwin_amd64", - "node_version": "16.19.0" - } - }, - "nodejs_darwin_arm64": { - "bzlFile": "@@rules_nodejs~//nodejs:repositories.bzl", - "ruleClassName": "node_repositories", - "attributes": { - "platform": "darwin_arm64", - "node_version": "16.19.0" - } - }, - "nodejs_windows_amd64": { - "bzlFile": "@@rules_nodejs~//nodejs:repositories.bzl", - "ruleClassName": "node_repositories", - "attributes": { - "platform": "windows_amd64", - "node_version": "16.19.0" - } - }, - "nodejs": { - "bzlFile": "@@rules_nodejs~//nodejs/private:nodejs_repo_host_os_alias.bzl", - "ruleClassName": "nodejs_repo_host_os_alias", - "attributes": { - "user_node_repository_name": "nodejs" - } - }, - "nodejs_host": { - "bzlFile": "@@rules_nodejs~//nodejs/private:nodejs_repo_host_os_alias.bzl", - "ruleClassName": "nodejs_repo_host_os_alias", - "attributes": { - "user_node_repository_name": "nodejs" - } - }, - "nodejs_toolchains": { - "bzlFile": "@@rules_nodejs~//nodejs/private:toolchains_repo.bzl", - "ruleClassName": "toolchains_repo", - "attributes": { - "user_node_repository_name": "nodejs" - } - } - }, - "recordedRepoMappingEntries": [ - [ - "rules_nodejs~", - "bazel_skylib", - "bazel_skylib~" - ], - [ - "rules_nodejs~", - "bazel_tools", - "bazel_tools" - ] - ] - } - }, - "@@rules_python~//python/extensions:pip.bzl%pip": { - "general": { - "bzlTransitiveDigest": "qoC5CyCn6Cm4Ytk6NW1xqwmeHlT403IcVg6JXDuLjRU=", - "usagesDigest": "/LXEbF0D40bNgP95ES+IlHqvpiKbQBuGdNECrFAUXqk=", - "recordedFileInputs": { - "@@//requirements_lock_3_10.txt": "5e7083982a7e60f34998579a0ae83b520d46ab8f2552cc51337217f024e6def5", - "@@rules_python~//tools/publish/requirements_linux.txt": "8175b4c8df50ae2f22d1706961884beeb54e7da27bd2447018314a175981997d", - "@@rules_python~~internal_deps~pypi__packaging//BUILD.bazel": "16cf02cdc6cd989d8a92b551d406abea3fe597b1524ba5fa88f0410010671d7f", - "@@//whl_mods/appended_build_content.BUILD": "87745b00382c66e5efbd7cb44a08fc3edbf7fd5099cf593f87599188f1557a9e", - "@@rules_python~//BUILD.bazel": "140002ce7e68de2fbf064bcdc37f854d4fa5b5d611a5fece6eb6cf19b8822bc4", - "@@rules_fuzzing~//fuzzing/requirements.txt": "ab04664be026b632a0d2a2446c4f65982b7654f5b6851d2f9d399a19b7242a5b", - "@@rules_python~//python/private/pypi/requirements_parser/resolve_target_platforms.py": "42bf51980528302373529bcdfddb8014e485182d6bc9d2f7d3bbe1f11d8d923d", - "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", - "@@rules_python~//python/private/pypi/whl_installer/platform.py": "b944b908b25a2f97d6d9f491504ad5d2507402d7e37c802ee878783f87f2aa11", - "@@//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~~python~python_3_9_host//BUILD.bazel": "cf97d5763b728ce5ba8fdc3243350b967658ba4e3879734504aee002cec0d2b3", - "@@rules_python~//tools/publish/requirements_windows.txt": "7673adc71dc1a81d3661b90924d7a7c0fc998cd508b3cb4174337cef3f2de556", - "@@protobuf~//python/requirements.txt": "983be60d3cec4b319dcab6d48aeb3f5b2f7c3350f26b3a9e97486c37967c73c5", - "@@rules_python~//tools/publish/requirements_darwin.txt": "2994136eab7e57b083c3de76faf46f70fad130bc8e7360a7fed2b288b69e79dc" - }, - "recordedDirentsInputs": {}, - "envVariables": { - "PIP_INDEX_URL": null, - "RULES_PYTHON_REPO_DEBUG": null, - "RULES_PYTHON_REPO_DEBUG_VERBOSITY": null - }, - "generatedRepoSpecs": { - "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\":[]}" - } - } - }, - "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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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" - } - }, - "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_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_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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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" - ] - } - }, - "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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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_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_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_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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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_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_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_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_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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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_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_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_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_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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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" - ] - } - }, - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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" - ] - } - }, - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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_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_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_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_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_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_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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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_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_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_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_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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--extra-index-url", - "https://pypi.org/simple/" - ], - "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_deps_310_numpy": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", - "repo": "pip_deps_310", - "requirement": "numpy<=1.26.1" - } - }, - "pip_deps_310_setuptools": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", - "repo": "pip_deps_310", - "requirement": "setuptools<=70.3.0" - } - }, - "pip_deps_311_numpy": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "pip_deps_311", - "requirement": "numpy<=1.26.1" - } - }, - "pip_deps_311_setuptools": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "pip_deps_311", - "requirement": "setuptools<=70.3.0" - } - }, - "pip_deps_312_numpy": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", - "repo": "pip_deps_312", - "requirement": "numpy<=1.26.1" - } - }, - "pip_deps_312_setuptools": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", - "repo": "pip_deps_312", - "requirement": "setuptools<=70.3.0" - } - }, - "pip_deps_38_numpy": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", - "repo": "pip_deps_38", - "requirement": "numpy<=1.26.1" - } - }, - "pip_deps_38_setuptools": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", - "repo": "pip_deps_38", - "requirement": "setuptools<=70.3.0" - } - }, - "pip_deps_39_numpy": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", - "repo": "pip_deps_39", - "requirement": "numpy<=1.26.1" - } - }, - "pip_deps_39_setuptools": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@pip_deps//{name}:{target}", - "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", - "repo": "pip_deps_39", - "requirement": "setuptools<=70.3.0" - } - }, - "rules_fuzzing_py_deps_310_absl_py": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", - "repo": "rules_fuzzing_py_deps_310", - "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" - } - }, - "rules_fuzzing_py_deps_310_six": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python~~python~python_3_10_host//:python", - "repo": "rules_fuzzing_py_deps_310", - "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - } - }, - "rules_fuzzing_py_deps_311_absl_py": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_fuzzing_py_deps_311", - "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" - } - }, - "rules_fuzzing_py_deps_311_six": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_fuzzing_py_deps_311", - "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - } - }, - "rules_fuzzing_py_deps_312_absl_py": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", - "repo": "rules_fuzzing_py_deps_312", - "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" - } - }, - "rules_fuzzing_py_deps_312_six": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python~~python~python_3_12_host//:python", - "repo": "rules_fuzzing_py_deps_312", - "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - } - }, - "rules_fuzzing_py_deps_38_absl_py": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", - "repo": "rules_fuzzing_py_deps_38", - "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" - } - }, - "rules_fuzzing_py_deps_38_six": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python~~python~python_3_8_host//:python", - "repo": "rules_fuzzing_py_deps_38", - "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - } - }, - "rules_fuzzing_py_deps_39_absl_py": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", - "repo": "rules_fuzzing_py_deps_39", - "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" - } - }, - "rules_fuzzing_py_deps_39_six": { - "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", - "ruleClassName": "whl_library", - "attributes": { - "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", - "extra_pip_args": [ - "--require-hashes" - ], - "python_interpreter_target": "@@rules_python~~python~python_3_9_host//:python", - "repo": "rules_fuzzing_py_deps_39", - "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - } - }, - "rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7": { - "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": "backports.tarfile-1.2.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "backports-tarfile==1.2.0", - "sha256": "77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", - "urls": [ - "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "backports_tarfile-1.2.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "backports-tarfile==1.2.0", - "sha256": "d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", - "urls": [ - "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.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_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": "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "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_cffi_cp311_cp311_manylinux_2_17_aarch64_a1ed2dd2": { - "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.17.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.17.1", - "sha256": "a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", - "urls": [ - "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_46bf4316": { - "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.17.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.17.1", - "sha256": "46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", - "urls": [ - "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" - ] - } - }, - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_s390x_a24ed04c": { - "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.17.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": "cffi==1.17.1", - "sha256": "a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", - "urls": [ - "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" - ] - } - }, - "rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_x86_64_610faea7": { - "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.17.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.17.1", - "sha256": "610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", - "urls": [ - "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_aarch64_a9b15d49": { - "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.17.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": "cffi==1.17.1", - "sha256": "a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", - "urls": [ - "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_fc48c783": { - "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.17.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.17.1", - "sha256": "fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", - "urls": [ - "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_cffi_sdist_1c39c601": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "cffi-1.17.1.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cffi==1.17.1", - "sha256": "1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", - "urls": [ - "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f": { - "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": "charset_normalizer-3.4.0-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.4.0", - "sha256": "0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", - "urls": [ - "https://files.pythonhosted.org/packages/9c/61/73589dcc7a719582bf56aae309b6103d2762b526bffe189d635a7fcfd998/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5": { - "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": "charset_normalizer-3.4.0-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.4.0", - "sha256": "c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", - "urls": [ - "https://files.pythonhosted.org/packages/77/d5/8c982d58144de49f59571f940e329ad6e8615e1e82ef84584c5eeb5e1d72/charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19": { - "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": "charset_normalizer-3.4.0-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.4.0", - "sha256": "6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", - "urls": [ - "https://files.pythonhosted.org/packages/bf/19/411a64f01ee971bed3231111b69eb56f9331a769072de479eae7de52296d/charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_bf4475b8": { - "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": "charset_normalizer-3.4.0-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.4.0", - "sha256": "bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", - "urls": [ - "https://files.pythonhosted.org/packages/4c/92/97509850f0d00e9f14a46bc751daabd0ad7765cff29cdfb66c68b6dad57f/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_ce031db0": { - "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": "charset_normalizer-3.4.0-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.4.0", - "sha256": "ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", - "urls": [ - "https://files.pythonhosted.org/packages/e2/29/d227805bff72ed6d6cb1ce08eec707f7cfbd9868044893617eb331f16295/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8ff4e7cd": { - "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": "charset_normalizer-3.4.0-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.4.0", - "sha256": "8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", - "urls": [ - "https://files.pythonhosted.org/packages/13/bc/87c2c9f2c144bedfa62f894c3007cd4530ba4b5351acb10dc786428a50f0/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_3710a975": { - "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": "charset_normalizer-3.4.0-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.4.0", - "sha256": "3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", - "urls": [ - "https://files.pythonhosted.org/packages/eb/5b/6f10bad0f6461fa272bfbbdf5d0023b5fb9bc6217c92bf068fa5a99820f5/charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_47334db7": { - "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": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", - "urls": [ - "https://files.pythonhosted.org/packages/d7/a1/493919799446464ed0299c8eef3c3fad0daf1c3cd48bff9263c731b0d9e2/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_f1a2f519": { - "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": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", - "urls": [ - "https://files.pythonhosted.org/packages/75/d2/0ab54463d3410709c09266dfb416d032a08f97fd7d60e94b8c6ef54ae14b/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_63bc5c4a": { - "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": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", - "urls": [ - "https://files.pythonhosted.org/packages/8d/c9/27e41d481557be53d51e60750b85aa40eaf52b841946b3cdeff363105737/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_bcb4f8ea": { - "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": "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", - "urls": [ - "https://files.pythonhosted.org/packages/ee/44/4f62042ca8cdc0cabf87c0fc00ae27cd8b53ab68be3605ba6d071f742ad3/charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f": { - "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": "charset_normalizer-3.4.0-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.4.0", - "sha256": "cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", - "urls": [ - "https://files.pythonhosted.org/packages/0b/6e/b13bd47fa9023b3699e94abf565b5a2f0b0be6e9ddac9812182596ee62e4/charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe": { - "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": "charset_normalizer-3.4.0-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.4.0", - "sha256": "fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", - "urls": [ - "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_charset_normalizer_sdist_223217c3": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "charset_normalizer-3.4.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "charset-normalizer==3.4.0", - "sha256": "223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", - "urls": [ - "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_846da004": { - "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-43.0.3-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==43.0.3", - "sha256": "846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5", - "urls": [ - "https://files.pythonhosted.org/packages/2f/78/55356eb9075d0be6e81b59f45c7b48df87f76a20e73893872170471f3ee8/cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_x86_64_0f996e72": { - "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-43.0.3-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==43.0.3", - "sha256": "0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4", - "urls": [ - "https://files.pythonhosted.org/packages/2a/2c/488776a3dc843f95f86d2f957ca0fc3407d0242b50bede7fad1e339be03f/cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_f7b178f1": { - "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-43.0.3-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==43.0.3", - "sha256": "f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7", - "urls": [ - "https://files.pythonhosted.org/packages/7c/04/2345ca92f7a22f601a9c62961741ef7dd0127c39f7310dffa0041c80f16f/cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_c2e6fc39": { - "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-43.0.3-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==43.0.3", - "sha256": "c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405", - "urls": [ - "https://files.pythonhosted.org/packages/ac/25/e715fa0bc24ac2114ed69da33adf451a38abb6f3f24ec207908112e9ba53/cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_e1be4655": { - "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-43.0.3-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==43.0.3", - "sha256": "e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16", - "urls": [ - "https://files.pythonhosted.org/packages/21/ce/b9c9ff56c7164d8e2edfb6c9305045fbc0df4508ccfdb13ee66eb8c95b0e/cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_df6b6c6d": { - "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-43.0.3-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==43.0.3", - "sha256": "df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73", - "urls": [ - "https://files.pythonhosted.org/packages/2a/33/b3682992ab2e9476b9c81fff22f02c8b0a1e6e1d49ee1750a67d85fd7ed2/cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_cryptography_sdist_315b9001": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "cryptography-43.0.3.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "cryptography==43.0.3", - "sha256": "315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", - "urls": [ - "https://files.pythonhosted.org/packages/0d/05/07b55d1fa21ac18c3a8c79f764e2514e6f6a9698f1be44994f5adf0d29db/cryptography-43.0.3.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_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": "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "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_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_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": "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_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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "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_importlib_metadata_py3_none_any_45e54197": { - "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-8.5.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==8.5.0", - "sha256": "45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", - "urls": [ - "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_importlib_metadata_sdist_71522656": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "importlib_metadata-8.5.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "importlib-metadata==8.5.0", - "sha256": "71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", - "urls": [ - "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b": { - "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.4.0-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.4.0", - "sha256": "f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", - "urls": [ - "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "jaraco.classes-3.4.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-classes==3.4.0", - "sha256": "47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", - "urls": [ - "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48": { - "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.context-6.0.1-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-context==6.0.1", - "sha256": "f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", - "urls": [ - "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "jaraco_context-6.0.1.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-context==6.0.1", - "sha256": "9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", - "urls": [ - "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13": { - "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.functools-4.1.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-functools==4.1.0", - "sha256": "ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649", - "urls": [ - "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "jaraco_functools-4.1.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "jaraco-functools==4.1.0", - "sha256": "70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d", - "urls": [ - "https://files.pythonhosted.org/packages/ab/23/9894b3df5d0a6eb44611c36aec777823fc2e07740dabbd0b810e19594013/jaraco_functools-4.1.0.tar.gz" - ] - } - }, - "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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "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_keyring_py3_none_any_5426f817": { - "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-25.4.1-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "keyring==25.4.1", - "sha256": "5426f817cf7f6f007ba5ec722b1bcad95a75b27d780343772ad76b17cb47b0bf", - "urls": [ - "https://files.pythonhosted.org/packages/83/25/e6d59e5f0a0508d0dca8bb98c7f7fd3772fc943ac3f53d5ab18a218d32c0/keyring-25.4.1-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_keyring_sdist_b07ebc55": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "keyring-25.4.1.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "keyring==25.4.1", - "sha256": "b07ebc55f3e8ed86ac81dd31ef14e81ace9dd9c3d4b5d77a6e9a2016d0d71a1b", - "urls": [ - "https://files.pythonhosted.org/packages/a5/1c/2bdbcfd5d59dc6274ffb175bc29aa07ecbfab196830e0cfbde7bd861a2ea/keyring-25.4.1.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684": { - "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-3.0.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==3.0.0", - "sha256": "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", - "urls": [ - "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "markdown-it-py-3.0.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "markdown-it-py==3.0.0", - "sha256": "e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", - "urls": [ - "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "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_more_itertools_py3_none_any_037b0d32": { - "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-10.5.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==10.5.0", - "sha256": "037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef", - "urls": [ - "https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_more_itertools_sdist_5482bfef": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "more-itertools-10.5.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "more-itertools==10.5.0", - "sha256": "5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6", - "urls": [ - "https://files.pythonhosted.org/packages/51/78/65922308c4248e0eb08ebcbe67c95d48615cc6f27854b6f2e57143e9178f/more-itertools-10.5.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e": { - "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": "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86", - "urls": [ - "https://files.pythonhosted.org/packages/b3/89/1daff5d9ba5a95a157c092c7c5f39b8dd2b1ddb4559966f808d31cfb67e0/nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c": { - "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": "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811", - "urls": [ - "https://files.pythonhosted.org/packages/2c/b6/42fc3c69cabf86b6b81e4c051a9b6e249c5ba9f8155590222c2622961f58/nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511": { - "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": "nh3-0.2.18-cp37-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": "nh3==0.2.18", - "sha256": "42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200", - "urls": [ - "https://files.pythonhosted.org/packages/45/b9/833f385403abaf0023c6547389ec7a7acf141ddd9d1f21573723a6eab39a/nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_armv7l_0411beb0": { - "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": "nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "0411beb0589eacb6734f28d5497ca2ed379eafab8ad8c84b31bb5c34072b7164", - "urls": [ - "https://files.pythonhosted.org/packages/05/2b/85977d9e11713b5747595ee61f381bc820749daf83f07b90b6c9964cf932/nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64_5f36b271": { - "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": "nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "5f36b271dae35c465ef5e9090e1fdaba4a60a56f0bb0ba03e0932a66f28b9189", - "urls": [ - "https://files.pythonhosted.org/packages/72/f2/5c894d5265ab80a97c68ca36f25c8f6f0308abac649aaf152b74e7e854a8/nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7": { - "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": "nh3-0.2.18-cp37-abi3-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": "nh3==0.2.18", - "sha256": "34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad", - "urls": [ - "https://files.pythonhosted.org/packages/ab/a7/375afcc710dbe2d64cfbd69e31f82f3e423d43737258af01f6a56d844085/nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96": { - "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": "nh3-0.2.18-cp37-abi3-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": "nh3==0.2.18", - "sha256": "19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b", - "urls": [ - "https://files.pythonhosted.org/packages/c2/a8/3bb02d0c60a03ad3a112b76c46971e9480efa98a8946677b5a59f60130ca/nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6": { - "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": "nh3-0.2.18-cp37-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": "nh3==0.2.18", - "sha256": "de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307", - "urls": [ - "https://files.pythonhosted.org/packages/1b/63/6ab90d0e5225ab9780f6c9fb52254fa36b52bb7c188df9201d05b647e5e1/nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca": { - "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": "nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe", - "urls": [ - "https://files.pythonhosted.org/packages/a3/da/0c4e282bc3cff4a0adf37005fa1fb42257673fbc1bbf7d1ff639ec3d255a/nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_armv7l_3a157ab1": { - "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": "nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "3a157ab149e591bb638a55c8c6bcb8cdb559c8b12c13a8affaba6cedfe51713a", - "urls": [ - "https://files.pythonhosted.org/packages/de/81/c291231463d21da5f8bba82c8167a6d6893cc5419b0639801ee5d3aeb8a9/nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b": { - "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": "nh3-0.2.18-cp37-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": "nh3==0.2.18", - "sha256": "36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204", - "urls": [ - "https://files.pythonhosted.org/packages/eb/61/73a007c74c37895fdf66e0edcd881f5eaa17a348ff02f4bb4bc906d61085/nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819": { - "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": "nh3-0.2.18-cp37-abi3-win_amd64.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844", - "urls": [ - "https://files.pythonhosted.org/packages/26/8d/53c5b19c4999bdc6ba95f246f4ef35ca83d7d7423e5e38be43ad66544e5d/nh3-0.2.18-cp37-abi3-win_amd64.whl" - ] - } - }, - "rules_python_publish_deps_311_nh3_sdist_94a16692": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "nh3-0.2.18.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "nh3==0.2.18", - "sha256": "94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4", - "urls": [ - "https://files.pythonhosted.org/packages/62/73/10df50b42ddb547a907deeb2f3c9823022580a7a47281e8eae8e003a9639/nh3-0.2.18.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2": { - "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.10.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pkginfo==1.10.0", - "sha256": "889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097", - "urls": [ - "https://files.pythonhosted.org/packages/56/09/054aea9b7534a15ad38a363a2bd974c20646ab1582a387a95b8df1bfea1c/pkginfo-1.10.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_pkginfo_sdist_5df73835": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "pkginfo-1.10.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pkginfo==1.10.0", - "sha256": "5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297", - "urls": [ - "https://files.pythonhosted.org/packages/2f/72/347ec5be4adc85c182ed2823d8d1c7b51e13b9a6b0c1aae59582eca652df/pkginfo-1.10.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_pycparser_py3_none_any_c3702b6d": { - "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.22-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pycparser==2.22", - "sha256": "c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", - "urls": [ - "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_pycparser_sdist_491c8be9": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "pycparser-2.22.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pycparser==2.22", - "sha256": "491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", - "urls": [ - "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0": { - "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.18.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.18.0", - "sha256": "b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", - "urls": [ - "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_pygments_sdist_786ff802": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "pygments-2.18.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pygments==2.18.0", - "sha256": "786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", - "urls": [ - "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_pywin32_ctypes_py3_none_any_8a151337": { - "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.3-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.3", - "sha256": "8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", - "urls": [ - "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_pywin32_ctypes_sdist_d162dc04": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "pywin32-ctypes-0.2.3.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "pywin32-ctypes==0.2.3", - "sha256": "d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", - "urls": [ - "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b": { - "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-44.0-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "readme-renderer==44.0", - "sha256": "2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151", - "urls": [ - "https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_readme_renderer_sdist_8712034e": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "readme_renderer-44.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "readme-renderer==44.0", - "sha256": "8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1", - "urls": [ - "https://files.pythonhosted.org/packages/5a/a9/104ec9234c8448c4379768221ea6df01260cd6c2ce13182d4eac531c8342/readme_renderer-44.0.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_requests_py3_none_any_70761cfe": { - "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.32.3-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "requests==2.32.3", - "sha256": "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", - "urls": [ - "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-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\"]}" - } - } - }, - "rules_python_publish_deps_311_requests_sdist_55365417": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "requests-2.32.3.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "requests==2.32.3", - "sha256": "55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", - "urls": [ - "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.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\"]}" - } - } - }, - "rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66": { - "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-1.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": "requests-toolbelt==1.0.0", - "sha256": "cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", - "urls": [ - "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "requests-toolbelt-1.0.0.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "requests-toolbelt==1.0.0", - "sha256": "7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", - "urls": [ - "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz" - ] - } - }, - "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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "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_rich_py3_none_any_9836f509": { - "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.9.3-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "rich==13.9.3", - "sha256": "9836f5096eb2172c9e77df411c1b009bace4193d6a481d534fea75ebba758283", - "urls": [ - "https://files.pythonhosted.org/packages/9a/e2/10e9819cf4a20bd8ea2f5dabafc2e6bf4a78d6a0965daeb60a4b34d1c11f/rich-13.9.3-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_rich_sdist_bc1e01b8": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "rich-13.9.3.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "rich==13.9.3", - "sha256": "bc1e01b899537598cf02579d2b9f4a415104d3fc439313a7a2c165d76557a08e", - "urls": [ - "https://files.pythonhosted.org/packages/d9/e9/cf9ef5245d835065e6673781dbd4b8911d352fb770d56cf0879cf11b7ee1/rich-13.9.3.tar.gz" - ] - } - }, - "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_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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "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_twine_py3_none_any_215dbe7b": { - "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-5.1.1-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "twine==5.1.1", - "sha256": "215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997", - "urls": [ - "https://files.pythonhosted.org/packages/5d/ec/00f9d5fd040ae29867355e559a94e9a8429225a0284a3f5f091a3878bfc0/twine-5.1.1-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_twine_sdist_9aa08251": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "twine-5.1.1.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "twine==5.1.1", - "sha256": "9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db", - "urls": [ - "https://files.pythonhosted.org/packages/77/68/bd982e5e949ef8334e6f7dcf76ae40922a8750aa2e347291ae1477a4782b/twine-5.1.1.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_urllib3_py3_none_any_ca899ca0": { - "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": "urllib3-2.2.3-py3-none-any.whl", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "urllib3==2.2.3", - "sha256": "ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", - "urls": [ - "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_urllib3_sdist_e7d814a8": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "urllib3-2.2.3.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "urllib3==2.2.3", - "sha256": "e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", - "urls": [ - "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz" - ] - } - }, - "rules_python_publish_deps_311_zipp_py3_none_any_a817ac80": { - "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": "zipp-3.20.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.20.2", - "sha256": "a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", - "urls": [ - "https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl" - ] - } - }, - "rules_python_publish_deps_311_zipp_sdist_bc9eb26f": { - "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" - ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple" - ], - "filename": "zipp-3.20.2.tar.gz", - "python_interpreter_target": "@@rules_python~~python~python_3_11_host//:python", - "repo": "rules_python_publish_deps_311", - "requirement": "zipp==3.20.2", - "sha256": "bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29", - "urls": [ - "https://files.pythonhosted.org/packages/54/bf/5c0000c44ebc80123ecbdddba1f5dcd94a5ada602a9c225d84b5aaa55e86/zipp-3.20.2.tar.gz" - ] - } - }, - "other_module_pip": { - "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", - "ruleClassName": "hub_repository", - "attributes": { - "repo_name": "other_module_pip", - "extra_hub_aliases": {}, - "whl_map": { - "absl_py": "[{\"repo\":\"other_module_pip_311_absl_py\",\"version\":\"3.11\"}]" - }, - "packages": [ - "absl_py" - ], - "groups": {} - } - }, - "pip": { - "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", - "ruleClassName": "hub_repository", - "attributes": { - "repo_name": "pip", - "extra_hub_aliases": { - "wheel": [ - "generated_file" - ] - }, - "whl_map": { - "alabaster": "[{\"repo\":\"pip_310_alabaster\",\"version\":\"3.10\"},{\"filename\":\"alabaster-0.7.13-py3-none-any.whl\",\"repo\":\"pip_39_alabaster_py3_none_any_1ee19aca\",\"version\":\"3.9\"},{\"filename\":\"alabaster-0.7.13.tar.gz\",\"repo\":\"pip_39_alabaster_sdist_a27a4a08\",\"version\":\"3.9\"}]", - "astroid": "[{\"repo\":\"pip_310_astroid\",\"version\":\"3.10\"},{\"filename\":\"astroid-2.12.13-py3-none-any.whl\",\"repo\":\"pip_39_astroid_py3_none_any_10e0ad5f\",\"version\":\"3.9\"},{\"filename\":\"astroid-2.12.13.tar.gz\",\"repo\":\"pip_39_astroid_sdist_1493fe8b\",\"version\":\"3.9\"}]", - "babel": "[{\"repo\":\"pip_310_babel\",\"version\":\"3.10\"},{\"filename\":\"Babel-2.13.1-py3-none-any.whl\",\"repo\":\"pip_39_babel_py3_none_any_7077a498\",\"version\":\"3.9\"},{\"filename\":\"Babel-2.13.1.tar.gz\",\"repo\":\"pip_39_babel_sdist_33e0952d\",\"version\":\"3.9\"}]", - "certifi": "[{\"repo\":\"pip_310_certifi\",\"version\":\"3.10\"},{\"filename\":\"certifi-2023.7.22-py3-none-any.whl\",\"repo\":\"pip_39_certifi_py3_none_any_92d60375\",\"version\":\"3.9\"},{\"filename\":\"certifi-2023.7.22.tar.gz\",\"repo\":\"pip_39_certifi_sdist_539cc1d1\",\"version\":\"3.9\"}]", - "chardet": "[{\"repo\":\"pip_310_chardet\",\"version\":\"3.10\"},{\"filename\":\"chardet-4.0.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_chardet_py2_none_any_f864054d\",\"version\":\"3.9\"},{\"filename\":\"chardet-4.0.0.tar.gz\",\"repo\":\"pip_39_chardet_sdist_0d6f53a1\",\"version\":\"3.9\"}]", - "colorama": "[{\"repo\":\"pip_310_colorama\",\"version\":\"3.10\"},{\"filename\":\"colorama-0.4.6-py2.py3-none-any.whl\",\"repo\":\"pip_39_colorama_py2_none_any_4f1d9991\",\"version\":\"3.9\"},{\"filename\":\"colorama-0.4.6.tar.gz\",\"repo\":\"pip_39_colorama_sdist_08695f5c\",\"version\":\"3.9\"}]", - "dill": "[{\"repo\":\"pip_310_dill\",\"version\":\"3.10\"},{\"filename\":\"dill-0.3.6-py3-none-any.whl\",\"repo\":\"pip_39_dill_py3_none_any_a07ffd23\",\"version\":\"3.9\"},{\"filename\":\"dill-0.3.6.tar.gz\",\"repo\":\"pip_39_dill_sdist_e5db55f3\",\"version\":\"3.9\"}]", - "docutils": "[{\"repo\":\"pip_310_docutils\",\"version\":\"3.10\"},{\"filename\":\"docutils-0.20.1-py3-none-any.whl\",\"repo\":\"pip_39_docutils_py3_none_any_96f387a2\",\"version\":\"3.9\"},{\"filename\":\"docutils-0.20.1.tar.gz\",\"repo\":\"pip_39_docutils_sdist_f08a4e27\",\"version\":\"3.9\"}]", - "idna": "[{\"repo\":\"pip_310_idna\",\"version\":\"3.10\"},{\"filename\":\"idna-2.10-py2.py3-none-any.whl\",\"repo\":\"pip_39_idna_py2_none_any_b97d804b\",\"version\":\"3.9\"},{\"filename\":\"idna-2.10.tar.gz\",\"repo\":\"pip_39_idna_sdist_b307872f\",\"version\":\"3.9\"}]", - "imagesize": "[{\"repo\":\"pip_310_imagesize\",\"version\":\"3.10\"},{\"filename\":\"imagesize-1.4.1-py2.py3-none-any.whl\",\"repo\":\"pip_39_imagesize_py2_none_any_0d8d18d0\",\"version\":\"3.9\"},{\"filename\":\"imagesize-1.4.1.tar.gz\",\"repo\":\"pip_39_imagesize_sdist_69150444\",\"version\":\"3.9\"}]", - "importlib_metadata": "[{\"filename\":\"importlib_metadata-8.4.0-py3-none-any.whl\",\"repo\":\"pip_39_importlib_metadata_py3_none_any_66f342cc\",\"version\":\"3.9\"},{\"filename\":\"importlib_metadata-8.4.0.tar.gz\",\"repo\":\"pip_39_importlib_metadata_sdist_9a547d3b\",\"version\":\"3.9\"}]", - "isort": "[{\"repo\":\"pip_310_isort\",\"version\":\"3.10\"},{\"filename\":\"isort-5.11.4-py3-none-any.whl\",\"repo\":\"pip_39_isort_py3_none_any_c033fd0e\",\"version\":\"3.9\"},{\"filename\":\"isort-5.11.4.tar.gz\",\"repo\":\"pip_39_isort_sdist_6db30c5d\",\"version\":\"3.9\"}]", - "jinja2": "[{\"repo\":\"pip_310_jinja2\",\"version\":\"3.10\"},{\"filename\":\"jinja2-3.1.4-py3-none-any.whl\",\"repo\":\"pip_39_jinja2_py3_none_any_bc5dd2ab\",\"version\":\"3.9\"},{\"filename\":\"jinja2-3.1.4.tar.gz\",\"repo\":\"pip_39_jinja2_sdist_4a3aee7a\",\"version\":\"3.9\"}]", - "lazy_object_proxy": "[{\"repo\":\"pip_310_lazy_object_proxy\",\"version\":\"3.10\"},{\"filename\":\"lazy-object-proxy-1.10.0.tar.gz\",\"repo\":\"pip_39_lazy_object_proxy_sdist_78247b6d\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"}]", - "markupsafe": "[{\"repo\":\"pip_310_markupsafe\",\"version\":\"3.10\"},{\"filename\":\"MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl\",\"repo\":\"pip_39_markupsafe_cp39_cp39_macosx_10_9_universal2_8023faf4\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"},{\"filename\":\"MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_markupsafe_cp39_cp39_win_amd64_3fd4abcb\",\"version\":\"3.9\"},{\"filename\":\"MarkupSafe-2.1.3.tar.gz\",\"repo\":\"pip_39_markupsafe_sdist_af598ed3\",\"version\":\"3.9\"}]", - "mccabe": "[{\"repo\":\"pip_310_mccabe\",\"version\":\"3.10\"},{\"filename\":\"mccabe-0.7.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_mccabe_py2_none_any_6c2d30ab\",\"version\":\"3.9\"},{\"filename\":\"mccabe-0.7.0.tar.gz\",\"repo\":\"pip_39_mccabe_sdist_348e0240\",\"version\":\"3.9\"}]", - "packaging": "[{\"repo\":\"pip_310_packaging\",\"version\":\"3.10\"},{\"filename\":\"packaging-23.2-py3-none-any.whl\",\"repo\":\"pip_39_packaging_py3_none_any_8c491190\",\"version\":\"3.9\"},{\"filename\":\"packaging-23.2.tar.gz\",\"repo\":\"pip_39_packaging_sdist_048fb0e9\",\"version\":\"3.9\"}]", - "pathspec": "[{\"repo\":\"pip_310_pathspec\",\"version\":\"3.10\"},{\"filename\":\"pathspec-0.10.3-py3-none-any.whl\",\"repo\":\"pip_39_pathspec_py3_none_any_3c95343a\",\"version\":\"3.9\"},{\"filename\":\"pathspec-0.10.3.tar.gz\",\"repo\":\"pip_39_pathspec_sdist_56200de4\",\"version\":\"3.9\"}]", - "platformdirs": "[{\"repo\":\"pip_310_platformdirs\",\"version\":\"3.10\"},{\"filename\":\"platformdirs-2.6.0-py3-none-any.whl\",\"repo\":\"pip_39_platformdirs_py3_none_any_1a89a123\",\"version\":\"3.9\"},{\"filename\":\"platformdirs-2.6.0.tar.gz\",\"repo\":\"pip_39_platformdirs_sdist_b46ffafa\",\"version\":\"3.9\"}]", - "pygments": "[{\"repo\":\"pip_310_pygments\",\"version\":\"3.10\"},{\"filename\":\"Pygments-2.16.1-py3-none-any.whl\",\"repo\":\"pip_39_pygments_py3_none_any_13fc09fa\",\"version\":\"3.9\"},{\"filename\":\"Pygments-2.16.1.tar.gz\",\"repo\":\"pip_39_pygments_sdist_1daff049\",\"version\":\"3.9\"}]", - "pylint": "[{\"repo\":\"pip_310_pylint\",\"version\":\"3.10\"},{\"filename\":\"pylint-2.15.9-py3-none-any.whl\",\"repo\":\"pip_39_pylint_py3_none_any_349c8cd3\",\"version\":\"3.9\"},{\"filename\":\"pylint-2.15.9.tar.gz\",\"repo\":\"pip_39_pylint_sdist_18783cca\",\"version\":\"3.9\"}]", - "pylint_print": "[{\"repo\":\"pip_310_pylint_print\",\"version\":\"3.10\"},{\"filename\":\"pylint-print-1.0.1.tar.gz\",\"repo\":\"pip_39_pylint_print_sdist_30aa207e\",\"version\":\"3.9\"},{\"filename\":\"pylint_print-1.0.1-py3-none-any.whl\",\"repo\":\"pip_39_pylint_print_py3_none_any_a2b2599e\",\"version\":\"3.9\"}]", - "python_dateutil": "[{\"repo\":\"pip_310_python_dateutil\",\"version\":\"3.10\"},{\"filename\":\"python-dateutil-2.8.2.tar.gz\",\"repo\":\"pip_39_python_dateutil_sdist_0123cacc\",\"version\":\"3.9\"},{\"filename\":\"python_dateutil-2.8.2-py2.py3-none-any.whl\",\"repo\":\"pip_39_python_dateutil_py2_none_any_961d03dc\",\"version\":\"3.9\"}]", - "python_magic": "[{\"repo\":\"pip_310_python_magic\",\"version\":\"3.10\"},{\"filename\":\"python-magic-0.4.27.tar.gz\",\"repo\":\"pip_39_python_magic_sdist_c1ba14b0\",\"version\":\"3.9\"},{\"filename\":\"python_magic-0.4.27-py2.py3-none-any.whl\",\"repo\":\"pip_39_python_magic_py2_none_any_c212960a\",\"version\":\"3.9\"}]", - "pyyaml": "[{\"repo\":\"pip_310_pyyaml\",\"version\":\"3.10\"},{\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"},{\"filename\":\"PyYAML-6.0.1-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_pyyaml_cp39_cp39_win_amd64_510c9dee\",\"version\":\"3.9\"},{\"filename\":\"PyYAML-6.0.1.tar.gz\",\"repo\":\"pip_39_pyyaml_sdist_bfdf460b\",\"version\":\"3.9\"}]", - "requests": "[{\"repo\":\"pip_310_requests\",\"version\":\"3.10\"},{\"filename\":\"requests-2.25.1-py2.py3-none-any.whl\",\"repo\":\"pip_39_requests_py2_none_any_c210084e\",\"version\":\"3.9\"},{\"filename\":\"requests-2.25.1.tar.gz\",\"repo\":\"pip_39_requests_sdist_27973dd4\",\"version\":\"3.9\"}]", - "s3cmd": "[{\"repo\":\"pip_310_s3cmd\",\"version\":\"3.10\"},{\"filename\":\"s3cmd-2.1.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_s3cmd_py2_none_any_49cd23d5\",\"version\":\"3.9\"},{\"filename\":\"s3cmd-2.1.0.tar.gz\",\"repo\":\"pip_39_s3cmd_sdist_966b0a49\",\"version\":\"3.9\"}]", - "setuptools": "[{\"filename\":\"setuptools-65.6.3-py3-none-any.whl\",\"repo\":\"pip_39_setuptools_py3_none_any_57f6f22b\",\"version\":\"3.9\"},{\"filename\":\"setuptools-65.6.3.tar.gz\",\"repo\":\"pip_39_setuptools_sdist_a7620757\",\"version\":\"3.9\"}]", - "six": "[{\"repo\":\"pip_310_six\",\"version\":\"3.10\"},{\"filename\":\"six-1.16.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_six_py2_none_any_8abb2f1d\",\"version\":\"3.9\"},{\"filename\":\"six-1.16.0.tar.gz\",\"repo\":\"pip_39_six_sdist_1e61c374\",\"version\":\"3.9\"}]", - "snowballstemmer": "[{\"repo\":\"pip_310_snowballstemmer\",\"version\":\"3.10\"},{\"filename\":\"snowballstemmer-2.2.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_snowballstemmer_py2_none_any_c8e1716e\",\"version\":\"3.9\"},{\"filename\":\"snowballstemmer-2.2.0.tar.gz\",\"repo\":\"pip_39_snowballstemmer_sdist_09b16deb\",\"version\":\"3.9\"}]", - "sphinx": "[{\"repo\":\"pip_310_sphinx\",\"version\":\"3.10\"},{\"filename\":\"sphinx-7.2.6-py3-none-any.whl\",\"repo\":\"pip_39_sphinx_py3_none_any_1e09160a\",\"version\":\"3.9\"},{\"filename\":\"sphinx-7.2.6.tar.gz\",\"repo\":\"pip_39_sphinx_sdist_9a5160e1\",\"version\":\"3.9\"}]", - "sphinxcontrib_applehelp": "[{\"repo\":\"pip_310_sphinxcontrib_applehelp\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_applehelp-1.0.7-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_applehelp_py3_none_any_094c4d56\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_applehelp-1.0.7.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_applehelp_sdist_39fdc8d7\",\"version\":\"3.9\"}]", - "sphinxcontrib_devhelp": "[{\"repo\":\"pip_310_sphinxcontrib_devhelp\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_devhelp-1.0.5-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_devhelp_py3_none_any_fe8009ae\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_devhelp-1.0.5.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_devhelp_sdist_63b41e0d\",\"version\":\"3.9\"}]", - "sphinxcontrib_htmlhelp": "[{\"repo\":\"pip_310_sphinxcontrib_htmlhelp\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_htmlhelp-2.0.4-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_htmlhelp_py3_none_any_8001661c\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_htmlhelp-2.0.4.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_htmlhelp_sdist_6c26a118\",\"version\":\"3.9\"}]", - "sphinxcontrib_jsmath": "[{\"repo\":\"pip_310_sphinxcontrib_jsmath\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib-jsmath-1.0.1.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_jsmath_sdist_a9925e4a\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_jsmath_py2_none_any_2ec2eaeb\",\"version\":\"3.9\"}]", - "sphinxcontrib_qthelp": "[{\"repo\":\"pip_310_sphinxcontrib_qthelp\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_qthelp-1.0.6-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_qthelp_py3_none_any_bf76886e\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_qthelp-1.0.6.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_qthelp_sdist_62b9d1a1\",\"version\":\"3.9\"}]", - "sphinxcontrib_serializinghtml": "[{\"repo\":\"pip_310_sphinxcontrib_serializinghtml\",\"version\":\"3.10\"},{\"filename\":\"sphinxcontrib_serializinghtml-1.1.9-py3-none-any.whl\",\"repo\":\"pip_39_sphinxcontrib_serializinghtml_py3_none_any_9b36e503\",\"version\":\"3.9\"},{\"filename\":\"sphinxcontrib_serializinghtml-1.1.9.tar.gz\",\"repo\":\"pip_39_sphinxcontrib_serializinghtml_sdist_0c64ff89\",\"version\":\"3.9\"}]", - "tabulate": "[{\"repo\":\"pip_310_tabulate\",\"version\":\"3.10\"},{\"filename\":\"tabulate-0.9.0-py3-none-any.whl\",\"repo\":\"pip_39_tabulate_py3_none_any_024ca478\",\"version\":\"3.9\"},{\"filename\":\"tabulate-0.9.0.tar.gz\",\"repo\":\"pip_39_tabulate_sdist_0095b12b\",\"version\":\"3.9\"}]", - "tomli": "[{\"repo\":\"pip_310_tomli\",\"version\":\"3.10\"},{\"filename\":\"tomli-2.0.1-py3-none-any.whl\",\"repo\":\"pip_39_tomli_py3_none_any_939de3e7\",\"version\":\"3.9\"},{\"filename\":\"tomli-2.0.1.tar.gz\",\"repo\":\"pip_39_tomli_sdist_de526c12\",\"version\":\"3.9\"}]", - "tomlkit": "[{\"repo\":\"pip_310_tomlkit\",\"version\":\"3.10\"},{\"filename\":\"tomlkit-0.11.6-py3-none-any.whl\",\"repo\":\"pip_39_tomlkit_py3_none_any_07de26b0\",\"version\":\"3.9\"},{\"filename\":\"tomlkit-0.11.6.tar.gz\",\"repo\":\"pip_39_tomlkit_sdist_71b952e5\",\"version\":\"3.9\"}]", - "typing_extensions": "[{\"repo\":\"pip_310_typing_extensions\",\"version\":\"3.10\"},{\"filename\":\"typing_extensions-4.12.2-py3-none-any.whl\",\"repo\":\"pip_39_typing_extensions_py3_none_any_04e5ca03\",\"version\":\"3.9\"},{\"filename\":\"typing_extensions-4.12.2.tar.gz\",\"repo\":\"pip_39_typing_extensions_sdist_1a7ead55\",\"version\":\"3.9\"}]", - "urllib3": "[{\"repo\":\"pip_310_urllib3\",\"version\":\"3.10\"},{\"filename\":\"urllib3-1.26.18-py2.py3-none-any.whl\",\"repo\":\"pip_39_urllib3_py2_none_any_34b97092\",\"version\":\"3.9\"},{\"filename\":\"urllib3-1.26.18.tar.gz\",\"repo\":\"pip_39_urllib3_sdist_f8ecc1bb\",\"version\":\"3.9\"}]", - "websockets": "[{\"repo\":\"pip_310_websockets\",\"version\":\"3.10\"},{\"filename\":\"websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl\",\"repo\":\"pip_39_websockets_cp39_cp39_macosx_10_9_universal2_777354ee\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"},{\"filename\":\"websockets-11.0.3-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_websockets_cp39_cp39_win_amd64_c792ea4e\",\"version\":\"3.9\"},{\"filename\":\"websockets-11.0.3-py3-none-any.whl\",\"repo\":\"pip_39_websockets_py3_none_any_6681ba9e\",\"version\":\"3.9\"},{\"filename\":\"websockets-11.0.3.tar.gz\",\"repo\":\"pip_39_websockets_sdist_88fc51d9\",\"version\":\"3.9\"}]", - "wheel": "[{\"repo\":\"pip_310_wheel\",\"version\":\"3.10\"},{\"filename\":\"wheel-0.40.0-py3-none-any.whl\",\"repo\":\"pip_39_wheel_py3_none_any_d236b20e\",\"version\":\"3.9\"},{\"filename\":\"wheel-0.40.0.tar.gz\",\"repo\":\"pip_39_wheel_sdist_cd1196f3\",\"version\":\"3.9\"}]", - "wrapt": "[{\"repo\":\"pip_310_wrapt\",\"version\":\"3.10\"},{\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"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\",\"version\":\"3.9\"},{\"filename\":\"wrapt-1.14.1-cp39-cp39-win_amd64.whl\",\"repo\":\"pip_39_wrapt_cp39_cp39_win_amd64_dee60e1d\",\"version\":\"3.9\"},{\"filename\":\"wrapt-1.14.1.tar.gz\",\"repo\":\"pip_39_wrapt_sdist_380a85cf\",\"version\":\"3.9\"}]", - "yamllint": "[{\"repo\":\"pip_310_yamllint\",\"version\":\"3.10\"},{\"filename\":\"yamllint-1.28.0-py2.py3-none-any.whl\",\"repo\":\"pip_39_yamllint_py2_none_any_89bb5b5a\",\"version\":\"3.9\"},{\"filename\":\"yamllint-1.28.0.tar.gz\",\"repo\":\"pip_39_yamllint_sdist_9e3d8ddd\",\"version\":\"3.9\"}]", - "zipp": "[{\"filename\":\"zipp-3.20.0-py3-none-any.whl\",\"repo\":\"pip_39_zipp_py3_none_any_58da6168\",\"version\":\"3.9\"},{\"filename\":\"zipp-3.20.0.tar.gz\",\"repo\":\"pip_39_zipp_sdist_0145e43d\",\"version\":\"3.9\"}]" - }, - "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-applehelp", - "sphinxcontrib-devhelp", - "sphinxcontrib-htmlhelp", - "sphinxcontrib-qthelp", - "sphinxcontrib-serializinghtml" - ] - } - } - }, - "pip_deps": { - "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", - "ruleClassName": "hub_repository", - "attributes": { - "repo_name": "pip_deps", - "extra_hub_aliases": {}, - "whl_map": { - "numpy": "[{\"repo\":\"pip_deps_310_numpy\",\"version\":\"3.10\"},{\"repo\":\"pip_deps_311_numpy\",\"version\":\"3.11\"},{\"repo\":\"pip_deps_312_numpy\",\"version\":\"3.12\"},{\"repo\":\"pip_deps_38_numpy\",\"version\":\"3.8\"},{\"repo\":\"pip_deps_39_numpy\",\"version\":\"3.9\"}]", - "setuptools": "[{\"repo\":\"pip_deps_310_setuptools\",\"version\":\"3.10\"},{\"repo\":\"pip_deps_311_setuptools\",\"version\":\"3.11\"},{\"repo\":\"pip_deps_312_setuptools\",\"version\":\"3.12\"},{\"repo\":\"pip_deps_38_setuptools\",\"version\":\"3.8\"},{\"repo\":\"pip_deps_39_setuptools\",\"version\":\"3.9\"}]" - }, - "packages": [ - "numpy", - "setuptools" - ], - "groups": {} - } - }, - "rules_fuzzing_py_deps": { - "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", - "ruleClassName": "hub_repository", - "attributes": { - "repo_name": "rules_fuzzing_py_deps", - "extra_hub_aliases": {}, - "whl_map": { - "absl_py": "[{\"repo\":\"rules_fuzzing_py_deps_310_absl_py\",\"version\":\"3.10\"},{\"repo\":\"rules_fuzzing_py_deps_311_absl_py\",\"version\":\"3.11\"},{\"repo\":\"rules_fuzzing_py_deps_312_absl_py\",\"version\":\"3.12\"},{\"repo\":\"rules_fuzzing_py_deps_38_absl_py\",\"version\":\"3.8\"},{\"repo\":\"rules_fuzzing_py_deps_39_absl_py\",\"version\":\"3.9\"}]", - "six": "[{\"repo\":\"rules_fuzzing_py_deps_310_six\",\"version\":\"3.10\"},{\"repo\":\"rules_fuzzing_py_deps_311_six\",\"version\":\"3.11\"},{\"repo\":\"rules_fuzzing_py_deps_312_six\",\"version\":\"3.12\"},{\"repo\":\"rules_fuzzing_py_deps_38_six\",\"version\":\"3.8\"},{\"repo\":\"rules_fuzzing_py_deps_39_six\",\"version\":\"3.9\"}]" - }, - "packages": [ - "absl_py", - "six" - ], - "groups": {} - } - }, - "rules_python_publish_deps": { - "bzlFile": "@@rules_python~//python/private/pypi:hub_repository.bzl", - "ruleClassName": "hub_repository", - "attributes": { - "repo_name": "rules_python_publish_deps", - "extra_hub_aliases": {}, - "whl_map": { - "backports_tarfile": "[{\"filename\":\"backports.tarfile-1.2.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7\",\"version\":\"3.11\"},{\"filename\":\"backports_tarfile-1.2.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2\",\"version\":\"3.11\"}]", - "certifi": "[{\"filename\":\"certifi-2024.8.30-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_certifi_py3_none_any_922820b5\",\"version\":\"3.11\"},{\"filename\":\"certifi-2024.8.30.tar.gz\",\"repo\":\"rules_python_publish_deps_311_certifi_sdist_bec941d2\",\"version\":\"3.11\"}]", - "cffi": "[{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_aarch64_a1ed2dd2\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_ppc64le_46bf4316\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_manylinux_2_17_s390x_a24ed04c\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.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_610faea7\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_aarch64_a9b15d49\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cffi_cp311_cp311_musllinux_1_1_x86_64_fc48c783\",\"version\":\"3.11\"},{\"filename\":\"cffi-1.17.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cffi_sdist_1c39c601\",\"version\":\"3.11\"}]", - "charset_normalizer": "[{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_0d99dd8f\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_x86_64_c57516e5\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_11_0_arm64_6dba5d19\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_bf4475b8\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_ce031db0\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_8ff4e7cd\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-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_3710a975\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_47334db7\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_f1a2f519\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_63bc5c4a\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_bcb4f8ea\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_cee4373f\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_py3_none_any_fe9f97fe\",\"version\":\"3.11\"},{\"filename\":\"charset_normalizer-3.4.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_charset_normalizer_sdist_223217c3\",\"version\":\"3.11\"}]", - "cryptography": "[{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_17_aarch64_846da004\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3-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_0f996e72\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_aarch64_f7b178f1\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_manylinux_2_28_x86_64_c2e6fc39\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_aarch64_e1be4655\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_cryptography_cp39_abi3_musllinux_1_2_x86_64_df6b6c6d\",\"version\":\"3.11\"},{\"filename\":\"cryptography-43.0.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_cryptography_sdist_315b9001\",\"version\":\"3.11\"}]", - "docutils": "[{\"filename\":\"docutils-0.21.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_docutils_py3_none_any_dafca5b9\",\"version\":\"3.11\"},{\"filename\":\"docutils-0.21.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_docutils_sdist_3a6b1873\",\"version\":\"3.11\"}]", - "idna": "[{\"filename\":\"idna-3.10-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_idna_py3_none_any_946d195a\",\"version\":\"3.11\"},{\"filename\":\"idna-3.10.tar.gz\",\"repo\":\"rules_python_publish_deps_311_idna_sdist_12f65c9b\",\"version\":\"3.11\"}]", - "importlib_metadata": "[{\"filename\":\"importlib_metadata-8.5.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_importlib_metadata_py3_none_any_45e54197\",\"version\":\"3.11\"},{\"filename\":\"importlib_metadata-8.5.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_importlib_metadata_sdist_71522656\",\"version\":\"3.11\"}]", - "jaraco_classes": "[{\"filename\":\"jaraco.classes-3.4.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b\",\"version\":\"3.11\"},{\"filename\":\"jaraco.classes-3.4.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5\",\"version\":\"3.11\"}]", - "jaraco_context": "[{\"filename\":\"jaraco.context-6.0.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48\",\"version\":\"3.11\"},{\"filename\":\"jaraco_context-6.0.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5\",\"version\":\"3.11\"}]", - "jaraco_functools": "[{\"filename\":\"jaraco.functools-4.1.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13\",\"version\":\"3.11\"},{\"filename\":\"jaraco_functools-4.1.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2\",\"version\":\"3.11\"}]", - "jeepney": "[{\"filename\":\"jeepney-0.8.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_jeepney_py3_none_any_c0a454ad\",\"version\":\"3.11\"},{\"filename\":\"jeepney-0.8.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_jeepney_sdist_5efe48d2\",\"version\":\"3.11\"}]", - "keyring": "[{\"filename\":\"keyring-25.4.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_keyring_py3_none_any_5426f817\",\"version\":\"3.11\"},{\"filename\":\"keyring-25.4.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_keyring_sdist_b07ebc55\",\"version\":\"3.11\"}]", - "markdown_it_py": "[{\"filename\":\"markdown-it-py-3.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94\",\"version\":\"3.11\"},{\"filename\":\"markdown_it_py-3.0.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684\",\"version\":\"3.11\"}]", - "mdurl": "[{\"filename\":\"mdurl-0.1.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_mdurl_py3_none_any_84008a41\",\"version\":\"3.11\"},{\"filename\":\"mdurl-0.1.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_mdurl_sdist_bb413d29\",\"version\":\"3.11\"}]", - "more_itertools": "[{\"filename\":\"more-itertools-10.5.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_more_itertools_sdist_5482bfef\",\"version\":\"3.11\"},{\"filename\":\"more_itertools-10.5.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_more_itertools_py3_none_any_037b0d32\",\"version\":\"3.11\"}]", - "nh3": "[{\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_armv7l_0411beb0\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64_5f36b271\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_armv7l.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_armv7l_3a157ab1\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18-cp37-abi3-win_amd64.whl\",\"repo\":\"rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819\",\"version\":\"3.11\"},{\"filename\":\"nh3-0.2.18.tar.gz\",\"repo\":\"rules_python_publish_deps_311_nh3_sdist_94a16692\",\"version\":\"3.11\"}]", - "pkginfo": "[{\"filename\":\"pkginfo-1.10.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2\",\"version\":\"3.11\"},{\"filename\":\"pkginfo-1.10.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pkginfo_sdist_5df73835\",\"version\":\"3.11\"}]", - "pycparser": "[{\"filename\":\"pycparser-2.22-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pycparser_py3_none_any_c3702b6d\",\"version\":\"3.11\"},{\"filename\":\"pycparser-2.22.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pycparser_sdist_491c8be9\",\"version\":\"3.11\"}]", - "pygments": "[{\"filename\":\"pygments-2.18.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0\",\"version\":\"3.11\"},{\"filename\":\"pygments-2.18.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pygments_sdist_786ff802\",\"version\":\"3.11\"}]", - "pywin32_ctypes": "[{\"filename\":\"pywin32-ctypes-0.2.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_pywin32_ctypes_sdist_d162dc04\",\"version\":\"3.11\"},{\"filename\":\"pywin32_ctypes-0.2.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_pywin32_ctypes_py3_none_any_8a151337\",\"version\":\"3.11\"}]", - "readme_renderer": "[{\"filename\":\"readme_renderer-44.0-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b\",\"version\":\"3.11\"},{\"filename\":\"readme_renderer-44.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_readme_renderer_sdist_8712034e\",\"version\":\"3.11\"}]", - "requests": "[{\"filename\":\"requests-2.32.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_requests_py3_none_any_70761cfe\",\"version\":\"3.11\"},{\"filename\":\"requests-2.32.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_requests_sdist_55365417\",\"version\":\"3.11\"}]", - "requests_toolbelt": "[{\"filename\":\"requests-toolbelt-1.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3\",\"version\":\"3.11\"},{\"filename\":\"requests_toolbelt-1.0.0-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66\",\"version\":\"3.11\"}]", - "rfc3986": "[{\"filename\":\"rfc3986-2.0.0-py2.py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_rfc3986_py2_none_any_50b1502b\",\"version\":\"3.11\"},{\"filename\":\"rfc3986-2.0.0.tar.gz\",\"repo\":\"rules_python_publish_deps_311_rfc3986_sdist_97aacf9d\",\"version\":\"3.11\"}]", - "rich": "[{\"filename\":\"rich-13.9.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_rich_py3_none_any_9836f509\",\"version\":\"3.11\"},{\"filename\":\"rich-13.9.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_rich_sdist_bc1e01b8\",\"version\":\"3.11\"}]", - "secretstorage": "[{\"filename\":\"SecretStorage-3.3.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_secretstorage_py3_none_any_f356e662\",\"version\":\"3.11\"},{\"filename\":\"SecretStorage-3.3.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_secretstorage_sdist_2403533e\",\"version\":\"3.11\"}]", - "twine": "[{\"filename\":\"twine-5.1.1-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_twine_py3_none_any_215dbe7b\",\"version\":\"3.11\"},{\"filename\":\"twine-5.1.1.tar.gz\",\"repo\":\"rules_python_publish_deps_311_twine_sdist_9aa08251\",\"version\":\"3.11\"}]", - "urllib3": "[{\"filename\":\"urllib3-2.2.3-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_urllib3_py3_none_any_ca899ca0\",\"version\":\"3.11\"},{\"filename\":\"urllib3-2.2.3.tar.gz\",\"repo\":\"rules_python_publish_deps_311_urllib3_sdist_e7d814a8\",\"version\":\"3.11\"}]", - "zipp": "[{\"filename\":\"zipp-3.20.2-py3-none-any.whl\",\"repo\":\"rules_python_publish_deps_311_zipp_py3_none_any_a817ac80\",\"version\":\"3.11\"},{\"filename\":\"zipp-3.20.2.tar.gz\",\"repo\":\"rules_python_publish_deps_311_zipp_sdist_bc9eb26f\",\"version\":\"3.11\"}]" - }, - "packages": [ - "backports_tarfile", - "certifi", - "charset_normalizer", - "docutils", - "idna", - "importlib_metadata", - "jaraco_classes", - "jaraco_context", - "jaraco_functools", - "keyring", - "markdown_it_py", - "mdurl", - "more_itertools", - "nh3", - "pkginfo", - "pygments", - "readme_renderer", - "requests", - "requests_toolbelt", - "rfc3986", - "rich", - "twine", - "urllib3", - "zipp" - ], - "groups": {} - } - } - }, - "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_12_host", - "rules_python~~python~python_3_12_host" - ], - [ - "rules_python~~python~pythons_hub", - "python_3_8_host", - "rules_python~~python~python_3_8_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": "wVkXn96Vi6Bn1BRJ4R0bOAbUFvh4k54kimcXSd11Y3g=", - "usagesDigest": "wWx9DCrTsAgJQmDRUcO+EJrPKJEDsXpZbjzC0HVdde0=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "uv_darwin_aarch64": { - "bzlFile": "@@rules_python~//python/uv:repositories.bzl", - "ruleClassName": "uv_repository", - "attributes": { - "uv_version": "0.4.25", - "platform": "aarch64-apple-darwin" - } - }, - "uv_linux_aarch64": { - "bzlFile": "@@rules_python~//python/uv:repositories.bzl", - "ruleClassName": "uv_repository", - "attributes": { - "uv_version": "0.4.25", - "platform": "aarch64-unknown-linux-gnu" - } - }, - "uv_linux_ppc": { - "bzlFile": "@@rules_python~//python/uv:repositories.bzl", - "ruleClassName": "uv_repository", - "attributes": { - "uv_version": "0.4.25", - "platform": "powerpc64le-unknown-linux-gnu" - } - }, - "uv_linux_s390x": { - "bzlFile": "@@rules_python~//python/uv:repositories.bzl", - "ruleClassName": "uv_repository", - "attributes": { - "uv_version": "0.4.25", - "platform": "s390x-unknown-linux-gnu" - } - }, - "uv_darwin_x86_64": { - "bzlFile": "@@rules_python~//python/uv:repositories.bzl", - "ruleClassName": "uv_repository", - "attributes": { - "uv_version": "0.4.25", - "platform": "x86_64-apple-darwin" - } - }, - "uv_windows_x86_64": { - "bzlFile": "@@rules_python~//python/uv:repositories.bzl", - "ruleClassName": "uv_repository", - "attributes": { - "uv_version": "0.4.25", - "platform": "x86_64-pc-windows-msvc" - } - }, - "uv_linux_x86_64": { - "bzlFile": "@@rules_python~//python/uv:repositories.bzl", - "ruleClassName": "uv_repository", - "attributes": { - "uv_version": "0.4.25", - "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" - ] - } - } - } - }, - "recordedRepoMappingEntries": [] - } - }, - "@@rules_rust~//crate_universe/private/module_extensions:cargo_bazel_bootstrap.bzl%cargo_bazel_bootstrap": { - "general": { - "bzlTransitiveDigest": "B8WsJBV07QocRZyJpcpPrz2sBEXnuRX/NkMzzdK7VGo=", - "usagesDigest": "Px5eLkmOaPhHIX5H4XHyIjcMMK3q6EPBhh+eyBRU01M=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "cargo_bazel_bootstrap": { - "bzlFile": "@@rules_rust~//cargo/private:cargo_bootstrap.bzl", - "ruleClassName": "cargo_bootstrap_repository", - "attributes": { - "srcs": [ - "@@rules_rust~//crate_universe:src/api.rs", - "@@rules_rust~//crate_universe:src/api/lockfile.rs", - "@@rules_rust~//crate_universe:src/cli.rs", - "@@rules_rust~//crate_universe:src/cli/generate.rs", - "@@rules_rust~//crate_universe:src/cli/query.rs", - "@@rules_rust~//crate_universe:src/cli/splice.rs", - "@@rules_rust~//crate_universe:src/cli/vendor.rs", - "@@rules_rust~//crate_universe:src/config.rs", - "@@rules_rust~//crate_universe:src/context.rs", - "@@rules_rust~//crate_universe:src/context/crate_context.rs", - "@@rules_rust~//crate_universe:src/context/platforms.rs", - "@@rules_rust~//crate_universe:src/lib.rs", - "@@rules_rust~//crate_universe:src/lockfile.rs", - "@@rules_rust~//crate_universe:src/main.rs", - "@@rules_rust~//crate_universe:src/metadata.rs", - "@@rules_rust~//crate_universe:src/metadata/cargo_bin.rs", - "@@rules_rust~//crate_universe:src/metadata/cargo_tree_resolver.rs", - "@@rules_rust~//crate_universe:src/metadata/cargo_tree_rustc_wrapper.bat", - "@@rules_rust~//crate_universe:src/metadata/cargo_tree_rustc_wrapper.sh", - "@@rules_rust~//crate_universe:src/metadata/dependency.rs", - "@@rules_rust~//crate_universe:src/metadata/metadata_annotation.rs", - "@@rules_rust~//crate_universe:src/rendering.rs", - "@@rules_rust~//crate_universe:src/rendering/template_engine.rs", - "@@rules_rust~//crate_universe:src/rendering/templates/module_bzl.j2", - "@@rules_rust~//crate_universe:src/rendering/templates/partials/header.j2", - "@@rules_rust~//crate_universe:src/rendering/templates/partials/module/aliases_map.j2", - "@@rules_rust~//crate_universe:src/rendering/templates/partials/module/deps_map.j2", - "@@rules_rust~//crate_universe:src/rendering/templates/partials/module/repo_git.j2", - "@@rules_rust~//crate_universe:src/rendering/templates/partials/module/repo_http.j2", - "@@rules_rust~//crate_universe:src/rendering/templates/vendor_module.j2", - "@@rules_rust~//crate_universe:src/rendering/verbatim/alias_rules.bzl", - "@@rules_rust~//crate_universe:src/select.rs", - "@@rules_rust~//crate_universe:src/splicing.rs", - "@@rules_rust~//crate_universe:src/splicing/cargo_config.rs", - "@@rules_rust~//crate_universe:src/splicing/crate_index_lookup.rs", - "@@rules_rust~//crate_universe:src/splicing/splicer.rs", - "@@rules_rust~//crate_universe:src/test.rs", - "@@rules_rust~//crate_universe:src/utils.rs", - "@@rules_rust~//crate_universe:src/utils/starlark.rs", - "@@rules_rust~//crate_universe:src/utils/starlark/glob.rs", - "@@rules_rust~//crate_universe:src/utils/starlark/label.rs", - "@@rules_rust~//crate_universe:src/utils/starlark/select.rs", - "@@rules_rust~//crate_universe:src/utils/starlark/select_dict.rs", - "@@rules_rust~//crate_universe:src/utils/starlark/select_list.rs", - "@@rules_rust~//crate_universe:src/utils/starlark/select_scalar.rs", - "@@rules_rust~//crate_universe:src/utils/starlark/select_set.rs", - "@@rules_rust~//crate_universe:src/utils/starlark/serialize.rs", - "@@rules_rust~//crate_universe:src/utils/starlark/target_compatible_with.rs", - "@@rules_rust~//crate_universe:src/utils/symlink.rs", - "@@rules_rust~//crate_universe:src/utils/target_triple.rs" - ], - "binary": "cargo-bazel", - "cargo_lockfile": "@@rules_rust~//crate_universe:Cargo.lock", - "cargo_toml": "@@rules_rust~//crate_universe:Cargo.toml", - "version": "1.82.0", - "timeout": 900, - "rust_toolchain_cargo_template": "@rust_host_tools//:bin/{tool}", - "rust_toolchain_rustc_template": "@rust_host_tools//:bin/{tool}" - } - } - }, - "recordedRepoMappingEntries": [ - [ - "rules_rust~", - "bazel_skylib", - "bazel_skylib~" - ], - [ - "rules_rust~", - "bazel_tools", - "bazel_tools" - ], - [ - "rules_rust~", - "rules_cc", - "rules_cc~" - ], - [ - "rules_rust~", - "rules_rust", - "rules_rust~" - ] - ] - } - }, - "@@rules_rust~//rust/private:extensions.bzl%i": { - "general": { - "bzlTransitiveDigest": "7THCCXEgTD5rKhzOeXPXMKTpneJiPj3KWvzc3a4vfIQ=", - "usagesDigest": "Byp71qgn+okZohgPAMBnJSfC0Zakvovpovv2vJ2y0pI=", - "recordedFileInputs": {}, - "recordedDirentsInputs": {}, - "envVariables": {}, - "generatedRepoSpecs": { - "rules_rust_tinyjson": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9ab95735ea2c8fd51154d01e39cf13912a78071c2d89abc49a7ef102a7dd725a", - "url": "https://static.crates.io/crates/tinyjson/tinyjson-2.5.1.crate", - "strip_prefix": "tinyjson-2.5.1", - "type": "tar.gz", - "build_file": "@@rules_rust~//util/process_wrapper:BUILD.tinyjson.bazel" - } - }, - "cui": { - "bzlFile": "@@rules_rust~//crate_universe/private:crates_vendor.bzl", - "ruleClassName": "crates_vendor_remote_repository", - "attributes": { - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.bazel", - "defs_module": "@@rules_rust~//crate_universe/3rdparty/crates:defs.bzl" - } - }, - "cui__adler-1.0.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/adler/1.0.2/download" - ], - "strip_prefix": "adler-1.0.2", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.adler-1.0.2.bazel" - } - }, - "cui__ahash-0.8.11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/ahash/0.8.11/download" - ], - "strip_prefix": "ahash-0.8.11", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.ahash-0.8.11.bazel" - } - }, - "cui__aho-corasick-1.0.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/aho-corasick/1.0.2/download" - ], - "strip_prefix": "aho-corasick-1.0.2", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.aho-corasick-1.0.2.bazel" - } - }, - "cui__allocator-api2-0.2.18": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/allocator-api2/0.2.18/download" - ], - "strip_prefix": "allocator-api2-0.2.18", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.allocator-api2-0.2.18.bazel" - } - }, - "cui__anstream-0.3.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anstream/0.3.2/download" - ], - "strip_prefix": "anstream-0.3.2", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.anstream-0.3.2.bazel" - } - }, - "cui__anstyle-1.0.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anstyle/1.0.1/download" - ], - "strip_prefix": "anstyle-1.0.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.anstyle-1.0.1.bazel" - } - }, - "cui__anstyle-parse-0.2.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anstyle-parse/0.2.1/download" - ], - "strip_prefix": "anstyle-parse-0.2.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.anstyle-parse-0.2.1.bazel" - } - }, - "cui__anstyle-query-1.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anstyle-query/1.0.0/download" - ], - "strip_prefix": "anstyle-query-1.0.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.anstyle-query-1.0.0.bazel" - } - }, - "cui__anstyle-wincon-1.0.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anstyle-wincon/1.0.1/download" - ], - "strip_prefix": "anstyle-wincon-1.0.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.anstyle-wincon-1.0.1.bazel" - } - }, - "cui__anyhow-1.0.89": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anyhow/1.0.89/download" - ], - "strip_prefix": "anyhow-1.0.89", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.anyhow-1.0.89.bazel" - } - }, - "cui__arc-swap-1.6.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/arc-swap/1.6.0/download" - ], - "strip_prefix": "arc-swap-1.6.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.arc-swap-1.6.0.bazel" - } - }, - "cui__arrayvec-0.7.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/arrayvec/0.7.4/download" - ], - "strip_prefix": "arrayvec-0.7.4", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.arrayvec-0.7.4.bazel" - } - }, - "cui__autocfg-1.1.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/autocfg/1.1.0/download" - ], - "strip_prefix": "autocfg-1.1.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.autocfg-1.1.0.bazel" - } - }, - "cui__bitflags-1.3.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/bitflags/1.3.2/download" - ], - "strip_prefix": "bitflags-1.3.2", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.bitflags-1.3.2.bazel" - } - }, - "cui__bitflags-2.4.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/bitflags/2.4.1/download" - ], - "strip_prefix": "bitflags-2.4.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.bitflags-2.4.1.bazel" - } - }, - "cui__block-buffer-0.10.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/block-buffer/0.10.4/download" - ], - "strip_prefix": "block-buffer-0.10.4", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.block-buffer-0.10.4.bazel" - } - }, - "cui__bstr-1.6.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/bstr/1.6.0/download" - ], - "strip_prefix": "bstr-1.6.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.bstr-1.6.0.bazel" - } - }, - "cui__camino-1.1.9": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/camino/1.1.9/download" - ], - "strip_prefix": "camino-1.1.9", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.camino-1.1.9.bazel" - } - }, - "cui__cargo-lock-10.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "49f8d8bb8836f681fe20ad10faa7796a11e67dbb6125e5a38f88ddd725c217e8", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/cargo-lock/10.0.0/download" - ], - "strip_prefix": "cargo-lock-10.0.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.cargo-lock-10.0.0.bazel" - } - }, - "cui__cargo-platform-0.1.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/cargo-platform/0.1.7/download" - ], - "strip_prefix": "cargo-platform-0.1.7", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.cargo-platform-0.1.7.bazel" - } - }, - "cui__cargo_metadata-0.18.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/cargo_metadata/0.18.1/download" - ], - "strip_prefix": "cargo_metadata-0.18.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.cargo_metadata-0.18.1.bazel" - } - }, - "cui__cargo_toml-0.20.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "88da5a13c620b4ca0078845707ea9c3faf11edbc3ffd8497d11d686211cd1ac0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/cargo_toml/0.20.5/download" - ], - "strip_prefix": "cargo_toml-0.20.5", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.cargo_toml-0.20.5.bazel" - } - }, - "cui__cfg-expr-0.17.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d0890061c4d3223e7267f3bad2ec40b997d64faac1c2815a4a9d95018e2b9e9c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/cfg-expr/0.17.0/download" - ], - "strip_prefix": "cfg-expr-0.17.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.cfg-expr-0.17.0.bazel" - } - }, - "cui__cfg-if-1.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/cfg-if/1.0.0/download" - ], - "strip_prefix": "cfg-if-1.0.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.cfg-if-1.0.0.bazel" - } - }, - "cui__clap-4.3.11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1640e5cc7fb47dbb8338fd471b105e7ed6c3cb2aeb00c2e067127ffd3764a05d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/clap/4.3.11/download" - ], - "strip_prefix": "clap-4.3.11", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.clap-4.3.11.bazel" - } - }, - "cui__clap_builder-4.3.11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "98c59138d527eeaf9b53f35a77fcc1fad9d883116070c63d5de1c7dc7b00c72b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/clap_builder/4.3.11/download" - ], - "strip_prefix": "clap_builder-4.3.11", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.clap_builder-4.3.11.bazel" - } - }, - "cui__clap_derive-4.3.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/clap_derive/4.3.2/download" - ], - "strip_prefix": "clap_derive-4.3.2", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.clap_derive-4.3.2.bazel" - } - }, - "cui__clap_lex-0.5.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/clap_lex/0.5.0/download" - ], - "strip_prefix": "clap_lex-0.5.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.clap_lex-0.5.0.bazel" - } - }, - "cui__clru-0.6.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b8191fa7302e03607ff0e237d4246cc043ff5b3cb9409d995172ba3bea16b807", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/clru/0.6.1/download" - ], - "strip_prefix": "clru-0.6.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.clru-0.6.1.bazel" - } - }, - "cui__colorchoice-1.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/colorchoice/1.0.0/download" - ], - "strip_prefix": "colorchoice-1.0.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.colorchoice-1.0.0.bazel" - } - }, - "cui__cpufeatures-0.2.9": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/cpufeatures/0.2.9/download" - ], - "strip_prefix": "cpufeatures-0.2.9", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.cpufeatures-0.2.9.bazel" - } - }, - "cui__crates-index-3.2.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "45fbf3a2a2f3435363fb343f30ee31d9f63ea3862d6eab639446c1393d82cd32", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/crates-index/3.2.0/download" - ], - "strip_prefix": "crates-index-3.2.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.crates-index-3.2.0.bazel" - } - }, - "cui__crc32fast-1.3.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/crc32fast/1.3.2/download" - ], - "strip_prefix": "crc32fast-1.3.2", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.crc32fast-1.3.2.bazel" - } - }, - "cui__crossbeam-channel-0.5.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/crossbeam-channel/0.5.8/download" - ], - "strip_prefix": "crossbeam-channel-0.5.8", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.crossbeam-channel-0.5.8.bazel" - } - }, - "cui__crossbeam-utils-0.8.16": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/crossbeam-utils/0.8.16/download" - ], - "strip_prefix": "crossbeam-utils-0.8.16", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.crossbeam-utils-0.8.16.bazel" - } - }, - "cui__crypto-common-0.1.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/crypto-common/0.1.6/download" - ], - "strip_prefix": "crypto-common-0.1.6", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.crypto-common-0.1.6.bazel" - } - }, - "cui__digest-0.10.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/digest/0.10.7/download" - ], - "strip_prefix": "digest-0.10.7", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.digest-0.10.7.bazel" - } - }, - "cui__dunce-1.0.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/dunce/1.0.4/download" - ], - "strip_prefix": "dunce-1.0.4", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.dunce-1.0.4.bazel" - } - }, - "cui__either-1.9.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/either/1.9.0/download" - ], - "strip_prefix": "either-1.9.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.either-1.9.0.bazel" - } - }, - "cui__encoding_rs-0.8.33": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/encoding_rs/0.8.33/download" - ], - "strip_prefix": "encoding_rs-0.8.33", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.encoding_rs-0.8.33.bazel" - } - }, - "cui__equivalent-1.0.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/equivalent/1.0.1/download" - ], - "strip_prefix": "equivalent-1.0.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.equivalent-1.0.1.bazel" - } - }, - "cui__errno-0.3.9": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/errno/0.3.9/download" - ], - "strip_prefix": "errno-0.3.9", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.errno-0.3.9.bazel" - } - }, - "cui__faster-hex-0.9.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a2a2b11eda1d40935b26cf18f6833c526845ae8c41e58d09af6adeb6f0269183", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/faster-hex/0.9.0/download" - ], - "strip_prefix": "faster-hex-0.9.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.faster-hex-0.9.0.bazel" - } - }, - "cui__fastrand-2.1.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/fastrand/2.1.1/download" - ], - "strip_prefix": "fastrand-2.1.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.fastrand-2.1.1.bazel" - } - }, - "cui__filetime-0.2.22": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/filetime/0.2.22/download" - ], - "strip_prefix": "filetime-0.2.22", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.filetime-0.2.22.bazel" - } - }, - "cui__flate2-1.0.28": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/flate2/1.0.28/download" - ], - "strip_prefix": "flate2-1.0.28", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.flate2-1.0.28.bazel" - } - }, - "cui__fnv-1.0.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/fnv/1.0.7/download" - ], - "strip_prefix": "fnv-1.0.7", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.fnv-1.0.7.bazel" - } - }, - "cui__form_urlencoded-1.2.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/form_urlencoded/1.2.1/download" - ], - "strip_prefix": "form_urlencoded-1.2.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.form_urlencoded-1.2.1.bazel" - } - }, - "cui__generic-array-0.14.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/generic-array/0.14.7/download" - ], - "strip_prefix": "generic-array-0.14.7", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.generic-array-0.14.7.bazel" - } - }, - "cui__gix-0.66.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9048b8d1ae2104f045cb37e5c450fc49d5d8af22609386bfc739c11ba88995eb", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix/0.66.0/download" - ], - "strip_prefix": "gix-0.66.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-0.66.0.bazel" - } - }, - "cui__gix-actor-0.32.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "fc19e312cd45c4a66cd003f909163dc2f8e1623e30a0c0c6df3776e89b308665", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-actor/0.32.0/download" - ], - "strip_prefix": "gix-actor-0.32.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-actor-0.32.0.bazel" - } - }, - "cui__gix-attributes-0.22.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ebccbf25aa4a973dd352564a9000af69edca90623e8a16dad9cbc03713131311", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-attributes/0.22.5/download" - ], - "strip_prefix": "gix-attributes-0.22.5", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-attributes-0.22.5.bazel" - } - }, - "cui__gix-bitmap-0.2.11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a371db66cbd4e13f0ed9dc4c0fea712d7276805fccc877f77e96374d317e87ae", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-bitmap/0.2.11/download" - ], - "strip_prefix": "gix-bitmap-0.2.11", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-bitmap-0.2.11.bazel" - } - }, - "cui__gix-chunk-0.4.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "45c8751169961ba7640b513c3b24af61aa962c967aaf04116734975cd5af0c52", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-chunk/0.4.8/download" - ], - "strip_prefix": "gix-chunk-0.4.8", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-chunk-0.4.8.bazel" - } - }, - "cui__gix-command-0.3.9": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "dff2e692b36bbcf09286c70803006ca3fd56551a311de450be317a0ab8ea92e7", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-command/0.3.9/download" - ], - "strip_prefix": "gix-command-0.3.9", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-command-0.3.9.bazel" - } - }, - "cui__gix-commitgraph-0.24.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "133b06f67f565836ec0c473e2116a60fb74f80b6435e21d88013ac0e3c60fc78", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-commitgraph/0.24.3/download" - ], - "strip_prefix": "gix-commitgraph-0.24.3", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-commitgraph-0.24.3.bazel" - } - }, - "cui__gix-config-0.40.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "78e797487e6ca3552491de1131b4f72202f282fb33f198b1c34406d765b42bb0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-config/0.40.0/download" - ], - "strip_prefix": "gix-config-0.40.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-config-0.40.0.bazel" - } - }, - "cui__gix-config-value-0.14.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "03f76169faa0dec598eac60f83d7fcdd739ec16596eca8fb144c88973dbe6f8c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-config-value/0.14.8/download" - ], - "strip_prefix": "gix-config-value-0.14.8", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-config-value-0.14.8.bazel" - } - }, - "cui__gix-credentials-0.24.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8ce391d305968782f1ae301c4a3d42c5701df7ff1d8bc03740300f6fd12bce78", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-credentials/0.24.5/download" - ], - "strip_prefix": "gix-credentials-0.24.5", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-credentials-0.24.5.bazel" - } - }, - "cui__gix-date-0.9.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "35c84b7af01e68daf7a6bb8bb909c1ff5edb3ce4326f1f43063a5a96d3c3c8a5", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-date/0.9.0/download" - ], - "strip_prefix": "gix-date-0.9.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-date-0.9.0.bazel" - } - }, - "cui__gix-diff-0.46.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "92c9afd80fff00f8b38b1c1928442feb4cd6d2232a6ed806b6b193151a3d336c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-diff/0.46.0/download" - ], - "strip_prefix": "gix-diff-0.46.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-diff-0.46.0.bazel" - } - }, - "cui__gix-discover-0.35.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0577366b9567376bc26e815fd74451ebd0e6218814e242f8e5b7072c58d956d2", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-discover/0.35.0/download" - ], - "strip_prefix": "gix-discover-0.35.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-discover-0.35.0.bazel" - } - }, - "cui__gix-features-0.38.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ac7045ac9fe5f9c727f38799d002a7ed3583cd777e3322a7c4b43e3cf437dc69", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-features/0.38.2/download" - ], - "strip_prefix": "gix-features-0.38.2", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-features-0.38.2.bazel" - } - }, - "cui__gix-filter-0.13.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4121790ae140066e5b953becc72e7496278138d19239be2e63b5067b0843119e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-filter/0.13.0/download" - ], - "strip_prefix": "gix-filter-0.13.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-filter-0.13.0.bazel" - } - }, - "cui__gix-fs-0.11.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f2bfe6249cfea6d0c0e0990d5226a4cb36f030444ba9e35e0639275db8f98575", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-fs/0.11.3/download" - ], - "strip_prefix": "gix-fs-0.11.3", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-fs-0.11.3.bazel" - } - }, - "cui__gix-glob-0.16.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "74908b4bbc0a0a40852737e5d7889f676f081e340d5451a16e5b4c50d592f111", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-glob/0.16.5/download" - ], - "strip_prefix": "gix-glob-0.16.5", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-glob-0.16.5.bazel" - } - }, - "cui__gix-hash-0.14.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f93d7df7366121b5018f947a04d37f034717e113dcf9ccd85c34b58e57a74d5e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-hash/0.14.2/download" - ], - "strip_prefix": "gix-hash-0.14.2", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-hash-0.14.2.bazel" - } - }, - "cui__gix-hashtable-0.5.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7ddf80e16f3c19ac06ce415a38b8591993d3f73aede049cb561becb5b3a8e242", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-hashtable/0.5.2/download" - ], - "strip_prefix": "gix-hashtable-0.5.2", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-hashtable-0.5.2.bazel" - } - }, - "cui__gix-ignore-0.11.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e447cd96598460f5906a0f6c75e950a39f98c2705fc755ad2f2020c9e937fab7", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-ignore/0.11.4/download" - ], - "strip_prefix": "gix-ignore-0.11.4", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-ignore-0.11.4.bazel" - } - }, - "cui__gix-index-0.35.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0cd4203244444017682176e65fd0180be9298e58ed90bd4a8489a357795ed22d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-index/0.35.0/download" - ], - "strip_prefix": "gix-index-0.35.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-index-0.35.0.bazel" - } - }, - "cui__gix-lock-14.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e3bc7fe297f1f4614774989c00ec8b1add59571dc9b024b4c00acb7dedd4e19d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-lock/14.0.0/download" - ], - "strip_prefix": "gix-lock-14.0.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-lock-14.0.0.bazel" - } - }, - "cui__gix-negotiate-0.15.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b4063bf329a191a9e24b6f948a17ccf6698c0380297f5e169cee4f1d2ab9475b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-negotiate/0.15.0/download" - ], - "strip_prefix": "gix-negotiate-0.15.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-negotiate-0.15.0.bazel" - } - }, - "cui__gix-object-0.44.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2f5b801834f1de7640731820c2df6ba88d95480dc4ab166a5882f8ff12b88efa", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-object/0.44.0/download" - ], - "strip_prefix": "gix-object-0.44.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-object-0.44.0.bazel" - } - }, - "cui__gix-odb-0.63.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a3158068701c17df54f0ab2adda527f5a6aca38fd5fd80ceb7e3c0a2717ec747", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-odb/0.63.0/download" - ], - "strip_prefix": "gix-odb-0.63.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-odb-0.63.0.bazel" - } - }, - "cui__gix-pack-0.53.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3223aa342eee21e1e0e403cad8ae9caf9edca55ef84c347738d10681676fd954", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-pack/0.53.0/download" - ], - "strip_prefix": "gix-pack-0.53.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-pack-0.53.0.bazel" - } - }, - "cui__gix-packetline-0.17.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8c43ef4d5fe2fa222c606731c8bdbf4481413ee4ef46d61340ec39e4df4c5e49", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-packetline/0.17.6/download" - ], - "strip_prefix": "gix-packetline-0.17.6", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-packetline-0.17.6.bazel" - } - }, - "cui__gix-packetline-blocking-0.17.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b9802304baa798dd6f5ff8008a2b6516d54b74a69ca2d3a2b9e2d6c3b5556b40", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-packetline-blocking/0.17.5/download" - ], - "strip_prefix": "gix-packetline-blocking-0.17.5", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-packetline-blocking-0.17.5.bazel" - } - }, - "cui__gix-path-0.10.11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ebfc4febd088abdcbc9f1246896e57e37b7a34f6909840045a1767c6dafac7af", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-path/0.10.11/download" - ], - "strip_prefix": "gix-path-0.10.11", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-path-0.10.11.bazel" - } - }, - "cui__gix-pathspec-0.7.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5d23bf239532b4414d0e63b8ab3a65481881f7237ed9647bb10c1e3cc54c5ceb", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-pathspec/0.7.7/download" - ], - "strip_prefix": "gix-pathspec-0.7.7", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-pathspec-0.7.7.bazel" - } - }, - "cui__gix-prompt-0.8.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "74fde865cdb46b30d8dad1293385d9bcf998d3a39cbf41bee67d0dab026fe6b1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-prompt/0.8.7/download" - ], - "strip_prefix": "gix-prompt-0.8.7", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-prompt-0.8.7.bazel" - } - }, - "cui__gix-protocol-0.45.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "cc43a1006f01b5efee22a003928c9eb83dde2f52779ded9d4c0732ad93164e3e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-protocol/0.45.3/download" - ], - "strip_prefix": "gix-protocol-0.45.3", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-protocol-0.45.3.bazel" - } - }, - "cui__gix-quote-0.4.12": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "cbff4f9b9ea3fa7a25a70ee62f545143abef624ac6aa5884344e70c8b0a1d9ff", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-quote/0.4.12/download" - ], - "strip_prefix": "gix-quote-0.4.12", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-quote-0.4.12.bazel" - } - }, - "cui__gix-ref-0.47.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ae0d8406ebf9aaa91f55a57f053c5a1ad1a39f60fdf0303142b7be7ea44311e5", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-ref/0.47.0/download" - ], - "strip_prefix": "gix-ref-0.47.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-ref-0.47.0.bazel" - } - }, - "cui__gix-refspec-0.25.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ebb005f82341ba67615ffdd9f7742c87787544441c88090878393d0682869ca6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-refspec/0.25.0/download" - ], - "strip_prefix": "gix-refspec-0.25.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-refspec-0.25.0.bazel" - } - }, - "cui__gix-revision-0.29.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ba4621b219ac0cdb9256883030c3d56a6c64a6deaa829a92da73b9a576825e1e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-revision/0.29.0/download" - ], - "strip_prefix": "gix-revision-0.29.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-revision-0.29.0.bazel" - } - }, - "cui__gix-revwalk-0.15.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b41e72544b93084ee682ef3d5b31b1ba4d8fa27a017482900e5e044d5b1b3984", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-revwalk/0.15.0/download" - ], - "strip_prefix": "gix-revwalk-0.15.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-revwalk-0.15.0.bazel" - } - }, - "cui__gix-sec-0.10.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0fe4d52f30a737bbece5276fab5d3a8b276dc2650df963e293d0673be34e7a5f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-sec/0.10.8/download" - ], - "strip_prefix": "gix-sec-0.10.8", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-sec-0.10.8.bazel" - } - }, - "cui__gix-submodule-0.14.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "529d0af78cc2f372b3218f15eb1e3d1635a21c8937c12e2dd0b6fc80c2ca874b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-submodule/0.14.0/download" - ], - "strip_prefix": "gix-submodule-0.14.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-submodule-0.14.0.bazel" - } - }, - "cui__gix-tempfile-14.0.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "046b4927969fa816a150a0cda2e62c80016fe11fb3c3184e4dddf4e542f108aa", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-tempfile/14.0.2/download" - ], - "strip_prefix": "gix-tempfile-14.0.2", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-tempfile-14.0.2.bazel" - } - }, - "cui__gix-trace-0.1.10": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "6cae0e8661c3ff92688ce1c8b8058b3efb312aba9492bbe93661a21705ab431b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-trace/0.1.10/download" - ], - "strip_prefix": "gix-trace-0.1.10", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-trace-0.1.10.bazel" - } - }, - "cui__gix-transport-0.42.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "421dcccab01b41a15d97b226ad97a8f9262295044e34fbd37b10e493b0a6481f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-transport/0.42.3/download" - ], - "strip_prefix": "gix-transport-0.42.3", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-transport-0.42.3.bazel" - } - }, - "cui__gix-traverse-0.41.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "030da39af94e4df35472e9318228f36530989327906f38e27807df305fccb780", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-traverse/0.41.0/download" - ], - "strip_prefix": "gix-traverse-0.41.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-traverse-0.41.0.bazel" - } - }, - "cui__gix-url-0.27.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "fd280c5e84fb22e128ed2a053a0daeacb6379469be6a85e3d518a0636e160c89", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-url/0.27.5/download" - ], - "strip_prefix": "gix-url-0.27.5", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-url-0.27.5.bazel" - } - }, - "cui__gix-utils-0.1.12": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "35192df7fd0fa112263bad8021e2df7167df4cc2a6e6d15892e1e55621d3d4dc", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-utils/0.1.12/download" - ], - "strip_prefix": "gix-utils-0.1.12", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-utils-0.1.12.bazel" - } - }, - "cui__gix-validate-0.9.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "81f2badbb64e57b404593ee26b752c26991910fd0d81fe6f9a71c1a8309b6c86", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-validate/0.9.0/download" - ], - "strip_prefix": "gix-validate-0.9.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-validate-0.9.0.bazel" - } - }, - "cui__gix-worktree-0.36.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "c312ad76a3f2ba8e865b360d5cb3aa04660971d16dec6dd0ce717938d903149a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gix-worktree/0.36.0/download" - ], - "strip_prefix": "gix-worktree-0.36.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.gix-worktree-0.36.0.bazel" - } - }, - "cui__globset-0.4.11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1391ab1f92ffcc08911957149833e682aa3fe252b9f45f966d2ef972274c97df", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/globset/0.4.11/download" - ], - "strip_prefix": "globset-0.4.11", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.globset-0.4.11.bazel" - } - }, - "cui__globwalk-0.8.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/globwalk/0.8.1/download" - ], - "strip_prefix": "globwalk-0.8.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.globwalk-0.8.1.bazel" - } - }, - "cui__hashbrown-0.14.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/hashbrown/0.14.3/download" - ], - "strip_prefix": "hashbrown-0.14.3", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.hashbrown-0.14.3.bazel" - } - }, - "cui__hashbrown-0.15.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/hashbrown/0.15.0/download" - ], - "strip_prefix": "hashbrown-0.15.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.hashbrown-0.15.0.bazel" - } - }, - "cui__heck-0.4.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/heck/0.4.1/download" - ], - "strip_prefix": "heck-0.4.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.heck-0.4.1.bazel" - } - }, - "cui__hermit-abi-0.3.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/hermit-abi/0.3.2/download" - ], - "strip_prefix": "hermit-abi-0.3.2", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.hermit-abi-0.3.2.bazel" - } - }, - "cui__hex-0.4.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/hex/0.4.3/download" - ], - "strip_prefix": "hex-0.4.3", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.hex-0.4.3.bazel" - } - }, - "cui__home-0.5.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/home/0.5.5/download" - ], - "strip_prefix": "home-0.5.5", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.home-0.5.5.bazel" - } - }, - "cui__idna-0.5.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/idna/0.5.0/download" - ], - "strip_prefix": "idna-0.5.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.idna-0.5.0.bazel" - } - }, - "cui__ignore-0.4.18": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/ignore/0.4.18/download" - ], - "strip_prefix": "ignore-0.4.18", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.ignore-0.4.18.bazel" - } - }, - "cui__indexmap-2.6.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/indexmap/2.6.0/download" - ], - "strip_prefix": "indexmap-2.6.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.indexmap-2.6.0.bazel" - } - }, - "cui__indoc-2.0.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/indoc/2.0.5/download" - ], - "strip_prefix": "indoc-2.0.5", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.indoc-2.0.5.bazel" - } - }, - "cui__io-lifetimes-1.0.11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/io-lifetimes/1.0.11/download" - ], - "strip_prefix": "io-lifetimes-1.0.11", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.io-lifetimes-1.0.11.bazel" - } - }, - "cui__is-terminal-0.4.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/is-terminal/0.4.7/download" - ], - "strip_prefix": "is-terminal-0.4.7", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.is-terminal-0.4.7.bazel" - } - }, - "cui__itertools-0.13.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/itertools/0.13.0/download" - ], - "strip_prefix": "itertools-0.13.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.itertools-0.13.0.bazel" - } - }, - "cui__itoa-1.0.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/itoa/1.0.8/download" - ], - "strip_prefix": "itoa-1.0.8", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.itoa-1.0.8.bazel" - } - }, - "cui__jiff-0.1.13": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8a45489186a6123c128fdf6016183fcfab7113e1820eb813127e036e287233fb", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/jiff/0.1.13/download" - ], - "strip_prefix": "jiff-0.1.13", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.jiff-0.1.13.bazel" - } - }, - "cui__jiff-tzdb-0.1.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "91335e575850c5c4c673b9bd467b0e025f164ca59d0564f69d0c2ee0ffad4653", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/jiff-tzdb/0.1.1/download" - ], - "strip_prefix": "jiff-tzdb-0.1.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.jiff-tzdb-0.1.1.bazel" - } - }, - "cui__jiff-tzdb-platform-0.1.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9835f0060a626fe59f160437bc725491a6af23133ea906500027d1bd2f8f4329", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/jiff-tzdb-platform/0.1.1/download" - ], - "strip_prefix": "jiff-tzdb-platform-0.1.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.jiff-tzdb-platform-0.1.1.bazel" - } - }, - "cui__kstring-2.0.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "558bf9508a558512042d3095138b1f7b8fe90c5467d94f9f1da28b3731c5dbd1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/kstring/2.0.2/download" - ], - "strip_prefix": "kstring-2.0.2", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.kstring-2.0.2.bazel" - } - }, - "cui__lazy_static-1.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/lazy_static/1.4.0/download" - ], - "strip_prefix": "lazy_static-1.4.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.lazy_static-1.4.0.bazel" - } - }, - "cui__libc-0.2.161": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/libc/0.2.161/download" - ], - "strip_prefix": "libc-0.2.161", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.libc-0.2.161.bazel" - } - }, - "cui__linux-raw-sys-0.3.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/linux-raw-sys/0.3.8/download" - ], - "strip_prefix": "linux-raw-sys-0.3.8", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.linux-raw-sys-0.3.8.bazel" - } - }, - "cui__linux-raw-sys-0.4.14": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/linux-raw-sys/0.4.14/download" - ], - "strip_prefix": "linux-raw-sys-0.4.14", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.linux-raw-sys-0.4.14.bazel" - } - }, - "cui__lock_api-0.4.11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/lock_api/0.4.11/download" - ], - "strip_prefix": "lock_api-0.4.11", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.lock_api-0.4.11.bazel" - } - }, - "cui__log-0.4.19": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/log/0.4.19/download" - ], - "strip_prefix": "log-0.4.19", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.log-0.4.19.bazel" - } - }, - "cui__maplit-1.0.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/maplit/1.0.2/download" - ], - "strip_prefix": "maplit-1.0.2", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.maplit-1.0.2.bazel" - } - }, - "cui__maybe-async-0.2.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0f1b8c13cb1f814b634a96b2c725449fe7ed464a7b8781de8688be5ffbd3f305", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/maybe-async/0.2.7/download" - ], - "strip_prefix": "maybe-async-0.2.7", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.maybe-async-0.2.7.bazel" - } - }, - "cui__memchr-2.6.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/memchr/2.6.4/download" - ], - "strip_prefix": "memchr-2.6.4", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.memchr-2.6.4.bazel" - } - }, - "cui__memmap2-0.9.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/memmap2/0.9.5/download" - ], - "strip_prefix": "memmap2-0.9.5", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.memmap2-0.9.5.bazel" - } - }, - "cui__miniz_oxide-0.7.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/miniz_oxide/0.7.1/download" - ], - "strip_prefix": "miniz_oxide-0.7.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.miniz_oxide-0.7.1.bazel" - } - }, - "cui__normpath-1.3.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "c8911957c4b1549ac0dc74e30db9c8b0e66ddcd6d7acc33098f4c63a64a6d7ed", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/normpath/1.3.0/download" - ], - "strip_prefix": "normpath-1.3.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.normpath-1.3.0.bazel" - } - }, - "cui__nu-ansi-term-0.46.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/nu-ansi-term/0.46.0/download" - ], - "strip_prefix": "nu-ansi-term-0.46.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.nu-ansi-term-0.46.0.bazel" - } - }, - "cui__once_cell-1.20.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/once_cell/1.20.2/download" - ], - "strip_prefix": "once_cell-1.20.2", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.once_cell-1.20.2.bazel" - } - }, - "cui__overload-0.1.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/overload/0.1.1/download" - ], - "strip_prefix": "overload-0.1.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.overload-0.1.1.bazel" - } - }, - "cui__parking_lot-0.12.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/parking_lot/0.12.1/download" - ], - "strip_prefix": "parking_lot-0.12.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.parking_lot-0.12.1.bazel" - } - }, - "cui__parking_lot_core-0.9.9": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/parking_lot_core/0.9.9/download" - ], - "strip_prefix": "parking_lot_core-0.9.9", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.parking_lot_core-0.9.9.bazel" - } - }, - "cui__pathdiff-0.2.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d61c5ce1153ab5b689d0c074c4e7fc613e942dfb7dd9eea5ab202d2ad91fe361", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/pathdiff/0.2.2/download" - ], - "strip_prefix": "pathdiff-0.2.2", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.pathdiff-0.2.2.bazel" - } - }, - "cui__percent-encoding-2.3.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/percent-encoding/2.3.1/download" - ], - "strip_prefix": "percent-encoding-2.3.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.percent-encoding-2.3.1.bazel" - } - }, - "cui__pest-2.7.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f73935e4d55e2abf7f130186537b19e7a4abc886a0252380b59248af473a3fc9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/pest/2.7.0/download" - ], - "strip_prefix": "pest-2.7.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.pest-2.7.0.bazel" - } - }, - "cui__pest_derive-2.7.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "aef623c9bbfa0eedf5a0efba11a5ee83209c326653ca31ff019bec3a95bfff2b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/pest_derive/2.7.0/download" - ], - "strip_prefix": "pest_derive-2.7.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.pest_derive-2.7.0.bazel" - } - }, - "cui__pest_generator-2.7.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b3e8cba4ec22bada7fc55ffe51e2deb6a0e0db2d0b7ab0b103acc80d2510c190", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/pest_generator/2.7.0/download" - ], - "strip_prefix": "pest_generator-2.7.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.pest_generator-2.7.0.bazel" - } - }, - "cui__pest_meta-2.7.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a01f71cb40bd8bb94232df14b946909e14660e33fc05db3e50ae2a82d7ea0ca0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/pest_meta/2.7.0/download" - ], - "strip_prefix": "pest_meta-2.7.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.pest_meta-2.7.0.bazel" - } - }, - "cui__pin-project-lite-0.2.13": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/pin-project-lite/0.2.13/download" - ], - "strip_prefix": "pin-project-lite-0.2.13", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.pin-project-lite-0.2.13.bazel" - } - }, - "cui__proc-macro2-1.0.88": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/proc-macro2/1.0.88/download" - ], - "strip_prefix": "proc-macro2-1.0.88", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.proc-macro2-1.0.88.bazel" - } - }, - "cui__prodash-28.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "744a264d26b88a6a7e37cbad97953fa233b94d585236310bcbc88474b4092d79", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/prodash/28.0.0/download" - ], - "strip_prefix": "prodash-28.0.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.prodash-28.0.0.bazel" - } - }, - "cui__quote-1.0.37": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/quote/1.0.37/download" - ], - "strip_prefix": "quote-1.0.37", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.quote-1.0.37.bazel" - } - }, - "cui__redox_syscall-0.3.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/redox_syscall/0.3.5/download" - ], - "strip_prefix": "redox_syscall-0.3.5", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.redox_syscall-0.3.5.bazel" - } - }, - "cui__redox_syscall-0.4.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/redox_syscall/0.4.1/download" - ], - "strip_prefix": "redox_syscall-0.4.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.redox_syscall-0.4.1.bazel" - } - }, - "cui__regex-1.11.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/regex/1.11.0/download" - ], - "strip_prefix": "regex-1.11.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.regex-1.11.0.bazel" - } - }, - "cui__regex-automata-0.3.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/regex-automata/0.3.3/download" - ], - "strip_prefix": "regex-automata-0.3.3", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.regex-automata-0.3.3.bazel" - } - }, - "cui__regex-automata-0.4.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/regex-automata/0.4.8/download" - ], - "strip_prefix": "regex-automata-0.4.8", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.regex-automata-0.4.8.bazel" - } - }, - "cui__regex-syntax-0.8.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/regex-syntax/0.8.5/download" - ], - "strip_prefix": "regex-syntax-0.8.5", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.regex-syntax-0.8.5.bazel" - } - }, - "cui__rustc-hash-2.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rustc-hash/2.0.0/download" - ], - "strip_prefix": "rustc-hash-2.0.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.rustc-hash-2.0.0.bazel" - } - }, - "cui__rustix-0.37.23": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rustix/0.37.23/download" - ], - "strip_prefix": "rustix-0.37.23", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.rustix-0.37.23.bazel" - } - }, - "cui__rustix-0.38.37": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rustix/0.38.37/download" - ], - "strip_prefix": "rustix-0.38.37", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.rustix-0.38.37.bazel" - } - }, - "cui__ryu-1.0.14": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/ryu/1.0.14/download" - ], - "strip_prefix": "ryu-1.0.14", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.ryu-1.0.14.bazel" - } - }, - "cui__same-file-1.0.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/same-file/1.0.6/download" - ], - "strip_prefix": "same-file-1.0.6", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.same-file-1.0.6.bazel" - } - }, - "cui__scopeguard-1.2.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/scopeguard/1.2.0/download" - ], - "strip_prefix": "scopeguard-1.2.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.scopeguard-1.2.0.bazel" - } - }, - "cui__semver-1.0.23": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/semver/1.0.23/download" - ], - "strip_prefix": "semver-1.0.23", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.semver-1.0.23.bazel" - } - }, - "cui__serde-1.0.210": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/serde/1.0.210/download" - ], - "strip_prefix": "serde-1.0.210", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.serde-1.0.210.bazel" - } - }, - "cui__serde_derive-1.0.210": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/serde_derive/1.0.210/download" - ], - "strip_prefix": "serde_derive-1.0.210", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.serde_derive-1.0.210.bazel" - } - }, - "cui__serde_json-1.0.129": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "6dbcf9b78a125ee667ae19388837dd12294b858d101fdd393cb9d5501ef09eb2", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/serde_json/1.0.129/download" - ], - "strip_prefix": "serde_json-1.0.129", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.serde_json-1.0.129.bazel" - } - }, - "cui__serde_spanned-0.6.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/serde_spanned/0.6.8/download" - ], - "strip_prefix": "serde_spanned-0.6.8", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.serde_spanned-0.6.8.bazel" - } - }, - "cui__serde_starlark-0.1.16": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "43f25f26c1c853647016b862c1734e0ad68c4f9f752b5f792220d38b1369ed4a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/serde_starlark/0.1.16/download" - ], - "strip_prefix": "serde_starlark-0.1.16", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.serde_starlark-0.1.16.bazel" - } - }, - "cui__sha1_smol-1.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/sha1_smol/1.0.0/download" - ], - "strip_prefix": "sha1_smol-1.0.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.sha1_smol-1.0.0.bazel" - } - }, - "cui__sha2-0.10.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/sha2/0.10.8/download" - ], - "strip_prefix": "sha2-0.10.8", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.sha2-0.10.8.bazel" - } - }, - "cui__sharded-slab-0.1.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/sharded-slab/0.1.7/download" - ], - "strip_prefix": "sharded-slab-0.1.7", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.sharded-slab-0.1.7.bazel" - } - }, - "cui__shell-words-1.1.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/shell-words/1.1.0/download" - ], - "strip_prefix": "shell-words-1.1.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.shell-words-1.1.0.bazel" - } - }, - "cui__smallvec-1.11.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/smallvec/1.11.0/download" - ], - "strip_prefix": "smallvec-1.11.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.smallvec-1.11.0.bazel" - } - }, - "cui__smawk-0.3.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f67ad224767faa3c7d8b6d91985b78e70a1324408abcb1cfcc2be4c06bc06043", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/smawk/0.3.1/download" - ], - "strip_prefix": "smawk-0.3.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.smawk-0.3.1.bazel" - } - }, - "cui__smol_str-0.2.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/smol_str/0.2.0/download" - ], - "strip_prefix": "smol_str-0.2.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.smol_str-0.2.0.bazel" - } - }, - "cui__spdx-0.10.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "47317bbaf63785b53861e1ae2d11b80d6b624211d42cb20efcd210ee6f8a14bc", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/spdx/0.10.6/download" - ], - "strip_prefix": "spdx-0.10.6", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.spdx-0.10.6.bazel" - } - }, - "cui__static_assertions-1.1.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/static_assertions/1.1.0/download" - ], - "strip_prefix": "static_assertions-1.1.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.static_assertions-1.1.0.bazel" - } - }, - "cui__strsim-0.10.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/strsim/0.10.0/download" - ], - "strip_prefix": "strsim-0.10.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.strsim-0.10.0.bazel" - } - }, - "cui__syn-1.0.109": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/syn/1.0.109/download" - ], - "strip_prefix": "syn-1.0.109", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.syn-1.0.109.bazel" - } - }, - "cui__syn-2.0.79": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/syn/2.0.79/download" - ], - "strip_prefix": "syn-2.0.79", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.syn-2.0.79.bazel" - } - }, - "cui__tempfile-3.13.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tempfile/3.13.0/download" - ], - "strip_prefix": "tempfile-3.13.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tempfile-3.13.0.bazel" - } - }, - "cui__tera-1.19.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "970dff17c11e884a4a09bc76e3a17ef71e01bb13447a11e85226e254fe6d10b8", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tera/1.19.1/download" - ], - "strip_prefix": "tera-1.19.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tera-1.19.1.bazel" - } - }, - "cui__textwrap-0.16.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/textwrap/0.16.1/download" - ], - "strip_prefix": "textwrap-0.16.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.textwrap-0.16.1.bazel" - } - }, - "cui__thiserror-1.0.50": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/thiserror/1.0.50/download" - ], - "strip_prefix": "thiserror-1.0.50", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.thiserror-1.0.50.bazel" - } - }, - "cui__thiserror-impl-1.0.50": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/thiserror-impl/1.0.50/download" - ], - "strip_prefix": "thiserror-impl-1.0.50", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.thiserror-impl-1.0.50.bazel" - } - }, - "cui__thread_local-1.1.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/thread_local/1.1.4/download" - ], - "strip_prefix": "thread_local-1.1.4", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.thread_local-1.1.4.bazel" - } - }, - "cui__tinyvec-1.6.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tinyvec/1.6.0/download" - ], - "strip_prefix": "tinyvec-1.6.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tinyvec-1.6.0.bazel" - } - }, - "cui__tinyvec_macros-0.1.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tinyvec_macros/0.1.1/download" - ], - "strip_prefix": "tinyvec_macros-0.1.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tinyvec_macros-0.1.1.bazel" - } - }, - "cui__toml-0.8.19": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/toml/0.8.19/download" - ], - "strip_prefix": "toml-0.8.19", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.toml-0.8.19.bazel" - } - }, - "cui__toml_datetime-0.6.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/toml_datetime/0.6.8/download" - ], - "strip_prefix": "toml_datetime-0.6.8", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.toml_datetime-0.6.8.bazel" - } - }, - "cui__toml_edit-0.22.22": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/toml_edit/0.22.22/download" - ], - "strip_prefix": "toml_edit-0.22.22", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.toml_edit-0.22.22.bazel" - } - }, - "cui__tracing-0.1.40": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tracing/0.1.40/download" - ], - "strip_prefix": "tracing-0.1.40", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tracing-0.1.40.bazel" - } - }, - "cui__tracing-attributes-0.1.27": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tracing-attributes/0.1.27/download" - ], - "strip_prefix": "tracing-attributes-0.1.27", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tracing-attributes-0.1.27.bazel" - } - }, - "cui__tracing-core-0.1.32": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tracing-core/0.1.32/download" - ], - "strip_prefix": "tracing-core-0.1.32", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tracing-core-0.1.32.bazel" - } - }, - "cui__tracing-log-0.2.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tracing-log/0.2.0/download" - ], - "strip_prefix": "tracing-log-0.2.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tracing-log-0.2.0.bazel" - } - }, - "cui__tracing-subscriber-0.3.18": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tracing-subscriber/0.3.18/download" - ], - "strip_prefix": "tracing-subscriber-0.3.18", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.tracing-subscriber-0.3.18.bazel" - } - }, - "cui__typenum-1.16.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/typenum/1.16.0/download" - ], - "strip_prefix": "typenum-1.16.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.typenum-1.16.0.bazel" - } - }, - "cui__ucd-trie-0.1.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/ucd-trie/0.1.6/download" - ], - "strip_prefix": "ucd-trie-0.1.6", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.ucd-trie-0.1.6.bazel" - } - }, - "cui__uluru-3.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "794a32261a1f5eb6a4462c81b59cec87b5c27d5deea7dd1ac8fc781c41d226db", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/uluru/3.0.0/download" - ], - "strip_prefix": "uluru-3.0.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.uluru-3.0.0.bazel" - } - }, - "cui__unic-char-property-0.9.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unic-char-property/0.9.0/download" - ], - "strip_prefix": "unic-char-property-0.9.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unic-char-property-0.9.0.bazel" - } - }, - "cui__unic-char-range-0.9.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unic-char-range/0.9.0/download" - ], - "strip_prefix": "unic-char-range-0.9.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unic-char-range-0.9.0.bazel" - } - }, - "cui__unic-common-0.9.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unic-common/0.9.0/download" - ], - "strip_prefix": "unic-common-0.9.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unic-common-0.9.0.bazel" - } - }, - "cui__unic-segment-0.9.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unic-segment/0.9.0/download" - ], - "strip_prefix": "unic-segment-0.9.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unic-segment-0.9.0.bazel" - } - }, - "cui__unic-ucd-segment-0.9.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unic-ucd-segment/0.9.0/download" - ], - "strip_prefix": "unic-ucd-segment-0.9.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unic-ucd-segment-0.9.0.bazel" - } - }, - "cui__unic-ucd-version-0.9.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unic-ucd-version/0.9.0/download" - ], - "strip_prefix": "unic-ucd-version-0.9.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unic-ucd-version-0.9.0.bazel" - } - }, - "cui__unicode-bidi-0.3.13": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unicode-bidi/0.3.13/download" - ], - "strip_prefix": "unicode-bidi-0.3.13", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unicode-bidi-0.3.13.bazel" - } - }, - "cui__unicode-bom-2.0.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "98e90c70c9f0d4d1ee6d0a7d04aa06cb9bbd53d8cfbdd62a0269a7c2eb640552", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unicode-bom/2.0.2/download" - ], - "strip_prefix": "unicode-bom-2.0.2", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unicode-bom-2.0.2.bazel" - } - }, - "cui__unicode-ident-1.0.10": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unicode-ident/1.0.10/download" - ], - "strip_prefix": "unicode-ident-1.0.10", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unicode-ident-1.0.10.bazel" - } - }, - "cui__unicode-linebreak-0.1.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unicode-linebreak/0.1.5/download" - ], - "strip_prefix": "unicode-linebreak-0.1.5", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unicode-linebreak-0.1.5.bazel" - } - }, - "cui__unicode-normalization-0.1.22": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unicode-normalization/0.1.22/download" - ], - "strip_prefix": "unicode-normalization-0.1.22", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unicode-normalization-0.1.22.bazel" - } - }, - "cui__unicode-width-0.1.10": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unicode-width/0.1.10/download" - ], - "strip_prefix": "unicode-width-0.1.10", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.unicode-width-0.1.10.bazel" - } - }, - "cui__url-2.5.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/url/2.5.2/download" - ], - "strip_prefix": "url-2.5.2", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.url-2.5.2.bazel" - } - }, - "cui__utf8parse-0.2.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/utf8parse/0.2.1/download" - ], - "strip_prefix": "utf8parse-0.2.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.utf8parse-0.2.1.bazel" - } - }, - "cui__valuable-0.1.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/valuable/0.1.0/download" - ], - "strip_prefix": "valuable-0.1.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.valuable-0.1.0.bazel" - } - }, - "cui__version_check-0.9.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/version_check/0.9.4/download" - ], - "strip_prefix": "version_check-0.9.4", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.version_check-0.9.4.bazel" - } - }, - "cui__walkdir-2.3.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/walkdir/2.3.3/download" - ], - "strip_prefix": "walkdir-2.3.3", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.walkdir-2.3.3.bazel" - } - }, - "cui__winapi-0.3.9": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi/0.3.9/download" - ], - "strip_prefix": "winapi-0.3.9", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.winapi-0.3.9.bazel" - } - }, - "cui__winapi-i686-pc-windows-gnu-0.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi-i686-pc-windows-gnu/0.4.0/download" - ], - "strip_prefix": "winapi-i686-pc-windows-gnu-0.4.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.winapi-i686-pc-windows-gnu-0.4.0.bazel" - } - }, - "cui__winapi-util-0.1.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi-util/0.1.5/download" - ], - "strip_prefix": "winapi-util-0.1.5", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.winapi-util-0.1.5.bazel" - } - }, - "cui__winapi-x86_64-pc-windows-gnu-0.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download" - ], - "strip_prefix": "winapi-x86_64-pc-windows-gnu-0.4.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.winapi-x86_64-pc-windows-gnu-0.4.0.bazel" - } - }, - "cui__windows-sys-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows-sys/0.48.0/download" - ], - "strip_prefix": "windows-sys-0.48.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows-sys-0.48.0.bazel" - } - }, - "cui__windows-sys-0.52.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows-sys/0.52.0/download" - ], - "strip_prefix": "windows-sys-0.52.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows-sys-0.52.0.bazel" - } - }, - "cui__windows-sys-0.59.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows-sys/0.59.0/download" - ], - "strip_prefix": "windows-sys-0.59.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows-sys-0.59.0.bazel" - } - }, - "cui__windows-targets-0.48.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows-targets/0.48.1/download" - ], - "strip_prefix": "windows-targets-0.48.1", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows-targets-0.48.1.bazel" - } - }, - "cui__windows-targets-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows-targets/0.52.6/download" - ], - "strip_prefix": "windows-targets-0.52.6", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows-targets-0.52.6.bazel" - } - }, - "cui__windows_aarch64_gnullvm-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.0/download" - ], - "strip_prefix": "windows_aarch64_gnullvm-0.48.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_aarch64_gnullvm-0.48.0.bazel" - } - }, - "cui__windows_aarch64_gnullvm-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download" - ], - "strip_prefix": "windows_aarch64_gnullvm-0.52.6", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel" - } - }, - "cui__windows_aarch64_msvc-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_aarch64_msvc/0.48.0/download" - ], - "strip_prefix": "windows_aarch64_msvc-0.48.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_aarch64_msvc-0.48.0.bazel" - } - }, - "cui__windows_aarch64_msvc-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download" - ], - "strip_prefix": "windows_aarch64_msvc-0.52.6", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_aarch64_msvc-0.52.6.bazel" - } - }, - "cui__windows_i686_gnu-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_i686_gnu/0.48.0/download" - ], - "strip_prefix": "windows_i686_gnu-0.48.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_i686_gnu-0.48.0.bazel" - } - }, - "cui__windows_i686_gnu-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_i686_gnu/0.52.6/download" - ], - "strip_prefix": "windows_i686_gnu-0.52.6", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_i686_gnu-0.52.6.bazel" - } - }, - "cui__windows_i686_gnullvm-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download" - ], - "strip_prefix": "windows_i686_gnullvm-0.52.6", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_i686_gnullvm-0.52.6.bazel" - } - }, - "cui__windows_i686_msvc-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_i686_msvc/0.48.0/download" - ], - "strip_prefix": "windows_i686_msvc-0.48.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_i686_msvc-0.48.0.bazel" - } - }, - "cui__windows_i686_msvc-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_i686_msvc/0.52.6/download" - ], - "strip_prefix": "windows_i686_msvc-0.52.6", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_i686_msvc-0.52.6.bazel" - } - }, - "cui__windows_x86_64_gnu-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_gnu/0.48.0/download" - ], - "strip_prefix": "windows_x86_64_gnu-0.48.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_x86_64_gnu-0.48.0.bazel" - } - }, - "cui__windows_x86_64_gnu-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download" - ], - "strip_prefix": "windows_x86_64_gnu-0.52.6", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_x86_64_gnu-0.52.6.bazel" - } - }, - "cui__windows_x86_64_gnullvm-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.0/download" - ], - "strip_prefix": "windows_x86_64_gnullvm-0.48.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_x86_64_gnullvm-0.48.0.bazel" - } - }, - "cui__windows_x86_64_gnullvm-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download" - ], - "strip_prefix": "windows_x86_64_gnullvm-0.52.6", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel" - } - }, - "cui__windows_x86_64_msvc-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_msvc/0.48.0/download" - ], - "strip_prefix": "windows_x86_64_msvc-0.48.0", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_x86_64_msvc-0.48.0.bazel" - } - }, - "cui__windows_x86_64_msvc-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download" - ], - "strip_prefix": "windows_x86_64_msvc-0.52.6", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.windows_x86_64_msvc-0.52.6.bazel" - } - }, - "cui__winnow-0.6.20": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winnow/0.6.20/download" - ], - "strip_prefix": "winnow-0.6.20", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.winnow-0.6.20.bazel" - } - }, - "cui__zerocopy-0.7.35": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/zerocopy/0.7.35/download" - ], - "strip_prefix": "zerocopy-0.7.35", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.zerocopy-0.7.35.bazel" - } - }, - "cui__zerocopy-derive-0.7.35": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/zerocopy-derive/0.7.35/download" - ], - "strip_prefix": "zerocopy-derive-0.7.35", - "build_file": "@@rules_rust~//crate_universe/3rdparty/crates:BUILD.zerocopy-derive-0.7.35.bazel" - } - }, - "cargo_bazel.buildifier-darwin-amd64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "urls": [ - "https://github.com/bazelbuild/buildtools/releases/download/v7.3.1/buildifier-darwin-amd64" - ], - "integrity": "sha256-N1+CMQPQFiCq7CCgwpxsvKmfT9ByWuMLk2VcZwT0TXE=", - "downloaded_file_path": "buildifier", - "executable": true - } - }, - "cargo_bazel.buildifier-darwin-arm64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "urls": [ - "https://github.com/bazelbuild/buildtools/releases/download/v7.3.1/buildifier-darwin-arm64" - ], - "integrity": "sha256-Wmr8asegn1RVuguJvZnVriO0F03F3J1sDtXOjKrD+BM=", - "downloaded_file_path": "buildifier", - "executable": true - } - }, - "cargo_bazel.buildifier-linux-amd64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "urls": [ - "https://github.com/bazelbuild/buildtools/releases/download/v7.3.1/buildifier-linux-amd64" - ], - "integrity": "sha256-VHTMUSinToBng9VAgfWBZixL6K5lAi9VfpKB7V3IgAk=", - "downloaded_file_path": "buildifier", - "executable": true - } - }, - "cargo_bazel.buildifier-linux-arm64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "urls": [ - "https://github.com/bazelbuild/buildtools/releases/download/v7.3.1/buildifier-linux-arm64" - ], - "integrity": "sha256-C/hsS//69PCO7Xe95bIILkrlA5oR4uiwOYTBc8NKVhw=", - "downloaded_file_path": "buildifier", - "executable": true - } - }, - "cargo_bazel.buildifier-linux-s390x": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "urls": [ - "https://github.com/bazelbuild/buildtools/releases/download/v7.3.1/buildifier-linux-s390x" - ], - "integrity": "sha256-4tef9YhdRSdPdlMfGtvHtzoSn1nnZ/d36PveYz2dTi4=", - "downloaded_file_path": "buildifier", - "executable": true - } - }, - "cargo_bazel.buildifier-windows-amd64.exe": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_file", - "attributes": { - "urls": [ - "https://github.com/bazelbuild/buildtools/releases/download/v7.3.1/buildifier-windows-amd64.exe" - ], - "integrity": "sha256-NwzVdgda0pkwqC9d4TLxod5AhMeEqCUUvU2oDIWs9Kg=", - "downloaded_file_path": "buildifier.exe", - "executable": true - } - }, - "rules_rust_prost": { - "bzlFile": "@@rules_rust~//crate_universe/private:crates_vendor.bzl", - "ruleClassName": "crates_vendor_remote_repository", - "attributes": { - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.bazel", - "defs_module": "@@rules_rust~//proto/prost/private/3rdparty/crates:defs.bzl" - } - }, - "rules_rust_prost__addr2line-0.22.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/addr2line/0.22.0/download" - ], - "strip_prefix": "addr2line-0.22.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.addr2line-0.22.0.bazel" - } - }, - "rules_rust_prost__adler-1.0.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/adler/1.0.2/download" - ], - "strip_prefix": "adler-1.0.2", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.adler-1.0.2.bazel" - } - }, - "rules_rust_prost__aho-corasick-1.1.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/aho-corasick/1.1.3/download" - ], - "strip_prefix": "aho-corasick-1.1.3", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.aho-corasick-1.1.3.bazel" - } - }, - "rules_rust_prost__anyhow-1.0.86": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anyhow/1.0.86/download" - ], - "strip_prefix": "anyhow-1.0.86", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.anyhow-1.0.86.bazel" - } - }, - "rules_rust_prost__async-stream-0.3.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/async-stream/0.3.5/download" - ], - "strip_prefix": "async-stream-0.3.5", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.async-stream-0.3.5.bazel" - } - }, - "rules_rust_prost__async-stream-impl-0.3.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/async-stream-impl/0.3.5/download" - ], - "strip_prefix": "async-stream-impl-0.3.5", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.async-stream-impl-0.3.5.bazel" - } - }, - "rules_rust_prost__async-trait-0.1.81": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/async-trait/0.1.81/download" - ], - "strip_prefix": "async-trait-0.1.81", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.async-trait-0.1.81.bazel" - } - }, - "rules_rust_prost__atomic-waker-1.1.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/atomic-waker/1.1.2/download" - ], - "strip_prefix": "atomic-waker-1.1.2", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.atomic-waker-1.1.2.bazel" - } - }, - "rules_rust_prost__autocfg-1.3.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/autocfg/1.3.0/download" - ], - "strip_prefix": "autocfg-1.3.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.autocfg-1.3.0.bazel" - } - }, - "rules_rust_prost__axum-0.7.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/axum/0.7.5/download" - ], - "strip_prefix": "axum-0.7.5", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.axum-0.7.5.bazel" - } - }, - "rules_rust_prost__axum-core-0.4.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/axum-core/0.4.3/download" - ], - "strip_prefix": "axum-core-0.4.3", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.axum-core-0.4.3.bazel" - } - }, - "rules_rust_prost__backtrace-0.3.73": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/backtrace/0.3.73/download" - ], - "strip_prefix": "backtrace-0.3.73", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.backtrace-0.3.73.bazel" - } - }, - "rules_rust_prost__base64-0.22.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/base64/0.22.1/download" - ], - "strip_prefix": "base64-0.22.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.base64-0.22.1.bazel" - } - }, - "rules_rust_prost__bitflags-2.6.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/bitflags/2.6.0/download" - ], - "strip_prefix": "bitflags-2.6.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.bitflags-2.6.0.bazel" - } - }, - "rules_rust_prost__byteorder-1.5.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/byteorder/1.5.0/download" - ], - "strip_prefix": "byteorder-1.5.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.byteorder-1.5.0.bazel" - } - }, - "rules_rust_prost__bytes-1.7.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/bytes/1.7.1/download" - ], - "strip_prefix": "bytes-1.7.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.bytes-1.7.1.bazel" - } - }, - "rules_rust_prost__cc-1.1.14": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "50d2eb3cd3d1bf4529e31c215ee6f93ec5a3d536d9f578f93d9d33ee19562932", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/cc/1.1.14/download" - ], - "strip_prefix": "cc-1.1.14", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.cc-1.1.14.bazel" - } - }, - "rules_rust_prost__cfg-if-1.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/cfg-if/1.0.0/download" - ], - "strip_prefix": "cfg-if-1.0.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.cfg-if-1.0.0.bazel" - } - }, - "rules_rust_prost__either-1.13.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/either/1.13.0/download" - ], - "strip_prefix": "either-1.13.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.either-1.13.0.bazel" - } - }, - "rules_rust_prost__equivalent-1.0.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/equivalent/1.0.1/download" - ], - "strip_prefix": "equivalent-1.0.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.equivalent-1.0.1.bazel" - } - }, - "rules_rust_prost__errno-0.3.9": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/errno/0.3.9/download" - ], - "strip_prefix": "errno-0.3.9", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.errno-0.3.9.bazel" - } - }, - "rules_rust_prost__fastrand-2.1.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/fastrand/2.1.1/download" - ], - "strip_prefix": "fastrand-2.1.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.fastrand-2.1.1.bazel" - } - }, - "rules_rust_prost__fixedbitset-0.4.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/fixedbitset/0.4.2/download" - ], - "strip_prefix": "fixedbitset-0.4.2", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.fixedbitset-0.4.2.bazel" - } - }, - "rules_rust_prost__fnv-1.0.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/fnv/1.0.7/download" - ], - "strip_prefix": "fnv-1.0.7", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.fnv-1.0.7.bazel" - } - }, - "rules_rust_prost__futures-channel-0.3.30": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/futures-channel/0.3.30/download" - ], - "strip_prefix": "futures-channel-0.3.30", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.futures-channel-0.3.30.bazel" - } - }, - "rules_rust_prost__futures-core-0.3.30": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/futures-core/0.3.30/download" - ], - "strip_prefix": "futures-core-0.3.30", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.futures-core-0.3.30.bazel" - } - }, - "rules_rust_prost__futures-sink-0.3.30": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/futures-sink/0.3.30/download" - ], - "strip_prefix": "futures-sink-0.3.30", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.futures-sink-0.3.30.bazel" - } - }, - "rules_rust_prost__futures-task-0.3.30": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/futures-task/0.3.30/download" - ], - "strip_prefix": "futures-task-0.3.30", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.futures-task-0.3.30.bazel" - } - }, - "rules_rust_prost__futures-util-0.3.30": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/futures-util/0.3.30/download" - ], - "strip_prefix": "futures-util-0.3.30", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.futures-util-0.3.30.bazel" - } - }, - "rules_rust_prost__getrandom-0.2.15": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/getrandom/0.2.15/download" - ], - "strip_prefix": "getrandom-0.2.15", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.getrandom-0.2.15.bazel" - } - }, - "rules_rust_prost__gimli-0.29.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gimli/0.29.0/download" - ], - "strip_prefix": "gimli-0.29.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.gimli-0.29.0.bazel" - } - }, - "rules_rust_prost__h2-0.4.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/h2/0.4.6/download" - ], - "strip_prefix": "h2-0.4.6", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.h2-0.4.6.bazel" - } - }, - "rules_rust_prost__hashbrown-0.12.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/hashbrown/0.12.3/download" - ], - "strip_prefix": "hashbrown-0.12.3", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.hashbrown-0.12.3.bazel" - } - }, - "rules_rust_prost__hashbrown-0.14.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/hashbrown/0.14.5/download" - ], - "strip_prefix": "hashbrown-0.14.5", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.hashbrown-0.14.5.bazel" - } - }, - "rules_rust_prost__heck-0.5.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/heck/0.5.0/download" - ], - "strip_prefix": "heck-0.5.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.heck-0.5.0.bazel" - } - }, - "rules_rust_prost__hermit-abi-0.3.9": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/hermit-abi/0.3.9/download" - ], - "strip_prefix": "hermit-abi-0.3.9", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.hermit-abi-0.3.9.bazel" - } - }, - "rules_rust_prost__http-1.1.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/http/1.1.0/download" - ], - "strip_prefix": "http-1.1.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.http-1.1.0.bazel" - } - }, - "rules_rust_prost__http-body-1.0.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/http-body/1.0.1/download" - ], - "strip_prefix": "http-body-1.0.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.http-body-1.0.1.bazel" - } - }, - "rules_rust_prost__http-body-util-0.1.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/http-body-util/0.1.2/download" - ], - "strip_prefix": "http-body-util-0.1.2", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.http-body-util-0.1.2.bazel" - } - }, - "rules_rust_prost__httparse-1.9.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/httparse/1.9.4/download" - ], - "strip_prefix": "httparse-1.9.4", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.httparse-1.9.4.bazel" - } - }, - "rules_rust_prost__httpdate-1.0.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/httpdate/1.0.3/download" - ], - "strip_prefix": "httpdate-1.0.3", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.httpdate-1.0.3.bazel" - } - }, - "rules_rust_prost__hyper-1.4.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/hyper/1.4.1/download" - ], - "strip_prefix": "hyper-1.4.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.hyper-1.4.1.bazel" - } - }, - "rules_rust_prost__hyper-timeout-0.5.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/hyper-timeout/0.5.1/download" - ], - "strip_prefix": "hyper-timeout-0.5.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.hyper-timeout-0.5.1.bazel" - } - }, - "rules_rust_prost__hyper-util-0.1.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/hyper-util/0.1.7/download" - ], - "strip_prefix": "hyper-util-0.1.7", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.hyper-util-0.1.7.bazel" - } - }, - "rules_rust_prost__indexmap-1.9.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/indexmap/1.9.3/download" - ], - "strip_prefix": "indexmap-1.9.3", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.indexmap-1.9.3.bazel" - } - }, - "rules_rust_prost__indexmap-2.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/indexmap/2.4.0/download" - ], - "strip_prefix": "indexmap-2.4.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.indexmap-2.4.0.bazel" - } - }, - "rules_rust_prost__itertools-0.13.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/itertools/0.13.0/download" - ], - "strip_prefix": "itertools-0.13.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.itertools-0.13.0.bazel" - } - }, - "rules_rust_prost__itoa-1.0.11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/itoa/1.0.11/download" - ], - "strip_prefix": "itoa-1.0.11", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.itoa-1.0.11.bazel" - } - }, - "rules_rust_prost__libc-0.2.158": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/libc/0.2.158/download" - ], - "strip_prefix": "libc-0.2.158", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.libc-0.2.158.bazel" - } - }, - "rules_rust_prost__linux-raw-sys-0.4.14": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/linux-raw-sys/0.4.14/download" - ], - "strip_prefix": "linux-raw-sys-0.4.14", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.linux-raw-sys-0.4.14.bazel" - } - }, - "rules_rust_prost__lock_api-0.4.12": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/lock_api/0.4.12/download" - ], - "strip_prefix": "lock_api-0.4.12", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.lock_api-0.4.12.bazel" - } - }, - "rules_rust_prost__log-0.4.22": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/log/0.4.22/download" - ], - "strip_prefix": "log-0.4.22", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.log-0.4.22.bazel" - } - }, - "rules_rust_prost__matchit-0.7.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/matchit/0.7.3/download" - ], - "strip_prefix": "matchit-0.7.3", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.matchit-0.7.3.bazel" - } - }, - "rules_rust_prost__memchr-2.7.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/memchr/2.7.4/download" - ], - "strip_prefix": "memchr-2.7.4", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.memchr-2.7.4.bazel" - } - }, - "rules_rust_prost__mime-0.3.17": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/mime/0.3.17/download" - ], - "strip_prefix": "mime-0.3.17", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.mime-0.3.17.bazel" - } - }, - "rules_rust_prost__miniz_oxide-0.7.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/miniz_oxide/0.7.4/download" - ], - "strip_prefix": "miniz_oxide-0.7.4", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.miniz_oxide-0.7.4.bazel" - } - }, - "rules_rust_prost__mio-1.0.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/mio/1.0.2/download" - ], - "strip_prefix": "mio-1.0.2", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.mio-1.0.2.bazel" - } - }, - "rules_rust_prost__multimap-0.10.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/multimap/0.10.0/download" - ], - "strip_prefix": "multimap-0.10.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.multimap-0.10.0.bazel" - } - }, - "rules_rust_prost__object-0.36.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/object/0.36.3/download" - ], - "strip_prefix": "object-0.36.3", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.object-0.36.3.bazel" - } - }, - "rules_rust_prost__once_cell-1.19.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/once_cell/1.19.0/download" - ], - "strip_prefix": "once_cell-1.19.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.once_cell-1.19.0.bazel" - } - }, - "rules_rust_prost__parking_lot-0.12.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/parking_lot/0.12.3/download" - ], - "strip_prefix": "parking_lot-0.12.3", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.parking_lot-0.12.3.bazel" - } - }, - "rules_rust_prost__parking_lot_core-0.9.10": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/parking_lot_core/0.9.10/download" - ], - "strip_prefix": "parking_lot_core-0.9.10", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.parking_lot_core-0.9.10.bazel" - } - }, - "rules_rust_prost__percent-encoding-2.3.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/percent-encoding/2.3.1/download" - ], - "strip_prefix": "percent-encoding-2.3.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.percent-encoding-2.3.1.bazel" - } - }, - "rules_rust_prost__petgraph-0.6.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/petgraph/0.6.5/download" - ], - "strip_prefix": "petgraph-0.6.5", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.petgraph-0.6.5.bazel" - } - }, - "rules_rust_prost__pin-project-1.1.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/pin-project/1.1.5/download" - ], - "strip_prefix": "pin-project-1.1.5", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.pin-project-1.1.5.bazel" - } - }, - "rules_rust_prost__pin-project-internal-1.1.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/pin-project-internal/1.1.5/download" - ], - "strip_prefix": "pin-project-internal-1.1.5", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.pin-project-internal-1.1.5.bazel" - } - }, - "rules_rust_prost__pin-project-lite-0.2.14": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/pin-project-lite/0.2.14/download" - ], - "strip_prefix": "pin-project-lite-0.2.14", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.pin-project-lite-0.2.14.bazel" - } - }, - "rules_rust_prost__pin-utils-0.1.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/pin-utils/0.1.0/download" - ], - "strip_prefix": "pin-utils-0.1.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.pin-utils-0.1.0.bazel" - } - }, - "rules_rust_prost__ppv-lite86-0.2.20": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/ppv-lite86/0.2.20/download" - ], - "strip_prefix": "ppv-lite86-0.2.20", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.ppv-lite86-0.2.20.bazel" - } - }, - "rules_rust_prost__prettyplease-0.2.22": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/prettyplease/0.2.22/download" - ], - "strip_prefix": "prettyplease-0.2.22", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.prettyplease-0.2.22.bazel" - } - }, - "rules_rust_prost__proc-macro2-1.0.86": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/proc-macro2/1.0.86/download" - ], - "strip_prefix": "proc-macro2-1.0.86", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.proc-macro2-1.0.86.bazel" - } - }, - "rules_rust_prost__prost-0.13.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e13db3d3fde688c61e2446b4d843bc27a7e8af269a69440c0308021dc92333cc", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/prost/0.13.1/download" - ], - "strip_prefix": "prost-0.13.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.prost-0.13.1.bazel" - } - }, - "rules_rust_prost__prost-build-0.13.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5bb182580f71dd070f88d01ce3de9f4da5021db7115d2e1c3605a754153b77c1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/prost-build/0.13.1/download" - ], - "strip_prefix": "prost-build-0.13.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.prost-build-0.13.1.bazel" - } - }, - "rules_rust_prost__prost-derive-0.13.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "18bec9b0adc4eba778b33684b7ba3e7137789434769ee3ce3930463ef904cfca", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/prost-derive/0.13.1/download" - ], - "strip_prefix": "prost-derive-0.13.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.prost-derive-0.13.1.bazel" - } - }, - "rules_rust_prost__prost-types-0.13.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "cee5168b05f49d4b0ca581206eb14a7b22fafd963efe729ac48eb03266e25cc2", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/prost-types/0.13.1/download" - ], - "strip_prefix": "prost-types-0.13.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.prost-types-0.13.1.bazel" - } - }, - "rules_rust_prost__protoc-gen-prost-0.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "77eb17a7657a703f30cb9b7ba4d981e4037b8af2d819ab0077514b0bef537406", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/protoc-gen-prost/0.4.0/download" - ], - "strip_prefix": "protoc-gen-prost-0.4.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.protoc-gen-prost-0.4.0.bazel" - } - }, - "rules_rust_prost__protoc-gen-tonic-0.4.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "6ab6a0d73a0914752ed8fd7cc51afe169e28da87be3efef292de5676cc527634", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/protoc-gen-tonic/0.4.1/download" - ], - "strip_prefix": "protoc-gen-tonic-0.4.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.protoc-gen-tonic-0.4.1.bazel" - } - }, - "rules_rust_prost__quote-1.0.37": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/quote/1.0.37/download" - ], - "strip_prefix": "quote-1.0.37", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.quote-1.0.37.bazel" - } - }, - "rules_rust_prost__rand-0.8.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rand/0.8.5/download" - ], - "strip_prefix": "rand-0.8.5", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.rand-0.8.5.bazel" - } - }, - "rules_rust_prost__rand_chacha-0.3.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rand_chacha/0.3.1/download" - ], - "strip_prefix": "rand_chacha-0.3.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.rand_chacha-0.3.1.bazel" - } - }, - "rules_rust_prost__rand_core-0.6.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rand_core/0.6.4/download" - ], - "strip_prefix": "rand_core-0.6.4", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.rand_core-0.6.4.bazel" - } - }, - "rules_rust_prost__redox_syscall-0.5.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/redox_syscall/0.5.3/download" - ], - "strip_prefix": "redox_syscall-0.5.3", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.redox_syscall-0.5.3.bazel" - } - }, - "rules_rust_prost__regex-1.10.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/regex/1.10.6/download" - ], - "strip_prefix": "regex-1.10.6", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.regex-1.10.6.bazel" - } - }, - "rules_rust_prost__regex-automata-0.4.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/regex-automata/0.4.7/download" - ], - "strip_prefix": "regex-automata-0.4.7", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.regex-automata-0.4.7.bazel" - } - }, - "rules_rust_prost__regex-syntax-0.8.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/regex-syntax/0.8.4/download" - ], - "strip_prefix": "regex-syntax-0.8.4", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.regex-syntax-0.8.4.bazel" - } - }, - "rules_rust_prost__rustc-demangle-0.1.24": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rustc-demangle/0.1.24/download" - ], - "strip_prefix": "rustc-demangle-0.1.24", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.rustc-demangle-0.1.24.bazel" - } - }, - "rules_rust_prost__rustix-0.38.34": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rustix/0.38.34/download" - ], - "strip_prefix": "rustix-0.38.34", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.rustix-0.38.34.bazel" - } - }, - "rules_rust_prost__rustversion-1.0.17": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rustversion/1.0.17/download" - ], - "strip_prefix": "rustversion-1.0.17", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.rustversion-1.0.17.bazel" - } - }, - "rules_rust_prost__scopeguard-1.2.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/scopeguard/1.2.0/download" - ], - "strip_prefix": "scopeguard-1.2.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.scopeguard-1.2.0.bazel" - } - }, - "rules_rust_prost__serde-1.0.209": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/serde/1.0.209/download" - ], - "strip_prefix": "serde-1.0.209", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.serde-1.0.209.bazel" - } - }, - "rules_rust_prost__serde_derive-1.0.209": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/serde_derive/1.0.209/download" - ], - "strip_prefix": "serde_derive-1.0.209", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.serde_derive-1.0.209.bazel" - } - }, - "rules_rust_prost__shlex-1.3.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/shlex/1.3.0/download" - ], - "strip_prefix": "shlex-1.3.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.shlex-1.3.0.bazel" - } - }, - "rules_rust_prost__signal-hook-registry-1.4.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/signal-hook-registry/1.4.2/download" - ], - "strip_prefix": "signal-hook-registry-1.4.2", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.signal-hook-registry-1.4.2.bazel" - } - }, - "rules_rust_prost__slab-0.4.9": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/slab/0.4.9/download" - ], - "strip_prefix": "slab-0.4.9", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.slab-0.4.9.bazel" - } - }, - "rules_rust_prost__smallvec-1.13.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/smallvec/1.13.2/download" - ], - "strip_prefix": "smallvec-1.13.2", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.smallvec-1.13.2.bazel" - } - }, - "rules_rust_prost__socket2-0.5.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/socket2/0.5.7/download" - ], - "strip_prefix": "socket2-0.5.7", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.socket2-0.5.7.bazel" - } - }, - "rules_rust_prost__syn-2.0.76": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/syn/2.0.76/download" - ], - "strip_prefix": "syn-2.0.76", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.syn-2.0.76.bazel" - } - }, - "rules_rust_prost__sync_wrapper-0.1.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/sync_wrapper/0.1.2/download" - ], - "strip_prefix": "sync_wrapper-0.1.2", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.sync_wrapper-0.1.2.bazel" - } - }, - "rules_rust_prost__sync_wrapper-1.0.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/sync_wrapper/1.0.1/download" - ], - "strip_prefix": "sync_wrapper-1.0.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.sync_wrapper-1.0.1.bazel" - } - }, - "rules_rust_prost__tempfile-3.12.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tempfile/3.12.0/download" - ], - "strip_prefix": "tempfile-3.12.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tempfile-3.12.0.bazel" - } - }, - "rules_rust_prost__tokio-1.39.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio/1.39.3/download" - ], - "strip_prefix": "tokio-1.39.3", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tokio-1.39.3.bazel" - } - }, - "rules_rust_prost__tokio-macros-2.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-macros/2.4.0/download" - ], - "strip_prefix": "tokio-macros-2.4.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tokio-macros-2.4.0.bazel" - } - }, - "rules_rust_prost__tokio-stream-0.1.15": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-stream/0.1.15/download" - ], - "strip_prefix": "tokio-stream-0.1.15", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tokio-stream-0.1.15.bazel" - } - }, - "rules_rust_prost__tokio-util-0.7.11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-util/0.7.11/download" - ], - "strip_prefix": "tokio-util-0.7.11", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tokio-util-0.7.11.bazel" - } - }, - "rules_rust_prost__tonic-0.12.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "38659f4a91aba8598d27821589f5db7dddd94601e7a01b1e485a50e5484c7401", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tonic/0.12.1/download" - ], - "strip_prefix": "tonic-0.12.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tonic-0.12.1.bazel" - } - }, - "rules_rust_prost__tonic-build-0.12.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "568392c5a2bd0020723e3f387891176aabafe36fd9fcd074ad309dfa0c8eb964", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tonic-build/0.12.1/download" - ], - "strip_prefix": "tonic-build-0.12.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tonic-build-0.12.1.bazel" - } - }, - "rules_rust_prost__tower-0.4.13": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tower/0.4.13/download" - ], - "strip_prefix": "tower-0.4.13", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tower-0.4.13.bazel" - } - }, - "rules_rust_prost__tower-layer-0.3.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tower-layer/0.3.3/download" - ], - "strip_prefix": "tower-layer-0.3.3", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tower-layer-0.3.3.bazel" - } - }, - "rules_rust_prost__tower-service-0.3.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tower-service/0.3.3/download" - ], - "strip_prefix": "tower-service-0.3.3", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tower-service-0.3.3.bazel" - } - }, - "rules_rust_prost__tracing-0.1.40": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tracing/0.1.40/download" - ], - "strip_prefix": "tracing-0.1.40", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tracing-0.1.40.bazel" - } - }, - "rules_rust_prost__tracing-attributes-0.1.27": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tracing-attributes/0.1.27/download" - ], - "strip_prefix": "tracing-attributes-0.1.27", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tracing-attributes-0.1.27.bazel" - } - }, - "rules_rust_prost__tracing-core-0.1.32": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tracing-core/0.1.32/download" - ], - "strip_prefix": "tracing-core-0.1.32", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.tracing-core-0.1.32.bazel" - } - }, - "rules_rust_prost__try-lock-0.2.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/try-lock/0.2.5/download" - ], - "strip_prefix": "try-lock-0.2.5", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.try-lock-0.2.5.bazel" - } - }, - "rules_rust_prost__unicode-ident-1.0.12": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unicode-ident/1.0.12/download" - ], - "strip_prefix": "unicode-ident-1.0.12", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.unicode-ident-1.0.12.bazel" - } - }, - "rules_rust_prost__want-0.3.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/want/0.3.1/download" - ], - "strip_prefix": "want-0.3.1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.want-0.3.1.bazel" - } - }, - "rules_rust_prost__wasi-0.11.0-wasi-snapshot-preview1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasi/0.11.0+wasi-snapshot-preview1/download" - ], - "strip_prefix": "wasi-0.11.0+wasi-snapshot-preview1", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.wasi-0.11.0+wasi-snapshot-preview1.bazel" - } - }, - "rules_rust_prost__windows-sys-0.52.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows-sys/0.52.0/download" - ], - "strip_prefix": "windows-sys-0.52.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows-sys-0.52.0.bazel" - } - }, - "rules_rust_prost__windows-sys-0.59.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows-sys/0.59.0/download" - ], - "strip_prefix": "windows-sys-0.59.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows-sys-0.59.0.bazel" - } - }, - "rules_rust_prost__windows-targets-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows-targets/0.52.6/download" - ], - "strip_prefix": "windows-targets-0.52.6", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows-targets-0.52.6.bazel" - } - }, - "rules_rust_prost__windows_aarch64_gnullvm-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download" - ], - "strip_prefix": "windows_aarch64_gnullvm-0.52.6", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel" - } - }, - "rules_rust_prost__windows_aarch64_msvc-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download" - ], - "strip_prefix": "windows_aarch64_msvc-0.52.6", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows_aarch64_msvc-0.52.6.bazel" - } - }, - "rules_rust_prost__windows_i686_gnu-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_i686_gnu/0.52.6/download" - ], - "strip_prefix": "windows_i686_gnu-0.52.6", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows_i686_gnu-0.52.6.bazel" - } - }, - "rules_rust_prost__windows_i686_gnullvm-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download" - ], - "strip_prefix": "windows_i686_gnullvm-0.52.6", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows_i686_gnullvm-0.52.6.bazel" - } - }, - "rules_rust_prost__windows_i686_msvc-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_i686_msvc/0.52.6/download" - ], - "strip_prefix": "windows_i686_msvc-0.52.6", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows_i686_msvc-0.52.6.bazel" - } - }, - "rules_rust_prost__windows_x86_64_gnu-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download" - ], - "strip_prefix": "windows_x86_64_gnu-0.52.6", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows_x86_64_gnu-0.52.6.bazel" - } - }, - "rules_rust_prost__windows_x86_64_gnullvm-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download" - ], - "strip_prefix": "windows_x86_64_gnullvm-0.52.6", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel" - } - }, - "rules_rust_prost__windows_x86_64_msvc-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download" - ], - "strip_prefix": "windows_x86_64_msvc-0.52.6", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.windows_x86_64_msvc-0.52.6.bazel" - } - }, - "rules_rust_prost__zerocopy-0.7.35": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/zerocopy/0.7.35/download" - ], - "strip_prefix": "zerocopy-0.7.35", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.zerocopy-0.7.35.bazel" - } - }, - "rules_rust_prost__zerocopy-derive-0.7.35": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/zerocopy-derive/0.7.35/download" - ], - "strip_prefix": "zerocopy-derive-0.7.35", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.zerocopy-derive-0.7.35.bazel" - } - }, - "rules_rust_prost__heck": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "integrity": "sha256-IwTgCYP4f/s4tVtES147YKiEtdMMD8p9gv4zRJu+Veo=", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/heck/heck-0.5.0.crate" - ], - "strip_prefix": "heck-0.5.0", - "build_file": "@@rules_rust~//proto/prost/private/3rdparty/crates:BUILD.heck-0.5.0.bazel" - } - }, - "rules_rust_proto__autocfg-1.1.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/autocfg/1.1.0/download" - ], - "strip_prefix": "autocfg-1.1.0", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.autocfg-1.1.0.bazel" - } - }, - "rules_rust_proto__base64-0.9.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/base64/0.9.3/download" - ], - "strip_prefix": "base64-0.9.3", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.base64-0.9.3.bazel" - } - }, - "rules_rust_proto__bitflags-1.3.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/bitflags/1.3.2/download" - ], - "strip_prefix": "bitflags-1.3.2", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.bitflags-1.3.2.bazel" - } - }, - "rules_rust_proto__byteorder-1.4.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/byteorder/1.4.3/download" - ], - "strip_prefix": "byteorder-1.4.3", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.byteorder-1.4.3.bazel" - } - }, - "rules_rust_proto__bytes-0.4.12": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/bytes/0.4.12/download" - ], - "strip_prefix": "bytes-0.4.12", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.bytes-0.4.12.bazel" - } - }, - "rules_rust_proto__cfg-if-0.1.10": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/cfg-if/0.1.10/download" - ], - "strip_prefix": "cfg-if-0.1.10", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.cfg-if-0.1.10.bazel" - } - }, - "rules_rust_proto__cfg-if-1.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/cfg-if/1.0.0/download" - ], - "strip_prefix": "cfg-if-1.0.0", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.cfg-if-1.0.0.bazel" - } - }, - "rules_rust_proto__cloudabi-0.0.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/cloudabi/0.0.3/download" - ], - "strip_prefix": "cloudabi-0.0.3", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.cloudabi-0.0.3.bazel" - } - }, - "rules_rust_proto__crossbeam-deque-0.7.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "c20ff29ded3204c5106278a81a38f4b482636ed4fa1e6cfbeef193291beb29ed", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/crossbeam-deque/0.7.4/download" - ], - "strip_prefix": "crossbeam-deque-0.7.4", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.crossbeam-deque-0.7.4.bazel" - } - }, - "rules_rust_proto__crossbeam-epoch-0.8.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/crossbeam-epoch/0.8.2/download" - ], - "strip_prefix": "crossbeam-epoch-0.8.2", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.crossbeam-epoch-0.8.2.bazel" - } - }, - "rules_rust_proto__crossbeam-queue-0.2.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/crossbeam-queue/0.2.3/download" - ], - "strip_prefix": "crossbeam-queue-0.2.3", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.crossbeam-queue-0.2.3.bazel" - } - }, - "rules_rust_proto__crossbeam-utils-0.7.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/crossbeam-utils/0.7.2/download" - ], - "strip_prefix": "crossbeam-utils-0.7.2", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.crossbeam-utils-0.7.2.bazel" - } - }, - "rules_rust_proto__fnv-1.0.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/fnv/1.0.7/download" - ], - "strip_prefix": "fnv-1.0.7", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.fnv-1.0.7.bazel" - } - }, - "rules_rust_proto__fuchsia-zircon-0.3.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/fuchsia-zircon/0.3.3/download" - ], - "strip_prefix": "fuchsia-zircon-0.3.3", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.fuchsia-zircon-0.3.3.bazel" - } - }, - "rules_rust_proto__fuchsia-zircon-sys-0.3.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/fuchsia-zircon-sys/0.3.3/download" - ], - "strip_prefix": "fuchsia-zircon-sys-0.3.3", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.fuchsia-zircon-sys-0.3.3.bazel" - } - }, - "rules_rust_proto__futures-0.1.31": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/futures/0.1.31/download" - ], - "strip_prefix": "futures-0.1.31", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.futures-0.1.31.bazel" - } - }, - "rules_rust_proto__futures-cpupool-0.1.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/futures-cpupool/0.1.8/download" - ], - "strip_prefix": "futures-cpupool-0.1.8", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.futures-cpupool-0.1.8.bazel" - } - }, - "rules_rust_proto__grpc-0.6.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2aaf1d741fe6f3413f1f9f71b99f5e4e26776d563475a8a53ce53a73a8534c1d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/grpc/0.6.2/download" - ], - "strip_prefix": "grpc-0.6.2", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.grpc-0.6.2.bazel" - } - }, - "rules_rust_proto__grpc-compiler-0.6.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "907274ce8ee7b40a0d0b0db09022ea22846a47cfb1fc8ad2c983c70001b4ffb1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/grpc-compiler/0.6.2/download" - ], - "strip_prefix": "grpc-compiler-0.6.2", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.grpc-compiler-0.6.2.bazel" - } - }, - "rules_rust_proto__hermit-abi-0.2.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/hermit-abi/0.2.6/download" - ], - "strip_prefix": "hermit-abi-0.2.6", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.hermit-abi-0.2.6.bazel" - } - }, - "rules_rust_proto__httpbis-0.7.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7689cfa896b2a71da4f16206af167542b75d242b6906313e53857972a92d5614", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/httpbis/0.7.0/download" - ], - "strip_prefix": "httpbis-0.7.0", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.httpbis-0.7.0.bazel" - } - }, - "rules_rust_proto__iovec-0.1.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/iovec/0.1.4/download" - ], - "strip_prefix": "iovec-0.1.4", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.iovec-0.1.4.bazel" - } - }, - "rules_rust_proto__kernel32-sys-0.2.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/kernel32-sys/0.2.2/download" - ], - "strip_prefix": "kernel32-sys-0.2.2", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.kernel32-sys-0.2.2.bazel" - } - }, - "rules_rust_proto__lazy_static-1.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/lazy_static/1.4.0/download" - ], - "strip_prefix": "lazy_static-1.4.0", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.lazy_static-1.4.0.bazel" - } - }, - "rules_rust_proto__libc-0.2.139": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/libc/0.2.139/download" - ], - "strip_prefix": "libc-0.2.139", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.libc-0.2.139.bazel" - } - }, - "rules_rust_proto__lock_api-0.3.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/lock_api/0.3.4/download" - ], - "strip_prefix": "lock_api-0.3.4", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.lock_api-0.3.4.bazel" - } - }, - "rules_rust_proto__log-0.3.9": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/log/0.3.9/download" - ], - "strip_prefix": "log-0.3.9", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.log-0.3.9.bazel" - } - }, - "rules_rust_proto__log-0.4.17": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/log/0.4.17/download" - ], - "strip_prefix": "log-0.4.17", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.log-0.4.17.bazel" - } - }, - "rules_rust_proto__maybe-uninit-2.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/maybe-uninit/2.0.0/download" - ], - "strip_prefix": "maybe-uninit-2.0.0", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.maybe-uninit-2.0.0.bazel" - } - }, - "rules_rust_proto__memoffset-0.5.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/memoffset/0.5.6/download" - ], - "strip_prefix": "memoffset-0.5.6", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.memoffset-0.5.6.bazel" - } - }, - "rules_rust_proto__mio-0.6.23": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/mio/0.6.23/download" - ], - "strip_prefix": "mio-0.6.23", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.mio-0.6.23.bazel" - } - }, - "rules_rust_proto__mio-uds-0.6.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/mio-uds/0.6.8/download" - ], - "strip_prefix": "mio-uds-0.6.8", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.mio-uds-0.6.8.bazel" - } - }, - "rules_rust_proto__miow-0.2.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/miow/0.2.2/download" - ], - "strip_prefix": "miow-0.2.2", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.miow-0.2.2.bazel" - } - }, - "rules_rust_proto__net2-0.2.38": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "74d0df99cfcd2530b2e694f6e17e7f37b8e26bb23983ac530c0c97408837c631", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/net2/0.2.38/download" - ], - "strip_prefix": "net2-0.2.38", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.net2-0.2.38.bazel" - } - }, - "rules_rust_proto__num_cpus-1.15.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/num_cpus/1.15.0/download" - ], - "strip_prefix": "num_cpus-1.15.0", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.num_cpus-1.15.0.bazel" - } - }, - "rules_rust_proto__parking_lot-0.9.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/parking_lot/0.9.0/download" - ], - "strip_prefix": "parking_lot-0.9.0", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.parking_lot-0.9.0.bazel" - } - }, - "rules_rust_proto__parking_lot_core-0.6.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "bda66b810a62be75176a80873726630147a5ca780cd33921e0b5709033e66b0a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/parking_lot_core/0.6.3/download" - ], - "strip_prefix": "parking_lot_core-0.6.3", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.parking_lot_core-0.6.3.bazel" - } - }, - "rules_rust_proto__protobuf-2.8.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "patch_args": [ - "-p1" - ], - "patches": [ - "@@rules_rust~//proto/protobuf/3rdparty/patches:protobuf-2.8.2.patch" - ], - "sha256": "70731852eec72c56d11226c8a5f96ad5058a3dab73647ca5f7ee351e464f2571", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/protobuf/2.8.2/download" - ], - "strip_prefix": "protobuf-2.8.2", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.protobuf-2.8.2.bazel" - } - }, - "rules_rust_proto__protobuf-codegen-2.8.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3d74b9cbbf2ac9a7169c85a3714ec16c51ee9ec7cfd511549527e9a7df720795", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/protobuf-codegen/2.8.2/download" - ], - "strip_prefix": "protobuf-codegen-2.8.2", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.protobuf-codegen-2.8.2.bazel" - } - }, - "rules_rust_proto__redox_syscall-0.1.57": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/redox_syscall/0.1.57/download" - ], - "strip_prefix": "redox_syscall-0.1.57", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.redox_syscall-0.1.57.bazel" - } - }, - "rules_rust_proto__rustc_version-0.2.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rustc_version/0.2.3/download" - ], - "strip_prefix": "rustc_version-0.2.3", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.rustc_version-0.2.3.bazel" - } - }, - "rules_rust_proto__safemem-0.3.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/safemem/0.3.3/download" - ], - "strip_prefix": "safemem-0.3.3", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.safemem-0.3.3.bazel" - } - }, - "rules_rust_proto__scoped-tls-0.1.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "332ffa32bf586782a3efaeb58f127980944bbc8c4d6913a86107ac2a5ab24b28", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/scoped-tls/0.1.2/download" - ], - "strip_prefix": "scoped-tls-0.1.2", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.scoped-tls-0.1.2.bazel" - } - }, - "rules_rust_proto__scopeguard-1.1.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/scopeguard/1.1.0/download" - ], - "strip_prefix": "scopeguard-1.1.0", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.scopeguard-1.1.0.bazel" - } - }, - "rules_rust_proto__semver-0.9.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/semver/0.9.0/download" - ], - "strip_prefix": "semver-0.9.0", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.semver-0.9.0.bazel" - } - }, - "rules_rust_proto__semver-parser-0.7.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/semver-parser/0.7.0/download" - ], - "strip_prefix": "semver-parser-0.7.0", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.semver-parser-0.7.0.bazel" - } - }, - "rules_rust_proto__slab-0.3.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/slab/0.3.0/download" - ], - "strip_prefix": "slab-0.3.0", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.slab-0.3.0.bazel" - } - }, - "rules_rust_proto__slab-0.4.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/slab/0.4.7/download" - ], - "strip_prefix": "slab-0.4.7", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.slab-0.4.7.bazel" - } - }, - "rules_rust_proto__smallvec-0.6.14": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/smallvec/0.6.14/download" - ], - "strip_prefix": "smallvec-0.6.14", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.smallvec-0.6.14.bazel" - } - }, - "rules_rust_proto__tls-api-0.1.22": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "049c03787a0595182357fbd487577947f4351b78ce20c3668f6d49f17feb13d1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tls-api/0.1.22/download" - ], - "strip_prefix": "tls-api-0.1.22", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tls-api-0.1.22.bazel" - } - }, - "rules_rust_proto__tls-api-stub-0.1.22": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "c9a0cc8c149724db9de7d73a0e1bc80b1a74f5394f08c6f301e11f9c35fa061e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tls-api-stub/0.1.22/download" - ], - "strip_prefix": "tls-api-stub-0.1.22", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tls-api-stub-0.1.22.bazel" - } - }, - "rules_rust_proto__tokio-0.1.22": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio/0.1.22/download" - ], - "strip_prefix": "tokio-0.1.22", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-0.1.22.bazel" - } - }, - "rules_rust_proto__tokio-codec-0.1.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "25b2998660ba0e70d18684de5d06b70b70a3a747469af9dea7618cc59e75976b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-codec/0.1.2/download" - ], - "strip_prefix": "tokio-codec-0.1.2", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-codec-0.1.2.bazel" - } - }, - "rules_rust_proto__tokio-core-0.1.18": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "87b1395334443abca552f63d4f61d0486f12377c2ba8b368e523f89e828cffd4", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-core/0.1.18/download" - ], - "strip_prefix": "tokio-core-0.1.18", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-core-0.1.18.bazel" - } - }, - "rules_rust_proto__tokio-current-thread-0.1.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-current-thread/0.1.7/download" - ], - "strip_prefix": "tokio-current-thread-0.1.7", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-current-thread-0.1.7.bazel" - } - }, - "rules_rust_proto__tokio-executor-0.1.10": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-executor/0.1.10/download" - ], - "strip_prefix": "tokio-executor-0.1.10", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-executor-0.1.10.bazel" - } - }, - "rules_rust_proto__tokio-fs-0.1.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "297a1206e0ca6302a0eed35b700d292b275256f596e2f3fea7729d5e629b6ff4", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-fs/0.1.7/download" - ], - "strip_prefix": "tokio-fs-0.1.7", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-fs-0.1.7.bazel" - } - }, - "rules_rust_proto__tokio-io-0.1.13": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-io/0.1.13/download" - ], - "strip_prefix": "tokio-io-0.1.13", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-io-0.1.13.bazel" - } - }, - "rules_rust_proto__tokio-reactor-0.1.12": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-reactor/0.1.12/download" - ], - "strip_prefix": "tokio-reactor-0.1.12", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-reactor-0.1.12.bazel" - } - }, - "rules_rust_proto__tokio-sync-0.1.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-sync/0.1.8/download" - ], - "strip_prefix": "tokio-sync-0.1.8", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-sync-0.1.8.bazel" - } - }, - "rules_rust_proto__tokio-tcp-0.1.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-tcp/0.1.4/download" - ], - "strip_prefix": "tokio-tcp-0.1.4", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-tcp-0.1.4.bazel" - } - }, - "rules_rust_proto__tokio-threadpool-0.1.18": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-threadpool/0.1.18/download" - ], - "strip_prefix": "tokio-threadpool-0.1.18", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-threadpool-0.1.18.bazel" - } - }, - "rules_rust_proto__tokio-timer-0.1.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "6131e780037787ff1b3f8aad9da83bca02438b72277850dd6ad0d455e0e20efc", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-timer/0.1.2/download" - ], - "strip_prefix": "tokio-timer-0.1.2", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-timer-0.1.2.bazel" - } - }, - "rules_rust_proto__tokio-timer-0.2.13": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-timer/0.2.13/download" - ], - "strip_prefix": "tokio-timer-0.2.13", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-timer-0.2.13.bazel" - } - }, - "rules_rust_proto__tokio-tls-api-0.1.22": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "68d0e040d5b1f4cfca70ec4f371229886a5de5bb554d272a4a8da73004a7b2c9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-tls-api/0.1.22/download" - ], - "strip_prefix": "tokio-tls-api-0.1.22", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-tls-api-0.1.22.bazel" - } - }, - "rules_rust_proto__tokio-udp-0.1.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e2a0b10e610b39c38b031a2fcab08e4b82f16ece36504988dcbd81dbba650d82", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-udp/0.1.6/download" - ], - "strip_prefix": "tokio-udp-0.1.6", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-udp-0.1.6.bazel" - } - }, - "rules_rust_proto__tokio-uds-0.1.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "65ae5d255ce739e8537221ed2942e0445f4b3b813daebac1c0050ddaaa3587f9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-uds/0.1.7/download" - ], - "strip_prefix": "tokio-uds-0.1.7", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-uds-0.1.7.bazel" - } - }, - "rules_rust_proto__tokio-uds-0.2.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ab57a4ac4111c8c9dbcf70779f6fc8bc35ae4b2454809febac840ad19bd7e4e0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tokio-uds/0.2.7/download" - ], - "strip_prefix": "tokio-uds-0.2.7", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.tokio-uds-0.2.7.bazel" - } - }, - "rules_rust_proto__unix_socket-0.5.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "6aa2700417c405c38f5e6902d699345241c28c0b7ade4abaad71e35a87eb1564", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unix_socket/0.5.0/download" - ], - "strip_prefix": "unix_socket-0.5.0", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.unix_socket-0.5.0.bazel" - } - }, - "rules_rust_proto__void-1.0.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/void/1.0.2/download" - ], - "strip_prefix": "void-1.0.2", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.void-1.0.2.bazel" - } - }, - "rules_rust_proto__winapi-0.2.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi/0.2.8/download" - ], - "strip_prefix": "winapi-0.2.8", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.winapi-0.2.8.bazel" - } - }, - "rules_rust_proto__winapi-0.3.9": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi/0.3.9/download" - ], - "strip_prefix": "winapi-0.3.9", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.winapi-0.3.9.bazel" - } - }, - "rules_rust_proto__winapi-build-0.1.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi-build/0.1.1/download" - ], - "strip_prefix": "winapi-build-0.1.1", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.winapi-build-0.1.1.bazel" - } - }, - "rules_rust_proto__winapi-i686-pc-windows-gnu-0.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi-i686-pc-windows-gnu/0.4.0/download" - ], - "strip_prefix": "winapi-i686-pc-windows-gnu-0.4.0", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.winapi-i686-pc-windows-gnu-0.4.0.bazel" - } - }, - "rules_rust_proto__winapi-x86_64-pc-windows-gnu-0.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download" - ], - "strip_prefix": "winapi-x86_64-pc-windows-gnu-0.4.0", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.winapi-x86_64-pc-windows-gnu-0.4.0.bazel" - } - }, - "rules_rust_proto__ws2_32-sys-0.2.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/ws2_32-sys/0.2.1/download" - ], - "strip_prefix": "ws2_32-sys-0.2.1", - "build_file": "@@rules_rust~//proto/protobuf/3rdparty/crates:BUILD.ws2_32-sys-0.2.1.bazel" - } - }, - "llvm-raw": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "urls": [ - "https://github.com/llvm/llvm-project/releases/download/llvmorg-14.0.6/llvm-project-14.0.6.src.tar.xz" - ], - "strip_prefix": "llvm-project-14.0.6.src", - "sha256": "8b3cfd7bc695bd6cea0f37f53f0981f34f87496e79e2529874fd03a2f9dd3a8a", - "build_file_content": "# empty", - "patch_args": [ - "-p1" - ], - "patches": [ - "@@rules_rust~//bindgen/3rdparty/patches:llvm-project.cxx17.patch", - "@@rules_rust~//bindgen/3rdparty/patches:llvm-project.incompatible_disallow_empty_glob.patch" - ] - } - }, - "rules_rust_bindgen__bindgen-cli-0.70.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "integrity": "sha256-Mz+eRtWNh1r7irkjwi27fmF4j1WtKPK12Yv5ENkL1ao=", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/bindgen-cli/bindgen-cli-0.70.1.crate" - ], - "strip_prefix": "bindgen-cli-0.70.1", - "build_file": "@@rules_rust~//bindgen/3rdparty:BUILD.bindgen-cli.bazel" - } - }, - "rules_rust_bindgen__aho-corasick-1.1.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/aho-corasick/1.1.3/download" - ], - "strip_prefix": "aho-corasick-1.1.3", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.aho-corasick-1.1.3.bazel" - } - }, - "rules_rust_bindgen__annotate-snippets-0.9.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ccaf7e9dfbb6ab22c82e473cd1a8a7bd313c19a5b7e40970f3d89ef5a5c9e81e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/annotate-snippets/0.9.2/download" - ], - "strip_prefix": "annotate-snippets-0.9.2", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.annotate-snippets-0.9.2.bazel" - } - }, - "rules_rust_bindgen__anstream-0.6.15": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anstream/0.6.15/download" - ], - "strip_prefix": "anstream-0.6.15", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.anstream-0.6.15.bazel" - } - }, - "rules_rust_bindgen__anstyle-1.0.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anstyle/1.0.8/download" - ], - "strip_prefix": "anstyle-1.0.8", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.anstyle-1.0.8.bazel" - } - }, - "rules_rust_bindgen__anstyle-parse-0.2.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anstyle-parse/0.2.5/download" - ], - "strip_prefix": "anstyle-parse-0.2.5", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.anstyle-parse-0.2.5.bazel" - } - }, - "rules_rust_bindgen__anstyle-query-1.1.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anstyle-query/1.1.1/download" - ], - "strip_prefix": "anstyle-query-1.1.1", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.anstyle-query-1.1.1.bazel" - } - }, - "rules_rust_bindgen__anstyle-wincon-3.0.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anstyle-wincon/3.0.4/download" - ], - "strip_prefix": "anstyle-wincon-3.0.4", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.anstyle-wincon-3.0.4.bazel" - } - }, - "rules_rust_bindgen__bindgen-0.70.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/bindgen/0.70.1/download" - ], - "strip_prefix": "bindgen-0.70.1", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.bindgen-0.70.1.bazel" - } - }, - "rules_rust_bindgen__bitflags-2.6.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/bitflags/2.6.0/download" - ], - "strip_prefix": "bitflags-2.6.0", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.bitflags-2.6.0.bazel" - } - }, - "rules_rust_bindgen__cexpr-0.6.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/cexpr/0.6.0/download" - ], - "strip_prefix": "cexpr-0.6.0", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.cexpr-0.6.0.bazel" - } - }, - "rules_rust_bindgen__cfg-if-1.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/cfg-if/1.0.0/download" - ], - "strip_prefix": "cfg-if-1.0.0", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.cfg-if-1.0.0.bazel" - } - }, - "rules_rust_bindgen__clang-sys-1.8.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/clang-sys/1.8.1/download" - ], - "strip_prefix": "clang-sys-1.8.1", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.clang-sys-1.8.1.bazel" - } - }, - "rules_rust_bindgen__clap-4.5.17": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/clap/4.5.17/download" - ], - "strip_prefix": "clap-4.5.17", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.clap-4.5.17.bazel" - } - }, - "rules_rust_bindgen__clap_builder-4.5.17": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/clap_builder/4.5.17/download" - ], - "strip_prefix": "clap_builder-4.5.17", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.clap_builder-4.5.17.bazel" - } - }, - "rules_rust_bindgen__clap_complete-4.5.26": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "205d5ef6d485fa47606b98b0ddc4ead26eb850aaa86abfb562a94fb3280ecba0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/clap_complete/4.5.26/download" - ], - "strip_prefix": "clap_complete-4.5.26", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.clap_complete-4.5.26.bazel" - } - }, - "rules_rust_bindgen__clap_derive-4.5.13": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/clap_derive/4.5.13/download" - ], - "strip_prefix": "clap_derive-4.5.13", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.clap_derive-4.5.13.bazel" - } - }, - "rules_rust_bindgen__clap_lex-0.7.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/clap_lex/0.7.2/download" - ], - "strip_prefix": "clap_lex-0.7.2", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.clap_lex-0.7.2.bazel" - } - }, - "rules_rust_bindgen__colorchoice-1.0.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/colorchoice/1.0.2/download" - ], - "strip_prefix": "colorchoice-1.0.2", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.colorchoice-1.0.2.bazel" - } - }, - "rules_rust_bindgen__either-1.13.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/either/1.13.0/download" - ], - "strip_prefix": "either-1.13.0", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.either-1.13.0.bazel" - } - }, - "rules_rust_bindgen__env_logger-0.10.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/env_logger/0.10.2/download" - ], - "strip_prefix": "env_logger-0.10.2", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.env_logger-0.10.2.bazel" - } - }, - "rules_rust_bindgen__glob-0.3.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/glob/0.3.1/download" - ], - "strip_prefix": "glob-0.3.1", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.glob-0.3.1.bazel" - } - }, - "rules_rust_bindgen__heck-0.5.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/heck/0.5.0/download" - ], - "strip_prefix": "heck-0.5.0", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.heck-0.5.0.bazel" - } - }, - "rules_rust_bindgen__hermit-abi-0.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/hermit-abi/0.4.0/download" - ], - "strip_prefix": "hermit-abi-0.4.0", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.hermit-abi-0.4.0.bazel" - } - }, - "rules_rust_bindgen__humantime-2.1.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/humantime/2.1.0/download" - ], - "strip_prefix": "humantime-2.1.0", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.humantime-2.1.0.bazel" - } - }, - "rules_rust_bindgen__is-terminal-0.4.13": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/is-terminal/0.4.13/download" - ], - "strip_prefix": "is-terminal-0.4.13", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.is-terminal-0.4.13.bazel" - } - }, - "rules_rust_bindgen__is_terminal_polyfill-1.70.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/is_terminal_polyfill/1.70.1/download" - ], - "strip_prefix": "is_terminal_polyfill-1.70.1", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.is_terminal_polyfill-1.70.1.bazel" - } - }, - "rules_rust_bindgen__itertools-0.13.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/itertools/0.13.0/download" - ], - "strip_prefix": "itertools-0.13.0", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.itertools-0.13.0.bazel" - } - }, - "rules_rust_bindgen__libc-0.2.158": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/libc/0.2.158/download" - ], - "strip_prefix": "libc-0.2.158", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.libc-0.2.158.bazel" - } - }, - "rules_rust_bindgen__libloading-0.8.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/libloading/0.8.5/download" - ], - "strip_prefix": "libloading-0.8.5", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.libloading-0.8.5.bazel" - } - }, - "rules_rust_bindgen__log-0.4.22": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/log/0.4.22/download" - ], - "strip_prefix": "log-0.4.22", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.log-0.4.22.bazel" - } - }, - "rules_rust_bindgen__memchr-2.7.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/memchr/2.7.4/download" - ], - "strip_prefix": "memchr-2.7.4", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.memchr-2.7.4.bazel" - } - }, - "rules_rust_bindgen__minimal-lexical-0.2.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/minimal-lexical/0.2.1/download" - ], - "strip_prefix": "minimal-lexical-0.2.1", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.minimal-lexical-0.2.1.bazel" - } - }, - "rules_rust_bindgen__nom-7.1.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/nom/7.1.3/download" - ], - "strip_prefix": "nom-7.1.3", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.nom-7.1.3.bazel" - } - }, - "rules_rust_bindgen__prettyplease-0.2.22": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/prettyplease/0.2.22/download" - ], - "strip_prefix": "prettyplease-0.2.22", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.prettyplease-0.2.22.bazel" - } - }, - "rules_rust_bindgen__proc-macro2-1.0.86": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/proc-macro2/1.0.86/download" - ], - "strip_prefix": "proc-macro2-1.0.86", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.proc-macro2-1.0.86.bazel" - } - }, - "rules_rust_bindgen__quote-1.0.37": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/quote/1.0.37/download" - ], - "strip_prefix": "quote-1.0.37", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.quote-1.0.37.bazel" - } - }, - "rules_rust_bindgen__regex-1.10.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/regex/1.10.6/download" - ], - "strip_prefix": "regex-1.10.6", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.regex-1.10.6.bazel" - } - }, - "rules_rust_bindgen__regex-automata-0.4.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/regex-automata/0.4.7/download" - ], - "strip_prefix": "regex-automata-0.4.7", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.regex-automata-0.4.7.bazel" - } - }, - "rules_rust_bindgen__regex-syntax-0.8.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/regex-syntax/0.8.4/download" - ], - "strip_prefix": "regex-syntax-0.8.4", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.regex-syntax-0.8.4.bazel" - } - }, - "rules_rust_bindgen__rustc-hash-1.1.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rustc-hash/1.1.0/download" - ], - "strip_prefix": "rustc-hash-1.1.0", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.rustc-hash-1.1.0.bazel" - } - }, - "rules_rust_bindgen__shlex-1.3.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/shlex/1.3.0/download" - ], - "strip_prefix": "shlex-1.3.0", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.shlex-1.3.0.bazel" - } - }, - "rules_rust_bindgen__strsim-0.11.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/strsim/0.11.1/download" - ], - "strip_prefix": "strsim-0.11.1", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.strsim-0.11.1.bazel" - } - }, - "rules_rust_bindgen__syn-2.0.77": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/syn/2.0.77/download" - ], - "strip_prefix": "syn-2.0.77", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.syn-2.0.77.bazel" - } - }, - "rules_rust_bindgen__termcolor-1.4.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/termcolor/1.4.1/download" - ], - "strip_prefix": "termcolor-1.4.1", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.termcolor-1.4.1.bazel" - } - }, - "rules_rust_bindgen__unicode-ident-1.0.13": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unicode-ident/1.0.13/download" - ], - "strip_prefix": "unicode-ident-1.0.13", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.unicode-ident-1.0.13.bazel" - } - }, - "rules_rust_bindgen__unicode-width-0.1.13": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unicode-width/0.1.13/download" - ], - "strip_prefix": "unicode-width-0.1.13", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.unicode-width-0.1.13.bazel" - } - }, - "rules_rust_bindgen__utf8parse-0.2.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/utf8parse/0.2.2/download" - ], - "strip_prefix": "utf8parse-0.2.2", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.utf8parse-0.2.2.bazel" - } - }, - "rules_rust_bindgen__winapi-0.3.9": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi/0.3.9/download" - ], - "strip_prefix": "winapi-0.3.9", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.winapi-0.3.9.bazel" - } - }, - "rules_rust_bindgen__winapi-i686-pc-windows-gnu-0.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi-i686-pc-windows-gnu/0.4.0/download" - ], - "strip_prefix": "winapi-i686-pc-windows-gnu-0.4.0", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.winapi-i686-pc-windows-gnu-0.4.0.bazel" - } - }, - "rules_rust_bindgen__winapi-util-0.1.9": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi-util/0.1.9/download" - ], - "strip_prefix": "winapi-util-0.1.9", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.winapi-util-0.1.9.bazel" - } - }, - "rules_rust_bindgen__winapi-x86_64-pc-windows-gnu-0.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download" - ], - "strip_prefix": "winapi-x86_64-pc-windows-gnu-0.4.0", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.winapi-x86_64-pc-windows-gnu-0.4.0.bazel" - } - }, - "rules_rust_bindgen__windows-sys-0.52.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows-sys/0.52.0/download" - ], - "strip_prefix": "windows-sys-0.52.0", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows-sys-0.52.0.bazel" - } - }, - "rules_rust_bindgen__windows-sys-0.59.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows-sys/0.59.0/download" - ], - "strip_prefix": "windows-sys-0.59.0", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows-sys-0.59.0.bazel" - } - }, - "rules_rust_bindgen__windows-targets-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows-targets/0.52.6/download" - ], - "strip_prefix": "windows-targets-0.52.6", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows-targets-0.52.6.bazel" - } - }, - "rules_rust_bindgen__windows_aarch64_gnullvm-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download" - ], - "strip_prefix": "windows_aarch64_gnullvm-0.52.6", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel" - } - }, - "rules_rust_bindgen__windows_aarch64_msvc-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download" - ], - "strip_prefix": "windows_aarch64_msvc-0.52.6", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows_aarch64_msvc-0.52.6.bazel" - } - }, - "rules_rust_bindgen__windows_i686_gnu-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_i686_gnu/0.52.6/download" - ], - "strip_prefix": "windows_i686_gnu-0.52.6", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows_i686_gnu-0.52.6.bazel" - } - }, - "rules_rust_bindgen__windows_i686_gnullvm-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download" - ], - "strip_prefix": "windows_i686_gnullvm-0.52.6", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows_i686_gnullvm-0.52.6.bazel" - } - }, - "rules_rust_bindgen__windows_i686_msvc-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_i686_msvc/0.52.6/download" - ], - "strip_prefix": "windows_i686_msvc-0.52.6", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows_i686_msvc-0.52.6.bazel" - } - }, - "rules_rust_bindgen__windows_x86_64_gnu-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download" - ], - "strip_prefix": "windows_x86_64_gnu-0.52.6", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows_x86_64_gnu-0.52.6.bazel" - } - }, - "rules_rust_bindgen__windows_x86_64_gnullvm-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download" - ], - "strip_prefix": "windows_x86_64_gnullvm-0.52.6", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel" - } - }, - "rules_rust_bindgen__windows_x86_64_msvc-0.52.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download" - ], - "strip_prefix": "windows_x86_64_msvc-0.52.6", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.windows_x86_64_msvc-0.52.6.bazel" - } - }, - "rules_rust_bindgen__yansi-term-0.1.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/yansi-term/0.1.2/download" - ], - "strip_prefix": "yansi-term-0.1.2", - "build_file": "@@rules_rust~//bindgen/3rdparty/crates:BUILD.yansi-term-0.1.2.bazel" - } - }, - "rrra__aho-corasick-1.0.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/aho-corasick/1.0.2/download" - ], - "strip_prefix": "aho-corasick-1.0.2", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.aho-corasick-1.0.2.bazel" - } - }, - "rrra__anstream-0.3.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anstream/0.3.2/download" - ], - "strip_prefix": "anstream-0.3.2", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.anstream-0.3.2.bazel" - } - }, - "rrra__anstyle-1.0.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anstyle/1.0.1/download" - ], - "strip_prefix": "anstyle-1.0.1", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.anstyle-1.0.1.bazel" - } - }, - "rrra__anstyle-parse-0.2.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anstyle-parse/0.2.1/download" - ], - "strip_prefix": "anstyle-parse-0.2.1", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.anstyle-parse-0.2.1.bazel" - } - }, - "rrra__anstyle-query-1.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anstyle-query/1.0.0/download" - ], - "strip_prefix": "anstyle-query-1.0.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.anstyle-query-1.0.0.bazel" - } - }, - "rrra__anstyle-wincon-1.0.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anstyle-wincon/1.0.1/download" - ], - "strip_prefix": "anstyle-wincon-1.0.1", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.anstyle-wincon-1.0.1.bazel" - } - }, - "rrra__anyhow-1.0.71": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anyhow/1.0.71/download" - ], - "strip_prefix": "anyhow-1.0.71", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.anyhow-1.0.71.bazel" - } - }, - "rrra__bitflags-1.3.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/bitflags/1.3.2/download" - ], - "strip_prefix": "bitflags-1.3.2", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.bitflags-1.3.2.bazel" - } - }, - "rrra__cc-1.0.79": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/cc/1.0.79/download" - ], - "strip_prefix": "cc-1.0.79", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.cc-1.0.79.bazel" - } - }, - "rrra__clap-4.3.11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1640e5cc7fb47dbb8338fd471b105e7ed6c3cb2aeb00c2e067127ffd3764a05d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/clap/4.3.11/download" - ], - "strip_prefix": "clap-4.3.11", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.clap-4.3.11.bazel" - } - }, - "rrra__clap_builder-4.3.11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "98c59138d527eeaf9b53f35a77fcc1fad9d883116070c63d5de1c7dc7b00c72b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/clap_builder/4.3.11/download" - ], - "strip_prefix": "clap_builder-4.3.11", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.clap_builder-4.3.11.bazel" - } - }, - "rrra__clap_derive-4.3.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b8cd2b2a819ad6eec39e8f1d6b53001af1e5469f8c177579cdaeb313115b825f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/clap_derive/4.3.2/download" - ], - "strip_prefix": "clap_derive-4.3.2", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.clap_derive-4.3.2.bazel" - } - }, - "rrra__clap_lex-0.5.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/clap_lex/0.5.0/download" - ], - "strip_prefix": "clap_lex-0.5.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.clap_lex-0.5.0.bazel" - } - }, - "rrra__colorchoice-1.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/colorchoice/1.0.0/download" - ], - "strip_prefix": "colorchoice-1.0.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.colorchoice-1.0.0.bazel" - } - }, - "rrra__either-1.8.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/either/1.8.1/download" - ], - "strip_prefix": "either-1.8.1", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.either-1.8.1.bazel" - } - }, - "rrra__env_logger-0.10.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/env_logger/0.10.0/download" - ], - "strip_prefix": "env_logger-0.10.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.env_logger-0.10.0.bazel" - } - }, - "rrra__errno-0.3.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/errno/0.3.1/download" - ], - "strip_prefix": "errno-0.3.1", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.errno-0.3.1.bazel" - } - }, - "rrra__errno-dragonfly-0.1.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/errno-dragonfly/0.1.2/download" - ], - "strip_prefix": "errno-dragonfly-0.1.2", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.errno-dragonfly-0.1.2.bazel" - } - }, - "rrra__heck-0.4.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/heck/0.4.1/download" - ], - "strip_prefix": "heck-0.4.1", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.heck-0.4.1.bazel" - } - }, - "rrra__hermit-abi-0.3.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/hermit-abi/0.3.2/download" - ], - "strip_prefix": "hermit-abi-0.3.2", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.hermit-abi-0.3.2.bazel" - } - }, - "rrra__humantime-2.1.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/humantime/2.1.0/download" - ], - "strip_prefix": "humantime-2.1.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.humantime-2.1.0.bazel" - } - }, - "rrra__io-lifetimes-1.0.11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/io-lifetimes/1.0.11/download" - ], - "strip_prefix": "io-lifetimes-1.0.11", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.io-lifetimes-1.0.11.bazel" - } - }, - "rrra__is-terminal-0.4.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/is-terminal/0.4.7/download" - ], - "strip_prefix": "is-terminal-0.4.7", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.is-terminal-0.4.7.bazel" - } - }, - "rrra__itertools-0.11.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/itertools/0.11.0/download" - ], - "strip_prefix": "itertools-0.11.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.itertools-0.11.0.bazel" - } - }, - "rrra__itoa-1.0.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/itoa/1.0.8/download" - ], - "strip_prefix": "itoa-1.0.8", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.itoa-1.0.8.bazel" - } - }, - "rrra__libc-0.2.147": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/libc/0.2.147/download" - ], - "strip_prefix": "libc-0.2.147", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.libc-0.2.147.bazel" - } - }, - "rrra__linux-raw-sys-0.3.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/linux-raw-sys/0.3.8/download" - ], - "strip_prefix": "linux-raw-sys-0.3.8", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.linux-raw-sys-0.3.8.bazel" - } - }, - "rrra__log-0.4.19": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/log/0.4.19/download" - ], - "strip_prefix": "log-0.4.19", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.log-0.4.19.bazel" - } - }, - "rrra__memchr-2.5.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/memchr/2.5.0/download" - ], - "strip_prefix": "memchr-2.5.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.memchr-2.5.0.bazel" - } - }, - "rrra__once_cell-1.18.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/once_cell/1.18.0/download" - ], - "strip_prefix": "once_cell-1.18.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.once_cell-1.18.0.bazel" - } - }, - "rrra__proc-macro2-1.0.64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/proc-macro2/1.0.64/download" - ], - "strip_prefix": "proc-macro2-1.0.64", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.proc-macro2-1.0.64.bazel" - } - }, - "rrra__quote-1.0.29": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/quote/1.0.29/download" - ], - "strip_prefix": "quote-1.0.29", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.quote-1.0.29.bazel" - } - }, - "rrra__regex-1.9.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/regex/1.9.1/download" - ], - "strip_prefix": "regex-1.9.1", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.regex-1.9.1.bazel" - } - }, - "rrra__regex-automata-0.3.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/regex-automata/0.3.3/download" - ], - "strip_prefix": "regex-automata-0.3.3", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.regex-automata-0.3.3.bazel" - } - }, - "rrra__regex-syntax-0.7.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/regex-syntax/0.7.4/download" - ], - "strip_prefix": "regex-syntax-0.7.4", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.regex-syntax-0.7.4.bazel" - } - }, - "rrra__rustix-0.37.23": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rustix/0.37.23/download" - ], - "strip_prefix": "rustix-0.37.23", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.rustix-0.37.23.bazel" - } - }, - "rrra__ryu-1.0.14": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/ryu/1.0.14/download" - ], - "strip_prefix": "ryu-1.0.14", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.ryu-1.0.14.bazel" - } - }, - "rrra__serde-1.0.171": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/serde/1.0.171/download" - ], - "strip_prefix": "serde-1.0.171", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.serde-1.0.171.bazel" - } - }, - "rrra__serde_derive-1.0.171": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/serde_derive/1.0.171/download" - ], - "strip_prefix": "serde_derive-1.0.171", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.serde_derive-1.0.171.bazel" - } - }, - "rrra__serde_json-1.0.102": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b5062a995d481b2308b6064e9af76011f2921c35f97b0468811ed9f6cd91dfed", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/serde_json/1.0.102/download" - ], - "strip_prefix": "serde_json-1.0.102", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.serde_json-1.0.102.bazel" - } - }, - "rrra__strsim-0.10.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/strsim/0.10.0/download" - ], - "strip_prefix": "strsim-0.10.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.strsim-0.10.0.bazel" - } - }, - "rrra__syn-2.0.25": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "15e3fc8c0c74267e2df136e5e5fb656a464158aa57624053375eb9c8c6e25ae2", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/syn/2.0.25/download" - ], - "strip_prefix": "syn-2.0.25", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.syn-2.0.25.bazel" - } - }, - "rrra__termcolor-1.2.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/termcolor/1.2.0/download" - ], - "strip_prefix": "termcolor-1.2.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.termcolor-1.2.0.bazel" - } - }, - "rrra__unicode-ident-1.0.10": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unicode-ident/1.0.10/download" - ], - "strip_prefix": "unicode-ident-1.0.10", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.unicode-ident-1.0.10.bazel" - } - }, - "rrra__utf8parse-0.2.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/utf8parse/0.2.1/download" - ], - "strip_prefix": "utf8parse-0.2.1", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.utf8parse-0.2.1.bazel" - } - }, - "rrra__winapi-0.3.9": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi/0.3.9/download" - ], - "strip_prefix": "winapi-0.3.9", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.winapi-0.3.9.bazel" - } - }, - "rrra__winapi-i686-pc-windows-gnu-0.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi-i686-pc-windows-gnu/0.4.0/download" - ], - "strip_prefix": "winapi-i686-pc-windows-gnu-0.4.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.winapi-i686-pc-windows-gnu-0.4.0.bazel" - } - }, - "rrra__winapi-util-0.1.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi-util/0.1.5/download" - ], - "strip_prefix": "winapi-util-0.1.5", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.winapi-util-0.1.5.bazel" - } - }, - "rrra__winapi-x86_64-pc-windows-gnu-0.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download" - ], - "strip_prefix": "winapi-x86_64-pc-windows-gnu-0.4.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.winapi-x86_64-pc-windows-gnu-0.4.0.bazel" - } - }, - "rrra__windows-sys-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows-sys/0.48.0/download" - ], - "strip_prefix": "windows-sys-0.48.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows-sys-0.48.0.bazel" - } - }, - "rrra__windows-targets-0.48.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows-targets/0.48.1/download" - ], - "strip_prefix": "windows-targets-0.48.1", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows-targets-0.48.1.bazel" - } - }, - "rrra__windows_aarch64_gnullvm-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.0/download" - ], - "strip_prefix": "windows_aarch64_gnullvm-0.48.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows_aarch64_gnullvm-0.48.0.bazel" - } - }, - "rrra__windows_aarch64_msvc-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_aarch64_msvc/0.48.0/download" - ], - "strip_prefix": "windows_aarch64_msvc-0.48.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows_aarch64_msvc-0.48.0.bazel" - } - }, - "rrra__windows_i686_gnu-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_i686_gnu/0.48.0/download" - ], - "strip_prefix": "windows_i686_gnu-0.48.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows_i686_gnu-0.48.0.bazel" - } - }, - "rrra__windows_i686_msvc-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_i686_msvc/0.48.0/download" - ], - "strip_prefix": "windows_i686_msvc-0.48.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows_i686_msvc-0.48.0.bazel" - } - }, - "rrra__windows_x86_64_gnu-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_gnu/0.48.0/download" - ], - "strip_prefix": "windows_x86_64_gnu-0.48.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows_x86_64_gnu-0.48.0.bazel" - } - }, - "rrra__windows_x86_64_gnullvm-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.0/download" - ], - "strip_prefix": "windows_x86_64_gnullvm-0.48.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows_x86_64_gnullvm-0.48.0.bazel" - } - }, - "rrra__windows_x86_64_msvc-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_msvc/0.48.0/download" - ], - "strip_prefix": "windows_x86_64_msvc-0.48.0", - "build_file": "@@rules_rust~//tools/rust_analyzer/3rdparty/crates:BUILD.windows_x86_64_msvc-0.48.0.bazel" - } - }, - "rules_rust_wasm_bindgen_cli": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "08f61e21873f51e3059a8c7c3eef81ede7513d161cfc60751c7b2ffa6ed28270", - "urls": [ - "https://static.crates.io/crates/wasm-bindgen-cli/wasm-bindgen-cli-0.2.92.crate" - ], - "type": "tar.gz", - "strip_prefix": "wasm-bindgen-cli-0.2.92", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty:BUILD.wasm-bindgen-cli.bazel", - "patch_args": [ - "-p1" - ], - "patches": [ - "@@rules_rust~//wasm_bindgen/3rdparty/patches:resolver.patch" - ] - } - }, - "rules_rust_wasm_bindgen__adler-1.0.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/adler/1.0.2/download" - ], - "strip_prefix": "adler-1.0.2", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.adler-1.0.2.bazel" - } - }, - "rules_rust_wasm_bindgen__aho-corasick-1.0.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/aho-corasick/1.0.2/download" - ], - "strip_prefix": "aho-corasick-1.0.2", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.aho-corasick-1.0.2.bazel" - } - }, - "rules_rust_wasm_bindgen__alloc-no-stdlib-2.0.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/alloc-no-stdlib/2.0.4/download" - ], - "strip_prefix": "alloc-no-stdlib-2.0.4", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.alloc-no-stdlib-2.0.4.bazel" - } - }, - "rules_rust_wasm_bindgen__alloc-stdlib-0.2.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/alloc-stdlib/0.2.2/download" - ], - "strip_prefix": "alloc-stdlib-0.2.2", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.alloc-stdlib-0.2.2.bazel" - } - }, - "rules_rust_wasm_bindgen__android-tzdata-0.1.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/android-tzdata/0.1.1/download" - ], - "strip_prefix": "android-tzdata-0.1.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.android-tzdata-0.1.1.bazel" - } - }, - "rules_rust_wasm_bindgen__android_system_properties-0.1.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/android_system_properties/0.1.5/download" - ], - "strip_prefix": "android_system_properties-0.1.5", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.android_system_properties-0.1.5.bazel" - } - }, - "rules_rust_wasm_bindgen__anyhow-1.0.71": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/anyhow/1.0.71/download" - ], - "strip_prefix": "anyhow-1.0.71", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.anyhow-1.0.71.bazel" - } - }, - "rules_rust_wasm_bindgen__ascii-1.1.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/ascii/1.1.0/download" - ], - "strip_prefix": "ascii-1.1.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.ascii-1.1.0.bazel" - } - }, - "rules_rust_wasm_bindgen__assert_cmd-1.0.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "c98233c6673d8601ab23e77eb38f999c51100d46c5703b17288c57fddf3a1ffe", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/assert_cmd/1.0.8/download" - ], - "strip_prefix": "assert_cmd-1.0.8", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.assert_cmd-1.0.8.bazel" - } - }, - "rules_rust_wasm_bindgen__atty-0.2.14": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/atty/0.2.14/download" - ], - "strip_prefix": "atty-0.2.14", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.atty-0.2.14.bazel" - } - }, - "rules_rust_wasm_bindgen__autocfg-1.1.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/autocfg/1.1.0/download" - ], - "strip_prefix": "autocfg-1.1.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.autocfg-1.1.0.bazel" - } - }, - "rules_rust_wasm_bindgen__base64-0.13.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/base64/0.13.1/download" - ], - "strip_prefix": "base64-0.13.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.base64-0.13.1.bazel" - } - }, - "rules_rust_wasm_bindgen__base64-0.21.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/base64/0.21.5/download" - ], - "strip_prefix": "base64-0.21.5", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.base64-0.21.5.bazel" - } - }, - "rules_rust_wasm_bindgen__bitflags-1.3.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/bitflags/1.3.2/download" - ], - "strip_prefix": "bitflags-1.3.2", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.bitflags-1.3.2.bazel" - } - }, - "rules_rust_wasm_bindgen__brotli-decompressor-2.5.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/brotli-decompressor/2.5.1/download" - ], - "strip_prefix": "brotli-decompressor-2.5.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.brotli-decompressor-2.5.1.bazel" - } - }, - "rules_rust_wasm_bindgen__bstr-0.2.17": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/bstr/0.2.17/download" - ], - "strip_prefix": "bstr-0.2.17", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.bstr-0.2.17.bazel" - } - }, - "rules_rust_wasm_bindgen__buf_redux-0.8.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/buf_redux/0.8.4/download" - ], - "strip_prefix": "buf_redux-0.8.4", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.buf_redux-0.8.4.bazel" - } - }, - "rules_rust_wasm_bindgen__bumpalo-3.13.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/bumpalo/3.13.0/download" - ], - "strip_prefix": "bumpalo-3.13.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.bumpalo-3.13.0.bazel" - } - }, - "rules_rust_wasm_bindgen__cc-1.0.83": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/cc/1.0.83/download" - ], - "strip_prefix": "cc-1.0.83", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.cc-1.0.83.bazel" - } - }, - "rules_rust_wasm_bindgen__cfg-if-1.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/cfg-if/1.0.0/download" - ], - "strip_prefix": "cfg-if-1.0.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.cfg-if-1.0.0.bazel" - } - }, - "rules_rust_wasm_bindgen__chrono-0.4.26": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/chrono/0.4.26/download" - ], - "strip_prefix": "chrono-0.4.26", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.chrono-0.4.26.bazel" - } - }, - "rules_rust_wasm_bindgen__chunked_transfer-1.4.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "cca491388666e04d7248af3f60f0c40cfb0991c72205595d7c396e3510207d1a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/chunked_transfer/1.4.1/download" - ], - "strip_prefix": "chunked_transfer-1.4.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.chunked_transfer-1.4.1.bazel" - } - }, - "rules_rust_wasm_bindgen__core-foundation-sys-0.8.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/core-foundation-sys/0.8.4/download" - ], - "strip_prefix": "core-foundation-sys-0.8.4", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.core-foundation-sys-0.8.4.bazel" - } - }, - "rules_rust_wasm_bindgen__crc32fast-1.3.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/crc32fast/1.3.2/download" - ], - "strip_prefix": "crc32fast-1.3.2", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.crc32fast-1.3.2.bazel" - } - }, - "rules_rust_wasm_bindgen__crossbeam-channel-0.5.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/crossbeam-channel/0.5.8/download" - ], - "strip_prefix": "crossbeam-channel-0.5.8", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.crossbeam-channel-0.5.8.bazel" - } - }, - "rules_rust_wasm_bindgen__crossbeam-deque-0.8.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/crossbeam-deque/0.8.3/download" - ], - "strip_prefix": "crossbeam-deque-0.8.3", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.crossbeam-deque-0.8.3.bazel" - } - }, - "rules_rust_wasm_bindgen__crossbeam-epoch-0.9.15": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/crossbeam-epoch/0.9.15/download" - ], - "strip_prefix": "crossbeam-epoch-0.9.15", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.crossbeam-epoch-0.9.15.bazel" - } - }, - "rules_rust_wasm_bindgen__crossbeam-utils-0.8.16": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/crossbeam-utils/0.8.16/download" - ], - "strip_prefix": "crossbeam-utils-0.8.16", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.crossbeam-utils-0.8.16.bazel" - } - }, - "rules_rust_wasm_bindgen__diff-0.1.13": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/diff/0.1.13/download" - ], - "strip_prefix": "diff-0.1.13", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.diff-0.1.13.bazel" - } - }, - "rules_rust_wasm_bindgen__difference-2.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/difference/2.0.0/download" - ], - "strip_prefix": "difference-2.0.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.difference-2.0.0.bazel" - } - }, - "rules_rust_wasm_bindgen__difflib-0.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/difflib/0.4.0/download" - ], - "strip_prefix": "difflib-0.4.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.difflib-0.4.0.bazel" - } - }, - "rules_rust_wasm_bindgen__doc-comment-0.3.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/doc-comment/0.3.3/download" - ], - "strip_prefix": "doc-comment-0.3.3", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.doc-comment-0.3.3.bazel" - } - }, - "rules_rust_wasm_bindgen__docopt-1.1.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7f3f119846c823f9eafcf953a8f6ffb6ed69bf6240883261a7f13b634579a51f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/docopt/1.1.1/download" - ], - "strip_prefix": "docopt-1.1.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.docopt-1.1.1.bazel" - } - }, - "rules_rust_wasm_bindgen__either-1.8.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/either/1.8.1/download" - ], - "strip_prefix": "either-1.8.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.either-1.8.1.bazel" - } - }, - "rules_rust_wasm_bindgen__env_logger-0.8.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/env_logger/0.8.4/download" - ], - "strip_prefix": "env_logger-0.8.4", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.env_logger-0.8.4.bazel" - } - }, - "rules_rust_wasm_bindgen__equivalent-1.0.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/equivalent/1.0.1/download" - ], - "strip_prefix": "equivalent-1.0.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.equivalent-1.0.1.bazel" - } - }, - "rules_rust_wasm_bindgen__errno-0.3.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/errno/0.3.1/download" - ], - "strip_prefix": "errno-0.3.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.errno-0.3.1.bazel" - } - }, - "rules_rust_wasm_bindgen__errno-dragonfly-0.1.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/errno-dragonfly/0.1.2/download" - ], - "strip_prefix": "errno-dragonfly-0.1.2", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.errno-dragonfly-0.1.2.bazel" - } - }, - "rules_rust_wasm_bindgen__fallible-iterator-0.2.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/fallible-iterator/0.2.0/download" - ], - "strip_prefix": "fallible-iterator-0.2.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.fallible-iterator-0.2.0.bazel" - } - }, - "rules_rust_wasm_bindgen__fastrand-1.9.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/fastrand/1.9.0/download" - ], - "strip_prefix": "fastrand-1.9.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.fastrand-1.9.0.bazel" - } - }, - "rules_rust_wasm_bindgen__filetime-0.2.21": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/filetime/0.2.21/download" - ], - "strip_prefix": "filetime-0.2.21", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.filetime-0.2.21.bazel" - } - }, - "rules_rust_wasm_bindgen__flate2-1.0.28": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/flate2/1.0.28/download" - ], - "strip_prefix": "flate2-1.0.28", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.flate2-1.0.28.bazel" - } - }, - "rules_rust_wasm_bindgen__float-cmp-0.8.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e1267f4ac4f343772758f7b1bdcbe767c218bbab93bb432acbf5162bbf85a6c4", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/float-cmp/0.8.0/download" - ], - "strip_prefix": "float-cmp-0.8.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.float-cmp-0.8.0.bazel" - } - }, - "rules_rust_wasm_bindgen__form_urlencoded-1.2.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/form_urlencoded/1.2.0/download" - ], - "strip_prefix": "form_urlencoded-1.2.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.form_urlencoded-1.2.0.bazel" - } - }, - "rules_rust_wasm_bindgen__getrandom-0.2.10": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/getrandom/0.2.10/download" - ], - "strip_prefix": "getrandom-0.2.10", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.getrandom-0.2.10.bazel" - } - }, - "rules_rust_wasm_bindgen__gimli-0.26.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/gimli/0.26.2/download" - ], - "strip_prefix": "gimli-0.26.2", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.gimli-0.26.2.bazel" - } - }, - "rules_rust_wasm_bindgen__hashbrown-0.12.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/hashbrown/0.12.3/download" - ], - "strip_prefix": "hashbrown-0.12.3", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.hashbrown-0.12.3.bazel" - } - }, - "rules_rust_wasm_bindgen__hashbrown-0.14.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/hashbrown/0.14.0/download" - ], - "strip_prefix": "hashbrown-0.14.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.hashbrown-0.14.0.bazel" - } - }, - "rules_rust_wasm_bindgen__heck-0.3.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/heck/0.3.3/download" - ], - "strip_prefix": "heck-0.3.3", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.heck-0.3.3.bazel" - } - }, - "rules_rust_wasm_bindgen__hermit-abi-0.1.19": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/hermit-abi/0.1.19/download" - ], - "strip_prefix": "hermit-abi-0.1.19", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.hermit-abi-0.1.19.bazel" - } - }, - "rules_rust_wasm_bindgen__hermit-abi-0.3.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/hermit-abi/0.3.2/download" - ], - "strip_prefix": "hermit-abi-0.3.2", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.hermit-abi-0.3.2.bazel" - } - }, - "rules_rust_wasm_bindgen__httparse-1.8.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/httparse/1.8.0/download" - ], - "strip_prefix": "httparse-1.8.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.httparse-1.8.0.bazel" - } - }, - "rules_rust_wasm_bindgen__httpdate-1.0.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/httpdate/1.0.2/download" - ], - "strip_prefix": "httpdate-1.0.2", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.httpdate-1.0.2.bazel" - } - }, - "rules_rust_wasm_bindgen__humantime-2.1.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/humantime/2.1.0/download" - ], - "strip_prefix": "humantime-2.1.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.humantime-2.1.0.bazel" - } - }, - "rules_rust_wasm_bindgen__iana-time-zone-0.1.57": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/iana-time-zone/0.1.57/download" - ], - "strip_prefix": "iana-time-zone-0.1.57", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.iana-time-zone-0.1.57.bazel" - } - }, - "rules_rust_wasm_bindgen__iana-time-zone-haiku-0.1.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/iana-time-zone-haiku/0.1.2/download" - ], - "strip_prefix": "iana-time-zone-haiku-0.1.2", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.iana-time-zone-haiku-0.1.2.bazel" - } - }, - "rules_rust_wasm_bindgen__id-arena-2.2.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/id-arena/2.2.1/download" - ], - "strip_prefix": "id-arena-2.2.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.id-arena-2.2.1.bazel" - } - }, - "rules_rust_wasm_bindgen__idna-0.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/idna/0.4.0/download" - ], - "strip_prefix": "idna-0.4.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.idna-0.4.0.bazel" - } - }, - "rules_rust_wasm_bindgen__indexmap-1.9.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/indexmap/1.9.3/download" - ], - "strip_prefix": "indexmap-1.9.3", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.indexmap-1.9.3.bazel" - } - }, - "rules_rust_wasm_bindgen__indexmap-2.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/indexmap/2.0.0/download" - ], - "strip_prefix": "indexmap-2.0.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.indexmap-2.0.0.bazel" - } - }, - "rules_rust_wasm_bindgen__instant-0.1.12": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/instant/0.1.12/download" - ], - "strip_prefix": "instant-0.1.12", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.instant-0.1.12.bazel" - } - }, - "rules_rust_wasm_bindgen__io-lifetimes-1.0.11": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/io-lifetimes/1.0.11/download" - ], - "strip_prefix": "io-lifetimes-1.0.11", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.io-lifetimes-1.0.11.bazel" - } - }, - "rules_rust_wasm_bindgen__itertools-0.10.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/itertools/0.10.5/download" - ], - "strip_prefix": "itertools-0.10.5", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.itertools-0.10.5.bazel" - } - }, - "rules_rust_wasm_bindgen__itoa-1.0.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/itoa/1.0.8/download" - ], - "strip_prefix": "itoa-1.0.8", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.itoa-1.0.8.bazel" - } - }, - "rules_rust_wasm_bindgen__js-sys-0.3.64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/js-sys/0.3.64/download" - ], - "strip_prefix": "js-sys-0.3.64", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.js-sys-0.3.64.bazel" - } - }, - "rules_rust_wasm_bindgen__lazy_static-1.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/lazy_static/1.4.0/download" - ], - "strip_prefix": "lazy_static-1.4.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.lazy_static-1.4.0.bazel" - } - }, - "rules_rust_wasm_bindgen__leb128-0.2.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/leb128/0.2.5/download" - ], - "strip_prefix": "leb128-0.2.5", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.leb128-0.2.5.bazel" - } - }, - "rules_rust_wasm_bindgen__libc-0.2.150": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/libc/0.2.150/download" - ], - "strip_prefix": "libc-0.2.150", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.libc-0.2.150.bazel" - } - }, - "rules_rust_wasm_bindgen__linux-raw-sys-0.3.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/linux-raw-sys/0.3.8/download" - ], - "strip_prefix": "linux-raw-sys-0.3.8", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.linux-raw-sys-0.3.8.bazel" - } - }, - "rules_rust_wasm_bindgen__log-0.4.19": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/log/0.4.19/download" - ], - "strip_prefix": "log-0.4.19", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.log-0.4.19.bazel" - } - }, - "rules_rust_wasm_bindgen__memchr-2.5.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/memchr/2.5.0/download" - ], - "strip_prefix": "memchr-2.5.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.memchr-2.5.0.bazel" - } - }, - "rules_rust_wasm_bindgen__memoffset-0.9.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/memoffset/0.9.0/download" - ], - "strip_prefix": "memoffset-0.9.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.memoffset-0.9.0.bazel" - } - }, - "rules_rust_wasm_bindgen__mime-0.3.17": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/mime/0.3.17/download" - ], - "strip_prefix": "mime-0.3.17", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.mime-0.3.17.bazel" - } - }, - "rules_rust_wasm_bindgen__mime_guess-2.0.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/mime_guess/2.0.4/download" - ], - "strip_prefix": "mime_guess-2.0.4", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.mime_guess-2.0.4.bazel" - } - }, - "rules_rust_wasm_bindgen__miniz_oxide-0.7.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/miniz_oxide/0.7.1/download" - ], - "strip_prefix": "miniz_oxide-0.7.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.miniz_oxide-0.7.1.bazel" - } - }, - "rules_rust_wasm_bindgen__multipart-0.18.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "00dec633863867f29cb39df64a397cdf4a6354708ddd7759f70c7fb51c5f9182", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/multipart/0.18.0/download" - ], - "strip_prefix": "multipart-0.18.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.multipart-0.18.0.bazel" - } - }, - "rules_rust_wasm_bindgen__normalize-line-endings-0.3.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/normalize-line-endings/0.3.0/download" - ], - "strip_prefix": "normalize-line-endings-0.3.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.normalize-line-endings-0.3.0.bazel" - } - }, - "rules_rust_wasm_bindgen__num-traits-0.2.15": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/num-traits/0.2.15/download" - ], - "strip_prefix": "num-traits-0.2.15", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.num-traits-0.2.15.bazel" - } - }, - "rules_rust_wasm_bindgen__num_cpus-1.16.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/num_cpus/1.16.0/download" - ], - "strip_prefix": "num_cpus-1.16.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.num_cpus-1.16.0.bazel" - } - }, - "rules_rust_wasm_bindgen__num_threads-0.1.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/num_threads/0.1.6/download" - ], - "strip_prefix": "num_threads-0.1.6", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.num_threads-0.1.6.bazel" - } - }, - "rules_rust_wasm_bindgen__once_cell-1.18.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/once_cell/1.18.0/download" - ], - "strip_prefix": "once_cell-1.18.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.once_cell-1.18.0.bazel" - } - }, - "rules_rust_wasm_bindgen__percent-encoding-2.3.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/percent-encoding/2.3.0/download" - ], - "strip_prefix": "percent-encoding-2.3.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.percent-encoding-2.3.0.bazel" - } - }, - "rules_rust_wasm_bindgen__ppv-lite86-0.2.17": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/ppv-lite86/0.2.17/download" - ], - "strip_prefix": "ppv-lite86-0.2.17", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.ppv-lite86-0.2.17.bazel" - } - }, - "rules_rust_wasm_bindgen__predicates-1.0.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f49cfaf7fdaa3bfacc6fa3e7054e65148878354a5cfddcf661df4c851f8021df", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/predicates/1.0.8/download" - ], - "strip_prefix": "predicates-1.0.8", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.predicates-1.0.8.bazel" - } - }, - "rules_rust_wasm_bindgen__predicates-2.1.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/predicates/2.1.5/download" - ], - "strip_prefix": "predicates-2.1.5", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.predicates-2.1.5.bazel" - } - }, - "rules_rust_wasm_bindgen__predicates-core-1.0.6": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/predicates-core/1.0.6/download" - ], - "strip_prefix": "predicates-core-1.0.6", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.predicates-core-1.0.6.bazel" - } - }, - "rules_rust_wasm_bindgen__predicates-tree-1.0.9": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/predicates-tree/1.0.9/download" - ], - "strip_prefix": "predicates-tree-1.0.9", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.predicates-tree-1.0.9.bazel" - } - }, - "rules_rust_wasm_bindgen__proc-macro2-1.0.64": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "78803b62cbf1f46fde80d7c0e803111524b9877184cfe7c3033659490ac7a7da", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/proc-macro2/1.0.64/download" - ], - "strip_prefix": "proc-macro2-1.0.64", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.proc-macro2-1.0.64.bazel" - } - }, - "rules_rust_wasm_bindgen__quick-error-1.2.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/quick-error/1.2.3/download" - ], - "strip_prefix": "quick-error-1.2.3", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.quick-error-1.2.3.bazel" - } - }, - "rules_rust_wasm_bindgen__quote-1.0.29": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/quote/1.0.29/download" - ], - "strip_prefix": "quote-1.0.29", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.quote-1.0.29.bazel" - } - }, - "rules_rust_wasm_bindgen__rand-0.8.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rand/0.8.5/download" - ], - "strip_prefix": "rand-0.8.5", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rand-0.8.5.bazel" - } - }, - "rules_rust_wasm_bindgen__rand_chacha-0.3.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rand_chacha/0.3.1/download" - ], - "strip_prefix": "rand_chacha-0.3.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rand_chacha-0.3.1.bazel" - } - }, - "rules_rust_wasm_bindgen__rand_core-0.6.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rand_core/0.6.4/download" - ], - "strip_prefix": "rand_core-0.6.4", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rand_core-0.6.4.bazel" - } - }, - "rules_rust_wasm_bindgen__rayon-1.7.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rayon/1.7.0/download" - ], - "strip_prefix": "rayon-1.7.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rayon-1.7.0.bazel" - } - }, - "rules_rust_wasm_bindgen__rayon-core-1.11.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rayon-core/1.11.0/download" - ], - "strip_prefix": "rayon-core-1.11.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rayon-core-1.11.0.bazel" - } - }, - "rules_rust_wasm_bindgen__redox_syscall-0.2.16": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/redox_syscall/0.2.16/download" - ], - "strip_prefix": "redox_syscall-0.2.16", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.redox_syscall-0.2.16.bazel" - } - }, - "rules_rust_wasm_bindgen__redox_syscall-0.3.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/redox_syscall/0.3.5/download" - ], - "strip_prefix": "redox_syscall-0.3.5", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.redox_syscall-0.3.5.bazel" - } - }, - "rules_rust_wasm_bindgen__regex-1.9.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/regex/1.9.1/download" - ], - "strip_prefix": "regex-1.9.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.regex-1.9.1.bazel" - } - }, - "rules_rust_wasm_bindgen__regex-automata-0.1.10": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/regex-automata/0.1.10/download" - ], - "strip_prefix": "regex-automata-0.1.10", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.regex-automata-0.1.10.bazel" - } - }, - "rules_rust_wasm_bindgen__regex-automata-0.3.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/regex-automata/0.3.3/download" - ], - "strip_prefix": "regex-automata-0.3.3", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.regex-automata-0.3.3.bazel" - } - }, - "rules_rust_wasm_bindgen__regex-syntax-0.7.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/regex-syntax/0.7.4/download" - ], - "strip_prefix": "regex-syntax-0.7.4", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.regex-syntax-0.7.4.bazel" - } - }, - "rules_rust_wasm_bindgen__ring-0.17.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "fb0205304757e5d899b9c2e448b867ffd03ae7f988002e47cd24954391394d0b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/ring/0.17.5/download" - ], - "strip_prefix": "ring-0.17.5", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.ring-0.17.5.bazel" - } - }, - "rules_rust_wasm_bindgen__rouille-3.6.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3716fbf57fc1084d7a706adf4e445298d123e4a44294c4e8213caf1b85fcc921", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rouille/3.6.2/download" - ], - "strip_prefix": "rouille-3.6.2", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rouille-3.6.2.bazel" - } - }, - "rules_rust_wasm_bindgen__rustc-demangle-0.1.23": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rustc-demangle/0.1.23/download" - ], - "strip_prefix": "rustc-demangle-0.1.23", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rustc-demangle-0.1.23.bazel" - } - }, - "rules_rust_wasm_bindgen__rustix-0.37.23": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rustix/0.37.23/download" - ], - "strip_prefix": "rustix-0.37.23", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rustix-0.37.23.bazel" - } - }, - "rules_rust_wasm_bindgen__rustls-0.21.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "446e14c5cda4f3f30fe71863c34ec70f5ac79d6087097ad0bb433e1be5edf04c", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rustls/0.21.8/download" - ], - "strip_prefix": "rustls-0.21.8", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rustls-0.21.8.bazel" - } - }, - "rules_rust_wasm_bindgen__rustls-webpki-0.101.7": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/rustls-webpki/0.101.7/download" - ], - "strip_prefix": "rustls-webpki-0.101.7", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.rustls-webpki-0.101.7.bazel" - } - }, - "rules_rust_wasm_bindgen__ryu-1.0.14": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/ryu/1.0.14/download" - ], - "strip_prefix": "ryu-1.0.14", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.ryu-1.0.14.bazel" - } - }, - "rules_rust_wasm_bindgen__safemem-0.3.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/safemem/0.3.3/download" - ], - "strip_prefix": "safemem-0.3.3", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.safemem-0.3.3.bazel" - } - }, - "rules_rust_wasm_bindgen__scopeguard-1.1.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/scopeguard/1.1.0/download" - ], - "strip_prefix": "scopeguard-1.1.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.scopeguard-1.1.0.bazel" - } - }, - "rules_rust_wasm_bindgen__sct-0.7.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/sct/0.7.1/download" - ], - "strip_prefix": "sct-0.7.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.sct-0.7.1.bazel" - } - }, - "rules_rust_wasm_bindgen__semver-1.0.17": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/semver/1.0.17/download" - ], - "strip_prefix": "semver-1.0.17", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.semver-1.0.17.bazel" - } - }, - "rules_rust_wasm_bindgen__serde-1.0.171": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "30e27d1e4fd7659406c492fd6cfaf2066ba8773de45ca75e855590f856dc34a9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/serde/1.0.171/download" - ], - "strip_prefix": "serde-1.0.171", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.serde-1.0.171.bazel" - } - }, - "rules_rust_wasm_bindgen__serde_derive-1.0.171": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "389894603bd18c46fa56231694f8d827779c0951a667087194cf9de94ed24682", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/serde_derive/1.0.171/download" - ], - "strip_prefix": "serde_derive-1.0.171", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.serde_derive-1.0.171.bazel" - } - }, - "rules_rust_wasm_bindgen__serde_json-1.0.102": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b5062a995d481b2308b6064e9af76011f2921c35f97b0468811ed9f6cd91dfed", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/serde_json/1.0.102/download" - ], - "strip_prefix": "serde_json-1.0.102", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.serde_json-1.0.102.bazel" - } - }, - "rules_rust_wasm_bindgen__sha1_smol-1.0.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/sha1_smol/1.0.0/download" - ], - "strip_prefix": "sha1_smol-1.0.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.sha1_smol-1.0.0.bazel" - } - }, - "rules_rust_wasm_bindgen__spin-0.9.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/spin/0.9.8/download" - ], - "strip_prefix": "spin-0.9.8", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.spin-0.9.8.bazel" - } - }, - "rules_rust_wasm_bindgen__stable_deref_trait-1.2.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/stable_deref_trait/1.2.0/download" - ], - "strip_prefix": "stable_deref_trait-1.2.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.stable_deref_trait-1.2.0.bazel" - } - }, - "rules_rust_wasm_bindgen__strsim-0.10.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/strsim/0.10.0/download" - ], - "strip_prefix": "strsim-0.10.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.strsim-0.10.0.bazel" - } - }, - "rules_rust_wasm_bindgen__syn-1.0.109": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/syn/1.0.109/download" - ], - "strip_prefix": "syn-1.0.109", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.syn-1.0.109.bazel" - } - }, - "rules_rust_wasm_bindgen__syn-2.0.25": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "15e3fc8c0c74267e2df136e5e5fb656a464158aa57624053375eb9c8c6e25ae2", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/syn/2.0.25/download" - ], - "strip_prefix": "syn-2.0.25", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.syn-2.0.25.bazel" - } - }, - "rules_rust_wasm_bindgen__tempfile-3.6.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tempfile/3.6.0/download" - ], - "strip_prefix": "tempfile-3.6.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.tempfile-3.6.0.bazel" - } - }, - "rules_rust_wasm_bindgen__termcolor-1.2.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/termcolor/1.2.0/download" - ], - "strip_prefix": "termcolor-1.2.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.termcolor-1.2.0.bazel" - } - }, - "rules_rust_wasm_bindgen__termtree-0.4.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/termtree/0.4.1/download" - ], - "strip_prefix": "termtree-0.4.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.termtree-0.4.1.bazel" - } - }, - "rules_rust_wasm_bindgen__threadpool-1.8.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/threadpool/1.8.1/download" - ], - "strip_prefix": "threadpool-1.8.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.threadpool-1.8.1.bazel" - } - }, - "rules_rust_wasm_bindgen__time-0.3.23": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/time/0.3.23/download" - ], - "strip_prefix": "time-0.3.23", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.time-0.3.23.bazel" - } - }, - "rules_rust_wasm_bindgen__time-core-0.1.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/time-core/0.1.1/download" - ], - "strip_prefix": "time-core-0.1.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.time-core-0.1.1.bazel" - } - }, - "rules_rust_wasm_bindgen__tiny_http-0.12.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "389915df6413a2e74fb181895f933386023c71110878cd0825588928e64cdc82", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tiny_http/0.12.0/download" - ], - "strip_prefix": "tiny_http-0.12.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.tiny_http-0.12.0.bazel" - } - }, - "rules_rust_wasm_bindgen__tinyvec-1.6.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tinyvec/1.6.0/download" - ], - "strip_prefix": "tinyvec-1.6.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.tinyvec-1.6.0.bazel" - } - }, - "rules_rust_wasm_bindgen__tinyvec_macros-0.1.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/tinyvec_macros/0.1.1/download" - ], - "strip_prefix": "tinyvec_macros-0.1.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.tinyvec_macros-0.1.1.bazel" - } - }, - "rules_rust_wasm_bindgen__twoway-0.1.8": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/twoway/0.1.8/download" - ], - "strip_prefix": "twoway-0.1.8", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.twoway-0.1.8.bazel" - } - }, - "rules_rust_wasm_bindgen__unicase-2.6.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unicase/2.6.0/download" - ], - "strip_prefix": "unicase-2.6.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.unicase-2.6.0.bazel" - } - }, - "rules_rust_wasm_bindgen__unicode-bidi-0.3.13": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unicode-bidi/0.3.13/download" - ], - "strip_prefix": "unicode-bidi-0.3.13", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.unicode-bidi-0.3.13.bazel" - } - }, - "rules_rust_wasm_bindgen__unicode-ident-1.0.10": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unicode-ident/1.0.10/download" - ], - "strip_prefix": "unicode-ident-1.0.10", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.unicode-ident-1.0.10.bazel" - } - }, - "rules_rust_wasm_bindgen__unicode-normalization-0.1.22": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unicode-normalization/0.1.22/download" - ], - "strip_prefix": "unicode-normalization-0.1.22", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.unicode-normalization-0.1.22.bazel" - } - }, - "rules_rust_wasm_bindgen__unicode-segmentation-1.10.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/unicode-segmentation/1.10.1/download" - ], - "strip_prefix": "unicode-segmentation-1.10.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.unicode-segmentation-1.10.1.bazel" - } - }, - "rules_rust_wasm_bindgen__untrusted-0.9.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/untrusted/0.9.0/download" - ], - "strip_prefix": "untrusted-0.9.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.untrusted-0.9.0.bazel" - } - }, - "rules_rust_wasm_bindgen__ureq-2.8.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "f5ccd538d4a604753ebc2f17cd9946e89b77bf87f6a8e2309667c6f2e87855e3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/ureq/2.8.0/download" - ], - "strip_prefix": "ureq-2.8.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.ureq-2.8.0.bazel" - } - }, - "rules_rust_wasm_bindgen__url-2.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/url/2.4.0/download" - ], - "strip_prefix": "url-2.4.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.url-2.4.0.bazel" - } - }, - "rules_rust_wasm_bindgen__version_check-0.9.4": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/version_check/0.9.4/download" - ], - "strip_prefix": "version_check-0.9.4", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.version_check-0.9.4.bazel" - } - }, - "rules_rust_wasm_bindgen__wait-timeout-0.2.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wait-timeout/0.2.0/download" - ], - "strip_prefix": "wait-timeout-0.2.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wait-timeout-0.2.0.bazel" - } - }, - "rules_rust_wasm_bindgen__walrus-0.20.3": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2c03529cd0c4400a2449f640d2f27cd1b48c3065226d15e26d98e4429ab0adb7", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/walrus/0.20.3/download" - ], - "strip_prefix": "walrus-0.20.3", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.walrus-0.20.3.bazel" - } - }, - "rules_rust_wasm_bindgen__walrus-macro-0.19.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "0a6e5bd22c71e77d60140b0bd5be56155a37e5bd14e24f5f87298040d0cc40d7", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/walrus-macro/0.19.0/download" - ], - "strip_prefix": "walrus-macro-0.19.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.walrus-macro-0.19.0.bazel" - } - }, - "rules_rust_wasm_bindgen__wasi-0.11.0-wasi-snapshot-preview1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasi/0.11.0+wasi-snapshot-preview1/download" - ], - "strip_prefix": "wasi-0.11.0+wasi-snapshot-preview1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasi-0.11.0+wasi-snapshot-preview1.bazel" - } - }, - "rules_rust_wasm_bindgen__wasm-bindgen-0.2.92": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasm-bindgen/0.2.92/download" - ], - "strip_prefix": "wasm-bindgen-0.2.92", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-0.2.92.bazel" - } - }, - "rules_rust_wasm_bindgen__wasm-bindgen-backend-0.2.92": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasm-bindgen-backend/0.2.92/download" - ], - "strip_prefix": "wasm-bindgen-backend-0.2.92", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-backend-0.2.92.bazel" - } - }, - "rules_rust_wasm_bindgen__wasm-bindgen-cli-support-0.2.92": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ca821da8c1ae6c87c5e94493939a206daa8587caff227c6032e0061a3d80817f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasm-bindgen-cli-support/0.2.92/download" - ], - "strip_prefix": "wasm-bindgen-cli-support-0.2.92", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-cli-support-0.2.92.bazel" - } - }, - "rules_rust_wasm_bindgen__wasm-bindgen-externref-xform-0.2.92": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "102582726b35a30d53157fbf8de3d0f0fed4c40c0c7951d69a034e9ef01da725", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasm-bindgen-externref-xform/0.2.92/download" - ], - "strip_prefix": "wasm-bindgen-externref-xform-0.2.92", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-externref-xform-0.2.92.bazel" - } - }, - "rules_rust_wasm_bindgen__wasm-bindgen-macro-0.2.92": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasm-bindgen-macro/0.2.92/download" - ], - "strip_prefix": "wasm-bindgen-macro-0.2.92", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-macro-0.2.92.bazel" - } - }, - "rules_rust_wasm_bindgen__wasm-bindgen-macro-support-0.2.92": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.92/download" - ], - "strip_prefix": "wasm-bindgen-macro-support-0.2.92", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-macro-support-0.2.92.bazel" - } - }, - "rules_rust_wasm_bindgen__wasm-bindgen-multi-value-xform-0.2.92": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "3498e4799f43523d780ceff498f04d882a8dbc9719c28020034822e5952f32a4", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasm-bindgen-multi-value-xform/0.2.92/download" - ], - "strip_prefix": "wasm-bindgen-multi-value-xform-0.2.92", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-multi-value-xform-0.2.92.bazel" - } - }, - "rules_rust_wasm_bindgen__wasm-bindgen-shared-0.2.92": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasm-bindgen-shared/0.2.92/download" - ], - "strip_prefix": "wasm-bindgen-shared-0.2.92", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-shared-0.2.92.bazel" - } - }, - "rules_rust_wasm_bindgen__wasm-bindgen-threads-xform-0.2.92": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "2d5add359b7f7d09a55299a9d29be54414264f2b8cf84f8c8fda5be9269b5dd9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasm-bindgen-threads-xform/0.2.92/download" - ], - "strip_prefix": "wasm-bindgen-threads-xform-0.2.92", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-threads-xform-0.2.92.bazel" - } - }, - "rules_rust_wasm_bindgen__wasm-bindgen-wasm-conventions-0.2.92": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "8c04e3607b810e76768260db3a5f2e8beb477cb089ef8726da85c8eb9bd3b575", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasm-bindgen-wasm-conventions/0.2.92/download" - ], - "strip_prefix": "wasm-bindgen-wasm-conventions-0.2.92", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-wasm-conventions-0.2.92.bazel" - } - }, - "rules_rust_wasm_bindgen__wasm-bindgen-wasm-interpreter-0.2.92": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "9ea966593c8243a33eb4d643254eb97a69de04e89462f46cf6b4f506aae89b3a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasm-bindgen-wasm-interpreter/0.2.92/download" - ], - "strip_prefix": "wasm-bindgen-wasm-interpreter-0.2.92", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-bindgen-wasm-interpreter-0.2.92.bazel" - } - }, - "rules_rust_wasm_bindgen__wasm-encoder-0.29.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "18c41dbd92eaebf3612a39be316540b8377c871cb9bde6b064af962984912881", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasm-encoder/0.29.0/download" - ], - "strip_prefix": "wasm-encoder-0.29.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasm-encoder-0.29.0.bazel" - } - }, - "rules_rust_wasm_bindgen__wasmparser-0.102.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasmparser/0.102.0/download" - ], - "strip_prefix": "wasmparser-0.102.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasmparser-0.102.0.bazel" - } - }, - "rules_rust_wasm_bindgen__wasmparser-0.108.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "76c956109dcb41436a39391139d9b6e2d0a5e0b158e1293ef352ec977e5e36c5", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasmparser/0.108.0/download" - ], - "strip_prefix": "wasmparser-0.108.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasmparser-0.108.0.bazel" - } - }, - "rules_rust_wasm_bindgen__wasmparser-0.80.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "449167e2832691a1bff24cde28d2804e90e09586a448c8e76984792c44334a6b", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasmparser/0.80.2/download" - ], - "strip_prefix": "wasmparser-0.80.2", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasmparser-0.80.2.bazel" - } - }, - "rules_rust_wasm_bindgen__wasmprinter-0.2.60": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b76cb909fe3d9b0de58cee1f4072247e680ff5cc1558ccad2790a9de14a23993", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/wasmprinter/0.2.60/download" - ], - "strip_prefix": "wasmprinter-0.2.60", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.wasmprinter-0.2.60.bazel" - } - }, - "rules_rust_wasm_bindgen__webpki-roots-0.25.2": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/webpki-roots/0.25.2/download" - ], - "strip_prefix": "webpki-roots-0.25.2", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.webpki-roots-0.25.2.bazel" - } - }, - "rules_rust_wasm_bindgen__winapi-0.3.9": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi/0.3.9/download" - ], - "strip_prefix": "winapi-0.3.9", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.winapi-0.3.9.bazel" - } - }, - "rules_rust_wasm_bindgen__winapi-i686-pc-windows-gnu-0.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi-i686-pc-windows-gnu/0.4.0/download" - ], - "strip_prefix": "winapi-i686-pc-windows-gnu-0.4.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.winapi-i686-pc-windows-gnu-0.4.0.bazel" - } - }, - "rules_rust_wasm_bindgen__winapi-util-0.1.5": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi-util/0.1.5/download" - ], - "strip_prefix": "winapi-util-0.1.5", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.winapi-util-0.1.5.bazel" - } - }, - "rules_rust_wasm_bindgen__winapi-x86_64-pc-windows-gnu-0.4.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/winapi-x86_64-pc-windows-gnu/0.4.0/download" - ], - "strip_prefix": "winapi-x86_64-pc-windows-gnu-0.4.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.winapi-x86_64-pc-windows-gnu-0.4.0.bazel" - } - }, - "rules_rust_wasm_bindgen__windows-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows/0.48.0/download" - ], - "strip_prefix": "windows-0.48.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows-0.48.0.bazel" - } - }, - "rules_rust_wasm_bindgen__windows-sys-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows-sys/0.48.0/download" - ], - "strip_prefix": "windows-sys-0.48.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows-sys-0.48.0.bazel" - } - }, - "rules_rust_wasm_bindgen__windows-targets-0.48.1": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows-targets/0.48.1/download" - ], - "strip_prefix": "windows-targets-0.48.1", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows-targets-0.48.1.bazel" - } - }, - "rules_rust_wasm_bindgen__windows_aarch64_gnullvm-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.0/download" - ], - "strip_prefix": "windows_aarch64_gnullvm-0.48.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows_aarch64_gnullvm-0.48.0.bazel" - } - }, - "rules_rust_wasm_bindgen__windows_aarch64_msvc-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_aarch64_msvc/0.48.0/download" - ], - "strip_prefix": "windows_aarch64_msvc-0.48.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows_aarch64_msvc-0.48.0.bazel" - } - }, - "rules_rust_wasm_bindgen__windows_i686_gnu-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_i686_gnu/0.48.0/download" - ], - "strip_prefix": "windows_i686_gnu-0.48.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows_i686_gnu-0.48.0.bazel" - } - }, - "rules_rust_wasm_bindgen__windows_i686_msvc-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_i686_msvc/0.48.0/download" - ], - "strip_prefix": "windows_i686_msvc-0.48.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows_i686_msvc-0.48.0.bazel" - } - }, - "rules_rust_wasm_bindgen__windows_x86_64_gnu-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_gnu/0.48.0/download" - ], - "strip_prefix": "windows_x86_64_gnu-0.48.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows_x86_64_gnu-0.48.0.bazel" - } - }, - "rules_rust_wasm_bindgen__windows_x86_64_gnullvm-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.0/download" - ], - "strip_prefix": "windows_x86_64_gnullvm-0.48.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows_x86_64_gnullvm-0.48.0.bazel" - } - }, - "rules_rust_wasm_bindgen__windows_x86_64_msvc-0.48.0": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a", - "type": "tar.gz", - "urls": [ - "https://static.crates.io/crates/windows_x86_64_msvc/0.48.0/download" - ], - "strip_prefix": "windows_x86_64_msvc-0.48.0", - "build_file": "@@rules_rust~//wasm_bindgen/3rdparty/crates:BUILD.windows_x86_64_msvc-0.48.0.bazel" - } - }, - "rules_rust_test_load_arbitrary_tool": { - "bzlFile": "@@rules_rust~//test/load_arbitrary_tool:load_arbitrary_tool_test.bzl", - "ruleClassName": "_load_arbitrary_tool_test", - "attributes": {} - }, - "generated_inputs_in_external_repo": { - "bzlFile": "@@rules_rust~//test/generated_inputs:external_repo.bzl", - "ruleClassName": "_generated_inputs_in_external_repo", - "attributes": {} - }, - "libc": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "build_file_content": "load(\"@rules_rust//rust:defs.bzl\", \"rust_library\")\n\nrust_library(\n name = \"libc\",\n srcs = glob([\"src/**/*.rs\"]),\n edition = \"2015\",\n rustc_flags = [\n # In most cases, warnings in 3rd party crates are not interesting as\n # they're out of the control of consumers. The flag here silences\n # warnings. For more details see:\n # https://doc.rust-lang.org/rustc/lints/levels.html\n \"--cap-lints=allow\",\n ],\n visibility = [\"//visibility:public\"],\n)\n", - "sha256": "1ac4c2ac6ed5a8fb9020c166bc63316205f1dc78d4b964ad31f4f21eb73f0c6d", - "strip_prefix": "libc-0.2.20", - "urls": [ - "https://mirror.bazel.build/github.com/rust-lang/libc/archive/0.2.20.zip", - "https://github.com/rust-lang/libc/archive/0.2.20.zip" - ] - } - }, - "rules_rust_toolchain_test_target_json": { - "bzlFile": "@@rules_rust~//test/unit/toolchain:toolchain_test_utils.bzl", - "ruleClassName": "rules_rust_toolchain_test_target_json_repository", - "attributes": { - "target_json": "@@rules_rust~//test/unit/toolchain:toolchain-test-triple.json" - } - }, - "com_google_googleapis": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "urls": [ - "https://github.com/googleapis/googleapis/archive/18becb1d1426feb7399db144d7beeb3284f1ccb0.zip" - ], - "strip_prefix": "googleapis-18becb1d1426feb7399db144d7beeb3284f1ccb0", - "sha256": "b8c487191eb942361af905e40172644eab490190e717c3d09bf83e87f3994fff" - } - }, - "rules_python": { - "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "sha256": "778aaeab3e6cfd56d681c89f5c10d7ad6bf8d2f1a72de9de55b23081b2d31618", - "strip_prefix": "rules_python-0.34.0", - "url": "https://github.com/bazelbuild/rules_python/releases/download/0.34.0/rules_python-0.34.0.tar.gz" - } - } - }, - "moduleExtensionMetadata": { - "explicitRootModuleDirectDeps": [ - "rules_rust_tinyjson", - "cui", - "cui__anyhow-1.0.89", - "cui__camino-1.1.9", - "cui__cargo-lock-10.0.0", - "cui__cargo-platform-0.1.7", - "cui__cargo_metadata-0.18.1", - "cui__cargo_toml-0.20.5", - "cui__cfg-expr-0.17.0", - "cui__clap-4.3.11", - "cui__crates-index-3.2.0", - "cui__hex-0.4.3", - "cui__indoc-2.0.5", - "cui__itertools-0.13.0", - "cui__normpath-1.3.0", - "cui__once_cell-1.20.2", - "cui__pathdiff-0.2.2", - "cui__regex-1.11.0", - "cui__semver-1.0.23", - "cui__serde-1.0.210", - "cui__serde_json-1.0.129", - "cui__serde_starlark-0.1.16", - "cui__sha2-0.10.8", - "cui__spdx-0.10.6", - "cui__tempfile-3.13.0", - "cui__tera-1.19.1", - "cui__textwrap-0.16.1", - "cui__toml-0.8.19", - "cui__tracing-0.1.40", - "cui__tracing-subscriber-0.3.18", - "cui__url-2.5.2", - "cui__maplit-1.0.2", - "cargo_bazel.buildifier-darwin-amd64", - "cargo_bazel.buildifier-darwin-arm64", - "cargo_bazel.buildifier-linux-amd64", - "cargo_bazel.buildifier-linux-arm64", - "cargo_bazel.buildifier-linux-s390x", - "cargo_bazel.buildifier-windows-amd64.exe", - "rules_rust_prost__heck", - "rules_rust_prost", - "rules_rust_prost__h2-0.4.6", - "rules_rust_prost__prost-0.13.1", - "rules_rust_prost__prost-types-0.13.1", - "rules_rust_prost__protoc-gen-prost-0.4.0", - "rules_rust_prost__protoc-gen-tonic-0.4.1", - "rules_rust_prost__tokio-1.39.3", - "rules_rust_prost__tokio-stream-0.1.15", - "rules_rust_prost__tonic-0.12.1", - "rules_rust_proto__grpc-0.6.2", - "rules_rust_proto__grpc-compiler-0.6.2", - "rules_rust_proto__log-0.4.17", - "rules_rust_proto__protobuf-2.8.2", - "rules_rust_proto__protobuf-codegen-2.8.2", - "rules_rust_proto__tls-api-0.1.22", - "rules_rust_proto__tls-api-stub-0.1.22", - "llvm-raw", - "rules_rust_bindgen__bindgen-cli-0.70.1", - "rules_rust_bindgen__bindgen-0.70.1", - "rules_rust_bindgen__clang-sys-1.8.1", - "rules_rust_bindgen__clap-4.5.17", - "rules_rust_bindgen__clap_complete-4.5.26", - "rules_rust_bindgen__env_logger-0.10.2", - "rrra__anyhow-1.0.71", - "rrra__clap-4.3.11", - "rrra__env_logger-0.10.0", - "rrra__itertools-0.11.0", - "rrra__log-0.4.19", - "rrra__serde-1.0.171", - "rrra__serde_json-1.0.102", - "rules_rust_wasm_bindgen_cli", - "rules_rust_wasm_bindgen__anyhow-1.0.71", - "rules_rust_wasm_bindgen__docopt-1.1.1", - "rules_rust_wasm_bindgen__env_logger-0.8.4", - "rules_rust_wasm_bindgen__log-0.4.19", - "rules_rust_wasm_bindgen__rouille-3.6.2", - "rules_rust_wasm_bindgen__serde-1.0.171", - "rules_rust_wasm_bindgen__serde_derive-1.0.171", - "rules_rust_wasm_bindgen__serde_json-1.0.102", - "rules_rust_wasm_bindgen__ureq-2.8.0", - "rules_rust_wasm_bindgen__walrus-0.20.3", - "rules_rust_wasm_bindgen__wasm-bindgen-0.2.92", - "rules_rust_wasm_bindgen__wasm-bindgen-cli-support-0.2.92", - "rules_rust_wasm_bindgen__wasm-bindgen-shared-0.2.92", - "rules_rust_wasm_bindgen__assert_cmd-1.0.8", - "rules_rust_wasm_bindgen__diff-0.1.13", - "rules_rust_wasm_bindgen__predicates-1.0.8", - "rules_rust_wasm_bindgen__rayon-1.7.0", - "rules_rust_wasm_bindgen__tempfile-3.6.0", - "rules_rust_wasm_bindgen__wasmparser-0.102.0", - "rules_rust_wasm_bindgen__wasmprinter-0.2.60", - "rules_rust_test_load_arbitrary_tool", - "generated_inputs_in_external_repo", - "libc", - "rules_rust_toolchain_test_target_json", - "com_google_googleapis", - "rules_python" - ], - "explicitRootModuleDirectDevDeps": [], - "useAllRepos": "NO", - "reproducible": false - }, - "recordedRepoMappingEntries": [ - [ - "rules_rust~", - "bazel_skylib", - "bazel_skylib~" - ], - [ - "rules_rust~", - "bazel_tools", - "bazel_tools" - ], - [ - "rules_rust~", - "cui__anyhow-1.0.89", - "rules_rust~~i~cui__anyhow-1.0.89" - ], - [ - "rules_rust~", - "cui__camino-1.1.9", - "rules_rust~~i~cui__camino-1.1.9" - ], - [ - "rules_rust~", - "cui__cargo-lock-10.0.0", - "rules_rust~~i~cui__cargo-lock-10.0.0" - ], - [ - "rules_rust~", - "cui__cargo-platform-0.1.7", - "rules_rust~~i~cui__cargo-platform-0.1.7" - ], - [ - "rules_rust~", - "cui__cargo_metadata-0.18.1", - "rules_rust~~i~cui__cargo_metadata-0.18.1" - ], - [ - "rules_rust~", - "cui__cargo_toml-0.20.5", - "rules_rust~~i~cui__cargo_toml-0.20.5" - ], - [ - "rules_rust~", - "cui__cfg-expr-0.17.0", - "rules_rust~~i~cui__cfg-expr-0.17.0" - ], - [ - "rules_rust~", - "cui__clap-4.3.11", - "rules_rust~~i~cui__clap-4.3.11" - ], - [ - "rules_rust~", - "cui__crates-index-3.2.0", - "rules_rust~~i~cui__crates-index-3.2.0" - ], - [ - "rules_rust~", - "cui__hex-0.4.3", - "rules_rust~~i~cui__hex-0.4.3" - ], - [ - "rules_rust~", - "cui__indoc-2.0.5", - "rules_rust~~i~cui__indoc-2.0.5" - ], - [ - "rules_rust~", - "cui__itertools-0.13.0", - "rules_rust~~i~cui__itertools-0.13.0" - ], - [ - "rules_rust~", - "cui__maplit-1.0.2", - "rules_rust~~i~cui__maplit-1.0.2" - ], - [ - "rules_rust~", - "cui__normpath-1.3.0", - "rules_rust~~i~cui__normpath-1.3.0" - ], - [ - "rules_rust~", - "cui__once_cell-1.20.2", - "rules_rust~~i~cui__once_cell-1.20.2" - ], - [ - "rules_rust~", - "cui__pathdiff-0.2.2", - "rules_rust~~i~cui__pathdiff-0.2.2" - ], - [ - "rules_rust~", - "cui__regex-1.11.0", - "rules_rust~~i~cui__regex-1.11.0" - ], - [ - "rules_rust~", - "cui__semver-1.0.23", - "rules_rust~~i~cui__semver-1.0.23" - ], - [ - "rules_rust~", - "cui__serde-1.0.210", - "rules_rust~~i~cui__serde-1.0.210" - ], - [ - "rules_rust~", - "cui__serde_json-1.0.129", - "rules_rust~~i~cui__serde_json-1.0.129" - ], - [ - "rules_rust~", - "cui__serde_starlark-0.1.16", - "rules_rust~~i~cui__serde_starlark-0.1.16" - ], - [ - "rules_rust~", - "cui__sha2-0.10.8", - "rules_rust~~i~cui__sha2-0.10.8" - ], - [ - "rules_rust~", - "cui__spdx-0.10.6", - "rules_rust~~i~cui__spdx-0.10.6" - ], - [ - "rules_rust~", - "cui__tempfile-3.13.0", - "rules_rust~~i~cui__tempfile-3.13.0" - ], - [ - "rules_rust~", - "cui__tera-1.19.1", - "rules_rust~~i~cui__tera-1.19.1" - ], - [ - "rules_rust~", - "cui__textwrap-0.16.1", - "rules_rust~~i~cui__textwrap-0.16.1" - ], - [ - "rules_rust~", - "cui__toml-0.8.19", - "rules_rust~~i~cui__toml-0.8.19" - ], - [ - "rules_rust~", - "cui__tracing-0.1.40", - "rules_rust~~i~cui__tracing-0.1.40" - ], - [ - "rules_rust~", - "cui__tracing-subscriber-0.3.18", - "rules_rust~~i~cui__tracing-subscriber-0.3.18" - ], - [ - "rules_rust~", - "cui__url-2.5.2", - "rules_rust~~i~cui__url-2.5.2" - ], - [ - "rules_rust~", - "rrra__anyhow-1.0.71", - "rules_rust~~i~rrra__anyhow-1.0.71" - ], - [ - "rules_rust~", - "rrra__clap-4.3.11", - "rules_rust~~i~rrra__clap-4.3.11" - ], - [ - "rules_rust~", - "rrra__env_logger-0.10.0", - "rules_rust~~i~rrra__env_logger-0.10.0" - ], - [ - "rules_rust~", - "rrra__itertools-0.11.0", - "rules_rust~~i~rrra__itertools-0.11.0" - ], - [ - "rules_rust~", - "rrra__log-0.4.19", - "rules_rust~~i~rrra__log-0.4.19" - ], - [ - "rules_rust~", - "rrra__serde-1.0.171", - "rules_rust~~i~rrra__serde-1.0.171" - ], - [ - "rules_rust~", - "rrra__serde_json-1.0.102", - "rules_rust~~i~rrra__serde_json-1.0.102" - ], - [ - "rules_rust~", - "rules_cc", - "rules_cc~" - ], - [ - "rules_rust~", - "rules_rust", - "rules_rust~" - ], - [ - "rules_rust~", - "rules_rust_bindgen__bindgen-0.70.1", - "rules_rust~~i~rules_rust_bindgen__bindgen-0.70.1" - ], - [ - "rules_rust~", - "rules_rust_bindgen__clang-sys-1.8.1", - "rules_rust~~i~rules_rust_bindgen__clang-sys-1.8.1" - ], - [ - "rules_rust~", - "rules_rust_bindgen__clap-4.5.17", - "rules_rust~~i~rules_rust_bindgen__clap-4.5.17" - ], - [ - "rules_rust~", - "rules_rust_bindgen__clap_complete-4.5.26", - "rules_rust~~i~rules_rust_bindgen__clap_complete-4.5.26" - ], - [ - "rules_rust~", - "rules_rust_bindgen__env_logger-0.10.2", - "rules_rust~~i~rules_rust_bindgen__env_logger-0.10.2" - ], - [ - "rules_rust~", - "rules_rust_prost__h2-0.4.6", - "rules_rust~~i~rules_rust_prost__h2-0.4.6" - ], - [ - "rules_rust~", - "rules_rust_prost__prost-0.13.1", - "rules_rust~~i~rules_rust_prost__prost-0.13.1" - ], - [ - "rules_rust~", - "rules_rust_prost__prost-types-0.13.1", - "rules_rust~~i~rules_rust_prost__prost-types-0.13.1" - ], - [ - "rules_rust~", - "rules_rust_prost__protoc-gen-prost-0.4.0", - "rules_rust~~i~rules_rust_prost__protoc-gen-prost-0.4.0" - ], - [ - "rules_rust~", - "rules_rust_prost__protoc-gen-tonic-0.4.1", - "rules_rust~~i~rules_rust_prost__protoc-gen-tonic-0.4.1" - ], - [ - "rules_rust~", - "rules_rust_prost__tokio-1.39.3", - "rules_rust~~i~rules_rust_prost__tokio-1.39.3" - ], - [ - "rules_rust~", - "rules_rust_prost__tokio-stream-0.1.15", - "rules_rust~~i~rules_rust_prost__tokio-stream-0.1.15" - ], - [ - "rules_rust~", - "rules_rust_prost__tonic-0.12.1", - "rules_rust~~i~rules_rust_prost__tonic-0.12.1" - ], - [ - "rules_rust~", - "rules_rust_proto__grpc-0.6.2", - "rules_rust~~i~rules_rust_proto__grpc-0.6.2" - ], - [ - "rules_rust~", - "rules_rust_proto__grpc-compiler-0.6.2", - "rules_rust~~i~rules_rust_proto__grpc-compiler-0.6.2" - ], - [ - "rules_rust~", - "rules_rust_proto__log-0.4.17", - "rules_rust~~i~rules_rust_proto__log-0.4.17" - ], - [ - "rules_rust~", - "rules_rust_proto__protobuf-2.8.2", - "rules_rust~~i~rules_rust_proto__protobuf-2.8.2" - ], - [ - "rules_rust~", - "rules_rust_proto__protobuf-codegen-2.8.2", - "rules_rust~~i~rules_rust_proto__protobuf-codegen-2.8.2" - ], - [ - "rules_rust~", - "rules_rust_proto__tls-api-0.1.22", - "rules_rust~~i~rules_rust_proto__tls-api-0.1.22" - ], - [ - "rules_rust~", - "rules_rust_proto__tls-api-stub-0.1.22", - "rules_rust~~i~rules_rust_proto__tls-api-stub-0.1.22" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__anyhow-1.0.71", - "rules_rust~~i~rules_rust_wasm_bindgen__anyhow-1.0.71" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__assert_cmd-1.0.8", - "rules_rust~~i~rules_rust_wasm_bindgen__assert_cmd-1.0.8" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__diff-0.1.13", - "rules_rust~~i~rules_rust_wasm_bindgen__diff-0.1.13" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__docopt-1.1.1", - "rules_rust~~i~rules_rust_wasm_bindgen__docopt-1.1.1" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__env_logger-0.8.4", - "rules_rust~~i~rules_rust_wasm_bindgen__env_logger-0.8.4" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__log-0.4.19", - "rules_rust~~i~rules_rust_wasm_bindgen__log-0.4.19" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__predicates-1.0.8", - "rules_rust~~i~rules_rust_wasm_bindgen__predicates-1.0.8" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__rayon-1.7.0", - "rules_rust~~i~rules_rust_wasm_bindgen__rayon-1.7.0" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__rouille-3.6.2", - "rules_rust~~i~rules_rust_wasm_bindgen__rouille-3.6.2" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__serde-1.0.171", - "rules_rust~~i~rules_rust_wasm_bindgen__serde-1.0.171" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__serde_derive-1.0.171", - "rules_rust~~i~rules_rust_wasm_bindgen__serde_derive-1.0.171" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__serde_json-1.0.102", - "rules_rust~~i~rules_rust_wasm_bindgen__serde_json-1.0.102" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__tempfile-3.6.0", - "rules_rust~~i~rules_rust_wasm_bindgen__tempfile-3.6.0" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__ureq-2.8.0", - "rules_rust~~i~rules_rust_wasm_bindgen__ureq-2.8.0" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__walrus-0.20.3", - "rules_rust~~i~rules_rust_wasm_bindgen__walrus-0.20.3" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__wasm-bindgen-0.2.92", - "rules_rust~~i~rules_rust_wasm_bindgen__wasm-bindgen-0.2.92" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__wasm-bindgen-cli-support-0.2.92", - "rules_rust~~i~rules_rust_wasm_bindgen__wasm-bindgen-cli-support-0.2.92" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__wasm-bindgen-shared-0.2.92", - "rules_rust~~i~rules_rust_wasm_bindgen__wasm-bindgen-shared-0.2.92" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__wasmparser-0.102.0", - "rules_rust~~i~rules_rust_wasm_bindgen__wasmparser-0.102.0" - ], - [ - "rules_rust~", - "rules_rust_wasm_bindgen__wasmprinter-0.2.60", - "rules_rust~~i~rules_rust_wasm_bindgen__wasmprinter-0.2.60" - ] - ] - } - } - } -} diff --git a/tools/private/update_bzlmod_lockfiles.sh b/tools/private/update_bzlmod_lockfiles.sh deleted file mode 100755 index 309d64e34a..0000000000 --- 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 From 5913816ce6b9aa9d318e4cba7984bbc983701d9b Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 21 Nov 2024 16:34:27 -0800 Subject: [PATCH 337/345] tests: make some tests compatible with Bazel 9 fix various tests relying on Bazel builtin providers existing (#2433) In Bazel 9, the builtin symbols don't exist. This fixes some tests that fail when those symbols are missing. --- tests/base_rules/base_tests.bzl | 5 ++++- tests/base_rules/py_info/py_info_tests.bzl | 2 +- tests/config_settings/transition/multi_version_tests.bzl | 6 ++++-- tests/py_runtime_pair/py_runtime_pair_tests.bzl | 3 +++ 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/tests/base_rules/base_tests.bzl b/tests/base_rules/base_tests.bzl index ae298edb4f..3518e6f57a 100644 --- a/tests/base_rules/base_tests.bzl +++ b/tests/base_rules/base_tests.bzl @@ -43,7 +43,7 @@ _produces_builtin_py_info = rule( ) 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 @@ def _py_info_propagation_test_impl(env, target, provider_type): 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 0f46d12381..4067a59d24 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 @@ def _provide_py_info_impl(ctx): 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/config_settings/transition/multi_version_tests.bzl b/tests/config_settings/transition/multi_version_tests.bzl index 367837b3fb..5805bab32d 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(name): 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(name): 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/py_runtime_pair/py_runtime_pair_tests.bzl b/tests/py_runtime_pair/py_runtime_pair_tests.bzl index e89e080868..f8656977e0 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 @@ def _test_basic_impl(env, target): _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", From 2abca35cf67f60d41485eaab1f53ff7a3c6e9b50 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 22 Nov 2024 13:19:26 +0900 Subject: [PATCH 338/345] refactor(pypi): move config setting processing to the macro (#2424) Before hand we would pass around `whl_alias` struct instances and it would go through rounds of starlark functions which would end up rendered as BUILD.bazel files in the hub repository. This means that every time the output of the said functions would change, the `MODULE.bazel.lock` would also possibly change. Since we now have much better unit testing framework, we start relying on these functions being evaluated at loading phase instead of repo rule phase, which means that we can make the `BUILD.bazel` files not change a lot when the underlying code changes, this should make the code more maintainable in the long run and unblocks the code to accept extra things, like env marker values or similar. Summary: - Remove the `repo` field from `whl_alias`. - Rename `whl_alias` to `whl_config_setting` - Move the tests around - Simplify the `pkg_aliases` tests to use `contains` instead of exact equality to make things less brittle. - Simplify the `pkg_aliases` tests to use different mocks to make expectations easier to understand. - Make `whl_config_setting` hashable by using tuples instead of lists. - Adjust how we store the `whl_config_setting` in the PyPI extension and optimize the passing to the `hub_repository`. This is needed for #2319 and #2423. To be in future PRs: * Remove the need to pass `osx_versions`, etc to the `pkg_aliases` macro. --- python/private/pypi/BUILD.bazel | 10 +- python/private/pypi/extension.bzl | 53 +-- python/private/pypi/hub_repository.bzl | 51 +- python/private/pypi/pip_repository.bzl | 4 +- python/private/pypi/pkg_aliases.bzl | 272 ++++++++++- python/private/pypi/render_pkg_aliases.bzl | 383 +++------------ python/private/pypi/whl_config_setting.bzl | 50 ++ python/private/text_util.bzl | 17 + tests/pypi/extension/extension_tests.bzl | 123 ++--- tests/pypi/pkg_aliases/pkg_aliases_test.bzl | 441 ++++++++++++++---- .../render_pkg_aliases_test.bzl | 328 +++---------- 11 files changed, 945 insertions(+), 787 deletions(-) create mode 100644 python/private/pypi/whl_config_setting.bzl diff --git a/python/private/pypi/BUILD.bazel b/python/private/pypi/BUILD.bazel index dafbcfb757..2cc073a832 100644 --- a/python/private/pypi/BUILD.bazel +++ b/python/private/pypi/BUILD.bazel @@ -64,6 +64,7 @@ bzl_library( ":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", @@ -156,7 +157,7 @@ bzl_library( 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 @@ bzl_library( ":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", @@ -257,6 +259,7 @@ bzl_library( deps = [ ":generate_group_library_build_bazel_bzl", ":parse_whl_name_bzl", + ":whl_config_setting_bzl", ":whl_target_platforms_bzl", "//python/private:normalize_name_bzl", "//python/private:text_util_bzl", @@ -283,6 +286,11 @@ bzl_library( ], ) +bzl_library( + name = "whl_config_setting_bzl", + srcs = ["whl_config_setting.bzl"], +) + bzl_library( name = "whl_library_alias_bzl", srcs = ["whl_library_alias.bzl"], diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 2ed946fbca..fd224d1592 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -23,13 +23,13 @@ load("//python/private:semver.bzl", "semver") 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(":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", "pypi_repo_name", "whl_repo_name") @@ -87,7 +87,7 @@ def _create_whl_repos( 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_alias` return values. + {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 @@ -304,14 +304,11 @@ def _create_whl_repos( whl_libraries[repo_name] = args - whl_map.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: @@ -339,13 +336,10 @@ def _create_whl_repos( *target_platforms ) whl_libraries[repo_name] = args - whl_map.setdefault(whl_name, []).append( - whl_alias( - repo = repo_name, - version = major_minor, - target_platforms = target_platforms or None, - ), - ) + 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 @@ -488,7 +482,8 @@ You cannot use both the additive_build_content and additive_build_content_file a ) hub_whl_map.setdefault(hub_name, {}) for key, settings in out.whl_map.items(): - hub_whl_map[hub_name].setdefault(key, []).extend(settings) + 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) @@ -508,7 +503,7 @@ You cannot use both the additive_build_content and additive_build_content_file a whl_mods = dict(sorted(whl_mods.items())), hub_whl_map = { hub_name: { - whl_name: sorted(settings, key = lambda x: (x.version, x.filename)) + whl_name: dict(settings) for whl_name, settings in sorted(whl_map.items()) } for hub_name, whl_map in sorted(hub_whl_map.items()) @@ -538,20 +533,6 @@ You cannot use both the additive_build_content and additive_build_content_file a is_reproducible = is_reproducible, ) -def _alias_dict(a): - ret = { - "repo": a.repo, - } - 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 - def _pip_impl(module_ctx): """Implementation of a class tag that creates the pip hub and corresponding pip spoke whl repositories. @@ -632,8 +613,8 @@ def _pip_impl(module_ctx): repo_name = hub_name, extra_hub_aliases = mods.extra_aliases.get(hub_name, {}), whl_map = { - key: json.encode([_alias_dict(a) for a in aliases]) - for key, aliases in whl_map.items() + key: whl_config_settings_to_json(values) + for key, values in whl_map.items() }, packages = mods.exposed_packages.get(hub_name, []), groups = mods.hub_group_map.get(hub_name), diff --git a/python/private/pypi/hub_repository.bzl b/python/private/pypi/hub_repository.bzl index 69d937142a..48245b4106 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,7 +29,7 @@ def _impl(rctx): 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, @@ -97,3 +94,45 @@ in the pip.parse tag class. 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/pip_repository.bzl b/python/private/pypi/pip_repository.bzl index 597b37f52c..47fa31f1bc 100644 --- a/python/private/pypi/pip_repository.bzl +++ b/python/private/pypi/pip_repository.bzl @@ -21,7 +21,7 @@ load("//python/private:text_util.bzl", "render") 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,7 +174,7 @@ def _pip_repository_impl(rctx): 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, diff --git a/python/private/pypi/pkg_aliases.bzl b/python/private/pypi/pkg_aliases.bzl index de9545e986..284f8e9ed0 100644 --- a/python/private/pypi/pkg_aliases.bzl +++ b/python/private/pypi/pkg_aliases.bzl @@ -16,6 +16,7 @@ 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", @@ -26,6 +27,14 @@ load( "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) _NO_MATCH_ERROR_TEMPLATE = """\ No matching wheel for current configuration's Python version. @@ -53,7 +62,11 @@ def _no_match_error(actual): return _NO_MATCH_ERROR_TEMPLATE.format( config_settings = render.indent( - "\n".join(sorted(actual.keys())), + "\n".join(sorted([ + value + for key in actual + for value in (key if type(key) == "tuple" else [key]) + ])), ).lstrip(), rules_python = "rules_python", ) @@ -65,17 +78,21 @@ def pkg_aliases( group_name = None, extra_aliases = None, native = native, - select = select): + select = selects.with_or, + **kwargs): """Create aliases for an actual package. Args: name: {type}`str` The name of the package. - actual: {type}`dict[Label, 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. + 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, @@ -91,6 +108,8 @@ def pkg_aliases( 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(): @@ -102,11 +121,11 @@ def pkg_aliases( elif type(actual) == type({}): _actual = select( { - config_setting: "@{repo}//:{target_name}".format( + v: "@{repo}//:{target_name}".format( repo = repo, target_name = name, ) - for config_setting, repo in actual.items() + for v, repo in actual.items() }, no_match_error = no_match_error, ) @@ -132,3 +151,244 @@ def pkg_aliases( 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 98c9d0906f..66968c11e2 100644 --- a/python/private/pypi/render_pkg_aliases.bzl +++ b/python/private/pypi/render_pkg_aliases.bzl @@ -61,34 +61,53 @@ 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 _repr_dict(*, value_repr = repr, **kwargs): + return {k: value_repr(v) for k, v in kwargs.items() if v} + +def _repr_config_setting(alias): + if alias.filename: + return render.call( + "whl_config_setting", + **_repr_dict( + filename = alias.filename, + target_platforms = alias.target_platforms, + version = alias.version, + ) + ) + else: + return repr( + alias.config_setting or ("//_config:is_python_" + alias.version), + ) + def _repr_actual(aliases): - if len(aliases) == 1 and not aliases[0].version and not aliases[0].config_setting: - return repr(aliases[0].repo) + if type(aliases) == type(""): + return repr(aliases) + else: + return render.dict(aliases, key_repr = _repr_config_setting) - actual = {} - for alias in aliases: - actual[alias.config_setting or ("//_config:is_python_" + alias.version)] = alias.repo - return render.indent(render.dict(actual)).lstrip() +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" -def _render_common_aliases(*, name, aliases, extra_aliases = [], group_name = None): return """\ load("@rules_python//python/private/pypi:pkg_aliases.bzl", "pkg_aliases") - +{extra_loads} package(default_visibility = ["//visibility:public"]) -pkg_aliases( - name = "{name}", - actual = {actual}, - group_name = {group_name}, - extra_aliases = {extra_aliases}, -)""".format( - name = name, - actual = _repr_actual(aliases), - group_name = repr(group_name), - extra_aliases = repr(extra_aliases), +{aliases}""".format( + aliases = pkg_aliases, + extra_loads = extra_loads, ) -def render_pkg_aliases(*, aliases, requirement_cycles = None, extra_hub_aliases = {}): +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 @@ -97,10 +116,11 @@ def render_pkg_aliases(*, aliases, requirement_cycles = None, extra_hub_aliases 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. @@ -130,6 +150,7 @@ def render_pkg_aliases(*, aliases, requirement_cycles = None, extra_hub_aliases 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() } @@ -138,48 +159,11 @@ def render_pkg_aliases(*, aliases, requirement_cycles = None, extra_hub_aliases 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 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, - repo = repo, - target_platforms = target_platforms, - version = version, - ) - 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. @@ -188,142 +172,45 @@ def render_multiplatform_pkg_aliases(*, aliases, **kwargs): """ 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 and not alias.target_platforms: - 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 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 "", - **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: @@ -335,17 +222,17 @@ def get_whl_flag_versions(aliases): 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 a.filename and 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 @@ -396,131 +283,3 @@ def _non_versioned_platform(p, *, strict = False): 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, - 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"): - 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) - - 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 = [""] if not non_whl_prefix else ["_" + non_whl_prefix] - 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 0000000000..e46c7d37d7 --- /dev/null +++ b/python/private/pypi/whl_config_setting.bzl @@ -0,0 +1,50 @@ +# 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(*, repo = None, 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 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, + repo = repo, + # Make the struct hashable + target_platforms = tuple(target_platforms) if target_platforms else None, + version = version, + ) diff --git a/python/private/text_util.bzl b/python/private/text_util.bzl index 38f2b0e404..a64b5d6243 100644 --- a/python/private/text_util.bzl +++ b/python/private/text_util.bzl @@ -124,6 +124,21 @@ def _render_tuple(items, *, value_repr = repr): ")", ]) +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 @@ def _left_pad_zero(index, length): 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/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index 39670cd71f..7dfd8762a7 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -17,7 +17,7 @@ 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:render_pkg_aliases.bzl", "whl_alias") # buildifier: disable=bzl-visibility +load("//python/private/pypi:whl_config_setting.bzl", "whl_config_setting") # buildifier: disable=bzl-visibility _tests = [] @@ -158,12 +158,13 @@ def _test_simple(env): pypi.exposed_packages().contains_exactly({"pypi": ["simple"]}) pypi.hub_group_map().contains_exactly({"pypi": {}}) pypi.hub_whl_map().contains_exactly({"pypi": { - "simple": [ - whl_alias( - repo = "pypi_315_simple", - version = "3.15", - ), - ], + "simple": { + "pypi_315_simple": [ + whl_config_setting( + version = "3.15", + ), + ], + }, }}) pypi.whl_libraries().contains_exactly({ "pypi_315_simple": { @@ -206,23 +207,25 @@ def _test_simple_multiple_requirements(env): pypi.exposed_packages().contains_exactly({"pypi": ["simple"]}) pypi.hub_group_map().contains_exactly({"pypi": {}}) pypi.hub_whl_map().contains_exactly({"pypi": { - "simple": [ - whl_alias( - repo = "pypi_315_simple_windows_x86_64", - target_platforms = [ - "cp315_windows_x86_64", - ], - version = "3.15", - ), - whl_alias( - repo = "pypi_315_simple_osx_aarch64_osx_x86_64", - target_platforms = [ - "cp315_osx_aarch64", - "cp315_osx_x86_64", - ], - version = "3.15", - ), - ], + "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": { @@ -289,24 +292,25 @@ simple==0.0.3 --hash=sha256:deadbaaf pypi.exposed_packages().contains_exactly({"pypi": ["simple"]}) pypi.hub_group_map().contains_exactly({"pypi": {}}) pypi.hub_whl_map().contains_exactly({"pypi": { - "extra": [ - whl_alias( - repo = "pypi_315_extra", - version = "3.15", - ), - ], - "simple": [ - whl_alias( - repo = "pypi_315_simple_linux_x86_64", - target_platforms = ["cp315_linux_x86_64"], - version = "3.15", - ), - whl_alias( - repo = "pypi_315_simple_osx_aarch64", - target_platforms = ["cp315_osx_aarch64"], - version = "3.15", - ), - ], + "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": { @@ -404,24 +408,23 @@ some_pkg==0.0.1 pypi.hub_group_map().contains_exactly({"pypi": {}}) pypi.hub_whl_map().contains_exactly({ "pypi": { - "simple": [ - whl_alias( - filename = "simple-0.0.1-py3-none-any.whl", - repo = "pypi_315_simple_py3_none_any_deadb00f", - version = "3.15", - ), - whl_alias( - filename = "simple-0.0.1.tar.gz", - repo = "pypi_315_simple_sdist_deadbeef", - version = "3.15", - ), - ], - "some_pkg": [ - whl_alias( - repo = "pypi_315_some_pkg", - version = "3.15", - ), - ], + "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({ diff --git a/tests/pypi/pkg_aliases/pkg_aliases_test.bzl b/tests/pypi/pkg_aliases/pkg_aliases_test.bzl index cf801ae643..0fa66d05eb 100644 --- a/tests/pypi/pkg_aliases/pkg_aliases_test.bzl +++ b/tests/pypi/pkg_aliases/pkg_aliases_test.bzl @@ -15,80 +15,54 @@ """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): - actual = [] + got = {} pkg_aliases( name = "foo", actual = "repo", native = struct( - alias = lambda **kwargs: actual.append(kwargs), + alias = lambda name, actual: got.update({name: actual}), ), extra_aliases = ["my_special"], ) # buildifier: disable=unsorted-dict-items - want = [ - { - "name": "foo", - "actual": ":pkg", - }, - { - "name": "pkg", - "actual": "@repo//:pkg", - }, - { - "name": "whl", - "actual": "@repo//:whl", - }, - { - "name": "data", - "actual": "@repo//:data", - }, - { - "name": "dist_info", - "actual": "@repo//:dist_info", - }, - { - "name": "my_special", - "actual": "@repo//:my_special", - }, - ] + 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_collection(actual).contains_exactly(want) + 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 - actual = [] + 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).equals("""\ -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 + env.expect.that_str(no_match_error).contains("""\ configuration settings: //:my_config_setting -To determine the current configuration's Python version, run: - `bazel config ` (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. """) - return struct(value = value, no_match_error = no_match_error != None) + return value pkg_aliases( name = "bar_baz", @@ -97,66 +71,123 @@ which has a "null" version value and will not match version constraints. }, extra_aliases = ["my_special"], native = struct( - alias = lambda **kwargs: actual.append(kwargs), + alias = lambda name, actual: got.update({name: actual}), ), select = mock_select, ) # buildifier: disable=unsorted-dict-items - want = [ - { - "name": "bar_baz", - "actual": ":pkg", - }, - { - "name": "pkg", - "actual": struct( - value = { - "//:my_config_setting": "@bar_baz_repo//:pkg", - }, - no_match_error = True, - ), + want = { + "pkg": { + "//:my_config_setting": "@bar_baz_repo//:pkg", }, - { - "name": "whl", - "actual": struct( - value = { - "//:my_config_setting": "@bar_baz_repo//:whl", - }, - no_match_error = True, - ), + } + 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", }, - { - "name": "data", - "actual": struct( - value = { - "//:my_config_setting": "@bar_baz_repo//:data", - }, - no_match_error = True, - ), + 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", }, - { - "name": "dist_info", - "actual": struct( - value = { - "//:my_config_setting": "@bar_baz_repo//:dist_info", - }, - no_match_error = True, - ), + } + 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", }, - { - "name": "my_special", - "actual": struct( - value = { - "//:my_config_setting": "@bar_baz_repo//:my_special", - }, - no_match_error = True, - ), + 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_collection(actual).contains_exactly(want) + } + env.expect.that_dict(got).contains_at_least(want) -_tests.append(_test_config_setting_aliases) +_tests.append(_test_multiplatform_whl_aliases) def _test_group_aliases(env): # Use this function as it is used in pip_repository @@ -208,6 +239,232 @@ def _test_group_aliases(env): _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. 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 4741df04b4..0ba642eca9 100644 --- a/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl +++ b/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl @@ -15,16 +15,17 @@ """render_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:render_pkg_aliases.bzl", + "//python/private/pypi:pkg_aliases.bzl", "get_filename_config_settings", +) # buildifier: disable=bzl-visibility +load( + "//python/private/pypi:render_pkg_aliases.bzl", "get_whl_flag_versions", - "multiplatform_whl_aliases", "render_multiplatform_pkg_aliases", "render_pkg_aliases", - "whl_alias", ) # buildifier: disable=bzl-visibility +load("//python/private/pypi:whl_config_setting.bzl", "whl_config_setting") # buildifier: disable=bzl-visibility _tests = [] @@ -42,9 +43,7 @@ _tests.append(_test_empty) def _test_legacy_aliases(env): actual = render_pkg_aliases( aliases = { - "foo": [ - whl_alias(repo = "pypi_foo"), - ], + "foo": "pypi_foo", }, ) @@ -57,8 +56,6 @@ package(default_visibility = ["//visibility:public"]) pkg_aliases( name = "foo", actual = "pypi_foo", - group_name = None, - extra_aliases = [], )""" env.expect.that_dict(actual).contains_exactly({want_key: want_content}) @@ -69,15 +66,24 @@ def _test_bzlmod_aliases(env): # 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", + filename = "foo-0.0.0-py3-none-any.whl", + ): "filename_repo", + }, }, + extra_hub_aliases = {"bar_baz": ["foo"]}, ) want_key = "bar_baz/BUILD.bazel" want_content = """\ 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"]) @@ -85,9 +91,12 @@ pkg_aliases( name = "bar_baz", actual = { "//:my_config_setting": "pypi_32_bar_baz", + whl_config_setting( + filename = "foo-0.0.0-py3-none-any.whl", + version = "3.2", + ): "filename_repo", }, - group_name = None, - extra_aliases = [], + extra_aliases = ["foo"], )""" env.expect.that_str(actual.pop("_config/BUILD.bazel")).equals( @@ -96,11 +105,7 @@ load("@rules_python//python/private/pypi:config_settings.bzl", "config_settings" config_settings( name = "config_settings", - glibc_versions = [], - muslc_versions = [], - osx_versions = [], python_versions = ["3.2"], - target_platforms = [], visibility = ["//:__subpackages__"], )""", ) @@ -112,14 +117,14 @@ _tests.append(_test_bzlmod_aliases) 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", + }, }, ) @@ -135,18 +140,18 @@ _tests.append(_test_aliases_are_created_for_all_wheels) 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"], @@ -175,7 +180,7 @@ _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) @@ -184,10 +189,10 @@ _tests.append(_test_empty_flag_versions) 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"], @@ -198,9 +203,9 @@ _tests.append(_test_get_python_versions) def _test_get_python_versions_with_target_platforms(env): got = get_whl_flag_versions( - aliases = [ - whl_alias(repo = "foo", version = "3.3", target_platforms = ["cp33_linux_x86_64"]), - whl_alias(repo = "foo", version = "3.2", target_platforms = ["cp32_linux_x86_64", "cp32_osx_aarch64"]), + settings = [ + whl_config_setting(repo = "foo", version = "3.3", target_platforms = ["cp33_linux_x86_64"]), + whl_config_setting(repo = "foo", version = "3.2", target_platforms = ["cp32_linux_x86_64", "cp32_osx_aarch64"]), ], ) want = { @@ -216,8 +221,8 @@ _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( + settings = [ + whl_config_setting( repo = "foo", version = "3.3", filename = "foo-0.0.0-py3-none-" + plat + ".whl", @@ -254,8 +259,8 @@ _tests.append(_test_get_python_versions_from_filenames) def _test_get_flag_versions_from_alias_target_platforms(env): got = get_whl_flag_versions( - aliases = [ - whl_alias( + settings = [ + whl_config_setting( repo = "foo", version = "3.3", filename = "foo-0.0.0-py3-none-" + plat + ".whl", @@ -264,7 +269,7 @@ def _test_get_flag_versions_from_alias_target_platforms(env): "windows_x86_64", ] ] + [ - whl_alias( + whl_config_setting( repo = "foo", version = "3.3", filename = "foo-0.0.0-py3-none-any.whl", @@ -467,227 +472,6 @@ def _test_cp37_abi3_manylinux_2_17_musllinux_1_1_aarch64(env): _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_nofilename_target_platforms(env): - aliases = [ - whl_alias( - repo = "foo", - config_setting = "//:ignored", - version = "3.1", - target_platforms = [ - "cp31_linux_x86_64", - "cp31_linux_aarch64", - ], - ), - ] - - got = multiplatform_whl_aliases(aliases = aliases) - - want = [ - whl_alias(config_setting = "//_config:is_cp3.1_linux_x86_64", repo = "foo", version = "3.1"), - whl_alias(config_setting = "//_config:is_cp3.1_linux_aarch64", repo = "foo", version = "3.1"), - ] - env.expect.that_collection(got).contains_exactly(want) - -_tests.append(_test_multiplatform_whl_aliases_nofilename_target_platforms) - -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 _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_alias( - repo = "repo", - version = "3.11", - target_platforms = [ - "cp311_linux_aarch64", - "cp311_linux_x86_64", - ], - ), - ] - 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.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_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_alias( - repo = "repo", - filename = "foo-0.0.1-{}-{}-{}.whl".format(py_tag, abi_tag, platform_tag), - version = "3.11", - ), - ] - 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.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. From 4ee7e256de85faff38db5f21defd660a2cd6aa85 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Fri, 22 Nov 2024 09:37:10 -0800 Subject: [PATCH 339/345] chore: rename the dev-only setup files to more clearly self-describe what they are (#2436) The names `internal_deps` and `internal_setup` are a bit confusing and ambiguous: are they for setting up something internal so that rules_python works, or something else? Clarify by putting `dev` in their names. This helps match the naming used for bzlmod (python/private/internal_dev_deps.bzl). --- BUILD.bazel | 4 ++-- WORKSPACE | 4 ++-- internal_deps.bzl => internal_dev_deps.bzl | 10 ++++++++-- internal_setup.bzl => internal_dev_setup.bzl | 4 ++-- 4 files changed, 14 insertions(+), 8 deletions(-) rename internal_deps.bzl => internal_dev_deps.bzl (96%) rename internal_setup.bzl => internal_dev_setup.bzl (94%) diff --git a/BUILD.bazel b/BUILD.bazel index 5a58422328..5e85c27b3c 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -40,8 +40,8 @@ filegroup( "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/WORKSPACE b/WORKSPACE index 46ebbc8cde..f03cc26803 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -17,7 +17,7 @@ workspace(name = "rules_python") # 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 @@ load("@stardoc_maven//:defs.bzl", stardoc_pinned_maven_install = "pinned_maven_i 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() diff --git a/internal_deps.bzl b/internal_dev_deps.bzl similarity index 96% rename from internal_deps.bzl rename to internal_dev_deps.bzl index f7c363c8c6..80196815a0 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,7 +32,13 @@ def http_file(name, **kwargs): ) 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. + + 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", diff --git a/internal_setup.bzl b/internal_dev_setup.bzl similarity index 94% rename from internal_setup.bzl rename to internal_dev_setup.bzl index 03b3c02e98..554ff926f2 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") @@ -30,7 +30,7 @@ load("//python/private:pythons_hub.bzl", "hub_repo") # buildifier: disable=bzl- 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( From 438b12edca345db7d06021dde97cb3bd6b1bae84 Mon Sep 17 00:00:00 2001 From: Chowder <16789070+chowder@users.noreply.github.com> Date: Mon, 25 Nov 2024 16:24:07 +0000 Subject: [PATCH 340/345] fix: correctly obtain relative path required for the venv created by `--bootstrap_impl=script` (#2439) Computing the relative path from the venv interpreter to the underlying interpreter was incorrectly using the actual interpreter's directory depth, not the venv interpreter's directory depth, when computing the distance from the venv interpreter to the runfiles root. The net effect is the correct relative path would only be computed for binaries with the same directory depth as the actual interpreter (e.g. 2). This went undetected in CI because the tests for this logic just happen to have the same directory depth as the actual interpreter used. To fix, compute the relative path to the runfiles root using the venv interpreter directory. Also added a test in a more nested directory to test this case. Along the way: * Change relative path computation to compute a minimum relative path. * Fix the internals to pass a runfiles-root relative path, not main-repo relative path, for the actual interpreter, as intended. Fixes https://github.com/bazelbuild/rules_python/issues/2169 --------- Co-authored-by: Richard Levasseur Co-authored-by: Richard Levasseur Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> --- python/private/py_executable_bazel.bzl | 69 +++++++++++--- python/private/stage1_bootstrap_template.sh | 1 + tests/bootstrap_impls/BUILD.bazel | 3 + tests/bootstrap_impls/a/b/c/BUILD.bazel | 15 ++++ .../bootstrap_impls/a/b/c/nested_dir_test.py | 24 +++++ .../venv_relative_path_tests.bzl | 90 +++++++++++++++++++ 6 files changed, 191 insertions(+), 11 deletions(-) create mode 100644 tests/bootstrap_impls/a/b/c/BUILD.bazel create mode 100644 tests/bootstrap_impls/a/b/c/nested_dir_test.py create mode 100644 tests/bootstrap_impls/venv_relative_path_tests.bzl diff --git a/python/private/py_executable_bazel.bzl b/python/private/py_executable_bazel.bzl index 60c3815c99..3778c192b4 100644 --- a/python/private/py_executable_bazel.bzl +++ b/python/private/py_executable_bazel.bzl @@ -323,7 +323,7 @@ def _create_executable( def _create_zip_main(ctx, *, stage2_bootstrap, runtime_details, venv): python_binary = _runfiles_root_path(ctx, venv.interpreter.short_path) - python_binary_actual = _runfiles_root_path(ctx, venv.interpreter_actual_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 @@ -344,6 +344,37 @@ def _create_zip_main(ctx, *, stage2_bootstrap, runtime_details, venv): ) 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 @@ -368,9 +399,15 @@ def _create_venv(ctx, output_prefix, imports, runtime_details): # 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 = runtime.interpreter.short_path - parent = "/".join([".."] * (interpreter_actual_path.count("/") + 1)) - rel_path = parent + "/" + interpreter_actual_path + + 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) @@ -412,7 +449,7 @@ def _create_venv(ctx, output_prefix, imports, runtime_details): return struct( interpreter = interpreter, - # Runfiles-relative path or absolute path + # Runfiles root relative path or absolute path interpreter_actual_path = interpreter_actual_path, files_without_interpreter = [pyvenv_cfg, pth, site_init], ) @@ -462,12 +499,22 @@ def _create_stage2_bootstrap( ) return output -def _runfiles_root_path(ctx, path): - # The ../ comes from short_path for files in other repos. - if path.startswith("../"): - return path[3:] +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, path) + return "{}/{}".format(ctx.workspace_name, short_path) def _create_stage1_bootstrap( ctx, @@ -487,7 +534,7 @@ def _create_stage1_bootstrap( python_binary_path = runtime_details.executable_interpreter_path if is_for_zip and venv: - python_binary_actual = _runfiles_root_path(ctx, venv.interpreter_actual_path) + python_binary_actual = venv.interpreter_actual_path else: python_binary_actual = "" diff --git a/python/private/stage1_bootstrap_template.sh b/python/private/stage1_bootstrap_template.sh index afa1ee84bd..b05b4a54cd 100644 --- a/python/private/stage1_bootstrap_template.sh +++ b/python/private/stage1_bootstrap_template.sh @@ -135,6 +135,7 @@ fi 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" diff --git a/tests/bootstrap_impls/BUILD.bazel b/tests/bootstrap_impls/BUILD.bazel index 1586821896..2fb1f38ff0 100644 --- a/tests/bootstrap_impls/BUILD.bazel +++ b/tests/bootstrap_impls/BUILD.bazel @@ -14,6 +14,7 @@ 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") +load(":venv_relative_path_tests.bzl", "relative_path_test_suite") _SUPPORTS_BOOTSTRAP_SCRIPT = select({ "@platforms//os:windows": ["@platforms//:incompatible"], @@ -87,3 +88,5 @@ sh_py_run_test( 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 0000000000..8ffcbcd479 --- /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/tests/bootstrap_impls/a/b/c/nested_dir_test.py b/tests/bootstrap_impls/a/b/c/nested_dir_test.py new file mode 100644 index 0000000000..2db0e6c771 --- /dev/null +++ b/tests/bootstrap_impls/a/b/c/nested_dir_test.py @@ -0,0 +1,24 @@ +# 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. +"""Test that the binary being a different directory depth than the underlying interpreter works.""" + +import unittest + + +class RunsTest(unittest.TestCase): + def test_runs(self): + pass + + +unittest.main() 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 0000000000..b21f220205 --- /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) From 5c691bb4b493a4ff1ff675af4140de49eb46d0d5 Mon Sep 17 00:00:00 2001 From: Ted Pudlik Date: Mon, 25 Nov 2024 13:35:12 -0800 Subject: [PATCH 341/345] fix: Propagate common kwargs to sphinx_run (#2442) This ensures tags like `manual` (and other attributes) are copied into the `{name}.run` target and properly respected. Fixes https://github.com/bazelbuild/rules_python/issues/2441 --- sphinxdocs/private/sphinx.bzl | 1 + 1 file changed, 1 insertion(+) diff --git a/sphinxdocs/private/sphinx.bzl b/sphinxdocs/private/sphinx.bzl index 678d01bca7..7ec35f9ab4 100644 --- a/sphinxdocs/private/sphinx.bzl +++ b/sphinxdocs/private/sphinx.bzl @@ -190,6 +190,7 @@ def sphinx_docs( sphinx_run( name = name + ".run", docs = name, + **common_kwargs ) build_test( From 077eec67d69d7b23448ed130c28503ff0f36e04a Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Mon, 25 Nov 2024 15:53:30 -0800 Subject: [PATCH 342/345] fix: upgrade to bazel_features 1.21.0 for Bazel 8 rc3 support (#2440) bazel_features has a bug where it doesn't detect Bazel 8 rc3 correctly. This is fixed in release 1.21.0. From the discussion on https://github.com/bazel-contrib/bazel_features/issues/82, it's likely this only occurs due to the "rc" notation of the Bazel release, so an earlier bazel_features version will probably work fine once Bazel 8 is no longer rc. --- CHANGELOG.md | 1 + MODULE.bazel | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d8398b835..fee657425e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,6 +79,7 @@ Other changes: * (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 {#v0-0-0-fixed} ### Fixed diff --git a/MODULE.bazel b/MODULE.bazel index 913a7c49cb..8610052435 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -4,7 +4,7 @@ module( compatibility_level = 1, ) -bazel_dep(name = "bazel_features", version = "1.9.1") +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") From 4e60d07ff6ee3e21bd1351d07095ddfb438c0877 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Thu, 28 Nov 2024 07:37:22 +0900 Subject: [PATCH 343/345] fix(render_pkg_aliases): correctly render when we have target_platforms set (#2447) It seems that during #2424 I broke the rendering of aliases for the cases when the target platform is set. This means that the feature for multiplatform whls when `experimental_index_url` has never worked even though it was advertised. This ensures that the rendering is happening correctly and adds extra missing tests. Whilst at it: - add an extra test for `pip.parse` handling of env markers that I added to ensure that the error is not in the module extension. - Cleanup unused code - error message constant and the repo arg in `whl_config_setting`. Fixes #2446 --- python/private/pypi/extension.bzl | 2 + python/private/pypi/render_pkg_aliases.bzl | 20 +---- python/private/pypi/whl_config_setting.bzl | 4 +- tests/pypi/extension/extension_tests.bzl | 81 +++++++++++++++++++ .../render_pkg_aliases_test.bzl | 32 ++++++-- 5 files changed, 113 insertions(+), 26 deletions(-) diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index fd224d1592..edfd5809f4 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -68,6 +68,7 @@ def _create_whl_repos( pip_attr, whl_overrides, simpleapi_cache, + evaluate_markers = evaluate_markers, available_interpreters = INTERPRETER_LABELS, simpleapi_download = simpleapi_download): """create all of the whl repositories @@ -78,6 +79,7 @@ def _create_whl_repos( 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. diff --git a/python/private/pypi/render_pkg_aliases.bzl b/python/private/pypi/render_pkg_aliases.bzl index 66968c11e2..62c893d3e7 100644 --- a/python/private/pypi/render_pkg_aliases.bzl +++ b/python/private/pypi/render_pkg_aliases.bzl @@ -44,33 +44,17 @@ 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. """ -NO_MATCH_ERROR_MESSAGE_TEMPLATE_V2 = """\ -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_settings} - -To determine the current configuration's Python version, run: - `bazel config ` (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 _repr_dict(*, value_repr = repr, **kwargs): return {k: value_repr(v) for k, v in kwargs.items() if v} def _repr_config_setting(alias): - if alias.filename: + 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, ) ) diff --git a/python/private/pypi/whl_config_setting.bzl b/python/private/pypi/whl_config_setting.bzl index e46c7d37d7..d966206372 100644 --- a/python/private/pypi/whl_config_setting.bzl +++ b/python/private/pypi/whl_config_setting.bzl @@ -14,14 +14,13 @@ "A small function to create an alias for a whl distribution" -def whl_config_setting(*, repo = None, version = None, config_setting = None, filename = None, target_platforms = None): +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: - 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 @@ -43,7 +42,6 @@ def whl_config_setting(*, repo = None, version = None, config_setting = None, fi return struct( config_setting = config_setting, filename = filename, - repo = repo, # Make the struct hashable target_platforms = tuple(target_platforms) if target_platforms else None, version = version, diff --git a/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index 7dfd8762a7..b9427795ec 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -245,6 +245,87 @@ def _test_simple_multiple_requirements(env): _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, 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 0ba642eca9..ca1651aa1d 100644 --- a/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl +++ b/tests/pypi/render_pkg_aliases/render_pkg_aliases_test.bzl @@ -71,10 +71,24 @@ def _test_bzlmod_aliases(env): 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"]}, @@ -91,10 +105,20 @@ pkg_aliases( name = "bar_baz", 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"], )""" @@ -106,6 +130,7 @@ load("@rules_python//python/private/pypi:config_settings.bzl", "config_settings" config_settings( name = "config_settings", python_versions = ["3.2"], + target_platforms = ["linux_x86_64"], visibility = ["//:__subpackages__"], )""", ) @@ -204,8 +229,8 @@ _tests.append(_test_get_python_versions) def _test_get_python_versions_with_target_platforms(env): got = get_whl_flag_versions( settings = [ - whl_config_setting(repo = "foo", version = "3.3", target_platforms = ["cp33_linux_x86_64"]), - whl_config_setting(repo = "foo", version = "3.2", target_platforms = ["cp32_linux_x86_64", "cp32_osx_aarch64"]), + 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 = { @@ -223,7 +248,6 @@ def _test_get_python_versions_from_filenames(env): got = get_whl_flag_versions( settings = [ whl_config_setting( - repo = "foo", version = "3.3", filename = "foo-0.0.0-py3-none-" + plat + ".whl", ) @@ -261,7 +285,6 @@ def _test_get_flag_versions_from_alias_target_platforms(env): got = get_whl_flag_versions( settings = [ whl_config_setting( - repo = "foo", version = "3.3", filename = "foo-0.0.0-py3-none-" + plat + ".whl", ) @@ -270,7 +293,6 @@ def _test_get_flag_versions_from_alias_target_platforms(env): ] ] + [ whl_config_setting( - repo = "foo", version = "3.3", filename = "foo-0.0.0-py3-none-any.whl", target_platforms = [ From 9f99832e0a1d47d2913ffce21bf3089a103d6ffb Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 27 Nov 2024 16:13:25 -0800 Subject: [PATCH 344/345] deps: upgrade to stardoc 0.7.2 for Bazel 8 support (#2451) Stardoc 0.7.2 fixes a bug with Bazel 8 where a symbol was undefined. Upgrading to that version makes the Bazel 8 CI job that builds our docs pass. Fixes https://github.com/bazelbuild/rules_python/issues/2448 --- CHANGELOG.md | 1 + MODULE.bazel | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fee657425e..a20057e84c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -80,6 +80,7 @@ Other changes: 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. {#v0-0-0-fixed} ### Fixed diff --git a/MODULE.bazel b/MODULE.bazel index 8610052435..104ae92b89 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -71,7 +71,7 @@ pip.parse( 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.7.1", 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.26.1", dev_dependency = True) From be704e2745be638df3962d22ba2582552373c8e2 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 27 Nov 2024 19:27:34 -0800 Subject: [PATCH 345/345] chore: auto compute prelease setting (#2452) This makes the release workflow automatically compute the prelease setting based on the tag name being processed. It looks for the "-rc" text in the tag to do this. Co-authored-by: Ignas Anikevicius <240938+aignas@users.noreply.github.com> --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 96624b347a..29b70ccc8f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,5 +42,6 @@ jobs: # 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