Skip to content

Commit b5c9d8d

Browse files
authored
Don't ignore missing stubs in setuptools (#10058)
1 parent 274f449 commit b5c9d8d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+765
-97
lines changed
Lines changed: 26 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,16 @@
1-
pkg_resources.Distribution.__cmp__
2-
pkg_resources.Distribution.activate
3-
pkg_resources.Distribution.get_entry_map
4-
pkg_resources.EggMetadata.__init__
5-
pkg_resources.Environment.best_match
6-
pkg_resources.Environment.obtain
7-
pkg_resources.FileMetadata.__init__
1+
# These are used like protocols, but forgot to specify "self" as the first method param
2+
pkg_resources.IResourceProvider.get_resource_filename
3+
pkg_resources.IResourceProvider.get_resource_stream
4+
pkg_resources.IResourceProvider.get_resource_string
5+
pkg_resources.IResourceProvider.has_resource
6+
pkg_resources.IResourceProvider.resource_isdir
7+
pkg_resources.IResourceProvider.resource_listdir
88
pkg_resources.IMetadataProvider.get_metadata
99
pkg_resources.IMetadataProvider.get_metadata_lines
1010
pkg_resources.IMetadataProvider.has_metadata
1111
pkg_resources.IMetadataProvider.metadata_isdir
1212
pkg_resources.IMetadataProvider.metadata_listdir
1313
pkg_resources.IMetadataProvider.run_script
14-
pkg_resources.IResourceManager
15-
pkg_resources.Requirement.__init__
16-
pkg_resources.WorkingSet.find_plugins
17-
pkg_resources.WorkingSet.resolve
18-
pkg_resources.WorkingSet.subscribe
19-
pkg_resources.declare_namespace
20-
pkg_resources.fixup_namespace_packages
21-
pkg_resources.get_entry_map
22-
pkg_resources.get_provider
23-
pkg_resources.split_sections
24-
pkg_resources.to_filename
2514

2615
# Is always set in __init__
2716
pkg_resources.PathMetadata.egg_info
@@ -53,16 +42,24 @@ setuptools._distutils.dist.Distribution.get_requires
5342
setuptools._distutils.dist.Distribution.get_provides
5443
setuptools._distutils.dist.Distribution.get_obsoletes
5544

56-
# Uncomment once ignore_missing_stub is turned off
57-
# # Not supported by typeshed
58-
# setuptools.py34compat
45+
# Not supported by typeshed
46+
setuptools.py34compat
47+
setuptools.command.py36compat
5948

60-
# # Private modules
61-
# setuptools.config._validate_pyproject.*
62-
# setuptools.build_meta._BuildMetaBackend.*
49+
# Private modules
50+
setuptools.config._validate_pyproject.*
51+
setuptools.command.build_py.build_py.existing_egg_info_dir
6352

