Skip to content

Commit 96d59cd

Browse files
committed
Fix a solver case with complex extras
1 parent db02890 commit 96d59cd

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

src/poetry/puzzle/solver.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ def reachable(self) -> list[PackageNode]:
325325
and dependency.constraint.allows(pkg.version.stable)
326326
)
327327
and not any(
328-
child.package.name == pkg.name
328+
child.package.complete_name == pkg.complete_name
329329
and child.groups == dependency.groups
330330
for child in children
331331
)

tests/puzzle/test_solver.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,53 @@ def test_solver_returns_extras_only_requested_nested(
686686
assert ops[0].package.marker.is_any()
687687

688688

689+
def test_solver_finds_extras_next_to_non_extras(
690+
solver: Solver, repo: Repository, package: ProjectPackage
691+
):
692+
# Root depends on A[foo]
693+
package.add_dependency(
694+
Factory.create_dependency("A", {"version": "*", "extras": ["foo"]})
695+
)
696+
697+
package_a = get_package("A", "1.0")
698+
package_b = get_package("B", "1.0")
699+
package_c = get_package("C", "1.0")
700+
package_d = get_package("D", "1.0")
701+
702+
# A depends on B; A[foo] depends on B[bar].
703+
package_a.add_dependency(Factory.create_dependency("B", "*"))
704+
package_a.add_dependency(
705+
Factory.create_dependency(
706+
"B", {"version": "*", "extras": ["bar"], "markers": "extra == 'foo'"}
707+
)
708+
)
709+
package_a.extras = {"foo": [get_dependency("B", "*")]}
710+
711+
# B depends on C; B[bar] depends on D.
712+
package_b.add_dependency(Factory.create_dependency("C", "*"))
713+
package_b.add_dependency(
714+
Factory.create_dependency("D", {"version": "*", "markers": 'extra == "bar"'})
715+
)
716+
package_b.extras = {"bar": [get_dependency("D", "*")]}
717+
718+
repo.add_package(package_a)
719+
repo.add_package(package_b)
720+
repo.add_package(package_c)
721+
repo.add_package(package_d)
722+
723+
transaction = solver.solve()
724+
725+
check_solver_result(
726+
transaction,
727+
[
728+
{"job": "install", "package": package_c},
729+
{"job": "install", "package": package_d},
730+
{"job": "install", "package": package_b},
731+
{"job": "install", "package": package_a},
732+
],
733+
)
734+
735+
689736
def test_solver_returns_prereleases_if_requested(
690737
solver: Solver, repo: Repository, package: ProjectPackage
691738
):

0 commit comments

Comments
 (0)