c66ac354deb035405fe0e4040dac539d28570257
[SubU] /
1 """Metadata generation logic for source distributions.
2 """
3
4 import os
5
6 from pip._vendor.pyproject_hooks import BuildBackendHookCaller
7
8 from pip._internal.build_env import BuildEnvironment
9 from pip._internal.exceptions import (
10     InstallationSubprocessError,
11     MetadataGenerationFailed,
12 )
13 from pip._internal.utils.subprocess import runner_with_spinner_message
14 from pip._internal.utils.temp_dir import TempDirectory
15
16
17 def generate_metadata(
18     build_env: BuildEnvironment, backend: BuildBackendHookCaller, details: str
19 ) -> str:
20     """Generate metadata using mechanisms described in PEP 517.
21
22     Returns the generated metadata directory.
23     """
24     metadata_tmpdir = TempDirectory(kind="modern-metadata", globally_managed=True)
25
26     metadata_dir = metadata_tmpdir.path
27
28     with build_env:
29         # Note that BuildBackendHookCaller implements a fallback for
30         # prepare_metadata_for_build_wheel, so we don't have to
31         # consider the possibility that this hook doesn't exist.
32         runner = runner_with_spinner_message("Preparing metadata (pyproject.toml)")
33         with backend.subprocess_runner(runner):
34             try:
35                 distinfo_dir = backend.prepare_metadata_for_build_wheel(metadata_dir)
36             except InstallationSubprocessError as error:
37                 raise MetadataGenerationFailed(package_details=details) from error
38
39     return os.path.join(metadata_dir, distinfo_dir)