diff --git a/e2e/BUILD.bazel b/e2e/BUILD.bazel index b3fcd3e81..18a38018f 100644 --- a/e2e/BUILD.bazel +++ b/e2e/BUILD.bazel @@ -36,6 +36,9 @@ write_source_files( name = "snapshots", testonly = True, files = { + # @pypi_rdflib_linux — dep_group names must be underscore-normalized. + "snapshots/pypi_rdflib_linux.dep_group.BUILD.bazel": "@pypi_rdflib_linux//dep_group:BUILD.bazel", + # @pypi_multi (multi-project: alpha, beta, gamma) # ---------------------------------------------------------------- # Per-package alias with multiple select arms. Catches regressions in diff --git a/e2e/MODULE.bazel b/e2e/MODULE.bazel index 3f8d576b3..4d9f9e58a 100644 --- a/e2e/MODULE.bazel +++ b/e2e/MODULE.bazel @@ -98,6 +98,7 @@ include("//cases/freethreaded-805:setup.MODULE.bazel") include("//cases/multi-project-hub:setup.MODULE.bazel") include("//cases/oci:setup.MODULE.bazel") include("//cases/pth-namespace-547:setup.MODULE.bazel") +include("//cases/rdflib-linux:setup.MODULE.bazel") include("//cases/pytest-main-867:setup.MODULE.bazel") include("//cases/pytest-mock-530:setup.MODULE.bazel") include("//cases/pytest-subdir-imports:setup.MODULE.bazel") @@ -107,6 +108,7 @@ include("//cases/single-project-hub:setup.MODULE.bazel") include("//cases/unconstrained-dependencies:setup.MODULE.bazel") include("//cases/uv-abi3-compat-853:setup.MODULE.bazel") include("//cases/uv-bare-linux-wheels:setup.MODULE.bazel") +include("//cases/uv-hub-cross-project:setup.MODULE.bazel") include("//cases/uv-conflict-817:setup.MODULE.bazel") include("//cases/uv-conflict-gte:setup.MODULE.bazel") include("//cases/uv-conflict-max-863:setup.MODULE.bazel") diff --git a/e2e/cases/firebase-admin-import/BUILD.bazel b/e2e/cases/firebase-admin-import/BUILD.bazel index 5814d7b47..1375ec651 100644 --- a/e2e/cases/firebase-admin-import/BUILD.bazel +++ b/e2e/cases/firebase-admin-import/BUILD.bazel @@ -39,7 +39,7 @@ load("//tools:pth_snapshot.bzl", "extract_venv_pth") py_test( name = "test", srcs = ["test.py"], - dep_group = "firebase-admin-import", + dep_group = "firebase_admin_import", main = "test.py", deps = [ "@pypi_firebase_admin_import//firebase_admin", @@ -53,7 +53,7 @@ py_test( py_test( name = "test_tool", srcs = ["test.py"], - dep_group = "firebase-admin-import", + dep_group = "firebase_admin_import", expose_venv = True, isolated = False, main = "test.py", @@ -73,7 +73,7 @@ py_test( py_binary( name = "firebase_importer", srcs = ["test.py"], - dep_group = "firebase-admin-import", + dep_group = "firebase_admin_import", main = "test.py", deps = [ "@pypi_firebase_admin_import//firebase_admin", diff --git a/e2e/cases/freethreaded-805/BUILD.bazel b/e2e/cases/freethreaded-805/BUILD.bazel index 98431bae5..4572a4de5 100644 --- a/e2e/cases/freethreaded-805/BUILD.bazel +++ b/e2e/cases/freethreaded-805/BUILD.bazel @@ -26,7 +26,7 @@ _LINUX_X86_64 = [ py_test( name = "test_bin", srcs = ["test.py"], - dep_group = "freethreaded-test", + dep_group = "freethreaded_test", main = "test.py", python_version = "3.13", tags = ["manual"], @@ -46,7 +46,7 @@ platform_transition_test( py_test( name = "venv_test_bin", srcs = ["test.py"], - dep_group = "freethreaded-test", + dep_group = "freethreaded_test", expose_venv = True, isolated = False, main = "test.py", diff --git a/e2e/cases/pth-namespace-547/BUILD.bazel b/e2e/cases/pth-namespace-547/BUILD.bazel index 3779669e3..be104f10b 100644 --- a/e2e/cases/pth-namespace-547/BUILD.bazel +++ b/e2e/cases/pth-namespace-547/BUILD.bazel @@ -5,7 +5,7 @@ load("//tools:pth_snapshot.bzl", "extract_venv_pth") py_test( name = "test", srcs = ["__test__.py"], - dep_group = "pth-namespace-547", + dep_group = "pth_namespace_547", expose_venv = True, isolated = False, main = "__test__.py", @@ -21,7 +21,7 @@ py_test( py_test( name = "test_legacy", srcs = ["__test__.py"], - dep_group = "pth-namespace-547", + dep_group = "pth_namespace_547", main = "__test__.py", deps = [ "@pypi_pth_namespace_547//jaraco_classes", diff --git a/e2e/cases/pytest-main-867/BUILD.bazel b/e2e/cases/pytest-main-867/BUILD.bazel index b4ead1245..e044bb7c3 100644 --- a/e2e/cases/pytest-main-867/BUILD.bazel +++ b/e2e/cases/pytest-main-867/BUILD.bazel @@ -5,7 +5,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_pytest_main", "py_test") py_test( name = "test_example", srcs = ["test_example.py"], - dep_group = "pytest-main-867", + dep_group = "pytest_main_867", pytest_main = True, deps = ["@pypi_pytest_main_867//pytest"], ) @@ -15,7 +15,7 @@ py_test( py_test( name = "test_naming_regression", srcs = ["test_example.py"], - dep_group = "pytest-main-867", + dep_group = "pytest_main_867", pytest_main = True, deps = ["@pypi_pytest_main_867//pytest"], ) @@ -29,7 +29,7 @@ py_test( "test_a.py", "test_b.py", ], - dep_group = "pytest-main-867", + dep_group = "pytest_main_867", pytest_main = True, deps = ["@pypi_pytest_main_867//pytest"], ) @@ -39,7 +39,7 @@ py_test( py_test( name = "test_collection_check", srcs = ["test_collection_check.py"], - dep_group = "pytest-main-867", + dep_group = "pytest_main_867", pytest_main = True, deps = ["@pypi_pytest_main_867//pytest"], ) @@ -58,7 +58,7 @@ py_test( "test_a.py", ":test_direct_main", ], - dep_group = "pytest-main-867", + dep_group = "pytest_main_867", main = ":__test__test_direct_main__.py", deps = [ ":test_direct_main", diff --git a/e2e/cases/pytest-mock-530/BUILD.bazel b/e2e/cases/pytest-mock-530/BUILD.bazel index c89598683..74111ec5d 100644 --- a/e2e/cases/pytest-mock-530/BUILD.bazel +++ b/e2e/cases/pytest-mock-530/BUILD.bazel @@ -4,7 +4,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") py_test( name = "test_mock_py_test", srcs = ["test_mock.py"], - dep_group = "pytest-mock-530", + dep_group = "pytest_mock_530", pytest_main = True, deps = [ "@pypi_pytest_mock_530//pytest", @@ -18,7 +18,7 @@ py_test( "__test__.py", "test_mock.py", ], - dep_group = "pytest-mock-530", + dep_group = "pytest_mock_530", expose_venv = True, isolated = False, main = "__test__.py", diff --git a/e2e/cases/pytest-subdir-imports/BUILD.bazel b/e2e/cases/pytest-subdir-imports/BUILD.bazel index ad8d0bd57..e8b1b8e89 100644 --- a/e2e/cases/pytest-subdir-imports/BUILD.bazel +++ b/e2e/cases/pytest-subdir-imports/BUILD.bazel @@ -9,7 +9,7 @@ py_library( py_test( name = "test_subdir_import", srcs = ["tests/test_subdir.py"], - dep_group = "pytest-subdir-imports", + dep_group = "pytest_subdir_imports", pytest_main = True, deps = [ ":lib", diff --git a/e2e/cases/pytest-xdist-integration/BUILD.bazel b/e2e/cases/pytest-xdist-integration/BUILD.bazel index 781b3fd88..d911b3fde 100644 --- a/e2e/cases/pytest-xdist-integration/BUILD.bazel +++ b/e2e/cases/pytest-xdist-integration/BUILD.bazel @@ -13,7 +13,7 @@ py_test( "-n", "2", ], - dep_group = "pytest-xdist-integration", + dep_group = "pytest_xdist_integration", pytest_main = True, deps = [ "@pypi_pytest_xdist_integration//pytest", diff --git a/e2e/cases/rdflib-linux/BUILD.bazel b/e2e/cases/rdflib-linux/BUILD.bazel new file mode 100644 index 000000000..3c362f3b1 --- /dev/null +++ b/e2e/cases/rdflib-linux/BUILD.bazel @@ -0,0 +1,22 @@ +load("@aspect_rules_py//py:defs.bzl", "py_test") +load("@rules_shell//shell:sh_test.bzl", "sh_test") + +# Regression: hyphenated [project].name caused config_setting names with hyphens, +# breaking dep_group = "rdflib_linux" (underscore) matching. Fix: normalize_name(). +sh_test( + name = "dep_group_names_normalized", + srcs = ["check_dep_group_names.sh"], + args = ["$(location @pypi_rdflib_linux//dep_group:BUILD.bazel)"], + data = ["@pypi_rdflib_linux//dep_group:BUILD.bazel"], + target_compatible_with = ["@platforms//os:linux"], +) + +py_test( + name = "rdflib_linux", + srcs = ["__test__.py"], + dep_group = "rdflib_linux", + main = "__test__.py", + python_version = "3.11", + target_compatible_with = ["@platforms//os:linux"], + deps = ["@pypi_rdflib_linux//rdflib"], +) diff --git a/e2e/cases/rdflib-linux/__test__.py b/e2e/cases/rdflib-linux/__test__.py new file mode 100644 index 000000000..d0302187a --- /dev/null +++ b/e2e/cases/rdflib-linux/__test__.py @@ -0,0 +1,14 @@ +"""Regression: rdflib must be importable on Linux. + +Reported error: + @@aspect_rules_py++uv+pypi//rdflib:rdflib (cae838) + <-- target platform (...:linux_host_platform) didn't satisfy constraint + @@platforms//:incompatible +""" + +import rdflib +from rdflib import Graph + +g = Graph() +assert rdflib.__version__ == "7.1.1", rdflib.__version__ +print("rdflib", rdflib.__version__, "imported and Graph() constructed successfully") diff --git a/e2e/cases/rdflib-linux/check_dep_group_names.sh b/e2e/cases/rdflib-linux/check_dep_group_names.sh new file mode 100755 index 000000000..d76007e06 --- /dev/null +++ b/e2e/cases/rdflib-linux/check_dep_group_names.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# Regression: dep_group config_setting names must be normalized (hyphens → underscores). +# If the hub emits config_setting(name = "rdflib-linux"), then dep_group = "rdflib_linux" +# never matches and every package in the hub becomes @@platforms//:incompatible. +set -euo pipefail + +BUILD_FILE="${1:?usage: check_dep_group_names.sh }" + +if grep -qF '"rdflib-linux"' "$BUILD_FILE"; then + echo "FAIL: config_setting name contains hyphens: 'rdflib-linux'" + echo " dep_group = \"rdflib_linux\" (underscore) will never match it." + echo " uv_hub must normalize project names via normalize_name() before" + echo " emitting config_setting targets and flag_values." + echo "" + grep '"rdflib-linux"' "$BUILD_FILE" + exit 1 +fi + +echo "PASS: all dep_group config_setting names are underscore-normalized" diff --git a/e2e/cases/rdflib-linux/pyproject.toml b/e2e/cases/rdflib-linux/pyproject.toml new file mode 100644 index 000000000..f1fa2fd7d --- /dev/null +++ b/e2e/cases/rdflib-linux/pyproject.toml @@ -0,0 +1,8 @@ +[project] +name = "rdflib-linux" +version = "0.0.0" +authors = [] +requires-python = ">=3.11" +dependencies = [ + "rdflib>=7.0.0", +] diff --git a/e2e/cases/rdflib-linux/setup.MODULE.bazel b/e2e/cases/rdflib-linux/setup.MODULE.bazel new file mode 100644 index 000000000..6696546cf --- /dev/null +++ b/e2e/cases/rdflib-linux/setup.MODULE.bazel @@ -0,0 +1,10 @@ +# Regression: hyphenated [project].name → config_setting name mismatch → @@platforms//:incompatible. + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_rdflib_linux") +uv.project( + hub_name = "pypi_rdflib_linux", + lock = "//cases/rdflib-linux:uv.lock", + pyproject = "//cases/rdflib-linux:pyproject.toml", +) +use_repo(uv, "pypi_rdflib_linux") diff --git a/e2e/cases/rdflib-linux/uv.lock b/e2e/cases/rdflib-linux/uv.lock new file mode 100644 index 000000000..3e6ed3b13 --- /dev/null +++ b/e2e/cases/rdflib-linux/uv.lock @@ -0,0 +1,45 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "isodate" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload-time = "2024-10-08T23:04:11.500Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload-time = "2024-10-08T23:04:09.501Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +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/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "rdflib" +version = "7.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "isodate" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/b6/4cee25689c7a3dfafeb481d358e74696fe3a8543da4cb2c1b71c0cb6583d/rdflib-7.1.1.tar.gz", hash = "sha256:164de86bd3564558802ca983d84f6616a4a1a420c7a17a8152f5016076b2913e", size = 4864216, upload-time = "2024-10-28T00:50:21.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/7d/9add7b22a4e695c4f3011ed084ecf725e1f03954b9fa071f1766890b4989/rdflib-7.1.1-py3-none-any.whl", hash = "sha256:e590fa9a2c34ba33a667818b5a84be3fb8a4d85868f8038f17912ec84f912a25", size = 562443, upload-time = "2024-10-28T00:49:45.589Z" }, +] + +[[package]] +name = "rdflib-linux" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "rdflib" }, +] + +[package.metadata] +requires-dist = [{ name = "rdflib", specifier = ">=7.0.0" }] diff --git a/e2e/cases/uv-abi3-compat-853/BUILD.bazel b/e2e/cases/uv-abi3-compat-853/BUILD.bazel index c5744be66..721d9cc96 100644 --- a/e2e/cases/uv-abi3-compat-853/BUILD.bazel +++ b/e2e/cases/uv-abi3-compat-853/BUILD.bazel @@ -7,7 +7,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") py_test( name = "test_import", srcs = ["test_abi3.py"], - dep_group = "abi3-compat", + dep_group = "abi3_compat", main = "test_abi3.py", python_version = "3.12", target_compatible_with = ["@platforms//os:linux"], @@ -17,7 +17,7 @@ py_test( py_test( name = "test_import_venv_test", srcs = ["test_abi3.py"], - dep_group = "abi3-compat", + dep_group = "abi3_compat", expose_venv = True, isolated = False, main = "test_abi3.py", diff --git a/e2e/cases/uv-hub-cross-project/BUILD.bazel b/e2e/cases/uv-hub-cross-project/BUILD.bazel new file mode 100644 index 000000000..3e16e02b2 --- /dev/null +++ b/e2e/cases/uv-hub-cross-project/BUILD.bazel @@ -0,0 +1,12 @@ +load("@rules_shell//shell:sh_test.bzl", "sh_test") + +# Regression: packages must be isolated to the dep_group of the project that declares them. +# rdflib is in rdflib-project; other-project has cowsay only. The rdflib hub alias +# must not contain an other_project arm (cross-project contamination). +sh_test( + name = "cross_project_isolation", + srcs = ["check_cross_project_isolation.sh"], + args = ["$(location @pypi_cross_hub//rdflib:BUILD.bazel)"], + data = ["@pypi_cross_hub//rdflib:BUILD.bazel"], + target_compatible_with = ["@platforms//os:linux"], +) diff --git a/e2e/cases/uv-hub-cross-project/check_cross_project_isolation.sh b/e2e/cases/uv-hub-cross-project/check_cross_project_isolation.sh new file mode 100755 index 000000000..ffe4f5342 --- /dev/null +++ b/e2e/cases/uv-hub-cross-project/check_cross_project_isolation.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +set -euo pipefail + +BUILD="${1:?}" + +if grep -qF "other_project" "$BUILD"; then + echo "FAIL: rdflib alias contains other_project arm — cross-project contamination" + grep "other_project" "$BUILD" + exit 1 +fi + +if ! grep -qF "rdflib_project" "$BUILD"; then + echo "FAIL: rdflib alias missing rdflib_project arm" + cat "$BUILD" + exit 1 +fi + +echo "PASS: rdflib isolated to rdflib_project" diff --git a/e2e/cases/uv-hub-cross-project/other/BUILD.bazel b/e2e/cases/uv-hub-cross-project/other/BUILD.bazel new file mode 100644 index 000000000..62032357a --- /dev/null +++ b/e2e/cases/uv-hub-cross-project/other/BUILD.bazel @@ -0,0 +1,7 @@ +exports_files( + [ + "pyproject.toml", + "uv.lock", + ], + visibility = ["//:__subpackages__"], +) diff --git a/e2e/cases/uv-hub-cross-project/other/pyproject.toml b/e2e/cases/uv-hub-cross-project/other/pyproject.toml new file mode 100644 index 000000000..8e6836675 --- /dev/null +++ b/e2e/cases/uv-hub-cross-project/other/pyproject.toml @@ -0,0 +1,8 @@ +[project] +name = "other-project" +version = "0.0.0" +authors = [] +requires-python = ">=3.11" +dependencies = [ + "cowsay", +] diff --git a/e2e/cases/uv-hub-cross-project/other/uv.lock b/e2e/cases/uv-hub-cross-project/other/uv.lock new file mode 100644 index 000000000..329f0d1d2 --- /dev/null +++ b/e2e/cases/uv-hub-cross-project/other/uv.lock @@ -0,0 +1,22 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "cowsay" +version = "6.1" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/13/63c0a02c44024ee16f664e0b36eefeb22d54e93531630bd99e237986f534/cowsay-6.1-py3-none-any.whl", hash = "sha256:274b1e6fc1b966d53976333eb90ac94cb07a450a700b455af9fbdf882244b30a", size = 25560, upload-time = "2023-09-25T16:30:01.619Z" }, +] + +[[package]] +name = "other-project" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "cowsay" }, +] + +[package.metadata] +requires-dist = [{ name = "cowsay" }] diff --git a/e2e/cases/uv-hub-cross-project/pyproject.toml b/e2e/cases/uv-hub-cross-project/pyproject.toml new file mode 100644 index 000000000..773ac3dfb --- /dev/null +++ b/e2e/cases/uv-hub-cross-project/pyproject.toml @@ -0,0 +1,8 @@ +[project] +name = "rdflib-project" +version = "0.0.0" +authors = [] +requires-python = ">=3.11" +dependencies = [ + "rdflib>=7.0.0", +] diff --git a/e2e/cases/uv-hub-cross-project/setup.MODULE.bazel b/e2e/cases/uv-hub-cross-project/setup.MODULE.bazel new file mode 100644 index 000000000..3f1eb80e2 --- /dev/null +++ b/e2e/cases/uv-hub-cross-project/setup.MODULE.bazel @@ -0,0 +1,15 @@ +# Regression: cross-project dep_group isolation in a multi-project hub. + +uv = use_extension("@aspect_rules_py//uv:extensions.bzl", "uv") +uv.declare_hub(hub_name = "pypi_cross_hub") +uv.project( + hub_name = "pypi_cross_hub", + lock = "//cases/uv-hub-cross-project:uv.lock", + pyproject = "//cases/uv-hub-cross-project:pyproject.toml", +) +uv.project( + hub_name = "pypi_cross_hub", + lock = "//cases/uv-hub-cross-project/other:uv.lock", + pyproject = "//cases/uv-hub-cross-project/other:pyproject.toml", +) +use_repo(uv, "pypi_cross_hub") diff --git a/e2e/cases/uv-hub-cross-project/uv.lock b/e2e/cases/uv-hub-cross-project/uv.lock new file mode 100644 index 000000000..4b78fd05c --- /dev/null +++ b/e2e/cases/uv-hub-cross-project/uv.lock @@ -0,0 +1,45 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "isodate" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload-time = "2024-10-08T23:04:11.500Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload-time = "2024-10-08T23:04:09.501Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +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/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "rdflib" +version = "7.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "isodate" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/b6/4cee25689c7a3dfafeb481d358e74696fe3a8543da4cb2c1b71c0cb6583d/rdflib-7.1.1.tar.gz", hash = "sha256:164de86bd3564558802ca983d84f6616a4a1a420c7a17a8152f5016076b2913e", size = 4864216, upload-time = "2024-10-28T00:50:21.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/7d/9add7b22a4e695c4f3011ed084ecf725e1f03954b9fa071f1766890b4989/rdflib-7.1.1-py3-none-any.whl", hash = "sha256:e590fa9a2c34ba33a667818b5a84be3fb8a4d85868f8038f17912ec84f912a25", size = 562443, upload-time = "2024-10-28T00:49:45.589Z" }, +] + +[[package]] +name = "rdflib-project" +version = "0.0.0" +source = { virtual = "." } +dependencies = [ + { name = "rdflib" }, +] + +[package.metadata] +requires-dist = [{ name = "rdflib", specifier = ">=7.0.0" }] diff --git a/e2e/cases/uv-plus-version/BUILD.bazel b/e2e/cases/uv-plus-version/BUILD.bazel index 23c1e7d27..eb348c04b 100644 --- a/e2e/cases/uv-plus-version/BUILD.bazel +++ b/e2e/cases/uv-plus-version/BUILD.bazel @@ -3,7 +3,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") py_test( name = "test", srcs = ["__test__.py"], - dep_group = "plus-version", + dep_group = "plus_version", main = "__test__.py", python_version = "3.12", deps = [ @@ -15,7 +15,7 @@ py_test( py_test( name = "venv_test", srcs = ["__test__.py"], - dep_group = "plus-version", + dep_group = "plus_version", expose_venv = True, isolated = False, main = "__test__.py", diff --git a/e2e/cases/uv-requirements-bzl/BUILD.bazel b/e2e/cases/uv-requirements-bzl/BUILD.bazel index 41e0a296e..2ac85ac0e 100644 --- a/e2e/cases/uv-requirements-bzl/BUILD.bazel +++ b/e2e/cases/uv-requirements-bzl/BUILD.bazel @@ -24,7 +24,7 @@ _ALL_DATA_REQUIREMENTS_COUNT = len(all_data_requirements) py_test( name = "requirement_helper_test", srcs = ["__test__.py"], - dep_group = "requirements-bzl-demo", + dep_group = "requirements_bzl_demo", main = "__test__.py", python_version = "3.12", deps = [requirement("cowsay")], @@ -34,7 +34,7 @@ py_test( py_test( name = "pkg_alias_test", srcs = ["__test__.py"], - dep_group = "requirements-bzl-demo", + dep_group = "requirements_bzl_demo", main = "__test__.py", python_version = "3.12", deps = ["@pypi_requirements_bzl//cowsay:pkg"], @@ -44,7 +44,7 @@ py_test( py_test( name = "all_requirements_test", srcs = ["__test__.py"], - dep_group = "requirements-bzl-demo", + dep_group = "requirements_bzl_demo", main = "__test__.py", python_version = "3.12", deps = all_requirements, @@ -55,7 +55,7 @@ py_test( name = "whl_data_test", srcs = ["__whl_test__.py"], data = ["@pypi_requirements_bzl//cowsay:whl"], - dep_group = "requirements-bzl-demo", + dep_group = "requirements_bzl_demo", main = "__whl_test__.py", python_version = "3.12", ) @@ -65,7 +65,7 @@ py_test( name = "all_whl_data_test", srcs = ["__whl_test__.py"], data = all_whl_requirements, - dep_group = "requirements-bzl-demo", + dep_group = "requirements_bzl_demo", main = "__whl_test__.py", python_version = "3.12", ) @@ -75,7 +75,7 @@ py_test( name = "all_whl_by_package_data_test", srcs = ["__whl_test__.py"], data = [whl for whl in all_whl_requirements_by_package.values()], - dep_group = "requirements-bzl-demo", + dep_group = "requirements_bzl_demo", main = "__whl_test__.py", python_version = "3.12", ) @@ -86,7 +86,7 @@ py_test( py_test( name = "multi_package_imports_test", srcs = ["__multi_test__.py"], - dep_group = "requirements-bzl-demo", + dep_group = "requirements_bzl_demo", main = "__multi_test__.py", python_version = "3.12", deps = all_requirements, @@ -98,7 +98,7 @@ py_test( py_test( name = "requirement_normalization_test", srcs = ["__dateutil_test__.py"], - dep_group = "requirements-bzl-demo", + dep_group = "requirements_bzl_demo", main = "__dateutil_test__.py", python_version = "3.12", deps = [requirement("Python-DateUtil")], diff --git a/e2e/cases/uv-whl-install-output-group/BUILD.bazel b/e2e/cases/uv-whl-install-output-group/BUILD.bazel index d92548772..bfa41e5e0 100644 --- a/e2e/cases/uv-whl-install-output-group/BUILD.bazel +++ b/e2e/cases/uv-whl-install-output-group/BUILD.bazel @@ -21,7 +21,7 @@ py_test( name = "test", srcs = ["test.py"], data = [":iniconfig_install_dir"], - dep_group = "uv-whl-install-output-group", + dep_group = "uv_whl_install_output_group", main = "test.py", python_version = "3.11", deps = ["@pypi_uv_whl_install_output_group//iniconfig"], @@ -31,7 +31,7 @@ py_test( name = "venv_test", srcs = ["test.py"], data = [":iniconfig_install_dir"], - dep_group = "uv-whl-install-output-group", + dep_group = "uv_whl_install_output_group", expose_venv = True, isolated = False, main = "test.py", diff --git a/e2e/cases/venv-bin-scripts-423/BUILD.bazel b/e2e/cases/venv-bin-scripts-423/BUILD.bazel index 2e94cd90e..0a2626fba 100644 --- a/e2e/cases/venv-bin-scripts-423/BUILD.bazel +++ b/e2e/cases/venv-bin-scripts-423/BUILD.bazel @@ -3,7 +3,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") py_test( name = "test", srcs = ["__test__.py"], - dep_group = "venv-bin-scripts-423", + dep_group = "venv_bin_scripts_423", main = "__test__.py", python_version = "3.11", deps = [ @@ -14,7 +14,7 @@ py_test( py_test( name = "test_non_isolated", srcs = ["__test__.py"], - dep_group = "venv-bin-scripts-423", + dep_group = "venv_bin_scripts_423", isolated = False, main = "__test__.py", python_version = "3.11", @@ -26,7 +26,7 @@ py_test( py_test( name = "venv_test", srcs = ["__test__.py"], - dep_group = "venv-bin-scripts-423", + dep_group = "venv_bin_scripts_423", expose_venv = True, isolated = False, main = "__test__.py", diff --git a/e2e/cases/venv-internal-symlinks/BUILD.bazel b/e2e/cases/venv-internal-symlinks/BUILD.bazel index ed68c9cfa..533735413 100644 --- a/e2e/cases/venv-internal-symlinks/BUILD.bazel +++ b/e2e/cases/venv-internal-symlinks/BUILD.bazel @@ -3,7 +3,7 @@ load("@aspect_rules_py//py:defs.bzl", "py_test") py_test( name = "test_internal_symlinks", srcs = ["test_babel.py"], - dep_group = "venv-internal-symlinks", + dep_group = "venv_internal_symlinks", expose_venv = True, isolated = False, main = "test_babel.py", @@ -16,7 +16,7 @@ py_test( py_test( name = "test_internal_symlinks_legacy", srcs = ["test_babel.py"], - dep_group = "venv-internal-symlinks", + dep_group = "venv_internal_symlinks", main = "test_babel.py", deps = [ "@pypi_venv_internal_symlinks//babel", diff --git a/e2e/snapshots/pypi_rdflib_linux.dep_group.BUILD.bazel b/e2e/snapshots/pypi_rdflib_linux.dep_group.BUILD.bazel new file mode 100644 index 000000000..e938b06d3 --- /dev/null +++ b/e2e/snapshots/pypi_rdflib_linux.dep_group.BUILD.bazel @@ -0,0 +1,20 @@ +alias( + name = "dep_group", + actual = "@aspect_rules_py//uv/private/constraints/dep_group:dep_group", + visibility = ["//visibility:public"], +) + + +config_setting( + name = "rdflib_linux", + flag_values = { + "@aspect_rules_py//uv/private/constraints/dep_group:dep_group": "rdflib_linux", + }, + visibility = ["//visibility:public"], +) + + +exports_files( + ["BUILD.bazel"], + visibility = ["//visibility:public"], +) diff --git a/uv/private/extension/projectfile.bzl b/uv/private/extension/projectfile.bzl index 56083a3aa..4cea42021 100644 --- a/uv/private/extension/projectfile.bzl +++ b/uv/private/extension/projectfile.bzl @@ -172,9 +172,11 @@ def collect_activated_extras(projectfile, lock_id, project_data, lock_data, defa `{dep: {cfg: {extra_dep: {marker: 1}}}}`. """ - # If no dependency-groups are specified, use the lock members manifest, or just the self-list + # Normalize the synthesized group key so config_setting names use underscores. + # Raw [project].name may contain hyphens; a mismatch with dep_group = "foo_bar" + # silently marks every hub package as @@platforms//:incompatible. dep_groups = project_data.get("dependency-groups", { - project_data["project"]["name"]: lock_data.get("manifest", {}).get("members", [ + normalize_name(project_data["project"]["name"]): lock_data.get("manifest", {}).get("members", [ project_data["project"]["name"], ]), })