64-
# # Vendored and modified version of stdlib's distutils. Basically implementation details
65-
# setuptools._distutils.*
66-
# # Other vendored code
67-
# setuptools._vendor.*
68-
# pkg_resources._vendor.*
53+
# Loop variable leak
54+
setuptools.sandbox.AbstractSandbox.name
55+
56+
# Vendored and modified version of stdlib's distutils. Basically implementation details
57+
setuptools._distutils.*
58+
# Other vendored code
59+
setuptools._vendor.*
60+
pkg_resources._vendor.*
61+
# Deprecated in favor of importlib.resources, importlib.metadata and their backports
62+
# So like distutils, we only add what we need to reference.
63+
pkg_resources.AvailableDistributions
64+
pkg_resources.ResourceManager
65+
pkg_resources.extern
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Mock
2+
setuptools.msvc.winreg
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Mock
2+
setuptools.msvc.winreg
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
from __future__ import annotations
2+
3+
from typing import Any
4+
5+
from pkg_resources import (
6+
DefaultProvider,
7+
EggMetadata,
8+
EggProvider,
9+
EmptyProvider,
10+
FileMetadata,
11+
IMetadataProvider,
12+
IResourceProvider,
13+
NullProvider,
14+
PathMetadata,
15+
ZipProvider,
16+
)
17+
from setuptools.command.editable_wheel import EditableStrategy, _LinkTree, _StaticPth, _TopLevelFinder
18+
from setuptools.config.expand import EnsurePackagesDiscovered
19+
from setuptools.config.pyprojecttoml import _EnsurePackagesDiscovered
20+
21+
# We don't care about the __init__ methods, only about if an instance respects the Protocol
22+
_: Any = object()
23+
24+
# Test IMetadataProvider Protocol implementers
25+
metadata_provider: IMetadataProvider
26+
metadata_provider = NullProvider(_)
27+
metadata_provider = EggProvider(_)
28+
metadata_provider = EmptyProvider()
29+
metadata_provider = DefaultProvider(_)
30+
metadata_provider = ZipProvider(_)
31+
metadata_provider = FileMetadata(_)
32+
metadata_provider = PathMetadata(_, _)
33+
metadata_provider = EggMetadata(_)
34+
35+
# Test IResourceProvider Protocol implementers
36+
resource_provider: IResourceProvider
37+
resource_provider = NullProvider(_)
38+
resource_provider = EggProvider(_)
39+
resource_provider = EmptyProvider()
40+
resource_provider = DefaultProvider(_)
41+
resource_provider = ZipProvider(_)
42+
resource_provider = FileMetadata(_)
43+
resource_provider = PathMetadata(_, _)
44+
resource_provider = EggMetadata(_)
45+
46+
47+
# Test EditableStrategy Protocol implementers
48+
editable_strategy: EditableStrategy
49+
editable_strategy = _StaticPth(_, _, _)
50+
editable_strategy = _LinkTree(_, _, _, _)
51+
editable_strategy = _TopLevelFinder(_, _)
52+
# Not EditableStrategy due to incompatible __call__ method
53+
editable_strategy = EnsurePackagesDiscovered(_) # type: ignore
54+
editable_strategy = _EnsurePackagesDiscovered(_, _, _) # type: ignore

stubs/setuptools/METADATA.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ version = "67.7.*"
22
partial_stub = true
33

44
[tool.stubtest]
5-
ignore_missing_stub = true
5+
# darwin is equivalent to linux for OS-specific methods
6+
platforms = ["linux", "win32"]

stubs/setuptools/pkg_resources/__init__.pyi

Lines changed: 67 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ from abc import ABCMeta
66
from collections.abc import Callable, Generator, Iterable, Sequence
77
from io import BytesIO
88
from re import Pattern
9-
from typing import IO, Any, ClassVar, TypeVar, overload
9+
from typing import IO, Any, ClassVar, Protocol, TypeVar, overload, type_check_only
1010
from typing_extensions import Literal, Self, TypeAlias
1111

1212
_Version: TypeAlias = Incomplete # from packaging.version
@@ -21,8 +21,8 @@ _PkgReqType: TypeAlias = str | Requirement
2121
_DistFinderType: TypeAlias = Callable[[_Importer, str, bool], Generator[Distribution, None, None]]
2222
_NSHandlerType: TypeAlias = Callable[[_Importer, str, str, types.ModuleType], str]
2323

24-
def declare_namespace(name: str) -> None: ...
25-
def fixup_namespace_packages(path_item: str) -> None: ...
24+
def declare_namespace(packageName: str) -> None: ...
25+
def fixup_namespace_packages(path_item: str, parent=None) -> None: ...
2626

2727
class WorkingSet:
2828
entries: list[str]
@@ -35,18 +35,24 @@ class WorkingSet:
3535
def __iter__(self) -> Generator[Distribution, None, None]: ...
3636
def find(self, req: Requirement) -> Distribution | None: ...
3737
def resolve(
38-
self, requirements: Iterable[Requirement], env: Environment | None = None, installer: _InstallerType | None = None
38+
self,
39+
requirements: Iterable[Requirement],
40+
env: Environment | None = None,
41+
installer: _InstallerType | None = None,
42+
replace_conflicting: bool = False,
43+
extras=None,
3944
) -> list[Distribution]: ...
4045
def add(self, dist: Distribution, entry: str | None = None, insert: bool = True, replace: bool = False) -> None: ...
41-
def subscribe(self, callback: Callable[[Distribution], object]) -> None: ...
46+
def subscribe(self, callback: Callable[[Distribution], object], existing: bool = True) -> None: ...
4247
def find_plugins(
43-
self, plugin_env: Environment, full_env: Environment | None = None, fallback: bool = True
48+
self, plugin_env: Environment, full_env: Environment | None = None, installer=None, fallback: bool = True
4449
) -> tuple[list[Distribution], dict[Distribution, Exception]]: ...
4550

