Skip to content

Commit edabfce

Browse files
authored
refactor(provider): move code to merge dependencies by constraint to separate method (#5523)
1 parent 3d6ffce commit edabfce

File tree

1 file changed

+44
-43
lines changed

1 file changed

+44
-43
lines changed

Diff for: src/poetry/puzzle/provider.py

+44-43
Original file line numberDiff line numberDiff line change
@@ -546,43 +546,20 @@ def complete_package(self, package: DependencyPackage) -> DependencyPackage:
546546
self.debug(f"<debug>Duplicate dependencies for {dep_name}</debug>")
547547

548548
deps = self._merge_dependencies_by_marker(deps)
549+
deps = self._merge_dependencies_by_constraint(deps)
549550

550-
# Merging dependencies by constraint
551-
by_constraint: dict[VersionConstraint, list[Dependency]] = defaultdict(list)
552-
for dep in deps:
553-
by_constraint[dep.constraint].append(dep)
554-
for constraint, _deps in by_constraint.items():
555-
new_markers = []
556-
for dep in _deps:
557-
marker = dep.marker.without_extras()
558-
if marker.is_any():
559-
# No marker or only extras
560-
continue
561-
562-
new_markers.append(marker)
563-
564-
if not new_markers:
565-
continue
566-
567-
dep = _deps[0]
568-
dep.marker = dep.marker.union(MarkerUnion(*new_markers))
569-
by_constraint[constraint] = [dep]
570-
571-
continue
572-
573-
if len(by_constraint) == 1:
551+
if len(deps) == 1:
574552
self.debug(f"<debug>Merging requirements for {deps[0]!s}</debug>")
575-
dependencies.append(list(by_constraint.values())[0][0])
553+
dependencies.append(deps[0])
576554
continue
577555

578556
# We leave dependencies as-is if they have the same
579557
# python/platform constraints.
580558
# That way the resolver will pickup the conflict
581559
# and display a proper error.
582-
_deps = [value[0] for value in by_constraint.values()]
583560
seen = set()
584-
for _dep in _deps:
585-
pep_508_dep = _dep.to_pep_508(False)
561+
for dep in deps:
562+
pep_508_dep = dep.to_pep_508(False)
586563
if ";" not in pep_508_dep:
587564
_requirements = ""
588565
else:
@@ -591,9 +568,9 @@ def complete_package(self, package: DependencyPackage) -> DependencyPackage:
591568
if _requirements not in seen:
592569
seen.add(_requirements)
593570

594-
if len(_deps) != len(seen):
595-
for _dep in _deps:
596-
dependencies.append(_dep)
571+
if len(deps) != len(seen):
572+
for dep in deps:
573+
dependencies.append(dep)
597574

598575
continue
599576

@@ -608,7 +585,6 @@ def complete_package(self, package: DependencyPackage) -> DependencyPackage:
608585
# with the following overrides:
609586
# - {<Package foo (1.2.3): {"bar": <Dependency bar (>=2.0)>}
610587
# - {<Package foo (1.2.3): {"bar": <Dependency bar (<2.0)>}
611-
_deps = [_dep[0] for _dep in by_constraint.values()]
612588

613589
def fmt_warning(d: Dependency) -> str:
614590
marker = d.marker if not d.marker.is_any() else "*"
@@ -617,8 +593,8 @@ def fmt_warning(d: Dependency) -> str:
617593
f" with markers <b>{marker}</b>"
618594
)
619595

620-
warnings = ", ".join(fmt_warning(d) for d in _deps[:-1])
621-
warnings += f" and {fmt_warning(_deps[-1])}"
596+
warnings = ", ".join(fmt_warning(d) for d in deps[:-1])
597+
warnings += f" and {fmt_warning(deps[-1])}"
622598
self.debug(
623599
f"<warning>Different requirements found for {warnings}.</warning>"
624600
)
@@ -640,8 +616,8 @@ def fmt_warning(d: Dependency) -> str:
640616
# - foo (!= 1.2.1) ; python == 3.10
641617
#
642618
# the constraint for the second entry will become (!= 1.2.1, >= 1.2)
643-
any_markers_dependencies = [d for d in _deps if d.marker.is_any()]
644-
other_markers_dependencies = [d for d in _deps if not d.marker.is_any()]
619+
any_markers_dependencies = [d for d in deps if d.marker.is_any()]
620+
other_markers_dependencies = [d for d in deps if not d.marker.is_any()]
645621

646622
marker = other_markers_dependencies[0].marker
647623
for other_dep in other_markers_dependencies[1:]:
@@ -667,22 +643,22 @@ def fmt_warning(d: Dependency) -> str:
667643
#
668644
# the last dependency would be missed without this,
669645
# because the intersection with both foo dependencies is empty
670-
inverted_marker_dep = _deps[0].with_constraint(EmptyConstraint())
646+
inverted_marker_dep = deps[0].with_constraint(EmptyConstraint())
671647
inverted_marker_dep.marker = inverted_marker
672-
_deps.append(inverted_marker_dep)
648+
deps.append(inverted_marker_dep)
673649

674650
overrides = []
675651
overrides_marker_intersection: BaseMarker = AnyMarker()
676652
for dep_overrides in self._overrides.values():
677-
for _dep in dep_overrides.values():
653+
for dep in dep_overrides.values():
678654
overrides_marker_intersection = (
679-
overrides_marker_intersection.intersect(_dep.marker)
655+
overrides_marker_intersection.intersect(dep.marker)
680656
)
681-
for _dep in _deps:
682-
if not overrides_marker_intersection.intersect(_dep.marker).is_empty():
657+
for dep in deps:
658+
if not overrides_marker_intersection.intersect(dep.marker).is_empty():
683659
current_overrides = self._overrides.copy()
684660
package_overrides = current_overrides.get(package, {}).copy()
685-
package_overrides.update({_dep.name: _dep})
661+
package_overrides.update({dep.name: dep})
686662
current_overrides.update({package: package_overrides})
687663
overrides.append(current_overrides)
688664

@@ -828,6 +804,31 @@ def progress(self) -> Iterator[None]:
828804

829805
self._in_progress = False
830806

807+
def _merge_dependencies_by_constraint(
808+
self, dependencies: Iterable[Dependency]
809+
) -> list[Dependency]:
810+
by_constraint: dict[VersionConstraint, list[Dependency]] = defaultdict(list)
811+
for dep in dependencies:
812+
by_constraint[dep.constraint].append(dep)
813+
for constraint, _deps in by_constraint.items():
814+
new_markers = []
815+
for dep in _deps:
816+
marker = dep.marker.without_extras()
817+
if marker.is_any():
818+
# No marker or only extras
819+
continue
820+
821+
new_markers.append(marker)
822+
823+
if not new_markers:
824+
continue
825+
826+
dep = _deps[0]
827+
dep.marker = dep.marker.union(MarkerUnion(*new_markers))
828+
by_constraint[constraint] = [dep]
829+
830+
return [value[0] for value in by_constraint.values()]
831+
831832
def _merge_dependencies_by_marker(
832833
self, dependencies: Iterable[Dependency]
833834
) -> list[Dependency]:

0 commit comments

Comments
 (0)