From 4d79c89b6466ce9764fd5929aa3fa68c0c62f8c8 Mon Sep 17 00:00:00 2001 From: aignas <240938+aignas@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:24:34 +0900 Subject: [PATCH 01/46] refactor: introduce a new private function to parse module_ctx --- examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/pypi/extension.bzl | 77 ++++++++++++++++++++----------- 2 files changed, 52 insertions(+), 29 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 8c66a1318f..d30b6c9c58 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": "+F6sV3YAo/qldTLeU0MTvh5nK4Vr1gCZSWzoX+v0qH0=", "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": "1uBC9tJDPdn7Ubmb5CUjscK+gb/nYP7elM49ue6TLB0=", "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 36fb20e030..f45a4b6538 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, @@ -345,6 +321,51 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides, group_map, s return is_hub_reproducible +def parse_modules(module_ctx, _fail = fail): + """Implementation of parsing the tag classes for the extension and return a struct for registering repositories. + + Args: + module_ctx: {type}`module_ctx` module context. + _fail: {type}`function` the failure function, mainly for testing. + + Returns: + A struct with the following attributes: + """ + whl_mods = {} + for mod in module_ctx.modules: + for whl_mod in mod.tags.whl_mods: + if whl_mod.whl_name in whl_mods.get(whl_mod.hub_name, {}): + # We cannot have the same wheel name in the same hub, as we + # will create the same JSON file name. + _fail("""\ +Found same whl_name '{}' in the same hub '{}', please use a different hub_name.""".format( + whl_mod.whl_name, + whl_mod.hub_name, + )) + return None + + build_content = whl_mod.additive_build_content + if whl_mod.additive_build_content_file != None and whl_mod.additive_build_content != "": + _fail("""\ +You cannot use both the additive_build_content and additive_build_content_file arguments at the same time. +""") + return None + elif whl_mod.additive_build_content_file != None: + build_content = module_ctx.read(whl_mod.additive_build_content_file) + + whl_mods.setdefault(whl_mod.hub_name, {})[whl_mod.whl_name] = struct( + build_content = build_content, + copy_files = whl_mod.copy_files, + copy_executables = whl_mod.copy_executables, + data = whl_mod.data, + data_exclude_glob = whl_mod.data_exclude_glob, + srcs_exclude_glob = whl_mod.srcs_exclude_glob, + ) + + return struct( + whl_mods = whl_mods, + ) + def _pip_impl(module_ctx): """Implementation of a class tag that creates the pip hub and corresponding pip spoke whl repositories. @@ -411,8 +432,10 @@ def _pip_impl(module_ctx): module_ctx: module contents """ + mods = parse_modules(module_ctx) + # Build all of the wheel modifications if the tag class is called. - _whl_mods_impl(module_ctx) + _whl_mods_impl(mods.whl_mods) _overriden_whl_set = {} whl_overrides = {} From 7f8f72685414b196005ee64c925c8593e9f7a609 Mon Sep 17 00:00:00 2001 From: aignas <240938+aignas@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:28:13 +0900 Subject: [PATCH 02/46] refactor: move override processing to there --- examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/pypi/extension.bzl | 70 +++++++++++++++++-------------- 2 files changed, 41 insertions(+), 33 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index d30b6c9c58..d5d156f8e9 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": "+F6sV3YAo/qldTLeU0MTvh5nK4Vr1gCZSWzoX+v0qH0=", + "bzlTransitiveDigest": "hJ7eKsoEMeWHFRSZTVOIUp6MuIW+j8o0kWoQVhEuqmU=", "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": "1uBC9tJDPdn7Ubmb5CUjscK+gb/nYP7elM49ue6TLB0=", + "bzlTransitiveDigest": "qzmXF5mOOAUh9/YsfU7yBaX1cvNUWD61alQXaKPT6co=", "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 f45a4b6538..c873646bda 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -62,7 +62,7 @@ def _whl_mods_impl(whl_mods_dict): 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_map, whl_overrides, group_map, simpleapi_cache, exposed_packages): logger = repo_utils.logger(module_ctx, "pypi:create_whl_repos") python_interpreter_target = pip_attr.python_interpreter_target is_hub_reproducible = True @@ -362,8 +362,37 @@ You cannot use both the additive_build_content and additive_build_content_file a srcs_exclude_glob = whl_mod.srcs_exclude_glob, ) + _overriden_whl_set = {} + whl_overrides = {} + for module in module_ctx.modules: + for attr in module.tags.override: + if not module.is_root: + fail("overrides are only supported in root modules") + + if not attr.file.endswith(".whl"): + fail("Only whl overrides are supported at this time") + + whl_name = normalize_name(parse_whl_name(attr.file).distribution) + + if attr.file in _overriden_whl_set: + fail("Duplicate module overrides for '{}'".format(attr.file)) + _overriden_whl_set[attr.file] = None + + for patch in attr.patches: + if whl_name not in whl_overrides: + whl_overrides[whl_name] = {} + + if patch not in whl_overrides[whl_name]: + whl_overrides[whl_name][patch] = struct( + patch_strip = attr.patch_strip, + whls = [], + ) + + whl_overrides[whl_name][patch].whls.append(attr.file) + return struct( whl_mods = whl_mods, + whl_overrides = whl_overrides, ) def _pip_impl(module_ctx): @@ -437,35 +466,6 @@ def _pip_impl(module_ctx): # Build all of the wheel modifications if the tag class is called. _whl_mods_impl(mods.whl_mods) - _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 = {} @@ -515,7 +515,15 @@ 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_hub_reproducible = _create_whl_repos( + module_ctx, + exposed_packages = exposed_packages, + group_map = hub_group_map, + pip_attr = pip_attr, + simpleapi_cache = simpleapi_cache, + whl_map = hub_whl_map, + whl_overrides = mods.whl_overrides, + ) is_extension_reproducible = is_extension_reproducible and is_hub_reproducible for hub_name, whl_map in hub_whl_map.items(): From 1d842397a9107cf19452dc9f50a5011a8df96e83 Mon Sep 17 00:00:00 2001 From: aignas <240938+aignas@users.noreply.github.com> Date: Fri, 18 Oct 2024 16:09:57 +0900 Subject: [PATCH 03/46] refactor: move pip_parse state to parse_modules --- examples/bzlmod/MODULE.bazel.lock | 4 +-- python/private/pypi/extension.bzl | 50 +++++++++++++++---------------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index d5d156f8e9..3877a57927 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": "hJ7eKsoEMeWHFRSZTVOIUp6MuIW+j8o0kWoQVhEuqmU=", + "bzlTransitiveDigest": "k/+n1K+lR7V3oZYLaIPq01fzV+hf+ZjgKgoMmH60bLE=", "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": "qzmXF5mOOAUh9/YsfU7yBaX1cvNUWD61alQXaKPT6co=", + "bzlTransitiveDigest": "ypj88aXgIp+DKZHFpQVlB3GJPIr+0MBVql9vxef5E9w=", "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 c873646bda..d5f4a22c4d 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -393,6 +393,18 @@ You cannot use both the additive_build_content and additive_build_content_file a return struct( whl_mods = whl_mods, whl_overrides = whl_overrides, + + # Used to track all the different pip hubs and the spoke pip Python + # versions. + pip_hub_map = {}, + + # Keeps track of all the hub's whl repos across the different versions. + # dict[hub, dict[whl, dict[version, str pip]]] + # Where hub, whl, and pip are the repo names + hub_whl_map = {}, + hub_group_map = {}, + exposed_packages = {}, + simpleapi_cache = {}, ) def _pip_impl(module_ctx): @@ -466,29 +478,17 @@ def _pip_impl(module_ctx): # Build all of the wheel modifications if the tag class is called. _whl_mods_impl(mods.whl_mods) - # Used to track all the different pip hubs and the spoke pip Python - # versions. - pip_hub_map = {} - - # Keeps track of all the hub's whl repos across the different versions. - # dict[hub, dict[whl, dict[version, str pip]]] - # Where hub, whl, and pip are the repo names - hub_whl_map = {} - hub_group_map = {} - exposed_packages = {} - - simpleapi_cache = {} is_extension_reproducible = True for mod in module_ctx.modules: for pip_attr in mod.tags.parse: hub_name = pip_attr.hub_name - if hub_name not in pip_hub_map: - pip_hub_map[pip_attr.hub_name] = struct( + if hub_name not in mods.pip_hub_map: + mods.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: + elif mods.pip_hub_map[hub_name].module_name != mod.name: # We cannot have two hubs with the same name in different # modules. fail(( @@ -498,11 +498,11 @@ def _pip_impl(module_ctx): "module '{second_module}'" ).format( hub = hub_name, - first_module = pip_hub_map[hub_name].module_name, + first_module = mods.pip_hub_map[hub_name].module_name, second_module = mod.name, )) - elif pip_attr.python_version in pip_hub_map[hub_name].python_versions: + elif pip_attr.python_version in mods.pip_hub_map[hub_name].python_versions: fail(( "Duplicate pip python version '{version}' for hub " + "'{hub}' in module '{module}': the Python versions " + @@ -513,20 +513,20 @@ def _pip_impl(module_ctx): version = pip_attr.python_version, )) else: - pip_hub_map[pip_attr.hub_name].python_versions.append(pip_attr.python_version) + mods.pip_hub_map[pip_attr.hub_name].python_versions.append(pip_attr.python_version) is_hub_reproducible = _create_whl_repos( module_ctx, - exposed_packages = exposed_packages, - group_map = hub_group_map, + exposed_packages = mods.exposed_packages, + group_map = mods.hub_group_map, pip_attr = pip_attr, - simpleapi_cache = simpleapi_cache, - whl_map = hub_whl_map, + simpleapi_cache = mods.simpleapi_cache, + whl_map = mods.hub_whl_map, whl_overrides = mods.whl_overrides, ) is_extension_reproducible = is_extension_reproducible and is_hub_reproducible - for hub_name, whl_map in hub_whl_map.items(): + for hub_name, whl_map in mods.hub_whl_map.items(): hub_repository( name = hub_name, repo_name = hub_name, @@ -534,8 +534,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 = sorted(mods.exposed_packages.get(hub_name, {})), + groups = mods.hub_group_map.get(hub_name), ) if bazel_features.external_deps.extension_metadata_has_reproducible: From 0ba818a94b5f1055c4f12555ddbc2f81a757b8d2 Mon Sep 17 00:00:00 2001 From: aignas <240938+aignas@users.noreply.github.com> Date: Fri, 18 Oct 2024 16:12:41 +0900 Subject: [PATCH 04/46] refactor: move whl_library construction to parse_modules --- examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/pypi/extension.bzl | 127 +++++++++++++++--------------- 2 files changed, 67 insertions(+), 64 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 3877a57927..97426508ae 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": "k/+n1K+lR7V3oZYLaIPq01fzV+hf+ZjgKgoMmH60bLE=", + "bzlTransitiveDigest": "ElpL66yqFHKxwNnE0c/xGw9vh40iCQT0Whz9XdPkydA=", "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": "ypj88aXgIp+DKZHFpQVlB3GJPIr+0MBVql9vxef5E9w=", + "bzlTransitiveDigest": "9uxFBLt5C2maO2dUYrWGFn3cAx5Rzt9Ha8y0siUl2oM=", "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 d5f4a22c4d..ac6b6cc269 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -390,21 +390,72 @@ You cannot use both the additive_build_content and additive_build_content_file a whl_overrides[whl_name][patch].whls.append(attr.file) + # Used to track all the different pip hubs and the spoke pip Python + # versions. + pip_hub_map = {} + + # Keeps track of all the hub's whl repos across the different versions. + # dict[hub, dict[whl, dict[version, str pip]]] + # Where hub, whl, and pip are the repo names + hub_whl_map = {} + hub_group_map = {} + exposed_packages = {} + simpleapi_cache = {} + + is_extension_reproducible = True + + for mod in module_ctx.modules: + for pip_attr in mod.tags.parse: + hub_name = pip_attr.hub_name + if hub_name not in pip_hub_map: + pip_hub_map[pip_attr.hub_name] = struct( + module_name = mod.name, + python_versions = [pip_attr.python_version], + ) + elif pip_hub_map[hub_name].module_name != mod.name: + # We cannot have two hubs with the same name in different + # modules. + fail(( + "Duplicate cross-module pip hub named '{hub}': pip hub " + + "names must be unique across modules. First defined " + + "by module '{first_module}', second attempted by " + + "module '{second_module}'" + ).format( + hub = hub_name, + first_module = pip_hub_map[hub_name].module_name, + second_module = mod.name, + )) + + elif pip_attr.python_version in pip_hub_map[hub_name].python_versions: + fail(( + "Duplicate pip python version '{version}' for hub " + + "'{hub}' in module '{module}': the Python versions " + + "used for a hub must be unique" + ).format( + hub = hub_name, + module = mod.name, + version = pip_attr.python_version, + )) + else: + pip_hub_map[pip_attr.hub_name].python_versions.append(pip_attr.python_version) + + is_hub_reproducible = _create_whl_repos( + module_ctx, + exposed_packages = exposed_packages, + group_map = hub_group_map, + pip_attr = pip_attr, + simpleapi_cache = simpleapi_cache, + whl_map = hub_whl_map, + whl_overrides = whl_overrides, + ) + is_extension_reproducible = is_extension_reproducible and is_hub_reproducible + return struct( whl_mods = whl_mods, - whl_overrides = whl_overrides, - - # Used to track all the different pip hubs and the spoke pip Python - # versions. - pip_hub_map = {}, - - # Keeps track of all the hub's whl repos across the different versions. - # dict[hub, dict[whl, dict[version, str pip]]] - # Where hub, whl, and pip are the repo names - hub_whl_map = {}, - hub_group_map = {}, - exposed_packages = {}, - simpleapi_cache = {}, + hub_whl_map = hub_whl_map, + hub_group_map = hub_group_map, + exposed_packages = exposed_packages, + is_extension_reproducible = is_extension_reproducible, ) def _pip_impl(module_ctx): @@ -478,54 +529,6 @@ def _pip_impl(module_ctx): # Build all of the wheel modifications if the tag class is called. _whl_mods_impl(mods.whl_mods) - 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 mods.pip_hub_map: - mods.pip_hub_map[pip_attr.hub_name] = struct( - module_name = mod.name, - python_versions = [pip_attr.python_version], - ) - elif mods.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 = mods.pip_hub_map[hub_name].module_name, - second_module = mod.name, - )) - - elif pip_attr.python_version in mods.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: - mods.pip_hub_map[pip_attr.hub_name].python_versions.append(pip_attr.python_version) - - is_hub_reproducible = _create_whl_repos( - module_ctx, - exposed_packages = mods.exposed_packages, - group_map = mods.hub_group_map, - pip_attr = pip_attr, - simpleapi_cache = mods.simpleapi_cache, - whl_map = mods.hub_whl_map, - whl_overrides = mods.whl_overrides, - ) - is_extension_reproducible = is_extension_reproducible and is_hub_reproducible - for hub_name, whl_map in mods.hub_whl_map.items(): hub_repository( name = hub_name, @@ -545,7 +548,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_extension_reproducible) else: return None From ea5d67e59d5fb7cd218cae19c931a60e1ff8a41f Mon Sep 17 00:00:00 2001 From: aignas <240938+aignas@users.noreply.github.com> Date: Fri, 18 Oct 2024 16:19:40 +0900 Subject: [PATCH 05/46] refactor: move whl_library construction out of parse_modules --- examples/bzlmod/MODULE.bazel.lock | 1676 ++++++++++++++--------------- python/private/pypi/extension.bzl | 16 +- 2 files changed, 850 insertions(+), 842 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 97426508ae..678435b56a 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": "ElpL66yqFHKxwNnE0c/xGw9vh40iCQT0Whz9XdPkydA=", + "bzlTransitiveDigest": "LyeBT3IHuv5aM4EnUFYgt7Jf2RlvtBr/WlIAX3cy44g=", "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" ] } }, @@ -4488,7 +4488,7 @@ } } }, - "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", + "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": "c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e", + "requirement": "sphinxcontrib-qthelp==1.0.6", + "sha256": "bf76886ee7470b934e363da7a954ea2825650013d367728588732c7350f49ea4", "urls": [ - "https://files.pythonhosted.org/packages/f4/3f/65dfa50084a06ab0a05f3ca74195c2c17a1c075b8361327d831ccce0a483/websockets-11.0.3-cp39-cp39-win_amd64.whl" + "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,34 +5817,6 @@ ] } }, - "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", @@ -5866,7 +5838,35 @@ "requirement": "chardet==4.0.0 --hash=sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa --hash=sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" } }, - "pip_39_pyyaml_cp39_cp39_manylinux_2_17_s390x_b786eecb": { + "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", "attributes": { @@ -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": "9uxFBLt5C2maO2dUYrWGFn3cAx5Rzt9Ha8y0siUl2oM=", + "bzlTransitiveDigest": "UvrP/CAjGKFBB93blIhN3hlokUjfGCXOWAbAKcpsnyg=", "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,6 +7153,24 @@ ] } }, + "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_twine_sdist_9e102ef5": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", @@ -7178,25 +7196,7 @@ ] } }, - "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": { + "rules_python_publish_deps_311_pkginfo_py3_none_any_4b7a555a": { "bzlFile": "@@rules_python~//python/private/pypi:whl_library.bzl", "ruleClassName": "whl_library", "attributes": { @@ -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" ] } }, @@ -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 ac6b6cc269..d94be281b0 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -62,7 +62,7 @@ def _whl_mods_impl(whl_mods_dict): 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_map, whl_overrides, group_map, simpleapi_cache, exposed_packages, whl_libraries): logger = repo_utils.logger(module_ctx, "pypi:create_whl_repos") python_interpreter_target = pip_attr.python_interpreter_target is_hub_reproducible = True @@ -273,7 +273,7 @@ def _create_whl_repos(module_ctx, *, pip_attr, whl_map, whl_overrides, group_map 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_alias( @@ -311,7 +311,7 @@ def _create_whl_repos(module_ctx, *, pip_attr, whl_map, whl_overrides, group_map # 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_libraries[repo_name] = dict(whl_library_args.items()) whl_map[hub_name].setdefault(whl_name, []).append( whl_alias( repo = repo_name, @@ -393,6 +393,7 @@ You cannot use both the additive_build_content and additive_build_content_file a # 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]]] @@ -400,7 +401,7 @@ You cannot use both the additive_build_content and additive_build_content_file a hub_whl_map = {} hub_group_map = {} exposed_packages = {} - simpleapi_cache = {} + whl_libraries = {} is_extension_reproducible = True @@ -447,6 +448,7 @@ You cannot use both the additive_build_content and additive_build_content_file a simpleapi_cache = simpleapi_cache, whl_map = hub_whl_map, whl_overrides = whl_overrides, + whl_libraries = whl_libraries, ) is_extension_reproducible = is_extension_reproducible and is_hub_reproducible @@ -455,6 +457,7 @@ You cannot use both the additive_build_content and additive_build_content_file a hub_whl_map = hub_whl_map, hub_group_map = hub_group_map, exposed_packages = exposed_packages, + whl_libraries = whl_libraries, is_extension_reproducible = is_extension_reproducible, ) @@ -529,6 +532,11 @@ 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 hub_name, whl_map in mods.hub_whl_map.items(): hub_repository( name = hub_name, From cd53b6d13ef49d6f5f9e08d05c7d62df091d712a Mon Sep 17 00:00:00 2001 From: aignas <240938+aignas@users.noreply.github.com> Date: Fri, 18 Oct 2024 16:21:58 +0900 Subject: [PATCH 06/46] cleanup --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 15 +++++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 678435b56a..06cf848b05 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": "LyeBT3IHuv5aM4EnUFYgt7Jf2RlvtBr/WlIAX3cy44g=", + "bzlTransitiveDigest": "MAC3yqD4bm+sEAuyzLatQjVxFCk+gvfTTLmdhCcldCI=", "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": "UvrP/CAjGKFBB93blIhN3hlokUjfGCXOWAbAKcpsnyg=", + "bzlTransitiveDigest": "5PwHGCCkG7Tg9nkAaRxh0YtwB3FuFPNymaV6mjyQO/g=", "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 d94be281b0..ff802155ae 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -403,7 +403,7 @@ You cannot use both the additive_build_content and additive_build_content_file a exposed_packages = {} whl_libraries = {} - is_extension_reproducible = True + is_reproducible = True for mod in module_ctx.modules: for pip_attr in mod.tags.parse: @@ -450,15 +450,18 @@ You cannot use both the additive_build_content and additive_build_content_file a whl_overrides = whl_overrides, whl_libraries = whl_libraries, ) - is_extension_reproducible = is_extension_reproducible and is_hub_reproducible + is_reproducible = is_reproducible and is_hub_reproducible return struct( whl_mods = whl_mods, hub_whl_map = hub_whl_map, hub_group_map = hub_group_map, - exposed_packages = exposed_packages, + exposed_packages = { + name: sorted(value) + for name, value in exposed_packages.items() + }, whl_libraries = whl_libraries, - is_extension_reproducible = is_extension_reproducible, + is_reproducible = is_reproducible, ) def _pip_impl(module_ctx): @@ -545,7 +548,7 @@ def _pip_impl(module_ctx): key: json.encode(value) for key, value in whl_map.items() }, - packages = sorted(mods.exposed_packages.get(hub_name, {})), + packages = mods.exposed_packages.get(hub_name, {}), groups = mods.hub_group_map.get(hub_name), ) @@ -556,7 +559,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 = mods.is_extension_reproducible) + return module_ctx.extension_metadata(reproducible = mods.is_reproducible) else: return None From ef1993a03820b6b037d309715389fbd9aae7089b Mon Sep 17 00:00:00 2001 From: aignas <240938+aignas@users.noreply.github.com> Date: Fri, 18 Oct 2024 16:23:50 +0900 Subject: [PATCH 07/46] cleanup --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 06cf848b05..6f492260ff 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": "MAC3yqD4bm+sEAuyzLatQjVxFCk+gvfTTLmdhCcldCI=", + "bzlTransitiveDigest": "3cYaCQDhttUZKjzfZoSptfBKZH9yYtxmPZQ6ycEbfLc=", "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": "5PwHGCCkG7Tg9nkAaRxh0YtwB3FuFPNymaV6mjyQO/g=", + "bzlTransitiveDigest": "NiyhO0XmUxwNKj0NZjUOTgnoSs3viXLL8v5nxY867BU=", "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 ff802155ae..92eccae11c 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -535,12 +535,12 @@ def _pip_impl(module_ctx): # Build all of the wheel modifications if the tag class is called. _whl_mods_impl(mods.whl_mods) + # 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. 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 mods.hub_whl_map.items(): + for hub_name, whl_map in sorted(mods.hub_whl_map.items()): hub_repository( name = hub_name, repo_name = hub_name, From 570e20b9c2f9668c6700f35ccdb984de53753c28 Mon Sep 17 00:00:00 2001 From: aignas <240938+aignas@users.noreply.github.com> Date: Fri, 18 Oct 2024 16:25:58 +0900 Subject: [PATCH 08/46] cleanup --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 15 ++++++++++----- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 6f492260ff..b5de96ecb6 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": "3cYaCQDhttUZKjzfZoSptfBKZH9yYtxmPZQ6ycEbfLc=", + "bzlTransitiveDigest": "e1+X/9IKZ8eQhPc3DoqYNszOgUqmM8CmAAbRDgEHwJ8=", "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": "NiyhO0XmUxwNKj0NZjUOTgnoSs3viXLL8v5nxY867BU=", + "bzlTransitiveDigest": "+HuSSvhxT759qeNhZXLfFx+eVx/YT41sYZl1Wht2qr8=", "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 92eccae11c..e842a3a638 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -367,15 +367,18 @@ You cannot use both the additive_build_content and additive_build_content_file a 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") + _fail("overrides are only supported in root modules") + return None if not attr.file.endswith(".whl"): - fail("Only whl overrides are supported at this time") + _fail("Only whl overrides are supported at this time") + return None 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)) + _fail("Duplicate module overrides for '{}'".format(attr.file)) + return None _overriden_whl_set[attr.file] = None for patch in attr.patches: @@ -416,7 +419,7 @@ You cannot use both the additive_build_content and additive_build_content_file a elif pip_hub_map[hub_name].module_name != mod.name: # We cannot have two hubs with the same name in different # modules. - fail(( + _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 " + @@ -426,9 +429,10 @@ You cannot use both the additive_build_content and additive_build_content_file a first_module = pip_hub_map[hub_name].module_name, second_module = mod.name, )) + return None elif pip_attr.python_version in pip_hub_map[hub_name].python_versions: - fail(( + _fail(( "Duplicate pip python version '{version}' for hub " + "'{hub}' in module '{module}': the Python versions " + "used for a hub must be unique" @@ -437,6 +441,7 @@ You cannot use both the additive_build_content and additive_build_content_file a module = mod.name, version = pip_attr.python_version, )) + return None else: pip_hub_map[pip_attr.hub_name].python_versions.append(pip_attr.python_version) From 03cc7b5b673a6241847a24dce8f2ea5a7a9ce723 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 19 Oct 2024 11:22:44 +0900 Subject: [PATCH 09/46] refactor: remove side effects in _create_whl_repos --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 34 +++++++++++++++++++++++-------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index b5de96ecb6..708d13c9a1 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": "e1+X/9IKZ8eQhPc3DoqYNszOgUqmM8CmAAbRDgEHwJ8=", + "bzlTransitiveDigest": "VmodvOOC00qwk4qyaPIj1+lxXvqLmzZPbMt4HchkSIw=", "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": "+HuSSvhxT759qeNhZXLfFx+eVx/YT41sYZl1Wht2qr8=", + "bzlTransitiveDigest": "iCx6GGBJ3R+G2+REnZ05gF2i2e4m1LreSadh6OSsfAo=", "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 e842a3a638..2b6e9a8097 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -62,7 +62,17 @@ def _whl_mods_impl(whl_mods_dict): whl_mods = whl_mods, ) -def _create_whl_repos(module_ctx, *, pip_attr, whl_map, whl_overrides, group_map, simpleapi_cache, exposed_packages, whl_libraries): +def _create_whl_repos( + module_ctx, + *, + pip_attr, + whl_overrides, + simpleapi_cache): + exposed_packages = {} + whl_libraries = {} + group_map = {} + whl_map = {} + logger = repo_utils.logger(module_ctx, "pypi:create_whl_repos") python_interpreter_target = pip_attr.python_interpreter_target is_hub_reproducible = True @@ -319,7 +329,13 @@ def _create_whl_repos(module_ctx, *, pip_attr, whl_map, whl_overrides, group_map ), ) - return is_hub_reproducible + return struct( + exposed_packages = exposed_packages, + group_map = group_map, + is_hub_reproducible = is_hub_reproducible, + whl_libraries = whl_libraries, + whl_map = whl_map, + ) def parse_modules(module_ctx, _fail = fail): """Implementation of parsing the tag classes for the extension and return a struct for registering repositories. @@ -445,17 +461,19 @@ You cannot use both the additive_build_content and additive_build_content_file a else: pip_hub_map[pip_attr.hub_name].python_versions.append(pip_attr.python_version) - is_hub_reproducible = _create_whl_repos( + result = _create_whl_repos( module_ctx, - exposed_packages = exposed_packages, - group_map = hub_group_map, pip_attr = pip_attr, simpleapi_cache = simpleapi_cache, - whl_map = hub_whl_map, whl_overrides = whl_overrides, - whl_libraries = whl_libraries, ) - is_reproducible = is_reproducible and is_hub_reproducible + whl_libraries.update(result.whl_libraries) + for hub, config_settings in result.whl_map.items(): + for whl, settings in config_settings.items(): + hub_whl_map.setdefault(hub, {}).setdefault(whl, []).extend(settings) + hub_group_map.update(result.group_map) + exposed_packages.update(result.exposed_packages) + is_reproducible = is_reproducible and result.is_hub_reproducible return struct( whl_mods = whl_mods, From 66427568d6fcb5a5ae6503c20f12079855dd2afa Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 19 Oct 2024 11:37:17 +0900 Subject: [PATCH 10/46] refactor: pass get_index_urls function to _create_whl_repos --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 40 +++++++++++++++---------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 708d13c9a1..24d72947a4 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": "VmodvOOC00qwk4qyaPIj1+lxXvqLmzZPbMt4HchkSIw=", + "bzlTransitiveDigest": "HjPuhKBDwqJZDl7XUVoubz63IamI8uLsO8iSo7KtRR4=", "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": "iCx6GGBJ3R+G2+REnZ05gF2i2e4m1LreSadh6OSsfAo=", + "bzlTransitiveDigest": "pI0C3Lqg8CdlOdR+FCa3A48sFPIzzIjpQxkOKlXAhAs=", "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 2b6e9a8097..9c3b1ca068 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -67,7 +67,7 @@ def _create_whl_repos( *, pip_attr, whl_overrides, - simpleapi_cache): + get_index_urls = None): exposed_packages = {} whl_libraries = {} group_map = {} @@ -135,24 +135,6 @@ def _create_whl_repos( # Create a new wheel library for each of the different whls - get_index_urls = None - if pip_attr.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 = requirements_files_by_platform( @@ -461,11 +443,29 @@ You cannot use both the additive_build_content and additive_build_content_file a else: pip_hub_map[pip_attr.hub_name].python_versions.append(pip_attr.python_version) + get_index_urls = None + if pip_attr.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, + ) + result = _create_whl_repos( module_ctx, pip_attr = pip_attr, - simpleapi_cache = simpleapi_cache, whl_overrides = whl_overrides, + get_index_urls = get_index_urls, ) whl_libraries.update(result.whl_libraries) for hub, config_settings in result.whl_map.items(): From 57aa35de851946f3947dd9113f9b6623ef156716 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 19 Oct 2024 11:40:24 +0900 Subject: [PATCH 11/46] refactor: allow passing simpleapi_download func --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 24d72947a4..505d2d0d07 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": "HjPuhKBDwqJZDl7XUVoubz63IamI8uLsO8iSo7KtRR4=", + "bzlTransitiveDigest": "EVyfAtCP5EO0luHoM9T0XoE7XAVIetwxteTZY97eoeQ=", "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": "pI0C3Lqg8CdlOdR+FCa3A48sFPIzzIjpQxkOKlXAhAs=", + "bzlTransitiveDigest": "rE3+llJuaw+SXvNMCIXrv2VqUWWpoCf+f5s9/vmQxnc=", "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 9c3b1ca068..e8ba56657c 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -319,12 +319,14 @@ def _create_whl_repos( whl_map = whl_map, ) -def parse_modules(module_ctx, _fail = fail): +def parse_modules(module_ctx, _fail = fail, simpleapi_download = simpleapi_download): """Implementation of parsing the tag classes for the extension and return a struct for registering repositories. Args: module_ctx: {type}`module_ctx` module context. _fail: {type}`function` the failure function, mainly for testing. + simpleapi_download: {type}`function` the function to download from PyPI. See + {obj}`simpleapi_download` for the API docs. Returns: A struct with the following attributes: From c20d69f04b588f59d723739d2bee44cdc7ef105a Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 19 Oct 2024 11:43:05 +0900 Subject: [PATCH 12/46] refactor: move the group_map construction out of the _create_whl_libraries func --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 15 ++++++--------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 505d2d0d07..1f74611070 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": "EVyfAtCP5EO0luHoM9T0XoE7XAVIetwxteTZY97eoeQ=", + "bzlTransitiveDigest": "ax8z1ugJ1rHG8x1CsFwGxeeIIge6Pdh2eiSblp6aOWk=", "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": "rE3+llJuaw+SXvNMCIXrv2VqUWWpoCf+f5s9/vmQxnc=", + "bzlTransitiveDigest": "k5GXHhSWFwC9pSkVqkFbnXlkdGVXhrF3b4YvQr+85G4=", "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 e8ba56657c..bc093286b9 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -70,7 +70,6 @@ def _create_whl_repos( get_index_urls = None): exposed_packages = {} whl_libraries = {} - group_map = {} whl_map = {} logger = repo_utils.logger(module_ctx, "pypi:create_whl_repos") @@ -123,12 +122,6 @@ def _create_whl_repos( 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 = {} @@ -313,7 +306,6 @@ def _create_whl_repos( return struct( exposed_packages = exposed_packages, - group_map = group_map, is_hub_reproducible = is_hub_reproducible, whl_libraries = whl_libraries, whl_map = whl_map, @@ -473,7 +465,12 @@ You cannot use both the additive_build_content and additive_build_content_file a for hub, config_settings in result.whl_map.items(): for whl, settings in config_settings.items(): hub_whl_map.setdefault(hub, {}).setdefault(whl, []).extend(settings) - hub_group_map.update(result.group_map) + + # 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[pip_attr.hub_name] = pip_attr.experimental_requirement_cycles exposed_packages.update(result.exposed_packages) is_reproducible = is_reproducible and result.is_hub_reproducible From 54b56273e8db5d07ea4cc1b12ca51409623c30ef Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 19 Oct 2024 11:48:11 +0900 Subject: [PATCH 13/46] refactor: flatten the whl_map --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 12 ++++-------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 1f74611070..e6650b2321 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": "ax8z1ugJ1rHG8x1CsFwGxeeIIge6Pdh2eiSblp6aOWk=", + "bzlTransitiveDigest": "tLe3l0B9iQniuqkIL8Ql5VJrK8Kv9ud0WCiHszxnbgs=", "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": "k5GXHhSWFwC9pSkVqkFbnXlkdGVXhrF3b4YvQr+85G4=", + "bzlTransitiveDigest": "MZUxRHkGuc+PSDHM6vFDW0TsC5Igbcm2JEAwH2gEpTs=", "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 bc093286b9..2c8901a19e 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -103,9 +103,6 @@ def _create_whl_repos( ) 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(): @@ -260,7 +257,7 @@ def _create_whl_repos( 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, @@ -297,7 +294,7 @@ def _create_whl_repos( # 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[hub_name].setdefault(whl_name, []).append( + whl_map.setdefault(whl_name, []).append( whl_alias( repo = repo_name, version = major_minor, @@ -462,9 +459,8 @@ You cannot use both the additive_build_content and additive_build_content_file a get_index_urls = get_index_urls, ) whl_libraries.update(result.whl_libraries) - for hub, config_settings in result.whl_map.items(): - for whl, settings in config_settings.items(): - hub_whl_map.setdefault(hub, {}).setdefault(whl, []).extend(settings) + for whl, aliases in result.whl_map.items(): + hub_whl_map.setdefault(pip_attr.hub_name, {}).setdefault(whl, []).extend(aliases) # TODO @aignas 2024-04-05: how do we support different requirement # cycles for different abis/oses? For now we will need the users to From 9167b0c480d778a23e3dc82a4e23a98afe2ee8e3 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 19 Oct 2024 11:49:48 +0900 Subject: [PATCH 14/46] refactor: flatten the exposed_packages --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index e6650b2321..2436497800 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": "tLe3l0B9iQniuqkIL8Ql5VJrK8Kv9ud0WCiHszxnbgs=", + "bzlTransitiveDigest": "OfGGaEuj9+njTDgdpcFDX8tkvkYEFib+ruAWbPzdh+4=", "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": "MZUxRHkGuc+PSDHM6vFDW0TsC5Igbcm2JEAwH2gEpTs=", + "bzlTransitiveDigest": "6ZcHi/yh1/g1g8kC4NLUa2GRf7oNSI9QBmxY4DI5gL8=", "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 2c8901a19e..87f5bb697b 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -268,7 +268,7 @@ def _create_whl_repos( if found_something: if is_exposed: - exposed_packages.setdefault(hub_name, {})[whl_name] = None + exposed_packages[whl_name] = None continue requirement = select_requirement( @@ -401,7 +401,7 @@ You cannot use both the additive_build_content and additive_build_content_file a 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( + pip_hub_map[hub_name] = struct( module_name = mod.name, python_versions = [pip_attr.python_version], ) @@ -432,7 +432,7 @@ You cannot use both the additive_build_content and additive_build_content_file a )) return None else: - pip_hub_map[pip_attr.hub_name].python_versions.append(pip_attr.python_version) + pip_hub_map[hub_name].python_versions.append(pip_attr.python_version) get_index_urls = None if pip_attr.experimental_index_url: @@ -460,14 +460,14 @@ You cannot use both the additive_build_content and additive_build_content_file a ) whl_libraries.update(result.whl_libraries) for whl, aliases in result.whl_map.items(): - hub_whl_map.setdefault(pip_attr.hub_name, {}).setdefault(whl, []).extend(aliases) + hub_whl_map.setdefault(hub_name, {}).setdefault(whl, []).extend(aliases) # 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[pip_attr.hub_name] = pip_attr.experimental_requirement_cycles - exposed_packages.update(result.exposed_packages) + hub_group_map[hub_name] = pip_attr.experimental_requirement_cycles + exposed_packages.setdefault(hub_name, {}).update(result.exposed_packages) is_reproducible = is_reproducible and result.is_hub_reproducible return struct( From db0530e2b9d3ef3a65f68e48efd02e48f82c2ab6 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 19 Oct 2024 11:55:48 +0900 Subject: [PATCH 15/46] refactor: Add a helper to ensure that we don't overwrite data --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 20 ++++++++++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 2436497800..d70bc66a51 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": "OfGGaEuj9+njTDgdpcFDX8tkvkYEFib+ruAWbPzdh+4=", + "bzlTransitiveDigest": "kCpd86BFPR6X8dYE5VwC+TojzYRkiLKt59YWYW4UZ3Q=", "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": "6ZcHi/yh1/g1g8kC4NLUa2GRf7oNSI9QBmxY4DI5gL8=", + "bzlTransitiveDigest": "gva9cCDosVqad+u8/y4hXZeXvKwPKcDsYF6DHC2pKjA=", "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 87f5bb697b..7b0b75581e 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -62,6 +62,12 @@ def _whl_mods_impl(whl_mods_dict): whl_mods = whl_mods, ) +def _set_or_fail(d, key, value, msg): + if key in d: + fail(msg(key, d[key], value)) + + d[key] = value + def _create_whl_repos( module_ctx, *, @@ -255,7 +261,12 @@ def _create_whl_repos( if len(requirements) > 1: target_platforms = requirement.target_platforms - whl_libraries[repo_name] = dict(whl_library_args.items()) + _set_or_fail( + whl_libraries, + repo_name, + dict(whl_library_args.items()), # make a copy + lambda key, existing, new: "A value for {} already exists.\nExisting:\n{}\nNew:\n{}".format(key, existing, new), + ) whl_map.setdefault(whl_name, []).append( whl_alias( @@ -293,7 +304,12 @@ def _create_whl_repos( # 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()) + _set_or_fail( + whl_libraries, + repo_name, + dict(whl_library_args.items()), # make a copy + lambda key, existing, new: "A value for {} already exists.\nExisting:\n{}\nNew:\n{}".format(key, existing, new), + ) whl_map.setdefault(whl_name, []).append( whl_alias( repo = repo_name, From 6a8913c2fc3ddd6f07ff8cfd29d9840b775d0417 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 19 Oct 2024 12:25:54 +0900 Subject: [PATCH 16/46] refactor: pass the minimum set of attrs to _create_whl_repos --- examples/bzlmod/MODULE.bazel.lock | 4 +-- python/private/pypi/extension.bzl | 45 ++++++++++++++++++++++--------- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index d70bc66a51..29ed0accf0 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": "kCpd86BFPR6X8dYE5VwC+TojzYRkiLKt59YWYW4UZ3Q=", + "bzlTransitiveDigest": "dRQCiXU75ehM1zmTiK7nJDFs8WEBYKGckU1xG1PAE8M=", "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": "gva9cCDosVqad+u8/y4hXZeXvKwPKcDsYF6DHC2pKjA=", + "bzlTransitiveDigest": "9DrzauNPyXJj5TzkRAsO7o0GBl/92JsSZkhSUn47mYE=", "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 7b0b75581e..7ff7f47287 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -133,16 +133,7 @@ def _create_whl_repos( requirements_by_platform = parse_requirements( module_ctx, - 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, - ), + requirements_by_platform = pip_attr.requirements_by_platform, 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 @@ -164,7 +155,7 @@ def _create_whl_repos( requirements = requirements, python_interpreter = pip_attr.python_interpreter, python_interpreter_target = python_interpreter_target, - srcs = pip_attr._evaluate_markers_srcs, + srcs = pip_attr.evaluate_markers_srcs, logger = logger, ), logger = logger, @@ -470,7 +461,37 @@ You cannot use both the additive_build_content and additive_build_content_file a result = _create_whl_repos( module_ctx, - pip_attr = pip_attr, + pip_attr = struct( + 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_version(pip_attr.python_version), + logger = repo_utils.logger(module_ctx, "pypi:requirements_files_by_platform"), + ), + auth_patterns = pip_attr.auth_patterns, + 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_requirement_cycles = pip_attr.experimental_requirement_cycles, + experimental_target_platforms = pip_attr.experimental_target_platforms, + extra_pip_args = pip_attr.extra_pip_args, + hub_name = pip_attr.hub_name, + isolated = pip_attr.isolated, + netrc = pip_attr.netrc, + pip_data_exclude = pip_attr.pip_data_exclude, + python_interpreter = pip_attr.python_interpreter, + python_interpreter_target = pip_attr.python_interpreter_target, + python_version = pip_attr.python_version, + quiet = pip_attr.quiet, + timeout = pip_attr.timeout, + whl_modifications = pip_attr.whl_modifications, + evaluate_markers_srcs = pip_attr._evaluate_markers_srcs, + ), whl_overrides = whl_overrides, get_index_urls = get_index_urls, ) From a9cf35823ed9b5621f08e6974364539f9f05c891 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 19 Oct 2024 13:14:50 +0900 Subject: [PATCH 17/46] refactor: cleanup the call to create whl_repos --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 24 +++++++++++++----------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 29ed0accf0..de30935f4f 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": "dRQCiXU75ehM1zmTiK7nJDFs8WEBYKGckU1xG1PAE8M=", + "bzlTransitiveDigest": "+L5dDjutgKFRlw43FORTLOpWqA8YOZELepGRLAjN81U=", "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": "9DrzauNPyXJj5TzkRAsO7o0GBl/92JsSZkhSUn47mYE=", + "bzlTransitiveDigest": "DSWQUrxeJcd9hMxpQp2HUXlbssYatbXmap3U3fVLBvo=", "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 7ff7f47287..26d2d397a9 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -459,24 +459,26 @@ You cannot use both the additive_build_content and additive_build_content_file a parallel_download = pip_attr.parallel_download, ) + 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_version(pip_attr.python_version), + logger = repo_utils.logger(module_ctx, "pypi:requirements_files_by_platform"), + ) + result = _create_whl_repos( module_ctx, pip_attr = struct( - 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_version(pip_attr.python_version), - logger = repo_utils.logger(module_ctx, "pypi:requirements_files_by_platform"), - ), auth_patterns = pip_attr.auth_patterns, download_only = pip_attr.download_only, enable_implicit_namespace_pkgs = pip_attr.enable_implicit_namespace_pkgs, environment = pip_attr.environment, envsubst = pip_attr.envsubst, + evaluate_markers_srcs = pip_attr._evaluate_markers_srcs, experimental_requirement_cycles = pip_attr.experimental_requirement_cycles, experimental_target_platforms = pip_attr.experimental_target_platforms, extra_pip_args = pip_attr.extra_pip_args, @@ -488,9 +490,9 @@ You cannot use both the additive_build_content and additive_build_content_file a python_interpreter_target = pip_attr.python_interpreter_target, python_version = pip_attr.python_version, quiet = pip_attr.quiet, + requirements_by_platform = requirements_by_platform, timeout = pip_attr.timeout, whl_modifications = pip_attr.whl_modifications, - evaluate_markers_srcs = pip_attr._evaluate_markers_srcs, ), whl_overrides = whl_overrides, get_index_urls = get_index_urls, From 91a96dcf9dc60b2aaabb8b84a68767d2ba9d69e7 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 19 Oct 2024 13:19:02 +0900 Subject: [PATCH 18/46] refactor: reduce the API surface of _create_whl_repos --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index de30935f4f..c4a1d66233 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": "+L5dDjutgKFRlw43FORTLOpWqA8YOZELepGRLAjN81U=", + "bzlTransitiveDigest": "XLuQLOzkI8dtd2ewdHeUGHEk2zRo1oSVMUMJ4QAet8M=", "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": "DSWQUrxeJcd9hMxpQp2HUXlbssYatbXmap3U3fVLBvo=", + "bzlTransitiveDigest": "kmAR0Jr7B1TnSjzIGF4MXT6dJERAKAZLaxOJ9EjKsJQ=", "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 26d2d397a9..e61ed8abb1 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -80,7 +80,6 @@ def _create_whl_repos( logger = repo_utils.logger(module_ctx, "pypi:create_whl_repos") 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. @@ -221,7 +220,6 @@ def _create_whl_repos( for distribution in dists: found_something = True - is_hub_reproducible = False if pip_attr.netrc: whl_library_args["netrc"] = pip_attr.netrc @@ -310,7 +308,6 @@ def _create_whl_repos( return struct( exposed_packages = exposed_packages, - is_hub_reproducible = is_hub_reproducible, whl_libraries = whl_libraries, whl_map = whl_map, ) @@ -507,7 +504,7 @@ You cannot use both the additive_build_content and additive_build_content_file a # using an alternative cycle resolution strategy. hub_group_map[hub_name] = pip_attr.experimental_requirement_cycles exposed_packages.setdefault(hub_name, {}).update(result.exposed_packages) - is_reproducible = is_reproducible and result.is_hub_reproducible + is_reproducible = is_reproducible and get_index_urls == None return struct( whl_mods = whl_mods, From dbbe31437c4d90590cb3737a1ab5047cad3d2429 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 19 Oct 2024 13:28:48 +0900 Subject: [PATCH 19/46] refactor: move the evaluate_markers_fn creation out of create_whl_repos --- examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/pypi/extension.bzl | 95 +++++++++++----------- python/private/pypi/parse_requirements.bzl | 3 +- 3 files changed, 53 insertions(+), 49 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index c4a1d66233..6c74e1c5ea 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": "XLuQLOzkI8dtd2ewdHeUGHEk2zRo1oSVMUMJ4QAet8M=", + "bzlTransitiveDigest": "pONSkKGT09JDnW0jbo1Jj0xDtFhcn7ZdQ7B/wKFLayM=", "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": "kmAR0Jr7B1TnSjzIGF4MXT6dJERAKAZLaxOJ9EjKsJQ=", + "bzlTransitiveDigest": "iMmzx+RDyIBXOpJOhLUXiHBD3lmMuS8VTqT4p7RL7yo=", "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 e61ed8abb1..ae68896101 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -73,35 +73,15 @@ def _create_whl_repos( *, pip_attr, whl_overrides, + evaluate_markers = None, get_index_urls = None): exposed_packages = {} whl_libraries = {} whl_map = {} logger = repo_utils.logger(module_ctx, "pypi:create_whl_repos") - python_interpreter_target = pip_attr.python_interpreter_target - # 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), @@ -135,28 +115,7 @@ def _create_whl_repos( requirements_by_platform = pip_attr.requirements_by_platform, 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 - # 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, - ), + evaluate_markers = evaluate_markers, logger = logger, ) @@ -189,7 +148,7 @@ def _create_whl_repos( group_name = group_name, pip_data_exclude = pip_attr.pip_data_exclude, python_interpreter = pip_attr.python_interpreter, - python_interpreter_target = python_interpreter_target, + python_interpreter_target = pip_attr.python_interpreter_target, whl_patches = { p: json.encode(args) for p, args in whl_overrides.get(whl_name, {}).items() @@ -467,6 +426,50 @@ You cannot use both the additive_build_content and additive_build_content_file a logger = repo_utils.logger(module_ctx, "pypi:requirements_files_by_platform"), ) + # if we do not have the python_interpreter set in the attributes + # we programmatically find it. + python_interpreter_target = pip_attr.python_interpreter_target + 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] + + # 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_fn = 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 = repo_utils.logger(module_ctx, "pypi:evaluate_markers"), + ) + result = _create_whl_repos( module_ctx, pip_attr = struct( @@ -475,7 +478,6 @@ You cannot use both the additive_build_content and additive_build_content_file a enable_implicit_namespace_pkgs = pip_attr.enable_implicit_namespace_pkgs, environment = pip_attr.environment, envsubst = pip_attr.envsubst, - evaluate_markers_srcs = pip_attr._evaluate_markers_srcs, experimental_requirement_cycles = pip_attr.experimental_requirement_cycles, experimental_target_platforms = pip_attr.experimental_target_platforms, extra_pip_args = pip_attr.extra_pip_args, @@ -484,7 +486,7 @@ You cannot use both the additive_build_content and additive_build_content_file a netrc = pip_attr.netrc, pip_data_exclude = pip_attr.pip_data_exclude, python_interpreter = pip_attr.python_interpreter, - python_interpreter_target = pip_attr.python_interpreter_target, + python_interpreter_target = python_interpreter_target, python_version = pip_attr.python_version, quiet = pip_attr.quiet, requirements_by_platform = requirements_by_platform, @@ -492,6 +494,7 @@ You cannot use both the additive_build_content and additive_build_content_file a whl_modifications = pip_attr.whl_modifications, ), whl_overrides = whl_overrides, + evaluate_markers = evaluate_markers_fn, get_index_urls = get_index_urls, ) whl_libraries.update(result.whl_libraries) 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(): From d14173468fcc7ac00d6ae2b0960aee9369663c03 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 19 Oct 2024 15:33:04 +0900 Subject: [PATCH 20/46] refactor: move the creation of the libraries to a separate function --- examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/pypi/extension.bzl | 137 +++++++++++++++++------------- 2 files changed, 81 insertions(+), 60 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 6c74e1c5ea..73f975e9a2 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": "pONSkKGT09JDnW0jbo1Jj0xDtFhcn7ZdQ7B/wKFLayM=", + "bzlTransitiveDigest": "WnZ+ok0zL8StLeX4qcXt7F/yfPSWxNpw7V0xcee2cGA=", "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": "iMmzx+RDyIBXOpJOhLUXiHBD3lmMuS8VTqT4p7RL7yo=", + "bzlTransitiveDigest": "PYV4emJan8tcwmQo4NdiuK8x1GBycX2I616dUXaEOpI=", "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 ae68896101..4be7c314f7 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -68,6 +68,50 @@ def _set_or_fail(d, key, value, msg): d[key] = value +def _create_whl_repos_from_requirements(*, requirements, pip_attr, whl_library_args): + is_exposed = False + whl_libraries = [] + for requirement in requirements: + is_exposed = is_exposed or requirement.is_exposed + dists = requirement.whls + if not pip_attr.download_only and requirement.sdist: + dists = dists + [requirement.sdist] + + for distribution in dists: + 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 + + 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) + + 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 + + whl_libraries.append( + dict(whl_library_args.items()), # make a copy + ) + + return struct( + libs = whl_libraries, + is_exposed = is_exposed, + ) + +# def _create_whl_repos_from_requirements_fallback(): +# pass +# def _create_whl_repos( module_ctx, *, @@ -168,65 +212,42 @@ def _create_whl_repos( }) 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 - if not pip_attr.download_only and requirement.sdist: - dists = dists + [requirement.sdist] - - for distribution in dists: - found_something = True - - 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 - - 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) - - 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 - - _set_or_fail( - whl_libraries, - repo_name, - dict(whl_library_args.items()), # make a copy - lambda key, existing, new: "A value for {} already exists.\nExisting:\n{}\nNew:\n{}".format(key, existing, new), - ) - - whl_map.setdefault(whl_name, []).append( - whl_alias( - repo = repo_name, - version = major_minor, - filename = distribution.filename, - target_platforms = target_platforms, - ), - ) + result = _create_whl_repos_from_requirements( + requirements = requirements, + pip_attr = pip_attr, + whl_library_args = whl_library_args, + ) + for args in result.libs: + sha256 = args["sha256"] + filename = args["filename"] + target_platforms = args["experimental_target_platforms"] + + repo_name = whl_repo_name(pip_name, filename, sha256) + + _set_or_fail( + whl_libraries, + repo_name, + args, + lambda key, existing, new: "A value for {} already exists.\nExisting:\n{}\nNew:\n{}".format(key, existing, new), + ) + whl_map.setdefault(whl_name, []).append( + whl_alias( + repo = repo_name, + version = major_minor, + filename = filename, + # Pure python wheels or sdists may need to have a + # platform here because they need to be used only + # on particular platforms because the provided + # requirements files have different versions. + target_platforms = target_platforms if ( + filename.endswith("-any.whl") or + not filename.endswith(".whl") + ) and len(requirements) > 1 else None, + ), + ) - if found_something: - if is_exposed: + if result.libs: + if result.is_exposed: exposed_packages[whl_name] = None continue From 389f3ee7f3a7480a6acb2ea6408398bdf0f6581c Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sat, 19 Oct 2024 15:52:34 +0900 Subject: [PATCH 21/46] refactor: move creation of the args to a separate function --- examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/pypi/extension.bzl | 173 +++++++++++++++++------------- 2 files changed, 98 insertions(+), 79 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 73f975e9a2..799b7c7f9e 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": "WnZ+ok0zL8StLeX4qcXt7F/yfPSWxNpw7V0xcee2cGA=", + "bzlTransitiveDigest": "vN+ZKelevRMuVhOnzDazSpFBy/UOGY0X6ZXYEv5hp9U=", "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": "PYV4emJan8tcwmQo4NdiuK8x1GBycX2I616dUXaEOpI=", + "bzlTransitiveDigest": "QZWPAgeykJHrDMmzYN5VVfTVZp+ZjcXqHUtvblI96og=", "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 4be7c314f7..396db1e626 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -68,7 +68,7 @@ def _set_or_fail(d, key, value, msg): d[key] = value -def _create_whl_repos_from_requirements(*, requirements, pip_attr, whl_library_args): +def _create_whl_repos_from_requirements_main(*, requirements, pip_attr, whl_library_args): is_exposed = False whl_libraries = [] for requirement in requirements: @@ -105,13 +105,64 @@ def _create_whl_repos_from_requirements(*, requirements, pip_attr, whl_library_a ) return struct( - libs = whl_libraries, + repos = whl_libraries, is_exposed = is_exposed, ) -# def _create_whl_repos_from_requirements_fallback(): -# pass -# +def _create_whl_repos_from_requirements_fallback( + *, + requirements, + pip_attr, + repository_platform, + whl_library_args, + is_fallback, + logger): + 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. + return [] + elif is_fallback: + 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 + + return [ + dict(whl_library_args.items()), # make a copy + ] + +def _create_whl_repos_from_requirements(*, get_index_urls, requirements, pip_attr, whl_library_args, repository_platform, logger): + if get_index_urls: + result = _create_whl_repos_from_requirements_main( + requirements = requirements, + pip_attr = pip_attr, + whl_library_args = whl_library_args, + ) + + if result.repos: + return result + + return struct( + repos = _create_whl_repos_from_requirements_fallback( + requirements = requirements, + pip_attr = pip_attr, + whl_library_args = whl_library_args, + repository_platform = repository_platform, + is_fallback = get_index_urls != None, + logger = logger, + ), + is_exposed = False, + ) + def _create_whl_repos( module_ctx, *, @@ -211,80 +262,48 @@ def _create_whl_repos( if v != default }) - if get_index_urls: - result = _create_whl_repos_from_requirements( - requirements = requirements, - pip_attr = pip_attr, - whl_library_args = whl_library_args, + result = _create_whl_repos_from_requirements( + get_index_urls = get_index_urls, + requirements = requirements, + pip_attr = pip_attr, + whl_library_args = whl_library_args, + repository_platform = repository_platform, + logger = logger, + ) + for args in result.repos: + filename = args.get("filename") + if filename: + repo_name = whl_repo_name(pip_name, filename, args["sha256"]) + + # Pure python wheels or sdists may need to have a platform here + # because they need to be used only on particular platforms + # because the provided requirements files have different + # versions. + target_platforms = args["experimental_target_platforms"] if ( + filename.endswith("-any.whl") or + not filename.endswith(".whl") + ) and len(requirements) > 1 else None + else: + repo_name = "{}_{}".format(pip_name, whl_name) + target_platforms = None + + _set_or_fail( + whl_libraries, + repo_name, + args, + lambda key, existing, new: "A value for {} already exists.\nExisting:\n{}\nNew:\n{}".format(key, existing, new), + ) + whl_map.setdefault(whl_name, []).append( + whl_alias( + repo = repo_name, + version = major_minor, + filename = filename, + target_platforms = target_platforms, + ), ) - for args in result.libs: - sha256 = args["sha256"] - filename = args["filename"] - target_platforms = args["experimental_target_platforms"] - - repo_name = whl_repo_name(pip_name, filename, sha256) - - _set_or_fail( - whl_libraries, - repo_name, - args, - lambda key, existing, new: "A value for {} already exists.\nExisting:\n{}\nNew:\n{}".format(key, existing, new), - ) - whl_map.setdefault(whl_name, []).append( - whl_alias( - repo = repo_name, - version = major_minor, - filename = filename, - # Pure python wheels or sdists may need to have a - # platform here because they need to be used only - # on particular platforms because the provided - # requirements files have different versions. - target_platforms = target_platforms if ( - filename.endswith("-any.whl") or - not filename.endswith(".whl") - ) and len(requirements) > 1 else None, - ), - ) - - if result.libs: - if result.is_exposed: - exposed_packages[whl_name] = None - continue - requirement = select_requirement( - requirements, - platform = None if pip_attr.download_only else repository_platform, - ) - if not requirement: - # Sometimes the package is not present for host platform if there - # are whls specified only in particular requirements files, in that - # case just continue, however, if the download_only flag is set up, - # then the user can also specify the target platform of the wheel - # packages they want to download, in that case there will be always - # a requirement here, so we will not be in this code branch. - continue - elif get_index_urls: - logger.warn(lambda: "falling back to pip for installing the right file for {}".format(requirement.requirement_line)) - - 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) - _set_or_fail( - whl_libraries, - repo_name, - dict(whl_library_args.items()), # make a copy - lambda key, existing, new: "A value for {} already exists.\nExisting:\n{}\nNew:\n{}".format(key, existing, new), - ) - whl_map.setdefault(whl_name, []).append( - whl_alias( - repo = repo_name, - version = major_minor, - ), - ) + if result.is_exposed: + exposed_packages[whl_name] = None return struct( exposed_packages = exposed_packages, From d0330a5b34863fbc4403799cfa832b1cdbaae94c Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 20 Oct 2024 09:10:58 +0900 Subject: [PATCH 22/46] refactor: normalize the whl_name everywhere in wheel dicts to allow users pass whl_mods by any name --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 14 ++++---------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 799b7c7f9e..f3c1528bb5 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": "vN+ZKelevRMuVhOnzDazSpFBy/UOGY0X6ZXYEv5hp9U=", + "bzlTransitiveDigest": "OFExIs1hoRuBmm+At0gY5IRtqLfBQQHtZC/KWfQvFaY=", "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": "QZWPAgeykJHrDMmzYN5VVfTVZp+ZjcXqHUtvblI96og=", + "bzlTransitiveDigest": "MIGJtxTWmOpa5MgdBz/kM4rKK0reB0nHo8SY9rVsDuo=", "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 396db1e626..3985a83f82 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -186,7 +186,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 = { @@ -195,7 +195,7 @@ def _create_whl_repos( } whl_group_mapping = { - whl_name: group_name + normalize_name(whl_name): group_name for group_name, group_whls in requirement_cycles.items() for whl_name in group_whls } @@ -216,14 +216,8 @@ 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) - group_deps = requirement_cycles.get(group_name, []) # Construct args separately so that the lock file can be smaller and does not include unused # attrs. @@ -233,13 +227,13 @@ 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, envsubst = pip_attr.envsubst, experimental_target_platforms = pip_attr.experimental_target_platforms, - group_deps = group_deps, + group_deps = requirement_cycles.get(group_name, []), group_name = group_name, pip_data_exclude = pip_attr.pip_data_exclude, python_interpreter = pip_attr.python_interpreter, From 01134c90784cdb8dc57703ddb0101c746c24a480 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 20 Oct 2024 09:20:37 +0900 Subject: [PATCH 23/46] inline _set_or_fail and use kwargs for whl_library_args --- examples/bzlmod/MODULE.bazel.lock | 4 +-- python/private/pypi/extension.bzl | 41 ++++++++++++++++--------------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index f3c1528bb5..1dc325cba5 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": "OFExIs1hoRuBmm+At0gY5IRtqLfBQQHtZC/KWfQvFaY=", + "bzlTransitiveDigest": "9sOZTi3XpQD0U5VVb19DHR32T5flsBTmXTh+KPAaXYE=", "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": "MIGJtxTWmOpa5MgdBz/kM4rKK0reB0nHo8SY9rVsDuo=", + "bzlTransitiveDigest": "2bxapbJh7KyZvnseKRXeM2TQRhQ6/m8mxH50xQ/3ERc=", "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 3985a83f82..ca4b7d0582 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -62,13 +62,7 @@ def _whl_mods_impl(whl_mods_dict): whl_mods = whl_mods, ) -def _set_or_fail(d, key, value, msg): - if key in d: - fail(msg(key, d[key], value)) - - d[key] = value - -def _create_whl_repos_from_requirements_main(*, requirements, pip_attr, whl_library_args): +def _create_whl_repos_from_requirements_main(*, requirements, pip_attr, **whl_library_args): is_exposed = False whl_libraries = [] for requirement in requirements: @@ -114,9 +108,9 @@ def _create_whl_repos_from_requirements_fallback( requirements, pip_attr, repository_platform, - whl_library_args, is_fallback, - logger): + logger, + **whl_library_args): requirement = select_requirement( requirements, platform = None if pip_attr.download_only else repository_platform, @@ -140,12 +134,12 @@ def _create_whl_repos_from_requirements_fallback( dict(whl_library_args.items()), # make a copy ] -def _create_whl_repos_from_requirements(*, get_index_urls, requirements, pip_attr, whl_library_args, repository_platform, logger): +def _create_whl_repos_from_requirements(*, get_index_urls, requirements, pip_attr, repository_platform, logger, **whl_library_args): if get_index_urls: result = _create_whl_repos_from_requirements_main( requirements = requirements, pip_attr = pip_attr, - whl_library_args = whl_library_args, + **whl_library_args ) if result.repos: @@ -153,12 +147,12 @@ def _create_whl_repos_from_requirements(*, get_index_urls, requirements, pip_att return struct( repos = _create_whl_repos_from_requirements_fallback( + is_fallback = get_index_urls != None, requirements = requirements, pip_attr = pip_attr, - whl_library_args = whl_library_args, repository_platform = repository_platform, - is_fallback = get_index_urls != None, logger = logger, + **whl_library_args ), is_exposed = False, ) @@ -260,9 +254,9 @@ def _create_whl_repos( get_index_urls = get_index_urls, requirements = requirements, pip_attr = pip_attr, - whl_library_args = whl_library_args, repository_platform = repository_platform, logger = logger, + **whl_library_args ) for args in result.repos: filename = args.get("filename") @@ -279,14 +273,21 @@ def _create_whl_repos( ) and len(requirements) > 1 else None else: repo_name = "{}_{}".format(pip_name, whl_name) + + # TODO @aignas 2024-10-20: derive this from the requirements to get + # rid of `select_requirement` function to fix #2268 target_platforms = None - _set_or_fail( - whl_libraries, - repo_name, - args, - lambda key, existing, new: "A value for {} already exists.\nExisting:\n{}\nNew:\n{}".format(key, existing, new), - ) + if repo_name in whl_libraries: + fail( + "A value for {} already exists.\nExisting:\n{}\nNew:\n{}".format( + repo_name, + whl_libraries[repo_name], + args, + ), + ) + + whl_libraries[repo_name] = args whl_map.setdefault(whl_name, []).append( whl_alias( repo = repo_name, From a536f04e0522649c9d86761398dabac8a9b1bb8b Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 20 Oct 2024 09:26:53 +0900 Subject: [PATCH 24/46] move the parsing of the requirements out --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 22 ++++++++++------------ 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 1dc325cba5..62bb49e370 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": "9sOZTi3XpQD0U5VVb19DHR32T5flsBTmXTh+KPAaXYE=", + "bzlTransitiveDigest": "+3socNpHith33tDmbLyPYe8ei/TomcznYjunmOwcAsk=", "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": "2bxapbJh7KyZvnseKRXeM2TQRhQ6/m8mxH50xQ/3ERc=", + "bzlTransitiveDigest": "uDntOfBWttT9A6XVHLJ2krF3+F33Z+hd5rB9FDKy6Eg=", "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 ca4b7d0582..b73fd25041 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -162,7 +162,6 @@ def _create_whl_repos( *, pip_attr, whl_overrides, - evaluate_markers = None, get_index_urls = None): exposed_packages = {} whl_libraries = {} @@ -199,17 +198,8 @@ def _create_whl_repos( # 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, - extra_pip_args = pip_attr.extra_pip_args, - get_index_urls = get_index_urls, - evaluate_markers = evaluate_markers, - logger = logger, - ) - repository_platform = host_platform(module_ctx) - for whl_name, requirements in requirements_by_platform.items(): + for whl_name, requirements in pip_attr.requirements_by_platform.items(): whl_name = normalize_name(whl_name) group_name = whl_group_mapping.get(whl_name) @@ -505,6 +495,15 @@ You cannot use both the additive_build_content and additive_build_content_file a logger = repo_utils.logger(module_ctx, "pypi:evaluate_markers"), ) + requirements_by_platform = parse_requirements( + module_ctx, + requirements_by_platform = requirements_by_platform, + extra_pip_args = pip_attr.extra_pip_args, + get_index_urls = get_index_urls, + evaluate_markers = evaluate_markers_fn, + logger = repo_utils.logger(module_ctx, "pypi:parse_requirements"), + ) + result = _create_whl_repos( module_ctx, pip_attr = struct( @@ -529,7 +528,6 @@ You cannot use both the additive_build_content and additive_build_content_file a whl_modifications = pip_attr.whl_modifications, ), whl_overrides = whl_overrides, - evaluate_markers = evaluate_markers_fn, get_index_urls = get_index_urls, ) whl_libraries.update(result.whl_libraries) From ed1537066b4515f951e3993728ad160a805838a1 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 20 Oct 2024 09:34:24 +0900 Subject: [PATCH 25/46] move the selection of algorithms out of the processing function --- examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/pypi/extension.bzl | 62 +++++++++++++++---------------- 2 files changed, 32 insertions(+), 34 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 62bb49e370..f2cbb93de3 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": "+3socNpHith33tDmbLyPYe8ei/TomcznYjunmOwcAsk=", + "bzlTransitiveDigest": "O0RvA6YPXE7rkKEncTIgZ/skD1nk5UtJ2Owm1EcZuZ0=", "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": "uDntOfBWttT9A6XVHLJ2krF3+F33Z+hd5rB9FDKy6Eg=", + "bzlTransitiveDigest": "exTYIr/oT6JGRIksUwUHC88fzBaXKbwEMIrJXuxOJKg=", "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 b73fd25041..aa01bf5330 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -62,7 +62,7 @@ def _whl_mods_impl(whl_mods_dict): whl_mods = whl_mods, ) -def _create_whl_repos_from_requirements_main(*, requirements, pip_attr, **whl_library_args): +def _whl_libraries_using_downloader(*, requirements, pip_attr, **whl_library_args): is_exposed = False whl_libraries = [] for requirement in requirements: @@ -103,13 +103,13 @@ def _create_whl_repos_from_requirements_main(*, requirements, pip_attr, **whl_li is_exposed = is_exposed, ) -def _create_whl_repos_from_requirements_fallback( +def _whl_libraries_using_pip( *, requirements, pip_attr, repository_platform, - is_fallback, logger, + is_fallback = False, **whl_library_args): requirement = select_requirement( requirements, @@ -130,31 +130,30 @@ def _create_whl_repos_from_requirements_fallback( if requirement.extra_pip_args: whl_library_args["extra_pip_args"] = requirement.extra_pip_args - return [ - dict(whl_library_args.items()), # make a copy - ] + return struct( + repos = [ + dict(whl_library_args.items()), # make a copy + ], + is_exposed = False, + ) -def _create_whl_repos_from_requirements(*, get_index_urls, requirements, pip_attr, repository_platform, logger, **whl_library_args): - if get_index_urls: - result = _create_whl_repos_from_requirements_main( - requirements = requirements, - pip_attr = pip_attr, - **whl_library_args - ) +def _whl_libraries_using_downloader_with_fallback(*, requirements, pip_attr, repository_platform, logger, **whl_library_args): + result = _whl_libraries_using_downloader( + requirements = requirements, + pip_attr = pip_attr, + **whl_library_args + ) - if result.repos: - return result + if result.repos: + return result - return struct( - repos = _create_whl_repos_from_requirements_fallback( - is_fallback = get_index_urls != None, - requirements = requirements, - pip_attr = pip_attr, - repository_platform = repository_platform, - logger = logger, - **whl_library_args - ), - is_exposed = False, + return _whl_libraries_using_pip( + is_fallback = True, + requirements = requirements, + pip_attr = pip_attr, + repository_platform = repository_platform, + logger = logger, + **whl_library_args ) def _create_whl_repos( @@ -162,7 +161,7 @@ def _create_whl_repos( *, pip_attr, whl_overrides, - get_index_urls = None): + requirements_to_whl_libraries): exposed_packages = {} whl_libraries = {} whl_map = {} @@ -240,14 +239,15 @@ def _create_whl_repos( if v != default }) - result = _create_whl_repos_from_requirements( - get_index_urls = get_index_urls, + result = requirements_to_whl_libraries( requirements = requirements, pip_attr = pip_attr, repository_platform = repository_platform, logger = logger, **whl_library_args ) + if result.is_exposed: + exposed_packages[whl_name] = None for args in result.repos: filename = args.get("filename") if filename: @@ -287,9 +287,6 @@ def _create_whl_repos( ), ) - if result.is_exposed: - exposed_packages[whl_name] = None - return struct( exposed_packages = exposed_packages, whl_libraries = whl_libraries, @@ -503,6 +500,7 @@ You cannot use both the additive_build_content and additive_build_content_file a evaluate_markers = evaluate_markers_fn, logger = repo_utils.logger(module_ctx, "pypi:parse_requirements"), ) + requirements_to_whl_libraries = _whl_libraries_using_downloader_with_fallback if get_index_urls else _whl_libraries_using_pip result = _create_whl_repos( module_ctx, @@ -528,7 +526,7 @@ You cannot use both the additive_build_content and additive_build_content_file a whl_modifications = pip_attr.whl_modifications, ), whl_overrides = whl_overrides, - get_index_urls = get_index_urls, + requirements_to_whl_libraries = requirements_to_whl_libraries, ) whl_libraries.update(result.whl_libraries) for whl, aliases in result.whl_map.items(): From cd4ad8032b2f4e1534308d15b01ecd2a50d5cd50 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 20 Oct 2024 11:30:31 +0900 Subject: [PATCH 26/46] get rid of some default_value handling --- examples/bzlmod/MODULE.bazel.lock | 4 +-- python/private/pypi/extension.bzl | 46 +++++++++++++------------------ 2 files changed, 21 insertions(+), 29 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index f2cbb93de3..ac7e549e32 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": "O0RvA6YPXE7rkKEncTIgZ/skD1nk5UtJ2Owm1EcZuZ0=", + "bzlTransitiveDigest": "ebA53/KKC2ch3QwFAQnGX9iQlcqWAubYhtFscCByJuM=", "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": "exTYIr/oT6JGRIksUwUHC88fzBaXKbwEMIrJXuxOJKg=", + "bzlTransitiveDigest": "pAkkK+xxJsjoUFlKrzSI8Pp2h0SNc9ui3tcyvNJJIGc=", "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 aa01bf5330..96d1984fbe 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -174,29 +174,13 @@ def _create_whl_repos( version_label(pip_attr.python_version), ) major_minor = _major_minor_version(pip_attr.python_version) - - whl_modifications = {} - if pip_attr.whl_modifications != None: - for mod, whl_name in pip_attr.whl_modifications.items(): - whl_modifications[normalize_name(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 = { - normalize_name(whl_name): group_name - for group_name, group_whls in requirement_cycles.items() - for whl_name in group_whls - } - else: - whl_group_mapping = {} - requirement_cycles = {} + whl_group_mapping = { + whl_name: group_name + for group_name, group_whls in pip_attr.requirement_cycles.items() + for whl_name in group_whls + } # Create a new wheel library for each of the different whls - repository_platform = host_platform(module_ctx) for whl_name, requirements in pip_attr.requirements_by_platform.items(): whl_name = normalize_name(whl_name) @@ -210,13 +194,13 @@ def _create_whl_repos( ) maybe_args = dict( # The following values are safe to omit if they have false like values - annotation = whl_modifications.get(whl_name), + annotation = pip_attr.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, envsubst = pip_attr.envsubst, experimental_target_platforms = pip_attr.experimental_target_platforms, - group_deps = requirement_cycles.get(group_name, []), + group_deps = pip_attr.requirement_cycles.get(group_name, []), group_name = group_name, pip_data_exclude = pip_attr.pip_data_exclude, python_interpreter = pip_attr.python_interpreter, @@ -419,7 +403,6 @@ You cannot use both the additive_build_content and additive_build_content_file a else: pip_hub_map[hub_name].python_versions.append(pip_attr.python_version) - get_index_urls = None if pip_attr.experimental_index_url: get_index_urls = lambda ctx, distributions: simpleapi_download( ctx, @@ -436,6 +419,10 @@ You cannot use both the additive_build_content and additive_build_content_file a cache = simpleapi_cache, parallel_download = pip_attr.parallel_download, ) + requirements_to_whl_libraries = _whl_libraries_using_downloader_with_fallback + else: + get_index_urls = None + requirements_to_whl_libraries = _whl_libraries_using_pip requirements_by_platform = requirements_files_by_platform( requirements_by_platform = pip_attr.requirements_by_platform, @@ -500,7 +487,6 @@ You cannot use both the additive_build_content and additive_build_content_file a evaluate_markers = evaluate_markers_fn, logger = repo_utils.logger(module_ctx, "pypi:parse_requirements"), ) - requirements_to_whl_libraries = _whl_libraries_using_downloader_with_fallback if get_index_urls else _whl_libraries_using_pip result = _create_whl_repos( module_ctx, @@ -510,7 +496,10 @@ You cannot use both the additive_build_content and additive_build_content_file a enable_implicit_namespace_pkgs = pip_attr.enable_implicit_namespace_pkgs, environment = pip_attr.environment, envsubst = pip_attr.envsubst, - experimental_requirement_cycles = 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() + }, experimental_target_platforms = pip_attr.experimental_target_platforms, extra_pip_args = pip_attr.extra_pip_args, hub_name = pip_attr.hub_name, @@ -523,7 +512,10 @@ You cannot use both the additive_build_content and additive_build_content_file a quiet = pip_attr.quiet, requirements_by_platform = requirements_by_platform, timeout = pip_attr.timeout, - whl_modifications = pip_attr.whl_modifications, + whl_modifications = { + normalize_name(whl_name): mod + for mod, whl_name in pip_attr.whl_modifications.items() + }, ), whl_overrides = whl_overrides, requirements_to_whl_libraries = requirements_to_whl_libraries, From 7a97789a8b841ad56390ebd7d65ab936dc1ab3c1 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 20 Oct 2024 11:41:49 +0900 Subject: [PATCH 27/46] create a function for default whl library args --- examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/pypi/extension.bzl | 95 ++++++++++++++++++------------- 2 files changed, 57 insertions(+), 42 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index ac7e549e32..3f7439e7c6 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": "ebA53/KKC2ch3QwFAQnGX9iQlcqWAubYhtFscCByJuM=", + "bzlTransitiveDigest": "w3lzsBey7rNQuyL1VjLO91VOSkTY7PJjbJ6TxbzQyn0=", "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": "pAkkK+xxJsjoUFlKrzSI8Pp2h0SNc9ui3tcyvNJJIGc=", + "bzlTransitiveDigest": "deH3J+h0vRJRCzzAqVXaZn+q4KJA2fDJRabTRgkI3qY=", "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 96d1984fbe..134d981606 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -156,6 +156,51 @@ def _whl_libraries_using_downloader_with_fallback(*, requirements, pip_attr, rep **whl_library_args ) +def _default_whl_library_args(module_ctx, *, hub_name, whl_name, pip_attr, whl_group_mapping, whl_overrides): + group_name = whl_group_mapping.get(whl_name) + pip_name = "{}_{}".format( + hub_name, + version_label(pip_attr.python_version), + ) + + # 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 = pip_attr.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, + envsubst = pip_attr.envsubst, + experimental_target_platforms = pip_attr.experimental_target_platforms, + group_deps = pip_attr.requirement_cycles.get(group_name, []), + group_name = group_name, + pip_data_exclude = pip_attr.pip_data_exclude, + python_interpreter = pip_attr.python_interpreter, + python_interpreter_target = pip_attr.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 + }) + return whl_library_args + def _create_whl_repos( module_ctx, *, @@ -165,7 +210,6 @@ def _create_whl_repos( exposed_packages = {} whl_libraries = {} whl_map = {} - logger = repo_utils.logger(module_ctx, "pypi:create_whl_repos") hub_name = pip_attr.hub_name @@ -184,57 +228,28 @@ def _create_whl_repos( repository_platform = host_platform(module_ctx) for whl_name, requirements in pip_attr.requirements_by_platform.items(): whl_name = normalize_name(whl_name) - group_name = whl_group_mapping.get(whl_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 = pip_attr.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, - envsubst = pip_attr.envsubst, - experimental_target_platforms = pip_attr.experimental_target_platforms, - group_deps = pip_attr.requirement_cycles.get(group_name, []), - group_name = group_name, - pip_data_exclude = pip_attr.pip_data_exclude, - python_interpreter = pip_attr.python_interpreter, - python_interpreter_target = pip_attr.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 - }) result = requirements_to_whl_libraries( requirements = requirements, pip_attr = pip_attr, repository_platform = repository_platform, logger = logger, - **whl_library_args + **_default_whl_library_args( + module_ctx, + hub_name = hub_name, + whl_name = whl_name, + pip_attr = pip_attr, + whl_group_mapping = whl_group_mapping, + whl_overrides = whl_overrides, + ) ) if result.is_exposed: exposed_packages[whl_name] = None for args in result.repos: filename = args.get("filename") if filename: + # TODO @aignas 2024-10-20: use hub_name as a prefix so that + # we can reuse the same wheel across multiple versions. repo_name = whl_repo_name(pip_name, filename, args["sha256"]) # Pure python wheels or sdists may need to have a platform here From 1b16afec4685b60948c1b5e83dcc9bbcb4b8e999 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 20 Oct 2024 11:48:59 +0900 Subject: [PATCH 28/46] move the common whl library arg construction to a different place --- examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/pypi/extension.bzl | 68 ++++++++++++++++++++++++------- 2 files changed, 56 insertions(+), 16 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 3f7439e7c6..dc3ba1b444 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": "w3lzsBey7rNQuyL1VjLO91VOSkTY7PJjbJ6TxbzQyn0=", + "bzlTransitiveDigest": "3OWkx9a+hDyOSbEisxxu0qLJbQoaHLR9ekGucA5cPQA=", "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": "deH3J+h0vRJRCzzAqVXaZn+q4KJA2fDJRabTRgkI3qY=", + "bzlTransitiveDigest": "APxO53gN4Kht2paXuV1ESUDI27tXgvAzXm2Uun7eYkQ=", "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 134d981606..aabfcb91ee 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -156,10 +156,9 @@ def _whl_libraries_using_downloader_with_fallback(*, requirements, pip_attr, rep **whl_library_args ) -def _default_whl_library_args(module_ctx, *, hub_name, whl_name, pip_attr, whl_group_mapping, whl_overrides): - group_name = whl_group_mapping.get(whl_name) +def _common_whl_library_args(module_ctx, *, pip_attr): pip_name = "{}_{}".format( - hub_name, + pip_attr.hub_name, version_label(pip_attr.python_version), ) @@ -167,25 +166,18 @@ def _default_whl_library_args(module_ctx, *, hub_name, whl_name, pip_attr, whl_g # attrs. whl_library_args = dict( repo = pip_name, - dep_template = "@{}//{{name}}:{{target}}".format(hub_name), + dep_template = "@{}//{{name}}:{{target}}".format(pip_attr.hub_name), ) maybe_args = dict( # The following values are safe to omit if they have false like values - annotation = pip_attr.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, envsubst = pip_attr.envsubst, experimental_target_platforms = pip_attr.experimental_target_platforms, - group_deps = pip_attr.requirement_cycles.get(group_name, []), - group_name = group_name, pip_data_exclude = pip_attr.pip_data_exclude, python_interpreter = pip_attr.python_interpreter, python_interpreter_target = pip_attr.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( @@ -201,12 +193,28 @@ def _default_whl_library_args(module_ctx, *, hub_name, whl_name, pip_attr, whl_g }) return whl_library_args +def _default_whl_library_args(*, whl_name, pip_attr, whl_group_mapping, whl_overrides, **whl_library_args): + group_name = whl_group_mapping.get(whl_name) + maybe_args = dict( + # The following values are safe to omit if they have false like values + annotation = pip_attr.whl_modifications.get(whl_name), + group_deps = pip_attr.requirement_cycles.get(group_name, []), + group_name = group_name, + 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}) + return whl_library_args + def _create_whl_repos( module_ctx, *, pip_attr, whl_overrides, - requirements_to_whl_libraries): + requirements_to_whl_libraries, + **whl_library_args): exposed_packages = {} whl_libraries = {} whl_map = {} @@ -235,12 +243,11 @@ def _create_whl_repos( repository_platform = repository_platform, logger = logger, **_default_whl_library_args( - module_ctx, - hub_name = hub_name, whl_name = whl_name, pip_attr = pip_attr, whl_group_mapping = whl_group_mapping, whl_overrides = whl_overrides, + **whl_library_args ) ) if result.is_exposed: @@ -534,7 +541,40 @@ You cannot use both the additive_build_content and additive_build_content_file a ), whl_overrides = whl_overrides, requirements_to_whl_libraries = requirements_to_whl_libraries, + # Construct args separately so that the lock file can be smaller and does + # not include unused attrs. + **_common_whl_library_args( + module_ctx, + pip_attr = struct( + auth_patterns = pip_attr.auth_patterns, + download_only = pip_attr.download_only, + enable_implicit_namespace_pkgs = pip_attr.enable_implicit_namespace_pkgs, + environment = pip_attr.environment, + envsubst = pip_attr.envsubst, + requirement_cycles = { + name: [normalize_name(whl_name) for whl_name in whls] + for name, whls in pip_attr.experimental_requirement_cycles.items() + }, + experimental_target_platforms = pip_attr.experimental_target_platforms, + extra_pip_args = pip_attr.extra_pip_args, + hub_name = pip_attr.hub_name, + isolated = pip_attr.isolated, + netrc = pip_attr.netrc, + pip_data_exclude = pip_attr.pip_data_exclude, + python_interpreter = pip_attr.python_interpreter, + python_interpreter_target = python_interpreter_target, + python_version = pip_attr.python_version, + quiet = pip_attr.quiet, + requirements_by_platform = requirements_by_platform, + timeout = pip_attr.timeout, + whl_modifications = { + normalize_name(whl_name): mod + for mod, whl_name in pip_attr.whl_modifications.items() + }, + ), + ) ) + whl_libraries.update(result.whl_libraries) for whl, aliases in result.whl_map.items(): hub_whl_map.setdefault(hub_name, {}).setdefault(whl, []).extend(aliases) From 448ac3fa088fa309b5a5bbf0ff60a98a5758e7b1 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 20 Oct 2024 11:59:36 +0900 Subject: [PATCH 29/46] cleanup the default arg building --- examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/pypi/extension.bzl | 73 +++++++++++-------------------- 2 files changed, 28 insertions(+), 49 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index dc3ba1b444..83c02fac2a 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": "3OWkx9a+hDyOSbEisxxu0qLJbQoaHLR9ekGucA5cPQA=", + "bzlTransitiveDigest": "eLoSWrj7bXR3ayO7Pm9bWjCQ1m4H3bNbK0vem2NX16M=", "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": "APxO53gN4Kht2paXuV1ESUDI27tXgvAzXm2Uun7eYkQ=", + "bzlTransitiveDigest": "BAE807roJEj6pU+CXfPCS7mpD8a70q/++XzJJpdrNuo=", "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 aabfcb91ee..d599679c5e 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -62,41 +62,37 @@ def _whl_mods_impl(whl_mods_dict): whl_mods = whl_mods, ) -def _whl_libraries_using_downloader(*, requirements, pip_attr, **whl_library_args): +def _whl_libraries_using_downloader(*, requirements, **whl_library_args): is_exposed = False whl_libraries = [] + + # This is no-op because pip is not used to download the wheel. + download_only = whl_library_args.pop("download_only", False) + + # pip is not used to download wheels and the python `whl_library` helpers + # are only extracting things, however, we need this for sdists because pip + # is still used there + extra_pip_args = whl_library_args.pop("extra_pip_args", None) + for requirement in requirements: is_exposed = is_exposed or requirement.is_exposed dists = requirement.whls - if not pip_attr.download_only and requirement.sdist: + if not download_only and requirement.sdist: dists = dists + [requirement.sdist] for distribution in dists: - 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 - - 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 + args = dict(whl_library_args.items()) - # This is no-op because pip is not used to download the wheel. - whl_library_args.pop("download_only", None) + if not distribution.filename.endswith(".whl") and extra_pip_args: + args["extra_pip_args"] = extra_pip_args - 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 - whl_libraries.append( - dict(whl_library_args.items()), # make a copy - ) + whl_libraries.append(args) return struct( repos = whl_libraries, @@ -130,6 +126,10 @@ def _whl_libraries_using_pip( if requirement.extra_pip_args: whl_library_args["extra_pip_args"] = requirement.extra_pip_args + # The args that are not used with pip + whl_library_args.pop("netrc", None) + whl_library_args.pop("auth_patterns", None) + return struct( repos = [ dict(whl_library_args.items()), # make a copy @@ -140,7 +140,6 @@ def _whl_libraries_using_pip( def _whl_libraries_using_downloader_with_fallback(*, requirements, pip_attr, repository_platform, logger, **whl_library_args): result = _whl_libraries_using_downloader( requirements = requirements, - pip_attr = pip_attr, **whl_library_args ) @@ -170,11 +169,13 @@ def _common_whl_library_args(module_ctx, *, pip_attr): ) maybe_args = dict( # The following values are safe to omit if they have false like values + auth_patterns = pip_attr.auth_patterns, 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, + netrc = pip_attr.netrc, pip_data_exclude = pip_attr.pip_data_exclude, python_interpreter = pip_attr.python_interpreter, python_interpreter_target = pip_attr.python_interpreter_target, @@ -513,27 +514,15 @@ You cannot use both the additive_build_content and additive_build_content_file a result = _create_whl_repos( module_ctx, pip_attr = struct( - auth_patterns = pip_attr.auth_patterns, download_only = pip_attr.download_only, - enable_implicit_namespace_pkgs = pip_attr.enable_implicit_namespace_pkgs, - environment = pip_attr.environment, - envsubst = pip_attr.envsubst, requirement_cycles = { name: [normalize_name(whl_name) for whl_name in whls] for name, whls in pip_attr.experimental_requirement_cycles.items() }, - experimental_target_platforms = pip_attr.experimental_target_platforms, extra_pip_args = pip_attr.extra_pip_args, hub_name = pip_attr.hub_name, - isolated = pip_attr.isolated, - netrc = pip_attr.netrc, - pip_data_exclude = pip_attr.pip_data_exclude, - python_interpreter = pip_attr.python_interpreter, - python_interpreter_target = python_interpreter_target, python_version = pip_attr.python_version, - quiet = pip_attr.quiet, requirements_by_platform = requirements_by_platform, - timeout = pip_attr.timeout, whl_modifications = { normalize_name(whl_name): mod for mod, whl_name in pip_attr.whl_modifications.items() @@ -551,12 +540,7 @@ You cannot use both the additive_build_content and additive_build_content_file a enable_implicit_namespace_pkgs = pip_attr.enable_implicit_namespace_pkgs, environment = pip_attr.environment, envsubst = pip_attr.envsubst, - requirement_cycles = { - name: [normalize_name(whl_name) for whl_name in whls] - for name, whls in pip_attr.experimental_requirement_cycles.items() - }, experimental_target_platforms = pip_attr.experimental_target_platforms, - extra_pip_args = pip_attr.extra_pip_args, hub_name = pip_attr.hub_name, isolated = pip_attr.isolated, netrc = pip_attr.netrc, @@ -565,12 +549,7 @@ You cannot use both the additive_build_content and additive_build_content_file a python_interpreter_target = python_interpreter_target, python_version = pip_attr.python_version, quiet = pip_attr.quiet, - requirements_by_platform = requirements_by_platform, timeout = pip_attr.timeout, - whl_modifications = { - normalize_name(whl_name): mod - for mod, whl_name in pip_attr.whl_modifications.items() - }, ), ) ) From a7c742648bf11b9fec4206ee1c905ff0524c100a Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 20 Oct 2024 12:03:20 +0900 Subject: [PATCH 30/46] get rid of pip_attr usage more --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 7 ++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 83c02fac2a..9bd17cc57e 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": "eLoSWrj7bXR3ayO7Pm9bWjCQ1m4H3bNbK0vem2NX16M=", + "bzlTransitiveDigest": "vd0Oonh8zxofw+kywDcyLPrfcywDhu7LkLKrkE9HbT8=", "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": "BAE807roJEj6pU+CXfPCS7mpD8a70q/++XzJJpdrNuo=", + "bzlTransitiveDigest": "sVfZb4X5OtASqPMfjrNcwRpVspziUKlCNWmplLdklys=", "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 d599679c5e..fc47984af1 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -102,14 +102,13 @@ def _whl_libraries_using_downloader(*, requirements, **whl_library_args): def _whl_libraries_using_pip( *, requirements, - pip_attr, repository_platform, logger, is_fallback = False, **whl_library_args): requirement = select_requirement( requirements, - platform = None if pip_attr.download_only else repository_platform, + platform = None if whl_library_args.get("download_only") else repository_platform, ) if not requirement: # Sometimes the package is not present for host platform if there @@ -137,7 +136,7 @@ def _whl_libraries_using_pip( is_exposed = False, ) -def _whl_libraries_using_downloader_with_fallback(*, requirements, pip_attr, repository_platform, logger, **whl_library_args): +def _whl_libraries_using_downloader_with_fallback(*, requirements, repository_platform, logger, **whl_library_args): result = _whl_libraries_using_downloader( requirements = requirements, **whl_library_args @@ -149,7 +148,6 @@ def _whl_libraries_using_downloader_with_fallback(*, requirements, pip_attr, rep return _whl_libraries_using_pip( is_fallback = True, requirements = requirements, - pip_attr = pip_attr, repository_platform = repository_platform, logger = logger, **whl_library_args @@ -240,7 +238,6 @@ def _create_whl_repos( result = requirements_to_whl_libraries( requirements = requirements, - pip_attr = pip_attr, repository_platform = repository_platform, logger = logger, **_default_whl_library_args( From 5cfea2b6bcb50f5e744e4070a9562a051bd36e31 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 20 Oct 2024 12:09:36 +0900 Subject: [PATCH 31/46] TODO: pass the extra_pip_args correctly --- examples/bzlmod/MODULE.bazel.lock | 286 +++++++++++++++++++++++++++++- python/private/pypi/extension.bzl | 14 +- 2 files changed, 289 insertions(+), 11 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 9bd17cc57e..e9284bfc8e 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": "vd0Oonh8zxofw+kywDcyLPrfcywDhu7LkLKrkE9HbT8=", + "bzlTransitiveDigest": "F9yApEMyXv7o9NwgfYoNxva0VcZM54ljTEBiKzE2d5I=", "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": "sVfZb4X5OtASqPMfjrNcwRpVspziUKlCNWmplLdklys=", + "bzlTransitiveDigest": "0Yvbp+/AftMOfjxB0b8zJ+pHvKHt9Pt/UXQ/oZTdZx8=", "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 fc47984af1..d43d793154 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -69,11 +69,6 @@ def _whl_libraries_using_downloader(*, requirements, **whl_library_args): # This is no-op because pip is not used to download the wheel. download_only = whl_library_args.pop("download_only", False) - # pip is not used to download wheels and the python `whl_library` helpers - # are only extracting things, however, we need this for sdists because pip - # is still used there - extra_pip_args = whl_library_args.pop("extra_pip_args", None) - for requirement in requirements: is_exposed = is_exposed or requirement.is_exposed dists = requirement.whls @@ -83,8 +78,11 @@ def _whl_libraries_using_downloader(*, requirements, **whl_library_args): for distribution in dists: args = dict(whl_library_args.items()) - if not distribution.filename.endswith(".whl") and extra_pip_args: - args["extra_pip_args"] = extra_pip_args + if not distribution.filename.endswith(".whl") and requirement.extra_pip_args: + # pip is not used to download wheels and the python `whl_library` helpers + # are only extracting things, however, we need this for sdists because pip + # is still used there + args["extra_pip_args"] = requirement.extra_pip_args args["requirement"] = requirement.srcs.requirement args["urls"] = [distribution.url] @@ -511,12 +509,10 @@ You cannot use both the additive_build_content and additive_build_content_file a result = _create_whl_repos( module_ctx, pip_attr = struct( - download_only = pip_attr.download_only, requirement_cycles = { name: [normalize_name(whl_name) for whl_name in whls] for name, whls in pip_attr.experimental_requirement_cycles.items() }, - extra_pip_args = pip_attr.extra_pip_args, hub_name = pip_attr.hub_name, python_version = pip_attr.python_version, requirements_by_platform = requirements_by_platform, From 18c5057e2dc0233b258ba0f93f73f24e168d96f5 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 21 Oct 2024 06:48:09 +0900 Subject: [PATCH 32/46] test: add a first unit test --- examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/pypi/extension.bzl | 10 +- tests/pypi/extension/BUILD.bazel | 17 +++ tests/pypi/extension/extension_tests.bzl | 127 +++++++++++++++++++++++ 4 files changed, 152 insertions(+), 6 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 e9284bfc8e..9520ba0a09 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": "F9yApEMyXv7o9NwgfYoNxva0VcZM54ljTEBiKzE2d5I=", + "bzlTransitiveDigest": "rdsiI4ZpG88IRiU3d7C9wSSqwMaVEDjEpQcpB+D95LY=", "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": "0Yvbp+/AftMOfjxB0b8zJ+pHvKHt9Pt/UXQ/oZTdZx8=", + "bzlTransitiveDigest": "Ubn45i8gtxSt14DY258aDIudhzwn8LjUHdYKv3RIzc8=", "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 d43d793154..81fd25ef1c 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -295,7 +295,7 @@ def _create_whl_repos( whl_map = whl_map, ) -def parse_modules(module_ctx, _fail = fail, simpleapi_download = simpleapi_download): +def parse_modules(module_ctx, _fail = fail, simpleapi_download = simpleapi_download, available_interpreters = INTERPRETER_LABELS): """Implementation of parsing the tag classes for the extension and return a struct for registering repositories. Args: @@ -303,6 +303,8 @@ def parse_modules(module_ctx, _fail = fail, simpleapi_download = simpleapi_downl _fail: {type}`function` the failure function, mainly for testing. simpleapi_download: {type}`function` the function to download from PyPI. See {obj}`simpleapi_download` for the API docs. + available_interpreters: {type}`dict[str, Label]` The available registered interpreters + to use during the `repository_rule` phase. Used for testing. Returns: A struct with the following attributes: @@ -460,7 +462,7 @@ You cannot use both the additive_build_content and additive_build_content_file a 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 " + @@ -470,9 +472,9 @@ You cannot use both the additive_build_content and additive_build_content_file a 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] # 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 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..4301732230 --- /dev/null +++ b/tests/pypi/extension/extension_tests.bzl @@ -0,0 +1,127 @@ +# 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: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 {}.get, + 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( + *, + hub_name, + python_version, + experimental_index_url = "", + requirements_lock = None, + **kwargs): + return struct( + hub_name = hub_name, + python_version = python_version, + requirements_lock = requirements_lock, + # Constants for now + # TODO @aignas 2024-10-21: cover with tests + auth_patterns = {}, + download_only = False, + enable_implicit_namespace_pkgs = False, + environment = {}, + envsubst = {}, + experimental_index_url = experimental_index_url, + experimental_requirement_cycles = {}, + experimental_target_platforms = [], + extra_pip_args = [], + isolated = False, + netrc = None, + pip_data_exclude = None, + python_interpreter = None, + python_interpreter_target = None, + quiet = False, + requirements_by_platform = {}, + requirements_darwin = None, + requirements_linux = None, + requirements_windows = None, + timeout = 42, + whl_modifications = {}, + _evaluate_markers_srcs = [], + **kwargs + ) + +def _test_simple(env): + pypi = parse_modules( + module_ctx = _mock_mctx( + _mod(name = "rules_python", parse = [_parse( + hub_name = "pypi", + python_version = "3.15", + requirements_lock = "requirements.txt", + )]), + read = { + "requirements.txt": "", + }.get, + ), + available_interpreters = { + "python_3_15_host": "unit_test_interpreter_target", + }, + ) + + env.expect.that_dict(pypi.exposed_packages).contains_exactly({"pypi": []}) + env.expect.that_dict(pypi.hub_group_map).contains_exactly({"pypi": {}}) + env.expect.that_dict(pypi.hub_whl_map).contains_exactly({}) + env.expect.that_bool(pypi.is_reproducible).equals(True) + env.expect.that_dict(pypi.whl_libraries).contains_exactly({}) + env.expect.that_dict(pypi.whl_mods).contains_exactly({}) + +_tests.append(_test_simple) + +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 02aabaf011c268686a9a5b19d2a9808750c72a3c Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 21 Oct 2024 06:58:46 +0900 Subject: [PATCH 33/46] wip --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 33 +++++++++++++++++++------------ python/private/repo_utils.bzl | 4 +++- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 9520ba0a09..edb07b457e 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": "rdsiI4ZpG88IRiU3d7C9wSSqwMaVEDjEpQcpB+D95LY=", + "bzlTransitiveDigest": "N6BZfrVuqlJ8zu5Ro4Dop/xRftx4xd9zi+yZiHU9zJs=", "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": "Ubn45i8gtxSt14DY258aDIudhzwn8LjUHdYKv3RIzc8=", + "bzlTransitiveDigest": "83PhRZFcpp1tFRQ2wE+GfsxZ7T1GBaVzQUj/nsJ9ghg=", "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 81fd25ef1c..fe8caded5b 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -211,11 +211,11 @@ def _create_whl_repos( pip_attr, whl_overrides, requirements_to_whl_libraries, + logger, **whl_library_args): exposed_packages = {} whl_libraries = {} whl_map = {} - logger = repo_utils.logger(module_ctx, "pypi:create_whl_repos") hub_name = pip_attr.hub_name pip_name = "{}_{}".format( @@ -295,27 +295,33 @@ def _create_whl_repos( whl_map = whl_map, ) -def parse_modules(module_ctx, _fail = fail, simpleapi_download = simpleapi_download, available_interpreters = INTERPRETER_LABELS): +def parse_modules( + module_ctx, + simpleapi_download = simpleapi_download, + available_interpreters = INTERPRETER_LABELS, + logger = None): """Implementation of parsing the tag classes for the extension and return a struct for registering repositories. Args: module_ctx: {type}`module_ctx` module context. - _fail: {type}`function` the failure function, mainly for testing. simpleapi_download: {type}`function` the function to download from PyPI. See {obj}`simpleapi_download` for the API docs. available_interpreters: {type}`dict[str, Label]` The available registered interpreters to use during the `repository_rule` phase. Used for testing. + logger: The logger to use. Returns: A struct with the following attributes: """ + logger = logger or repo_utils.logger(module_ctx, "pypi:parse_modules") + 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("""\ + logger.fail("""\ Found same whl_name '{}' in the same hub '{}', please use a different hub_name.""".format( whl_mod.whl_name, whl_mod.hub_name, @@ -324,7 +330,7 @@ Found same whl_name '{}' in the same hub '{}', please use a different hub_name." build_content = whl_mod.additive_build_content if whl_mod.additive_build_content_file != None and whl_mod.additive_build_content != "": - _fail("""\ + logger.fail("""\ You cannot use both the additive_build_content and additive_build_content_file arguments at the same time. """) return None @@ -345,17 +351,17 @@ You cannot use both the additive_build_content and additive_build_content_file a 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") + logger.fail("overrides are only supported in root modules") return None if not attr.file.endswith(".whl"): - _fail("Only whl overrides are supported at this time") + logger.fail("Only whl overrides are supported at this time") return None 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)) + logger.fail("Duplicate module overrides for '{}'".format(attr.file)) return None _overriden_whl_set[attr.file] = None @@ -397,7 +403,7 @@ You cannot use both the additive_build_content and additive_build_content_file a elif pip_hub_map[hub_name].module_name != mod.name: # We cannot have two hubs with the same name in different # modules. - _fail(( + logger.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 " + @@ -410,7 +416,7 @@ You cannot use both the additive_build_content and additive_build_content_file a return None elif pip_attr.python_version in pip_hub_map[hub_name].python_versions: - _fail(( + logger.fail(( "Duplicate pip python version '{version}' for hub " + "'{hub}' in module '{module}': the Python versions " + "used for a hub must be unique" @@ -452,7 +458,7 @@ You cannot use both the additive_build_content and additive_build_content_file a requirements_windows = pip_attr.requirements_windows, extra_pip_args = pip_attr.extra_pip_args, python_version = _major_minor_version(pip_attr.python_version), - logger = repo_utils.logger(module_ctx, "pypi:requirements_files_by_platform"), + logger = logger.child("requirements_by_platform"), ) # if we do not have the python_interpreter set in the attributes @@ -496,7 +502,7 @@ You cannot use both the additive_build_content and additive_build_content_file a python_interpreter = pip_attr.python_interpreter, python_interpreter_target = python_interpreter_target, srcs = pip_attr._evaluate_markers_srcs, - logger = repo_utils.logger(module_ctx, "pypi:evaluate_markers"), + logger = logger.child("evaluate_markers"), ) requirements_by_platform = parse_requirements( @@ -505,7 +511,7 @@ You cannot use both the additive_build_content and additive_build_content_file a extra_pip_args = pip_attr.extra_pip_args, get_index_urls = get_index_urls, evaluate_markers = evaluate_markers_fn, - logger = repo_utils.logger(module_ctx, "pypi:parse_requirements"), + logger = logger.child("parse_requirements"), ) result = _create_whl_repos( @@ -525,6 +531,7 @@ You cannot use both the additive_build_content and additive_build_content_file a ), whl_overrides = whl_overrides, requirements_to_whl_libraries = requirements_to_whl_libraries, + logger = logger.child("create_whl_repos"), # Construct args separately so that the lock file can be smaller and does # not include unused attrs. **_common_whl_library_args( diff --git a/python/private/repo_utils.bzl b/python/private/repo_utils.bzl index e0bf69acac..af1415475f 100644 --- a/python/private/repo_utils.bzl +++ b/python/private/repo_utils.bzl @@ -31,13 +31,14 @@ def _is_repo_debug_enabled(mrctx): """ return _getenv(mrctx, REPO_DEBUG_ENV_VAR) == "1" -def _logger(mrctx, name = None): +def _logger(mrctx, name = None, fail = fail): """Creates a logger instance for printing messages. Args: 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. + fail: the function to use for failure call printing. Returns: A struct with attributes logging: trace, debug, info, warn, fail. @@ -83,6 +84,7 @@ def _logger(mrctx, name = None): 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), + child = lambda suffix: _logger(mrctx, "{}.{}".format(name, suffix)), ) def _execute_internal( From 1f0a1a79ef0e18a3cf28b5cd2378496af4d150f3 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 21 Oct 2024 08:31:45 +0900 Subject: [PATCH 34/46] revert refactors and maintain the test --- examples/bzlmod/MODULE.bazel.lock | 286 +--------- python/private/pypi/extension.bzl | 656 ++++++++++------------- tests/pypi/extension/extension_tests.bzl | 6 +- 3 files changed, 276 insertions(+), 672 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index edb07b457e..9e535d2fcf 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": "N6BZfrVuqlJ8zu5Ro4Dop/xRftx4xd9zi+yZiHU9zJs=", + "bzlTransitiveDigest": "/jEJJA6bGfPnkYV/Hsk9yzrlT5IoYb/mRVU1PfC0vco=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -1488,12 +1488,6 @@ "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", @@ -1629,12 +1623,6 @@ "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", @@ -1702,12 +1690,6 @@ "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", @@ -1834,12 +1816,6 @@ "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", @@ -1868,12 +1844,6 @@ "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", @@ -2014,12 +1984,6 @@ "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", @@ -2076,12 +2040,6 @@ "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", @@ -2309,12 +2267,6 @@ "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", @@ -2343,12 +2295,6 @@ "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", @@ -2435,12 +2381,6 @@ "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", @@ -2490,12 +2430,6 @@ "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", @@ -2524,12 +2458,6 @@ "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", @@ -2558,12 +2486,6 @@ "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", @@ -2622,12 +2544,6 @@ "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", @@ -2705,12 +2621,6 @@ "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", @@ -2790,12 +2700,6 @@ "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", @@ -2825,12 +2729,6 @@ "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", @@ -2946,12 +2844,6 @@ "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", @@ -3057,12 +2949,6 @@ "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", @@ -3119,12 +3005,6 @@ "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", @@ -3190,12 +3070,6 @@ "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", @@ -3369,12 +3243,6 @@ "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", @@ -3440,12 +3308,6 @@ "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", @@ -3474,12 +3336,6 @@ "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", @@ -3620,12 +3476,6 @@ "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", @@ -3682,12 +3532,6 @@ "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", @@ -3737,12 +3581,6 @@ "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", @@ -3892,12 +3730,6 @@ "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", @@ -4101,12 +3933,6 @@ "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", @@ -4509,12 +4335,6 @@ "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", @@ -4543,12 +4363,6 @@ "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", @@ -4692,12 +4506,6 @@ "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", @@ -4910,12 +4718,6 @@ "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", @@ -4944,12 +4746,6 @@ "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", @@ -5006,12 +4802,6 @@ "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", @@ -5041,12 +4831,6 @@ "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", @@ -5206,12 +4990,6 @@ "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", @@ -5331,12 +5109,6 @@ "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", @@ -5365,12 +5137,6 @@ "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", @@ -5476,12 +5242,6 @@ "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", @@ -5568,12 +5328,6 @@ "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", @@ -5602,12 +5356,6 @@ "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", @@ -5703,12 +5451,6 @@ "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", @@ -5775,12 +5517,6 @@ "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", @@ -6034,12 +5770,6 @@ "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", @@ -6182,12 +5912,6 @@ "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", @@ -6286,12 +6010,6 @@ "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", @@ -6581,7 +6299,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "83PhRZFcpp1tFRQ2wE+GfsxZ7T1GBaVzQUj/nsJ9ghg=", + "bzlTransitiveDigest": "K0r9pw9npOvi7NrwlOISJ1GyVGq1KoDS6Rno07H336M=", "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 fe8caded5b..393fbc88c7 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -62,266 +62,286 @@ def _whl_mods_impl(whl_mods_dict): whl_mods = whl_mods, ) -def _whl_libraries_using_downloader(*, requirements, **whl_library_args): - is_exposed = False - whl_libraries = [] +def _create_whl_repos(module_ctx, *, pip_attr, whl_map, whl_overrides, group_map, simpleapi_cache, exposed_packages, whl_libraries, available_interpreters): + logger = repo_utils.logger(module_ctx, "pypi:create_whl_repos") + python_interpreter_target = pip_attr.python_interpreter_target + is_hub_reproducible = True - # This is no-op because pip is not used to download the wheel. - download_only = whl_library_args.pop("download_only", False) - - for requirement in requirements: - is_exposed = is_exposed or requirement.is_exposed - dists = requirement.whls - if not download_only and requirement.sdist: - dists = dists + [requirement.sdist] - - for distribution in dists: - args = dict(whl_library_args.items()) - - if not distribution.filename.endswith(".whl") and requirement.extra_pip_args: - # pip is not used to download wheels and the python `whl_library` helpers - # are only extracting things, however, we need this for sdists because pip - # is still used there - args["extra_pip_args"] = requirement.extra_pip_args - - args["requirement"] = requirement.srcs.requirement - args["urls"] = [distribution.url] - args["sha256"] = distribution.sha256 - args["filename"] = distribution.filename - args["experimental_target_platforms"] = requirement.target_platforms - - whl_libraries.append(args) - - return struct( - repos = whl_libraries, - is_exposed = is_exposed, - ) - -def _whl_libraries_using_pip( - *, - requirements, - repository_platform, - logger, - is_fallback = False, - **whl_library_args): - requirement = select_requirement( - requirements, - platform = None if whl_library_args.get("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. - return [] - elif is_fallback: - 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 - - # The args that are not used with pip - whl_library_args.pop("netrc", None) - whl_library_args.pop("auth_patterns", None) - - return struct( - repos = [ - dict(whl_library_args.items()), # make a copy - ], - is_exposed = False, - ) - -def _whl_libraries_using_downloader_with_fallback(*, requirements, repository_platform, logger, **whl_library_args): - result = _whl_libraries_using_downloader( - requirements = requirements, - **whl_library_args - ) - - if result.repos: - return result - - return _whl_libraries_using_pip( - is_fallback = True, - requirements = requirements, - repository_platform = repository_platform, - logger = logger, - **whl_library_args - ) + # 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 available_interpreters: + 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(available_interpreters), + )) + python_interpreter_target = available_interpreters[python_name] -def _common_whl_library_args(module_ctx, *, pip_attr): pip_name = "{}_{}".format( - pip_attr.hub_name, + hub_name, version_label(pip_attr.python_version), ) + major_minor = _major_minor_version(pip_attr.python_version) - # 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(pip_attr.hub_name), - ) - maybe_args = dict( - # The following values are safe to omit if they have false like values - auth_patterns = pip_attr.auth_patterns, - 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, - netrc = pip_attr.netrc, - pip_data_exclude = pip_attr.pip_data_exclude, - python_interpreter = pip_attr.python_interpreter, - python_interpreter_target = pip_attr.python_interpreter_target, - ) - 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 - }) - return whl_library_args - -def _default_whl_library_args(*, whl_name, pip_attr, whl_group_mapping, whl_overrides, **whl_library_args): - group_name = whl_group_mapping.get(whl_name) - maybe_args = dict( - # The following values are safe to omit if they have false like values - annotation = pip_attr.whl_modifications.get(whl_name), - group_deps = pip_attr.requirement_cycles.get(group_name, []), - group_name = group_name, - 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}) - return whl_library_args + 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 = {} -def _create_whl_repos( - module_ctx, - *, - pip_attr, - whl_overrides, - requirements_to_whl_libraries, - logger, - **whl_library_args): - exposed_packages = {} - whl_libraries = {} - whl_map = {} + # Create a new wheel library for each of the different whls - hub_name = pip_attr.hub_name - pip_name = "{}_{}".format( - hub_name, - version_label(pip_attr.python_version), + get_index_urls = None + if pip_attr.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 = 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, + ), + 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 + # 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, ) - major_minor = _major_minor_version(pip_attr.python_version) - whl_group_mapping = { - whl_name: group_name - for group_name, group_whls in pip_attr.requirement_cycles.items() - for whl_name in group_whls - } - # Create a new wheel library for each of the different whls repository_platform = host_platform(module_ctx) - for whl_name, requirements in pip_attr.requirements_by_platform.items(): + 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) - result = requirements_to_whl_libraries( - requirements = requirements, - repository_platform = repository_platform, - logger = logger, - **_default_whl_library_args( - whl_name = whl_name, - pip_attr = pip_attr, - whl_group_mapping = whl_group_mapping, - whl_overrides = whl_overrides, - **whl_library_args - ) + 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), ) - if result.is_exposed: - exposed_packages[whl_name] = None - for args in result.repos: - filename = args.get("filename") - if filename: - # TODO @aignas 2024-10-20: use hub_name as a prefix so that - # we can reuse the same wheel across multiple versions. - repo_name = whl_repo_name(pip_name, filename, args["sha256"]) - - # Pure python wheels or sdists may need to have a platform here - # because they need to be used only on particular platforms - # because the provided requirements files have different - # versions. - target_platforms = args["experimental_target_platforms"] if ( - filename.endswith("-any.whl") or - not filename.endswith(".whl") - ) and len(requirements) > 1 else None - else: - repo_name = "{}_{}".format(pip_name, whl_name) - - # TODO @aignas 2024-10-20: derive this from the requirements to get - # rid of `select_requirement` function to fix #2268 - target_platforms = None - - if repo_name in whl_libraries: - fail( - "A value for {} already exists.\nExisting:\n{}\nNew:\n{}".format( - repo_name, - whl_libraries[repo_name], - args, - ), - ) + 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 + is_exposed = False + for requirement in requirements: + is_exposed = is_exposed or requirement.is_exposed + 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 + + 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 + + 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) + + 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_libraries[repo_name] = dict(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, + ), + ) - whl_libraries[repo_name] = args - whl_map.setdefault(whl_name, []).append( - whl_alias( - repo = repo_name, - version = major_minor, - filename = filename, - target_platforms = target_platforms, - ), - ) + if found_something: + if is_exposed: + exposed_packages.setdefault(hub_name, {})[whl_name] = None + continue - return struct( - exposed_packages = exposed_packages, - whl_libraries = whl_libraries, - whl_map = whl_map, - ) + 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[hub_name].setdefault(whl_name, []).append( + whl_alias( + repo = repo_name, + version = major_minor, + ), + ) -def parse_modules( - module_ctx, - simpleapi_download = simpleapi_download, - available_interpreters = INTERPRETER_LABELS, - logger = None): + return is_hub_reproducible + +def parse_modules(module_ctx, _fail = fail, available_interpreters = INTERPRETER_LABELS): """Implementation of parsing the tag classes for the extension and return a struct for registering repositories. Args: module_ctx: {type}`module_ctx` module context. - simpleapi_download: {type}`function` the function to download from PyPI. See - {obj}`simpleapi_download` for the API docs. - available_interpreters: {type}`dict[str, Label]` The available registered interpreters - to use during the `repository_rule` phase. Used for testing. - logger: The logger to use. + _fail: {type}`function` the failure function, mainly for testing. + 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 struct with the following attributes: """ - logger = logger or repo_utils.logger(module_ctx, "pypi:parse_modules") - 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. - logger.fail("""\ + _fail("""\ Found same whl_name '{}' in the same hub '{}', please use a different hub_name.""".format( whl_mod.whl_name, whl_mod.hub_name, @@ -330,7 +350,7 @@ Found same whl_name '{}' in the same hub '{}', please use a different hub_name." build_content = whl_mod.additive_build_content if whl_mod.additive_build_content_file != None and whl_mod.additive_build_content != "": - logger.fail("""\ + _fail("""\ You cannot use both the additive_build_content and additive_build_content_file arguments at the same time. """) return None @@ -351,18 +371,15 @@ You cannot use both the additive_build_content and additive_build_content_file a for module in module_ctx.modules: for attr in module.tags.override: if not module.is_root: - logger.fail("overrides are only supported in root modules") - return None + fail("overrides are only supported in root modules") if not attr.file.endswith(".whl"): - logger.fail("Only whl overrides are supported at this time") - return None + 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: - logger.fail("Duplicate module overrides for '{}'".format(attr.file)) - return None + fail("Duplicate module overrides for '{}'".format(attr.file)) _overriden_whl_set[attr.file] = None for patch in attr.patches: @@ -396,14 +413,14 @@ You cannot use both the additive_build_content and additive_build_content_file a for pip_attr in mod.tags.parse: hub_name = pip_attr.hub_name if hub_name not in pip_hub_map: - pip_hub_map[hub_name] = struct( + 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. - logger.fail(( + 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 " + @@ -413,10 +430,9 @@ You cannot use both the additive_build_content and additive_build_content_file a first_module = pip_hub_map[hub_name].module_name, second_module = mod.name, )) - return None elif pip_attr.python_version in pip_hub_map[hub_name].python_versions: - logger.fail(( + fail(( "Duplicate pip python version '{version}' for hub " + "'{hub}' in module '{module}': the Python versions " + "used for a hub must be unique" @@ -425,157 +441,27 @@ You cannot use both the additive_build_content and additive_build_content_file a module = mod.name, version = pip_attr.python_version, )) - return None - else: - pip_hub_map[hub_name].python_versions.append(pip_attr.python_version) - - if pip_attr.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_to_whl_libraries = _whl_libraries_using_downloader_with_fallback else: - get_index_urls = None - requirements_to_whl_libraries = _whl_libraries_using_pip - - 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_version(pip_attr.python_version), - logger = logger.child("requirements_by_platform"), - ) + pip_hub_map[pip_attr.hub_name].python_versions.append(pip_attr.python_version) - # if we do not have the python_interpreter set in the attributes - # we programmatically find it. - python_interpreter_target = pip_attr.python_interpreter_target - 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 available_interpreters: - 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(available_interpreters), - )) - python_interpreter_target = available_interpreters[python_name] - - # 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_fn = lambda module_ctx, requirements: evaluate_markers( + is_hub_reproducible = _create_whl_repos( module_ctx, - requirements = requirements, - python_interpreter = pip_attr.python_interpreter, - python_interpreter_target = python_interpreter_target, - srcs = pip_attr._evaluate_markers_srcs, - logger = logger.child("evaluate_markers"), - ) - - requirements_by_platform = parse_requirements( - module_ctx, - requirements_by_platform = requirements_by_platform, - extra_pip_args = pip_attr.extra_pip_args, - get_index_urls = get_index_urls, - evaluate_markers = evaluate_markers_fn, - logger = logger.child("parse_requirements"), - ) - - result = _create_whl_repos( - module_ctx, - pip_attr = struct( - requirement_cycles = { - name: [normalize_name(whl_name) for whl_name in whls] - for name, whls in pip_attr.experimental_requirement_cycles.items() - }, - hub_name = pip_attr.hub_name, - python_version = pip_attr.python_version, - requirements_by_platform = requirements_by_platform, - whl_modifications = { - normalize_name(whl_name): mod - for mod, whl_name in pip_attr.whl_modifications.items() - }, - ), + exposed_packages = exposed_packages, + group_map = hub_group_map, + pip_attr = pip_attr, + simpleapi_cache = simpleapi_cache, + whl_map = hub_whl_map, whl_overrides = whl_overrides, - requirements_to_whl_libraries = requirements_to_whl_libraries, - logger = logger.child("create_whl_repos"), - # Construct args separately so that the lock file can be smaller and does - # not include unused attrs. - **_common_whl_library_args( - module_ctx, - pip_attr = struct( - auth_patterns = pip_attr.auth_patterns, - 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, - hub_name = pip_attr.hub_name, - isolated = pip_attr.isolated, - netrc = pip_attr.netrc, - pip_data_exclude = pip_attr.pip_data_exclude, - python_interpreter = pip_attr.python_interpreter, - python_interpreter_target = python_interpreter_target, - python_version = pip_attr.python_version, - quiet = pip_attr.quiet, - timeout = pip_attr.timeout, - ), - ) + whl_libraries = whl_libraries, + available_interpreters = available_interpreters, ) - - whl_libraries.update(result.whl_libraries) - for whl, aliases in result.whl_map.items(): - hub_whl_map.setdefault(hub_name, {}).setdefault(whl, []).extend(aliases) - - # 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 - exposed_packages.setdefault(hub_name, {}).update(result.exposed_packages) - is_reproducible = is_reproducible and get_index_urls == None + is_reproducible = is_reproducible and is_hub_reproducible return struct( whl_mods = whl_mods, hub_whl_map = hub_whl_map, hub_group_map = hub_group_map, - exposed_packages = { - name: sorted(value) - for name, value in exposed_packages.items() - }, + exposed_packages = exposed_packages, whl_libraries = whl_libraries, is_reproducible = is_reproducible, ) @@ -651,12 +537,12 @@ def _pip_impl(module_ctx): # Build all of the wheel modifications if the tag class is called. _whl_mods_impl(mods.whl_mods) - # 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. 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 sorted(mods.hub_whl_map.items()): + for hub_name, whl_map in mods.hub_whl_map.items(): hub_repository( name = hub_name, repo_name = hub_name, @@ -664,7 +550,7 @@ def _pip_impl(module_ctx): key: json.encode(value) for key, value in whl_map.items() }, - packages = mods.exposed_packages.get(hub_name, {}), + packages = sorted(mods.exposed_packages.get(hub_name, {})), groups = mods.hub_group_map.get(hub_name), ) diff --git a/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index 4301732230..87f8044075 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -109,9 +109,9 @@ def _test_simple(env): }, ) - env.expect.that_dict(pypi.exposed_packages).contains_exactly({"pypi": []}) - env.expect.that_dict(pypi.hub_group_map).contains_exactly({"pypi": {}}) - env.expect.that_dict(pypi.hub_whl_map).contains_exactly({}) + env.expect.that_dict(pypi.exposed_packages).contains_exactly({}) + env.expect.that_dict(pypi.hub_group_map).contains_exactly({}) + env.expect.that_dict(pypi.hub_whl_map).contains_exactly({"pypi": {}}) env.expect.that_bool(pypi.is_reproducible).equals(True) env.expect.that_dict(pypi.whl_libraries).contains_exactly({}) env.expect.that_dict(pypi.whl_mods).contains_exactly({}) From a62878284f51b109d4e4a876cbe08bf55821f6f2 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 21 Oct 2024 08:52:25 +0900 Subject: [PATCH 35/46] implement a custom subject --- tests/pypi/extension/extension_tests.bzl | 22 ++-- .../pypi/extension/parse_modules_subject.bzl | 107 ++++++++++++++++++ 2 files changed, 122 insertions(+), 7 deletions(-) create mode 100644 tests/pypi/extension/parse_modules_subject.bzl diff --git a/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index 87f8044075..5c5009cc12 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -16,6 +16,7 @@ load("@rules_testing//lib:test_suite.bzl", "test_suite") load("//python/private/pypi:extension.bzl", "parse_modules") # buildifier: disable=bzl-visibility +load(":parse_modules_subject.bzl", "parse_modules_subject") _tests = [] @@ -54,6 +55,12 @@ def _mod(*, name, parse = [], override = [], whl_mods = [], is_root = True): is_root = is_root, ) +def _parse_modules(env, **kwargs): + return parse_modules_subject( + parse_modules(**kwargs), + meta = env.expect.meta, + ) + def _parse( *, hub_name, @@ -93,7 +100,8 @@ def _parse( ) def _test_simple(env): - pypi = parse_modules( + pypi = _parse_modules( + env, module_ctx = _mock_mctx( _mod(name = "rules_python", parse = [_parse( hub_name = "pypi", @@ -109,12 +117,12 @@ def _test_simple(env): }, ) - env.expect.that_dict(pypi.exposed_packages).contains_exactly({}) - env.expect.that_dict(pypi.hub_group_map).contains_exactly({}) - env.expect.that_dict(pypi.hub_whl_map).contains_exactly({"pypi": {}}) - env.expect.that_bool(pypi.is_reproducible).equals(True) - env.expect.that_dict(pypi.whl_libraries).contains_exactly({}) - env.expect.that_dict(pypi.whl_mods).contains_exactly({}) + pypi.is_reproducible().equals(True) + pypi.exposed_packages().contains_exactly({}) + pypi.hub_group_map().contains_exactly({}) + pypi.hub_whl_map().contains_exactly({"pypi": {}}) + pypi.whl_libraries().contains_exactly({}) + pypi.whl_mods().contains_exactly({}) _tests.append(_test_simple) diff --git a/tests/pypi/extension/parse_modules_subject.bzl b/tests/pypi/extension/parse_modules_subject.bzl new file mode 100644 index 0000000000..5ca5131e5e --- /dev/null +++ b/tests/pypi/extension/parse_modules_subject.bzl @@ -0,0 +1,107 @@ +# 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:truth.bzl", "subjects") + +def parse_modules_subject(info, *, meta): + """Creates a new `parse_modules_subject` for the parse_modules result instance. + + Method: parse_modules_subject.new + + Args: + info: The parse_modules result object + meta: ExpectMeta object. + + Returns: + A `parse_modules_subject` struct + """ + + # buildifier: disable=uninitialized + public = struct( + # go/keep-sorted start + is_reproducible = lambda *a, **k: _subject_is_reproducible(self, *a, **k), + exposed_packages = lambda *a, **k: _subject_exposed_packages(self, *a, **k), + hub_group_map = lambda *a, **k: _subject_hub_group_map(self, *a, **k), + hub_whl_map = lambda *a, **k: _subject_hub_whl_map(self, *a, **k), + whl_libraries = lambda *a, **k: _subject_whl_libraries(self, *a, **k), + whl_mods = lambda *a, **k: _subject_whl_mods(self, *a, **k), + # go/keep-sorted end + ) + self = struct( + actual = info, + meta = meta, + ) + return public + +def _subject_is_reproducible(self): + """Returns a `BoolSubject` for the `is_reproducible` attribute. + + Method: parse_modules_subject.direct_pyc_files + """ + return subjects.bool( + self.actual.is_reproducible, + meta = self.meta.derive("is_reproducible()"), + ) + +def _subject_exposed_packages(self): + """Returns a `BoolSubject` for the `exposed_packages` attribute. + + Method: parse_modules_subject.direct_pyc_files + """ + return subjects.dict( + self.actual.exposed_packages, + meta = self.meta.derive("exposed_packages()"), + ) + +def _subject_hub_group_map(self): + """Returns a `BoolSubject` for the `hub_group_map` attribute. + + Method: parse_modules_subject.direct_pyc_files + """ + return subjects.dict( + self.actual.hub_group_map, + meta = self.meta.derive("hub_group_map()"), + ) + +def _subject_hub_whl_map(self): + """Returns a `BoolSubject` for the `hub_whl_map` attribute. + + Method: parse_modules_subject.direct_pyc_files + """ + return subjects.dict( + self.actual.hub_whl_map, + meta = self.meta.derive("hub_whl_map()"), + ) + +def _subject_whl_libraries(self): + """Returns a `BoolSubject` for the `whl_libraries` attribute. + + Method: parse_modules_subject.direct_pyc_files + """ + return subjects.dict( + self.actual.whl_libraries, + meta = self.meta.derive("whl_libraries()"), + ) + +def _subject_whl_mods(self): + """Returns a `BoolSubject` for the `whl_mods` attribute. + + Method: parse_modules_subject.direct_pyc_files + """ + return subjects.dict( + self.actual.whl_mods, + meta = self.meta.derive("whl_mods()"), + ) From aebeed06252c3370f15f2737e11244df323d57a1 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 21 Oct 2024 08:54:22 +0900 Subject: [PATCH 36/46] finish cleaning up the args --- tests/pypi/extension/extension_tests.bzl | 40 ++++++++++++++++++------ 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index 5c5009cc12..41bce1e288 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -65,20 +65,13 @@ def _parse( *, hub_name, python_version, - experimental_index_url = "", - requirements_lock = None, - **kwargs): - return struct( - hub_name = hub_name, - python_version = python_version, - requirements_lock = requirements_lock, - # Constants for now - # TODO @aignas 2024-10-21: cover with tests + _evaluate_markers_srcs = [], auth_patterns = {}, download_only = False, enable_implicit_namespace_pkgs = False, environment = {}, envsubst = {}, + experimental_index_url = "", experimental_index_url = experimental_index_url, experimental_requirement_cycles = {}, experimental_target_platforms = [], @@ -92,10 +85,37 @@ def _parse( requirements_by_platform = {}, requirements_darwin = None, requirements_linux = None, + requirements_lock = None, requirements_windows = None, timeout = 42, whl_modifications = {}, - _evaluate_markers_srcs = [], + **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, **kwargs ) From 3d7c677dd557952f76885d4ee0c8645739180842 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 21 Oct 2024 08:54:50 +0900 Subject: [PATCH 37/46] fixup! finish cleaning up the args --- tests/pypi/extension/extension_tests.bzl | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index 41bce1e288..3afe366d39 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -72,7 +72,6 @@ def _parse( environment = {}, envsubst = {}, experimental_index_url = "", - experimental_index_url = experimental_index_url, experimental_requirement_cycles = {}, experimental_target_platforms = [], extra_pip_args = [], From dfb24bee2ea577cbf6e1ca02f28bd443e9a073f8 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 21 Oct 2024 08:58:40 +0900 Subject: [PATCH 38/46] cleanup --- tests/pypi/extension/extension_tests.bzl | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index 3afe366d39..1d3ec654ba 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -27,7 +27,7 @@ def _mock_mctx(*modules, environ = {}, read = None): name = "unittest", arch = "exotic", ), - read = read or {}.get, + read = read or (lambda _: ""), modules = [ struct( name = modules[0].name, @@ -122,14 +122,16 @@ 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", - )]), - read = { - "requirements.txt": "", - }.get, + _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", From dab3d0f475304d400ce76a439cf39d174358ae22 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 21 Oct 2024 09:25:37 +0900 Subject: [PATCH 39/46] test: finish the test with get_index_url --- examples/bzlmod/MODULE.bazel.lock | 4 +- python/private/pypi/extension.bzl | 43 ++++++++--- tests/pypi/extension/extension_tests.bzl | 93 +++++++++++++++++++++++- 3 files changed, 125 insertions(+), 15 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 9e535d2fcf..766fcecfb5 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": "/jEJJA6bGfPnkYV/Hsk9yzrlT5IoYb/mRVU1PfC0vco=", + "bzlTransitiveDigest": "Mp1vi8Gd2eRuXdo4mZ4VarbaFu/QhmLh0Ky8ZmSl0nY=", "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": "K0r9pw9npOvi7NrwlOISJ1GyVGq1KoDS6Rno07H336M=", + "bzlTransitiveDigest": "O+ZsLBk5EYUGsvT1R8tXlF4TP+J2cRPpS3FGu5DtTsc=", "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 393fbc88c7..eff8445303 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -62,7 +62,35 @@ def _whl_mods_impl(whl_mods_dict): whl_mods = whl_mods, ) -def _create_whl_repos(module_ctx, *, pip_attr, whl_map, whl_overrides, group_map, simpleapi_cache, exposed_packages, whl_libraries, available_interpreters): +def _create_whl_repos( + module_ctx, + *, + pip_attr, + whl_map, + whl_overrides, + group_map, + simpleapi_cache, + exposed_packages, + whl_libraries, + available_interpreters = INTERPRETER_LABELS, + simpleapi_download = simpleapi_download): + """create all of the whl repositories + + Args: + module_ctx: TODO + pip_attr: TODO + whl_map: TODO + whl_overrides: TODO + group_map: TODO + simpleapi_cache: TODO + exposed_packages: TODO + whl_libraries: TODO + 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. + """ logger = repo_utils.logger(module_ctx, "pypi:create_whl_repos") python_interpreter_target = pip_attr.python_interpreter_target is_hub_reproducible = True @@ -321,16 +349,13 @@ def _create_whl_repos(module_ctx, *, pip_attr, whl_map, whl_overrides, group_map return is_hub_reproducible -def parse_modules(module_ctx, _fail = fail, available_interpreters = INTERPRETER_LABELS): +def parse_modules(module_ctx, _fail = fail, **kwargs): """Implementation of parsing the tag classes for the extension and return a struct for registering repositories. Args: module_ctx: {type}`module_ctx` module context. _fail: {type}`function` the failure function, mainly for testing. - 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. + **kwargs: Extra arguments passed to the layers below. Returns: A struct with the following attributes: @@ -453,7 +478,7 @@ You cannot use both the additive_build_content and additive_build_content_file a whl_map = hub_whl_map, whl_overrides = whl_overrides, whl_libraries = whl_libraries, - available_interpreters = available_interpreters, + **kwargs ) is_reproducible = is_reproducible and is_hub_reproducible @@ -461,7 +486,7 @@ You cannot use both the additive_build_content and additive_build_content_file a whl_mods = whl_mods, hub_whl_map = hub_whl_map, hub_group_map = hub_group_map, - exposed_packages = exposed_packages, + exposed_packages = {k: sorted(v) for k, v in exposed_packages.items()}, whl_libraries = whl_libraries, is_reproducible = is_reproducible, ) @@ -550,7 +575,7 @@ def _pip_impl(module_ctx): key: json.encode(value) for key, value in whl_map.items() }, - packages = sorted(mods.exposed_packages.get(hub_name, {})), + packages = mods.exposed_packages.get(hub_name, []), groups = mods.hub_group_map.get(hub_name), ) diff --git a/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index 1d3ec654ba..4ffd950192 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -27,7 +27,7 @@ def _mock_mctx(*modules, environ = {}, read = None): name = "unittest", arch = "exotic", ), - read = read or (lambda _: ""), + read = read or (lambda _: "simple==0.0.1 --hash=sha256:deadbeef"), modules = [ struct( name = modules[0].name, @@ -75,18 +75,18 @@ def _parse( experimental_requirement_cycles = {}, experimental_target_platforms = [], extra_pip_args = [], - isolated = False, + isolated = True, netrc = None, pip_data_exclude = None, python_interpreter = None, python_interpreter_target = None, - quiet = False, + quiet = True, requirements_by_platform = {}, requirements_darwin = None, requirements_linux = None, requirements_lock = None, requirements_windows = None, - timeout = 42, + timeout = 600, whl_modifications = {}, **kwargs): return struct( @@ -115,6 +115,10 @@ def _parse( 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 ) @@ -147,6 +151,87 @@ def _test_simple(env): _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.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. From 8eded815cf7a353da5a09be005abcfaf7f9f1a4f Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 21 Oct 2024 09:30:01 +0900 Subject: [PATCH 40/46] revert an unnecessary change --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/repo_utils.bzl | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 766fcecfb5..b16c5d75d3 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": "Mp1vi8Gd2eRuXdo4mZ4VarbaFu/QhmLh0Ky8ZmSl0nY=", + "bzlTransitiveDigest": "sSGlDVmBjcQqQ/14xsS7XSyVJY+ZBi85kKLl4QyqIx8=", "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": "O+ZsLBk5EYUGsvT1R8tXlF4TP+J2cRPpS3FGu5DtTsc=", + "bzlTransitiveDigest": "Ll48v7uwagjBdcRjNb5xkQZkwXuniBQr6vS9JPt9pzg=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", diff --git a/python/private/repo_utils.bzl b/python/private/repo_utils.bzl index af1415475f..e0bf69acac 100644 --- a/python/private/repo_utils.bzl +++ b/python/private/repo_utils.bzl @@ -31,14 +31,13 @@ def _is_repo_debug_enabled(mrctx): """ return _getenv(mrctx, REPO_DEBUG_ENV_VAR) == "1" -def _logger(mrctx, name = None, fail = fail): +def _logger(mrctx, name = None): """Creates a logger instance for printing messages. Args: 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. - fail: the function to use for failure call printing. Returns: A struct with attributes logging: trace, debug, info, warn, fail. @@ -84,7 +83,6 @@ def _logger(mrctx, name = None, fail = fail): 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), - child = lambda suffix: _logger(mrctx, "{}.{}".format(name, suffix)), ) def _execute_internal( From ae9d12008b504d5c67bdf5e9e8cab926513677c6 Mon Sep 17 00:00:00 2001 From: aignas <240938+aignas@users.noreply.github.com> Date: Mon, 21 Oct 2024 11:54:44 +0900 Subject: [PATCH 41/46] comment: use env.expect.that_struct --- tests/pypi/extension/extension_tests.bzl | 13 ++- .../pypi/extension/parse_modules_subject.bzl | 107 ------------------ 2 files changed, 10 insertions(+), 110 deletions(-) delete mode 100644 tests/pypi/extension/parse_modules_subject.bzl diff --git a/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index 4ffd950192..7a680a52e5 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -15,8 +15,8 @@ "" 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(":parse_modules_subject.bzl", "parse_modules_subject") _tests = [] @@ -56,9 +56,16 @@ def _mod(*, name, parse = [], override = [], whl_mods = [], is_root = True): ) def _parse_modules(env, **kwargs): - return parse_modules_subject( + return env.expect.that_struct( parse_modules(**kwargs), - meta = env.expect.meta, + 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( diff --git a/tests/pypi/extension/parse_modules_subject.bzl b/tests/pypi/extension/parse_modules_subject.bzl deleted file mode 100644 index 5ca5131e5e..0000000000 --- a/tests/pypi/extension/parse_modules_subject.bzl +++ /dev/null @@ -1,107 +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. - -"" - -load("@rules_testing//lib:truth.bzl", "subjects") - -def parse_modules_subject(info, *, meta): - """Creates a new `parse_modules_subject` for the parse_modules result instance. - - Method: parse_modules_subject.new - - Args: - info: The parse_modules result object - meta: ExpectMeta object. - - Returns: - A `parse_modules_subject` struct - """ - - # buildifier: disable=uninitialized - public = struct( - # go/keep-sorted start - is_reproducible = lambda *a, **k: _subject_is_reproducible(self, *a, **k), - exposed_packages = lambda *a, **k: _subject_exposed_packages(self, *a, **k), - hub_group_map = lambda *a, **k: _subject_hub_group_map(self, *a, **k), - hub_whl_map = lambda *a, **k: _subject_hub_whl_map(self, *a, **k), - whl_libraries = lambda *a, **k: _subject_whl_libraries(self, *a, **k), - whl_mods = lambda *a, **k: _subject_whl_mods(self, *a, **k), - # go/keep-sorted end - ) - self = struct( - actual = info, - meta = meta, - ) - return public - -def _subject_is_reproducible(self): - """Returns a `BoolSubject` for the `is_reproducible` attribute. - - Method: parse_modules_subject.direct_pyc_files - """ - return subjects.bool( - self.actual.is_reproducible, - meta = self.meta.derive("is_reproducible()"), - ) - -def _subject_exposed_packages(self): - """Returns a `BoolSubject` for the `exposed_packages` attribute. - - Method: parse_modules_subject.direct_pyc_files - """ - return subjects.dict( - self.actual.exposed_packages, - meta = self.meta.derive("exposed_packages()"), - ) - -def _subject_hub_group_map(self): - """Returns a `BoolSubject` for the `hub_group_map` attribute. - - Method: parse_modules_subject.direct_pyc_files - """ - return subjects.dict( - self.actual.hub_group_map, - meta = self.meta.derive("hub_group_map()"), - ) - -def _subject_hub_whl_map(self): - """Returns a `BoolSubject` for the `hub_whl_map` attribute. - - Method: parse_modules_subject.direct_pyc_files - """ - return subjects.dict( - self.actual.hub_whl_map, - meta = self.meta.derive("hub_whl_map()"), - ) - -def _subject_whl_libraries(self): - """Returns a `BoolSubject` for the `whl_libraries` attribute. - - Method: parse_modules_subject.direct_pyc_files - """ - return subjects.dict( - self.actual.whl_libraries, - meta = self.meta.derive("whl_libraries()"), - ) - -def _subject_whl_mods(self): - """Returns a `BoolSubject` for the `whl_mods` attribute. - - Method: parse_modules_subject.direct_pyc_files - """ - return subjects.dict( - self.actual.whl_mods, - meta = self.meta.derive("whl_mods()"), - ) From 89f5534205cfdb928988847b0a4ad98d8e56d807 Mon Sep 17 00:00:00 2001 From: aignas <240938+aignas@users.noreply.github.com> Date: Mon, 21 Oct 2024 11:59:17 +0900 Subject: [PATCH 42/46] comment: add docstring --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 17 +++++++++-------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index b16c5d75d3..f477bb01e6 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": "sSGlDVmBjcQqQ/14xsS7XSyVJY+ZBi85kKLl4QyqIx8=", + "bzlTransitiveDigest": "hIrm0CZxBUB1huC0xCbZPLlx8NoagZw48n6CTVJ/N5k=", "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": "Ll48v7uwagjBdcRjNb5xkQZkwXuniBQr6vS9JPt9pzg=", + "bzlTransitiveDigest": "H4o7JtbrzuH5TlKJvWW8yFr+FKY4z/6xkY2n0K6dxXk=", "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 eff8445303..396b48fa3d 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -77,14 +77,15 @@ def _create_whl_repos( """create all of the whl repositories Args: - module_ctx: TODO - pip_attr: TODO - whl_map: TODO - whl_overrides: TODO - group_map: TODO - simpleapi_cache: TODO - exposed_packages: TODO - whl_libraries: TODO + 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`. + whl_map: {type}`dict` - one of the outputs of the function. + group_map: {type}`dict` - one of the outputs of the function. + exposed_packages: {type}`dict[str, list]` - one of the outputs of the function. + whl_libraries: {type}`dict` - one of the outputs of the function. 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. From e878dd751abb955f0afe3f5b50f5058f2a0d42aa Mon Sep 17 00:00:00 2001 From: aignas <240938+aignas@users.noreply.github.com> Date: Mon, 21 Oct 2024 12:28:21 +0900 Subject: [PATCH 43/46] improve: remove all side effects from _create_whl_repos and sort output --- examples/bzlmod/MODULE.bazel.lock | 144 +++++++++++------------ python/private/pypi/extension.bzl | 93 +++++++++------ tests/pypi/extension/extension_tests.bzl | 6 +- 3 files changed, 134 insertions(+), 109 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index f477bb01e6..0a205c7bfe 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": "hIrm0CZxBUB1huC0xCbZPLlx8NoagZw48n6CTVJ/N5k=", + "bzlTransitiveDigest": "I1WKtVPDiCWPjC/LhghEayJjfZ87aIi7ZgXEjzJcwhA=", "usagesDigest": "MChlcSw99EuW3K7OOoMcXQIdcJnEh6YmfyjJm+9mxIg=", "recordedFileInputs": { "@@other_module~//requirements_lock_3_11.txt": "a7d0061366569043d5efcf80e34a32c732679367cb3c831c4cdc606adc36d314", @@ -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,10 +4479,10 @@ "groups": { "sphinx": [ "sphinx", - "sphinxcontrib-qthelp", - "sphinxcontrib-htmlhelp", - "sphinxcontrib-devhelp", "sphinxcontrib-applehelp", + "sphinxcontrib-devhelp", + "sphinxcontrib-htmlhelp", + "sphinxcontrib-qthelp", "sphinxcontrib-serializinghtml" ] } @@ -6299,7 +6299,7 @@ }, "@@rules_python~//python/private/pypi:pip.bzl%pip_internal": { "general": { - "bzlTransitiveDigest": "H4o7JtbrzuH5TlKJvWW8yFr+FKY4z/6xkY2n0K6dxXk=", + "bzlTransitiveDigest": "Tu1IUy/kTGd2ywugxAj1bJL8lA3FKCxRYL2T/oJ76+A=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", @@ -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", diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 396b48fa3d..c4b00b6373 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -66,12 +66,8 @@ def _create_whl_repos( module_ctx, *, pip_attr, - whl_map, whl_overrides, - group_map, simpleapi_cache, - exposed_packages, - whl_libraries, available_interpreters = INTERPRETER_LABELS, simpleapi_download = simpleapi_download): """create all of the whl repositories @@ -82,19 +78,33 @@ 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`. - whl_map: {type}`dict` - one of the outputs of the function. - group_map: {type}`dict` - one of the outputs of the function. - exposed_packages: {type}`dict[str, list]` - one of the outputs of the function. - whl_libraries: {type}`dict` - one of the outputs of the function. 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. @@ -123,9 +133,6 @@ def _create_whl_repos( ) 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(): @@ -142,12 +149,6 @@ def _create_whl_repos( 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 = {} @@ -271,7 +272,7 @@ def _create_whl_repos( 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 @@ -304,7 +305,7 @@ def _create_whl_repos( 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, @@ -315,7 +316,7 @@ def _create_whl_repos( if found_something: if is_exposed: - exposed_packages.setdefault(hub_name, {})[whl_name] = None + exposed_packages[whl_name] = None continue requirement = select_requirement( @@ -341,14 +342,19 @@ def _create_whl_repos( # 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[hub_name].setdefault(whl_name, []).append( + whl_map.setdefault(whl_name, []).append( whl_alias( repo = repo_name, version = major_minor, ), ) - return is_hub_reproducible + return struct( + is_reproducible = is_reproducible, + whl_map = whl_map, + exposed_packages = exposed_packages, + whl_libraries = whl_libraries, + ) def parse_modules(module_ctx, _fail = fail, **kwargs): """Implementation of parsing the tag classes for the extension and return a struct for registering repositories. @@ -470,25 +476,44 @@ You cannot use both the additive_build_content and additive_build_content_file a else: pip_hub_map[pip_attr.hub_name].python_versions.append(pip_attr.python_version) - is_hub_reproducible = _create_whl_repos( + out = _create_whl_repos( module_ctx, - exposed_packages = exposed_packages, - group_map = hub_group_map, pip_attr = pip_attr, simpleapi_cache = simpleapi_cache, - whl_map = hub_whl_map, whl_overrides = whl_overrides, - whl_libraries = whl_libraries, **kwargs ) - is_reproducible = is_reproducible and is_hub_reproducible + for key, settings in out.whl_map.items(): + hub_whl_map.setdefault(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( - whl_mods = whl_mods, - hub_whl_map = hub_whl_map, - hub_group_map = hub_group_map, - exposed_packages = {k: sorted(v) for k, v in exposed_packages.items()}, - whl_libraries = whl_libraries, + # 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, ) diff --git a/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index 7a680a52e5..3d79e10d73 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -150,8 +150,8 @@ def _test_simple(env): ) pypi.is_reproducible().equals(True) - pypi.exposed_packages().contains_exactly({}) - pypi.hub_group_map().contains_exactly({}) + 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({}) @@ -202,7 +202,7 @@ def _test_simple_get_index(env): pypi.is_reproducible().equals(False) pypi.exposed_packages().contains_exactly({"pypi": ["simple"]}) - pypi.hub_group_map().contains_exactly({}) + pypi.hub_group_map().contains_exactly({"pypi": {}}) pypi.hub_whl_map().contains_exactly({"pypi": { "simple": [ struct( From 31355cdbaf29f29d155febe20016883c6bc0b803 Mon Sep 17 00:00:00 2001 From: aignas <240938+aignas@users.noreply.github.com> Date: Mon, 21 Oct 2024 13:20:09 +0900 Subject: [PATCH 44/46] chore: pre-commit --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 0a205c7bfe..7275684223 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": "I1WKtVPDiCWPjC/LhghEayJjfZ87aIi7ZgXEjzJcwhA=", + "bzlTransitiveDigest": "X5HS8UvpRz/QICCP36KGsDFpojYmt52A4SDWjn0G5Bs=", "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": "Tu1IUy/kTGd2ywugxAj1bJL8lA3FKCxRYL2T/oJ76+A=", + "bzlTransitiveDigest": "IqN3cngG0LRSQ6iimhOXF1S9QvKHGmcdYMOubmZZnX8=", "usagesDigest": "Y8ihY+R57BAFhalrVLVdJFrpwlbsiKz9JPJ99ljF7HA=", "recordedFileInputs": { "@@rules_python~//tools/publish/requirements.txt": "031e35d03dde03ae6305fe4b3d1f58ad7bdad857379752deede0f93649991b8a", From da32a64ba9fad10012672de48c34b25d561195c8 Mon Sep 17 00:00:00 2001 From: aignas <240938+aignas@users.noreply.github.com> Date: Mon, 21 Oct 2024 13:26:25 +0900 Subject: [PATCH 45/46] test fixup --- tests/pypi/extension/extension_tests.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index 3d79e10d73..64b3239f43 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -152,7 +152,7 @@ def _test_simple(env): 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.hub_whl_map().contains_exactly({}) pypi.whl_libraries().contains_exactly({}) pypi.whl_mods().contains_exactly({}) From 45fb65de607318118831b23d66cb1c67f78f8009 Mon Sep 17 00:00:00 2001 From: aignas <240938+aignas@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:13:29 +0900 Subject: [PATCH 46/46] fixup --- examples/bzlmod/MODULE.bazel.lock | 4 ++-- python/private/pypi/extension.bzl | 3 ++- tests/pypi/extension/extension_tests.bzl | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/examples/bzlmod/MODULE.bazel.lock b/examples/bzlmod/MODULE.bazel.lock index 7275684223..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": "X5HS8UvpRz/QICCP36KGsDFpojYmt52A4SDWjn0G5Bs=", + "bzlTransitiveDigest": "KZzbwT5y7SPbM+MgbQWr309EUGjGXvXvQ4/FMn+fEGE=", "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": "IqN3cngG0LRSQ6iimhOXF1S9QvKHGmcdYMOubmZZnX8=", + "bzlTransitiveDigest": "mzsyVW4M380vwEPTn/pDXFMh5gtTHsv0sbqZCE7a1SY=", "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 559d5ac772..dc02392d50 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -483,8 +483,9 @@ You cannot use both the additive_build_content and additive_build_content_file a whl_overrides = whl_overrides, **kwargs ) + hub_whl_map.setdefault(hub_name, {}) for key, settings in out.whl_map.items(): - hub_whl_map.setdefault(hub_name, {}).setdefault(key, []).extend(settings) + 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 diff --git a/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index 64b3239f43..3d79e10d73 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -152,7 +152,7 @@ def _test_simple(env): 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.hub_whl_map().contains_exactly({"pypi": {}}) pypi.whl_libraries().contains_exactly({}) pypi.whl_mods().contains_exactly({})