diff options
Diffstat (limited to 'src/pip/_internal/distributions')
-rw-r--r-- | src/pip/_internal/distributions/base.py | 5 | ||||
-rw-r--r-- | src/pip/_internal/distributions/installed.py | 9 | ||||
-rw-r--r-- | src/pip/_internal/distributions/sdist.py | 35 | ||||
-rw-r--r-- | src/pip/_internal/distributions/wheel.py | 5 |
4 files changed, 41 insertions, 13 deletions
diff --git a/src/pip/_internal/distributions/base.py b/src/pip/_internal/distributions/base.py index 149fff55d..75ce2dc90 100644 --- a/src/pip/_internal/distributions/base.py +++ b/src/pip/_internal/distributions/base.py @@ -31,6 +31,9 @@ class AbstractDistribution(metaclass=abc.ABCMeta): @abc.abstractmethod def prepare_distribution_metadata( - self, finder: PackageFinder, build_isolation: bool + self, + finder: PackageFinder, + build_isolation: bool, + check_build_deps: bool, ) -> None: raise NotImplementedError() diff --git a/src/pip/_internal/distributions/installed.py b/src/pip/_internal/distributions/installed.py index 6c8c17929..edb38aa1a 100644 --- a/src/pip/_internal/distributions/installed.py +++ b/src/pip/_internal/distributions/installed.py @@ -11,12 +11,13 @@ class InstalledDistribution(AbstractDistribution): """ def get_metadata_distribution(self) -> BaseDistribution: - from pip._internal.metadata.pkg_resources import Distribution as _Dist - assert self.req.satisfied_by is not None, "not actually installed" - return _Dist(self.req.satisfied_by) + return self.req.satisfied_by def prepare_distribution_metadata( - self, finder: PackageFinder, build_isolation: bool + self, + finder: PackageFinder, + build_isolation: bool, + check_build_deps: bool, ) -> None: pass diff --git a/src/pip/_internal/distributions/sdist.py b/src/pip/_internal/distributions/sdist.py index cd85ac5c4..4c2564793 100644 --- a/src/pip/_internal/distributions/sdist.py +++ b/src/pip/_internal/distributions/sdist.py @@ -19,12 +19,13 @@ class SourceDistribution(AbstractDistribution): """ def get_metadata_distribution(self) -> BaseDistribution: - from pip._internal.metadata.pkg_resources import Distribution as _Dist - - return _Dist(self.req.get_dist()) + return self.req.get_dist() def prepare_distribution_metadata( - self, finder: PackageFinder, build_isolation: bool + self, + finder: PackageFinder, + build_isolation: bool, + check_build_deps: bool, ) -> None: # Load pyproject.toml, to determine whether PEP 517 is to be used self.req.load_pyproject_toml() @@ -45,7 +46,18 @@ class SourceDistribution(AbstractDistribution): self.req.isolated_editable_sanity_check() # Install the dynamic build requirements. self._install_build_reqs(finder) - + # Check if the current environment provides build dependencies + should_check_deps = self.req.use_pep517 and check_build_deps + if should_check_deps: + pyproject_requires = self.req.pyproject_requires + assert pyproject_requires is not None + conflicting, missing = self.req.build_env.check_requirements( + pyproject_requires + ) + if conflicting: + self._raise_conflicts("the backend dependencies", conflicting) + if missing: + self._raise_missing_reqs(missing) self.req.prepare_metadata() def _prepare_build_backend(self, finder: PackageFinder) -> None: @@ -56,7 +68,7 @@ class SourceDistribution(AbstractDistribution): self.req.build_env = BuildEnvironment() self.req.build_env.install_requirements( - finder, pyproject_requires, "overlay", "Installing build dependencies" + finder, pyproject_requires, "overlay", kind="build dependencies" ) conflicting, missing = self.req.build_env.check_requirements( self.req.requirements_to_check @@ -108,7 +120,7 @@ class SourceDistribution(AbstractDistribution): if conflicting: self._raise_conflicts("the backend dependencies", conflicting) self.req.build_env.install_requirements( - finder, missing, "normal", "Installing backend dependencies" + finder, missing, "normal", kind="backend dependencies" ) def _raise_conflicts( @@ -127,3 +139,12 @@ class SourceDistribution(AbstractDistribution): ), ) raise InstallationError(error_message) + + def _raise_missing_reqs(self, missing: Set[str]) -> None: + format_string = ( + "Some build dependencies for {requirement} are missing: {missing}." + ) + error_message = format_string.format( + requirement=self.req, missing=", ".join(map(repr, sorted(missing))) + ) + raise InstallationError(error_message) diff --git a/src/pip/_internal/distributions/wheel.py b/src/pip/_internal/distributions/wheel.py index 340b0f3c5..03aac775b 100644 --- a/src/pip/_internal/distributions/wheel.py +++ b/src/pip/_internal/distributions/wheel.py @@ -26,6 +26,9 @@ class WheelDistribution(AbstractDistribution): return get_wheel_distribution(wheel, canonicalize_name(self.req.name)) def prepare_distribution_metadata( - self, finder: PackageFinder, build_isolation: bool + self, + finder: PackageFinder, + build_isolation: bool, + check_build_deps: bool, ) -> None: pass |