Improve path-related type hints for setuptools.Extension() and distutils.CCompiler() (#12958)

Co-authored-by: Avasam <samuel.06@hotmail.com>
This commit is contained in:
Agriya Khetarpal
2024-11-07 06:51:48 +08:00
committed by GitHub
parent 1ae7e615c0
commit 3d853d5fa8
6 changed files with 56 additions and 7 deletions

View File

@@ -1,5 +1,5 @@
from _typeshed import BytesPath, StrPath, Unused
from collections.abc import Callable, Iterable
from collections.abc import Callable, Iterable, Sequence
from distutils.file_util import _BytesPathT, _StrPathT
from typing import Literal, overload
from typing_extensions import TypeAlias, TypeVarTuple, Unpack
@@ -63,7 +63,7 @@ class CCompiler:
def set_executables(self, **args: str) -> None: ...
def compile(
self,
sources: list[str],
sources: Sequence[StrPath],
output_dir: str | None = None,
macros: list[_Macro] | None = None,
include_dirs: list[str] | None = None,

View File

@@ -1,3 +1,31 @@
from __future__ import annotations
import distutils.command.sdist
from _typeshed import StrPath
from os import PathLike
from pathlib import Path
from setuptools._distutils.ccompiler import CCompiler
c = distutils.command.sdist.sdist
# Test CCompiler().compile with varied sources
compiler = CCompiler()
str_list: list[str] = ["file1.c", "file2.c"]
compiler.compile(sources=str_list)
path_list: list[Path] = [Path("file1.c"), Path("file2.c")]
compiler.compile(sources=path_list)
pathlike_list: list[PathLike[str]] = [Path("file1.c"), Path("file2.c")]
compiler.compile(sources=pathlike_list)
strpath_list: list[StrPath] = [Path("file1.c"), "file2.c"]
compiler.compile(sources=strpath_list)
# Direct literals should also work
compiler.compile(sources=["file1.c", "file2.c"])
compiler.compile(sources=[Path("file1.c"), Path("file2.c")])
compiler.compile(sources=[Path("file1.c"), "file2.c"])

View File

@@ -0,0 +1,15 @@
from __future__ import annotations
from os import PathLike
from pathlib import Path
from setuptools import Extension
# Dummy extensions
ext1 = Extension(name="test1", sources=["file1.c", "file2.c"]) # plain list[str] works
path_sources: list[Path] = [Path("file1.c"), Path("file2.c")]
ext2 = Extension(name="test2", sources=path_sources) # list of Path(s)
mixed_sources: list[str | PathLike[str]] = [Path("file1.c"), "file2.c"] # or list[StrPath]
ext3 = Extension(name="test3", sources=mixed_sources) # mixed types

View File

@@ -1,5 +1,5 @@
from _typeshed import BytesPath, StrPath, Unused
from collections.abc import Callable, Iterable
from collections.abc import Callable, Iterable, Sequence
from typing import ClassVar, Literal, TypeVar, overload
from typing_extensions import TypeAlias, TypeVarTuple, Unpack
@@ -67,7 +67,7 @@ class CCompiler:
def set_executables(self, **args: str) -> None: ...
def compile(
self,
sources: list[str],
sources: Sequence[StrPath],
output_dir: str | None = None,
macros: list[_Macro] | None = None,
include_dirs: list[str] | None = None,

View File

@@ -1,6 +1,10 @@
from _typeshed import StrPath
from os import PathLike
from pathlib import Path
class Extension:
name: str
sources: list[str]
sources: list[str] | list[StrPath]
include_dirs: list[str]
define_macros: list[tuple[str, str | None]]
undef_macros: list[str]
@@ -18,7 +22,7 @@ class Extension:
def __init__(
self,
name: str,
sources: list[str],
sources: list[str] | list[PathLike[str]] | list[Path] | list[StrPath],
include_dirs: list[str] | None = None,
define_macros: list[tuple[str, str | None]] | None = None,
undef_macros: list[str] | None = None,

View File

@@ -1,4 +1,6 @@
from _typeshed import StrPath
from os import PathLike
from pathlib import Path
from ._distutils.extension import Extension as _Extension
@@ -9,7 +11,7 @@ class Extension(_Extension):
def __init__(
self,
name: str,
sources: list[StrPath],
sources: list[str] | list[PathLike[str]] | list[Path] | list[StrPath],
include_dirs: list[str] | None = None,
define_macros: list[tuple[str, str | None]] | None = None,
undef_macros: list[str] | None = None,