diff --git a/python/private/pypi/pep508_deps.bzl b/python/private/pypi/pep508_deps.bzl index e73f747bed..cdb449bdc2 100644 --- a/python/private/pypi/pep508_deps.bzl +++ b/python/private/pypi/pep508_deps.bzl @@ -156,6 +156,7 @@ def _add_reqs(deps, deps_select, dep, reqs, *, extras): return markers = {} + found_unconditional = False for req in reqs: for x in extras: m = evaluate(req.marker, env = {"extra": x}, strict = False) @@ -163,10 +164,13 @@ def _add_reqs(deps, deps_select, dep, reqs, *, extras): continue elif m == True: _add(deps, deps_select, dep) + found_unconditional = True break else: markers[m] = None continue + if found_unconditional: + break - if markers: + if markers and not found_unconditional: _add(deps, deps_select, dep, sorted(markers)) diff --git a/tests/pypi/pep508/deps_tests.bzl b/tests/pypi/pep508/deps_tests.bzl index aaa3b2f7dd..679ba58396 100644 --- a/tests/pypi/pep508/deps_tests.bzl +++ b/tests/pypi/pep508/deps_tests.bzl @@ -161,6 +161,24 @@ def test_all_markers_are_added(env): _tests.append(test_all_markers_are_added) +def test_extra_with_conditional_and_unconditional_markers(env): + requires_dist = [ + "bar", + 'baz!=1.56.0; sys_platform == "darwin" and extra == "client"', + 'baz; extra == "client"', + ] + + got = deps( + "foo", + extras = ["client"], + requires_dist = requires_dist, + ) + + env.expect.that_collection(got.deps).contains_exactly(["bar", "baz"]) + env.expect.that_dict(got.deps_select).contains_exactly({}) + +_tests.append(test_extra_with_conditional_and_unconditional_markers) + def deps_test_suite(name): # buildifier: disable=function-docstring test_suite( name = name,