From 21a66d522772480214a3e8b4786019a4d3e699e0 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Fri, 3 Jul 2026 12:05:57 -0600 Subject: [PATCH 1/4] adding test case to reproduce the issue --- e2e/MODULE.bazel | 13 +++ .../uv-include-group-versions/BUILD.bazel | 14 +++ .../uv-include-group-versions/__test__.py | 25 ++++ .../uv-include-group-versions/pyproject.toml | 19 ++++ e2e/cases/uv-include-group-versions/uv.lock | 107 ++++++++++++++++++ 5 files changed, 178 insertions(+) create mode 100644 e2e/cases/uv-include-group-versions/BUILD.bazel create mode 100644 e2e/cases/uv-include-group-versions/__test__.py create mode 100644 e2e/cases/uv-include-group-versions/pyproject.toml create mode 100644 e2e/cases/uv-include-group-versions/uv.lock diff --git a/e2e/MODULE.bazel b/e2e/MODULE.bazel index bfd97d350..0f2684069 100644 --- a/e2e/MODULE.bazel +++ b/e2e/MODULE.bazel @@ -346,6 +346,19 @@ uv.unstable_annotate_packages( ) # }}} +# For cases/uv-include-group-versions (PEP 735 include-group version preference) +# {{{ +uv.project( + hub_name = "pypi", + lock = "//cases/uv-include-group-versions:uv.lock", + pyproject = "//cases/uv-include-group-versions:pyproject.toml", +) +uv.unstable_annotate_packages( + src = "//cases/uv-legacy-deps-750:annotations.toml", + lock = "//cases/uv-include-group-versions:uv.lock", +) +# }}} + # For cases/uv-abi3-compat-853 # Regression: abi3 wheel compatibility must propagate to newer Python minors. # {{{ diff --git a/e2e/cases/uv-include-group-versions/BUILD.bazel b/e2e/cases/uv-include-group-versions/BUILD.bazel new file mode 100644 index 000000000..0e90b669e --- /dev/null +++ b/e2e/cases/uv-include-group-versions/BUILD.bazel @@ -0,0 +1,14 @@ +load("@aspect_rules_py//py/unstable:defs.bzl", "py_venv_test") + +py_venv_test( + name = "include_group_versions", + srcs = ["__test__.py"], + main = "__test__.py", + python_version = "3.11", + venv = "versions-dev", + deps = [ + "@pypi//colorama", + "@pypi//pytest", + "@pypi//setuptools", + ], +) diff --git a/e2e/cases/uv-include-group-versions/__test__.py b/e2e/cases/uv-include-group-versions/__test__.py new file mode 100644 index 000000000..6151913b8 --- /dev/null +++ b/e2e/cases/uv-include-group-versions/__test__.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 +"""Test that version preferences from included dependency groups are preserved. + +uv.lock pins colorama to 0.4.6 for the versions-dev group, which includes +versions-build and versions-test. versions-dev also adds a direct +colorama>=0.4.6 constraint, while versions-build references colorama without a +version specifier. + +This test verifies that rules_py installs exactly the version uv.lock selected +for versions-dev, not a version that would result from resolving the +unconstrained reference in versions-build. +""" + +import colorama +print(f"colorama: {colorama.__file__}") +print(f"colorama version: {colorama.__version__}") +assert colorama.__version__ == "0.4.6", ( + f"Expected colorama ==0.4.6 for versions-dev group, got {colorama.__version__}" +) + +import setuptools +print(f"setuptools: {setuptools.__file__}") + +import pytest +print(f"pytest: {pytest.__file__}") diff --git a/e2e/cases/uv-include-group-versions/pyproject.toml b/e2e/cases/uv-include-group-versions/pyproject.toml new file mode 100644 index 000000000..aa878aed0 --- /dev/null +++ b/e2e/cases/uv-include-group-versions/pyproject.toml @@ -0,0 +1,19 @@ +[project] +name = "include-group-versions-test" +version = "0.0.0" +requires-python = ">=3.11" +dependencies = [] + +[dependency-groups] +versions-build = [ + "colorama", + "setuptools", +] +versions-test = [ + "pytest", +] +versions-dev = [ + {include-group = "versions-build"}, + {include-group = "versions-test"}, + "colorama>=0.4.6", +] diff --git a/e2e/cases/uv-include-group-versions/uv.lock b/e2e/cases/uv-include-group-versions/uv.lock new file mode 100644 index 000000000..f0792dcbe --- /dev/null +++ b/e2e/cases/uv-include-group-versions/uv.lock @@ -0,0 +1,107 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "include-group-versions-test" +version = "0.0.0" +source = { virtual = "." } + +[package.dev-dependencies] +versions-build = [ + { name = "colorama" }, + { name = "setuptools" }, +] +versions-dev = [ + { name = "colorama" }, + { name = "pytest" }, + { name = "setuptools" }, +] +versions-test = [ + { name = "pytest" }, +] + +[package.metadata] + +[package.metadata.requires-dev] +versions-build = [ + { name = "colorama" }, + { name = "setuptools" }, +] +versions-dev = [ + { name = "colorama" }, + { name = "colorama", specifier = ">=0.4.6" }, + { name = "pytest" }, + { name = "setuptools" }, +] +versions-test = [{ name = "pytest" }] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "setuptools" +version = "82.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", size = 1152316, upload-time = "2026-03-09T12:47:17.221Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb", size = 1006223, upload-time = "2026-03-09T12:47:15.026Z" }, +] From 42ee22f62cc81a786cd623a011f85ffe6b4e10c8 Mon Sep 17 00:00:00 2001 From: xangcastle Date: Sat, 4 Jul 2026 09:56:01 -0600 Subject: [PATCH 2/4] adding test case to reproduce the issue --- .../uv-include-group-versions/BUILD.bazel | 22 ++-- .../uv-include-group-versions/__test__.py | 44 ++++--- .../uv-include-group-versions/pyproject.toml | 24 ++-- e2e/cases/uv-include-group-versions/uv.lock | 114 ++++++------------ 4 files changed, 92 insertions(+), 112 deletions(-) diff --git a/e2e/cases/uv-include-group-versions/BUILD.bazel b/e2e/cases/uv-include-group-versions/BUILD.bazel index 0e90b669e..8331c5cc0 100644 --- a/e2e/cases/uv-include-group-versions/BUILD.bazel +++ b/e2e/cases/uv-include-group-versions/BUILD.bazel @@ -1,14 +1,20 @@ load("@aspect_rules_py//py/unstable:defs.bzl", "py_venv_test") py_venv_test( - name = "include_group_versions", + name = "include_group_versions_build", srcs = ["__test__.py"], main = "__test__.py", - python_version = "3.11", - venv = "versions-dev", - deps = [ - "@pypi//colorama", - "@pypi//pytest", - "@pypi//setuptools", - ], + python_version = "3.10.19", + venv = "build", + deps = ["@pypi//packaging"], +) + +py_venv_test( + name = "include_group_versions_test", + srcs = ["__test__.py"], + args = ["test"], + main = "__test__.py", + python_version = "3.10.19", + venv = "test", + deps = ["@pypi//packaging"], ) diff --git a/e2e/cases/uv-include-group-versions/__test__.py b/e2e/cases/uv-include-group-versions/__test__.py index 6151913b8..b0ef4db8c 100644 --- a/e2e/cases/uv-include-group-versions/__test__.py +++ b/e2e/cases/uv-include-group-versions/__test__.py @@ -1,25 +1,33 @@ #!/usr/bin/env python3 -"""Test that version preferences from included dependency groups are preserved. +"""Test that PEP 735 include-group version preferences are preserved. -uv.lock pins colorama to 0.4.6 for the versions-dev group, which includes -versions-build and versions-test. versions-dev also adds a direct -colorama>=0.4.6 constraint, while versions-build references colorama without a -version specifier. +This project declares two pairs of conflicting dependency groups: +- base-build / build use packaging==24.0 +- base-test / test use packaging==21.3 -This test verifies that rules_py installs exactly the version uv.lock selected -for versions-dev, not a version that would result from resolving the -unconstrained reference in versions-build. +Each outer group includes its base group via {include-group = ...}. uv.lock +records a different packaging version for each group. This test verifies that +rules_py installs the per-group version selected by uv.lock. """ -import colorama -print(f"colorama: {colorama.__file__}") -print(f"colorama version: {colorama.__version__}") -assert colorama.__version__ == "0.4.6", ( - f"Expected colorama ==0.4.6 for versions-dev group, got {colorama.__version__}" -) +import sys +from importlib.metadata import version -import setuptools -print(f"setuptools: {setuptools.__file__}") +GROUPS = { + "build": "24.0", + "test": "21.3", +} -import pytest -print(f"pytest: {pytest.__file__}") + +def main(): + group = sys.argv[1] if len(sys.argv) > 1 else "build" + expected = GROUPS[group] + actual = version("packaging") + print(f"{group}/packaging: {actual} (expected {expected})") + assert actual == expected, ( + f"Expected packaging=={expected} for {group} group, got {actual}" + ) + + +if __name__ == "__main__": + main() diff --git a/e2e/cases/uv-include-group-versions/pyproject.toml b/e2e/cases/uv-include-group-versions/pyproject.toml index aa878aed0..4359c6432 100644 --- a/e2e/cases/uv-include-group-versions/pyproject.toml +++ b/e2e/cases/uv-include-group-versions/pyproject.toml @@ -1,19 +1,19 @@ [project] name = "include-group-versions-test" version = "0.0.0" -requires-python = ">=3.11" +requires-python = "== 3.10.19" dependencies = [] [dependency-groups] -versions-build = [ - "colorama", - "setuptools", -] -versions-test = [ - "pytest", -] -versions-dev = [ - {include-group = "versions-build"}, - {include-group = "versions-test"}, - "colorama>=0.4.6", +base-build = ["packaging==24.0"] +base-test = ["packaging==21.3"] +build = [{include-group = "base-build"}] +test = [{include-group = "base-test"}] + +[tool.uv] +conflicts = [ + [{ group = "base-build" }, { group = "base-test" }], + [{ group = "build" }, { group = "test" }], + [{ group = "base-build" }, { group = "test" }], + [{ group = "base-test" }, { group = "build" }], ] diff --git a/e2e/cases/uv-include-group-versions/uv.lock b/e2e/cases/uv-include-group-versions/uv.lock index f0792dcbe..541ca9ecb 100644 --- a/e2e/cases/uv-include-group-versions/uv.lock +++ b/e2e/cases/uv-include-group-versions/uv.lock @@ -1,15 +1,19 @@ version = 1 revision = 3 -requires-python = ">=3.11" - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, -] +requires-python = "==3.10.19" +conflicts = [[ + { package = "include-group-versions-test", group = "base-build" }, + { package = "include-group-versions-test", group = "base-test" }, +], [ + { package = "include-group-versions-test", group = "build" }, + { package = "include-group-versions-test", group = "test" }, +], [ + { package = "include-group-versions-test", group = "base-build" }, + { package = "include-group-versions-test", group = "test" }, +], [ + { package = "include-group-versions-test", group = "base-test" }, + { package = "include-group-versions-test", group = "build" }, +]] [[package]] name = "include-group-versions-test" @@ -17,91 +21,53 @@ version = "0.0.0" source = { virtual = "." } [package.dev-dependencies] -versions-build = [ - { name = "colorama" }, - { name = "setuptools" }, +base-build = [ + { name = "packaging", version = "24.0", source = { registry = "https://pypi.org/simple" } }, +] +base-test = [ + { name = "packaging", version = "21.3", source = { registry = "https://pypi.org/simple" } }, ] -versions-dev = [ - { name = "colorama" }, - { name = "pytest" }, - { name = "setuptools" }, +build = [ + { name = "packaging", version = "24.0", source = { registry = "https://pypi.org/simple" } }, ] -versions-test = [ - { name = "pytest" }, +test = [ + { name = "packaging", version = "21.3", source = { registry = "https://pypi.org/simple" } }, ] [package.metadata] [package.metadata.requires-dev] -versions-build = [ - { name = "colorama" }, - { name = "setuptools" }, -] -versions-dev = [ - { name = "colorama" }, - { name = "colorama", specifier = ">=0.4.6" }, - { name = "pytest" }, - { name = "setuptools" }, -] -versions-test = [{ name = "pytest" }] - -[[package]] -name = "iniconfig" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, -] +base-build = [{ name = "packaging", specifier = "==24.0" }] +base-test = [{ name = "packaging", specifier = "==21.3" }] +build = [{ name = "packaging", specifier = "==24.0" }] +test = [{ name = "packaging", specifier = "==21.3" }] [[package]] name = "packaging" -version = "26.2" +version = "21.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +dependencies = [ + { name = "pyparsing" }, ] - -[[package]] -name = "pluggy" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/9e/d1a7217f69310c1db8fdf8ab396229f55a699ce34a203691794c5d1cad0c/packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", size = 84848, upload-time = "2021-11-18T00:39:13.586Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, + { url = "https://files.pythonhosted.org/packages/05/8e/8de486cbd03baba4deef4142bd643a3e7bbe954a784dc1bb17142572d127/packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522", size = 40750, upload-time = "2021-11-18T00:39:10.932Z" }, ] [[package]] -name = "pygments" -version = "2.20.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, -] - -[[package]] -name = "pytest" -version = "9.1.1" +name = "packaging" +version = "24.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "iniconfig" }, - { name = "packaging" }, - { name = "pluggy" }, - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/b5/b43a27ac7472e1818c4bafd44430e69605baefe1f34440593e0332ec8b4d/packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9", size = 147882, upload-time = "2024-03-10T09:39:28.33Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, + { url = "https://files.pythonhosted.org/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", size = 53488, upload-time = "2024-03-10T09:39:25.947Z" }, ] [[package]] -name = "setuptools" -version = "82.0.1" +name = "pyparsing" +version = "3.3.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", size = 1152316, upload-time = "2026-03-09T12:47:17.221Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb", size = 1006223, upload-time = "2026-03-09T12:47:15.026Z" }, + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, ] From 49a1ba8319bde1fc39da0d5bd86f0550eee537af Mon Sep 17 00:00:00 2001 From: xangcastle Date: Sat, 4 Jul 2026 10:37:23 -0600 Subject: [PATCH 3/4] adding test case to reproduce the issue --- .../uv-include-group-versions/BUILD.bazel | 6 ++-- .../uv-include-group-versions/__test__.py | 10 +++--- .../uv-include-group-versions/pyproject.toml | 16 ++++----- e2e/cases/uv-include-group-versions/uv.lock | 36 +++++++++---------- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/e2e/cases/uv-include-group-versions/BUILD.bazel b/e2e/cases/uv-include-group-versions/BUILD.bazel index 8331c5cc0..859bf25b2 100644 --- a/e2e/cases/uv-include-group-versions/BUILD.bazel +++ b/e2e/cases/uv-include-group-versions/BUILD.bazel @@ -5,16 +5,16 @@ py_venv_test( srcs = ["__test__.py"], main = "__test__.py", python_version = "3.10.19", - venv = "build", + venv = "igv-build", deps = ["@pypi//packaging"], ) py_venv_test( name = "include_group_versions_test", srcs = ["__test__.py"], - args = ["test"], + args = ["igv-test"], main = "__test__.py", python_version = "3.10.19", - venv = "test", + venv = "igv-test", deps = ["@pypi//packaging"], ) diff --git a/e2e/cases/uv-include-group-versions/__test__.py b/e2e/cases/uv-include-group-versions/__test__.py index b0ef4db8c..5a446a9e7 100644 --- a/e2e/cases/uv-include-group-versions/__test__.py +++ b/e2e/cases/uv-include-group-versions/__test__.py @@ -2,8 +2,8 @@ """Test that PEP 735 include-group version preferences are preserved. This project declares two pairs of conflicting dependency groups: -- base-build / build use packaging==24.0 -- base-test / test use packaging==21.3 +- igv-build-base / igv-build use packaging==24.0 +- igv-test-base / igv-test use packaging==21.3 Each outer group includes its base group via {include-group = ...}. uv.lock records a different packaging version for each group. This test verifies that @@ -14,13 +14,13 @@ from importlib.metadata import version GROUPS = { - "build": "24.0", - "test": "21.3", + "igv-build": "24.0", + "igv-test": "21.3", } def main(): - group = sys.argv[1] if len(sys.argv) > 1 else "build" + group = sys.argv[1] if len(sys.argv) > 1 else "igv-build" expected = GROUPS[group] actual = version("packaging") print(f"{group}/packaging: {actual} (expected {expected})") diff --git a/e2e/cases/uv-include-group-versions/pyproject.toml b/e2e/cases/uv-include-group-versions/pyproject.toml index 4359c6432..2c63f6d7a 100644 --- a/e2e/cases/uv-include-group-versions/pyproject.toml +++ b/e2e/cases/uv-include-group-versions/pyproject.toml @@ -5,15 +5,15 @@ requires-python = "== 3.10.19" dependencies = [] [dependency-groups] -base-build = ["packaging==24.0"] -base-test = ["packaging==21.3"] -build = [{include-group = "base-build"}] -test = [{include-group = "base-test"}] +igv-build-base = ["packaging==24.0"] +igv-test-base = ["packaging==21.3"] +igv-build = [{include-group = "igv-build-base"}] +igv-test = [{include-group = "igv-test-base"}] [tool.uv] conflicts = [ - [{ group = "base-build" }, { group = "base-test" }], - [{ group = "build" }, { group = "test" }], - [{ group = "base-build" }, { group = "test" }], - [{ group = "base-test" }, { group = "build" }], + [{ group = "igv-build-base" }, { group = "igv-test-base" }], + [{ group = "igv-build" }, { group = "igv-test" }], + [{ group = "igv-build-base" }, { group = "igv-test" }], + [{ group = "igv-test-base" }, { group = "igv-build" }], ] diff --git a/e2e/cases/uv-include-group-versions/uv.lock b/e2e/cases/uv-include-group-versions/uv.lock index 541ca9ecb..4080a1af7 100644 --- a/e2e/cases/uv-include-group-versions/uv.lock +++ b/e2e/cases/uv-include-group-versions/uv.lock @@ -2,17 +2,17 @@ version = 1 revision = 3 requires-python = "==3.10.19" conflicts = [[ - { package = "include-group-versions-test", group = "base-build" }, - { package = "include-group-versions-test", group = "base-test" }, + { package = "include-group-versions-test", group = "igv-build-base" }, + { package = "include-group-versions-test", group = "igv-test-base" }, ], [ - { package = "include-group-versions-test", group = "build" }, - { package = "include-group-versions-test", group = "test" }, + { package = "include-group-versions-test", group = "igv-build" }, + { package = "include-group-versions-test", group = "igv-test" }, ], [ - { package = "include-group-versions-test", group = "base-build" }, - { package = "include-group-versions-test", group = "test" }, + { package = "include-group-versions-test", group = "igv-build-base" }, + { package = "include-group-versions-test", group = "igv-test" }, ], [ - { package = "include-group-versions-test", group = "base-test" }, - { package = "include-group-versions-test", group = "build" }, + { package = "include-group-versions-test", group = "igv-build" }, + { package = "include-group-versions-test", group = "igv-test-base" }, ]] [[package]] @@ -21,26 +21,26 @@ version = "0.0.0" source = { virtual = "." } [package.dev-dependencies] -base-build = [ +igv-build = [ { name = "packaging", version = "24.0", source = { registry = "https://pypi.org/simple" } }, ] -base-test = [ - { name = "packaging", version = "21.3", source = { registry = "https://pypi.org/simple" } }, -] -build = [ +igv-build-base = [ { name = "packaging", version = "24.0", source = { registry = "https://pypi.org/simple" } }, ] -test = [ +igv-test = [ + { name = "packaging", version = "21.3", source = { registry = "https://pypi.org/simple" } }, +] +igv-test-base = [ { name = "packaging", version = "21.3", source = { registry = "https://pypi.org/simple" } }, ] [package.metadata] [package.metadata.requires-dev] -base-build = [{ name = "packaging", specifier = "==24.0" }] -base-test = [{ name = "packaging", specifier = "==21.3" }] -build = [{ name = "packaging", specifier = "==24.0" }] -test = [{ name = "packaging", specifier = "==21.3" }] +igv-build = [{ name = "packaging", specifier = "==24.0" }] +igv-build-base = [{ name = "packaging", specifier = "==24.0" }] +igv-test = [{ name = "packaging", specifier = "==21.3" }] +igv-test-base = [{ name = "packaging", specifier = "==21.3" }] [[package]] name = "packaging" From 58208cd4dc7257971c6eb72be0b8eb62758dcebe Mon Sep 17 00:00:00 2001 From: xangcastle Date: Sat, 4 Jul 2026 10:45:12 -0600 Subject: [PATCH 4/4] adding test case to reproduce the issue --- e2e/cases/uv-include-group-versions/BUILD.bazel | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/e2e/cases/uv-include-group-versions/BUILD.bazel b/e2e/cases/uv-include-group-versions/BUILD.bazel index 859bf25b2..12a291d1f 100644 --- a/e2e/cases/uv-include-group-versions/BUILD.bazel +++ b/e2e/cases/uv-include-group-versions/BUILD.bazel @@ -4,7 +4,7 @@ py_venv_test( name = "include_group_versions_build", srcs = ["__test__.py"], main = "__test__.py", - python_version = "3.10.19", + python_version = "3.10", venv = "igv-build", deps = ["@pypi//packaging"], ) @@ -14,7 +14,7 @@ py_venv_test( srcs = ["__test__.py"], args = ["igv-test"], main = "__test__.py", - python_version = "3.10.19", + python_version = "3.10", venv = "igv-test", deps = ["@pypi//packaging"], )