1 """Metadata generation logic for source distributions.
6 from pip
._vendor
.pyproject_hooks
import BuildBackendHookCaller
8 from pip
._internal
.build_env
import BuildEnvironment
9 from pip
._internal
.exceptions
import (
10 InstallationSubprocessError
,
11 MetadataGenerationFailed
,
13 from pip
._internal
.utils
.subprocess
import runner_with_spinner_message
14 from pip
._internal
.utils
.temp_dir
import TempDirectory
17 def generate_editable_metadata(
18 build_env
: BuildEnvironment
, backend
: BuildBackendHookCaller
, details
: str
20 """Generate metadata using mechanisms described in PEP 660.
22 Returns the generated metadata directory.
24 metadata_tmpdir
= TempDirectory(kind
="modern-metadata", globally_managed
=True)
26 metadata_dir
= metadata_tmpdir
.path
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)"
35 with backend
.subprocess_runner(runner
):
37 distinfo_dir
= backend
.prepare_metadata_for_build_editable(metadata_dir
)
38 except InstallationSubprocessError
as error
:
39 raise MetadataGenerationFailed(package_details
=details
) from error
41 return os
.path
.join(metadata_dir
, distinfo_dir
)