4651
working_set: WorkingSet
4752

4853
require = working_set.require
4954
run_script = working_set.run_script
55+
run_main = run_script
5056
iter_entry_points = working_set.iter_entry_points
5157
add_activation_listener = working_set.subscribe
5258

@@ -62,13 +68,15 @@ class Environment:
6268
def __add__(self, other: Distribution | Environment) -> Environment: ...
6369
def __iadd__(self, other: Distribution | Environment) -> Self: ...
6470
@overload
65-
def best_match(self, req: Requirement, working_set: WorkingSet, *, replace_conflicting: bool = False) -> Distribution: ...
71+
def best_match(
72+
self, req: Requirement, working_set: WorkingSet, installer: None = None, replace_conflicting: bool = False
73+
) -> Distribution: ...
6674
@overload
6775
def best_match(
6876
self, req: Requirement, working_set: WorkingSet, installer: Callable[[Requirement], _T], replace_conflicting: bool = False
6977
) -> _T: ...
7078
@overload
71-
def obtain(self, requirement: Requirement) -> None: ...
79+
def obtain(self, requirement: Requirement, installer: None = None) -> None: ...
7280
@overload
7381
def obtain(self, requirement: Requirement, installer: Callable[[Requirement], _T]) -> _T: ...
7482
def scan(self, search_path: Sequence[str] | None = None) -> None: ...
@@ -85,6 +93,7 @@ class Requirement:
8593
# TODO: change this to packaging.markers.Marker | None once we can import
8694
# packaging.markers
8795
marker: Incomplete | None
96+
def __init__(self, requirement_string: str) -> None: ...
8897
@staticmethod
8998
def parse(s: str | Iterable[str]) -> Requirement: ...
9099
def __contains__(self, item: Distribution | str | tuple[str, ...]) -> bool: ...
@@ -93,11 +102,12 @@ class Requirement:
93102
def load_entry_point(dist: _EPDistType, group: str, name: str) -> Any: ...
94103
def get_entry_info(dist: _EPDistType, group: str, name: str) -> EntryPoint | None: ...
95104
@overload
96-
def get_entry_map(dist: _EPDistType) -> dict[str, dict[str, EntryPoint]]: ...
105+
def get_entry_map(dist: _EPDistType, group: None = None) -> dict[str, dict[str, EntryPoint]]: ...
97106
@overload
98107
def get_entry_map(dist: _EPDistType, group: str) -> dict[str, EntryPoint]: ...
99108

100109
class EntryPoint:
110+
pattern: ClassVar[Pattern[str]]
101111
name: str
102112
module_name: str
103113
attrs: tuple[str, ...]
@@ -143,8 +153,8 @@ def resource_listdir(package_or_requirement: _PkgReqType, resource_name: str) ->
143153
def resource_filename(package_or_requirement: _PkgReqType, resource_name: str) -> str: ...
144154
def set_extraction_path(path: str) -> None: ...
145155
def cleanup_resources(force: bool = False) -> list[str]: ...
146-
147-
class IResourceManager:
156+
@type_check_only
157+
class _IResourceManager(Protocol):
148158
def resource_exists(self, package_or_requirement: _PkgReqType, resource_name: str) -> bool: ...
149159
def resource_stream(self, package_or_requirement: _PkgReqType, resource_name: str) -> IO[bytes]: ...
150160
def resource_string(self, package_or_requirement: _PkgReqType, resource_name: str) -> bytes: ...
@@ -158,11 +168,11 @@ class IResourceManager:
158168
def postprocess(self, tempname: str, filename: str) -> None: ...
159169

