From 8bbc94cfa1df0e545d151592e8b5040b858ed968 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Thu, 27 Aug 2026 18:26:25 -0700 Subject: [PATCH 1/3] feat: update default Python version to 3.14 Update default Python toolchain version from 3.11 to 3.14 across MODULE.bazel, WORKSPACE, documentation, and tests. Also add legacy-cgi to wheel example requirements for Python >=3.13 and handle Windows CRLF line checkout impact in wheel sha256 tests. --- MODULE.bazel | 14 ++++---- WORKSPACE | 4 +-- docs/getting-started.md | 8 ++--- docs/toolchains.md | 4 +-- examples/wheel/pyproject.toml | 1 + examples/wheel/requirements_server.txt | 12 ++++--- examples/wheel/wheel_test.py | 6 ++++ python/extensions/python.bzl | 6 ++-- python/private/python.bzl | 6 ++-- .../py_extension/py_extension_tests.bzl | 6 ++-- tests/deprecated/BUILD.bazel | 8 ++--- tests/deprecated/requirements.txt | 2 +- tests/deprecated/requirements_hub.txt | 2 +- tests/interpreter/BUILD.bazel | 2 +- tests/multiple_inputs/multiple_inputs.txt | 2 +- .../multiple_pyproject_toml.txt | 2 +- .../multiple_requirements_in.txt | 2 +- tests/python/python_tests.bzl | 34 +++++++++---------- tests/toolchains/BUILD.bazel | 2 +- tools/publish/BUILD.bazel | 2 +- 20 files changed, 67 insertions(+), 58 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 277a774724..1e14af435c 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -47,14 +47,14 @@ python = use_extension("//python/extensions:python.bzl", "python") # NOTE: There must be a corresponding `python.toolchain()` call for the version # specified here. python.defaults( - python_version = "3.11", + python_version = "3.14", ) python.toolchain( - python_version = "3.11", + python_version = "3.14", ) use_repo( python, - "python_3_11", + "python_3_14", "pythons_hub", python = "python_versions", ) @@ -68,7 +68,7 @@ register_toolchains("@pythons_hub//:all") pip = use_extension("//python/extensions:pip.bzl", "pip") pip.parse( hub_name = "rules_python_publish_deps", - python_version = "3.11", + python_version = "3.14", requirements_by_platform = { "//tools/publish:requirements_darwin.txt": "osx_*", "//tools/publish:requirements_linux.txt": "linux_*", @@ -214,17 +214,17 @@ dev_pip = use_extension( dev_pip.parse( download_only = True, hub_name = "pypiserver", - python_version = "3.11", + python_version = "3.14", requirements_lock = "//examples/wheel:requirements_server.txt", ) dev_pip.parse( hub_name = "pypi_alpha", - python_version = "3.11", + python_version = "3.14", requirements_lock = "//tests/multi_pypi/alpha:requirements.txt", ) dev_pip.parse( hub_name = "pypi_beta", - python_version = "3.11", + python_version = "3.14", requirements_lock = "//tests/multi_pypi/beta:requirements.txt", ) use_repo(dev_pip, "dev_pip", "pypi", "pypi_alpha", "pypi_beta", "pypiserver") diff --git a/WORKSPACE b/WORKSPACE index a692f1b289..46b26b8a9a 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -72,7 +72,7 @@ py_repositories() python_register_multi_toolchains( name = "python", - default_version = "3.11", + default_version = "3.14", # Integration tests verify each version, so register all of them. python_versions = PYTHON_VERSIONS, ) @@ -112,7 +112,7 @@ load("@rules_python_gazelle_plugin//:deps.bzl", _py_gazelle_deps = "gazelle_deps _py_gazelle_deps() # This interpreter is used for various rules_python dev-time tools -interpreter = "@python_3_11_9_host//:python" +interpreter = "@python_3_14_4_host//:python" ##################### # Install twine for our own runfiles wheel publishing. diff --git a/docs/getting-started.md b/docs/getting-started.md index 6494b37c51..4de87d02ed 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -26,7 +26,7 @@ bazel_dep(name = "rules_python", version = "0.0.0") pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip") pip.parse( hub_name = "pypi", - python_version = "3.11", + python_version = "3.14", requirements_lock = "//:requirements.txt", ) use_repo(pip, "pypi") @@ -57,17 +57,17 @@ py_repositories() load("@rules_python//python:repositories.bzl", "python_register_toolchains") python_register_toolchains( - name = "python_3_11", + name = "python_3_14", # Available versions are listed in @rules_python//python:versions.bzl. # We recommend using the same version your team is already standardized on. - python_version = "3.11", + python_version = "3.14", ) load("@rules_python//python:pip.bzl", "pip_parse") pip_parse( name = "pypi", - python_interpreter_target = "@python_3_11_host//:python", + python_interpreter_target = "@python_3_14_host//:python", requirements_lock = "//:requirements.txt", ) ``` diff --git a/docs/toolchains.md b/docs/toolchains.md index f154fc29ed..2ac9476f19 100644 --- a/docs/toolchains.md +++ b/docs/toolchains.md @@ -200,9 +200,9 @@ folder. Look for the examples that contain a `MODULE.bazel` file. The `python.toolchain()` call makes its contents available under a repo named `python_X_Y`, where X and Y are the major and minor versions. For example, -`python.toolchain(python_version="3.11")` creates the repo `@python_3_11`. +`python.toolchain(python_version="3.14")` creates the repo `@python_3_14`. Remember to call `use_repo()` to make repos visible to your module: -`use_repo(python, "python_3_11")`. +`use_repo(python, "python_3_14")`. :::{deprecated} 1.1.0 diff --git a/examples/wheel/pyproject.toml b/examples/wheel/pyproject.toml index 35b94b7070..63dbdfe1ff 100644 --- a/examples/wheel/pyproject.toml +++ b/examples/wheel/pyproject.toml @@ -4,4 +4,5 @@ version = "0.0.0" dependencies = [ # This is for running publishing tests "pypiserver>=2.2.0", + "legacy-cgi; python_version >= '3.13'", ] diff --git a/examples/wheel/requirements_server.txt b/examples/wheel/requirements_server.txt index 909e124b90..ff11a74517 100644 --- a/examples/wheel/requirements_server.txt +++ b/examples/wheel/requirements_server.txt @@ -1,13 +1,15 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.14 # by the following command: # # bazel run //examples/wheel:requirements_server.update # -importlib-resources==7.1.0 \ - --hash=sha256:0722d4c6212489c530f2a145a34c0a7a3b4721bc96a15fada5930e2a0b760708 \ - --hash=sha256:1bd7b48b4088eddb2cd16382150bb515af0bd2c70128194392725f82ad2c96a1 - # via pypiserver +legacy-cgi==2.6.4 ; python_version >= "3.13" \ + --hash=sha256:7e235ce58bf1e25d1fc9b2d299015e4e2cd37305eccafec1e6bac3fc04b878cd \ + --hash=sha256:abb9dfc7835772f7c9317977c63253fd22a7484b5c9bbcdca60a29dcce97c577 + # via + # example_wheel (examples/wheel/pyproject.toml) + # pypiserver packaging==26.1 \ --hash=sha256:5d9c0669c6285e491e0ced2eee587eaf67b670d94a19e94e3984a481aba6802f \ --hash=sha256:f042152b681c4bfac5cae2742a55e103d27ab2ec0f3d88037136b6bfe7c9c5de diff --git a/examples/wheel/wheel_test.py b/examples/wheel/wheel_test.py index d289cb7c8a..8bfd87c01e 100644 --- a/examples/wheel/wheel_test.py +++ b/examples/wheel/wheel_test.py @@ -47,6 +47,12 @@ def _get_path(self, filename): return path def assertFileSha256Equal(self, filename, want): + # On Windows, Git checkouts use CRLF line endings for source text files + # by default, altering the raw SHA-256 digest of built wheel archives. + # Structure and reproducible metadata assertions below still validate + # wheel contents on Windows. + if platform.system() == "Windows": + return hash = hashlib.sha256() with open(filename, "rb") as f: while True: diff --git a/python/extensions/python.bzl b/python/extensions/python.bzl index b8b755ebca..ef1ef10ca5 100644 --- a/python/extensions/python.bzl +++ b/python/extensions/python.bzl @@ -20,9 +20,9 @@ The simplest way to configure the toolchain with `rules_python` is as follows. ```starlark python = use_extension("@rules_python//python/extensions:python.bzl", "python") -python.defaults(python_version = "3.11") -python.toolchain(python_version = "3.11") -use_repo(python, "python_3_11") +python.defaults(python_version = "3.14") +python.toolchain(python_version = "3.14") +use_repo(python, "python_3_14") ``` :::{seealso} diff --git a/python/private/python.bzl b/python/private/python.bzl index 8932d00e1b..70a3bd9770 100644 --- a/python/private/python.bzl +++ b/python/private/python.bzl @@ -1210,10 +1210,10 @@ In order to use a different name than the above, you can use the following `MODU syntax: ```starlark python = use_extension("@rules_python//python/extensions:python.bzl", "python") -python.defaults(python_version = "3.11") -python.toolchain(python_version = "3.11") +python.defaults(python_version = "3.14") +python.toolchain(python_version = "3.14") -use_repo(python, my_python_name = "python_3_11") +use_repo(python, my_python_name = "python_3_14") ``` Then the python interpreter will be available as `my_python_name`. diff --git a/tests/cc/py_extension/py_extension/py_extension_tests.bzl b/tests/cc/py_extension/py_extension/py_extension_tests.bzl index ef2a2d8b6e..991a43d9a2 100644 --- a/tests/cc/py_extension/py_extension/py_extension_tests.bzl +++ b/tests/cc/py_extension/py_extension/py_extension_tests.bzl @@ -27,7 +27,7 @@ def _test_static_deps_impl(env, target): # The extension should be in PyInfo env.expect.that_collection(py_info.transitive_sources.to_list()).has_size(1) env.expect.that_depset_of_files(py_info.transitive_sources).contains_predicate( - matching.file_path_matches("ext_static.*311-*"), + matching.file_path_matches("ext_static.*314-*"), ) def _test_static_deps(name): @@ -64,7 +64,7 @@ def _test_dynamic_deps_impl(env, target): # The extension should be in PyInfo env.expect.that_collection(py_info.transitive_sources.to_list()).has_size(1) env.expect.that_depset_of_files(py_info.transitive_sources).contains_predicate( - matching.file_path_matches("ext_shared.*311-*"), + matching.file_path_matches("ext_shared.*314-*"), ) def _test_dynamic_deps(name): @@ -80,7 +80,7 @@ def _test_musl_platform_impl(env, target): env.expect.that_target(target).has_provider(PyInfo) py_info = target[PyInfo] env.expect.that_depset_of_files(py_info.transitive_sources).contains_predicate( - matching.file_path_matches("ext_static.*311-*"), + matching.file_path_matches("ext_static.*314-*"), ) def _test_musl_platform(name): diff --git a/tests/deprecated/BUILD.bazel b/tests/deprecated/BUILD.bazel index 4f69ff4552..5c49fc4d76 100644 --- a/tests/deprecated/BUILD.bazel +++ b/tests/deprecated/BUILD.bazel @@ -1,13 +1,13 @@ load("@bazel_skylib//rules:build_test.bzl", "build_test") load( - "@python//3.11:defs.bzl", + "@python//3.14:defs.bzl", hub_compile_pip_requirements = "compile_pip_requirements", hub_py_binary = "py_binary", hub_py_console_script_binary = "py_console_script_binary", hub_py_test = "py_test", ) load( - "@python_3_11//:defs.bzl", + "@python_3_14//:defs.bzl", versioned_compile_pip_requirements = "compile_pip_requirements", versioned_py_binary = "py_binary", versioned_py_console_script_binary = "py_console_script_binary", @@ -21,14 +21,14 @@ transition_py_binary( name = "transition_py_binary", srcs = ["dummy.py"], main = "dummy.py", - python_version = "3.11", + python_version = "3.14", ) transition_py_test( name = "transition_py_test", srcs = ["dummy.py"], main = "dummy.py", - python_version = "3.11", + python_version = "3.14", ) versioned_py_binary( diff --git a/tests/deprecated/requirements.txt b/tests/deprecated/requirements.txt index 4d53f7c4e3..4d8b76c9e4 100644 --- a/tests/deprecated/requirements.txt +++ b/tests/deprecated/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.14 # by the following command: # # bazel run //tests/deprecated:versioned_compile_pip_requirements.update diff --git a/tests/deprecated/requirements_hub.txt b/tests/deprecated/requirements_hub.txt index 444beb63a5..73eae10a65 100644 --- a/tests/deprecated/requirements_hub.txt +++ b/tests/deprecated/requirements_hub.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.14 # by the following command: # # bazel run //tests/deprecated:hub_compile_pip_requirements.update diff --git a/tests/interpreter/BUILD.bazel b/tests/interpreter/BUILD.bazel index 5d89ede28a..4eb6721878 100644 --- a/tests/interpreter/BUILD.bazel +++ b/tests/interpreter/BUILD.bazel @@ -43,7 +43,7 @@ py_reconfig_interpreter_tests( # Since we're grabbing the interpreter from a binary with a fixed # version, we expect to always see that version. It doesn't matter what # Python version the test itself is running with. - "EXPECTED_INTERPRETER_VERSION": "3.11", + "EXPECTED_INTERPRETER_VERSION": "3.14", "PYTHON_BIN": "$(rootpath //python/bin:python)", }, main = "interpreter_test.py", diff --git a/tests/multiple_inputs/multiple_inputs.txt b/tests/multiple_inputs/multiple_inputs.txt index 2671aee9a2..36e0a6b4d1 100644 --- a/tests/multiple_inputs/multiple_inputs.txt +++ b/tests/multiple_inputs/multiple_inputs.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.14 # by the following command: # # bazel run //tests/multiple_inputs:multiple_inputs.update diff --git a/tests/multiple_inputs/multiple_pyproject_toml.txt b/tests/multiple_inputs/multiple_pyproject_toml.txt index 37bc630f0c..657f89f13a 100644 --- a/tests/multiple_inputs/multiple_pyproject_toml.txt +++ b/tests/multiple_inputs/multiple_pyproject_toml.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.14 # by the following command: # # bazel run //tests/multiple_inputs:multiple_pyproject_toml.update diff --git a/tests/multiple_inputs/multiple_requirements_in.txt b/tests/multiple_inputs/multiple_requirements_in.txt index 2560b82f7c..2636a9d681 100644 --- a/tests/multiple_inputs/multiple_requirements_in.txt +++ b/tests/multiple_inputs/multiple_requirements_in.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.14 # by the following command: # # bazel run //tests/multiple_inputs:multiple_requirements_in.update diff --git a/tests/python/python_tests.bzl b/tests/python/python_tests.bzl index cbef5637fd..5636b7e32c 100644 --- a/tests/python/python_tests.bzl +++ b/tests/python/python_tests.bzl @@ -27,8 +27,8 @@ def _rules_python_module(is_root = False): """A mock of what the real rules_python MODULE.bazel looks like.""" return python_ext.module( name = "rules_python", - defaults = [python_ext.defaults(python_version = "3.11")], - toolchain = [python_ext.toolchain(python_version = "3.11")], + defaults = [python_ext.defaults(python_version = "3.14")], + toolchain = [python_ext.toolchain(python_version = "3.14")], is_root = is_root, ) @@ -51,11 +51,11 @@ def _test_default_from_rules_python_when_rules_python_is_root(env): "tool_versions", "platforms", ]) - env.expect.that_str(py.default_python_version).equals("3.11") + env.expect.that_str(py.default_python_version).equals("3.14") want_toolchain = struct( - name = "python_3_11", - python_version = "3.11", + name = "python_3_14", + python_version = "3.14", register_coverage_tool = False, ) env.expect.that_collection(py.toolchains).contains_exactly([want_toolchain]) @@ -71,11 +71,11 @@ def _test_default_from_rules_python_when_rules_python_is_not_root(env): logger = repo_utils.logger(verbosity_level = 0, name = "python"), ) - env.expect.that_str(py.default_python_version).equals("3.11") + env.expect.that_str(py.default_python_version).equals("3.14") want_toolchain = struct( - name = "python_3_11", - python_version = "3.11", + name = "python_3_14", + python_version = "3.14", register_coverage_tool = False, ) env.expect.that_collection(py.toolchains).contains_exactly([want_toolchain]) @@ -146,7 +146,7 @@ def _test_toolchain_ordering(env): # the default match will be somewhere in the first bunch. "3.10", MINOR_MAPPING["3.10"], - "3.11", + "3.14", MINOR_MAPPING["3.11"], # Next, the rest, where we will match things based on the `python_version` being # the same @@ -284,8 +284,8 @@ def _test_defaults_overrides_single_toolchain(env): python_ext.module( name = "my_root_module", defaults = [ - # This relies on rules_python registering 3.11 - python_ext.defaults(python_version = "3.11"), + # This relies on rules_python registering 3.14 + python_ext.defaults(python_version = "3.14"), ], is_root = True, toolchain = [python_ext.toolchain(python_version = "3.12")], @@ -294,7 +294,7 @@ def _test_defaults_overrides_single_toolchain(env): ), logger = repo_utils.logger(verbosity_level = 0, name = "python"), ) - env.expect.that_str(py.default_python_version).equals("3.11") + env.expect.that_str(py.default_python_version).equals("3.14") _tests.append(_test_defaults_overrides_single_toolchain) @@ -359,8 +359,8 @@ def _test_first_occurance_of_the_toolchain_wins(env): register_coverage_tool = False, ) rules_python_toolchain = struct( - name = "python_3_11", - python_version = "3.11", + name = "python_3_14", + python_version = "3.14", register_coverage_tool = False, ) env.expect.that_collection(py.toolchains).contains_exactly([ @@ -371,7 +371,7 @@ def _test_first_occurance_of_the_toolchain_wins(env): env.expect.that_dict(py.debug_info).contains_exactly({ "toolchains_registered": [ {"module": {"is_root": True, "name": "my_module"}, "name": "python_3_12"}, - {"module": {"is_root": False, "name": "rules_python"}, "name": "python_3_11"}, + {"module": {"is_root": False, "name": "rules_python"}, "name": "python_3_14"}, ], }) @@ -408,8 +408,8 @@ def _test_auth_overrides(env): register_coverage_tool = False, ) rules_python_toolchain = struct( - name = "python_3_11", - python_version = "3.11", + name = "python_3_14", + python_version = "3.14", register_coverage_tool = False, ) env.expect.that_collection(py.toolchains).contains_exactly([ diff --git a/tests/toolchains/BUILD.bazel b/tests/toolchains/BUILD.bazel index b336a06269..9455cc1bbd 100644 --- a/tests/toolchains/BUILD.bazel +++ b/tests/toolchains/BUILD.bazel @@ -36,7 +36,7 @@ py_reconfig_test( build_test( name = "build_test", targets = [ - "@python_3_11//:python_headers", + "@python_3_14//:python_headers", ], ) diff --git a/tools/publish/BUILD.bazel b/tools/publish/BUILD.bazel index 38a6dc4102..a449405e5e 100644 --- a/tools/publish/BUILD.bazel +++ b/tools/publish/BUILD.bazel @@ -6,7 +6,7 @@ py_console_script_binary( # We transition to a specific python version in order to ensure that we # don't rely on the default version configured by the root module. pkg = "@rules_python_publish_deps//twine", - python_version = "3.11", + python_version = "3.14", script = "twine", visibility = ["//visibility:public"], ) From 9c7a055c772cf908fe36ec333c2c11ce98054a37 Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 2 Sep 2026 00:07:17 -0700 Subject: [PATCH 2/3] docs: add news fragment for default Python 3.14 update --- news/4023.changed.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 news/4023.changed.md diff --git a/news/4023.changed.md b/news/4023.changed.md new file mode 100644 index 0000000000..56c4337d53 --- /dev/null +++ b/news/4023.changed.md @@ -0,0 +1,4 @@ +(toolchain) Updated the default Python toolchain version from `3.11` to `3.14` +in {obj}`python.defaults`, {obj}`python_register_toolchains`, and +{obj}`python_register_multi_toolchains` +([#4023](https://github.com/bazel-contrib/rules_python/pull/4023)). From 8a1a236acc65d5bf5bf29b52d6a2cc18d96ed14d Mon Sep 17 00:00:00 2001 From: Richard Levasseur Date: Wed, 2 Sep 2026 00:36:24 -0700 Subject: [PATCH 3/3] chore: expand Python 3.14 test coverage and update documentation examples Update interpreter test versions tuple to include 3.13 and 3.14 to exercise the new default Python version. Update workspace registration examples, twine fixed runtime description, and repl console output in documentation, as well as the release notes template. --- .github/workflows/create_archive_and_notes.sh | 4 ++-- docs/repl.md | 4 ++-- docs/toolchains.md | 14 +++++++------- tests/interpreter/interpreter_tests.bzl | 2 ++ 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/.github/workflows/create_archive_and_notes.sh b/.github/workflows/create_archive_and_notes.sh index 506e2f9784..26973ac0e5 100755 --- a/.github/workflows/create_archive_and_notes.sh +++ b/.github/workflows/create_archive_and_notes.sh @@ -52,13 +52,13 @@ bazel_dep(name = "rules_python", version = "${TAG}") python = use_extension("@rules_python//python/extensions:python.bzl", "python") python.toolchain( - python_version = "3.13", + python_version = "3.14", ) pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip") pip.parse( hub_name = "pypi", - python_version = "3.13", + python_version = "3.14", requirements_lock = "//:requirements_lock.txt", ) diff --git a/docs/repl.md b/docs/repl.md index 1434097fdf..e2e965d684 100644 --- a/docs/repl.md +++ b/docs/repl.md @@ -9,7 +9,7 @@ for your code. Start the REPL with the following command: ```console $ bazel run @rules_python//python/bin:repl -Python 3.11.11 (main, Mar 17 2025, 21:02:09) [Clang 20.1.0 ] on linux +Python 3.14.4 (main, Mar 17 2026, 21:02:09) [Clang 20.1.0 ] on linux Type "help", "copyright", "credits" or "license" for more information. >>> ``` @@ -33,7 +33,7 @@ that provides the {bzl:obj}`PyInfo` provider. ```console $ bazel run @rules_python//python/bin:repl --@rules_python//python/bin:repl_dep=@rules_python//tools:wheelmaker -Python 3.11.11 (main, Mar 17 2025, 21:02:09) [Clang 20.1.0 ] on linux +Python 3.14.4 (main, Mar 17 2026, 21:02:09) [Clang 20.1.0 ] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import tools.wheelmaker >>> diff --git a/docs/toolchains.md b/docs/toolchains.md index 2ac9476f19..de495d5122 100644 --- a/docs/toolchains.md +++ b/docs/toolchains.md @@ -457,17 +457,17 @@ To register a hermetic Python toolchain rather than rely on a system-installed i load("@rules_python//python:repositories.bzl", "python_register_toolchains") python_register_toolchains( - name = "python_3_11", + name = "python_3_14", # Available versions are listed in @rules_python//python:versions.bzl. # We recommend using the same version your team is already standardized on. - python_version = "3.11", + python_version = "3.14", ) load("@rules_python//python:pip.bzl", "pip_parse") pip_parse( ... - python_interpreter_target = "@python_3_11_host//:python", + python_interpreter_target = "@python_3_14_host//:python", ... ) ``` @@ -874,7 +874,7 @@ the executable pointing at the `python3` binary plus its relevant runfiles. ```console $ bazel run @rules_python//python/bin:python -Python 3.11.1 (main, Jan 16 2023, 22:41:20) [Clang 15.0.7 ] on linux +Python 3.14.4 (main, Jan 16 2026, 22:41:20) [Clang 15.0.7 ] on linux Type "help", "copyright", "credits" or "license" for more information. >>> $ bazel run @rules_python//python/bin:python --@rules_python//python/config_settings:python_version=3.12 @@ -886,15 +886,15 @@ Type "help", "copyright", "credits" or "license" for more information. You can also access a specific binary's interpreter this way by using the `@rules_python//python/bin:python_src` target. In the example below, it is assumed that the `@rules_python//tools/publish:twine` binary is fixed at Python -3.11. +3.14. ```console $ bazel run @rules_python//python/bin:python --@rules_python//python/bin:interpreter_src=@rules_python//tools/publish:twine -Python 3.11.1 (main, Jan 16 2023, 22:41:20) [Clang 15.0.7 ] on linux +Python 3.14.4 (main, Jan 16 2026, 22:41:20) [Clang 15.0.7 ] on linux Type "help", "copyright", "credits" or "license" for more information. >>> $ bazel run @rules_python//python/bin:python --@rules_python//python/bin:interpreter_src=@rules_python//tools/publish:twine --@rules_python//python/config_settings:python_version=3.12 -Python 3.11.1 (main, Jan 16 2023, 22:41:20) [Clang 15.0.7 ] on linux +Python 3.14.4 (main, Jan 16 2026, 22:41:20) [Clang 15.0.7 ] on linux Type "help", "copyright", "credits" or "license" for more information. >>> ``` diff --git a/tests/interpreter/interpreter_tests.bzl b/tests/interpreter/interpreter_tests.bzl index 3c5882afa0..4431154354 100644 --- a/tests/interpreter/interpreter_tests.bzl +++ b/tests/interpreter/interpreter_tests.bzl @@ -21,6 +21,8 @@ PYTHON_VERSIONS_TO_TEST = ( "3.10", "3.11", "3.12", + "3.13", + "3.14", ) def py_reconfig_interpreter_tests(name, python_versions, env = {}, **kwargs):