From 61d946e0387ccc358f7ce0c580170566bcc2c3ad Mon Sep 17 00:00:00 2001 From: Will Noble Date: Mon, 16 Mar 2026 13:59:08 -0700 Subject: [PATCH 1/5] Add a test to import a dependency using an isolated extension --- .bazelrc.deleted_packages | 1 + tests/integration/BUILD.bazel | 4 ++++ tests/integration/pip_parse_isolated/.bazelrc | 8 ++++++++ .../pip_parse_isolated/BUILD.bazel | 7 +++++++ .../pip_parse_isolated/MODULE.bazel | 19 +++++++++++++++++++ .../integration/pip_parse_isolated/WORKSPACE | 0 .../pip_parse_isolated/requirements_lock.txt | 2 ++ .../pip_parse_isolated/test_isolated.py | 16 ++++++++++++++++ 8 files changed, 57 insertions(+) create mode 100644 tests/integration/pip_parse_isolated/.bazelrc create mode 100644 tests/integration/pip_parse_isolated/BUILD.bazel create mode 100644 tests/integration/pip_parse_isolated/MODULE.bazel create mode 100644 tests/integration/pip_parse_isolated/WORKSPACE create mode 100644 tests/integration/pip_parse_isolated/requirements_lock.txt create mode 100644 tests/integration/pip_parse_isolated/test_isolated.py diff --git a/.bazelrc.deleted_packages b/.bazelrc.deleted_packages index 2d8a8075fa..5fe84c4475 100644 --- a/.bazelrc.deleted_packages +++ b/.bazelrc.deleted_packages @@ -36,6 +36,7 @@ common --deleted_packages=tests/integration/custom_commands common --deleted_packages=tests/integration/local_toolchains common --deleted_packages=tests/integration/pip_parse common --deleted_packages=tests/integration/pip_parse/empty +common --deleted_packages=tests/integration/pip_parse_isolated common --deleted_packages=tests/integration/py_cc_toolchain_registered common --deleted_packages=tests/modules/another_module common --deleted_packages=tests/modules/other diff --git a/tests/integration/BUILD.bazel b/tests/integration/BUILD.bazel index f0f58daa3a..1807a30902 100644 --- a/tests/integration/BUILD.bazel +++ b/tests/integration/BUILD.bazel @@ -67,6 +67,10 @@ rules_python_integration_test( name = "pip_parse_test", ) +rules_python_integration_test( + name = "pip_parse_isolated_test", +) + rules_python_integration_test( name = "pip_parse_workspace_test", bzlmod = False, diff --git a/tests/integration/pip_parse_isolated/.bazelrc b/tests/integration/pip_parse_isolated/.bazelrc new file mode 100644 index 0000000000..227ce5a4cd --- /dev/null +++ b/tests/integration/pip_parse_isolated/.bazelrc @@ -0,0 +1,8 @@ +# Bazel configuration flags + +build --enable_runfiles + +common --experimental_isolated_extension_usages + +# https://docs.bazel.build/versions/main/best-practices.html#using-the-bazelrc-file +try-import %workspace%/user.bazelrc diff --git a/tests/integration/pip_parse_isolated/BUILD.bazel b/tests/integration/pip_parse_isolated/BUILD.bazel new file mode 100644 index 0000000000..2f825107f1 --- /dev/null +++ b/tests/integration/pip_parse_isolated/BUILD.bazel @@ -0,0 +1,7 @@ +load("@rules_python//python:py_test.bzl", "py_test") + +py_test( + name = "test_isolated", + srcs = ["test_isolated.py"], + deps = ["@pypi//six"], +) diff --git a/tests/integration/pip_parse_isolated/MODULE.bazel b/tests/integration/pip_parse_isolated/MODULE.bazel new file mode 100644 index 0000000000..6c44257acb --- /dev/null +++ b/tests/integration/pip_parse_isolated/MODULE.bazel @@ -0,0 +1,19 @@ +module(name = "pip_parse_isolated") + +bazel_dep(name = "rules_python") +local_path_override( + module_name = "rules_python", + path = "../../..", +) + +python = use_extension("@rules_python//python/extensions:python.bzl", "python") +python.toolchain(python_version = "3.13") + +# This test module verifies that dependencies can be used with `isolate = True`. +pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip", isolate = True) +pip.parse( + hub_name = "pypi", + python_version = "3.13", + requirements_lock = "//:requirements_lock.txt", +) +use_repo(pip, "pypi") diff --git a/tests/integration/pip_parse_isolated/WORKSPACE b/tests/integration/pip_parse_isolated/WORKSPACE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/integration/pip_parse_isolated/requirements_lock.txt b/tests/integration/pip_parse_isolated/requirements_lock.txt new file mode 100644 index 0000000000..b1445a37ae --- /dev/null +++ b/tests/integration/pip_parse_isolated/requirements_lock.txt @@ -0,0 +1,2 @@ +six==1.17.0 \ + --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 diff --git a/tests/integration/pip_parse_isolated/test_isolated.py b/tests/integration/pip_parse_isolated/test_isolated.py new file mode 100644 index 0000000000..f889f071fb --- /dev/null +++ b/tests/integration/pip_parse_isolated/test_isolated.py @@ -0,0 +1,16 @@ +""" +Verify that a dependency added using an isolated extension can be imported. +See MODULE.bazel. +""" + +import six +import unittest + + +class TestIsolated(unittest.TestCase): + def test_import(self): + self.assertTrue(hasattr(six, "PY3")) + + +if __name__ == "__main__": + unittest.main() From 0130300f8f18901bb107cd3c0beafb914249e7ca Mon Sep 17 00:00:00 2001 From: Will Noble Date: Tue, 17 Mar 2026 13:05:20 -0700 Subject: [PATCH 2/5] Draft a fix --- python/private/pypi/extension.bzl | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index f68596b845..50a961f38f 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -123,6 +123,23 @@ def build_config( # overrides, etc. Index overrides per platform could be also used here. ) + # When no platforms are configured (e.g., in isolated mode where + # rules_python's pip.default tags are not visible), provide a minimal + # host platform default so that requirements files can still be parsed. + if not defaults["platforms"]: + os_name = repo_utils.get_platforms_os_name(module_ctx) + arch_name = repo_utils.get_platforms_cpu_name(module_ctx) + platform_name = "{}_{}".format(os_name, arch_name) + defaults["platforms"][platform_name] = { + "name": platform_name.replace("-", "_").lower(), + "arch_name": arch_name, + "os_name": os_name, + "config_settings": [ + "@platforms//cpu:{}".format(arch_name), + "@platforms//os:{}".format(os_name), + ], + } + return struct( auth_patterns = defaults.get("auth_patterns", {}), netrc = defaults.get("netrc", None), From c438551b456976cc3f82a19a7bbbbf2fef49a185 Mon Sep 17 00:00:00 2001 From: Will Noble Date: Tue, 17 Mar 2026 13:36:38 -0700 Subject: [PATCH 3/5] Address buildifier issue --- python/private/pypi/extension.bzl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index 50a961f38f..f438263612 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -131,13 +131,13 @@ def build_config( arch_name = repo_utils.get_platforms_cpu_name(module_ctx) platform_name = "{}_{}".format(os_name, arch_name) defaults["platforms"][platform_name] = { - "name": platform_name.replace("-", "_").lower(), "arch_name": arch_name, - "os_name": os_name, "config_settings": [ "@platforms//cpu:{}".format(arch_name), "@platforms//os:{}".format(os_name), ], + "name": platform_name.replace("-", "_").lower(), + "os_name": os_name, } return struct( From f4ad541dcb78b39a3e8b6984b55fdd771637cad1 Mon Sep 17 00:00:00 2001 From: Will Noble Date: Thu, 2 Apr 2026 01:20:09 -0700 Subject: [PATCH 4/5] Incorporate feedback --- MODULE.bazel | 134 ------------------- python/private/pypi/extension.bzl | 142 +++++++++++++++++--- tests/pypi/extension/extension_tests.bzl | 157 ++++++++++++++++------- 3 files changed, 232 insertions(+), 201 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 95d6b9e3a9..af6dfbc6cc 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -65,140 +65,6 @@ register_toolchains("@pythons_hub//:all") pip = use_extension("//python/extensions:pip.bzl", "pip") -# NOTE @aignas 2025-07-06: we define these platforms to keep backwards compatibility. Whilst we -# stabilize the API this list may be updated with a mention in the CHANGELOG. -[ - pip.default( - arch_name = cpu, - config_settings = [ - "@platforms//cpu:{}".format(cpu), - "@platforms//os:linux", - "//python/config_settings:_is_py_freethreaded_{}".format( - "yes" if freethreaded else "no", - ), - ], - env = {"platform_version": "0"}, - marker = "python_version >= '3.13'" if freethreaded else "", - os_name = "linux", - platform = "linux_{}{}".format(cpu, freethreaded), - whl_abi_tags = ["cp{major}{minor}t"] if freethreaded else [ - "abi3", - "cp{major}{minor}", - ], - whl_platform_tags = [ - "linux_{}".format(cpu), - "manylinux_*_{}".format(cpu), - ], - ) - for cpu in [ - "x86_64", - "aarch64", - ] - for freethreaded in [ - "", - "_freethreaded", - ] -] - -[ - pip.default( - arch_name = cpu, - config_settings = [ - "@platforms//cpu:{}".format(cpu), - "@platforms//os:osx", - "//python/config_settings:_is_py_freethreaded_{}".format( - "yes" if freethreaded else "no", - ), - ], - # We choose the oldest non-EOL version at the time when we release `rules_python`. - # See https://endoflife.date/macos - env = {"platform_version": "14.0"}, - marker = "python_version >= '3.13'" if freethreaded else "", - os_name = "osx", - platform = "osx_{}{}".format(cpu, freethreaded), - whl_abi_tags = ["cp{major}{minor}t"] if freethreaded else [ - "abi3", - "cp{major}{minor}", - ], - whl_platform_tags = [ - "macosx_*_{}".format(suffix) - for suffix in platform_tag_cpus - ], - ) - for cpu, platform_tag_cpus in { - "aarch64": [ - "universal2", - "arm64", - ], - "x86_64": [ - "universal2", - "x86_64", - ], - }.items() - for freethreaded in [ - "", - "_freethreaded", - ] -] - -[ - pip.default( - arch_name = cpu, - config_settings = [ - "@platforms//cpu:{}".format(cpu), - "@platforms//os:windows", - "//python/config_settings:_is_py_freethreaded_{}".format( - "yes" if freethreaded else "no", - ), - ], - env = {"platform_version": "0"}, - marker = "python_version >= '3.13'" if freethreaded else "", - os_name = "windows", - platform = "windows_{}{}".format(cpu, freethreaded), - whl_abi_tags = ["cp{major}{minor}t"] if freethreaded else [ - "abi3", - "cp{major}{minor}", - ], - whl_platform_tags = whl_platform_tags, - ) - for cpu, whl_platform_tags in { - "x86_64": ["win_amd64"], - }.items() - for freethreaded in [ - "", - "_freethreaded", - ] -] - -[ - pip.default( - arch_name = cpu, - config_settings = [ - "@platforms//cpu:{}".format(cpu), - "@platforms//os:windows", - "//python/config_settings:_is_py_freethreaded_{}".format( - "yes" if freethreaded else "no", - ), - ], - env = {"platform_version": "0"}, - marker = "python_version >= '3.13'" if freethreaded else "python_version >= '3.11'", - os_name = "windows", - platform = "windows_{}{}".format(cpu, freethreaded), - whl_abi_tags = ["cp{major}{minor}t"] if freethreaded else [ - "abi3", - "cp{major}{minor}", - ], - whl_platform_tags = whl_platform_tags, - ) - for cpu, whl_platform_tags in { - "aarch64": ["win_arm64"], - }.items() - for freethreaded in [ - "", - "_freethreaded", - ] -] - pip.parse( hub_name = "rules_python_publish_deps", python_version = "3.11", diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index b8b9ecf027..f4e9699234 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -56,6 +56,129 @@ def _whl_mods_impl(whl_mods_dict): whl_mods = whl_mods, ) +def default_platforms(): + """Return the built-in default platform definitions. + + These provide the platform metadata needed for pip wheel resolution + (whl_abi_tags, whl_platform_tags, config_settings, etc.) across all + common OS/arch combinations. They are always used as the starting point + for build_config; root modules can override individual platforms via + pip.default tags. + + Returns: + A dict of platform name to platform config dicts. + """ + # NOTE @aignas 2025-07-06: we define these platforms to keep backwards compatibility with the + # current `experimental_index_url` implementation. Whilst we stabilize the API this list may be + # updated with a mention in the CHANGELOG. + + platforms = {} + + # Linux platforms + for cpu in ["x86_64", "aarch64"]: + for freethreaded in ["", "_freethreaded"]: + platform_name = "linux_{}{}".format(cpu, freethreaded) + platforms[platform_name] = { + "arch_name": cpu, + "config_settings": [ + "@platforms//cpu:{}".format(cpu), + "@platforms//os:linux", + "//python/config_settings:_is_py_freethreaded_{}".format( + "yes" if freethreaded else "no", + ), + ], + "env": {"platform_version": "0"}, + "marker": "python_version >= '3.13'" if freethreaded else "", + "name": platform_name, + "os_name": "linux", + "whl_abi_tags": ["cp{major}{minor}t"] if freethreaded else [ + "abi3", + "cp{major}{minor}", + ], + "whl_platform_tags": [ + "linux_{}".format(cpu), + "manylinux_*_{}".format(cpu), + ], + } + + # macOS platforms + for cpu, platform_tag_cpus in { + "aarch64": ["universal2", "arm64"], + "x86_64": ["universal2", "x86_64"], + }.items(): + for freethreaded in ["", "_freethreaded"]: + platform_name = "osx_{}{}".format(cpu, freethreaded) + platforms[platform_name] = { + "arch_name": cpu, + "config_settings": [ + "@platforms//cpu:{}".format(cpu), + "@platforms//os:osx", + "//python/config_settings:_is_py_freethreaded_{}".format( + "yes" if freethreaded else "no", + ), + ], + "env": {"platform_version": "14.0"}, + "marker": "python_version >= '3.13'" if freethreaded else "", + "name": platform_name, + "os_name": "osx", + "whl_abi_tags": ["cp{major}{minor}t"] if freethreaded else [ + "abi3", + "cp{major}{minor}", + ], + "whl_platform_tags": [ + "macosx_*_{}".format(suffix) + for suffix in platform_tag_cpus + ], + } + + # Windows x86_64 platforms + for freethreaded in ["", "_freethreaded"]: + platform_name = "windows_x86_64{}".format(freethreaded) + platforms[platform_name] = { + "arch_name": "x86_64", + "config_settings": [ + "@platforms//cpu:x86_64", + "@platforms//os:windows", + "//python/config_settings:_is_py_freethreaded_{}".format( + "yes" if freethreaded else "no", + ), + ], + "env": {"platform_version": "0"}, + "marker": "python_version >= '3.13'" if freethreaded else "", + "name": platform_name, + "os_name": "windows", + "whl_abi_tags": ["cp{major}{minor}t"] if freethreaded else [ + "abi3", + "cp{major}{minor}", + ], + "whl_platform_tags": ["win_amd64"], + } + + # Windows aarch64 platforms + for freethreaded in ["", "_freethreaded"]: + platform_name = "windows_aarch64{}".format(freethreaded) + platforms[platform_name] = { + "arch_name": "aarch64", + "config_settings": [ + "@platforms//cpu:aarch64", + "@platforms//os:windows", + "//python/config_settings:_is_py_freethreaded_{}".format( + "yes" if freethreaded else "no", + ), + ], + "env": {"platform_version": "0"}, + "marker": "python_version >= '3.13'" if freethreaded else "python_version >= '3.11'", + "name": platform_name, + "os_name": "windows", + "whl_abi_tags": ["cp{major}{minor}t"] if freethreaded else [ + "abi3", + "cp{major}{minor}", + ], + "whl_platform_tags": ["win_arm64"], + } + + return platforms + def _configure(config, *, override = False, **kwargs): """Set the value in the config if the value is provided""" env = kwargs.get("env") @@ -86,7 +209,7 @@ def build_config( A struct with the configuration. """ defaults = { - "platforms": {}, + "platforms": default_platforms(), } for mod in module_ctx.modules: if not (mod.is_root or mod.name == "rules_python"): @@ -124,23 +247,6 @@ def build_config( # overrides, etc. Index overrides per platform could be also used here. ) - # When no platforms are configured (e.g., in isolated mode where - # rules_python's pip.default tags are not visible), provide a minimal - # host platform default so that requirements files can still be parsed. - if not defaults["platforms"]: - os_name = repo_utils.get_platforms_os_name(module_ctx) - arch_name = repo_utils.get_platforms_cpu_name(module_ctx) - platform_name = "{}_{}".format(os_name, arch_name) - defaults["platforms"][platform_name] = { - "arch_name": arch_name, - "config_settings": [ - "@platforms//cpu:{}".format(arch_name), - "@platforms//os:{}".format(os_name), - ], - "name": platform_name.replace("-", "_").lower(), - "os_name": os_name, - } - return struct( auth_patterns = defaults.get("auth_patterns", {}), index_url = defaults.get("index_url", "https://pypi.org/simple").rstrip("/"), diff --git a/tests/pypi/extension/extension_tests.bzl b/tests/pypi/extension/extension_tests.bzl index 7999e42a7b..5fa5a7d03e 100644 --- a/tests/pypi/extension/extension_tests.bzl +++ b/tests/pypi/extension/extension_tests.bzl @@ -16,7 +16,8 @@ load("@rules_testing//lib:test_suite.bzl", "test_suite") load("@rules_testing//lib:truth.bzl", "subjects") -load("//python/private/pypi:extension.bzl", "build_config", "parse_modules") # buildifier: disable=bzl-visibility +load("//python/private/pypi:extension.bzl", "build_config", "default_platforms", "parse_modules") # buildifier: disable=bzl-visibility +load("//python/private/pypi:platform.bzl", _plat = "platform") load("//python/private/pypi:whl_config_setting.bzl", "whl_config_setting") # buildifier: disable=bzl-visibility load(":pip_parse.bzl", _parse = "pip_parse") @@ -49,33 +50,63 @@ simple==0.0.1 \ ], ) -def _mod(*, name, default = [], parse = [], override = [], whl_mods = [], is_root = True): +def _default( + *, + arch_name = None, + auth_patterns = None, + config_settings = None, + env = None, + index_url = None, + marker = None, + netrc = None, + os_name = None, + platform = None, + whl_platform_tags = None, + whl_abi_tags = None): + return struct( + arch_name = arch_name, + auth_patterns = auth_patterns or {}, + config_settings = config_settings, + env = env or {}, + index_url = index_url or "", + marker = marker or "", + netrc = netrc, + os_name = os_name, + platform = platform, + whl_abi_tags = whl_abi_tags or [], + whl_platform_tags = whl_platform_tags or [], + ) + +# The default value for the default platforms tags use in `_mod`. +_default_tags_default = [ + _default( + platform = "{}_{}{}".format(os, cpu, freethreaded), + os_name = os, + arch_name = cpu, + config_settings = [ + "@platforms//os:{}".format(os), + "@platforms//cpu:{}".format(cpu), + ], + whl_abi_tags = ["cp{major}{minor}t"] if freethreaded else ["abi3", "cp{major}{minor}"], + whl_platform_tags = whl_platform_tags, + ) + for (os, cpu, freethreaded), whl_platform_tags in { + ("linux", "x86_64", ""): ["linux_x86_64", "manylinux_*_x86_64"], + ("linux", "x86_64", "_freethreaded"): ["linux_x86_64", "manylinux_*_x86_64"], + ("linux", "aarch64", ""): ["linux_aarch64", "manylinux_*_aarch64"], + ("osx", "aarch64", ""): ["macosx_*_arm64"], + ("windows", "aarch64", ""): ["win_arm64"], + }.items() +] + +def _mod(*, name, default = _default_tags_default, parse = [], override = [], whl_mods = [], is_root = True): return struct( name = name, tags = struct( parse = parse, override = override, whl_mods = whl_mods, - default = default or [ - _default( - platform = "{}_{}{}".format(os, cpu, freethreaded), - os_name = os, - arch_name = cpu, - config_settings = [ - "@platforms//os:{}".format(os), - "@platforms//cpu:{}".format(cpu), - ], - whl_abi_tags = ["cp{major}{minor}t"] if freethreaded else ["abi3", "cp{major}{minor}"], - whl_platform_tags = whl_platform_tags, - ) - for (os, cpu, freethreaded), whl_platform_tags in { - ("linux", "x86_64", ""): ["linux_x86_64", "manylinux_*_x86_64"], - ("linux", "x86_64", "_freethreaded"): ["linux_x86_64", "manylinux_*_x86_64"], - ("linux", "aarch64", ""): ["linux_aarch64", "manylinux_*_aarch64"], - ("osx", "aarch64", ""): ["macosx_*_arm64"], - ("windows", "aarch64", ""): ["win_arm64"], - }.items() - ], + default = default, ), is_root = is_root, ) @@ -110,33 +141,6 @@ def _build_config(env, enable_pipstar = 0, **kwargs): ), ) -def _default( - *, - arch_name = None, - auth_patterns = None, - config_settings = None, - env = None, - index_url = None, - marker = None, - netrc = None, - os_name = None, - platform = None, - whl_platform_tags = None, - whl_abi_tags = None): - return struct( - arch_name = arch_name, - auth_patterns = auth_patterns or {}, - config_settings = config_settings, - env = env or {}, - index_url = index_url or "", - marker = marker or "", - netrc = netrc, - os_name = os_name, - platform = platform, - whl_abi_tags = whl_abi_tags or [], - whl_platform_tags = whl_platform_tags or [], - ) - def _test_simple(env): pypi = _parse_modules( env, @@ -184,6 +188,58 @@ def _test_simple(env): _tests.append(_test_simple) +def _test_simple_isolated(env): + """ + Simulate `isolate = True` with parse_modules: + No pip.default tags, + but requirements parsing still produces the expected hub output. + """ + pypi = _parse_modules( + env, + module_ctx = _mock_mctx( + _mod( + name = "my_module", + default = [], # no platform tags + parse = [ + _parse( + hub_name = "pypi", + python_version = "3.15", + requirements_lock = "requirements.txt", + ), + ], + ), + os_name = "linux", + arch_name = "x86_64", + ), + available_interpreters = { + "python_3_15_host": "unit_test_interpreter_target", + }, + minor_mapping = {"3.15": "3.15.19"}, + ) + + pypi.exposed_packages().contains_exactly({"pypi": ["simple"]}) + pypi.hub_group_map().contains_exactly({"pypi": {}}) + pypi.hub_whl_map().contains_exactly({"pypi": { + "simple": { + "pypi_315_simple": [ + whl_config_setting( + version = "3.15", + ), + ], + }, + }}) + pypi.whl_libraries().contains_exactly({ + "pypi_315_simple": { + "config_load": "@pypi//:config.bzl", + "dep_template": "@pypi//{name}:{target}", + "python_interpreter_target": "unit_test_interpreter_target", + "requirement": "simple==0.0.1 --hash=sha256:deadbeef --hash=sha256:deadbaaf", + }, + }) + pypi.whl_mods().contains_exactly({}) + +_tests.append(_test_simple_isolated) + def _test_build_pipstar_platform(env): config = _build_config( env, @@ -237,6 +293,9 @@ def _test_build_pipstar_platform(env): whl_abi_tags = ["none", "abi3", "cp{major}{minor}"], whl_platform_tags = ["any"], ), + } | { + name: _plat(**values) + for name, values in default_platforms().items() }) _tests.append(_test_build_pipstar_platform) From 590b19be70a5999d8a9e5d492d7cff14283607d0 Mon Sep 17 00:00:00 2001 From: Will Noble Date: Fri, 24 Apr 2026 11:34:09 -0700 Subject: [PATCH 5/5] Also update text of note --- python/private/pypi/extension.bzl | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/python/private/pypi/extension.bzl b/python/private/pypi/extension.bzl index f4e9699234..b9d522b33a 100644 --- a/python/private/pypi/extension.bzl +++ b/python/private/pypi/extension.bzl @@ -68,9 +68,8 @@ def default_platforms(): Returns: A dict of platform name to platform config dicts. """ - # NOTE @aignas 2025-07-06: we define these platforms to keep backwards compatibility with the - # current `experimental_index_url` implementation. Whilst we stabilize the API this list may be - # updated with a mention in the CHANGELOG. + # NOTE @aignas 2025-07-06: we define these platforms to keep backwards compatibility. Whilst we + # stabilize the API this list may be updated with a mention in the CHANGELOG. platforms = {}