160170
@overload
161-
def get_provider(package_or_requirement: str) -> IResourceProvider: ...
171+
def get_provider(moduleOrReq: str) -> IResourceProvider: ...
162172
@overload
163-
def get_provider(package_or_requirement: Requirement) -> Distribution: ...
173+
def get_provider(moduleOrReq: Requirement) -> Distribution: ...
164174

165-
class IMetadataProvider:
175+
class IMetadataProvider(Protocol):
166176
def has_metadata(self, name: str) -> bool | None: ...
167177
def metadata_isdir(self, name: str) -> bool: ...
168178
def metadata_listdir(self, name: str) -> list[str]: ...
@@ -196,7 +206,7 @@ class ContextualVersionConflict(VersionConflict):
196206
class UnknownExtra(ResolutionError): ...
197207

198208
class ExtractionError(Exception):
199-
manager: IResourceManager
209+
manager: _IResourceManager
200210
cache_path: str
201211
original_error: Exception
202212

@@ -206,7 +216,16 @@ def register_finder(importer_type: type, distribution_finder: _DistFinderType) -
206216
def register_loader_type(loader_type: type, provider_factory: Callable[[types.ModuleType], IResourceProvider]) -> None: ...
207217
def register_namespace_handler(importer_type: type, namespace_handler: _NSHandlerType) -> None: ...
208218

209-
class IResourceProvider(IMetadataProvider): ...
219+
class IResourceProvider(IMetadataProvider, Protocol):
220+
def get_resource_filename(self, manager: _IResourceManager, resource_name): ...
221+
def get_resource_stream(self, manager: _IResourceManager, resource_name): ...
222+
def get_resource_string(self, manager: _IResourceManager, resource_name): ...
223+
def has_resource(self, resource_name): ...
224+
def resource_isdir(self, resource_name): ...
225+
def resource_listdir(self, resource_name): ...
226+
227+
def invalid_marker(text) -> SyntaxError | Literal[False]: ...
228+
def evaluate_marker(text, extra: Incomplete | None = None): ...
210229

211230
class NullProvider:
212231
egg_name: str | None
@@ -215,9 +234,9 @@ class NullProvider:
215234
module_path: str | None
216235

217236
def __init__(self, module) -> None: ...
218-
def get_resource_filename(self, manager, resource_name) -> str: ...
219-
def get_resource_stream(self, manager, resource_name) -> BytesIO: ...
220-
def get_resource_string(self, manager, resource_name): ...
237+
def get_resource_filename(self, manager: _IResourceManager, resource_name) -> str: ...
238+
def get_resource_stream(self, manager: _IResourceManager, resource_name) -> BytesIO: ...
239+
def get_resource_string(self, manager: _IResourceManager, resource_name): ...
221240
def has_resource(self, resource_name) -> bool: ...
222241
def has_metadata(self, name: str) -> bool | None: ...
223242
def get_metadata(self, name: str) -> str: ...
@@ -228,11 +247,21 @@ class NullProvider:
228247
def metadata_listdir(self, name: str) -> list[str]: ...
229248
def run_script(self, script_name: str, namespace: dict[str, Any]) -> None: ...
230249

