From 289d87db6d5be75f69d89efa06f1c826ae3b5422 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Sun, 18 May 2025 23:57:34 +0900 Subject: [PATCH 01/16] start prototyping how the platforms could be passed --- MODULE.bazel | 57 ++++++++++++- python/private/pypi/evaluate_markers.bzl | 16 ++-- python/private/pypi/extension.bzl | 104 +++++++++++++++++++++++ 3 files changed, 168 insertions(+), 9 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index d0f7cc4afa..457fb9e4b4 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -56,10 +56,63 @@ use_repo( # This call registers the Python toolchains. register_toolchains("@pythons_hub//:all") +# Let's define default platforms for our users first +pip = use_extension("//python/extensions:pip.bzl", "pip") + +_DEFAULT_LINUX_PLATFORM_VERSION = "0" + +_DEFAULT_OSX_PLATFORM_VERSION = "14.0" + +_DEFAULT_WINDOWS_PLATFORM_VERSION = "0" + +pip.default( + arch_name = "x86_64", + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + env_platform_version = _DEFAULT_LINUX_PLATFORM_VERSION, + os_name = "linux", + platform = "linux_x86_64", +) +pip.default( + arch_name = "x86_64", + constraint_values = [ + "@platforms//os:osx", + "@platforms//cpu:x86_64", + ], + # We choose the oldest non-EOL version at the time when we release `rules_python`. + # See https://endoflife.date/macos + env_platform_version = _DEFAULT_OSX_PLATFORM_VERSION, + os_name = "osx", + platform = "osx_x86_64", +) +pip.default( + arch_name = "aarch64", + constraint_values = [ + "@platforms//os:osx", + "@platforms//cpu:aarch64", + ], + # We choose the oldest non-EOL version at the time when we release `rules_python`. + # See https://endoflife.date/macos + env_platform_version = _DEFAULT_OSX_PLATFORM_VERSION, + os_name = "osx", + platform = "osx_aarch64", +) +pip.default( + arch_name = "x86_64", + constraint_values = [ + "@platforms//os:windows", + "@platforms//cpu:x86_64", + ], + env_platform_version = _DEFAULT_WINDOWS_PLATFORM_VERSION, + os_name = "windows", + platform = "windows_x86_64", +) + ##################### -# Install twine for our own runfiles wheel publishing and allow bzlmod users to use it. +# Then install twine for our own runfiles wheel publishing and allow bzlmod users to use it. -pip = use_extension("//python/extensions:pip.bzl", "pip") pip.parse( # NOTE @aignas 2024-10-26: We have an integration test that depends on us # being able to build sdists for this hub, so explicitly set this to False. diff --git a/python/private/pypi/evaluate_markers.bzl b/python/private/pypi/evaluate_markers.bzl index 191933596e..060521a6c4 100644 --- a/python/private/pypi/evaluate_markers.bzl +++ b/python/private/pypi/evaluate_markers.bzl @@ -15,9 +15,7 @@ """A simple function that evaluates markers using a python interpreter.""" load(":deps.bzl", "record_files") -load(":pep508_env.bzl", "env") load(":pep508_evaluate.bzl", "evaluate") -load(":pep508_platform.bzl", "platform_from_str") load(":pep508_requirement.bzl", "requirement") load(":pypi_repo_utils.bzl", "pypi_repo_utils") @@ -30,21 +28,25 @@ SRCS = [ Label("//python/private/pypi/whl_installer:platform.py"), ] -def evaluate_markers(requirements, python_version = None): +def evaluate_markers(requirements, platforms = platforms): """Return the list of supported platforms per requirements line. Args: requirements: {type}`dict[str, list[str]]` of the requirement file lines to evaluate. - python_version: {type}`str | None` the version that can be used when evaluating the markers. + platforms: {type}`dict[str | struct]` TODO Returns: dict of string lists with target platforms """ ret = {} - for req_string, platforms in requirements.items(): + for req_string, platform_strings in requirements.items(): req = requirement(req_string) - for platform in platforms: - if evaluate(req.marker, env = env(platform_from_str(platform, python_version))): + for platform_str in platform_strings: + platform = platforms.get(platform_str) + if not platform: + fail("Please define platform: TODO") + + if evaluate(req.marker, env = platform.env): ret.setdefault(req_string, []).append(platform) return ret diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 3896f2940a..67daeb301e 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -70,6 +70,7 @@ def _create_whl_repos( *, pip_attr, whl_overrides, + config, available_interpreters = INTERPRETER_LABELS, minor_mapping = MINOR_MAPPING, evaluate_markers = evaluate_markers_py, @@ -81,6 +82,7 @@ def _create_whl_repos( 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. + config: TODO. get_index_urls: A function used to get the index URLs available_interpreters: {type}`dict[str, Label]` The dictionary of available interpreters that have been registered using the `python` bzlmod extension. @@ -104,6 +106,7 @@ def _create_whl_repos( """ logger = repo_utils.logger(module_ctx, "pypi:create_whl_repos") python_interpreter_target = pip_attr.python_interpreter_target + platforms = config["platforms"] # containers to aggregate outputs from this function whl_map = {} @@ -199,6 +202,7 @@ def _create_whl_repos( srcs = pip_attr._evaluate_markers_srcs, logger = logger, ), + platforms = platforms, logger = logger, ) @@ -364,6 +368,34 @@ def _whl_repos(*, requirement, whl_library_args, download_only, netrc, auth_patt return ret +def _configure(config, *, platform, constraint_values, target_settings, override = False, **values): + """Set the value in the config if the value is provided""" + for key, value in values.items(): + if not value: + continue + + if not override and config.get(key): + continue + + config[key] = value + + config.setdefault("platforms", {}) + if not platform: + if constraint_values or target_settings: + fail("`platform` name must be specified when specifying `constraint_values`, `target_settings` or `urls`") + elif constraint_values or target_settings: + if not override and config.get("platforms", {}).get(platform): + return + + config["platforms"][platform] = struct( + name = platform.replace("-", "_").lower(), + constraint_values = constraint_values, + target_settings = target_settings, + env = struct(), # ... + ) + else: + config["platforms"].pop(platform) + def parse_modules( module_ctx, _fail = fail, @@ -380,6 +412,32 @@ def parse_modules( Returns: A struct with the following attributes: """ + defaults = { + "platforms": {}, + } + for mod in module_ctx.modules: + if not (mod.is_root or mod.name == "rules_python"): + continue + + for tag in mod.tags.default: + _configure( + # TODO @aignas 2025-05-18: actually use all of this stuff + defaults, + arch_name = tag.arch_name, + constraint_values = tag.constraint_values, + env_implementation_name = tag.env_implementation_name, + env_os_name = tag.env_os_name, + env_platform_machine = tag.env_platform_machine, + env_platform_release = tag.env_platform_release, + env_platform_system = tag.env_platform_system, + env_platform_version = tag.env_platform_version, + env_sys_platform = tag.env_sys_platform, + os_name = tag.os_name, + platform = tag.platform, + target_settings = tag.target_settings, + override = mod.is_root, + ) + whl_mods = {} for mod in module_ctx.modules: for whl_mod in mod.tags.whl_mods: @@ -526,6 +584,7 @@ You cannot use both the additive_build_content and additive_build_content_file a pip_attr = pip_attr, get_index_urls = get_index_urls, whl_overrides = whl_overrides, + config = defaults, **kwargs ) hub_whl_map.setdefault(hub_name, {}) @@ -680,6 +739,35 @@ def _pip_impl(module_ctx): else: return None +_default_attrs = { + "arch_name": attr.string(), + "constraint_values": attr.label_list(), + # The values for PEP508 env marker evaluation during the lock file parsing + "env_implementation_name": attr.string(), + "env_os_name": attr.string(doc = "default will be inferred from {obj}`os_name`"), + "env_platform_machine": attr.string(doc = "default will be inferred from {obj}`arch_name`"), + "env_platform_release": attr.string(), + "env_platform_system": attr.string(doc = "default will be inferred from {obj}`os_name`"), + "env_platform_version": attr.string(), + "env_sys_platform": attr.string(), + "extra_index_urls": attr.string_list(), + "index_url": attr.string(), + "os_name": attr.string(), + "platform": attr.string(), + "target_settings": attr.label_list( + doc = """\ +A list of config_settings that must be satisfied by the target configuration in order for this +platform to be matched during analysis phase. +""", + ), +} + +_configure_attrs = _default_attrs | { + "hub_name": attr.string(), + "python_version": attr.string(), + "requirements_txt": attr.label(), +} + def _pip_parse_ext_attrs(**kwargs): """Get the attributes for the pip extension. @@ -936,6 +1024,22 @@ the BUILD files for wheels. """, implementation = _pip_impl, tag_classes = { + "configure": tag_class( + attrs = _configure_attrs, + doc = """\ +This tag class allows for more customization of how the configuration for the hub repositories is built. + +This is still experimental and may be changed or removed without any notice. +""", + ), + "default": tag_class( + attrs = _default_attrs, + doc = """\ +This tag class allows for more customization of how the configuration for the hub repositories is built. + +This is still experimental and may be changed or removed without any notice. +""", + ), "override": _override_tag, "parse": tag_class( attrs = _pip_parse_ext_attrs(), From e8caa52cc7878bd3e754c2345ef959d6c17d112e Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 19 May 2025 18:25:59 +0900 Subject: [PATCH 02/16] parse the target platforms and filter the requirements down --- python/private/pypi/evaluate_markers.bzl | 4 +- python/private/pypi/extension.bzl | 90 +++++++++++++++++------- 2 files changed, 67 insertions(+), 27 deletions(-) diff --git a/python/private/pypi/evaluate_markers.bzl b/python/private/pypi/evaluate_markers.bzl index 060521a6c4..b4b271debb 100644 --- a/python/private/pypi/evaluate_markers.bzl +++ b/python/private/pypi/evaluate_markers.bzl @@ -28,7 +28,7 @@ SRCS = [ Label("//python/private/pypi/whl_installer:platform.py"), ] -def evaluate_markers(requirements, platforms = platforms): +def evaluate_markers(*, requirements, platforms): """Return the list of supported platforms per requirements line. Args: @@ -44,7 +44,7 @@ def evaluate_markers(requirements, platforms = platforms): for platform_str in platform_strings: platform = platforms.get(platform_str) if not platform: - fail("Please define platform: TODO") + fail("Please define platform: '{}'".format(platform_str)) if evaluate(req.marker, env = platform.env): ret.setdefault(req_string, []).append(platform) diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 67daeb301e..77927d6ecc 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -25,10 +25,11 @@ load("//python/private:repo_utils.bzl", "repo_utils") load("//python/private:version.bzl", "version") load("//python/private:version_label.bzl", "version_label") load(":attrs.bzl", "use_isolated") -load(":evaluate_markers.bzl", "evaluate_markers_py", EVALUATE_MARKERS_SRCS = "SRCS") +load(":evaluate_markers.bzl", "evaluate_markers_py", EVALUATE_MARKERS_SRCS = "SRCS", evaluate_markers_star = "evaluate_markers") load(":hub_repository.bzl", "hub_repository", "whl_config_settings_to_json") load(":parse_requirements.bzl", "parse_requirements") load(":parse_whl_name.bzl", "parse_whl_name") +load(":pep508_env.bzl", "env") load(":pip_repository_attrs.bzl", "ATTRS") load(":requirements_files_by_platform.bzl", "requirements_files_by_platform") load(":simpleapi_download.bzl", "simpleapi_download") @@ -65,6 +66,19 @@ def _whl_mods_impl(whl_mods_dict): whl_mods = whl_mods, ) +def _platforms(*, python_version, minor_mapping, config): + platforms = {} + python_version = full_version( + version = python_version, + minor_mapping = minor_mapping, + ) + abi = "cp3{}".format(python_version[2:]) + + for platform, values in config["platforms"].items(): + key = "{}_{}".format(abi, platform) + platforms[key] = env(key) | values.env + return platforms + def _create_whl_repos( module_ctx, *, @@ -73,7 +87,7 @@ def _create_whl_repos( config, available_interpreters = INTERPRETER_LABELS, minor_mapping = MINOR_MAPPING, - evaluate_markers = evaluate_markers_py, + evaluate_markers = None, get_index_urls = None, enable_pipstar = False): """create all of the whl repositories @@ -106,7 +120,11 @@ def _create_whl_repos( """ logger = repo_utils.logger(module_ctx, "pypi:create_whl_repos") python_interpreter_target = pip_attr.python_interpreter_target - platforms = config["platforms"] + platforms = _platforms( + python_version = pip_attr.python_version, + minor_mapping = minor_mapping, + config = config, + ) # containers to aggregate outputs from this function whl_map = {} @@ -163,23 +181,14 @@ def _create_whl_repos( whl_group_mapping = {} requirement_cycles = {} - 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 = full_version( - version = pip_attr.python_version, - minor_mapping = minor_mapping, - ), - logger = logger, - ), - extra_pip_args = pip_attr.extra_pip_args, - get_index_urls = get_index_urls, + if evaluate_markers: + pass + elif enable_pipstar: + evaluate_markers = lambda _, requirements: evaluate_markers_star( + requirements = requirements, + platforms = platforms, + ) + else: # 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 @@ -194,15 +203,39 @@ def _create_whl_repos( # 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( + evaluate_markers = lambda module_ctx, requirements: evaluate_markers_py( module_ctx, requirements = requirements, python_interpreter = pip_attr.python_interpreter, python_interpreter_target = python_interpreter_target, srcs = pip_attr._evaluate_markers_srcs, logger = logger, - ), - platforms = platforms, + ) + + requirements_by_platform = parse_requirements( + module_ctx, + requirements_by_platform = { + # TODO @aignas 2025-05-19: we probably want to pass the `platforms` to + # `requirements_files_by_platform so that we can customize what exactly we can/want do. + k: v + for k, v in 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 = full_version( + version = pip_attr.python_version, + minor_mapping = minor_mapping, + ), + logger = logger, + ).items() + if k in platforms + }, + extra_pip_args = pip_attr.extra_pip_args, + get_index_urls = get_index_urls, + evaluate_markers = evaluate_markers, logger = logger, ) @@ -368,7 +401,7 @@ def _whl_repos(*, requirement, whl_library_args, download_only, netrc, auth_patt return ret -def _configure(config, *, platform, constraint_values, target_settings, override = False, **values): +def _configure(config, *, platform, constraint_values, target_settings, os_name, arch_name, override = False, **values): """Set the value in the config if the value is provided""" for key, value in values.items(): if not value: @@ -391,7 +424,13 @@ def _configure(config, *, platform, constraint_values, target_settings, override name = platform.replace("-", "_").lower(), constraint_values = constraint_values, target_settings = target_settings, - env = struct(), # ... + os_name = os_name, + arch_name = arch_name, + env = { + k[4:]: v + for k, v in values.items() + if k.startswith("env_") and v + }, ) else: config["platforms"].pop(platform) @@ -760,6 +799,7 @@ A list of config_settings that must be satisfied by the target configuration in platform to be matched during analysis phase. """, ), + "whls_limit": attr.int(default = -1), } _configure_attrs = _default_attrs | { From 2cfdd2bbdfea99a7a9929ddd5d60d58440693691 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 19 May 2025 21:29:47 +0900 Subject: [PATCH 03/16] better filtering --- python/private/pypi/extension.bzl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 77927d6ecc..beb1afbe35 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -217,8 +217,8 @@ def _create_whl_repos( requirements_by_platform = { # TODO @aignas 2025-05-19: we probably want to pass the `platforms` to # `requirements_files_by_platform so that we can customize what exactly we can/want do. - k: v - for k, v in requirements_files_by_platform( + req_file: req_platforms + for req_file, req_platforms in requirements_files_by_platform( requirements_by_platform = pip_attr.requirements_by_platform, requirements_linux = pip_attr.requirements_linux, requirements_lock = pip_attr.requirements_lock, @@ -231,7 +231,7 @@ def _create_whl_repos( ), logger = logger, ).items() - if k in platforms + if [None for v in req_platforms if v in platforms] }, extra_pip_args = pip_attr.extra_pip_args, get_index_urls = get_index_urls, From 0c58ad84169b18ae90703d1c08b9c0edf2121686 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 19 May 2025 21:49:50 +0900 Subject: [PATCH 04/16] pass platforms to requirments_by_platform --- python/private/pypi/extension.bzl | 33 +++++++++++++------------------ 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index beb1afbe35..7436180295 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -214,25 +214,20 @@ def _create_whl_repos( requirements_by_platform = parse_requirements( module_ctx, - requirements_by_platform = { - # TODO @aignas 2025-05-19: we probably want to pass the `platforms` to - # `requirements_files_by_platform so that we can customize what exactly we can/want do. - req_file: req_platforms - for req_file, req_platforms in 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 = full_version( - version = pip_attr.python_version, - minor_mapping = minor_mapping, - ), - logger = logger, - ).items() - if [None for v in req_platforms if v in platforms] - }, + 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 = full_version( + version = pip_attr.python_version, + minor_mapping = minor_mapping, + ), + platforms = platforms, + logger = logger, + ), extra_pip_args = pip_attr.extra_pip_args, get_index_urls = get_index_urls, evaluate_markers = evaluate_markers, From 7ac9a478cc25b4dbeba9aed6a01779a485eca81e Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 19 May 2025 21:50:06 +0900 Subject: [PATCH 05/16] refactor: rename arg from platforms to platforms_from_args to avoid clash --- python/private/pypi/requirements_files_by_platform.bzl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/private/pypi/requirements_files_by_platform.bzl b/python/private/pypi/requirements_files_by_platform.bzl index 9165c05bed..8a15a31a47 100644 --- a/python/private/pypi/requirements_files_by_platform.bzl +++ b/python/private/pypi/requirements_files_by_platform.bzl @@ -144,11 +144,11 @@ def requirements_files_by_platform( ) return None - platforms = _platforms_from_args(extra_pip_args) + platforms_from_args = _platforms_from_args(extra_pip_args) if logger: - logger.debug(lambda: "Platforms from pip args: {}".format(platforms)) + logger.debug(lambda: "Platforms from pip args: {}".format(platforms_from_args)) - if platforms: + if platforms_from_args: lock_files = [ f for f in [ @@ -168,7 +168,7 @@ def requirements_files_by_platform( return None files_by_platform = [ - (lock_files[0], platforms), + (lock_files[0], platforms_from_args), ] if logger: logger.debug(lambda: "Files by platform with the platform set in the args: {}".format(files_by_platform)) From 85fda055dff5f68f0c44fab4676b643a52c6384a Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 19 May 2025 21:53:20 +0900 Subject: [PATCH 06/16] declare the function inline --- .../pypi/requirements_files_by_platform.bzl | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/python/private/pypi/requirements_files_by_platform.bzl b/python/private/pypi/requirements_files_by_platform.bzl index 8a15a31a47..6815ceb10f 100644 --- a/python/private/pypi/requirements_files_by_platform.bzl +++ b/python/private/pypi/requirements_files_by_platform.bzl @@ -29,7 +29,7 @@ DEFAULT_PLATFORMS = [ "windows_x86_64", ] -def _default_platforms(*, filter): +def _default_platforms_from(*, filter, choose_from): if not filter: fail("Must specific a filter string, got: {}".format(filter)) @@ -48,11 +48,11 @@ def _default_platforms(*, filter): fail("The filter can only contain '*' at the end of it") if not prefix: - return DEFAULT_PLATFORMS + return choose_from - return [p for p in DEFAULT_PLATFORMS if p.startswith(prefix)] + return [p for p in choose_from if p.startswith(prefix)] else: - return [p for p in DEFAULT_PLATFORMS if filter in p] + return [p for p in choose_from if filter in p] def _platforms_from_args(extra_pip_args): platform_values = [] @@ -144,6 +144,11 @@ def requirements_files_by_platform( ) return None + _default_platforms = lambda f: _default_platforms_from( + filter = f, + choose_from = DEFAULT_PLATFORMS, + ) + platforms_from_args = _platforms_from_args(extra_pip_args) if logger: logger.debug(lambda: "Platforms from pip args: {}".format(platforms_from_args)) @@ -177,7 +182,7 @@ def requirements_files_by_platform( file: [ platform for filter_or_platform in specifier.split(",") - for platform in (_default_platforms(filter = filter_or_platform) if filter_or_platform.endswith("*") else [filter_or_platform]) + for platform in (_default_platforms(filter_or_platform) if filter_or_platform.endswith("*") else [filter_or_platform]) ] for file, specifier in requirements_by_platform.items() }.items() @@ -188,9 +193,9 @@ def requirements_files_by_platform( for f in [ # If the users need a greater span of the platforms, they should consider # using the 'requirements_by_platform' attribute. - (requirements_linux, _default_platforms(filter = "linux_*")), - (requirements_osx, _default_platforms(filter = "osx_*")), - (requirements_windows, _default_platforms(filter = "windows_*")), + (requirements_linux, _default_platforms("linux_*")), + (requirements_osx, _default_platforms("osx_*")), + (requirements_windows, _default_platforms("windows_*")), (requirements_lock, None), ]: if f[0]: From 1d5bb990113a35aa4d4c67d8e97f21254939a612 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 19 May 2025 21:57:50 +0900 Subject: [PATCH 07/16] allow limiting platforms in the call --- .../pypi/requirements_files_by_platform.bzl | 15 ++++++++----- .../requirements_files_by_platform_tests.bzl | 22 +++++++++++++++++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/python/private/pypi/requirements_files_by_platform.bzl b/python/private/pypi/requirements_files_by_platform.bzl index 6815ceb10f..0b57a275c2 100644 --- a/python/private/pypi/requirements_files_by_platform.bzl +++ b/python/private/pypi/requirements_files_by_platform.bzl @@ -29,7 +29,7 @@ DEFAULT_PLATFORMS = [ "windows_x86_64", ] -def _default_platforms_from(*, filter, choose_from): +def _default_platforms_from(*, filter, python_version, choose_from): if not filter: fail("Must specific a filter string, got: {}".format(filter)) @@ -48,11 +48,11 @@ def _default_platforms_from(*, filter, choose_from): fail("The filter can only contain '*' at the end of it") if not prefix: - return choose_from + return [_platform(p, python_version) for p in choose_from] - return [p for p in choose_from if p.startswith(prefix)] + return [_platform(p, python_version) for p in choose_from if p.startswith(prefix)] else: - return [p for p in choose_from if filter in p] + return [_platform(p, python_version) for p in choose_from if filter in p] def _platforms_from_args(extra_pip_args): platform_values = [] @@ -107,6 +107,7 @@ def requirements_files_by_platform( requirements_windows = None, extra_pip_args = None, python_version = None, + platforms = [], logger = None, fail_fn = fail): """Resolve the requirement files by target platform. @@ -123,6 +124,7 @@ def requirements_files_by_platform( be joined with args fined in files. python_version: str or None. This is needed when the get_index_urls is specified. It should be of the form "3.x.x", + platforms: {type}`list[str]` the list of default platforms to choose from. logger: repo_utils.logger or None, a simple struct to log diagnostic messages. fail_fn (Callable[[str], None]): A failure function used in testing failure cases. @@ -146,7 +148,8 @@ def requirements_files_by_platform( _default_platforms = lambda f: _default_platforms_from( filter = f, - choose_from = DEFAULT_PLATFORMS, + python_version = python_version, + choose_from = platforms or DEFAULT_PLATFORMS, ) platforms_from_args = _platforms_from_args(extra_pip_args) @@ -221,7 +224,7 @@ def requirements_files_by_platform( configured_platforms[p] = file else: - default_platforms = [_platform(p, python_version) for p in DEFAULT_PLATFORMS] + default_platforms = _default_platforms("*") plats = [ p for p in default_platforms diff --git a/tests/pypi/requirements_files_by_platform/requirements_files_by_platform_tests.bzl b/tests/pypi/requirements_files_by_platform/requirements_files_by_platform_tests.bzl index b729b0eaf0..0840daa934 100644 --- a/tests/pypi/requirements_files_by_platform/requirements_files_by_platform_tests.bzl +++ b/tests/pypi/requirements_files_by_platform/requirements_files_by_platform_tests.bzl @@ -86,6 +86,28 @@ def _test_simple(env): _tests.append(_test_simple) +def _test_simple_limited(env): + for got in [ + requirements_files_by_platform( + requirements_lock = "requirements_lock", + platforms = ["linux_x86_64", "osx_x86_64"], + ), + requirements_files_by_platform( + requirements_by_platform = { + "requirements_lock": "*", + }, + platforms = ["linux_x86_64", "osx_x86_64"], + ), + ]: + env.expect.that_dict(got).contains_exactly({ + "requirements_lock": [ + "linux_x86_64", + "osx_x86_64", + ], + }) + +_tests.append(_test_simple_limited) + def _test_simple_with_python_version(env): for got in [ requirements_files_by_platform( From 013664d9f10114d0b417c08ca9e385cbfa00bccf Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 19 May 2025 21:58:56 +0900 Subject: [PATCH 08/16] use correct types --- python/private/pypi/extension.bzl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 7436180295..0d32bb0d99 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -225,7 +225,7 @@ def _create_whl_repos( version = pip_attr.python_version, minor_mapping = minor_mapping, ), - platforms = platforms, + platforms = sorted(platforms), # Only pass the keys logger = logger, ), extra_pip_args = pip_attr.extra_pip_args, From 134fa8f30e221bee18173d1b9b49b9d75595cd06 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 19 May 2025 22:02:00 +0900 Subject: [PATCH 09/16] use the starlark impl of marker eval --- python/private/pypi/evaluate_markers.bzl | 8 ++++---- python/private/pypi/extension.bzl | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/python/private/pypi/evaluate_markers.bzl b/python/private/pypi/evaluate_markers.bzl index b4b271debb..48dd582923 100644 --- a/python/private/pypi/evaluate_markers.bzl +++ b/python/private/pypi/evaluate_markers.bzl @@ -42,12 +42,12 @@ def evaluate_markers(*, requirements, platforms): for req_string, platform_strings in requirements.items(): req = requirement(req_string) for platform_str in platform_strings: - platform = platforms.get(platform_str) - if not platform: + env = platforms.get(platform_str) + if not env: fail("Please define platform: '{}'".format(platform_str)) - if evaluate(req.marker, env = platform.env): - ret.setdefault(req_string, []).append(platform) + if evaluate(req.marker, env = env): + ret.setdefault(req_string, []).append(platform_str) return ret diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 0d32bb0d99..8809ec4885 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -769,7 +769,7 @@ def _pip_impl(module_ctx): # NOTE @aignas 2025-04-15: this is set to be reproducible, because the # results after calling the PyPI index should be reproducible on each # machine. - return module_ctx.extension_metadata(reproducible = True) + return module_ctx.extension_metadata(reproducible = False) else: return None From be0144c0d0c37bca438128d4d9c8f706a91c501b Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 19 May 2025 22:14:41 +0900 Subject: [PATCH 10/16] make platforms mandatory internally and configure them in the root MODULE --- CHANGELOG.md | 2 + MODULE.bazel | 75 ++++++++++--------- python/private/pypi/extension.bzl | 15 +--- python/private/pypi/hub_repository.bzl | 4 - python/private/pypi/pip_repository.bzl | 10 +++ .../pypi/requirements_files_by_platform.bzl | 15 +--- .../requirements_files_by_platform_tests.bzl | 19 ++++- 7 files changed, 73 insertions(+), 67 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6ba65eb2f..73c93640e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -104,6 +104,8 @@ END_UNRELEASED_TEMPLATE Set the `RULES_PYTHON_ENABLE_PIPSTAR=1` environment variable to enable it. * (utils) Add a way to run a REPL for any `rules_python` target that returns a `PyInfo` provider. +* (pypi) Added early developer preview `pip.default` tag class in order to customize what + platforms are enabled. Only `rules_python` and root modules can use this feature. {#v0-0-0-removed} ### Removed diff --git a/MODULE.bazel b/MODULE.bazel index 457fb9e4b4..8c0be8f3cf 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -65,40 +65,47 @@ _DEFAULT_OSX_PLATFORM_VERSION = "14.0" _DEFAULT_WINDOWS_PLATFORM_VERSION = "0" -pip.default( - arch_name = "x86_64", - constraint_values = [ - "@platforms//os:linux", - "@platforms//cpu:x86_64", - ], - env_platform_version = _DEFAULT_LINUX_PLATFORM_VERSION, - os_name = "linux", - platform = "linux_x86_64", -) -pip.default( - arch_name = "x86_64", - constraint_values = [ - "@platforms//os:osx", - "@platforms//cpu:x86_64", - ], - # We choose the oldest non-EOL version at the time when we release `rules_python`. - # See https://endoflife.date/macos - env_platform_version = _DEFAULT_OSX_PLATFORM_VERSION, - os_name = "osx", - platform = "osx_x86_64", -) -pip.default( - arch_name = "aarch64", - constraint_values = [ - "@platforms//os:osx", - "@platforms//cpu:aarch64", - ], - # We choose the oldest non-EOL version at the time when we release `rules_python`. - # See https://endoflife.date/macos - env_platform_version = _DEFAULT_OSX_PLATFORM_VERSION, - os_name = "osx", - platform = "osx_aarch64", -) +[ + pip.default( + arch_name = cpu, + constraint_values = [ + "@platforms//os:linux", + "@platforms//cpu:{}".format(cpu), + ], + env_platform_version = _DEFAULT_LINUX_PLATFORM_VERSION, + os_name = "linux", + platform = "linux_{}".format(cpu), + ) + # TODO @aignas 2025-05-19: only leave tier 0-1 cpus when stabilizing the + # `pip.default` extension + for cpu in [ + "aarch64", + "arm", + "ppc", + "s390x", + "x86_64", + ] +] + +[ + pip.default( + arch_name = cpu, + constraint_values = [ + "@platforms//os:osx", + "@platforms//cpu:{}".format(cpu), + ], + # We choose the oldest non-EOL version at the time when we release `rules_python`. + # See https://endoflife.date/macos + env_platform_version = _DEFAULT_OSX_PLATFORM_VERSION, + os_name = "osx", + platform = "osx_{}".format(cpu), + ) + for cpu in [ + "aarch64", + "x86_64", + ] +] + pip.default( arch_name = "x86_64", constraint_values = [ diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 8809ec4885..cb8a863ec1 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -307,12 +307,6 @@ def _create_whl_repos( }, extra_aliases = extra_aliases, whl_libraries = whl_libraries, - target_platforms = { - plat: None - for reqs in requirements_by_platform.values() - for req in reqs - for plat in req.target_platforms - }, ) def _whl_repos(*, requirement, whl_library_args, download_only, netrc, auth_patterns, multiple_requirements_for_whl = False, python_version, enable_pipstar = False): @@ -545,7 +539,6 @@ You cannot use both the additive_build_content and additive_build_content_file a hub_group_map = {} exposed_packages = {} extra_aliases = {} - target_platforms = {} whl_libraries = {} for mod in module_ctx.modules: @@ -629,7 +622,6 @@ You cannot use both the additive_build_content and additive_build_content_file a for whl_name, aliases in out.extra_aliases.items(): extra_aliases[hub_name].setdefault(whl_name, {}).update(aliases) exposed_packages.setdefault(hub_name, {}).update(out.exposed_packages) - target_platforms.setdefault(hub_name, {}).update(out.target_platforms) whl_libraries.update(out.whl_libraries) # TODO @aignas 2024-04-05: how do we support different requirement @@ -667,10 +659,6 @@ You cannot use both the additive_build_content and additive_build_content_file a } for hub_name, extra_whl_aliases in extra_aliases.items() }, - target_platforms = { - hub_name: sorted(p) - for hub_name, p in target_platforms.items() - }, whl_libraries = { k: dict(sorted(args.items())) for k, args in sorted(whl_libraries.items()) @@ -762,14 +750,13 @@ def _pip_impl(module_ctx): }, packages = mods.exposed_packages.get(hub_name, []), groups = mods.hub_group_map.get(hub_name), - target_platforms = mods.target_platforms.get(hub_name, []), ) if bazel_features.external_deps.extension_metadata_has_reproducible: # NOTE @aignas 2025-04-15: this is set to be reproducible, because the # results after calling the PyPI index should be reproducible on each # machine. - return module_ctx.extension_metadata(reproducible = False) + return module_ctx.extension_metadata(reproducible = True) else: return None diff --git a/python/private/pypi/hub_repository.bzl b/python/private/pypi/hub_repository.bzl index 0a1e772d05..0dbc6c29c2 100644 --- a/python/private/pypi/hub_repository.bzl +++ b/python/private/pypi/hub_repository.bzl @@ -87,10 +87,6 @@ The list of packages that will be exposed via all_*requirements macros. Defaults mandatory = True, doc = "The apparent name of the repo. This is needed because in bzlmod, the name attribute becomes the canonical name.", ), - "target_platforms": attr.string_list( - mandatory = True, - doc = "All of the target platforms for the hub repo", - ), "whl_map": attr.string_dict( mandatory = True, doc = """\ diff --git a/python/private/pypi/pip_repository.bzl b/python/private/pypi/pip_repository.bzl index c8d23f471f..ca6ad72943 100644 --- a/python/private/pypi/pip_repository.bzl +++ b/python/private/pypi/pip_repository.bzl @@ -80,6 +80,16 @@ def _pip_repository_impl(rctx): requirements_osx = rctx.attr.requirements_darwin, requirements_windows = rctx.attr.requirements_windows, extra_pip_args = rctx.attr.extra_pip_args, + platforms = [ + "linux_aarch64", + "linux_arm", + "linux_ppc", + "linux_s390x", + "linux_x86_64", + "osx_aarch64", + "osx_x86_64", + "windows_x86_64", + ], ), extra_pip_args = rctx.attr.extra_pip_args, evaluate_markers = lambda rctx, requirements: evaluate_markers_py( diff --git a/python/private/pypi/requirements_files_by_platform.bzl b/python/private/pypi/requirements_files_by_platform.bzl index 0b57a275c2..d823320444 100644 --- a/python/private/pypi/requirements_files_by_platform.bzl +++ b/python/private/pypi/requirements_files_by_platform.bzl @@ -16,19 +16,6 @@ load(":whl_target_platforms.bzl", "whl_target_platforms") -# TODO @aignas 2024-05-13: consider using the same platform tags as are used in -# the //python:versions.bzl -DEFAULT_PLATFORMS = [ - "linux_aarch64", - "linux_arm", - "linux_ppc", - "linux_s390x", - "linux_x86_64", - "osx_aarch64", - "osx_x86_64", - "windows_x86_64", -] - def _default_platforms_from(*, filter, python_version, choose_from): if not filter: fail("Must specific a filter string, got: {}".format(filter)) @@ -149,7 +136,7 @@ def requirements_files_by_platform( _default_platforms = lambda f: _default_platforms_from( filter = f, python_version = python_version, - choose_from = platforms or DEFAULT_PLATFORMS, + choose_from = platforms, ) platforms_from_args = _platforms_from_args(extra_pip_args) diff --git a/tests/pypi/requirements_files_by_platform/requirements_files_by_platform_tests.bzl b/tests/pypi/requirements_files_by_platform/requirements_files_by_platform_tests.bzl index 0840daa934..6688d72ffe 100644 --- a/tests/pypi/requirements_files_by_platform/requirements_files_by_platform_tests.bzl +++ b/tests/pypi/requirements_files_by_platform/requirements_files_by_platform_tests.bzl @@ -15,10 +15,27 @@ "" load("@rules_testing//lib:test_suite.bzl", "test_suite") -load("//python/private/pypi:requirements_files_by_platform.bzl", "requirements_files_by_platform") # buildifier: disable=bzl-visibility +load("//python/private/pypi:requirements_files_by_platform.bzl", _sut = "requirements_files_by_platform") # buildifier: disable=bzl-visibility _tests = [] +requirements_files_by_platform = lambda **kwargs: _sut( + platforms = kwargs.pop( + "platforms", + [ + "linux_aarch64", + "linux_arm", + "linux_ppc", + "linux_s390x", + "linux_x86_64", + "osx_aarch64", + "osx_x86_64", + "windows_x86_64", + ], + ), + **kwargs +) + def _test_fail_no_requirements(env): errors = [] requirements_files_by_platform( From 3d4b6975de0114e1ec5f1bb014b3212e4b2d93eb Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 19 May 2025 22:16:32 +0900 Subject: [PATCH 11/16] remove unused values from the config constructor --- python/private/pypi/extension.bzl | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index cb8a863ec1..85ee412f30 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -392,15 +392,6 @@ def _whl_repos(*, requirement, whl_library_args, download_only, netrc, auth_patt def _configure(config, *, platform, constraint_values, target_settings, os_name, arch_name, override = False, **values): """Set the value in the config if the value is provided""" - for key, value in values.items(): - if not value: - continue - - if not override and config.get(key): - continue - - config[key] = value - config.setdefault("platforms", {}) if not platform: if constraint_values or target_settings: @@ -453,6 +444,7 @@ def parse_modules( defaults, arch_name = tag.arch_name, constraint_values = tag.constraint_values, + # The env_ values is only used if the `PIPSTAR` is enabled env_implementation_name = tag.env_implementation_name, env_os_name = tag.env_os_name, env_platform_machine = tag.env_platform_machine, From b302243a1d7220ab556fe297182ee30973987d78 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 19 May 2025 22:18:25 +0900 Subject: [PATCH 12/16] remove the configure attr --- python/private/pypi/extension.bzl | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 85ee412f30..6c0b88955b 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -440,7 +440,6 @@ def parse_modules( for tag in mod.tags.default: _configure( - # TODO @aignas 2025-05-18: actually use all of this stuff defaults, arch_name = tag.arch_name, constraint_values = tag.constraint_values, @@ -776,11 +775,11 @@ platform to be matched during analysis phase. "whls_limit": attr.int(default = -1), } -_configure_attrs = _default_attrs | { - "hub_name": attr.string(), - "python_version": attr.string(), - "requirements_txt": attr.label(), -} +# _configure_attrs = _default_attrs | { +# "hub_name": attr.string(), +# "python_version": attr.string(), +# "requirements_txt": attr.label(), +# } def _pip_parse_ext_attrs(**kwargs): """Get the attributes for the pip extension. @@ -1038,14 +1037,6 @@ the BUILD files for wheels. """, implementation = _pip_impl, tag_classes = { - "configure": tag_class( - attrs = _configure_attrs, - doc = """\ -This tag class allows for more customization of how the configuration for the hub repositories is built. - -This is still experimental and may be changed or removed without any notice. -""", - ), "default": tag_class( attrs = _default_attrs, doc = """\ From 03932a6fb0034c3b13547aa673f3dc8a8f50654e Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 19 May 2025 22:24:17 +0900 Subject: [PATCH 13/16] add more ideas --- python/private/pypi/extension.bzl | 86 ++++++++++++++++++++----------- 1 file changed, 55 insertions(+), 31 deletions(-) diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 6c0b88955b..72375e0e94 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -431,32 +431,6 @@ def parse_modules( Returns: A struct with the following attributes: """ - defaults = { - "platforms": {}, - } - for mod in module_ctx.modules: - if not (mod.is_root or mod.name == "rules_python"): - continue - - for tag in mod.tags.default: - _configure( - defaults, - arch_name = tag.arch_name, - constraint_values = tag.constraint_values, - # The env_ values is only used if the `PIPSTAR` is enabled - env_implementation_name = tag.env_implementation_name, - env_os_name = tag.env_os_name, - env_platform_machine = tag.env_platform_machine, - env_platform_release = tag.env_platform_release, - env_platform_system = tag.env_platform_system, - env_platform_version = tag.env_platform_version, - env_sys_platform = tag.env_sys_platform, - os_name = tag.os_name, - platform = tag.platform, - target_settings = tag.target_settings, - override = mod.is_root, - ) - whl_mods = {} for mod in module_ctx.modules: for whl_mod in mod.tags.whl_mods: @@ -488,6 +462,36 @@ You cannot use both the additive_build_content and additive_build_content_file a srcs_exclude_glob = whl_mod.srcs_exclude_glob, ) + defaults = { + "platforms": {}, + } + for mod in module_ctx.modules: + if not (mod.is_root or mod.name == "rules_python"): + continue + + for tag in mod.tags.default: + _configure( + defaults, + arch_name = tag.arch_name, + constraint_values = tag.constraint_values, + # The env_ values is only used if the `PIPSTAR` is enabled + env_implementation_name = tag.env_implementation_name, + env_os_name = tag.env_os_name, + env_platform_machine = tag.env_platform_machine, + env_platform_release = tag.env_platform_release, + env_platform_system = tag.env_platform_system, + env_platform_version = tag.env_platform_version, + env_sys_platform = tag.env_sys_platform, + os_name = tag.os_name, + platform = tag.platform, + target_settings = tag.target_settings, + override = mod.is_root, + # TODO @aignas 2025-05-19: add more attr groups: + # * for AUTH + # * for index config + ) + + # Merge override API with the builder? _overriden_whl_set = {} whl_overrides = {} for module in module_ctx.modules: @@ -597,6 +601,8 @@ You cannot use both the additive_build_content and additive_build_content_file a elif pip_attr.experimental_index_url_overrides: fail("'experimental_index_url_overrides' is a no-op unless 'experimental_index_url' is set") + # TODO @aignas 2025-05-19: superimpose the pip.parse on top of the defaults + # and then pass everything as pip_attr out = _create_whl_repos( module_ctx, pip_attr = pip_attr, @@ -754,6 +760,16 @@ def _pip_impl(module_ctx): _default_attrs = { "arch_name": attr.string(), "constraint_values": attr.label_list(), + "os_name": attr.string(), + "platform": attr.string(), + # TODO @aignas 2025-05-19: use the following + "target_settings": attr.label_list( + doc = """\ +A list of config_settings that must be satisfied by the target configuration in order for this +platform to be matched during analysis phase. +""", + ), +} | { # The values for PEP508 env marker evaluation during the lock file parsing "env_implementation_name": attr.string(), "env_os_name": attr.string(doc = "default will be inferred from {obj}`os_name`"), @@ -762,14 +778,22 @@ _default_attrs = { "env_platform_system": attr.string(doc = "default will be inferred from {obj}`os_name`"), "env_platform_version": attr.string(), "env_sys_platform": attr.string(), + # TODO @aignas 2025-05-19: add wiring for the following +} | AUTH_ATTRS | { + # TODO @aignas 2025-05-19: add wiring for the following "extra_index_urls": attr.string_list(), "index_url": attr.string(), - "os_name": attr.string(), - "platform": attr.string(), - "target_settings": attr.label_list( + "index_url_overrides": attr.string_dict(), + "simpleapi_skip": attr.string_list( doc = """\ -A list of config_settings that must be satisfied by the target configuration in order for this -platform to be matched during analysis phase. +The list of packages to skip fetching metadata for from SimpleAPI index. You should +normally not need this attribute, but in case you do, please report this as a bug +to `rules_python` and use this attribute until the bug is fixed. + +EXPERIMENTAL: this may be removed without notice. + +:::{versionadded} 1.4.0 +::: """, ), "whls_limit": attr.int(default = -1), From ddcb1e301bc7570871faff30534272480b66fcdf Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 19 May 2025 22:42:18 +0900 Subject: [PATCH 14/16] wip --- tests/pypi/extension/extension_tests.bzl | 52 +++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index 8e325724f4..e88b31883a 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -49,13 +49,35 @@ simple==0.0.1 \ ], ) -def _mod(*, name, parse = [], override = [], whl_mods = [], is_root = True): +def _mod(*, name, default = [], parse = [], override = [], whl_mods = [], is_root = True): return struct( name = name, tags = struct( parse = parse, override = override, whl_mods = whl_mods, + # TODO @aignas 2025-05-19: add a test with the default tag + default = default or [ + _default( + arch_name = cpu, + constraint_values = [ + "@platforms//os:{}".format(os), + "@platforms//cpu:{}".format(cpu), + ], + os_name = os, + platform = "{}_{}".format(os, cpu), + ) + for os, cpu in [ + ("linux", "aarch64"), + ("linux", "arm"), + ("linux", "ppc"), + ("linux", "s390x"), + ("linux", "x86_64"), + ("osx", "aarch64"), + ("osx", "x86_64"), + ("windows", "x86_64"), + ] + ], ), is_root = is_root, ) @@ -77,6 +99,34 @@ def _parse_modules(env, **kwargs): ), ) +def _default( + arch_name = None, + constraint_values = None, + os_name = None, + platform = None, + target_settings = None, + env_implementation_name = None, + env_os_name = None, + env_platform_machine = None, + env_platform_release = None, + env_platform_system = None, + env_platform_version = None, + env_sys_platform = None): + return struct( + arch_name = arch_name, + constraint_values = constraint_values, + os_name = os_name, + platform = platform, + target_settings = target_settings, + env_implementation_name = env_implementation_name, + env_os_name = env_os_name, + env_platform_machine = env_platform_machine, + env_platform_release = env_platform_release, + env_platform_system = env_platform_system, + env_platform_version = env_platform_version, + env_sys_platform = env_sys_platform, + ) + def _parse( *, hub_name, From dac4b6bbfebd26cabda32fcbf5aa32c4b9283205 Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Fri, 23 May 2025 16:33:36 +0900 Subject: [PATCH 15/16] add more logic and docs to here --- MODULE.bazel | 48 +++++--- python/private/pypi/extension.bzl | 110 ++++++++++++++----- python/private/pypi/parse_requirements.bzl | 6 +- python/private/pypi/whl_target_platforms.bzl | 10 +- 4 files changed, 124 insertions(+), 50 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 8c0be8f3cf..8fa5c3798a 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -59,12 +59,6 @@ register_toolchains("@pythons_hub//:all") # Let's define default platforms for our users first pip = use_extension("//python/extensions:pip.bzl", "pip") -_DEFAULT_LINUX_PLATFORM_VERSION = "0" - -_DEFAULT_OSX_PLATFORM_VERSION = "14.0" - -_DEFAULT_WINDOWS_PLATFORM_VERSION = "0" - [ pip.default( arch_name = cpu, @@ -72,18 +66,27 @@ _DEFAULT_WINDOWS_PLATFORM_VERSION = "0" "@platforms//os:linux", "@platforms//cpu:{}".format(cpu), ], - env_platform_version = _DEFAULT_LINUX_PLATFORM_VERSION, + env_platform_version = "0", os_name = "linux", platform = "linux_{}".format(cpu), + whl_platforms = [ + # this is by the order of preference. + # TODO @aignas 2025-05-23: how do we specify the default libc version? + "manylinux_*_{}".format(cpu), + "linux_*_{}".format(cpu), + "musllinux_*_{}".format(cpu), + ], ) - # TODO @aignas 2025-05-19: only leave tier 0-1 cpus when stabilizing the - # `pip.default` extension for cpu in [ + "x86_64", "aarch64", + # TODO @aignas 2025-05-19: only leave tier 0-1 cpus when stabilizing the + # `pip.default` extension. i.e. drop the below values - users will have to + # define themselves if they need them. "arm", "ppc", + "ppc64le", "s390x", - "x86_64", ] ] @@ -96,14 +99,26 @@ _DEFAULT_WINDOWS_PLATFORM_VERSION = "0" ], # We choose the oldest non-EOL version at the time when we release `rules_python`. # See https://endoflife.date/macos - env_platform_version = _DEFAULT_OSX_PLATFORM_VERSION, + env_platform_version = "14.0", os_name = "osx", platform = "osx_{}".format(cpu), + whl_platforms = [ + "macosx_*_*_{}".format(wheel_cpu) + for wheel_cpu in wheel_cpu_values + ], ) - for cpu in [ - "aarch64", - "x86_64", - ] + for cpu, wheel_cpu_values in { + # this is by the order of preference. + "aarch64": [ + "arm64", + "universal2", + ], + "x86_64": [ + "x86_64", + "universal2", + "intel", + ], + }.items() ] pip.default( @@ -112,9 +127,10 @@ pip.default( "@platforms//os:windows", "@platforms//cpu:x86_64", ], - env_platform_version = _DEFAULT_WINDOWS_PLATFORM_VERSION, + env_platform_version = "0", os_name = "windows", platform = "windows_x86_64", + whl_platforms = ["win_amd64"], ) ##################### diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 72375e0e94..ed80bdbcb0 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -758,45 +758,90 @@ def _pip_impl(module_ctx): return None _default_attrs = { - "arch_name": attr.string(), - "constraint_values": attr.label_list(), - "os_name": attr.string(), - "platform": attr.string(), + "arch_name": attr.string( + doc = """\ +The CPU architecture name to be used. + +:::{note} +Either this or {attr}`env_platform_machine` should be specified. +::: +""", + ), + "constraint_values": attr.label_list( + doc = """\ +The list of labels to {obj}`constraint_value` that will be used in the `hub repository` when +including python packages that are compatible with this platform. +""", + ), + "os_name": attr.string( + doc = """\ +The OS name to be used. + +:::{note} +Either this or the appropriate `env_*` attributes should be specified. +::: +""", + ), + "platform": attr.string( + doc = """\ +A platform identifier which will be used as the unique identifier within the extension evaluation. +If you are defining custom platforms in your project and don't want things to clash, use extension +[isolation] feature. + +[isolation]: https://bazel.build/rules/lib/globals/module#use_extension.isolate +""", + ), # TODO @aignas 2025-05-19: use the following "target_settings": attr.label_list( doc = """\ -A list of config_settings that must be satisfied by the target configuration in order for this -platform to be matched during analysis phase. +A list of labels to {obj}`config_setting` targets that must be satisfied by the target +configuration in order for this platform to be matched during analysis phase. +""", + ), + "whl_limit": attr.int( + default = 1, + doc = """\ +The limit of wheels that we are going to include per platform. +""", + ), + "whl_platforms": attr.string_list( + doc = """\ +The platform_tag values to consider as supported for the target platforms. + +For `manylinux` and `musllinux` platform tags, please use the `manylinux_x_y_` +or `musllinux_x_y_` syntax. """, ), } | { # The values for PEP508 env marker evaluation during the lock file parsing - "env_implementation_name": attr.string(), - "env_os_name": attr.string(doc = "default will be inferred from {obj}`os_name`"), - "env_platform_machine": attr.string(doc = "default will be inferred from {obj}`arch_name`"), - "env_platform_release": attr.string(), - "env_platform_system": attr.string(doc = "default will be inferred from {obj}`os_name`"), - "env_platform_version": attr.string(), - "env_sys_platform": attr.string(), + "env_implementation_name": attr.string( + doc = "Value for `implementation_name` to evaluate environment markers. Defaults to `cpython`.", + ), + "env_os_name": attr.string( + doc = "Value for `os_name` to evaluate environment markers. Defaults to a value inferred from the {attr}`os_name`.", + ), + "env_platform_machine": attr.string( + doc = "Value for `platform_machine` to evaluate environment markers. Defaults to a value inferred from the {attr}`arch_name`.", + ), + "env_platform_release": attr.string( + doc = "Value for `platform_machine` to evaluate environment markers. Defaults to an empty value.", + ), + "env_platform_system": attr.string( + doc = "Value for `platform_system` to evaluate environment markers. Defaults to a value inferred from the {attr}`os_name`.", + ), + "env_platform_version": attr.string( + doc = "Value for `platform_machine` to evaluate environment markers. Defaults to `0`.", + ), + "env_sys_platform": attr.string( + doc = "Value for `sys_platform` to evaluate environment markers. Defaults to a value inferred from the {attr}`os_name`.", + ), # TODO @aignas 2025-05-19: add wiring for the following } | AUTH_ATTRS | { # TODO @aignas 2025-05-19: add wiring for the following - "extra_index_urls": attr.string_list(), - "index_url": attr.string(), - "index_url_overrides": attr.string_dict(), - "simpleapi_skip": attr.string_list( - doc = """\ -The list of packages to skip fetching metadata for from SimpleAPI index. You should -normally not need this attribute, but in case you do, please report this as a bug -to `rules_python` and use this attribute until the bug is fixed. - -EXPERIMENTAL: this may be removed without notice. - -:::{versionadded} 1.4.0 -::: -""", - ), - "whls_limit": attr.int(default = -1), + # "extra_index_urls": attr.string_list(), + # "index_url": attr.string(), + # "index_url_overrides": attr.string_dict(), + # "simpleapi_skip": attr.string_list(), } # _configure_attrs = _default_attrs | { @@ -1067,6 +1112,13 @@ the BUILD files for wheels. This tag class allows for more customization of how the configuration for the hub repositories is built. This is still experimental and may be changed or removed without any notice. + +:::{seealso} +The [environment markers][environment_markers] specification for the explanation of the +terms used in this extension. + +[environment_markers]: https://packaging.python.org/en/latest/specifications/dependency-specifiers/#environment-markers +::: """, ), "override": _override_tag, diff --git a/python/private/pypi/parse_requirements.bzl b/python/private/pypi/parse_requirements.bzl index bdfac46ed6..892cf762f5 100644 --- a/python/private/pypi/parse_requirements.bzl +++ b/python/private/pypi/parse_requirements.bzl @@ -350,6 +350,10 @@ def _add_dists(*, requirement, index_urls, logger = None): ])) # Filter out the wheels that are incompatible with the target_platforms. - whls = select_whls(whls = whls, want_platforms = requirement.target_platforms, logger = logger) + whls = select_whls( + whls = whls, + want_platforms = requirement.target_platforms, + logger = logger, + ) return whls, sdist diff --git a/python/private/pypi/whl_target_platforms.bzl b/python/private/pypi/whl_target_platforms.bzl index 6ea3f120c3..9293cf7e3b 100644 --- a/python/private/pypi/whl_target_platforms.bzl +++ b/python/private/pypi/whl_target_platforms.bzl @@ -46,13 +46,15 @@ _OS_PREFIXES = { "win": "windows", } # buildifier: disable=unsorted-dict-items -def select_whls(*, whls, want_platforms = [], logger = None): +def select_whls(*, whls, want_platforms = {}, logger = None): """Select a subset of wheels suitable for target platforms from a list. Args: - whls(list[struct]): A list of candidates which have a `filename` - attribute containing the `whl` filename. - want_platforms(str): The platforms in "{abi}_{os}_{cpu}" or "{os}_{cpu}" format. + whls: {type}`list[struct]` candidates which have a `filename` attribute containing + the `whl` filename. + want_platforms: {type}`dict[str, struct]` The platforms in "{abi}_{os}_{cpu}" or + "{os}_{cpu}" format for the keys and the values are options for further fine + tuning the selection. logger: A logger for printing diagnostic messages. Returns: From d5aeb65802725a1d63b6a92a4f67a648f36f380c Mon Sep 17 00:00:00 2001 From: Ignas Anikevicius <240938+aignas@users.noreply.github.com> Date: Mon, 26 May 2025 13:59:42 +0900 Subject: [PATCH 16/16] wip --- MODULE.bazel | 3 +- MODULE.bazel.lock | 3874 ++++++++++++++++++ python/private/pypi/extension.bzl | 13 +- python/private/pypi/parse_requirements.bzl | 6 +- python/private/pypi/whl_target_platforms.bzl | 48 +- 5 files changed, 3934 insertions(+), 10 deletions(-) create mode 100644 MODULE.bazel.lock diff --git a/MODULE.bazel b/MODULE.bazel index 8fa5c3798a..720e103416 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -103,7 +103,8 @@ pip = use_extension("//python/extensions:pip.bzl", "pip") os_name = "osx", platform = "osx_{}".format(cpu), whl_platforms = [ - "macosx_*_*_{}".format(wheel_cpu) + # TODO @aignas 2025-05-23: how do we specify the default osx version? + "macosx_*_{}".format(wheel_cpu) for wheel_cpu in wheel_cpu_values ], ) diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock new file mode 100644 index 0000000000..93cff4433b --- /dev/null +++ b/MODULE.bazel.lock @@ -0,0 +1,3874 @@ +{ + "lockFileVersion": 18, + "registryFileHashes": { + "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", + "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", + "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16", + "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed", + "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/source.json": "9be551b8d4e3ef76875c0d744b5d6a504a27e3ae67bc6b28f46415fd2d2957da", + "https://bcr.bazel.build/modules/bazel_ci_rules/1.0.0/MODULE.bazel": "0f92c944b9c466066ed484cfc899cf43fca765df78caca18984c62479f7925eb", + "https://bcr.bazel.build/modules/bazel_ci_rules/1.0.0/source.json": "3405a2a7f9f827a44934b01470faeac1b56fb1304955c98ee9fcd03ad2ca5dcc", + "https://bcr.bazel.build/modules/bazel_features/1.1.0/MODULE.bazel": "cfd42ff3b815a5f39554d97182657f8c4b9719568eb7fded2b9135f084bf760b", + "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd", + "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", + "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d", + "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d", + "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a", + "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58", + "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b", + "https://bcr.bazel.build/modules/bazel_features/1.21.0/source.json": "3e8379efaaef53ce35b7b8ba419df829315a880cb0a030e5bb45c96d6d5ecb5f", + "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", + "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a", + "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", + "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", + "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d", + "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651", + "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138", + "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b", + "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/source.json": "f121b43eeefc7c29efbd51b83d08631e2347297c95aac9764a701f2a6a2bb953", + "https://bcr.bazel.build/modules/buildifier_prebuilt/6.0.0.1/MODULE.bazel": "5d23708e6a5527ab4f151da7accabc22808cb5fb579c8cc4cd4a292da57a5c97", + "https://bcr.bazel.build/modules/buildifier_prebuilt/6.1.2/MODULE.bazel": "2ef4962c8b0b6d8d21928a89190755619254459bc67f870dc0ccb9ba9952d444", + "https://bcr.bazel.build/modules/buildifier_prebuilt/6.1.2/source.json": "19fb45ed3f0d55cbff94e402c39512940833ae3a68f9cbfd9518a1926b609c7c", + "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", + "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", + "https://bcr.bazel.build/modules/cgrindel_bazel_starlib/0.18.0/MODULE.bazel": "1d548f0c383ec8fce15c14b42b7f5f4fc29e910fb747d54b40d8c949a5dea09c", + "https://bcr.bazel.build/modules/cgrindel_bazel_starlib/0.18.0/source.json": "bb5421fffcf03965cb192a7dfa857c4cfc2d5ed7788d8b97da30f6b9d5706c9e", + "https://bcr.bazel.build/modules/gazelle/0.32.0/MODULE.bazel": "b499f58a5d0d3537f3cf5b76d8ada18242f64ec474d8391247438bf04f58c7b8", + "https://bcr.bazel.build/modules/gazelle/0.33.0/MODULE.bazel": "a13a0f279b462b784fb8dd52a4074526c4a2afe70e114c7d09066097a46b3350", + "https://bcr.bazel.build/modules/gazelle/0.34.0/MODULE.bazel": "abdd8ce4d70978933209db92e436deb3a8b737859e9354fb5fd11fb5c2004c8a", + "https://bcr.bazel.build/modules/gazelle/0.36.0/MODULE.bazel": "e375d5d6e9a6ca59b0cb38b0540bc9a05b6aa926d322f2de268ad267a2ee74c0", + "https://bcr.bazel.build/modules/gazelle/0.40.0/MODULE.bazel": "42ba5378ebe845fca43989a53186ab436d956db498acde790685fe0e8f9c6146", + "https://bcr.bazel.build/modules/gazelle/0.40.0/source.json": "1e5ef6e4d8b9b6836d93273c781e78ff829ea2e077afef7a57298040fa4f010a", + "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb", + "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", + "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6", + "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/source.json": "41e9e129f80d8c8bf103a7acc337b76e54fad1214ac0a7084bf24f4cd924b8b4", + "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075", + "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d", + "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902", + "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5", + "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f", + "https://bcr.bazel.build/modules/platforms/0.0.11/source.json": "f7e188b79ebedebfe75e9e1d098b8845226c7992b307e28e1496f23112e8fc29", + "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", + "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", + "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", + "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", + "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d", + "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", + "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c", + "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d", + "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df", + "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92", + "https://bcr.bazel.build/modules/protobuf/29.0/MODULE.bazel": "319dc8bf4c679ff87e71b1ccfb5a6e90a6dbc4693501d471f48662ac46d04e4e", + "https://bcr.bazel.build/modules/protobuf/29.0/source.json": "b857f93c796750eef95f0d61ee378f3420d00ee1dd38627b27193aa482f4f981", + "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", + "https://bcr.bazel.build/modules/protobuf/3.19.2/MODULE.bazel": "532ffe5f2186b69fdde039efe6df13ba726ff338c6bc82275ad433013fa10573", + "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858", + "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e", + "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/source.json": "be4789e951dd5301282729fe3d4938995dc4c1a81c2ff150afc9f1b0504c6022", + "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206", + "https://bcr.bazel.build/modules/re2/2023-09-01/source.json": "e044ce89c2883cd957a2969a43e79f7752f9656f6b20050b62f90ede21ec6eb4", + "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8", + "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e", + "https://bcr.bazel.build/modules/rules_bazel_integration_test/0.27.0/MODULE.bazel": "66b85a47d4aa51686c3e43befc7442b5be84415b12296954929ba199d46823be", + "https://bcr.bazel.build/modules/rules_bazel_integration_test/0.27.0/source.json": "28bd34e4cbbe78a826aa513cf555d9cb52f0fe589b64d20ca812b8e3fbca572f", + "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", + "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002", + "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191", + "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc", + "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87", + "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a", + "https://bcr.bazel.build/modules/rules_cc/0.0.17/source.json": "4db99b3f55c90ab28d14552aa0632533e3e8e5e9aea0f5c24ac0014282c2a7c5", + "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", + "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f", + "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", + "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", + "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8", + "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e", + "https://bcr.bazel.build/modules/rules_go/0.41.0/MODULE.bazel": "55861d8e8bb0e62cbd2896f60ff303f62ffcb0eddb74ecb0e5c0cbe36fc292c8", + "https://bcr.bazel.build/modules/rules_go/0.42.0/MODULE.bazel": "8cfa875b9aa8c6fce2b2e5925e73c1388173ea3c32a0db4d2b4804b453c14270", + "https://bcr.bazel.build/modules/rules_go/0.46.0/MODULE.bazel": "3477df8bdcc49e698b9d25f734c4f3a9f5931ff34ee48a2c662be168f5f2d3fd", + "https://bcr.bazel.build/modules/rules_go/0.50.1/MODULE.bazel": "b91a308dc5782bb0a8021ad4330c81fea5bda77f96b9e4c117b9b9c8f6665ee0", + "https://bcr.bazel.build/modules/rules_go/0.50.1/source.json": "205765fd30216c70321f84c9a967267684bdc74350af3f3c46c857d9f80a4fa2", + "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", + "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86", + "https://bcr.bazel.build/modules/rules_java/6.0.0/MODULE.bazel": "8a43b7df601a7ec1af61d79345c17b31ea1fedc6711fd4abfd013ea612978e39", + "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31", + "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a", + "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6", + "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab", + "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe", + "https://bcr.bazel.build/modules/rules_java/8.11.0/MODULE.bazel": "c3d280bc5ff1038dcb3bacb95d3f6b83da8dd27bba57820ec89ea4085da767ad", + "https://bcr.bazel.build/modules/rules_java/8.11.0/source.json": "302b52a39259a85aa06ca3addb9787864ca3e03b432a5f964ea68244397e7544", + "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017", + "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939", + "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", + "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909", + "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0", + "https://bcr.bazel.build/modules/rules_jvm_external/6.3/source.json": "6f5f5a5a4419ae4e37c35a5bb0a6ae657ed40b7abc5a5189111b47fcebe43197", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3", + "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5", + "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", + "https://bcr.bazel.build/modules/rules_license/0.0.4/MODULE.bazel": "6a88dd22800cf1f9f79ba32cacad0d3a423ed28efa2c2ed5582eaa78dd3ac1e5", + "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", + "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c", + "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb", + "https://bcr.bazel.build/modules/rules_multirun/0.9.0/MODULE.bazel": "32d628ef586b5b23f67e55886b7bc38913ea4160420d66ae90521dda2ff37df0", + "https://bcr.bazel.build/modules/rules_multirun/0.9.0/source.json": "e882ba77962fa6c5fe68619e5c7d0374ec9a219fb8d03c42eadaf6d0243771bd", + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff", + "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a", + "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", + "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", + "https://bcr.bazel.build/modules/rules_proto/6.0.0/MODULE.bazel": "b531d7f09f58dce456cd61b4579ce8c86b38544da75184eadaf0a7cb7966453f", + "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2", + "https://bcr.bazel.build/modules/rules_proto/7.0.2/source.json": "1e5e7260ae32ef4f2b52fd1d0de8d03b606a44c91b694d2f1afb1d3b28a48ce1", + "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c", + "https://bcr.bazel.build/modules/rules_shell/0.3.0/MODULE.bazel": "de4402cd12f4cc8fda2354fce179fdb068c0b9ca1ec2d2b17b3e21b24c1a937b", + "https://bcr.bazel.build/modules/rules_shell/0.3.0/source.json": "c55ed591aa5009401ddf80ded9762ac32c358d2517ee7820be981e2de9756cf3", + "https://bcr.bazel.build/modules/rules_testing/0.6.0/MODULE.bazel": "8518d53bc742c462536d3f1a0de0c265bd7b51f32797fea4132007223ed2926f", + "https://bcr.bazel.build/modules/rules_testing/0.6.0/source.json": "915ae13ae2247c986cc57289f21e7f1d9711cd2ecfdf5867b51dc0484f3b043b", + "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", + "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c", + "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef", + "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c", + "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5", + "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216", + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", + "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", + "https://bcr.bazel.build/modules/zlib/1.2.12/MODULE.bazel": "3b1a8834ada2a883674be8cbd36ede1b6ec481477ada359cd2d3ddc562340b27", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/MODULE.bazel": "af322bc08976524477c79d1e45e241b6efbeb918c497e8840b8ab116802dda79", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/source.json": "2be409ac3c7601245958cd4fcdff4288be79ed23bd690b4b951f500d54ee6e7d", + "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198" + }, + "selectedYankedVersions": {}, + "moduleExtensions": { + "//python/extensions:pip.bzl%pip": { + "general": { + "bzlTransitiveDigest": "Ruk6sX1uxylKwolQKBGTr6FIuOrUMdQIEy5OtYzAiyk=", + "usagesDigest": "GCqHZSAA91lBreUTm9IkBGef2eNIXBQ2dhkiKUQbtMs=", + "recordedFileInputs": { + "@@//docs/requirements.txt": "6c70a3c37d05df16be04e59877907a83d4db36dccf3ec305d4e7b5bf616c0bb7", + "@@//examples/wheel/requirements_server.txt": "981e09e454aa31d72f73f369436fce488e5a478717a8fac808412f4695e44823", + "@@//tools/publish/requirements_darwin.txt": "d073c39b04ef65ddbeffce3ca7dd65556df19142507effffa4eea7dc25291b10", + "@@protobuf+//python/requirements.txt": "983be60d3cec4b319dcab6d48aeb3f5b2f7c3350f26b3a9e97486c37967c73c5", + "@@rules_fuzzing+//fuzzing/requirements.txt": "ab04664be026b632a0d2a2446c4f65982b7654f5b6851d2f9d399a19b7242a5b" + }, + "recordedDirentsInputs": {}, + "envVariables": { + "RULES_PYTHON_REPO_DEBUG": null, + "RULES_PYTHON_REPO_DEBUG_VERBOSITY": null + }, + "generatedRepoSpecs": { + "dev_pip_311_absl_py_py3_none_any_e5797bc6": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "absl_py-2.2.2-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "absl-py==2.2.2", + "sha256": "e5797bc6abe45f64fd95dc06394ca3f2bedf3b5d895e9da691c9ee3397d70092", + "urls": [ + "https://files.pythonhosted.org/packages/f6/d4/349f7f4bd5ea92dab34f5bb0fe31775ef6c311427a14d5a5b31ecb442341/absl_py-2.2.2-py3-none-any.whl" + ] + } + }, + "dev_pip_311_alabaster_py3_none_any_fc678640": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "alabaster-1.0.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "alabaster==1.0.0", + "sha256": "fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", + "urls": [ + "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl" + ] + } + }, + "dev_pip_311_astroid_py3_none_any_d05bfd0a": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "astroid-3.3.9-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "astroid==3.3.9", + "sha256": "d05bfd0acba96a7bd43e222828b7d9bc1e138aaeb0649707908d3702a9831248", + "urls": [ + "https://files.pythonhosted.org/packages/de/80/c749efbd8eef5ea77c7d6f1956e8fbfb51963b7f93ef79647afd4d9886e3/astroid-3.3.9-py3-none-any.whl" + ] + } + }, + "dev_pip_311_babel_py3_none_any_4d0b5309": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "babel-2.17.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "babel==2.17.0", + "sha256": "4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", + "urls": [ + "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl" + ] + } + }, + "dev_pip_311_certifi_py3_none_any_ca78db45": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "certifi-2025.1.31-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "certifi==2025.1.31", + "sha256": "ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", + "urls": [ + "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl" + ] + } + }, + "dev_pip_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_8bfa33f4": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", + "urls": [ + "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl" + ] + } + }, + "dev_pip_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_28bf5762": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", + "urls": [ + "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "dev_pip_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_f08ff5e9": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", + "urls": [ + "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + ] + } + }, + "dev_pip_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_234ac59e": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", + "urls": [ + "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" + ] + } + }, + "dev_pip_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_fd4ec41f": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", + "urls": [ + "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "dev_pip_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_c96836c9": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", + "urls": [ + "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl" + ] + } + }, + "dev_pip_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_09b5e673": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", + "urls": [ + "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl" + ] + } + }, + "dev_pip_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_5777ee08": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", + "urls": [ + "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl" + ] + } + }, + "dev_pip_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_237bdbe6": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", + "urls": [ + "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl" + ] + } + }, + "dev_pip_311_charset_normalizer_cp311_cp311_win_amd64_d7f50a1f": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", + "urls": [ + "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl" + ] + } + }, + "dev_pip_311_charset_normalizer_py3_none_any_d98b1668": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", + "urls": [ + "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl" + ] + } + }, + "dev_pip_311_colorama_py2_none_any_4f1d9991": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "colorama-0.4.6-py2.py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "colorama==0.4.6", + "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", + "urls": [ + "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl" + ] + } + }, + "dev_pip_311_docutils_py3_none_any_dafca5b9": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "docutils-0.21.2-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "docutils==0.21.2", + "sha256": "dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", + "urls": [ + "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl" + ] + } + }, + "dev_pip_311_idna_py3_none_any_946d195a": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "idna-3.10-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "idna==3.10", + "sha256": "946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", + "urls": [ + "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl" + ] + } + }, + "dev_pip_311_imagesize_py2_none_any_0d8d18d0": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "imagesize-1.4.1-py2.py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "imagesize==1.4.1", + "sha256": "0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", + "urls": [ + "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl" + ] + } + }, + "dev_pip_311_jinja2_py3_none_any_85ece445": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "jinja2-3.1.6-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "jinja2==3.1.6", + "sha256": "85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", + "urls": [ + "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl" + ] + } + }, + "dev_pip_311_markdown_it_py_py3_none_any_35521684": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "markdown_it_py-3.0.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "markdown-it-py==3.0.0", + "sha256": "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", + "urls": [ + "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl" + ] + } + }, + "dev_pip_311_markupsafe_cp311_cp311_macosx_10_9_universal2_9025b401": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", + "urls": [ + "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl" + ] + } + }, + "dev_pip_311_markupsafe_cp311_cp311_macosx_11_0_arm64_93335ca3": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", + "urls": [ + "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl" + ] + } + }, + "dev_pip_311_markupsafe_cp311_cp311_manylinux_2_17_aarch64_2cb8438c": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", + "urls": [ + "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "dev_pip_311_markupsafe_cp311_cp311_manylinux_2_17_x86_64_a123e330": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", + "urls": [ + "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "dev_pip_311_markupsafe_cp311_cp311_musllinux_1_2_aarch64_d8213e09": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", + "urls": [ + "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl" + ] + } + }, + "dev_pip_311_markupsafe_cp311_cp311_musllinux_1_2_x86_64_0bff5e0a": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", + "urls": [ + "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl" + ] + } + }, + "dev_pip_311_markupsafe_cp311_cp311_win_amd64_70a87b41": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", + "urls": [ + "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl" + ] + } + }, + "dev_pip_311_mdit_py_plugins_py3_none_any_0c673c3f": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "mdit_py_plugins-0.4.2-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "mdit-py-plugins==0.4.2", + "sha256": "0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", + "urls": [ + "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl" + ] + } + }, + "dev_pip_311_mdurl_py3_none_any_84008a41": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "mdurl-0.1.2-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "mdurl==0.1.2", + "sha256": "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", + "urls": [ + "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl" + ] + } + }, + "dev_pip_311_myst_parser_py3_none_any_b9317997": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "myst_parser-4.0.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "myst-parser==4.0.0", + "sha256": "b9317997552424448c6096c2558872fdb6f81d3ecb3a40ce84a7518798f3f28d", + "urls": [ + "https://files.pythonhosted.org/packages/ca/b4/b036f8fdb667587bb37df29dc6644681dd78b7a2a6321a34684b79412b28/myst_parser-4.0.0-py3-none-any.whl" + ] + } + }, + "dev_pip_311_packaging_py3_none_any_29572ef2": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "packaging-25.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "packaging==25.0", + "sha256": "29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "urls": [ + "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl" + ] + } + }, + "dev_pip_311_pygments_py3_none_any_9ea1544a": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "pygments-2.19.1-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "pygments==2.19.1", + "sha256": "9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", + "urls": [ + "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl" + ] + } + }, + "dev_pip_311_pyyaml_cp311_cp311_macosx_10_9_x86_64_cc1c1159": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "pyyaml==6.0.2", + "sha256": "cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", + "urls": [ + "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl" + ] + } + }, + "dev_pip_311_pyyaml_cp311_cp311_macosx_11_0_arm64_1e2120ef": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "pyyaml==6.0.2", + "sha256": "1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", + "urls": [ + "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl" + ] + } + }, + "dev_pip_311_pyyaml_cp311_cp311_manylinux_2_17_aarch64_5d225db5": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "pyyaml==6.0.2", + "sha256": "5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", + "urls": [ + "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "dev_pip_311_pyyaml_cp311_cp311_manylinux_2_17_s390x_5ac9328e": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "pyyaml==6.0.2", + "sha256": "5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", + "urls": [ + "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" + ] + } + }, + "dev_pip_311_pyyaml_cp311_cp311_manylinux_2_17_x86_64_3ad2a3de": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "pyyaml==6.0.2", + "sha256": "3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", + "urls": [ + "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "dev_pip_311_pyyaml_cp311_cp311_musllinux_1_1_aarch64_ff3824dc": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "pyyaml==6.0.2", + "sha256": "ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", + "urls": [ + "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl" + ] + } + }, + "dev_pip_311_pyyaml_cp311_cp311_musllinux_1_1_x86_64_797b4f72": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "pyyaml==6.0.2", + "sha256": "797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", + "urls": [ + "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl" + ] + } + }, + "dev_pip_311_pyyaml_cp311_cp311_win_amd64_e10ce637": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "pyyaml==6.0.2", + "sha256": "e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", + "urls": [ + "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl" + ] + } + }, + "dev_pip_311_readthedocs_sphinx_ext_py2_none_any_f8c56184": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "readthedocs_sphinx_ext-2.2.5-py2.py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "readthedocs-sphinx-ext==2.2.5", + "sha256": "f8c56184ea011c972dd45a90122568587cc85b0127bc9cf064d17c68bc809daa", + "urls": [ + "https://files.pythonhosted.org/packages/64/71/c89e7709a0d4f93af1848e9855112299a820b470d84f917b4dd5998bdd07/readthedocs_sphinx_ext-2.2.5-py2.py3-none-any.whl" + ] + } + }, + "dev_pip_311_requests_py3_none_any_70761cfe": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "requests-2.32.3-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "requests==2.32.3", + "sha256": "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", + "urls": [ + "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl" + ] + } + }, + "dev_pip_311_snowballstemmer_py2_none_any_c8e1716e": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "snowballstemmer-2.2.0-py2.py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "snowballstemmer==2.2.0", + "sha256": "c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", + "urls": [ + "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl" + ] + } + }, + "dev_pip_311_sphinx_autodoc2_py3_none_any_e867013b": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinx_autodoc2-0.5.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "sphinx-autodoc2==0.5.0", + "sha256": "e867013b1512f9d6d7e6f6799f8b537d6884462acd118ef361f3f619a60b5c9e", + "urls": [ + "https://files.pythonhosted.org/packages/19/e6/48d47961bbdae755ba9c17dfc65d89356312c67668dcb36c87cfadfa1964/sphinx_autodoc2-0.5.0-py3-none-any.whl" + ] + } + }, + "dev_pip_311_sphinx_py3_none_any_09719015": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinx-8.1.3-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "sphinx==8.1.3", + "sha256": "09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", + "urls": [ + "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl" + ] + } + }, + "dev_pip_311_sphinx_reredirects_py3_none_any_efd50c76": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinx_reredirects-0.1.6-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "sphinx-reredirects==0.1.6", + "sha256": "efd50c766fbc5bf40cd5148e10c00f2c00d143027de5c5e48beece93cc40eeea", + "urls": [ + "https://files.pythonhosted.org/packages/ac/6f/0b3625be30a1a50f9e4c2cb2ec147b08f15ed0e9f8444efcf274b751300b/sphinx_reredirects-0.1.6-py3-none-any.whl" + ] + } + }, + "dev_pip_311_sphinx_rtd_theme_py2_none_any_422ccc75": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "sphinx-rtd-theme==3.0.2", + "sha256": "422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13", + "urls": [ + "https://files.pythonhosted.org/packages/85/77/46e3bac77b82b4df5bb5b61f2de98637724f246b4966cfc34bc5895d852a/sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl" + ] + } + }, + "dev_pip_311_sphinxcontrib_applehelp_py3_none_any_4cd3f0ec": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "sphinxcontrib-applehelp==2.0.0", + "sha256": "4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", + "urls": [ + "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl" + ] + } + }, + "dev_pip_311_sphinxcontrib_devhelp_py3_none_any_aefb8b83": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "sphinxcontrib-devhelp==2.0.0", + "sha256": "aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", + "urls": [ + "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl" + ] + } + }, + "dev_pip_311_sphinxcontrib_htmlhelp_py3_none_any_16675982": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "sphinxcontrib-htmlhelp==2.1.0", + "sha256": "166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", + "urls": [ + "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl" + ] + } + }, + "dev_pip_311_sphinxcontrib_jquery_py2_none_any_f936030d": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "sphinxcontrib-jquery==4.1", + "sha256": "f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae", + "urls": [ + "https://files.pythonhosted.org/packages/76/85/749bd22d1a68db7291c89e2ebca53f4306c3f205853cf31e9de279034c3c/sphinxcontrib_jquery-4.1-py2.py3-none-any.whl" + ] + } + }, + "dev_pip_311_sphinxcontrib_jsmath_py2_none_any_2ec2eaeb": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "sphinxcontrib-jsmath==1.0.1", + "sha256": "2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", + "urls": [ + "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl" + ] + } + }, + "dev_pip_311_sphinxcontrib_qthelp_py3_none_any_b18a828c": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "sphinxcontrib-qthelp==2.0.0", + "sha256": "b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", + "urls": [ + "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl" + ] + } + }, + "dev_pip_311_sphinxcontrib_serializinghtml_py3_none_any_6e2cb0ee": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "sphinxcontrib-serializinghtml==2.0.0", + "sha256": "6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", + "urls": [ + "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl" + ] + } + }, + "dev_pip_311_typing_extensions_py3_none_any_a439e7c0": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "typing_extensions-4.13.2-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "typing-extensions==4.13.2", + "sha256": "a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", + "urls": [ + "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl" + ] + } + }, + "dev_pip_311_urllib3_py3_none_any_4e166650": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "urllib3-2.4.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "urllib3==2.4.0", + "sha256": "4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", + "urls": [ + "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl" + ] + } + }, + "dev_pip_313_absl_py_py3_none_any_e5797bc6": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "absl_py-2.2.2-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "absl-py==2.2.2", + "sha256": "e5797bc6abe45f64fd95dc06394ca3f2bedf3b5d895e9da691c9ee3397d70092", + "urls": [ + "https://files.pythonhosted.org/packages/f6/d4/349f7f4bd5ea92dab34f5bb0fe31775ef6c311427a14d5a5b31ecb442341/absl_py-2.2.2-py3-none-any.whl" + ] + } + }, + "dev_pip_313_alabaster_py3_none_any_fc678640": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "alabaster-1.0.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "alabaster==1.0.0", + "sha256": "fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", + "urls": [ + "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl" + ] + } + }, + "dev_pip_313_astroid_py3_none_any_d05bfd0a": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "astroid-3.3.9-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "astroid==3.3.9", + "sha256": "d05bfd0acba96a7bd43e222828b7d9bc1e138aaeb0649707908d3702a9831248", + "urls": [ + "https://files.pythonhosted.org/packages/de/80/c749efbd8eef5ea77c7d6f1956e8fbfb51963b7f93ef79647afd4d9886e3/astroid-3.3.9-py3-none-any.whl" + ] + } + }, + "dev_pip_313_babel_py3_none_any_4d0b5309": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "babel-2.17.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "babel==2.17.0", + "sha256": "4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", + "urls": [ + "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl" + ] + } + }, + "dev_pip_313_certifi_py3_none_any_ca78db45": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "certifi-2025.1.31-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "certifi==2025.1.31", + "sha256": "ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", + "urls": [ + "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl" + ] + } + }, + "dev_pip_313_charset_normalizer_cp313_cp313_macosx_10_13_universal2_aabfa34b": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", + "urls": [ + "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl" + ] + } + }, + "dev_pip_313_charset_normalizer_cp313_cp313_manylinux_2_17_aarch64_22e14b5d": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", + "urls": [ + "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "dev_pip_313_charset_normalizer_cp313_cp313_manylinux_2_17_ppc64le_8436c508": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", + "urls": [ + "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + ] + } + }, + "dev_pip_313_charset_normalizer_cp313_cp313_manylinux_2_17_s390x_2d074908": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", + "urls": [ + "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl" + ] + } + }, + "dev_pip_313_charset_normalizer_cp313_cp313_manylinux_2_17_x86_64_955f8851": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", + "urls": [ + "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "dev_pip_313_charset_normalizer_cp313_cp313_musllinux_1_2_aarch64_0924e81d": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", + "urls": [ + "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl" + ] + } + }, + "dev_pip_313_charset_normalizer_cp313_cp313_musllinux_1_2_ppc64le_c75cb2a3": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", + "urls": [ + "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl" + ] + } + }, + "dev_pip_313_charset_normalizer_cp313_cp313_musllinux_1_2_s390x_09b26ae6": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", + "urls": [ + "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl" + ] + } + }, + "dev_pip_313_charset_normalizer_cp313_cp313_musllinux_1_2_x86_64_fa88b843": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", + "urls": [ + "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl" + ] + } + }, + "dev_pip_313_charset_normalizer_cp313_cp313_win_amd64_b1ac5992": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", + "urls": [ + "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl" + ] + } + }, + "dev_pip_313_charset_normalizer_py3_none_any_d98b1668": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "charset_normalizer-3.4.1-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", + "urls": [ + "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl" + ] + } + }, + "dev_pip_313_colorama_py2_none_any_4f1d9991": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "colorama-0.4.6-py2.py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "colorama==0.4.6", + "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", + "urls": [ + "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl" + ] + } + }, + "dev_pip_313_docutils_py3_none_any_dafca5b9": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "docutils-0.21.2-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "docutils==0.21.2", + "sha256": "dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", + "urls": [ + "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl" + ] + } + }, + "dev_pip_313_idna_py3_none_any_946d195a": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "idna-3.10-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "idna==3.10", + "sha256": "946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", + "urls": [ + "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl" + ] + } + }, + "dev_pip_313_imagesize_py2_none_any_0d8d18d0": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "imagesize-1.4.1-py2.py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "imagesize==1.4.1", + "sha256": "0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", + "urls": [ + "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl" + ] + } + }, + "dev_pip_313_jinja2_py3_none_any_85ece445": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "jinja2-3.1.6-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "jinja2==3.1.6", + "sha256": "85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", + "urls": [ + "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl" + ] + } + }, + "dev_pip_313_markdown_it_py_py3_none_any_35521684": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "markdown_it_py-3.0.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "markdown-it-py==3.0.0", + "sha256": "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", + "urls": [ + "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl" + ] + } + }, + "dev_pip_313_markupsafe_cp313_cp313_macosx_10_13_universal2_ba9527cd": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", + "urls": [ + "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl" + ] + } + }, + "dev_pip_313_markupsafe_cp313_cp313_macosx_11_0_arm64_f8b3d067": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", + "urls": [ + "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl" + ] + } + }, + "dev_pip_313_markupsafe_cp313_cp313_manylinux_2_17_aarch64_569511d3": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", + "urls": [ + "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "dev_pip_313_markupsafe_cp313_cp313_manylinux_2_17_x86_64_15ab75ef": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", + "urls": [ + "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "dev_pip_313_markupsafe_cp313_cp313_musllinux_1_2_aarch64_cdb82a87": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", + "urls": [ + "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl" + ] + } + }, + "dev_pip_313_markupsafe_cp313_cp313_musllinux_1_2_x86_64_444dcda7": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", + "urls": [ + "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl" + ] + } + }, + "dev_pip_313_markupsafe_cp313_cp313_win_amd64_e6a2a455": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", + "urls": [ + "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl" + ] + } + }, + "dev_pip_313_markupsafe_cp313_cp313t_macosx_10_13_universal2_b5a6b3ad": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", + "urls": [ + "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl" + ] + } + }, + "dev_pip_313_markupsafe_cp313_cp313t_macosx_11_0_arm64_a904af0a": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", + "urls": [ + "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl" + ] + } + }, + "dev_pip_313_markupsafe_cp313_cp313t_manylinux_2_17_aarch64_4aa4e5fa": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", + "urls": [ + "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "dev_pip_313_markupsafe_cp313_cp313t_manylinux_2_17_x86_64_c0ef13ea": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", + "urls": [ + "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "dev_pip_313_markupsafe_cp313_cp313t_musllinux_1_2_aarch64_6381026f": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", + "urls": [ + "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl" + ] + } + }, + "dev_pip_313_markupsafe_cp313_cp313t_musllinux_1_2_x86_64_131a3c76": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", + "urls": [ + "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl" + ] + } + }, + "dev_pip_313_markupsafe_cp313_cp313t_win_amd64_e444a31f": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "markupsafe==3.0.2", + "sha256": "e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", + "urls": [ + "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl" + ] + } + }, + "dev_pip_313_mdit_py_plugins_py3_none_any_0c673c3f": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "mdit_py_plugins-0.4.2-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "mdit-py-plugins==0.4.2", + "sha256": "0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", + "urls": [ + "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl" + ] + } + }, + "dev_pip_313_mdurl_py3_none_any_84008a41": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "mdurl-0.1.2-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "mdurl==0.1.2", + "sha256": "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", + "urls": [ + "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl" + ] + } + }, + "dev_pip_313_myst_parser_py3_none_any_b9317997": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "myst_parser-4.0.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "myst-parser==4.0.0", + "sha256": "b9317997552424448c6096c2558872fdb6f81d3ecb3a40ce84a7518798f3f28d", + "urls": [ + "https://files.pythonhosted.org/packages/ca/b4/b036f8fdb667587bb37df29dc6644681dd78b7a2a6321a34684b79412b28/myst_parser-4.0.0-py3-none-any.whl" + ] + } + }, + "dev_pip_313_packaging_py3_none_any_29572ef2": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "packaging-25.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "packaging==25.0", + "sha256": "29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "urls": [ + "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl" + ] + } + }, + "dev_pip_313_pygments_py3_none_any_9ea1544a": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "pygments-2.19.1-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "pygments==2.19.1", + "sha256": "9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", + "urls": [ + "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl" + ] + } + }, + "dev_pip_313_pyyaml_cp313_cp313_macosx_10_13_x86_64_efdca563": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "pyyaml==6.0.2", + "sha256": "efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", + "urls": [ + "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl" + ] + } + }, + "dev_pip_313_pyyaml_cp313_cp313_macosx_11_0_arm64_50187695": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "pyyaml==6.0.2", + "sha256": "50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", + "urls": [ + "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl" + ] + } + }, + "dev_pip_313_pyyaml_cp313_cp313_manylinux_2_17_aarch64_0ffe8360": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "pyyaml==6.0.2", + "sha256": "0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", + "urls": [ + "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "dev_pip_313_pyyaml_cp313_cp313_manylinux_2_17_s390x_17e311b6": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "pyyaml==6.0.2", + "sha256": "17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", + "urls": [ + "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl" + ] + } + }, + "dev_pip_313_pyyaml_cp313_cp313_manylinux_2_17_x86_64_70b18959": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "pyyaml==6.0.2", + "sha256": "70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", + "urls": [ + "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "dev_pip_313_pyyaml_cp313_cp313_musllinux_1_1_aarch64_41e4e395": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "pyyaml==6.0.2", + "sha256": "41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", + "urls": [ + "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl" + ] + } + }, + "dev_pip_313_pyyaml_cp313_cp313_musllinux_1_1_x86_64_68ccc602": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "pyyaml==6.0.2", + "sha256": "68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", + "urls": [ + "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl" + ] + } + }, + "dev_pip_313_pyyaml_cp313_cp313_win_amd64_8388ee19": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "pyyaml==6.0.2", + "sha256": "8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", + "urls": [ + "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl" + ] + } + }, + "dev_pip_313_readthedocs_sphinx_ext_py2_none_any_f8c56184": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "readthedocs_sphinx_ext-2.2.5-py2.py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "readthedocs-sphinx-ext==2.2.5", + "sha256": "f8c56184ea011c972dd45a90122568587cc85b0127bc9cf064d17c68bc809daa", + "urls": [ + "https://files.pythonhosted.org/packages/64/71/c89e7709a0d4f93af1848e9855112299a820b470d84f917b4dd5998bdd07/readthedocs_sphinx_ext-2.2.5-py2.py3-none-any.whl" + ] + } + }, + "dev_pip_313_requests_py3_none_any_70761cfe": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "requests-2.32.3-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "requests==2.32.3", + "sha256": "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", + "urls": [ + "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl" + ] + } + }, + "dev_pip_313_snowballstemmer_py2_none_any_c8e1716e": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "snowballstemmer-2.2.0-py2.py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "snowballstemmer==2.2.0", + "sha256": "c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", + "urls": [ + "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl" + ] + } + }, + "dev_pip_313_sphinx_autodoc2_py3_none_any_e867013b": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinx_autodoc2-0.5.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "sphinx-autodoc2==0.5.0", + "sha256": "e867013b1512f9d6d7e6f6799f8b537d6884462acd118ef361f3f619a60b5c9e", + "urls": [ + "https://files.pythonhosted.org/packages/19/e6/48d47961bbdae755ba9c17dfc65d89356312c67668dcb36c87cfadfa1964/sphinx_autodoc2-0.5.0-py3-none-any.whl" + ] + } + }, + "dev_pip_313_sphinx_py3_none_any_09719015": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinx-8.1.3-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "sphinx==8.1.3", + "sha256": "09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", + "urls": [ + "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl" + ] + } + }, + "dev_pip_313_sphinx_reredirects_py3_none_any_efd50c76": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinx_reredirects-0.1.6-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "sphinx-reredirects==0.1.6", + "sha256": "efd50c766fbc5bf40cd5148e10c00f2c00d143027de5c5e48beece93cc40eeea", + "urls": [ + "https://files.pythonhosted.org/packages/ac/6f/0b3625be30a1a50f9e4c2cb2ec147b08f15ed0e9f8444efcf274b751300b/sphinx_reredirects-0.1.6-py3-none-any.whl" + ] + } + }, + "dev_pip_313_sphinx_rtd_theme_py2_none_any_422ccc75": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "sphinx-rtd-theme==3.0.2", + "sha256": "422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13", + "urls": [ + "https://files.pythonhosted.org/packages/85/77/46e3bac77b82b4df5bb5b61f2de98637724f246b4966cfc34bc5895d852a/sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl" + ] + } + }, + "dev_pip_313_sphinxcontrib_applehelp_py3_none_any_4cd3f0ec": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "sphinxcontrib-applehelp==2.0.0", + "sha256": "4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", + "urls": [ + "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl" + ] + } + }, + "dev_pip_313_sphinxcontrib_devhelp_py3_none_any_aefb8b83": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "sphinxcontrib-devhelp==2.0.0", + "sha256": "aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", + "urls": [ + "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl" + ] + } + }, + "dev_pip_313_sphinxcontrib_htmlhelp_py3_none_any_16675982": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "sphinxcontrib-htmlhelp==2.1.0", + "sha256": "166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", + "urls": [ + "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl" + ] + } + }, + "dev_pip_313_sphinxcontrib_jquery_py2_none_any_f936030d": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "sphinxcontrib-jquery==4.1", + "sha256": "f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae", + "urls": [ + "https://files.pythonhosted.org/packages/76/85/749bd22d1a68db7291c89e2ebca53f4306c3f205853cf31e9de279034c3c/sphinxcontrib_jquery-4.1-py2.py3-none-any.whl" + ] + } + }, + "dev_pip_313_sphinxcontrib_jsmath_py2_none_any_2ec2eaeb": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "sphinxcontrib-jsmath==1.0.1", + "sha256": "2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", + "urls": [ + "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl" + ] + } + }, + "dev_pip_313_sphinxcontrib_qthelp_py3_none_any_b18a828c": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "sphinxcontrib-qthelp==2.0.0", + "sha256": "b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", + "urls": [ + "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl" + ] + } + }, + "dev_pip_313_sphinxcontrib_serializinghtml_py3_none_any_6e2cb0ee": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "sphinxcontrib-serializinghtml==2.0.0", + "sha256": "6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", + "urls": [ + "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl" + ] + } + }, + "dev_pip_313_typing_extensions_py3_none_any_a439e7c0": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "typing_extensions-4.13.2-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "typing-extensions==4.13.2", + "sha256": "a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", + "urls": [ + "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl" + ] + } + }, + "dev_pip_313_urllib3_py3_none_any_4e166650": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@dev_pip//{name}:{target}", + "filename": "urllib3-2.4.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_13_host//:python", + "requirement": "urllib3==2.4.0", + "sha256": "4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", + "urls": [ + "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl" + ] + } + }, + "pip_deps_310_numpy": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@+python+python_3_10_host//:python", + "requirement": "numpy<=1.26.1" + } + }, + "pip_deps_310_setuptools": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@+python+python_3_10_host//:python", + "requirement": "setuptools<=70.3.0" + } + }, + "pip_deps_311_numpy": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "numpy<=1.26.1" + } + }, + "pip_deps_311_setuptools": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "setuptools<=70.3.0" + } + }, + "pip_deps_312_numpy": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@+python+python_3_12_host//:python", + "requirement": "numpy<=1.26.1" + } + }, + "pip_deps_312_setuptools": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@+python+python_3_12_host//:python", + "requirement": "setuptools<=70.3.0" + } + }, + "pip_deps_38_numpy": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@+python+python_3_8_host//:python", + "requirement": "numpy<=1.26.1" + } + }, + "pip_deps_38_setuptools": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@+python+python_3_8_host//:python", + "requirement": "setuptools<=70.3.0" + } + }, + "pip_deps_39_numpy": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@+python+python_3_9_host//:python", + "requirement": "numpy<=1.26.1" + } + }, + "pip_deps_39_setuptools": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@pip_deps//{name}:{target}", + "python_interpreter_target": "@@+python+python_3_9_host//:python", + "requirement": "setuptools<=70.3.0" + } + }, + "pypiserver_311_pip_py3_none_any_ba0d021a": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@pypiserver//{name}:{target}", + "filename": "pip-24.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "pip==24.0", + "sha256": "ba0d021a166865d2265246961bec0152ff124de910c5cc39f1156ce3fa7c69dc", + "urls": [ + "https://files.pythonhosted.org/packages/8a/6a/19e9fe04fca059ccf770861c7d5721ab4c2aebc539889e97c7977528a53b/pip-24.0-py3-none-any.whl" + ] + } + }, + "pypiserver_311_pypiserver_py2_none_any_1dd98fb9": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@pypiserver//{name}:{target}", + "filename": "pypiserver-2.0.1-py2.py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "pypiserver==2.0.1", + "sha256": "1dd98fb99d2da4199fb44c7284e57d69a9f7fda2c6c8dc01975c151c592677bf", + "urls": [ + "https://files.pythonhosted.org/packages/34/95/6c70e2f7e8375354fd7b1db08405c93674f2e4ce4e714f379fadd06a92b1/pypiserver-2.0.1-py2.py3-none-any.whl" + ] + } + }, + "rules_fuzzing_py_deps_310_absl_py": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@+python+python_3_10_host//:python", + "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" + } + }, + "rules_fuzzing_py_deps_310_six": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@+python+python_3_10_host//:python", + "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + } + }, + "rules_fuzzing_py_deps_311_absl_py": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" + } + }, + "rules_fuzzing_py_deps_311_six": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + } + }, + "rules_fuzzing_py_deps_312_absl_py": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@+python+python_3_12_host//:python", + "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" + } + }, + "rules_fuzzing_py_deps_312_six": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@+python+python_3_12_host//:python", + "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + } + }, + "rules_fuzzing_py_deps_38_absl_py": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@+python+python_3_8_host//:python", + "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" + } + }, + "rules_fuzzing_py_deps_38_six": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@+python+python_3_8_host//:python", + "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + } + }, + "rules_fuzzing_py_deps_39_absl_py": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@+python+python_3_9_host//:python", + "requirement": "absl-py==2.0.0 --hash=sha256:9a28abb62774ae4e8edbe2dd4c49ffcd45a6a848952a5eccc6a49f3f0fc1e2f3" + } + }, + "rules_fuzzing_py_deps_39_six": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_fuzzing_py_deps//{name}:{target}", + "extra_pip_args": [ + "--require-hashes" + ], + "python_interpreter_target": "@@+python+python_3_9_host//:python", + "requirement": "six==1.16.0 --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + } + }, + "rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "backports.tarfile-1.2.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "backports-tarfile==1.2.0", + "sha256": "77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", + "urls": [ + "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "backports_tarfile-1.2.0.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "backports-tarfile==1.2.0", + "sha256": "d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", + "urls": [ + "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_certifi_py3_none_any_ca78db45": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "certifi-2025.1.31-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "certifi==2025.1.31", + "sha256": "ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", + "urls": [ + "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_certifi_sdist_3d5da692": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "certifi-2025.1.31.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "certifi==2025.1.31", + "sha256": "3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", + "urls": [ + "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_8bfa33f4": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", + "urls": [ + "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_28bf5762": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", + "urls": [ + "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_f08ff5e9": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", + "urls": [ + "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_234ac59e": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", + "urls": [ + "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_fd4ec41f": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", + "urls": [ + "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_c96836c9": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", + "urls": [ + "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_09b5e673": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", + "urls": [ + "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_5777ee08": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", + "urls": [ + "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_237bdbe6": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", + "urls": [ + "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_d7f50a1f": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", + "urls": [ + "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_py3_none_any_d98b1668": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "charset_normalizer-3.4.1-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", + "urls": [ + "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_charset_normalizer_sdist_44251f18": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "charset_normalizer-3.4.1.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "charset-normalizer==3.4.1", + "sha256": "44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", + "urls": [ + "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_docutils_py3_none_any_dafca5b9": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "docutils-0.21.2-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "docutils==0.21.2", + "sha256": "dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", + "urls": [ + "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_docutils_sdist_3a6b1873": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "docutils-0.21.2.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "docutils==0.21.2", + "sha256": "3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", + "urls": [ + "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_idna_py3_none_any_946d195a": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "idna-3.10-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "idna==3.10", + "sha256": "946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", + "urls": [ + "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_idna_sdist_12f65c9b": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "idna-3.10.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "idna==3.10", + "sha256": "12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", + "urls": [ + "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_importlib_metadata_py3_none_any_45e54197": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "importlib_metadata-8.5.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "importlib-metadata==8.5.0", + "sha256": "45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b", + "urls": [ + "https://files.pythonhosted.org/packages/a0/d9/a1e041c5e7caa9a05c925f4bdbdfb7f006d1f74996af53467bc394c97be7/importlib_metadata-8.5.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_importlib_metadata_sdist_71522656": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "importlib_metadata-8.5.0.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "importlib-metadata==8.5.0", + "sha256": "71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7", + "urls": [ + "https://files.pythonhosted.org/packages/cd/12/33e59336dca5be0c398a7482335911a33aa0e20776128f038019f1a95f1b/importlib_metadata-8.5.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "jaraco.classes-3.4.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "jaraco-classes==3.4.0", + "sha256": "f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", + "urls": [ + "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "jaraco.classes-3.4.0.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "jaraco-classes==3.4.0", + "sha256": "47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", + "urls": [ + "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "jaraco.context-6.0.1-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "jaraco-context==6.0.1", + "sha256": "f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", + "urls": [ + "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "jaraco_context-6.0.1.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "jaraco-context==6.0.1", + "sha256": "9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", + "urls": [ + "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "jaraco.functools-4.1.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "jaraco-functools==4.1.0", + "sha256": "ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649", + "urls": [ + "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "jaraco_functools-4.1.0.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "jaraco-functools==4.1.0", + "sha256": "70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d", + "urls": [ + "https://files.pythonhosted.org/packages/ab/23/9894b3df5d0a6eb44611c36aec777823fc2e07740dabbd0b810e19594013/jaraco_functools-4.1.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_keyring_py3_none_any_e67f8ac3": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "keyring-25.5.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "keyring==25.5.0", + "sha256": "e67f8ac32b04be4714b42fe84ce7dad9c40985b9ca827c592cc303e7c26d9741", + "urls": [ + "https://files.pythonhosted.org/packages/32/c9/353c156fa2f057e669106e5d6bcdecf85ef8d3536ce68ca96f18dc7b6d6f/keyring-25.5.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_keyring_sdist_4c753b3e": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "keyring-25.5.0.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "keyring==25.5.0", + "sha256": "4c753b3ec91717fe713c4edd522d625889d8973a349b0e582622f49766de58e6", + "urls": [ + "https://files.pythonhosted.org/packages/f6/24/64447b13df6a0e2797b586dad715766d756c932ce8ace7f67bd384d76ae0/keyring-25.5.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "markdown_it_py-3.0.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "markdown-it-py==3.0.0", + "sha256": "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", + "urls": [ + "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "markdown-it-py-3.0.0.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "markdown-it-py==3.0.0", + "sha256": "e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", + "urls": [ + "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_mdurl_py3_none_any_84008a41": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "mdurl-0.1.2-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "mdurl==0.1.2", + "sha256": "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", + "urls": [ + "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_mdurl_sdist_bb413d29": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "mdurl-0.1.2.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "mdurl==0.1.2", + "sha256": "bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", + "urls": [ + "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_more_itertools_py3_none_any_d4398038": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "more_itertools-10.7.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "more-itertools==10.7.0", + "sha256": "d43980384673cb07d2f7d2d918c616b30c659c089ee23953f601d6609c67510e", + "urls": [ + "https://files.pythonhosted.org/packages/2b/9f/7ba6f94fc1e9ac3d2b853fdff3035fb2fa5afbed898c4a72b8a020610594/more_itertools-10.7.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_more_itertools_sdist_9fddd540": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "more_itertools-10.7.0.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "more-itertools==10.7.0", + "sha256": "9fddd5403be01a94b204faadcff459ec3568cf110265d3c54323e1e866ad29d3", + "urls": [ + "https://files.pythonhosted.org/packages/ce/a0/834b0cebabbfc7e311f30b46c8188790a37f89fc8d756660346fe5abfd09/more_itertools-10.7.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "nh3==0.2.18", + "sha256": "14c5a72e9fe82aea5fe3072116ad4661af5cf8e8ff8fc5ad3450f123e4925e86", + "urls": [ + "https://files.pythonhosted.org/packages/b3/89/1daff5d9ba5a95a157c092c7c5f39b8dd2b1ddb4559966f808d31cfb67e0/nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "nh3==0.2.18", + "sha256": "7b7c2a3c9eb1a827d42539aa64091640bd275b81e097cd1d8d82ef91ffa2e811", + "urls": [ + "https://files.pythonhosted.org/packages/2c/b6/42fc3c69cabf86b6b81e4c051a9b6e249c5ba9f8155590222c2622961f58/nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "nh3==0.2.18", + "sha256": "42c64511469005058cd17cc1537578eac40ae9f7200bedcfd1fc1a05f4f8c200", + "urls": [ + "https://files.pythonhosted.org/packages/45/b9/833f385403abaf0023c6547389ec7a7acf141ddd9d1f21573723a6eab39a/nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "nh3==0.2.18", + "sha256": "34c03fa78e328c691f982b7c03d4423bdfd7da69cd707fe572f544cf74ac23ad", + "urls": [ + "https://files.pythonhosted.org/packages/ab/a7/375afcc710dbe2d64cfbd69e31f82f3e423d43737258af01f6a56d844085/nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "nh3==0.2.18", + "sha256": "19aaba96e0f795bd0a6c56291495ff59364f4300d4a39b29a0abc9cb3774a84b", + "urls": [ + "https://files.pythonhosted.org/packages/c2/a8/3bb02d0c60a03ad3a112b76c46971e9480efa98a8946677b5a59f60130ca/nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "nh3==0.2.18", + "sha256": "de3ceed6e661954871d6cd78b410213bdcb136f79aafe22aa7182e028b8c7307", + "urls": [ + "https://files.pythonhosted.org/packages/1b/63/6ab90d0e5225ab9780f6c9fb52254fa36b52bb7c188df9201d05b647e5e1/nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "nh3==0.2.18", + "sha256": "f0eca9ca8628dbb4e916ae2491d72957fdd35f7a5d326b7032a345f111ac07fe", + "urls": [ + "https://files.pythonhosted.org/packages/a3/da/0c4e282bc3cff4a0adf37005fa1fb42257673fbc1bbf7d1ff639ec3d255a/nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "nh3==0.2.18", + "sha256": "36c95d4b70530b320b365659bb5034341316e6a9b30f0b25fa9c9eff4c27a204", + "urls": [ + "https://files.pythonhosted.org/packages/eb/61/73a007c74c37895fdf66e0edcd881f5eaa17a348ff02f4bb4bc906d61085/nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "nh3-0.2.18-cp37-abi3-win_amd64.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "nh3==0.2.18", + "sha256": "8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844", + "urls": [ + "https://files.pythonhosted.org/packages/26/8d/53c5b19c4999bdc6ba95f246f4ef35ca83d7d7423e5e38be43ad66544e5d/nh3-0.2.18-cp37-abi3-win_amd64.whl" + ] + } + }, + "rules_python_publish_deps_311_nh3_sdist_94a16692": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "nh3-0.2.18.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "nh3==0.2.18", + "sha256": "94a166927e53972a9698af9542ace4e38b9de50c34352b962f4d9a7d4c927af4", + "urls": [ + "https://files.pythonhosted.org/packages/62/73/10df50b42ddb547a907deeb2f3c9823022580a7a47281e8eae8e003a9639/nh3-0.2.18.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "pkginfo-1.10.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "pkginfo==1.10.0", + "sha256": "889a6da2ed7ffc58ab5b900d888ddce90bce912f2d2de1dc1c26f4cb9fe65097", + "urls": [ + "https://files.pythonhosted.org/packages/56/09/054aea9b7534a15ad38a363a2bd974c20646ab1582a387a95b8df1bfea1c/pkginfo-1.10.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_pkginfo_sdist_5df73835": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "pkginfo-1.10.0.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "pkginfo==1.10.0", + "sha256": "5df73835398d10db79f8eecd5cd86b1f6d29317589ea70796994d49399af6297", + "urls": [ + "https://files.pythonhosted.org/packages/2f/72/347ec5be4adc85c182ed2823d8d1c7b51e13b9a6b0c1aae59582eca652df/pkginfo-1.10.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "pygments-2.18.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "pygments==2.18.0", + "sha256": "b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a", + "urls": [ + "https://files.pythonhosted.org/packages/f7/3f/01c8b82017c199075f8f788d0d906b9ffbbc5a47dc9918a945e13d5a2bda/pygments-2.18.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_pygments_sdist_786ff802": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "pygments-2.18.0.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "pygments==2.18.0", + "sha256": "786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", + "urls": [ + "https://files.pythonhosted.org/packages/8e/62/8336eff65bcbc8e4cb5d05b55faf041285951b6e80f33e2bff2024788f31/pygments-2.18.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "readme_renderer-44.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "readme-renderer==44.0", + "sha256": "2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151", + "urls": [ + "https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_readme_renderer_sdist_8712034e": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "readme_renderer-44.0.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "readme-renderer==44.0", + "sha256": "8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1", + "urls": [ + "https://files.pythonhosted.org/packages/5a/a9/104ec9234c8448c4379768221ea6df01260cd6c2ce13182d4eac531c8342/readme_renderer-44.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_requests_py3_none_any_70761cfe": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "requests-2.32.3-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "requests==2.32.3", + "sha256": "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", + "urls": [ + "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_requests_sdist_55365417": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "requests-2.32.3.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "requests==2.32.3", + "sha256": "55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", + "urls": [ + "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "requests_toolbelt-1.0.0-py2.py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "requests-toolbelt==1.0.0", + "sha256": "cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", + "urls": [ + "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "requests-toolbelt-1.0.0.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "requests-toolbelt==1.0.0", + "sha256": "7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", + "urls": [ + "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_rfc3986_py2_none_any_50b1502b": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "rfc3986-2.0.0-py2.py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "rfc3986==2.0.0", + "sha256": "50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", + "urls": [ + "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_rfc3986_sdist_97aacf9d": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "rfc3986-2.0.0.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "rfc3986==2.0.0", + "sha256": "97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", + "urls": [ + "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_rich_py3_none_any_6049d5e6": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "rich-13.9.4-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "rich==13.9.4", + "sha256": "6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", + "urls": [ + "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_rich_sdist_43959497": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "rich-13.9.4.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "rich==13.9.4", + "sha256": "439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", + "urls": [ + "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_twine_py3_none_any_215dbe7b": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "twine-5.1.1-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "twine==5.1.1", + "sha256": "215dbe7b4b94c2c50a7315c0275d2258399280fbb7d04182c7e55e24b5f93997", + "urls": [ + "https://files.pythonhosted.org/packages/5d/ec/00f9d5fd040ae29867355e559a94e9a8429225a0284a3f5f091a3878bfc0/twine-5.1.1-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_twine_sdist_9aa08251": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "twine-5.1.1.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "twine==5.1.1", + "sha256": "9aa0825139c02b3434d913545c7b847a21c835e11597f5255842d457da2322db", + "urls": [ + "https://files.pythonhosted.org/packages/77/68/bd982e5e949ef8334e6f7dcf76ae40922a8750aa2e347291ae1477a4782b/twine-5.1.1.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_urllib3_py3_none_any_4e166650": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "urllib3-2.4.0-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "urllib3==2.4.0", + "sha256": "4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", + "urls": [ + "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_urllib3_sdist_414bc653": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "urllib3-2.4.0.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "urllib3==2.4.0", + "sha256": "414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", + "urls": [ + "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz" + ] + } + }, + "rules_python_publish_deps_311_zipp_py3_none_any_a817ac80": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "filename": "zipp-3.20.2-py3-none-any.whl", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "zipp==3.20.2", + "sha256": "a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", + "urls": [ + "https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl" + ] + } + }, + "rules_python_publish_deps_311_zipp_sdist_bc9eb26f": { + "repoRuleId": "@@//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@rules_python_publish_deps//{name}:{target}", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple" + ], + "filename": "zipp-3.20.2.tar.gz", + "python_interpreter_target": "@@+python+python_3_11_host//:python", + "requirement": "zipp==3.20.2", + "sha256": "bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29", + "urls": [ + "https://files.pythonhosted.org/packages/54/bf/5c0000c44ebc80123ecbdddba1f5dcd94a5ada602a9c225d84b5aaa55e86/zipp-3.20.2.tar.gz" + ] + } + }, + "dev_pip": { + "repoRuleId": "@@//python/private/pypi:hub_repository.bzl%hub_repository", + "attributes": { + "repo_name": "dev_pip", + "extra_hub_aliases": {}, + "whl_map": { + "absl_py": "{\"dev_pip_311_absl_py_py3_none_any_e5797bc6\":[{\"filename\":\"absl_py-2.2.2-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_absl_py_py3_none_any_e5797bc6\":[{\"filename\":\"absl_py-2.2.2-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "alabaster": "{\"dev_pip_311_alabaster_py3_none_any_fc678640\":[{\"filename\":\"alabaster-1.0.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_alabaster_py3_none_any_fc678640\":[{\"filename\":\"alabaster-1.0.0-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "astroid": "{\"dev_pip_311_astroid_py3_none_any_d05bfd0a\":[{\"filename\":\"astroid-3.3.9-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_astroid_py3_none_any_d05bfd0a\":[{\"filename\":\"astroid-3.3.9-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "babel": "{\"dev_pip_311_babel_py3_none_any_4d0b5309\":[{\"filename\":\"babel-2.17.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_babel_py3_none_any_4d0b5309\":[{\"filename\":\"babel-2.17.0-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "certifi": "{\"dev_pip_311_certifi_py3_none_any_ca78db45\":[{\"filename\":\"certifi-2025.1.31-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_certifi_py3_none_any_ca78db45\":[{\"filename\":\"certifi-2025.1.31-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "charset_normalizer": "{\"dev_pip_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_8bfa33f4\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl\",\"version\":\"3.11\"}],\"dev_pip_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_28bf5762\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"dev_pip_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_f08ff5e9\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"version\":\"3.11\"}],\"dev_pip_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_234ac59e\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"version\":\"3.11\"}],\"dev_pip_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_fd4ec41f\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"dev_pip_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_c96836c9\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"dev_pip_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_09b5e673\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl\",\"version\":\"3.11\"}],\"dev_pip_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_5777ee08\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl\",\"version\":\"3.11\"}],\"dev_pip_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_237bdbe6\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"dev_pip_311_charset_normalizer_cp311_cp311_win_amd64_d7f50a1f\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"dev_pip_311_charset_normalizer_py3_none_any_d98b1668\":[{\"filename\":\"charset_normalizer-3.4.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_charset_normalizer_cp313_cp313_macosx_10_13_universal2_aabfa34b\":[{\"filename\":\"charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl\",\"version\":\"3.13\"}],\"dev_pip_313_charset_normalizer_cp313_cp313_manylinux_2_17_aarch64_22e14b5d\":[{\"filename\":\"charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_charset_normalizer_cp313_cp313_manylinux_2_17_ppc64le_8436c508\":[{\"filename\":\"charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"version\":\"3.13\"}],\"dev_pip_313_charset_normalizer_cp313_cp313_manylinux_2_17_s390x_2d074908\":[{\"filename\":\"charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"version\":\"3.13\"}],\"dev_pip_313_charset_normalizer_cp313_cp313_manylinux_2_17_x86_64_955f8851\":[{\"filename\":\"charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_charset_normalizer_cp313_cp313_musllinux_1_2_aarch64_0924e81d\":[{\"filename\":\"charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_charset_normalizer_cp313_cp313_musllinux_1_2_ppc64le_c75cb2a3\":[{\"filename\":\"charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl\",\"version\":\"3.13\"}],\"dev_pip_313_charset_normalizer_cp313_cp313_musllinux_1_2_s390x_09b26ae6\":[{\"filename\":\"charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl\",\"version\":\"3.13\"}],\"dev_pip_313_charset_normalizer_cp313_cp313_musllinux_1_2_x86_64_fa88b843\":[{\"filename\":\"charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_charset_normalizer_cp313_cp313_win_amd64_b1ac5992\":[{\"filename\":\"charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_charset_normalizer_py3_none_any_d98b1668\":[{\"filename\":\"charset_normalizer-3.4.1-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "colorama": "{\"dev_pip_311_colorama_py2_none_any_4f1d9991\":[{\"filename\":\"colorama-0.4.6-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_colorama_py2_none_any_4f1d9991\":[{\"filename\":\"colorama-0.4.6-py2.py3-none-any.whl\",\"version\":\"3.13\"}]}", + "docutils": "{\"dev_pip_311_docutils_py3_none_any_dafca5b9\":[{\"filename\":\"docutils-0.21.2-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_docutils_py3_none_any_dafca5b9\":[{\"filename\":\"docutils-0.21.2-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "idna": "{\"dev_pip_311_idna_py3_none_any_946d195a\":[{\"filename\":\"idna-3.10-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_idna_py3_none_any_946d195a\":[{\"filename\":\"idna-3.10-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "imagesize": "{\"dev_pip_311_imagesize_py2_none_any_0d8d18d0\":[{\"filename\":\"imagesize-1.4.1-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_imagesize_py2_none_any_0d8d18d0\":[{\"filename\":\"imagesize-1.4.1-py2.py3-none-any.whl\",\"version\":\"3.13\"}]}", + "jinja2": "{\"dev_pip_311_jinja2_py3_none_any_85ece445\":[{\"filename\":\"jinja2-3.1.6-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_jinja2_py3_none_any_85ece445\":[{\"filename\":\"jinja2-3.1.6-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "markdown_it_py": "{\"dev_pip_311_markdown_it_py_py3_none_any_35521684\":[{\"filename\":\"markdown_it_py-3.0.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_markdown_it_py_py3_none_any_35521684\":[{\"filename\":\"markdown_it_py-3.0.0-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "markupsafe": "{\"dev_pip_311_markupsafe_cp311_cp311_macosx_10_9_universal2_9025b401\":[{\"filename\":\"MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl\",\"version\":\"3.11\"}],\"dev_pip_311_markupsafe_cp311_cp311_macosx_11_0_arm64_93335ca3\":[{\"filename\":\"MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"dev_pip_311_markupsafe_cp311_cp311_manylinux_2_17_aarch64_2cb8438c\":[{\"filename\":\"MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"dev_pip_311_markupsafe_cp311_cp311_manylinux_2_17_x86_64_a123e330\":[{\"filename\":\"MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"dev_pip_311_markupsafe_cp311_cp311_musllinux_1_2_aarch64_d8213e09\":[{\"filename\":\"MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"dev_pip_311_markupsafe_cp311_cp311_musllinux_1_2_x86_64_0bff5e0a\":[{\"filename\":\"MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"dev_pip_311_markupsafe_cp311_cp311_win_amd64_70a87b41\":[{\"filename\":\"MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"dev_pip_313_markupsafe_cp313_cp313_macosx_10_13_universal2_ba9527cd\":[{\"filename\":\"MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl\",\"version\":\"3.13\"}],\"dev_pip_313_markupsafe_cp313_cp313_macosx_11_0_arm64_f8b3d067\":[{\"filename\":\"MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_markupsafe_cp313_cp313_manylinux_2_17_aarch64_569511d3\":[{\"filename\":\"MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_markupsafe_cp313_cp313_manylinux_2_17_x86_64_15ab75ef\":[{\"filename\":\"MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_markupsafe_cp313_cp313_musllinux_1_2_aarch64_cdb82a87\":[{\"filename\":\"MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_markupsafe_cp313_cp313_musllinux_1_2_x86_64_444dcda7\":[{\"filename\":\"MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_markupsafe_cp313_cp313_win_amd64_e6a2a455\":[{\"filename\":\"MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_markupsafe_cp313_cp313t_macosx_10_13_universal2_b5a6b3ad\":[{\"filename\":\"MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl\",\"version\":\"3.13\"}],\"dev_pip_313_markupsafe_cp313_cp313t_macosx_11_0_arm64_a904af0a\":[{\"filename\":\"MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_markupsafe_cp313_cp313t_manylinux_2_17_aarch64_4aa4e5fa\":[{\"filename\":\"MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_markupsafe_cp313_cp313t_manylinux_2_17_x86_64_c0ef13ea\":[{\"filename\":\"MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_markupsafe_cp313_cp313t_musllinux_1_2_aarch64_6381026f\":[{\"filename\":\"MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_markupsafe_cp313_cp313t_musllinux_1_2_x86_64_131a3c76\":[{\"filename\":\"MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_markupsafe_cp313_cp313t_win_amd64_e444a31f\":[{\"filename\":\"MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl\",\"version\":\"3.13\"}]}", + "mdit_py_plugins": "{\"dev_pip_311_mdit_py_plugins_py3_none_any_0c673c3f\":[{\"filename\":\"mdit_py_plugins-0.4.2-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_mdit_py_plugins_py3_none_any_0c673c3f\":[{\"filename\":\"mdit_py_plugins-0.4.2-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "mdurl": "{\"dev_pip_311_mdurl_py3_none_any_84008a41\":[{\"filename\":\"mdurl-0.1.2-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_mdurl_py3_none_any_84008a41\":[{\"filename\":\"mdurl-0.1.2-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "myst_parser": "{\"dev_pip_311_myst_parser_py3_none_any_b9317997\":[{\"filename\":\"myst_parser-4.0.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_myst_parser_py3_none_any_b9317997\":[{\"filename\":\"myst_parser-4.0.0-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "packaging": "{\"dev_pip_311_packaging_py3_none_any_29572ef2\":[{\"filename\":\"packaging-25.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_packaging_py3_none_any_29572ef2\":[{\"filename\":\"packaging-25.0-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "pygments": "{\"dev_pip_311_pygments_py3_none_any_9ea1544a\":[{\"filename\":\"pygments-2.19.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_pygments_py3_none_any_9ea1544a\":[{\"filename\":\"pygments-2.19.1-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "pyyaml": "{\"dev_pip_311_pyyaml_cp311_cp311_macosx_10_9_x86_64_cc1c1159\":[{\"filename\":\"PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl\",\"version\":\"3.11\"}],\"dev_pip_311_pyyaml_cp311_cp311_macosx_11_0_arm64_1e2120ef\":[{\"filename\":\"PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"dev_pip_311_pyyaml_cp311_cp311_manylinux_2_17_aarch64_5d225db5\":[{\"filename\":\"PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"dev_pip_311_pyyaml_cp311_cp311_manylinux_2_17_s390x_5ac9328e\":[{\"filename\":\"PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"version\":\"3.11\"}],\"dev_pip_311_pyyaml_cp311_cp311_manylinux_2_17_x86_64_3ad2a3de\":[{\"filename\":\"PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"dev_pip_311_pyyaml_cp311_cp311_musllinux_1_1_aarch64_ff3824dc\":[{\"filename\":\"PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl\",\"version\":\"3.11\"}],\"dev_pip_311_pyyaml_cp311_cp311_musllinux_1_1_x86_64_797b4f72\":[{\"filename\":\"PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl\",\"version\":\"3.11\"}],\"dev_pip_311_pyyaml_cp311_cp311_win_amd64_e10ce637\":[{\"filename\":\"PyYAML-6.0.2-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"dev_pip_313_pyyaml_cp313_cp313_macosx_10_13_x86_64_efdca563\":[{\"filename\":\"PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_pyyaml_cp313_cp313_macosx_11_0_arm64_50187695\":[{\"filename\":\"PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_pyyaml_cp313_cp313_manylinux_2_17_aarch64_0ffe8360\":[{\"filename\":\"PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_pyyaml_cp313_cp313_manylinux_2_17_s390x_17e311b6\":[{\"filename\":\"PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"version\":\"3.13\"}],\"dev_pip_313_pyyaml_cp313_cp313_manylinux_2_17_x86_64_70b18959\":[{\"filename\":\"PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_pyyaml_cp313_cp313_musllinux_1_1_aarch64_41e4e395\":[{\"filename\":\"PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_pyyaml_cp313_cp313_musllinux_1_1_x86_64_68ccc602\":[{\"filename\":\"PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl\",\"version\":\"3.13\"}],\"dev_pip_313_pyyaml_cp313_cp313_win_amd64_8388ee19\":[{\"filename\":\"PyYAML-6.0.2-cp313-cp313-win_amd64.whl\",\"version\":\"3.13\"}]}", + "readthedocs_sphinx_ext": "{\"dev_pip_311_readthedocs_sphinx_ext_py2_none_any_f8c56184\":[{\"filename\":\"readthedocs_sphinx_ext-2.2.5-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_readthedocs_sphinx_ext_py2_none_any_f8c56184\":[{\"filename\":\"readthedocs_sphinx_ext-2.2.5-py2.py3-none-any.whl\",\"version\":\"3.13\"}]}", + "requests": "{\"dev_pip_311_requests_py3_none_any_70761cfe\":[{\"filename\":\"requests-2.32.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_requests_py3_none_any_70761cfe\":[{\"filename\":\"requests-2.32.3-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "snowballstemmer": "{\"dev_pip_311_snowballstemmer_py2_none_any_c8e1716e\":[{\"filename\":\"snowballstemmer-2.2.0-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_snowballstemmer_py2_none_any_c8e1716e\":[{\"filename\":\"snowballstemmer-2.2.0-py2.py3-none-any.whl\",\"version\":\"3.13\"}]}", + "sphinx": "{\"dev_pip_311_sphinx_py3_none_any_09719015\":[{\"filename\":\"sphinx-8.1.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_sphinx_py3_none_any_09719015\":[{\"filename\":\"sphinx-8.1.3-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "sphinx_autodoc2": "{\"dev_pip_311_sphinx_autodoc2_py3_none_any_e867013b\":[{\"filename\":\"sphinx_autodoc2-0.5.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_sphinx_autodoc2_py3_none_any_e867013b\":[{\"filename\":\"sphinx_autodoc2-0.5.0-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "sphinx_reredirects": "{\"dev_pip_311_sphinx_reredirects_py3_none_any_efd50c76\":[{\"filename\":\"sphinx_reredirects-0.1.6-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_sphinx_reredirects_py3_none_any_efd50c76\":[{\"filename\":\"sphinx_reredirects-0.1.6-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "sphinx_rtd_theme": "{\"dev_pip_311_sphinx_rtd_theme_py2_none_any_422ccc75\":[{\"filename\":\"sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_sphinx_rtd_theme_py2_none_any_422ccc75\":[{\"filename\":\"sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl\",\"version\":\"3.13\"}]}", + "sphinxcontrib_applehelp": "{\"dev_pip_311_sphinxcontrib_applehelp_py3_none_any_4cd3f0ec\":[{\"filename\":\"sphinxcontrib_applehelp-2.0.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_sphinxcontrib_applehelp_py3_none_any_4cd3f0ec\":[{\"filename\":\"sphinxcontrib_applehelp-2.0.0-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "sphinxcontrib_devhelp": "{\"dev_pip_311_sphinxcontrib_devhelp_py3_none_any_aefb8b83\":[{\"filename\":\"sphinxcontrib_devhelp-2.0.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_sphinxcontrib_devhelp_py3_none_any_aefb8b83\":[{\"filename\":\"sphinxcontrib_devhelp-2.0.0-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "sphinxcontrib_htmlhelp": "{\"dev_pip_311_sphinxcontrib_htmlhelp_py3_none_any_16675982\":[{\"filename\":\"sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_sphinxcontrib_htmlhelp_py3_none_any_16675982\":[{\"filename\":\"sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "sphinxcontrib_jquery": "{\"dev_pip_311_sphinxcontrib_jquery_py2_none_any_f936030d\":[{\"filename\":\"sphinxcontrib_jquery-4.1-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_sphinxcontrib_jquery_py2_none_any_f936030d\":[{\"filename\":\"sphinxcontrib_jquery-4.1-py2.py3-none-any.whl\",\"version\":\"3.13\"}]}", + "sphinxcontrib_jsmath": "{\"dev_pip_311_sphinxcontrib_jsmath_py2_none_any_2ec2eaeb\":[{\"filename\":\"sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_sphinxcontrib_jsmath_py2_none_any_2ec2eaeb\":[{\"filename\":\"sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl\",\"version\":\"3.13\"}]}", + "sphinxcontrib_qthelp": "{\"dev_pip_311_sphinxcontrib_qthelp_py3_none_any_b18a828c\":[{\"filename\":\"sphinxcontrib_qthelp-2.0.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_sphinxcontrib_qthelp_py3_none_any_b18a828c\":[{\"filename\":\"sphinxcontrib_qthelp-2.0.0-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "sphinxcontrib_serializinghtml": "{\"dev_pip_311_sphinxcontrib_serializinghtml_py3_none_any_6e2cb0ee\":[{\"filename\":\"sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_sphinxcontrib_serializinghtml_py3_none_any_6e2cb0ee\":[{\"filename\":\"sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "typing_extensions": "{\"dev_pip_311_typing_extensions_py3_none_any_a439e7c0\":[{\"filename\":\"typing_extensions-4.13.2-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_typing_extensions_py3_none_any_a439e7c0\":[{\"filename\":\"typing_extensions-4.13.2-py3-none-any.whl\",\"version\":\"3.13\"}]}", + "urllib3": "{\"dev_pip_311_urllib3_py3_none_any_4e166650\":[{\"filename\":\"urllib3-2.4.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"dev_pip_313_urllib3_py3_none_any_4e166650\":[{\"filename\":\"urllib3-2.4.0-py3-none-any.whl\",\"version\":\"3.13\"}]}" + }, + "packages": [ + "absl_py", + "alabaster", + "astroid", + "babel", + "certifi", + "charset_normalizer", + "docutils", + "idna", + "imagesize", + "jinja2", + "markdown_it_py", + "markupsafe", + "mdit_py_plugins", + "mdurl", + "myst_parser", + "packaging", + "pygments", + "pyyaml", + "readthedocs_sphinx_ext", + "requests", + "snowballstemmer", + "sphinx", + "sphinx_autodoc2", + "sphinx_reredirects", + "sphinx_rtd_theme", + "sphinxcontrib_applehelp", + "sphinxcontrib_devhelp", + "sphinxcontrib_htmlhelp", + "sphinxcontrib_jquery", + "sphinxcontrib_jsmath", + "sphinxcontrib_qthelp", + "sphinxcontrib_serializinghtml", + "typing_extensions", + "urllib3" + ], + "groups": {} + } + }, + "pip_deps": { + "repoRuleId": "@@//python/private/pypi:hub_repository.bzl%hub_repository", + "attributes": { + "repo_name": "pip_deps", + "extra_hub_aliases": {}, + "whl_map": { + "numpy": "{\"pip_deps_310_numpy\":[{\"version\":\"3.10\"}],\"pip_deps_311_numpy\":[{\"version\":\"3.11\"}],\"pip_deps_312_numpy\":[{\"version\":\"3.12\"}],\"pip_deps_38_numpy\":[{\"version\":\"3.8\"}],\"pip_deps_39_numpy\":[{\"version\":\"3.9\"}]}", + "setuptools": "{\"pip_deps_310_setuptools\":[{\"version\":\"3.10\"}],\"pip_deps_311_setuptools\":[{\"version\":\"3.11\"}],\"pip_deps_312_setuptools\":[{\"version\":\"3.12\"}],\"pip_deps_38_setuptools\":[{\"version\":\"3.8\"}],\"pip_deps_39_setuptools\":[{\"version\":\"3.9\"}]}" + }, + "packages": [ + "numpy", + "setuptools" + ], + "groups": {} + } + }, + "pypiserver": { + "repoRuleId": "@@//python/private/pypi:hub_repository.bzl%hub_repository", + "attributes": { + "repo_name": "pypiserver", + "extra_hub_aliases": {}, + "whl_map": { + "pip": "{\"pypiserver_311_pip_py3_none_any_ba0d021a\":[{\"filename\":\"pip-24.0-py3-none-any.whl\",\"version\":\"3.11\"}]}", + "pypiserver": "{\"pypiserver_311_pypiserver_py2_none_any_1dd98fb9\":[{\"filename\":\"pypiserver-2.0.1-py2.py3-none-any.whl\",\"version\":\"3.11\"}]}" + }, + "packages": [ + "pip", + "pypiserver" + ], + "groups": {} + } + }, + "rules_fuzzing_py_deps": { + "repoRuleId": "@@//python/private/pypi:hub_repository.bzl%hub_repository", + "attributes": { + "repo_name": "rules_fuzzing_py_deps", + "extra_hub_aliases": {}, + "whl_map": { + "absl_py": "{\"rules_fuzzing_py_deps_310_absl_py\":[{\"version\":\"3.10\"}],\"rules_fuzzing_py_deps_311_absl_py\":[{\"version\":\"3.11\"}],\"rules_fuzzing_py_deps_312_absl_py\":[{\"version\":\"3.12\"}],\"rules_fuzzing_py_deps_38_absl_py\":[{\"version\":\"3.8\"}],\"rules_fuzzing_py_deps_39_absl_py\":[{\"version\":\"3.9\"}]}", + "six": "{\"rules_fuzzing_py_deps_310_six\":[{\"version\":\"3.10\"}],\"rules_fuzzing_py_deps_311_six\":[{\"version\":\"3.11\"}],\"rules_fuzzing_py_deps_312_six\":[{\"version\":\"3.12\"}],\"rules_fuzzing_py_deps_38_six\":[{\"version\":\"3.8\"}],\"rules_fuzzing_py_deps_39_six\":[{\"version\":\"3.9\"}]}" + }, + "packages": [ + "absl_py", + "six" + ], + "groups": {} + } + }, + "rules_python_publish_deps": { + "repoRuleId": "@@//python/private/pypi:hub_repository.bzl%hub_repository", + "attributes": { + "repo_name": "rules_python_publish_deps", + "extra_hub_aliases": {}, + "whl_map": { + "backports_tarfile": "{\"rules_python_publish_deps_311_backports_tarfile_py3_none_any_77e284d7\":[{\"filename\":\"backports.tarfile-1.2.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_backports_tarfile_sdist_d75e02c2\":[{\"filename\":\"backports_tarfile-1.2.0.tar.gz\",\"version\":\"3.11\"}]}", + "certifi": "{\"rules_python_publish_deps_311_certifi_py3_none_any_ca78db45\":[{\"filename\":\"certifi-2025.1.31-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_certifi_sdist_3d5da692\":[{\"filename\":\"certifi-2025.1.31.tar.gz\",\"version\":\"3.11\"}]}", + "charset_normalizer": "{\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_8bfa33f4\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_28bf5762\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_f08ff5e9\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_234ac59e\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_fd4ec41f\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_c96836c9\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_09b5e673\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_5777ee08\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_237bdbe6\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_cp311_cp311_win_amd64_d7f50a1f\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_py3_none_any_d98b1668\":[{\"filename\":\"charset_normalizer-3.4.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_charset_normalizer_sdist_44251f18\":[{\"filename\":\"charset_normalizer-3.4.1.tar.gz\",\"version\":\"3.11\"}]}", + "docutils": "{\"rules_python_publish_deps_311_docutils_py3_none_any_dafca5b9\":[{\"filename\":\"docutils-0.21.2-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_docutils_sdist_3a6b1873\":[{\"filename\":\"docutils-0.21.2.tar.gz\",\"version\":\"3.11\"}]}", + "idna": "{\"rules_python_publish_deps_311_idna_py3_none_any_946d195a\":[{\"filename\":\"idna-3.10-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_idna_sdist_12f65c9b\":[{\"filename\":\"idna-3.10.tar.gz\",\"version\":\"3.11\"}]}", + "importlib_metadata": "{\"rules_python_publish_deps_311_importlib_metadata_py3_none_any_45e54197\":[{\"filename\":\"importlib_metadata-8.5.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_importlib_metadata_sdist_71522656\":[{\"filename\":\"importlib_metadata-8.5.0.tar.gz\",\"version\":\"3.11\"}]}", + "jaraco_classes": "{\"rules_python_publish_deps_311_jaraco_classes_py3_none_any_f662826b\":[{\"filename\":\"jaraco.classes-3.4.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_jaraco_classes_sdist_47a024b5\":[{\"filename\":\"jaraco.classes-3.4.0.tar.gz\",\"version\":\"3.11\"}]}", + "jaraco_context": "{\"rules_python_publish_deps_311_jaraco_context_py3_none_any_f797fc48\":[{\"filename\":\"jaraco.context-6.0.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_jaraco_context_sdist_9bae4ea5\":[{\"filename\":\"jaraco_context-6.0.1.tar.gz\",\"version\":\"3.11\"}]}", + "jaraco_functools": "{\"rules_python_publish_deps_311_jaraco_functools_py3_none_any_ad159f13\":[{\"filename\":\"jaraco.functools-4.1.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_jaraco_functools_sdist_70f7e0e2\":[{\"filename\":\"jaraco_functools-4.1.0.tar.gz\",\"version\":\"3.11\"}]}", + "keyring": "{\"rules_python_publish_deps_311_keyring_py3_none_any_e67f8ac3\":[{\"filename\":\"keyring-25.5.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_keyring_sdist_4c753b3e\":[{\"filename\":\"keyring-25.5.0.tar.gz\",\"version\":\"3.11\"}]}", + "markdown_it_py": "{\"rules_python_publish_deps_311_markdown_it_py_py3_none_any_35521684\":[{\"filename\":\"markdown_it_py-3.0.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_markdown_it_py_sdist_e3f60a94\":[{\"filename\":\"markdown-it-py-3.0.0.tar.gz\",\"version\":\"3.11\"}]}", + "mdurl": "{\"rules_python_publish_deps_311_mdurl_py3_none_any_84008a41\":[{\"filename\":\"mdurl-0.1.2-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_mdurl_sdist_bb413d29\":[{\"filename\":\"mdurl-0.1.2.tar.gz\",\"version\":\"3.11\"}]}", + "more_itertools": "{\"rules_python_publish_deps_311_more_itertools_py3_none_any_d4398038\":[{\"filename\":\"more_itertools-10.7.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_more_itertools_sdist_9fddd540\":[{\"filename\":\"more_itertools-10.7.0.tar.gz\",\"version\":\"3.11\"}]}", + "nh3": "{\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_14c5a72e\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_macosx_10_12_x86_64_7b7c2a3c\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-macosx_10_12_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_aarch64_42c64511\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_ppc64le_34c03fa7\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_s390x_19aaba96\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_manylinux_2_17_x86_64_de3ceed6\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_aarch64_f0eca9ca\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_musllinux_1_2_x86_64_36c95d4b\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_cp37_abi3_win_amd64_8ce0f819\":[{\"filename\":\"nh3-0.2.18-cp37-abi3-win_amd64.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_nh3_sdist_94a16692\":[{\"filename\":\"nh3-0.2.18.tar.gz\",\"version\":\"3.11\"}]}", + "pkginfo": "{\"rules_python_publish_deps_311_pkginfo_py3_none_any_889a6da2\":[{\"filename\":\"pkginfo-1.10.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_pkginfo_sdist_5df73835\":[{\"filename\":\"pkginfo-1.10.0.tar.gz\",\"version\":\"3.11\"}]}", + "pygments": "{\"rules_python_publish_deps_311_pygments_py3_none_any_b8e6aca0\":[{\"filename\":\"pygments-2.18.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_pygments_sdist_786ff802\":[{\"filename\":\"pygments-2.18.0.tar.gz\",\"version\":\"3.11\"}]}", + "readme_renderer": "{\"rules_python_publish_deps_311_readme_renderer_py3_none_any_2fbca89b\":[{\"filename\":\"readme_renderer-44.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_readme_renderer_sdist_8712034e\":[{\"filename\":\"readme_renderer-44.0.tar.gz\",\"version\":\"3.11\"}]}", + "requests": "{\"rules_python_publish_deps_311_requests_py3_none_any_70761cfe\":[{\"filename\":\"requests-2.32.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_requests_sdist_55365417\":[{\"filename\":\"requests-2.32.3.tar.gz\",\"version\":\"3.11\"}]}", + "requests_toolbelt": "{\"rules_python_publish_deps_311_requests_toolbelt_py2_none_any_cccfdd66\":[{\"filename\":\"requests_toolbelt-1.0.0-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_requests_toolbelt_sdist_7681a0a3\":[{\"filename\":\"requests-toolbelt-1.0.0.tar.gz\",\"version\":\"3.11\"}]}", + "rfc3986": "{\"rules_python_publish_deps_311_rfc3986_py2_none_any_50b1502b\":[{\"filename\":\"rfc3986-2.0.0-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_rfc3986_sdist_97aacf9d\":[{\"filename\":\"rfc3986-2.0.0.tar.gz\",\"version\":\"3.11\"}]}", + "rich": "{\"rules_python_publish_deps_311_rich_py3_none_any_6049d5e6\":[{\"filename\":\"rich-13.9.4-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_rich_sdist_43959497\":[{\"filename\":\"rich-13.9.4.tar.gz\",\"version\":\"3.11\"}]}", + "twine": "{\"rules_python_publish_deps_311_twine_py3_none_any_215dbe7b\":[{\"filename\":\"twine-5.1.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_twine_sdist_9aa08251\":[{\"filename\":\"twine-5.1.1.tar.gz\",\"version\":\"3.11\"}]}", + "urllib3": "{\"rules_python_publish_deps_311_urllib3_py3_none_any_4e166650\":[{\"filename\":\"urllib3-2.4.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_urllib3_sdist_414bc653\":[{\"filename\":\"urllib3-2.4.0.tar.gz\",\"version\":\"3.11\"}]}", + "zipp": "{\"rules_python_publish_deps_311_zipp_py3_none_any_a817ac80\":[{\"filename\":\"zipp-3.20.2-py3-none-any.whl\",\"version\":\"3.11\"}],\"rules_python_publish_deps_311_zipp_sdist_bc9eb26f\":[{\"filename\":\"zipp-3.20.2.tar.gz\",\"version\":\"3.11\"}]}" + }, + "packages": [ + "backports_tarfile", + "certifi", + "charset_normalizer", + "docutils", + "idna", + "importlib_metadata", + "jaraco_classes", + "jaraco_context", + "jaraco_functools", + "keyring", + "markdown_it_py", + "mdurl", + "more_itertools", + "nh3", + "pkginfo", + "pygments", + "readme_renderer", + "requests", + "requests_toolbelt", + "rfc3986", + "rich", + "twine", + "urllib3", + "zipp" + ], + "groups": {} + } + } + }, + "moduleExtensionMetadata": { + "useAllRepos": "NO", + "reproducible": false + }, + "recordedRepoMappingEntries": [ + [ + "", + "bazel_features", + "bazel_features+" + ], + [ + "", + "bazel_skylib", + "bazel_skylib+" + ], + [ + "", + "bazel_tools", + "bazel_tools" + ], + [ + "", + "platforms", + "platforms" + ], + [ + "", + "pypi__build", + "+internal_deps+pypi__build" + ], + [ + "", + "pypi__click", + "+internal_deps+pypi__click" + ], + [ + "", + "pypi__colorama", + "+internal_deps+pypi__colorama" + ], + [ + "", + "pypi__importlib_metadata", + "+internal_deps+pypi__importlib_metadata" + ], + [ + "", + "pypi__installer", + "+internal_deps+pypi__installer" + ], + [ + "", + "pypi__more_itertools", + "+internal_deps+pypi__more_itertools" + ], + [ + "", + "pypi__packaging", + "+internal_deps+pypi__packaging" + ], + [ + "", + "pypi__pep517", + "+internal_deps+pypi__pep517" + ], + [ + "", + "pypi__pip", + "+internal_deps+pypi__pip" + ], + [ + "", + "pypi__pip_tools", + "+internal_deps+pypi__pip_tools" + ], + [ + "", + "pypi__pyproject_hooks", + "+internal_deps+pypi__pyproject_hooks" + ], + [ + "", + "pypi__setuptools", + "+internal_deps+pypi__setuptools" + ], + [ + "", + "pypi__tomli", + "+internal_deps+pypi__tomli" + ], + [ + "", + "pypi__wheel", + "+internal_deps+pypi__wheel" + ], + [ + "", + "pypi__zipp", + "+internal_deps+pypi__zipp" + ], + [ + "", + "pythons_hub", + "+python+pythons_hub" + ], + [ + "", + "rules_python_internal", + "+internal_deps+rules_python_internal" + ], + [ + "+python+pythons_hub", + "python_3_10_11_host", + "+python+python_3_10_11_host" + ], + [ + "+python+pythons_hub", + "python_3_10_12_host", + "+python+python_3_10_12_host" + ], + [ + "+python+pythons_hub", + "python_3_10_13_host", + "+python+python_3_10_13_host" + ], + [ + "+python+pythons_hub", + "python_3_10_14_host", + "+python+python_3_10_14_host" + ], + [ + "+python+pythons_hub", + "python_3_10_15_host", + "+python+python_3_10_15_host" + ], + [ + "+python+pythons_hub", + "python_3_10_16_host", + "+python+python_3_10_16_host" + ], + [ + "+python+pythons_hub", + "python_3_10_2_host", + "+python+python_3_10_2_host" + ], + [ + "+python+pythons_hub", + "python_3_10_4_host", + "+python+python_3_10_4_host" + ], + [ + "+python+pythons_hub", + "python_3_10_6_host", + "+python+python_3_10_6_host" + ], + [ + "+python+pythons_hub", + "python_3_10_8_host", + "+python+python_3_10_8_host" + ], + [ + "+python+pythons_hub", + "python_3_10_9_host", + "+python+python_3_10_9_host" + ], + [ + "+python+pythons_hub", + "python_3_10_host", + "+python+python_3_10_host" + ], + [ + "+python+pythons_hub", + "python_3_11_10_host", + "+python+python_3_11_10_host" + ], + [ + "+python+pythons_hub", + "python_3_11_11_host", + "+python+python_3_11_11_host" + ], + [ + "+python+pythons_hub", + "python_3_11_1_host", + "+python+python_3_11_1_host" + ], + [ + "+python+pythons_hub", + "python_3_11_3_host", + "+python+python_3_11_3_host" + ], + [ + "+python+pythons_hub", + "python_3_11_4_host", + "+python+python_3_11_4_host" + ], + [ + "+python+pythons_hub", + "python_3_11_5_host", + "+python+python_3_11_5_host" + ], + [ + "+python+pythons_hub", + "python_3_11_6_host", + "+python+python_3_11_6_host" + ], + [ + "+python+pythons_hub", + "python_3_11_7_host", + "+python+python_3_11_7_host" + ], + [ + "+python+pythons_hub", + "python_3_11_8_host", + "+python+python_3_11_8_host" + ], + [ + "+python+pythons_hub", + "python_3_11_9_host", + "+python+python_3_11_9_host" + ], + [ + "+python+pythons_hub", + "python_3_11_host", + "+python+python_3_11_host" + ], + [ + "+python+pythons_hub", + "python_3_12_0_host", + "+python+python_3_12_0_host" + ], + [ + "+python+pythons_hub", + "python_3_12_1_host", + "+python+python_3_12_1_host" + ], + [ + "+python+pythons_hub", + "python_3_12_2_host", + "+python+python_3_12_2_host" + ], + [ + "+python+pythons_hub", + "python_3_12_3_host", + "+python+python_3_12_3_host" + ], + [ + "+python+pythons_hub", + "python_3_12_4_host", + "+python+python_3_12_4_host" + ], + [ + "+python+pythons_hub", + "python_3_12_7_host", + "+python+python_3_12_7_host" + ], + [ + "+python+pythons_hub", + "python_3_12_8_host", + "+python+python_3_12_8_host" + ], + [ + "+python+pythons_hub", + "python_3_12_9_host", + "+python+python_3_12_9_host" + ], + [ + "+python+pythons_hub", + "python_3_12_host", + "+python+python_3_12_host" + ], + [ + "+python+pythons_hub", + "python_3_13_0_host", + "+python+python_3_13_0_host" + ], + [ + "+python+pythons_hub", + "python_3_13_1_host", + "+python+python_3_13_1_host" + ], + [ + "+python+pythons_hub", + "python_3_13_2_host", + "+python+python_3_13_2_host" + ], + [ + "+python+pythons_hub", + "python_3_13_host", + "+python+python_3_13_host" + ], + [ + "+python+pythons_hub", + "python_3_8_20_host", + "+python+python_3_8_20_host" + ], + [ + "+python+pythons_hub", + "python_3_8_host", + "+python+python_3_8_host" + ], + [ + "+python+pythons_hub", + "python_3_9_10_host", + "+python+python_3_9_10_host" + ], + [ + "+python+pythons_hub", + "python_3_9_12_host", + "+python+python_3_9_12_host" + ], + [ + "+python+pythons_hub", + "python_3_9_13_host", + "+python+python_3_9_13_host" + ], + [ + "+python+pythons_hub", + "python_3_9_15_host", + "+python+python_3_9_15_host" + ], + [ + "+python+pythons_hub", + "python_3_9_16_host", + "+python+python_3_9_16_host" + ], + [ + "+python+pythons_hub", + "python_3_9_17_host", + "+python+python_3_9_17_host" + ], + [ + "+python+pythons_hub", + "python_3_9_18_host", + "+python+python_3_9_18_host" + ], + [ + "+python+pythons_hub", + "python_3_9_19_host", + "+python+python_3_9_19_host" + ], + [ + "+python+pythons_hub", + "python_3_9_20_host", + "+python+python_3_9_20_host" + ], + [ + "+python+pythons_hub", + "python_3_9_21_host", + "+python+python_3_9_21_host" + ], + [ + "+python+pythons_hub", + "python_3_9_host", + "+python+python_3_9_host" + ], + [ + "bazel_features+", + "bazel_features_globals", + "bazel_features++version_extension+bazel_features_globals" + ], + [ + "bazel_features+", + "bazel_features_version", + "bazel_features++version_extension+bazel_features_version" + ] + ] + } + }, + "//python/uv:uv.bzl%uv": { + "general": { + "bzlTransitiveDigest": "974EMOCTeL5Jb/qml3KxnNfNQdofzzFZ8iWdijj0+tE=", + "usagesDigest": "bhObcl0GzSNBmZQBAHFo0gtLCgPUSlPbWZBi4MctAQI=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "uv_0_6_2_aarch64_apple_darwin": { + "repoRuleId": "@@//python/uv/private:uv_repository.bzl%uv_repository", + "attributes": { + "version": "0.6.2", + "platform": "aarch64-apple-darwin", + "urls": [ + "https://github.com/astral-sh/uv/releases/download/0.6.2/uv-aarch64-apple-darwin.tar.gz" + ], + "sha256": "4af802a1216053650dd82eee85ea4241994f432937d41c8b0bc90f2639e6ae14" + } + }, + "uv_0_6_2_aarch64_unknown_linux_gnu": { + "repoRuleId": "@@//python/uv/private:uv_repository.bzl%uv_repository", + "attributes": { + "version": "0.6.2", + "platform": "aarch64-unknown-linux-gnu", + "urls": [ + "https://github.com/astral-sh/uv/releases/download/0.6.2/uv-aarch64-unknown-linux-gnu.tar.gz" + ], + "sha256": "ca4c08724764a2b6c8f2173c4e3ca9dcde0d9d328e73b4d725cfb6b17a925eed" + } + }, + "uv_0_6_2_powerpc64_unknown_linux_gnu": { + "repoRuleId": "@@//python/uv/private:uv_repository.bzl%uv_repository", + "attributes": { + "version": "0.6.2", + "platform": "powerpc64-unknown-linux-gnu", + "urls": [ + "https://github.com/astral-sh/uv/releases/download/0.6.2/uv-powerpc64-unknown-linux-gnu.tar.gz" + ], + "sha256": "de17553549280fd877452dd1f7f9d0a604e3544bfad007b8ec0b9943f103796f" + } + }, + "uv_0_6_2_powerpc64le_unknown_linux_gnu": { + "repoRuleId": "@@//python/uv/private:uv_repository.bzl%uv_repository", + "attributes": { + "version": "0.6.2", + "platform": "powerpc64le-unknown-linux-gnu", + "urls": [ + "https://github.com/astral-sh/uv/releases/download/0.6.2/uv-powerpc64le-unknown-linux-gnu.tar.gz" + ], + "sha256": "f341fd4874d2d007135626a0657d1478f331a78991d8a1a06aaa0d52fbe16183" + } + }, + "uv_0_6_2_s390x_unknown_linux_gnu": { + "repoRuleId": "@@//python/uv/private:uv_repository.bzl%uv_repository", + "attributes": { + "version": "0.6.2", + "platform": "s390x-unknown-linux-gnu", + "urls": [ + "https://github.com/astral-sh/uv/releases/download/0.6.2/uv-s390x-unknown-linux-gnu.tar.gz" + ], + "sha256": "17fd89bd8de75da9c91baf918b8079c1f1f92bb6a398f0cfbc5ddefe0c7f0ee5" + } + }, + "uv_0_6_2_x86_64_apple_darwin": { + "repoRuleId": "@@//python/uv/private:uv_repository.bzl%uv_repository", + "attributes": { + "version": "0.6.2", + "platform": "x86_64-apple-darwin", + "urls": [ + "https://github.com/astral-sh/uv/releases/download/0.6.2/uv-x86_64-apple-darwin.tar.gz" + ], + "sha256": "2b9e78b2562aea93f13e42df1177cb07c59a4d4f1c8ff8907d0c31f3a5e5e8db" + } + }, + "uv_0_6_2_x86_64_pc_windows_msvc": { + "repoRuleId": "@@//python/uv/private:uv_repository.bzl%uv_repository", + "attributes": { + "version": "0.6.2", + "platform": "x86_64-pc-windows-msvc", + "urls": [ + "https://github.com/astral-sh/uv/releases/download/0.6.2/uv-x86_64-pc-windows-msvc.zip" + ], + "sha256": "5f33c3cc5c183775cc51b3e661a0d2ce31142d32a50406a67c7ad0321fc841d9" + } + }, + "uv_0_6_2_x86_64_unknown_linux_gnu": { + "repoRuleId": "@@//python/uv/private:uv_repository.bzl%uv_repository", + "attributes": { + "version": "0.6.2", + "platform": "x86_64-unknown-linux-gnu", + "urls": [ + "https://github.com/astral-sh/uv/releases/download/0.6.2/uv-x86_64-unknown-linux-gnu.tar.gz" + ], + "sha256": "37ea31f099678a3bee56f8a757d73551aad43f8025d377a8dde80dd946c1b7f2" + } + }, + "uv": { + "repoRuleId": "@@//python/uv/private:uv_toolchains_repo.bzl%uv_toolchains_repo", + "attributes": { + "toolchain_type": "'@@//python/uv:uv_toolchain_type'", + "toolchain_names": [ + "0_6_2_aarch64_apple_darwin", + "0_6_2_aarch64_unknown_linux_gnu", + "0_6_2_powerpc64_unknown_linux_gnu", + "0_6_2_powerpc64le_unknown_linux_gnu", + "0_6_2_s390x_unknown_linux_gnu", + "0_6_2_x86_64_apple_darwin", + "0_6_2_x86_64_pc_windows_msvc", + "0_6_2_x86_64_unknown_linux_gnu" + ], + "toolchain_implementations": { + "0_6_2_aarch64_apple_darwin": "@uv_0_6_2_aarch64_apple_darwin//:uv_toolchain", + "0_6_2_aarch64_unknown_linux_gnu": "@uv_0_6_2_aarch64_unknown_linux_gnu//:uv_toolchain", + "0_6_2_powerpc64_unknown_linux_gnu": "@uv_0_6_2_powerpc64_unknown_linux_gnu//:uv_toolchain", + "0_6_2_powerpc64le_unknown_linux_gnu": "@uv_0_6_2_powerpc64le_unknown_linux_gnu//:uv_toolchain", + "0_6_2_s390x_unknown_linux_gnu": "@uv_0_6_2_s390x_unknown_linux_gnu//:uv_toolchain", + "0_6_2_x86_64_apple_darwin": "@uv_0_6_2_x86_64_apple_darwin//:uv_toolchain", + "0_6_2_x86_64_pc_windows_msvc": "@uv_0_6_2_x86_64_pc_windows_msvc//:uv_toolchain", + "0_6_2_x86_64_unknown_linux_gnu": "@uv_0_6_2_x86_64_unknown_linux_gnu//:uv_toolchain" + }, + "toolchain_compatible_with": { + "0_6_2_aarch64_apple_darwin": [ + "'@@platforms//os:macos'", + "'@@platforms//cpu:aarch64'" + ], + "0_6_2_aarch64_unknown_linux_gnu": [ + "'@@platforms//os:linux'", + "'@@platforms//cpu:aarch64'" + ], + "0_6_2_powerpc64_unknown_linux_gnu": [ + "'@@platforms//os:linux'", + "'@@platforms//cpu:ppc'" + ], + "0_6_2_powerpc64le_unknown_linux_gnu": [ + "'@@platforms//os:linux'", + "'@@platforms//cpu:ppc64le'" + ], + "0_6_2_s390x_unknown_linux_gnu": [ + "'@@platforms//os:linux'", + "'@@platforms//cpu:s390x'" + ], + "0_6_2_x86_64_apple_darwin": [ + "'@@platforms//os:macos'", + "'@@platforms//cpu:x86_64'" + ], + "0_6_2_x86_64_pc_windows_msvc": [ + "'@@platforms//os:windows'", + "'@@platforms//cpu:x86_64'" + ], + "0_6_2_x86_64_unknown_linux_gnu": [ + "'@@platforms//os:linux'", + "'@@platforms//cpu:x86_64'" + ] + }, + "toolchain_target_settings": {} + } + } + }, + "recordedRepoMappingEntries": [ + [ + "", + "platforms", + "platforms" + ] + ] + } + }, + "@@buildifier_prebuilt+//:defs.bzl%buildifier_prebuilt_deps_extension": { + "general": { + "bzlTransitiveDigest": "BQ67MS38sDZxeQEfUs4vghLhs3+m4IXU/i7XC50fl9s=", + "usagesDigest": "JCqhJg+TeFVLBlrKVGI0Npi9RChNqkZQAh9TYfbAobs=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "buildifier_darwin_amd64": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "urls": [ + "https://github.com/bazelbuild/buildtools/releases/download/v6.1.2/buildifier-darwin-amd64" + ], + "downloaded_file_path": "buildifier", + "executable": true, + "sha256": "e2f4a67691c5f55634fbfb3850eb97dd91be0edd059d947b6c83d120682e0216" + } + }, + "buildifier_darwin_arm64": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "urls": [ + "https://github.com/bazelbuild/buildtools/releases/download/v6.1.2/buildifier-darwin-arm64" + ], + "downloaded_file_path": "buildifier", + "executable": true, + "sha256": "7549b5f535219ac957aa2a6069d46fbfc9ea3f74abd85fd3d460af4b1a2099a6" + } + }, + "buildifier_linux_amd64": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "urls": [ + "https://github.com/bazelbuild/buildtools/releases/download/v6.1.2/buildifier-linux-amd64" + ], + "downloaded_file_path": "buildifier", + "executable": true, + "sha256": "51bc947dabb7b14ec6fb1224464fbcf7a7cb138f1a10a3b328f00835f72852ce" + } + }, + "buildifier_linux_arm64": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "urls": [ + "https://github.com/bazelbuild/buildtools/releases/download/v6.1.2/buildifier-linux-arm64" + ], + "downloaded_file_path": "buildifier", + "executable": true, + "sha256": "0ba6e8e3208b5a029164e542ddb5509e618f87b639ffe8cc2f54770022853080" + } + }, + "buildifier_windows_amd64": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "urls": [ + "https://github.com/bazelbuild/buildtools/releases/download/v6.1.2/buildifier-windows-amd64.exe" + ], + "downloaded_file_path": "buildifier.exe", + "executable": true, + "sha256": "92bdd284fbc6766fc3e300b434ff9e68ac4d76a06cb29d1bdefe79a102a8d135" + } + }, + "buildozer_darwin_amd64": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "urls": [ + "https://github.com/bazelbuild/buildtools/releases/download/v6.1.2/buildozer-darwin-amd64" + ], + "downloaded_file_path": "buildozer", + "executable": true, + "sha256": "4014751a4cc5e91a7dc4b64be7b30c565bd9014ae6d1879818dc624562a1d431" + } + }, + "buildozer_darwin_arm64": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "urls": [ + "https://github.com/bazelbuild/buildtools/releases/download/v6.1.2/buildozer-darwin-arm64" + ], + "downloaded_file_path": "buildozer", + "executable": true, + "sha256": "e78bd5357f2356067d4b0d49ec4e4143dd9b1308746afc6ff11b55b952f462d7" + } + }, + "buildozer_linux_amd64": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "urls": [ + "https://github.com/bazelbuild/buildtools/releases/download/v6.1.2/buildozer-linux-amd64" + ], + "downloaded_file_path": "buildozer", + "executable": true, + "sha256": "2aef0f1ef80a0140b8fe6e6a8eb822e14827d8855bfc6681532c7530339ea23b" + } + }, + "buildozer_linux_arm64": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "urls": [ + "https://github.com/bazelbuild/buildtools/releases/download/v6.1.2/buildozer-linux-arm64" + ], + "downloaded_file_path": "buildozer", + "executable": true, + "sha256": "586e27630cbc242e8bd6fe8e24485eca8dcadea6410cc13cbe059202655980ac" + } + }, + "buildozer_windows_amd64": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "urls": [ + "https://github.com/bazelbuild/buildtools/releases/download/v6.1.2/buildozer-windows-amd64.exe" + ], + "downloaded_file_path": "buildozer.exe", + "executable": true, + "sha256": "07664d5d08ee099f069cd654070cabf2708efaae9f52dc83921fa400c67a868b" + } + }, + "buildifier_prebuilt_toolchains": { + "repoRuleId": "@@buildifier_prebuilt+//:defs.bzl%_buildifier_toolchain_setup", + "attributes": { + "assets_json": "[{\"arch\":\"amd64\",\"name\":\"buildifier\",\"platform\":\"darwin\",\"sha256\":\"e2f4a67691c5f55634fbfb3850eb97dd91be0edd059d947b6c83d120682e0216\",\"version\":\"v6.1.2\"},{\"arch\":\"arm64\",\"name\":\"buildifier\",\"platform\":\"darwin\",\"sha256\":\"7549b5f535219ac957aa2a6069d46fbfc9ea3f74abd85fd3d460af4b1a2099a6\",\"version\":\"v6.1.2\"},{\"arch\":\"amd64\",\"name\":\"buildifier\",\"platform\":\"linux\",\"sha256\":\"51bc947dabb7b14ec6fb1224464fbcf7a7cb138f1a10a3b328f00835f72852ce\",\"version\":\"v6.1.2\"},{\"arch\":\"arm64\",\"name\":\"buildifier\",\"platform\":\"linux\",\"sha256\":\"0ba6e8e3208b5a029164e542ddb5509e618f87b639ffe8cc2f54770022853080\",\"version\":\"v6.1.2\"},{\"arch\":\"amd64\",\"name\":\"buildifier\",\"platform\":\"windows\",\"sha256\":\"92bdd284fbc6766fc3e300b434ff9e68ac4d76a06cb29d1bdefe79a102a8d135\",\"version\":\"v6.1.2\"},{\"arch\":\"amd64\",\"name\":\"buildozer\",\"platform\":\"darwin\",\"sha256\":\"4014751a4cc5e91a7dc4b64be7b30c565bd9014ae6d1879818dc624562a1d431\",\"version\":\"v6.1.2\"},{\"arch\":\"arm64\",\"name\":\"buildozer\",\"platform\":\"darwin\",\"sha256\":\"e78bd5357f2356067d4b0d49ec4e4143dd9b1308746afc6ff11b55b952f462d7\",\"version\":\"v6.1.2\"},{\"arch\":\"amd64\",\"name\":\"buildozer\",\"platform\":\"linux\",\"sha256\":\"2aef0f1ef80a0140b8fe6e6a8eb822e14827d8855bfc6681532c7530339ea23b\",\"version\":\"v6.1.2\"},{\"arch\":\"arm64\",\"name\":\"buildozer\",\"platform\":\"linux\",\"sha256\":\"586e27630cbc242e8bd6fe8e24485eca8dcadea6410cc13cbe059202655980ac\",\"version\":\"v6.1.2\"},{\"arch\":\"amd64\",\"name\":\"buildozer\",\"platform\":\"windows\",\"sha256\":\"07664d5d08ee099f069cd654070cabf2708efaae9f52dc83921fa400c67a868b\",\"version\":\"v6.1.2\"}]" + } + } + }, + "recordedRepoMappingEntries": [ + [ + "buildifier_prebuilt+", + "bazel_skylib", + "bazel_skylib+" + ], + [ + "buildifier_prebuilt+", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": { + "general": { + "bzlTransitiveDigest": "sFhcgPbDQehmbD1EOXzX4H1q/CD5df8zwG4kp4jbvr8=", + "usagesDigest": "QI2z8ZUR+mqtbwsf2fLqYdJAkPOHdOV+tF2yVAUgRzw=", + "recordedFileInputs": {}, + "recordedDirentsInputs": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "com_github_jetbrains_kotlin_git": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_compiler_git_repository", + "attributes": { + "urls": [ + "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip" + ], + "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88" + } + }, + "com_github_jetbrains_kotlin": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_capabilities_repository", + "attributes": { + "git_repository_name": "com_github_jetbrains_kotlin_git", + "compiler_version": "1.9.23" + } + }, + "com_github_google_ksp": { + "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:ksp.bzl%ksp_compiler_plugin_repository", + "attributes": { + "urls": [ + "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip" + ], + "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d", + "strip_version": "1.9.23-1.0.20" + } + }, + "com_github_pinterest_ktlint": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file", + "attributes": { + "sha256": "01b2e0ef893383a50dbeb13970fe7fa3be36ca3e83259e01649945b09d736985", + "urls": [ + "https://github.com/pinterest/ktlint/releases/download/1.3.0/ktlint" + ], + "executable": true + } + }, + "rules_android": { + "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive", + "attributes": { + "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806", + "strip_prefix": "rules_android-0.1.1", + "urls": [ + "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip" + ] + } + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_kotlin+", + "bazel_tools", + "bazel_tools" + ] + ] + } + } + } +} diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index ed80bdbcb0..9ed966cfc7 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -231,6 +231,13 @@ def _create_whl_repos( extra_pip_args = pip_attr.extra_pip_args, get_index_urls = get_index_urls, evaluate_markers = evaluate_markers, + select_whls = { + key: struct( + platforms = p.whl_platforms, + whl_limit = p.whl_limit, + ) + for key, p in config["platforms"].items() + }, logger = logger, ) @@ -411,6 +418,8 @@ def _configure(config, *, platform, constraint_values, target_settings, os_name, for k, v in values.items() if k.startswith("env_") and v }, + whl_platforms = values["whl_platforms"], + whl_limit = values["whl_limit"], ) else: config["platforms"].pop(platform) @@ -485,6 +494,8 @@ You cannot use both the additive_build_content and additive_build_content_file a os_name = tag.os_name, platform = tag.platform, target_settings = tag.target_settings, + whl_limit = tag.whl_limit, + whl_platforms = tag.whl_platforms, override = mod.is_root, # TODO @aignas 2025-05-19: add more attr groups: # * for AUTH @@ -753,7 +764,7 @@ def _pip_impl(module_ctx): # NOTE @aignas 2025-04-15: this is set to be reproducible, because the # results after calling the PyPI index should be reproducible on each # machine. - return module_ctx.extension_metadata(reproducible = True) + return module_ctx.extension_metadata(reproducible = False) else: return None diff --git a/python/private/pypi/parse_requirements.bzl b/python/private/pypi/parse_requirements.bzl index 892cf762f5..7f48d72f18 100644 --- a/python/private/pypi/parse_requirements.bzl +++ b/python/private/pypi/parse_requirements.bzl @@ -41,6 +41,7 @@ def parse_requirements( get_index_urls = None, evaluate_markers = None, extract_url_srcs = True, + select_whls = {}, logger = None): """Get the requirements with platforms that the requirements apply to. @@ -61,6 +62,7 @@ def parse_requirements( requirements line. extract_url_srcs: A boolean to enable extracting URLs from requirement lines to enable using bazel downloader. + select_whls: TODO. logger: repo_utils.logger or None, a simple struct to log diagnostic messages. Returns: @@ -202,6 +204,7 @@ def parse_requirements( whls, sdist = _add_dists( requirement = r, index_urls = index_urls.get(whl_name), + include_whls = select_whls, logger = logger, ) @@ -273,7 +276,7 @@ def host_platform(ctx): repo_utils.get_platforms_cpu_name(ctx), ) -def _add_dists(*, requirement, index_urls, logger = None): +def _add_dists(*, requirement, index_urls, include_whls, logger = None): """Populate dists based on the information from the PyPI index. This function will modify the given requirements_by_platform data structure. @@ -353,6 +356,7 @@ def _add_dists(*, requirement, index_urls, logger = None): whls = select_whls( whls = whls, want_platforms = requirement.target_platforms, + include_whls = include_whls, logger = logger, ) diff --git a/python/private/pypi/whl_target_platforms.bzl b/python/private/pypi/whl_target_platforms.bzl index 9293cf7e3b..0dc8216bf7 100644 --- a/python/private/pypi/whl_target_platforms.bzl +++ b/python/private/pypi/whl_target_platforms.bzl @@ -46,7 +46,7 @@ _OS_PREFIXES = { "win": "windows", } # buildifier: disable=unsorted-dict-items -def select_whls(*, whls, want_platforms = {}, logger = None): +def select_whls(*, whls, want_platforms = {}, include_whls = {}, logger = None): """Select a subset of wheels suitable for target platforms from a list. Args: @@ -55,12 +55,22 @@ def select_whls(*, whls, want_platforms = {}, logger = None): want_platforms: {type}`dict[str, struct]` The platforms in "{abi}_{os}_{cpu}" or "{os}_{cpu}" format for the keys and the values are options for further fine tuning the selection. + include_whls: TODO logger: A logger for printing diagnostic messages. Returns: A filtered list of items from the `whls` arg where `filename` matches the selected criteria. If no match is found, an empty list is returned. """ + + # TODO @aignas 2025-05-26: this function has to be completely rewritten if we want users + # to modify the following: + # * include freethreaded or not? (restrict by ABIs) + # * include certain platform_tags + # * limit the number of wheels that are included. The list has to be sorted by + # specificity, the sorting function should be trivial to implement. + # + # This has to be done even if we want to include only 1 wheel per target platform. if not whls: return [] @@ -115,7 +125,7 @@ def select_whls(*, whls, want_platforms = {}, logger = None): if tag.startswith("cp3") or tag.startswith("py3"): version = int(tag[len("..3"):] or 0) else: - # In this case it should be eithor "cp2" or "py2" and we will default + # In this case it should be either "cp2" or "py2" and we will default # to `whl_version_min` = 0 continue @@ -142,10 +152,12 @@ def select_whls(*, whls, want_platforms = {}, logger = None): if parsed.platform_tag == "any": compatible = True else: - for p in whl_target_platforms(parsed.platform_tag, abi_tag = parsed.abi_tag.strip("m") if parsed.abi_tag.startswith("cp") else None): - if p.target_platform in want_platforms: - compatible = True - break + supported_platform_tag = _supported(include_whls, parsed.platform_tag) + if supported_platform_tag: + for p in whl_target_platforms(supported_platform_tag, abi_tag = parsed.abi_tag.strip("m") if parsed.abi_tag.startswith("cp") else None): + if p.target_platform in want_platforms: + compatible = True + break if not compatible: if logger: @@ -173,10 +185,32 @@ def select_whls(*, whls, want_platforms = {}, logger = None): [], ).append(whl) - return [ + ret = [ candidates[key][sorted(v)[-1]][-1] for key, v in candidates.items() ] + return ret + +def _supported(include_whls, actual_platform_tag): + if not include_whls: + return actual_platform_tag + + ret = [] + for _, includes in include_whls.items(): + for include in includes.platforms: + head, _, tail = include.partition("*") + + for actual in actual_platform_tag.split("."): + if actual == head and not tail: + pass + elif tail and actual.startswith(head) and actual.endswith(tail): + pass + else: + continue + + ret.append(actual) + + return ".".join(ret) def whl_target_platforms(platform_tag, abi_tag = ""): """Parse the wheel abi and platform tags and return (os, cpu) tuples.