From 3d853d5fa80ca58afe703b1603f4a913900fb02e Mon Sep 17 00:00:00 2001 From: Agriya Khetarpal <74401230+agriyakhetarpal@users.noreply.github.com> Date: Thu, 7 Nov 2024 06:51:48 +0800 Subject: [PATCH] Improve path-related type hints for `setuptools.Extension()` and `distutils.CCompiler()` (#12958) Co-authored-by: Avasam --- stdlib/distutils/ccompiler.pyi | 4 +-- .../@tests/test_cases/check_distutils.py | 28 +++++++++++++++++++ .../@tests/test_cases/check_extension.py | 15 ++++++++++ .../setuptools/_distutils/ccompiler.pyi | 4 +-- .../setuptools/_distutils/extension.pyi | 8 ++++-- stubs/setuptools/setuptools/extension.pyi | 4 ++- 6 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 stubs/setuptools/@tests/test_cases/check_extension.py diff --git a/stdlib/distutils/ccompiler.pyi b/stdlib/distutils/ccompiler.pyi index e0f33f430..56617d8a7 100644 --- a/stdlib/distutils/ccompiler.pyi +++ b/stdlib/distutils/ccompiler.pyi @@ -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, diff --git a/stubs/setuptools/@tests/test_cases/check_distutils.py b/stubs/setuptools/@tests/test_cases/check_distutils.py index 78777f588..cbd3e645c 100644 --- a/stubs/setuptools/@tests/test_cases/check_distutils.py +++ b/stubs/setuptools/@tests/test_cases/check_distutils.py @@ -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"]) diff --git a/stubs/setuptools/@tests/test_cases/check_extension.py b/stubs/setuptools/@tests/test_cases/check_extension.py new file mode 100644 index 000000000..c798d4eb9 --- /dev/null +++ b/stubs/setuptools/@tests/test_cases/check_extension.py @@ -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 diff --git a/stubs/setuptools/setuptools/_distutils/ccompiler.pyi b/stubs/setuptools/setuptools/_distutils/ccompiler.pyi index 2f6521aaf..b0de29033 100644 --- a/stubs/setuptools/setuptools/_distutils/ccompiler.pyi +++ b/stubs/setuptools/setuptools/_distutils/ccompiler.pyi @@ -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, diff --git a/stubs/setuptools/setuptools/_distutils/extension.pyi b/stubs/setuptools/setuptools/_distutils/extension.pyi index 789bbf6ec..970c70a64 100644 --- a/stubs/setuptools/setuptools/_distutils/extension.pyi +++ b/stubs/setuptools/setuptools/_distutils/extension.pyi @@ -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, diff --git a/stubs/setuptools/setuptools/extension.pyi b/stubs/setuptools/setuptools/extension.pyi index ff352d3dc..300a51b6a 100644 --- a/stubs/setuptools/setuptools/extension.pyi +++ b/stubs/setuptools/setuptools/extension.pyi @@ -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,