Skip to content

internal(render_pkg_aliases): allow using default config setting #1764

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions python/private/bzlmod/pip.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides):
)

major_minor = _major_minor_version(pip_attr.python_version)
default_major_minor = _major_minor_version(DEFAULT_PYTHON_VERSION)
whl_map[hub_name].setdefault(whl_name, []).append(
whl_alias(
repo = repo_name,
Expand All @@ -216,6 +217,14 @@ def _create_whl_repos(module_ctx, pip_attr, whl_map, whl_overrides):
config_setting = Label("//python/config_settings:is_python_" + major_minor),
),
)
if default_major_minor == major_minor:
whl_map[hub_name][whl_name].append(
whl_alias(
repo = repo_name,
version = major_minor,
config_setting = "//conditions:default",
),
)

def _pip_impl(module_ctx):
"""Implementation of a class tag that creates the pip hub and corresponding pip spoke whl repositories.
Expand Down
1 change: 0 additions & 1 deletion python/private/bzlmod/pip_repository.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ def _pip_repository_impl(rctx):
key: [whl_alias(**v) for v in json.decode(values)]
for key, values in rctx.attr.whl_map.items()
},
default_version = rctx.attr.default_version,
)
for path, contents in aliases.items():
rctx.file(path, contents)
Expand Down
25 changes: 21 additions & 4 deletions python/private/render_pkg_aliases.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ If the value is missing, then the "default" Python version is being used,
which has a "null" version value and will not match version constraints.
"""

_CONDITIONS_DEFAULT = "//conditions:default"

def _render_whl_library_alias(
*,
name,
Expand All @@ -60,12 +62,13 @@ def _render_whl_library_alias(
for alias in sorted(aliases, key = lambda x: x.version):
actual = "@{repo}//:{name}".format(repo = alias.repo, name = name)
selects[alias.config_setting] = actual
if alias.version == default_version:
if alias.version == default_version or alias.config_setting == _CONDITIONS_DEFAULT:
default = actual
no_match_error = None

if default:
selects["//conditions:default"] = default
# Attempt setting it but continue if already exists
selects.setdefault(_CONDITIONS_DEFAULT, default)

return render.alias(
name = name,
Expand All @@ -81,10 +84,24 @@ def _render_common_aliases(*, name, aliases, default_version = None):
]

versions = None
has_default = False
if aliases:
versions = sorted([v.version for v in aliases if v.version])
versions = sorted([a.version for a in aliases if a.version])
has_default = len([a.config_setting for a in aliases if a.config_setting == _CONDITIONS_DEFAULT]) == 1
default_version_aliases = [a for a in aliases if a.version == default_version or a.config_setting == _CONDITIONS_DEFAULT]
if not has_default and len(default_version_aliases) > 1:
fail(
(
"BUG: expected to have a single alias for the default version, but got multiple: '{}'. " +
"Add the 'whl_alias(config_setting = {}, ...)' setting explicitly."
).format(default_version_aliases, repr(_CONDITIONS_DEFAULT)),
)

if has_default:
# Zero this out as it is not useful anymore.
default_version = None

if not versions or default_version in versions:
if not versions or default_version in versions or has_default:
pass
else:
error_msg = NO_MATCH_ERROR_MESSAGE_TEMPLATE.format(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,75 @@ alias(

_tests.append(_test_bzlmod_aliases)

def _test_bzlmod_aliases_with_default(env):
actual = render_pkg_aliases(
aliases = {
"bar-baz": [
whl_alias(version = "3.2", repo = "pypi_32_bar_baz", config_setting = "//:my_config_setting_32"),
whl_alias(version = "3.1", repo = "pypi_31_bar_baz", config_setting = "//:my_config_setting_31"),
whl_alias(version = "3.2", repo = "pypi_32_bar_baz", config_setting = "//conditions:default"),
],
},
)

want_key = "bar_baz/BUILD.bazel"
want_content = """\
package(default_visibility = ["//visibility:public"])

alias(
name = "bar_baz",
actual = ":pkg",
)

alias(
name = "pkg",
actual = select(
{
"//:my_config_setting_31": "@pypi_31_bar_baz//:pkg",
"//:my_config_setting_32": "@pypi_32_bar_baz//:pkg",
"//conditions:default": "@pypi_32_bar_baz//:pkg",
},
),
)

alias(
name = "whl",
actual = select(
{
"//:my_config_setting_31": "@pypi_31_bar_baz//:whl",
"//:my_config_setting_32": "@pypi_32_bar_baz//:whl",
"//conditions:default": "@pypi_32_bar_baz//:whl",
},
),
)

alias(
name = "data",
actual = select(
{
"//:my_config_setting_31": "@pypi_31_bar_baz//:data",
"//:my_config_setting_32": "@pypi_32_bar_baz//:data",
"//conditions:default": "@pypi_32_bar_baz//:data",
},
),
)

alias(
name = "dist_info",
actual = select(
{
"//:my_config_setting_31": "@pypi_31_bar_baz//:dist_info",
"//:my_config_setting_32": "@pypi_32_bar_baz//:dist_info",
"//conditions:default": "@pypi_32_bar_baz//:dist_info",
},
),
)"""

env.expect.that_collection(actual.keys()).contains_exactly([want_key])
env.expect.that_str(actual[want_key]).equals(want_content)

_tests.append(_test_bzlmod_aliases_with_default)

def _test_bzlmod_aliases_with_no_default_version(env):
actual = render_pkg_aliases(
default_version = None,
Expand Down