From 3e48c89c6d122c3c9682e26653bcbff3400f3176 Mon Sep 17 00:00:00 2001 From: Ted Kaplan Date: Tue, 13 Jan 2026 23:31:40 -0800 Subject: [PATCH 1/3] fix(pypi): Handle case where dep is in extras multiple times --- python/private/pypi/pep508_deps.bzl | 1 + tests/pypi/pep508/deps_tests.bzl | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/python/private/pypi/pep508_deps.bzl b/python/private/pypi/pep508_deps.bzl index e73f747bed..b157e0b046 100644 --- a/python/private/pypi/pep508_deps.bzl +++ b/python/private/pypi/pep508_deps.bzl @@ -81,6 +81,7 @@ def deps( deps_select = { d: markers for d, markers in sorted(deps_select.items()) + if d not in deps }, ) diff --git a/tests/pypi/pep508/deps_tests.bzl b/tests/pypi/pep508/deps_tests.bzl index aaa3b2f7dd..26fcdb1339 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_markers_with_extra(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_markers_with_extra) + def deps_test_suite(name): # buildifier: disable=function-docstring test_suite( name = name, From 5050f4f084a96921ca88e2d7fd3b683f4d8046be Mon Sep 17 00:00:00 2001 From: Ted Kaplan Date: Tue, 13 Jan 2026 23:39:59 -0800 Subject: [PATCH 2/3] Respond to AI feedback --- python/private/pypi/pep508_deps.bzl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/python/private/pypi/pep508_deps.bzl b/python/private/pypi/pep508_deps.bzl index b157e0b046..cdb449bdc2 100644 --- a/python/private/pypi/pep508_deps.bzl +++ b/python/private/pypi/pep508_deps.bzl @@ -81,7 +81,6 @@ def deps( deps_select = { d: markers for d, markers in sorted(deps_select.items()) - if d not in deps }, ) @@ -157,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) @@ -164,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)) From 1dc2c0d9d91e6fe3b7bbd513a150b41012690b1a Mon Sep 17 00:00:00 2001 From: Ted Kaplan Date: Tue, 13 Jan 2026 23:41:29 -0800 Subject: [PATCH 3/3] Rename test --- tests/pypi/pep508/deps_tests.bzl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/pypi/pep508/deps_tests.bzl b/tests/pypi/pep508/deps_tests.bzl index 26fcdb1339..679ba58396 100644 --- a/tests/pypi/pep508/deps_tests.bzl +++ b/tests/pypi/pep508/deps_tests.bzl @@ -161,7 +161,7 @@ def test_all_markers_are_added(env): _tests.append(test_all_markers_are_added) -def test_markers_with_extra(env): +def test_extra_with_conditional_and_unconditional_markers(env): requires_dist = [ "bar", 'baz!=1.56.0; sys_platform == "darwin" and extra == "client"', @@ -177,7 +177,7 @@ def test_markers_with_extra(env): env.expect.that_collection(got.deps).contains_exactly(["bar", "baz"]) env.expect.that_dict(got.deps_select).contains_exactly({}) -_tests.append(test_markers_with_extra) +_tests.append(test_extra_with_conditional_and_unconditional_markers) def deps_test_suite(name): # buildifier: disable=function-docstring test_suite(