27c69f0d1eaf3e223d599e91f969d52a821426fe
[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_editable_metadata(
18     build_env: BuildEnvironment, backend: BuildBackendHookCaller, details: str
19 ) -> str:
20     """Generate metadata using mechanisms described in PEP 660.
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/editable, so we don't have to
31         # consider the possibility that this hook doesn't exist.
32         runner = runner_with_spinner_message(
33             "Preparing editable metadata (pyproject.toml)"
34         )
35         with backend.subprocess_runner(runner):
36             try:
37                 distinfo_dir = backend.prepare_metadata_for_build_editable(metadata_dir)
38             except InstallationSubprocessError as error:
39                 raise MetadataGenerationFailed(package_details=details) from error
40
41     return os.path.join(metadata_dir, distinfo_dir)