This commit is contained in:
lz_db
2026-10-16 22:48:30 +08:00
parent 190de72571
commit 0b36fd3383
3161 changed files with 12787 additions and 77274 deletions
@@ -1,20 +1,37 @@
from __future__ import annotations
from typing import Protocol
from ..dist import Distribution
import sys
import warnings
from typing import TYPE_CHECKING, List, Dict
from distutils.command.build import build as _build
from setuptools import SetuptoolsDeprecationWarning
if sys.version_info >= (3, 8):
from typing import Protocol
elif TYPE_CHECKING:
from typing_extensions import Protocol
else:
from abc import ABC as Protocol
_ORIGINAL_SUBCOMMANDS = {"build_py", "build_clib", "build_ext", "build_scripts"}
class build(_build):
distribution: Distribution # override distutils.dist.Distribution with setuptools.dist.Distribution
# copy to avoid sharing the object with parent class
sub_commands = _build.sub_commands[:]
def get_sub_commands(self):
subcommands = {cmd[0] for cmd in _build.sub_commands}
if subcommands - _ORIGINAL_SUBCOMMANDS:
msg = """
It seems that you are using `distutils.command.build` to add
new subcommands. Using `distutils` directly is considered deprecated,
please use `setuptools.command.build`.
"""
warnings.warn(msg, SetuptoolsDeprecationWarning)
self.sub_commands = _build.sub_commands
return super().get_sub_commands()
class SubCommand(Protocol):
"""In order to support editable installations (see :pep:`660`) all
@@ -31,8 +48,8 @@ class SubCommand(Protocol):
Subcommands **SHOULD** take advantage of ``editable_mode=True`` to adequate
its behaviour or perform optimisations.
For example, if a subcommand doesn't need to generate an extra file and
all it does is to copy a source file into the build directory,
For example, if a subcommand don't need to generate any extra file and
everything it does is to copy a source file into the build directory,
``run()`` **SHOULD** simply "early return".
Similarly, if the subcommand creates files that would be placed alongside
@@ -85,19 +102,16 @@ class SubCommand(Protocol):
...
"""
def initialize_options(self) -> None:
def initialize_options(self):
"""(Required by the original :class:`setuptools.Command` interface)"""
...
def finalize_options(self) -> None:
def finalize_options(self):
"""(Required by the original :class:`setuptools.Command` interface)"""
...
def run(self) -> None:
def run(self):
"""(Required by the original :class:`setuptools.Command` interface)"""
...
def get_source_files(self) -> list[str]:
def get_source_files(self) -> List[str]:
"""
Return a list of all files that are used by the command to create the expected
outputs.
@@ -107,9 +121,8 @@ class SubCommand(Protocol):
with all the files necessary to build the distribution.
All files should be strings relative to the project root directory.
"""
...
def get_outputs(self) -> list[str]:
def get_outputs(self) -> List[str]:
"""
Return a list of files intended for distribution as they would have been
produced by the build.
@@ -121,9 +134,8 @@ class SubCommand(Protocol):
in ``get_output_mapping()`` plus files that are generated during the build
and don't correspond to any source file already present in the project.
"""
...
def get_output_mapping(self) -> dict[str, str]:
def get_output_mapping(self) -> Dict[str, str]:
"""
Return a mapping between destination files as they would be produced by the
build (dict keys) into the respective existing (source) files (dict values).
@@ -132,4 +144,3 @@ class SubCommand(Protocol):
Destination files should be strings in the form of
``"{build_lib}/destination/file/path"``.
"""
...