Thanks to visit codestin.com
Credit goes to github.com

Skip to content

More general support for platform_release #2821

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

Open
baxelrod-bdai opened this issue Apr 24, 2025 · 3 comments
Open

More general support for platform_release #2821

baxelrod-bdai opened this issue Apr 24, 2025 · 3 comments

Comments

@baxelrod-bdai
Copy link

🐞 bug report

Description

The >= operator should be supported for platform_release.

πŸ”¬ Minimal Reproduction

requirements.in has just:

keyboard

BUILD.bazel has:

load("@rules_uv//uv:pip.bzl", "pip_compile")

pip_compile(
    name = "generate_requirements",
    extra_args = [
        "--universal",
    ],
    requirements_in = "requirements.in",
    requirements_txt = "requirements.lock",
)

Running bazel run //:generate_requirements creates a .lock file with lots of entries like:

pyobjc-framework-businesschat==11.0 ; platform_release >= '18.0' and sys_platform == 'darwin' \
    --hash=sha256:1f732fdace31d2abdd14b3054f27a5e0f4591c7e1bef069b6aeb4f9c8d9ec487 \
    --hash=sha256:20fe1c8c848ef3c2e132172d9a007a8aa65b08875a9ca5c27afbfc4396b16dbb \
    --hash=sha256:47a2e4da9b061daa89a6367cb0e6bb8cdea0627379dd6d5095a8fd20243d8613
    # via pyobjc
pyobjc-framework-calendarstore==11.0 ; platform_release >= '9.0' and sys_platform == 'darwin' \
    --hash=sha256:40173f729df56b70ec14f9680962a248c3ce7b4babb46e8b0d760a13975ef174 \
    --hash=sha256:67ddc18c96bba42118fc92f1117b053c58c8888edb74193f0be67a10051cc9e2 \
    --hash=sha256:9b310fe66ac12e0feb7c8e3166034bec357a45f7f8b8916e93eddc6f199d08c8
    # via pyobjc

Then when you try to bazel run anything, you get the crash:

ERROR: /home/baxelrod/.cache/bazel/_bazel_baxelrod/223f490fa0c2f2ec38707ddac3dd6272/external/rules_python+/python/private/pypi/pep508_evaluate.bzl:348:20: Traceback (most recent call last):
	File "/home/baxelrod/.cache/bazel/_bazel_baxelrod/223f490fa0c2f2ec38707ddac3dd6272/external/rules_python+/python/private/pypi/extension.bzl", line 611, column 25, in _pip_impl
		mods = parse_modules(module_ctx)
	File "/home/baxelrod/.cache/bazel/_bazel_baxelrod/223f490fa0c2f2ec38707ddac3dd6272/external/rules_python+/python/private/pypi/extension.bzl", line 482, column 36, in parse_modules
		out = _create_whl_repos(
	File "/home/baxelrod/.cache/bazel/_bazel_baxelrod/223f490fa0c2f2ec38707ddac3dd6272/external/rules_python+/python/private/pypi/extension.bzl", line 158, column 50, in _create_whl_repos
		requirements_by_platform = parse_requirements(
	File "/home/baxelrod/.cache/bazel/_bazel_baxelrod/223f490fa0c2f2ec38707ddac3dd6272/external/rules_python+/python/private/pypi/parse_requirements.bzl", line 159, column 51, in parse_requirements
		env_marker_target_platforms = evaluate_markers(reqs_with_env_markers)
	File "/home/baxelrod/.cache/bazel/_bazel_baxelrod/223f490fa0c2f2ec38707ddac3dd6272/external/rules_python+/python/private/pypi/evaluate_markers.bzl", line 35, column 24, in evaluate_markers
		if evaluate(req.marker, env = env(platform_from_str(platform, None))):
	File "/home/baxelrod/.cache/bazel/_bazel_baxelrod/223f490fa0c2f2ec38707ddac3dd6272/external/rules_python+/python/private/pypi/pep508_evaluate.bzl", line 146, column 27, in evaluate
		tokens = ast.parse(env = env, tokens = tokens, strict = strict)
	File "/home/baxelrod/.cache/bazel/_bazel_baxelrod/223f490fa0c2f2ec38707ddac3dd6272/external/rules_python+/python/private/pypi/pep508_evaluate.bzl", line 231, column 40, in lambda
		parse = lambda **kwargs: _parse(self, **kwargs),
	File "/home/baxelrod/.cache/bazel/_bazel_baxelrod/223f490fa0c2f2ec38707ddac3dd6272/external/rules_python+/python/private/pypi/pep508_evaluate.bzl", line 258, column 27, in _parse
		expr = marker_expr(env = env, strict = strict, *tokens[:3])
	File "/home/baxelrod/.cache/bazel/_bazel_baxelrod/223f490fa0c2f2ec38707ddac3dd6272/external/rules_python+/python/private/pypi/pep508_evaluate.bzl", line 330, column 25, in marker_expr
		return _env_expr(left, op, right)
	File "/home/baxelrod/.cache/bazel/_bazel_baxelrod/223f490fa0c2f2ec38707ddac3dd6272/external/rules_python+/python/private/pypi/pep508_evaluate.bzl", line 348, column 20, in _env_expr
		return fail("TODO: op unsupported: '{}'".format(op))
Error in fail: TODO: op unsupported: '>='
ERROR: error evaluating module extension @@rules_python+//python/extensions:pip.bzl%pip

🌍 Your Environment

Operating System:

  
Linux baxelrod-ThinkPad 6.8.0-57-generic #59~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Mar 19 17:07:41 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
  

Output of bazel version:

  
Bazelisk version: v1.19.0
Build label: 8.1.1
Build target: @@//src/main/java/com/google/devtools/build/lib/bazel:BazelServer
Build time: Tue Feb 25 18:50:42 2025 (1740509442)
Build timestamp: 1740509442
Build timestamp as int: 1740509442
  

Rules_python version:

bazel_dep(name = "rules_python", version = "1.4.0-rc1")
bazel_dep(name = "rules_uv", version = "0.68.0")

Anything else relevant?

Slack thread: https://bazelbuild.slack.com/archives/CA306CEV6/p1745423125646599

@rickeylev
Copy link
Collaborator

What do the specs say about:

  • How >= should behave between strings?
  • Is platform_release treated specially? (i.e. treated as version comparison if version-like)

I looked at the pypa docs quickly, but didn't see anything specifically mentioned about them.

So, we should probably just implement it as a regular string comparison?

@groodt
Copy link
Collaborator

groodt commented Apr 25, 2025

The grammar and spec for markers is standardized by PEP 508 https://peps.python.org/pep-0508/

The comparisons are typed by the comparison operator (>= in this issue).

">=" is a version_cmp

If LHS and RHS are both valid versions (PEP 440) then version comparison takes place.

Otherwise it falls back to the default Python behaviour.

Relevant part of the spec copied below.

Comparisons in marker expressions are typed by the comparison operator. The operators that are not in perform the same as they do for strings in Python. The operators use the version comparison rules of the Version specifier specification when those are defined (that is when both sides have a valid version specifier). If there is no defined behaviour of this specification and the operator exists in Python, then the operator falls back to the Python behaviour. Otherwise an error should be raised. e.g. the following will result in errors:

"dog" ~= "fred"
python_version ~= "surprise"

There are standardized implementations of the spec in pypa/packaging, so perhaps we should consider using that or attempting to reproduce the tests in a Starlark implementation as some kind of compatibility test.

@aignas
Copy link
Collaborator

aignas commented Apr 27, 2025

Marking this as a feature request to have proper support for platform_release, but to fix this up in the short term, the work will be tracked in #2830.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants