diff --git a/src/pip/_internal/resolution/resolvelib/base.py b/src/pip/_internal/resolution/resolvelib/base.py index 5e9f041b5..f74846589 100644 --- a/src/pip/_internal/resolution/resolvelib/base.py +++ b/src/pip/_internal/resolution/resolvelib/base.py @@ -46,3 +46,7 @@ class Candidate(object): def get_dependencies(self): # type: () -> Sequence[InstallRequirement] raise NotImplementedError("Override in subclass") + + def get_install_requirement(self): + # type: () -> InstallRequirement + raise NotImplementedError("Override in subclass") diff --git a/src/pip/_internal/resolution/resolvelib/candidates.py b/src/pip/_internal/resolution/resolvelib/candidates.py index 08eff0ddf..667d6fa0c 100644 --- a/src/pip/_internal/resolution/resolvelib/candidates.py +++ b/src/pip/_internal/resolution/resolvelib/candidates.py @@ -124,3 +124,7 @@ class LinkCandidate(Candidate): self._make_install_req(str(r), self._ireq) for r in self.dist.requires() ] + + def get_install_requirement(self): + # type: () -> InstallRequirement + return self._ireq diff --git a/src/pip/_internal/resolution/resolvelib/provider.py b/src/pip/_internal/resolution/resolvelib/provider.py index 981646ea9..b50abdd1f 100644 --- a/src/pip/_internal/resolution/resolvelib/provider.py +++ b/src/pip/_internal/resolution/resolvelib/provider.py @@ -38,15 +38,7 @@ class PipProvider(AbstractProvider): def get_install_requirement(self, c): # type: (Candidate) -> InstallRequirement - - # The base Candidate class does not have an _ireq attribute, so we - # fetch it dynamically here, to satisfy mypy. In practice, though, we - # only ever deal with LinkedCandidate objects at the moment, which do - # have an _ireq attribute. When we have a candidate type for installed - # requirements we should probably review this. - # - # TODO: Longer term, make a proper interface for this on the candidate. - return getattr(c, "_ireq", None) + return c.get_install_requirement() def identify(self, dependency): # type: (Union[Requirement, Candidate]) -> str