11
11
import packaging .version
12
12
import pip_shims .shims
13
13
import requests
14
- from first import first
15
14
from packaging .utils import canonicalize_name
16
15
from vistir .compat import JSONDecodeError , fs_str
17
16
from vistir .contextmanagers import cd , temp_environ
20
19
from ..environment import MYPY_RUNNING
21
20
from ..utils import _ensure_dir , prepare_pip_source_args
22
21
from .cache import CACHE_DIR , DependencyCache
22
+ from .setup_info import SetupInfo
23
23
from .utils import (
24
24
clean_requires_python ,
25
25
fix_requires_python_marker ,
@@ -144,9 +144,9 @@ def compatible_versions(self, other):
144
144
:rtype: set(str)
145
145
"""
146
146
147
- if len (self .candidates ) == 1 and first ( self .candidates ).editable :
147
+ if len (self .candidates ) == 1 and next ( iter ( self .candidates ) ).editable :
148
148
return self
149
- elif len (other .candidates ) == 1 and first ( other .candidates ).editable :
149
+ elif len (other .candidates ) == 1 and next ( iter ( other .candidates ) ).editable :
150
150
return other
151
151
return self .version_set & other .version_set
152
152
@@ -163,9 +163,9 @@ def compatible_abstract_dep(self, other):
163
163
164
164
from .requirements import Requirement
165
165
166
- if len (self .candidates ) == 1 and first ( self .candidates ).editable :
166
+ if len (self .candidates ) == 1 and next ( iter ( self .candidates ) ).editable :
167
167
return self
168
- elif len (other .candidates ) == 1 and first ( other .candidates ).editable :
168
+ elif len (other .candidates ) == 1 and next ( iter ( other .candidates ) ).editable :
169
169
return other
170
170
new_specifiers = self .specifiers & other .specifiers
171
171
markers = set (self .markers ) if self .markers else set ()
@@ -480,90 +480,19 @@ def get_dependencies_from_index(dep, sources=None, pip_options=None, wheel_cache
480
480
if not wheel_cache :
481
481
wheel_cache = WHEEL_CACHE
482
482
dep .is_direct = True
483
- reqset = pip_shims .shims .RequirementSet ()
484
- reqset .add_requirement (dep )
485
483
requirements = None
486
484
setup_requires = {}
487
- with temp_environ (), start_resolver (
488
- finder = finder , session = session , wheel_cache = wheel_cache
489
- ) as resolver :
485
+ with temp_environ ():
490
486
os .environ ["PIP_EXISTS_ACTION" ] = "i"
491
- dist = None
492
487
if dep .editable and not dep .prepared and not dep .req :
493
- with cd (dep .setup_py_dir ):
494
- from setuptools .dist import distutils
495
-
496
- try :
497
- dist = distutils .core .run_setup (dep .setup_py )
498
- except (ImportError , TypeError , AttributeError ):
499
- dist = None
500
- else :
501
- setup_requires [dist .get_name ()] = dist .setup_requires
502
- if not dist :
503
- try :
504
- dist = dep .get_dist ()
505
- except (TypeError , ValueError , AttributeError ):
506
- pass
507
- else :
508
- setup_requires [dist .get_name ()] = dist .setup_requires
509
- resolver .require_hashes = False
510
- try :
511
- results = resolver ._resolve_one (reqset , dep )
512
- except Exception :
513
- # FIXME: Needs to bubble the exception somehow to the user.
514
- results = []
515
- finally :
516
- try :
517
- wheel_cache .cleanup ()
518
- except AttributeError :
519
- pass
520
- resolver_requires_python = getattr (resolver , "requires_python" , None )
521
- requires_python = getattr (reqset , "requires_python" , resolver_requires_python )
522
- if requires_python :
523
- add_marker = fix_requires_python_marker (requires_python )
524
- reqset .remove (dep )
525
- if dep .req .marker :
526
- dep .req .marker ._markers .extend (["and" ].extend (add_marker ._markers ))
527
- else :
528
- dep .req .marker = add_marker
529
- reqset .add (dep )
530
- requirements = set ()
531
- for r in results :
532
- if requires_python :
533
- if r .req .marker :
534
- r .req .marker ._markers .extend (["and" ].extend (add_marker ._markers ))
535
- else :
536
- r .req .marker = add_marker
537
- requirements .add (format_requirement (r ))
538
- for section in setup_requires :
539
- python_version = section
540
- not_python = not is_python (section )
541
-
542
- # This is for cleaning up :extras: formatted markers
543
- # by adding them to the results of the resolver
544
- # since any such extra would have been returned as a result anyway
545
- for value in setup_requires [section ]:
546
-
547
- # This is a marker.
548
- if is_python (section ):
549
- python_version = value [1 :- 1 ]
550
- else :
551
- not_python = True
552
-
553
- if ":" not in value and not_python :
554
- try :
555
- requirement_str = "{0}{1}" .format (value , python_version ).replace (
556
- ":" , ";"
557
- )
558
- requirements .add (
559
- format_requirement (
560
- make_install_requirement (requirement_str ).ireq
561
- )
562
- )
563
- # Anything could go wrong here -- can't be too careful.
564
- except Exception :
565
- pass
566
-
488
+ setup_info = SetupInfo .from_ireq (dep )
489
+ results = setup_info .get_info ()
490
+ setup_requires .update (results ["setup_requires" ])
491
+ requirements = set (results ["requires" ].values ())
492
+ else :
493
+ results = pip_shims .shims .resolve (dep )
494
+ requirements = [v for v in results .values () if v .name != dep .name ]
495
+ requirements = set ([format_requirement (r ) for r in requirements ])
567
496
if not dep .editable and is_pinned_requirement (dep ) and requirements is not None :
568
497
DEPENDENCY_CACHE [dep ] = list (requirements )
569
498
return requirements
@@ -694,10 +623,10 @@ def get_grouped_dependencies(constraints):
694
623
# then we take the loose match (which _is_ flexible) and start moving backwards in
695
624
# versions by popping them off of a stack and checking for the conflicting package
696
625
for _ , ireqs in full_groupby (constraints , key = key_from_ireq ):
697
- ireqs = list (ireqs )
698
- editable_ireq = first ( ireqs , key = lambda ireq : ireq .editable )
626
+ ireqs = sorted (ireqs , key = lambda ireq : ireq . editable )
627
+ editable_ireq = next ( iter ( ireq for ireq in ireqs if ireq .editable ), None )
699
628
if editable_ireq :
700
- yield editable_ireq # ignore all the other specs: the editable one is the one that counts
629
+ yield editable_ireq # only the editable match mattters, ignore all others
701
630
continue
702
631
ireqs = iter (ireqs )
703
632
# deepcopy the accumulator so as to not modify the self.our_constraints invariant
0 commit comments