From ce217e5a3c277c1f9b46911fcf82a4110d0a3b02 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Thu, 9 Dec 2021 00:02:32 +0000 Subject: [PATCH 1/9] Update metadata.pyi --- stdlib/importlib/metadata.pyi | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/stdlib/importlib/metadata.pyi b/stdlib/importlib/metadata.pyi index 506b4a00b4e1..2e16ccb980d7 100644 --- a/stdlib/importlib/metadata.pyi +++ b/stdlib/importlib/metadata.pyi @@ -22,6 +22,11 @@ if sys.version_info >= (3, 8): def load(self) -> Any: ... # Callable[[], Any] or an importable module @property def extras(self) -> list[str]: ... + if sys.version_info >= (3, 9): + @property + def module(self) -> str: ... + @property + def attr(self) -> str: ... class PackagePath(pathlib.PurePosixPath): def read_text(self, encoding: str = ...) -> str: ... def read_binary(self) -> bytes: ... @@ -61,6 +66,9 @@ if sys.version_info >= (3, 8): def files(self) -> list[PackagePath] | None: ... @property def requires(self) -> list[str] | None: ... + if sys.version_info >= (3, 10): + @property + def name(self) -> str: ... class DistributionFinder(MetaPathFinder): class Context: name: str | None From 5845a6e0b7ba4a524894f5e7edcaf3e74c4d0db7 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Thu, 9 Dec 2021 21:59:55 +0000 Subject: [PATCH 2/9] Update `importlib` to reflect recent changes --- stdlib/VERSIONS | 3 ++- stdlib/importlib/abc.pyi | 9 ++++++++- stdlib/importlib/machinery.pyi | 7 ++++++- .../{metadata.pyi => metadata/__init__.pyi} | 7 ++++++- stdlib/importlib/metadata/_meta.pyi | 18 ++++++++++++++++++ stdlib/importlib/resources.pyi | 3 +++ stdlib/importlib/util.pyi | 4 ++++ tests/stubtest_allowlists/py310.txt | 14 +++----------- tests/stubtest_allowlists/py38.txt | 2 -- tests/stubtest_allowlists/py39.txt | 6 ------ 10 files changed, 50 insertions(+), 23 deletions(-) rename stdlib/importlib/{metadata.pyi => metadata/__init__.pyi} (92%) create mode 100644 stdlib/importlib/metadata/_meta.pyi diff --git a/stdlib/VERSIONS b/stdlib/VERSIONS index f3f9aaee3c94..c3655ed67990 100644 --- a/stdlib/VERSIONS +++ b/stdlib/VERSIONS @@ -138,7 +138,8 @@ imaplib: 2.7- imghdr: 2.7- imp: 2.7- importlib: 2.7- -importlib.metadata: 3.8- +importlib.metadata.__init__: 3.8- +importlib.metadata._meta: 3.10- importlib.resources: 3.7- inspect: 2.7- io: 2.7- diff --git a/stdlib/importlib/abc.pyi b/stdlib/importlib/abc.pyi index 6c894cffd5a5..47a00643e485 100644 --- a/stdlib/importlib/abc.pyi +++ b/stdlib/importlib/abc.pyi @@ -12,7 +12,7 @@ from _typeshed import ( from abc import ABCMeta, abstractmethod from importlib.machinery import ModuleSpec from io import BufferedRandom, BufferedReader, BufferedWriter, FileIO, TextIOWrapper -from typing import IO, Any, BinaryIO, Iterator, Mapping, Protocol, Sequence, Union, overload +from typing import IO, Any, BinaryIO, Iterator, Mapping, NoReturn, Protocol, Sequence, Union, overload from typing_extensions import Literal, runtime_checkable _Path = Union[bytes, str] @@ -173,3 +173,10 @@ if sys.version_info >= (3, 9): def read_bytes(self) -> bytes: ... @abstractmethod def read_text(self, encoding: str | None = ...) -> str: ... + class TraversableResources(ResourceReader): + @abstractmethod + def files(self) -> Traversable: ... + def open_resource(self, resource: StrPath) -> BufferedReader: ... # type: ignore[override] + def resource_path(self, resource: Any) -> NoReturn: ... + def is_resource(self, path: StrPath) -> bool: ... + def contents(self) -> Iterator[str]: ... diff --git a/stdlib/importlib/machinery.pyi b/stdlib/importlib/machinery.pyi index aaa0f32d99a0..251e1053e86c 100644 --- a/stdlib/importlib/machinery.pyi +++ b/stdlib/importlib/machinery.pyi @@ -1,7 +1,10 @@ import importlib.abc import sys import types -from typing import Any, Callable, Sequence +from typing import Any, Callable, Iterable, Sequence + +if sys.version_info >= (3, 8): + from importlib.metadata import DistributionFinder, PathDistribution class ModuleSpec: def __init__( @@ -94,6 +97,8 @@ class PathFinder: if sys.version_info >= (3, 10): @staticmethod def invalidate_caches() -> None: ... + @staticmethod + def find_distributions(context: DistributionFinder.Context = ...) -> Iterable[PathDistribution]: ... else: @classmethod def invalidate_caches(cls) -> None: ... diff --git a/stdlib/importlib/metadata.pyi b/stdlib/importlib/metadata/__init__.pyi similarity index 92% rename from stdlib/importlib/metadata.pyi rename to stdlib/importlib/metadata/__init__.pyi index 2e16ccb980d7..c5d9efba9ad6 100644 --- a/stdlib/importlib/metadata.pyi +++ b/stdlib/importlib/metadata/__init__.pyi @@ -7,9 +7,10 @@ from email.message import Message from importlib.abc import MetaPathFinder from os import PathLike from pathlib import Path -from typing import Any, Iterable, NamedTuple, Tuple, overload +from typing import Any, ClassVar, Iterable, NamedTuple, Pattern, Tuple, overload if sys.version_info >= (3, 10): + from importlib.metadata._meta import PackageMetadata as PackageMetadata def packages_distributions() -> Mapping[str, list[str]]: ... if sys.version_info >= (3, 8): @@ -19,6 +20,7 @@ if sys.version_info >= (3, 8): value: str group: str class EntryPoint(_EntryPointBase): + pattern: ClassVar[Pattern[str]] def load(self) -> Any: ... # Callable[[], Any] or an importable module @property def extras(self) -> list[str]: ... @@ -27,6 +29,9 @@ if sys.version_info >= (3, 8): def module(self) -> str: ... @property def attr(self) -> str: ... + if sys.version_info >= (3, 10): + dist: ClassVar[Distribution | None] + def matches(self, **params: Any) -> bool: ... # undocumented class PackagePath(pathlib.PurePosixPath): def read_text(self, encoding: str = ...) -> str: ... def read_binary(self) -> bytes: ... diff --git a/stdlib/importlib/metadata/_meta.pyi b/stdlib/importlib/metadata/_meta.pyi new file mode 100644 index 000000000000..a5e5733396d7 --- /dev/null +++ b/stdlib/importlib/metadata/_meta.pyi @@ -0,0 +1,18 @@ +from typing import Any, Iterator, Protocol, TypeVar + +_T = TypeVar("_T") + +class PackageMetadata(Protocol): + def __len__(self) -> int: ... + def __contains__(self, item: str) -> bool: ... + def __getitem__(self, key: str) -> str: ... + def __iter__(self) -> Iterator[str]: ... + def get_all(self, name: str, failobj: _T = ...) -> list[Any] | _T: ... + @property + def json(self) -> dict[str, str | list[str]]: ... + +class SimplePath(Protocol): + def joinpath(self) -> SimplePath: ... + def __div__(self) -> SimplePath: ... + def parent(self) -> SimplePath: ... + def read_text(self) -> str: ... diff --git a/stdlib/importlib/resources.pyi b/stdlib/importlib/resources.pyi index 194c0bac2b6a..b484d7126b21 100644 --- a/stdlib/importlib/resources.pyi +++ b/stdlib/importlib/resources.pyi @@ -23,3 +23,6 @@ if sys.version_info >= (3, 9): from importlib.abc import Traversable def files(package: Package) -> Traversable: ... def as_file(path: Traversable) -> AbstractContextManager[Path]: ... + +if sys.version_info >= (3, 10): + from importlib.abc import ResourceReader as ResourceReader diff --git a/stdlib/importlib/util.pyi b/stdlib/importlib/util.pyi index d6c410c8424a..23ecf1c35871 100644 --- a/stdlib/importlib/util.pyi +++ b/stdlib/importlib/util.pyi @@ -1,5 +1,6 @@ import importlib.abc import importlib.machinery +import sys import types from _typeshed import StrOrBytesPath from typing import Any, Callable @@ -36,3 +37,6 @@ class LazyLoader(importlib.abc.Loader): def factory(cls, loader: importlib.abc.Loader) -> Callable[..., LazyLoader]: ... def create_module(self, spec: importlib.machinery.ModuleSpec) -> types.ModuleType | None: ... def exec_module(self, module: types.ModuleType) -> None: ... + +if sys.version_info >= (3, 10): + def source_hash(source_bytes: bytes) -> int: ... diff --git a/tests/stubtest_allowlists/py310.txt b/tests/stubtest_allowlists/py310.txt index 38d5056e9b84..03b972214117 100644 --- a/tests/stubtest_allowlists/py310.txt +++ b/tests/stubtest_allowlists/py310.txt @@ -43,6 +43,9 @@ gettext.translation hmac.new # Stub is a white lie; see comments in the stub http.server.SimpleHTTPRequestHandler.__init__ # *args is expanded importlib.abc.Traversable.__init__ # Inherits __init__ from typing.Protocol +importlib.metadata.PackageMetadata.__init__ # Inherits __init__ from typing.Protocol +importlib.metadata._meta.PackageMetadata.__init__ # Inherits __init__ from typing.Protocol +importlib.metadata._meta.SimplePath.__init__ # Inherits __init__ from typing.Protocol ipaddress.IPv4Interface.hostmask ipaddress.IPv6Interface.hostmask ipaddress._BaseNetwork.broadcast_address @@ -150,17 +153,6 @@ distutils.dist.DistributionMetadata.set_keywords distutils.dist.DistributionMetadata.set_platforms distutils.util.get_host_platform email.headerregistry.MessageIDHeader.max_count -importlib.abc.TraversableResources -importlib.machinery.PathFinder.find_distributions -importlib.metadata.Distribution.name -importlib.metadata.EntryPoint.attr -importlib.metadata.EntryPoint.dist -importlib.metadata.EntryPoint.matches -importlib.metadata.EntryPoint.module -importlib.metadata.EntryPoint.pattern -importlib.metadata.PackageMetadata -importlib.resources.ResourceReader -importlib.util.source_hash lib2to3.pgen2.tokenize.COLONEQUAL multiprocessing.managers.SharedMemoryServer.create multiprocessing.managers.SharedMemoryServer.list_segments diff --git a/tests/stubtest_allowlists/py38.txt b/tests/stubtest_allowlists/py38.txt index c8f8bdb29bcf..398c4491e989 100644 --- a/tests/stubtest_allowlists/py38.txt +++ b/tests/stubtest_allowlists/py38.txt @@ -134,8 +134,6 @@ dummy_threading.settrace dummy_threading.stack_size email.headerregistry.MessageIDHeader.max_count html.parser.HTMLParser.unescape -importlib.machinery.PathFinder.find_distributions -importlib.metadata.EntryPoint.pattern importlib.util.source_hash lib2to3.pgen2.tokenize.COLONEQUAL multiprocessing.managers.SharedMemoryServer.create diff --git a/tests/stubtest_allowlists/py39.txt b/tests/stubtest_allowlists/py39.txt index 549d9137153f..5cadc4fdcf88 100644 --- a/tests/stubtest_allowlists/py39.txt +++ b/tests/stubtest_allowlists/py39.txt @@ -135,12 +135,6 @@ email.headerregistry.MessageIDHeader.max_count hmac.HMAC.digest_cons hmac.HMAC.inner hmac.HMAC.outer -importlib.abc.TraversableResources -importlib.machinery.PathFinder.find_distributions -importlib.metadata.EntryPoint.attr -importlib.metadata.EntryPoint.module -importlib.metadata.EntryPoint.pattern -importlib.util.source_hash lib2to3.pgen2.tokenize.COLONEQUAL multiprocessing.managers.SharedMemoryServer.create multiprocessing.managers.SharedMemoryServer.list_segments From 5a4624a29b161c998dcd6f2dbf16bc812ec358e2 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Thu, 9 Dec 2021 22:07:09 +0000 Subject: [PATCH 3/9] Add allowlist entries --- tests/stubtest_allowlists/py36.txt | 1 + tests/stubtest_allowlists/py37.txt | 1 + tests/stubtest_allowlists/py38.txt | 1 + tests/stubtest_allowlists/py39.txt | 1 + 4 files changed, 4 insertions(+) diff --git a/tests/stubtest_allowlists/py36.txt b/tests/stubtest_allowlists/py36.txt index 902c675ce979..71757f511f8d 100644 --- a/tests/stubtest_allowlists/py36.txt +++ b/tests/stubtest_allowlists/py36.txt @@ -25,6 +25,7 @@ enum.Enum._generate_next_value_ fractions.Fraction.__new__ # overload is too complicated for stubtest to resolve hmac.HMAC.__init__ importlib.metadata # Added in 3.8 +importlib.metadata._meta # Added in 3.10 importlib.resources # Added in 3.7 io.StringIO.readline ipaddress._BaseNetwork.__init__ diff --git a/tests/stubtest_allowlists/py37.txt b/tests/stubtest_allowlists/py37.txt index 1e5397b1711c..db87dcf70ce2 100644 --- a/tests/stubtest_allowlists/py37.txt +++ b/tests/stubtest_allowlists/py37.txt @@ -29,6 +29,7 @@ fractions.Fraction.__new__ # overload is too complicated for stubtest to resolv hmac.HMAC.__init__ http.server.SimpleHTTPRequestHandler.__init__ # *args is expanded importlib.metadata # Added in 3.8 +importlib.metadata._meta # Added in 3.10 ipaddress._BaseNetwork.__init__ json.loads multiprocessing.shared_memory diff --git a/tests/stubtest_allowlists/py38.txt b/tests/stubtest_allowlists/py38.txt index 398c4491e989..f3f45d587332 100644 --- a/tests/stubtest_allowlists/py38.txt +++ b/tests/stubtest_allowlists/py38.txt @@ -37,6 +37,7 @@ gettext.install # codeset default value is ['unspecified'] so can't be specifie gettext.translation # codeset default value is ['unspecified'] so can't be specified hmac.new # Stub is a white lie; see comments in the stub http.server.SimpleHTTPRequestHandler.__init__ # *args is expanded +importlib.metadata._meta # Added in 3.10 ipaddress.IPv4Interface.hostmask ipaddress.IPv6Interface.hostmask ipaddress._BaseNetwork.broadcast_address diff --git a/tests/stubtest_allowlists/py39.txt b/tests/stubtest_allowlists/py39.txt index 5cadc4fdcf88..35480dc7ea65 100644 --- a/tests/stubtest_allowlists/py39.txt +++ b/tests/stubtest_allowlists/py39.txt @@ -40,6 +40,7 @@ gettext.translation hmac.new # Stub is a white lie; see comments in the stub http.server.SimpleHTTPRequestHandler.__init__ # *args is expanded importlib.abc.Traversable.__init__ # Inherits __init__ from typing.Protocol +importlib.metadata._meta # Added in 3.10 ipaddress.IPv4Interface.hostmask ipaddress.IPv6Interface.hostmask ipaddress._BaseNetwork.broadcast_address From 3e8520613ce6a97f000fba73d04220d832d8231f Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Thu, 9 Dec 2021 22:10:12 +0000 Subject: [PATCH 4/9] Change `find_distributions` --- stdlib/importlib/machinery.pyi | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/stdlib/importlib/machinery.pyi b/stdlib/importlib/machinery.pyi index 251e1053e86c..9e4481f1d3b9 100644 --- a/stdlib/importlib/machinery.pyi +++ b/stdlib/importlib/machinery.pyi @@ -94,11 +94,12 @@ class WindowsRegistryFinder(importlib.abc.MetaPathFinder): ) -> ModuleSpec | None: ... class PathFinder: + if sys.version_info >= (3, 8): + @staticmethod + def find_distributions(context: DistributionFinder.Context = ...) -> Iterable[PathDistribution]: ... if sys.version_info >= (3, 10): @staticmethod def invalidate_caches() -> None: ... - @staticmethod - def find_distributions(context: DistributionFinder.Context = ...) -> Iterable[PathDistribution]: ... else: @classmethod def invalidate_caches(cls) -> None: ... From 5dd08464d864767a2eba41a7685d49b346bf2d14 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Thu, 9 Dec 2021 22:19:26 +0000 Subject: [PATCH 5/9] Changed from `classmethod` to `staticmethod` --- stdlib/importlib/machinery.pyi | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/stdlib/importlib/machinery.pyi b/stdlib/importlib/machinery.pyi index 9e4481f1d3b9..15409f3a70e3 100644 --- a/stdlib/importlib/machinery.pyi +++ b/stdlib/importlib/machinery.pyi @@ -93,16 +93,19 @@ class WindowsRegistryFinder(importlib.abc.MetaPathFinder): cls, fullname: str, path: Sequence[importlib.abc._Path] | None = ..., target: types.ModuleType | None = ... ) -> ModuleSpec | None: ... -class PathFinder: - if sys.version_info >= (3, 8): - @staticmethod - def find_distributions(context: DistributionFinder.Context = ...) -> Iterable[PathDistribution]: ... +class PathFinder: if sys.version_info >= (3, 10): @staticmethod def invalidate_caches() -> None: ... else: @classmethod def invalidate_caches(cls) -> None: ... + if sys.version_info >= (3, 10): + @staticmethod + def find_distributions(context: DistributionFinder.Context = ...) -> Iterable[PathDistribution]: ... + elif sys.version_info >= (3, 8): + @classmethod + def find_distributions(cls, context: DistributionFinder.Context = ...) -> Iterable[PathDistribution]: ... @classmethod def find_spec( cls, fullname: str, path: Sequence[bytes | str] | None = ..., target: types.ModuleType | None = ... From 588a55acab29efc077eeedc6e872c4223bf8a9e4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 9 Dec 2021 22:20:30 +0000 Subject: [PATCH 6/9] [pre-commit.ci] auto fixes from pre-commit.com hooks --- stdlib/importlib/machinery.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/importlib/machinery.pyi b/stdlib/importlib/machinery.pyi index 15409f3a70e3..b73f9c527583 100644 --- a/stdlib/importlib/machinery.pyi +++ b/stdlib/importlib/machinery.pyi @@ -93,7 +93,7 @@ class WindowsRegistryFinder(importlib.abc.MetaPathFinder): cls, fullname: str, path: Sequence[importlib.abc._Path] | None = ..., target: types.ModuleType | None = ... ) -> ModuleSpec | None: ... -class PathFinder: +class PathFinder: if sys.version_info >= (3, 10): @staticmethod def invalidate_caches() -> None: ... From a01b280db90e47508caa2b19c7cdd6207cce08f1 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Thu, 9 Dec 2021 22:22:14 +0000 Subject: [PATCH 7/9] `source_hash` has been there in 3.7+ --- stdlib/importlib/util.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/importlib/util.pyi b/stdlib/importlib/util.pyi index 23ecf1c35871..96db3146863e 100644 --- a/stdlib/importlib/util.pyi +++ b/stdlib/importlib/util.pyi @@ -38,5 +38,5 @@ class LazyLoader(importlib.abc.Loader): def create_module(self, spec: importlib.machinery.ModuleSpec) -> types.ModuleType | None: ... def exec_module(self, module: types.ModuleType) -> None: ... -if sys.version_info >= (3, 10): +if sys.version_info >= (3, 7): def source_hash(source_bytes: bytes) -> int: ... From c62ef6256b87a963e1bb7e1c6466a27878808caa Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Thu, 9 Dec 2021 22:25:16 +0000 Subject: [PATCH 8/9] Remove allowlist entries --- tests/stubtest_allowlists/py37.txt | 1 - tests/stubtest_allowlists/py38.txt | 1 - 2 files changed, 2 deletions(-) diff --git a/tests/stubtest_allowlists/py37.txt b/tests/stubtest_allowlists/py37.txt index db87dcf70ce2..2cd19fda5430 100644 --- a/tests/stubtest_allowlists/py37.txt +++ b/tests/stubtest_allowlists/py37.txt @@ -111,7 +111,6 @@ dummy_threading.setprofile dummy_threading.settrace dummy_threading.stack_size html.parser.HTMLParser.unescape -importlib.util.source_hash lib2to3.pgen2.tokenize.COLONEQUAL platform.popen plistlib.Data.asBase64 diff --git a/tests/stubtest_allowlists/py38.txt b/tests/stubtest_allowlists/py38.txt index f3f45d587332..45deb7ecdb56 100644 --- a/tests/stubtest_allowlists/py38.txt +++ b/tests/stubtest_allowlists/py38.txt @@ -135,7 +135,6 @@ dummy_threading.settrace dummy_threading.stack_size email.headerregistry.MessageIDHeader.max_count html.parser.HTMLParser.unescape -importlib.util.source_hash lib2to3.pgen2.tokenize.COLONEQUAL multiprocessing.managers.SharedMemoryServer.create multiprocessing.managers.SharedMemoryServer.list_segments From 459d7ffc3e4ac88b2c7feaa7de903db6332ee0d4 Mon Sep 17 00:00:00 2001 From: Alex Waygood Date: Thu, 9 Dec 2021 22:31:43 +0000 Subject: [PATCH 9/9] Update VERSIONS --- stdlib/VERSIONS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/VERSIONS b/stdlib/VERSIONS index c3655ed67990..e82161d97cb6 100644 --- a/stdlib/VERSIONS +++ b/stdlib/VERSIONS @@ -138,7 +138,7 @@ imaplib: 2.7- imghdr: 2.7- imp: 2.7- importlib: 2.7- -importlib.metadata.__init__: 3.8- +importlib.metadata: 3.8- importlib.metadata._meta: 3.10- importlib.resources: 3.7- inspect: 2.7-