mirror of https://github.com/pypa/pip
Use pep517.Pep517HookCaller.subprocess_runner
Also, create a new utility function for showing a spinner when running a subprocess. Why: The subprocess_runner API was specifically added to make it possible for pip to stop monkey-patching Pep517HookCaller, while still maintaining its output style. The relevant monkeypatch will be removed in a follow up commit.
This commit is contained in:
parent
27fdffbab6
commit
46bd454e3e
|
@ -6,6 +6,7 @@ import logging
|
|||
from pip._internal.build_env import BuildEnvironment
|
||||
from pip._internal.distributions.base import AbstractDistribution
|
||||
from pip._internal.exceptions import InstallationError
|
||||
from pip._internal.utils.subprocess import run_with_spinner_message
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
@ -81,9 +82,13 @@ class SourceDistribution(AbstractDistribution):
|
|||
# This must be done in a second pass, as the pyproject.toml
|
||||
# dependencies must be installed before we can call the backend.
|
||||
with self.req.build_env:
|
||||
# We need to have the env active when calling the hook.
|
||||
self.req.spin_message = "Getting requirements to build wheel"
|
||||
reqs = self.req.pep517_backend.get_requires_for_build_wheel()
|
||||
runner = run_with_spinner_message(
|
||||
"Getting requirements to build wheel"
|
||||
)
|
||||
backend = self.req.pep517_backend
|
||||
with backend.subprocess_runner(runner):
|
||||
reqs = backend.get_requires_for_build_wheel()
|
||||
|
||||
conflicting, missing = self.req.build_env.check_requirements(reqs)
|
||||
if conflicting:
|
||||
_raise_conflicts("the backend dependencies", conflicting)
|
||||
|
|
|
@ -49,7 +49,10 @@ from pip._internal.utils.misc import (
|
|||
)
|
||||
from pip._internal.utils.packaging import get_metadata
|
||||
from pip._internal.utils.setuptools_build import make_setuptools_shim_args
|
||||
from pip._internal.utils.subprocess import call_subprocess
|
||||
from pip._internal.utils.subprocess import (
|
||||
call_subprocess,
|
||||
run_with_spinner_message,
|
||||
)
|
||||
from pip._internal.utils.temp_dir import TempDirectory
|
||||
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||
from pip._internal.utils.ui import open_spinner
|
||||
|
@ -58,7 +61,7 @@ from pip._internal.vcs import vcs
|
|||
|
||||
if MYPY_CHECK_RUNNING:
|
||||
from typing import (
|
||||
Any, Dict, Iterable, List, Mapping, Optional, Sequence, Union,
|
||||
Any, Dict, Iterable, List, Optional, Sequence, Union,
|
||||
)
|
||||
from pip._internal.build_env import BuildEnvironment
|
||||
from pip._internal.cache import WheelCache
|
||||
|
@ -622,11 +625,12 @@ class InstallRequirement(object):
|
|||
# Note that Pep517HookCaller implements a fallback for
|
||||
# prepare_metadata_for_build_wheel, so we don't have to
|
||||
# consider the possibility that this hook doesn't exist.
|
||||
runner = run_with_spinner_message("Preparing wheel metadata")
|
||||
backend = self.pep517_backend
|
||||
self.spin_message = "Preparing wheel metadata"
|
||||
distinfo_dir = backend.prepare_metadata_for_build_wheel(
|
||||
metadata_dir
|
||||
)
|
||||
with backend.subprocess_runner(runner):
|
||||
distinfo_dir = backend.prepare_metadata_for_build_wheel(
|
||||
metadata_dir
|
||||
)
|
||||
|
||||
return os.path.join(metadata_dir, distinfo_dir)
|
||||
|
||||
|
|
|
@ -14,9 +14,12 @@ from pip._internal.utils.compat import console_to_str, str_to_display
|
|||
from pip._internal.utils.logging import subprocess_logger
|
||||
from pip._internal.utils.misc import HiddenText, path_to_display
|
||||
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||
from pip._internal.utils.ui import open_spinner
|
||||
|
||||
if MYPY_CHECK_RUNNING:
|
||||
from typing import Any, Iterable, List, Mapping, Optional, Text, Union
|
||||
from typing import (
|
||||
Any, Callable, Iterable, List, Mapping, Optional, Text, Union,
|
||||
)
|
||||
from pip._internal.utils.ui import SpinnerInterface
|
||||
|
||||
CommandArgs = List[Union[str, HiddenText]]
|
||||
|
@ -245,3 +248,28 @@ def call_subprocess(
|
|||
raise ValueError('Invalid value: on_returncode=%s' %
|
||||
repr(on_returncode))
|
||||
return ''.join(all_output)
|
||||
|
||||
|
||||
def run_with_spinner_message(message):
|
||||
# type: (str) -> Callable
|
||||
"""Provide a subprocess_runner that shows a spinner message.
|
||||
|
||||
Intended for use with for pep517's Pep517HookCaller. Thus, the runner has
|
||||
an API that matches what's expected by Pep517HookCaller.subprocess_runner.
|
||||
"""
|
||||
|
||||
def runner(
|
||||
cmd, # type: List[str]
|
||||
cwd=None, # type: Optional[str]
|
||||
extra_environ=None # type: Optional[Mapping[str, Any]]
|
||||
):
|
||||
# type: (...) -> None
|
||||
with open_spinner(message) as spinner:
|
||||
call_subprocess(
|
||||
cmd,
|
||||
cwd=cwd,
|
||||
extra_environ=extra_environ,
|
||||
spinner=spinner,
|
||||
)
|
||||
|
||||
return runner
|
||||
|
|
|
@ -44,6 +44,7 @@ from pip._internal.utils.subprocess import (
|
|||
LOG_DIVIDER,
|
||||
call_subprocess,
|
||||
format_command_args,
|
||||
run_with_spinner_message,
|
||||
)
|
||||
from pip._internal.utils.temp_dir import TempDirectory
|
||||
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
||||
|
@ -979,12 +980,17 @@ class WheelBuilder(object):
|
|||
'--build-options is present' % (req.name,))
|
||||
return None
|
||||
try:
|
||||
req.spin_message = 'Building wheel for %s (PEP 517)' % (req.name,)
|
||||
logger.debug('Destination directory: %s', tempd)
|
||||
wheel_name = req.pep517_backend.build_wheel(
|
||||
tempd,
|
||||
metadata_directory=req.metadata_directory
|
||||
|
||||
runner = run_with_spinner_message(
|
||||
'Building wheel for {} (PEP 517)'.format(req.name)
|
||||
)
|
||||
backend = req.pep517_backend
|
||||
with backend.subprocess_runner(runner):
|
||||
wheel_name = backend.build_wheel(
|
||||
tempd,
|
||||
metadata_directory=req.metadata_directory,
|
||||
)
|
||||
if python_tag:
|
||||
# General PEP 517 backends don't necessarily support
|
||||
# a "--python-tag" option, so we rename the wheel
|
||||
|
|
Loading…
Reference in New Issue