231-
class Distribution(NullProvider, IResourceProvider, IMetadataProvider):
250+
# Doesn't actually extend NullProvider
251+
class Distribution(NullProvider):
232252
PKG_INFO: ClassVar[str]
233253
location: str
234254
project_name: str
235255
@property
256+
def hashcmp(self) -> tuple[Incomplete, int, str, Incomplete | None, str, str]: ...
257+
def __hash__(self) -> int: ...
258+
def __lt__(self, other: Distribution) -> bool: ...
259+
def __le__(self, other: Distribution) -> bool: ...
260+
def __gt__(self, other: Distribution) -> bool: ...
261+
def __ge__(self, other: Distribution) -> bool: ...
262+
def __eq__(self, other: object) -> bool: ...
263+
def __ne__(self, other: object) -> bool: ...
264+
@property
236265
def key(self) -> str: ...
237266
@property
238267
def extras(self) -> list[str]: ...
@@ -259,15 +288,17 @@ class Distribution(NullProvider, IResourceProvider, IMetadataProvider):
259288
) -> Distribution: ...
260289
@classmethod
261290
def from_filename(cls, filename: str, metadata: _MetadataType = None, **kw: str | None | int) -> Distribution: ...
262-
def activate(self, path: list[str] | None = None) -> None: ...
291+
def activate(self, path: list[str] | None = None, replace: bool = False) -> None: ...
263292
def as_requirement(self) -> Requirement: ...
264293
def requires(self, extras: tuple[str, ...] = ()) -> list[Requirement]: ...
294+
def check_version_conflict(self) -> None: ...
295+
def has_version(self) -> bool: ...
265296
def clone(self, **kw: str | int | None) -> Requirement: ...
266297
def egg_name(self) -> str: ... # type: ignore[override] # supertype's egg_name is a variable, not a method
267-
def __cmp__(self, other: Any) -> bool: ...
268298
def get_entry_info(self, group: str, name: str) -> EntryPoint | None: ...
299+
def insert_on(self, path, loc: Incomplete | None = None, replace: bool = False) -> None: ...
269300
@overload
270-
def get_entry_map(self) -> dict[str, dict[str, EntryPoint]]: ...
301+
def get_entry_map(self, group: None = None) -> dict[str, dict[str, EntryPoint]]: ...
271302
@overload
272303
def get_entry_map(self, group: str) -> dict[str, EntryPoint]: ...
273304
def load_entry_point(self, group: str, name: str) -> Any: ...
@@ -281,37 +312,41 @@ class EggProvider(NullProvider):
281312

282313
class DefaultProvider(EggProvider): ...
283314

284-
class PathMetadata(DefaultProvider, IResourceProvider):
315+
class PathMetadata(DefaultProvider):
285316
egg_info: str
286317
module_path: str
287318
def __init__(self, path: str, egg_info: str) -> None: ...
288319

289320
class ZipProvider(EggProvider):
290321
eagers: list[str] | None
291322
zip_pre: str
323+
@property
324+
def zipinfo(self): ...
292325

293-
class EggMetadata(ZipProvider, IResourceProvider):
326+
class EggMetadata(ZipProvider):
294327
loader: zipimport.zipimporter
295328
module_path: str
296-
def __init__(self, zipimporter: zipimport.zipimporter) -> None: ...
329+
def __init__(self, importer: zipimport.zipimporter) -> None: ...
297330

298331
class EmptyProvider(NullProvider):
299332
module_path: None
300333
def __init__(self) -> None: ...
301334

302335
empty_provider: EmptyProvider
303336

304-
class FileMetadata(EmptyProvider, IResourceProvider):
305-
def __init__(self, path_to_pkg_info: str) -> None: ...
337+
class FileMetadata(EmptyProvider):
338+
def __init__(self, path: str) -> None: ...
339+
340+
class PEP440Warning(RuntimeWarning): ...
306341

307342
parse_version = _Version
308343

309344
def yield_lines(iterable: _NestedStr) -> Generator[str, None, None]: ...
310-
def split_sections(strs: _NestedStr) -> Generator[tuple[str | None, list[str]], None, None]: ...
345+
def split_sections(s: _NestedStr) -> Generator[tuple[str | None, list[str]], None, None]: ...
311346
def safe_name(name: str) -> str: ...
312347
def safe_version(version: str) -> str: ...
313348
def safe_extra(extra: str) -> str: ...
314-
def to_filename(name_or_version: str) -> str: ...
349+
def to_filename(name: str) -> str: ...
315350
def get_build_platform() -> str: ...
316351
def get_platform() -> str: ...
317352
def get_supported_platform() -> str: ...
@@ -320,3 +355,5 @@ def get_default_cache() -> str: ...
320355
def get_importer(path_item: str) -> _Importer: ...
321356
def ensure_directory(path: str) -> None: ...
322357
def normalize_path(filename: str) -> str: ...
358+
359+
class PkgResourcesDeprecationWarning(Warning): ...

0 commit comments

Comments
 (0)