@@ -546,43 +546,20 @@ def complete_package(self, package: DependencyPackage) -> DependencyPackage:
546
546
self .debug (f"<debug>Duplicate dependencies for { dep_name } </debug>" )
547
547
548
548
deps = self ._merge_dependencies_by_marker (deps )
549
+ deps = self ._merge_dependencies_by_constraint (deps )
549
550
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 :
574
552
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 ])
576
554
continue
577
555
578
556
# We leave dependencies as-is if they have the same
579
557
# python/platform constraints.
580
558
# That way the resolver will pickup the conflict
581
559
# and display a proper error.
582
- _deps = [value [0 ] for value in by_constraint .values ()]
583
560
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 )
586
563
if ";" not in pep_508_dep :
587
564
_requirements = ""
588
565
else :
@@ -591,9 +568,9 @@ def complete_package(self, package: DependencyPackage) -> DependencyPackage:
591
568
if _requirements not in seen :
592
569
seen .add (_requirements )
593
570
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 )
597
574
598
575
continue
599
576
@@ -608,7 +585,6 @@ def complete_package(self, package: DependencyPackage) -> DependencyPackage:
608
585
# with the following overrides:
609
586
# - {<Package foo (1.2.3): {"bar": <Dependency bar (>=2.0)>}
610
587
# - {<Package foo (1.2.3): {"bar": <Dependency bar (<2.0)>}
611
- _deps = [_dep [0 ] for _dep in by_constraint .values ()]
612
588
613
589
def fmt_warning (d : Dependency ) -> str :
614
590
marker = d .marker if not d .marker .is_any () else "*"
@@ -617,8 +593,8 @@ def fmt_warning(d: Dependency) -> str:
617
593
f" with markers <b>{ marker } </b>"
618
594
)
619
595
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 ])} "
622
598
self .debug (
623
599
f"<warning>Different requirements found for { warnings } .</warning>"
624
600
)
@@ -640,8 +616,8 @@ def fmt_warning(d: Dependency) -> str:
640
616
# - foo (!= 1.2.1) ; python == 3.10
641
617
#
642
618
# 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 ()]
645
621
646
622
marker = other_markers_dependencies [0 ].marker
647
623
for other_dep in other_markers_dependencies [1 :]:
@@ -667,22 +643,22 @@ def fmt_warning(d: Dependency) -> str:
667
643
#
668
644
# the last dependency would be missed without this,
669
645
# 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 ())
671
647
inverted_marker_dep .marker = inverted_marker
672
- _deps .append (inverted_marker_dep )
648
+ deps .append (inverted_marker_dep )
673
649
674
650
overrides = []
675
651
overrides_marker_intersection : BaseMarker = AnyMarker ()
676
652
for dep_overrides in self ._overrides .values ():
677
- for _dep in dep_overrides .values ():
653
+ for dep in dep_overrides .values ():
678
654
overrides_marker_intersection = (
679
- overrides_marker_intersection .intersect (_dep .marker )
655
+ overrides_marker_intersection .intersect (dep .marker )
680
656
)
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 ():
683
659
current_overrides = self ._overrides .copy ()
684
660
package_overrides = current_overrides .get (package , {}).copy ()
685
- package_overrides .update ({_dep .name : _dep })
661
+ package_overrides .update ({dep .name : dep })
686
662
current_overrides .update ({package : package_overrides })
687
663
overrides .append (current_overrides )
688
664
@@ -828,6 +804,31 @@ def progress(self) -> Iterator[None]:
828
804
829
805
self ._in_progress = False
830
806
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
+
831
832
def _merge_dependencies_by_marker (
832
833
self , dependencies : Iterable [Dependency ]
833
834
) -> list [Dependency ]:
0 commit comments