fix(whl_library): only add group machinery when it is needed (#1822)
This removes the `alias` additions when the package groups are not used
fixing alias that attempt to traverse the entire py_library dependency
tree.
I noticed that for some code that I want to write for `whl_library`
having it explicit whether we are using groups or not in the `pip.parse`
and or `whl_library` makes the code easier to understand and write.
Fixes #1760
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2beb8bd..91549a7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -29,6 +29,9 @@
* (gazelle) In `project` or `package` generation modes, do not generate `py_test`
rules when there are no test files and do not set `main = "__test__.py"` when
that file doesn't exist.
+* (whl_library) The group redirection is only added when the package is part of
+ the group potentially fixing aspects that want to traverse a `py_library` graph.
+ Fixes [#1760](https://github.com/bazelbuild/rules_python/issues/1760).
### Added
diff --git a/python/pip_install/private/generate_whl_library_build_bazel.bzl b/python/pip_install/private/generate_whl_library_build_bazel.bzl
index 19650d1..b121909 100644
--- a/python/pip_install/private/generate_whl_library_build_bazel.bzl
+++ b/python/pip_install/private/generate_whl_library_build_bazel.bzl
@@ -63,14 +63,14 @@
)
filegroup(
- name = "{whl_file_impl_label}",
+ name = "{whl_file_label}",
srcs = ["{whl_name}"],
data = {whl_file_deps},
visibility = {impl_vis},
)
py_library(
- name = "{py_library_impl_label}",
+ name = "{py_library_label}",
srcs = glob(
["site-packages/**/*.py"],
exclude={srcs_exclude},
@@ -89,16 +89,6 @@
tags = {tags},
visibility = {impl_vis},
)
-
-alias(
- name = "{py_library_public_label}",
- actual = "{py_library_actual_label}",
-)
-
-alias(
- name = "{whl_file_public_label}",
- actual = "{whl_file_actual_label}",
-)
"""
def _plat_label(plat):
@@ -353,36 +343,45 @@
# implementation.
if group_name:
group_repo = repo_prefix + "_groups"
- library_impl_label = "@%s//:%s_%s" % (group_repo, normalize_name(group_name), PY_LIBRARY_PUBLIC_LABEL)
- whl_impl_label = "@%s//:%s_%s" % (group_repo, normalize_name(group_name), WHEEL_FILE_PUBLIC_LABEL)
- impl_vis = "@%s//:__pkg__" % (group_repo,)
+ label_tmpl = "\"@{}//:{}_{{}}\"".format(group_repo, normalize_name(group_name))
+ impl_vis = ["@{}//:__pkg__".format(group_repo)]
+ additional_content.extend([
+ "",
+ render.alias(
+ name = PY_LIBRARY_PUBLIC_LABEL,
+ actual = label_tmpl.format(PY_LIBRARY_PUBLIC_LABEL),
+ ),
+ "",
+ render.alias(
+ name = WHEEL_FILE_PUBLIC_LABEL,
+ actual = label_tmpl.format(WHEEL_FILE_PUBLIC_LABEL),
+ ),
+ ])
+ py_library_label = PY_LIBRARY_IMPL_LABEL
+ whl_file_label = WHEEL_FILE_IMPL_LABEL
else:
- library_impl_label = PY_LIBRARY_IMPL_LABEL
- whl_impl_label = WHEEL_FILE_IMPL_LABEL
- impl_vis = "//visibility:private"
+ py_library_label = PY_LIBRARY_PUBLIC_LABEL
+ whl_file_label = WHEEL_FILE_PUBLIC_LABEL
+ impl_vis = ["//visibility:public"]
contents = "\n".join(
[
_BUILD_TEMPLATE.format(
loads = "\n".join(loads),
- py_library_public_label = PY_LIBRARY_PUBLIC_LABEL,
- py_library_impl_label = PY_LIBRARY_IMPL_LABEL,
- py_library_actual_label = library_impl_label,
+ py_library_label = py_library_label,
dependencies = render.indent(lib_dependencies, " " * 4).lstrip(),
whl_file_deps = render.indent(whl_file_deps, " " * 4).lstrip(),
data_exclude = repr(_data_exclude),
whl_name = whl_name,
- whl_file_public_label = WHEEL_FILE_PUBLIC_LABEL,
- whl_file_impl_label = WHEEL_FILE_IMPL_LABEL,
- whl_file_actual_label = whl_impl_label,
+ whl_file_label = whl_file_label,
tags = repr(tags),
data_label = DATA_LABEL,
dist_info_label = DIST_INFO_LABEL,
entry_point_prefix = WHEEL_ENTRY_POINT_PREFIX,
srcs_exclude = repr(srcs_exclude),
data = repr(data),
- impl_vis = repr([impl_vis]),
+ impl_vis = repr(impl_vis),
),
] + additional_content,
)
diff --git a/python/private/bzlmod/pip.bzl b/python/private/bzlmod/pip.bzl
index a017089..13d1fa3 100644
--- a/python/private/bzlmod/pip.bzl
+++ b/python/private/bzlmod/pip.bzl
@@ -152,23 +152,27 @@
for mod, whl_name in pip_attr.whl_modifications.items():
whl_modifications[whl_name] = mod
- requirement_cycles = {
- name: [normalize_name(whl_name) for whl_name in whls]
- for name, whls in pip_attr.experimental_requirement_cycles.items()
- }
+ if pip_attr.experimental_requirement_cycles:
+ requirement_cycles = {
+ name: [normalize_name(whl_name) for whl_name in whls]
+ for name, whls in pip_attr.experimental_requirement_cycles.items()
+ }
- whl_group_mapping = {
- whl_name: group_name
- for group_name, group_whls in requirement_cycles.items()
- for whl_name in group_whls
- }
+ whl_group_mapping = {
+ whl_name: group_name
+ for group_name, group_whls in requirement_cycles.items()
+ for whl_name in group_whls
+ }
- group_repo = "%s__groups" % (pip_name,)
- group_library(
- name = group_repo,
- repo_prefix = pip_name + "_",
- groups = pip_attr.experimental_requirement_cycles,
- )
+ group_repo = "%s__groups" % (pip_name,)
+ group_library(
+ name = group_repo,
+ repo_prefix = pip_name + "_",
+ groups = pip_attr.experimental_requirement_cycles,
+ )
+ else:
+ whl_group_mapping = {}
+ requirement_cycles = {}
# Create a new wheel library for each of the different whls
for whl_name, requirement_line in requirements:
@@ -177,6 +181,7 @@
# to.
annotation = whl_modifications.get(whl_name)
whl_name = normalize_name(whl_name)
+
group_name = whl_group_mapping.get(whl_name)
group_deps = requirement_cycles.get(group_name, [])
diff --git a/tests/pip_install/whl_library/generate_build_bazel_tests.bzl b/tests/pip_install/whl_library/generate_build_bazel_tests.bzl
index 72423aa..11611b9 100644
--- a/tests/pip_install/whl_library/generate_build_bazel_tests.bzl
+++ b/tests/pip_install/whl_library/generate_build_bazel_tests.bzl
@@ -37,17 +37,17 @@
)
filegroup(
- name = "_whl",
+ name = "whl",
srcs = ["foo.whl"],
data = [
"@pypi_bar_baz//:whl",
"@pypi_foo//:whl",
],
- visibility = ["//visibility:private"],
+ visibility = ["//visibility:public"],
)
py_library(
- name = "_pkg",
+ name = "pkg",
srcs = glob(
["site-packages/**/*.py"],
exclude=[],
@@ -67,17 +67,7 @@
"@pypi_foo//:pkg",
],
tags = ["tag1", "tag2"],
- visibility = ["//visibility:private"],
-)
-
-alias(
- name = "pkg",
- actual = "_pkg",
-)
-
-alias(
- name = "whl",
- actual = "_whl",
+ visibility = ["//visibility:public"],
)
"""
actual = generate_whl_library_build_bazel(
@@ -113,7 +103,7 @@
)
filegroup(
- name = "_whl",
+ name = "whl",
srcs = ["foo.whl"],
data = [
"@pypi_bar_baz//:whl",
@@ -130,11 +120,11 @@
"//conditions:default": [],
},
),
- visibility = ["//visibility:private"],
+ visibility = ["//visibility:public"],
)
py_library(
- name = "_pkg",
+ name = "pkg",
srcs = glob(
["site-packages/**/*.py"],
exclude=[],
@@ -165,17 +155,7 @@
},
),
tags = ["tag1", "tag2"],
- visibility = ["//visibility:private"],
-)
-
-alias(
- name = "pkg",
- actual = "_pkg",
-)
-
-alias(
- name = "whl",
- actual = "_whl",
+ visibility = ["//visibility:public"],
)
config_setting(
@@ -275,17 +255,17 @@
)
filegroup(
- name = "_whl",
+ name = "whl",
srcs = ["foo.whl"],
data = [
"@pypi_bar_baz//:whl",
"@pypi_foo//:whl",
],
- visibility = ["//visibility:private"],
+ visibility = ["//visibility:public"],
)
py_library(
- name = "_pkg",
+ name = "pkg",
srcs = glob(
["site-packages/**/*.py"],
exclude=["srcs_exclude_all"],
@@ -305,17 +285,7 @@
"@pypi_foo//:pkg",
],
tags = ["tag1", "tag2"],
- visibility = ["//visibility:private"],
-)
-
-alias(
- name = "pkg",
- actual = "_pkg",
-)
-
-alias(
- name = "whl",
- actual = "_whl",
+ visibility = ["//visibility:public"],
)
copy_file(
@@ -373,17 +343,17 @@
)
filegroup(
- name = "_whl",
+ name = "whl",
srcs = ["foo.whl"],
data = [
"@pypi_bar_baz//:whl",
"@pypi_foo//:whl",
],
- visibility = ["//visibility:private"],
+ visibility = ["//visibility:public"],
)
py_library(
- name = "_pkg",
+ name = "pkg",
srcs = glob(
["site-packages/**/*.py"],
exclude=[],
@@ -403,17 +373,7 @@
"@pypi_foo//:pkg",
],
tags = ["tag1", "tag2"],
- visibility = ["//visibility:private"],
-)
-
-alias(
- name = "pkg",
- actual = "_pkg",
-)
-
-alias(
- name = "whl",
- actual = "_whl",
+ visibility = ["//visibility:public"],
)
py_binary(
@@ -502,16 +462,6 @@
visibility = ["@pypi__groups//:__pkg__"],
)
-alias(
- name = "pkg",
- actual = "@pypi__groups//:qux_pkg",
-)
-
-alias(
- name = "whl",
- actual = "@pypi__groups//:qux_whl",
-)
-
config_setting(
name = "is_linux_x86_64",
constraint_values = [
@@ -520,6 +470,16 @@
],
visibility = ["//visibility:private"],
)
+
+alias(
+ name = "pkg",
+ actual = "@pypi__groups//:qux_pkg",
+)
+
+alias(
+ name = "whl",
+ actual = "@pypi__groups//:qux_whl",
+)
"""
actual = generate_whl_library_build_bazel(
repo_prefix = "pypi_",