@@ -1605,7 +1605,6 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
1605
1605
) ;
1606
1606
1607
1607
requirements
1608
- . iter ( )
1609
1608
. flat_map ( |requirement| {
1610
1609
PubGrubDependency :: from_requirement (
1611
1610
& self . conflicts ,
@@ -1704,7 +1703,6 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
1704
1703
) ;
1705
1704
1706
1705
requirements
1707
- . iter ( )
1708
1706
. flat_map ( |requirement| {
1709
1707
PubGrubDependency :: from_requirement (
1710
1708
& self . conflicts ,
@@ -1800,116 +1798,115 @@ impl<InstalledPackages: InstalledPackagesProvider> ResolverState<InstalledPackag
1800
1798
name : Option < & PackageName > ,
1801
1799
env : & ' a ResolverEnvironment ,
1802
1800
python_requirement : & ' a PythonRequirement ,
1803
- ) -> Vec < Cow < ' a , Requirement > > {
1804
- // Start with the requirements for the current extra of the package (for an extra
1805
- // requirement) or the non-extra (regular) dependencies (if extra is None), plus
1806
- // the constraints for the current package.
1807
- let regular_and_dev_dependencies = if let Some ( dev) = dev {
1808
- Either :: Left ( dev_dependencies. get ( dev) . into_iter ( ) . flatten ( ) )
1809
- } else {
1810
- Either :: Right ( dependencies. iter ( ) )
1811
- } ;
1801
+ ) -> impl Iterator < Item = Cow < ' a , Requirement > > {
1812
1802
let python_marker = python_requirement. to_marker_tree ( ) ;
1813
- let mut requirements = self
1814
- . requirements_for_extra (
1815
- regular_and_dev_dependencies,
1803
+
1804
+ if let Some ( dev) = dev {
1805
+ Either :: Left ( Either :: Left ( self . requirements_for_extra (
1806
+ dev_dependencies. get ( dev) . into_iter ( ) . flatten ( ) ,
1816
1807
extra,
1817
1808
env,
1818
1809
python_marker,
1819
1810
python_requirement,
1820
- )
1821
- . collect :: < Vec < _ > > ( ) ;
1822
-
1823
- // Dependency groups can include the project itself, so no need to flatten recursive
1824
- // dependencies.
1825
- if dev. is_some ( ) {
1826
- return requirements;
1827
- }
1828
-
1829
- // Check if there are recursive self inclusions; if so, we need to go into the expensive
1830
- // branch.
1831
- if !requirements
1811
+ ) ) )
1812
+ } else if !dependencies
1832
1813
. iter ( )
1833
1814
. any ( |req| name == Some ( & req. name ) && !req. extras . is_empty ( ) )
1834
1815
{
1835
- return requirements;
1836
- }
1837
-
1838
- // Transitively process all extras that are recursively included, starting with the current
1839
- // extra.
1840
- let mut seen = FxHashSet :: < ( ExtraName , MarkerTree ) > :: default ( ) ;
1841
- let mut queue: VecDeque < _ > = requirements
1842
- . iter ( )
1843
- . filter ( |req| name == Some ( & req. name ) )
1844
- . flat_map ( |req| req. extras . iter ( ) . cloned ( ) . map ( |extra| ( extra, req. marker ) ) )
1845
- . collect ( ) ;
1846
- while let Some ( ( extra, marker) ) = queue. pop_front ( ) {
1847
- if !seen. insert ( ( extra. clone ( ) , marker) ) {
1848
- continue ;
1849
- }
1850
- for requirement in self . requirements_for_extra (
1851
- dependencies,
1852
- Some ( & extra) ,
1816
+ Either :: Left ( Either :: Right ( self . requirements_for_extra (
1817
+ dependencies. iter ( ) ,
1818
+ extra,
1853
1819
env,
1854
1820
python_marker,
1855
1821
python_requirement,
1856
- ) {
1857
- let requirement = match requirement {
1858
- Cow :: Owned ( mut requirement) => {
1859
- requirement. marker . and ( marker) ;
1860
- requirement
1861
- }
1862
- Cow :: Borrowed ( requirement) => {
1863
- let mut marker = marker;
1864
- marker. and ( requirement. marker ) ;
1865
- Requirement {
1866
- name : requirement. name . clone ( ) ,
1867
- extras : requirement. extras . clone ( ) ,
1868
- groups : requirement. groups . clone ( ) ,
1869
- source : requirement. source . clone ( ) ,
1870
- origin : requirement. origin . clone ( ) ,
1871
- marker : marker. simplify_extras ( slice:: from_ref ( & extra) ) ,
1822
+ ) ) )
1823
+ } else {
1824
+ let mut requirements = self
1825
+ . requirements_for_extra (
1826
+ dependencies. iter ( ) ,
1827
+ extra,
1828
+ env,
1829
+ python_marker,
1830
+ python_requirement,
1831
+ )
1832
+ . collect :: < Vec < _ > > ( ) ;
1833
+
1834
+ // Transitively process all extras that are recursively included, starting with the current
1835
+ // extra.
1836
+ let mut seen = FxHashSet :: < ( ExtraName , MarkerTree ) > :: default ( ) ;
1837
+ let mut queue: VecDeque < _ > = requirements
1838
+ . iter ( )
1839
+ . filter ( |req| name == Some ( & req. name ) )
1840
+ . flat_map ( |req| req. extras . iter ( ) . cloned ( ) . map ( |extra| ( extra, req. marker ) ) )
1841
+ . collect ( ) ;
1842
+ while let Some ( ( extra, marker) ) = queue. pop_front ( ) {
1843
+ if !seen. insert ( ( extra. clone ( ) , marker) ) {
1844
+ continue ;
1845
+ }
1846
+ for requirement in self . requirements_for_extra (
1847
+ dependencies,
1848
+ Some ( & extra) ,
1849
+ env,
1850
+ python_marker,
1851
+ python_requirement,
1852
+ ) {
1853
+ let requirement = match requirement {
1854
+ Cow :: Owned ( mut requirement) => {
1855
+ requirement. marker . and ( marker) ;
1856
+ requirement
1872
1857
}
1858
+ Cow :: Borrowed ( requirement) => {
1859
+ let mut marker = marker;
1860
+ marker. and ( requirement. marker ) ;
1861
+ Requirement {
1862
+ name : requirement. name . clone ( ) ,
1863
+ extras : requirement. extras . clone ( ) ,
1864
+ groups : requirement. groups . clone ( ) ,
1865
+ source : requirement. source . clone ( ) ,
1866
+ origin : requirement. origin . clone ( ) ,
1867
+ marker : marker. simplify_extras ( slice:: from_ref ( & extra) ) ,
1868
+ }
1869
+ }
1870
+ } ;
1871
+ if name == Some ( & requirement. name ) {
1872
+ // Add each transitively included extra.
1873
+ queue. extend (
1874
+ requirement
1875
+ . extras
1876
+ . iter ( )
1877
+ . cloned ( )
1878
+ . map ( |extra| ( extra, requirement. marker ) ) ,
1879
+ ) ;
1880
+ } else {
1881
+ // Add the requirements for that extra.
1882
+ requirements. push ( Cow :: Owned ( requirement) ) ;
1873
1883
}
1874
- } ;
1875
- if name == Some ( & requirement. name ) {
1876
- // Add each transitively included extra.
1877
- queue. extend (
1878
- requirement
1879
- . extras
1880
- . iter ( )
1881
- . cloned ( )
1882
- . map ( |extra| ( extra, requirement. marker ) ) ,
1883
- ) ;
1884
- } else {
1885
- // Add the requirements for that extra.
1886
- requirements. push ( Cow :: Owned ( requirement) ) ;
1887
1884
}
1888
1885
}
1889
- }
1890
1886
1891
- // Retain any self-constraints for that extra, e.g., if `project[foo]` includes
1892
- // `project[bar]>1.0`, as a dependency, we need to propagate `project>1.0`, in addition to
1893
- // transitively expanding `project[bar]`.
1894
- let mut self_constraints = vec ! [ ] ;
1895
- for req in & requirements {
1896
- if name == Some ( & req. name ) && !req. source . is_empty ( ) {
1897
- self_constraints. push ( Requirement {
1898
- name : req. name . clone ( ) ,
1899
- extras : vec ! [ ] ,
1900
- groups : req. groups . clone ( ) ,
1901
- source : req. source . clone ( ) ,
1902
- origin : req. origin . clone ( ) ,
1903
- marker : req. marker ,
1904
- } ) ;
1887
+ // Retain any self-constraints for that extra, e.g., if `project[foo]` includes
1888
+ // `project[bar]>1.0`, as a dependency, we need to propagate `project>1.0`, in addition to
1889
+ // transitively expanding `project[bar]`.
1890
+ let mut self_constraints = vec ! [ ] ;
1891
+ for req in & requirements {
1892
+ if name == Some ( & req. name ) && !req. source . is_empty ( ) {
1893
+ self_constraints. push ( Requirement {
1894
+ name : req. name . clone ( ) ,
1895
+ extras : vec ! [ ] ,
1896
+ groups : req. groups . clone ( ) ,
1897
+ source : req. source . clone ( ) ,
1898
+ origin : req. origin . clone ( ) ,
1899
+ marker : req. marker ,
1900
+ } ) ;
1901
+ }
1905
1902
}
1906
- }
1907
1903
1908
- // Drop all the self-requirements now that we flattened them out.
1909
- requirements. retain ( |req| name != Some ( & req. name ) || req. extras . is_empty ( ) ) ;
1910
- requirements. extend ( self_constraints. into_iter ( ) . map ( Cow :: Owned ) ) ;
1904
+ // Drop all the self-requirements now that we flattened them out.
1905
+ requirements. retain ( |req| name != Some ( & req. name ) || req. extras . is_empty ( ) ) ;
1906
+ requirements. extend ( self_constraints. into_iter ( ) . map ( Cow :: Owned ) ) ;
1911
1907
1912
- requirements
1908
+ Either :: Right ( requirements. into_iter ( ) )
1909
+ }
1913
1910
}
1914
1911
1915
1912
/// The set of the regular and dev dependencies, filtered by Python version,
0 commit comments