Skip to content

Update pkg_resources-stubs for use in pytype_test #9747

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Mar 6, 2023
7 changes: 4 additions & 3 deletions stubs/setuptools/@tests/stubtest_allowlist.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ pkg_resources.Distribution.__cmp__
pkg_resources.Distribution.activate
pkg_resources.Distribution.get_entry_map
pkg_resources.EggMetadata.__init__
pkg_resources.EggProvider.__init__
pkg_resources.Environment.best_match
pkg_resources.Environment.obtain
pkg_resources.FileMetadata.__init__
Expand All @@ -13,19 +12,21 @@ pkg_resources.IMetadataProvider.metadata_isdir
pkg_resources.IMetadataProvider.metadata_listdir
pkg_resources.IMetadataProvider.run_script
pkg_resources.IResourceManager
pkg_resources.NullProvider.__init__
pkg_resources.Requirement.__init__
pkg_resources.WorkingSet.find_plugins
pkg_resources.WorkingSet.resolve
pkg_resources.WorkingSet.subscribe
pkg_resources.ZipProvider.__init__
pkg_resources.declare_namespace
pkg_resources.fixup_namespace_packages
pkg_resources.get_entry_map
pkg_resources.get_provider
pkg_resources.split_sections
pkg_resources.to_filename

# Is always set in __init__
pkg_resources.PathMetadata.egg_info
pkg_resources.EggMetadata.loader

# Uncomment once ignore_missing_stub is turned off
# # Not supported by typeshed
# setuptools.py34compat
Expand Down
62 changes: 51 additions & 11 deletions stubs/setuptools/pkg_resources/__init__.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@ import zipimport
from _typeshed import Incomplete
from abc import ABCMeta
from collections.abc import Callable, Generator, Iterable, Sequence
from typing import IO, Any, TypeVar, overload
from typing_extensions import Self, TypeAlias
from io import BytesIO
from re import Pattern
from typing import IO, Any, ClassVar, TypeVar, overload
from typing_extensions import Literal, Self, TypeAlias

_Version: TypeAlias = Incomplete # from packaging.version

_T = TypeVar("_T")
_D = TypeVar("_D", bound=Distribution)
_NestedStr: TypeAlias = str | Iterable[str | Iterable[Any]]
_InstallerType: TypeAlias = Callable[[Requirement], Distribution | None]
_EPDistType: TypeAlias = Distribution | Requirement | str
Expand Down Expand Up @@ -68,6 +71,10 @@ class Environment:
def obtain(self, requirement: Requirement, installer: Callable[[Requirement], _T]) -> _T: ...
def scan(self, search_path: Sequence[str] | None = ...) -> None: ...

class DistInfoDistribution(Distribution):
PKG_INFO: ClassVar[Literal["METADATA"]]
EQEQ: ClassVar[Pattern[str]]

def parse_requirements(strs: str | Iterable[str]) -> Generator[Requirement, None, None]: ...

class Requirement:
Expand Down Expand Up @@ -119,10 +126,13 @@ class EntryPoint:
def resolve(self) -> Any: ...

def find_distributions(path_item: str, only: bool = ...) -> Generator[Distribution, None, None]: ...
def get_distribution(dist: Requirement | str | Distribution) -> Distribution: ...
@overload
def get_distribution(dist: _D) -> _D: ...
@overload
def get_distribution(dist: _PkgReqType) -> Distribution: ...

class Distribution(IResourceProvider, IMetadataProvider):
PKG_INFO: str
class Distribution(NullProvider, IResourceProvider, IMetadataProvider):
PKG_INFO: ClassVar[str]
location: str
project_name: str
@property
Expand Down Expand Up @@ -156,7 +166,7 @@ class Distribution(IResourceProvider, IMetadataProvider):
def as_requirement(self) -> Requirement: ...
def requires(self, extras: tuple[str, ...] = ...) -> list[Requirement]: ...
def clone(self, **kw: str | int | None) -> Requirement: ...
def egg_name(self) -> str: ...
def egg_name(self) -> str: ... # type: ignore[override] # supertype's egg_name is a variable, not a method
def __cmp__(self, other: Any) -> bool: ...
def get_entry_info(self, group: str, name: str) -> EntryPoint | None: ...
@overload
Expand Down Expand Up @@ -199,7 +209,7 @@ def get_provider(package_or_requirement: str) -> IResourceProvider: ...
def get_provider(package_or_requirement: Requirement) -> Distribution: ...

class IMetadataProvider:
def has_metadata(self, name: str) -> bool: ...
def has_metadata(self, name: str) -> bool | None: ...
def metadata_isdir(self, name: str) -> bool: ...
def metadata_listdir(self, name: str) -> list[str]: ...
def get_metadata(self, name: str) -> str: ...
Expand Down Expand Up @@ -243,19 +253,49 @@ def register_loader_type(loader_type: type, provider_factory: Callable[[types.Mo
def register_namespace_handler(importer_type: type, namespace_handler: _NSHandlerType) -> None: ...

class IResourceProvider(IMetadataProvider): ...
class NullProvider: ...
class EggProvider(NullProvider): ...

class NullProvider:
egg_name: str | None
egg_info: str | None
loader: types._LoaderProtocol | None
module_path: str | None
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
module_path: str | None
module_path: str

The initializer unconditionally sets it to a string.

Copy link
Collaborator Author

@Avasam Avasam Feb 25, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

EmptyProvider sets it explicitely to None and overrides __init__

Should I keep module_path: str | None for sublcassing. Or add # type: ignore[assignment] to EmptyProvider.module_path ?

Especially considering this comment: #9747 (comment)


def __init__(self, module) -> None: ...
def get_resource_filename(self, manager, resource_name) -> str: ...
def get_resource_stream(self, manager, resource_name) -> BytesIO: ...
def get_resource_string(self, manager, resource_name): ...
def has_resource(self, resource_name) -> bool: ...
def has_metadata(self, name: str) -> bool | None: ...
def get_metadata(self, name: str) -> str: ...
def get_metadata_lines(self, name: str) -> Generator[str, None, None]: ...
def resource_isdir(self, resource_name) -> bool: ...
def metadata_isdir(self, name: str) -> bool: ...
def resource_listdir(self, resource_name) -> list[str]: ...
def metadata_listdir(self, name: str) -> list[str]: ...
def run_script(self, script_name: str, namespace: dict[str, Any]) -> None: ...

class EggProvider(NullProvider):
egg_root: str

class DefaultProvider(EggProvider): ...

class PathMetadata(DefaultProvider, IResourceProvider):
egg_info: str
module_path: str
def __init__(self, path: str, egg_info: str) -> None: ...

class ZipProvider(EggProvider): ...
class ZipProvider(EggProvider):
eagers: list[str] | None
zip_pre: str

class EggMetadata(ZipProvider, IResourceProvider):
loader: zipimport.zipimporter
module_path: str
def __init__(self, zipimporter: zipimport.zipimporter) -> None: ...

class EmptyProvider(NullProvider): ...
class EmptyProvider(NullProvider):
module_path: None
def __init__(self) -> None: ...

empty_provider: EmptyProvider

Expand Down