From 08c44b78952e9e32dd6c65ce174e87b57e7b4724 Mon Sep 17 00:00:00 2001 From: Max Muoto Date: Thu, 11 Jul 2024 19:04:55 -0500 Subject: [PATCH] Resolve `importlib.metadata` 3.13 issues (#12299) --- stdlib/@tests/stubtest_allowlists/py313.txt | 6 ------ .../test_cases/check_importlib_metadata.py | 11 +++------- stdlib/VERSIONS | 1 + stdlib/importlib/metadata/__init__.pyi | 15 ++++++++------ stdlib/importlib/metadata/_meta.pyi | 20 ++++++++++++++++--- stdlib/importlib/metadata/diagnose.pyi | 2 ++ 6 files changed, 32 insertions(+), 23 deletions(-) create mode 100644 stdlib/importlib/metadata/diagnose.pyi diff --git a/stdlib/@tests/stubtest_allowlists/py313.txt b/stdlib/@tests/stubtest_allowlists/py313.txt index 4426c17eb..dc0f035ae 100644 --- a/stdlib/@tests/stubtest_allowlists/py313.txt +++ b/stdlib/@tests/stubtest_allowlists/py313.txt @@ -68,12 +68,6 @@ doctest.TestResults.__new__ email.utils.getaddresses email.utils.parseaddr filecmp.dircmp.__init__ -importlib.metadata.DeprecatedTuple -importlib.metadata.Distribution.origin -importlib.metadata._meta.SimplePath.exists -importlib.metadata._meta.SimplePath.read_bytes -importlib.metadata._meta.SimplePath.read_text -importlib.metadata.diagnose importlib.resources.Anchor importlib.resources.Resource importlib.resources.__all__ diff --git a/stdlib/@tests/test_cases/check_importlib_metadata.py b/stdlib/@tests/test_cases/check_importlib_metadata.py index f1322e16c..0c9bd44cf 100644 --- a/stdlib/@tests/test_cases/check_importlib_metadata.py +++ b/stdlib/@tests/test_cases/check_importlib_metadata.py @@ -4,7 +4,6 @@ import sys from _typeshed import StrPath from os import PathLike from pathlib import Path -from typing import Any from zipfile import Path as ZipPath if sys.version_info >= (3, 10): @@ -16,16 +15,12 @@ if sys.version_info >= (3, 10): def parent(self) -> PathLike[str]: ... # undocumented def read_text(self, encoding: str | None = ..., errors: str | None = ...) -> str: ... + def read_bytes(self) -> bytes: ... def joinpath(self, *other: StrPath) -> MyPath: ... def __truediv__(self, add: StrPath) -> MyPath: ... + def exists(self) -> bool: ... - if sys.version_info >= (3, 12): - - def takes_simple_path(p: SimplePath[Any]) -> None: ... - - else: - - def takes_simple_path(p: SimplePath) -> None: ... + def takes_simple_path(p: SimplePath) -> None: ... takes_simple_path(Path()) takes_simple_path(ZipPath("")) diff --git a/stdlib/VERSIONS b/stdlib/VERSIONS index 58d7e8b0a..641f951ce 100644 --- a/stdlib/VERSIONS +++ b/stdlib/VERSIONS @@ -158,6 +158,7 @@ importlib: 3.0- importlib._abc: 3.10- importlib.metadata: 3.8- importlib.metadata._meta: 3.10- +importlib.metadata.diagnose: 3.13- importlib.readers: 3.10- importlib.resources: 3.7- importlib.resources.abc: 3.11- diff --git a/stdlib/importlib/metadata/__init__.pyi b/stdlib/importlib/metadata/__init__.pyi index 56ee20523..37b9a3882 100644 --- a/stdlib/importlib/metadata/__init__.pyi +++ b/stdlib/importlib/metadata/__init__.pyi @@ -1,6 +1,7 @@ import abc import pathlib import sys +import types from _collections_abc import dict_keys, dict_values from _typeshed import StrPath from collections.abc import Iterable, Iterator, Mapping @@ -36,11 +37,8 @@ if sys.version_info >= (3, 10): from importlib.metadata._meta import PackageMetadata as PackageMetadata, SimplePath def packages_distributions() -> Mapping[str, list[str]]: ... - if sys.version_info >= (3, 12): - # It's generic but shouldn't be - _SimplePath: TypeAlias = SimplePath[Any] - else: - _SimplePath: TypeAlias = SimplePath + _SimplePath: TypeAlias = SimplePath + else: _SimplePath: TypeAlias = Path @@ -48,7 +46,9 @@ class PackageNotFoundError(ModuleNotFoundError): @property def name(self) -> str: ... # type: ignore[override] -if sys.version_info >= (3, 11): +if sys.version_info >= (3, 13): + _EntryPointBase = object +elif sys.version_info >= (3, 11): class DeprecatedTuple: def __getitem__(self, item: int) -> str: ... @@ -226,6 +226,9 @@ class Distribution(_distribution_parent): if sys.version_info >= (3, 10): @property def name(self) -> str: ... + if sys.version_info >= (3, 13): + @property + def origin(self) -> types.SimpleNamespace: ... class DistributionFinder(MetaPathFinder): class Context: diff --git a/stdlib/importlib/metadata/_meta.pyi b/stdlib/importlib/metadata/_meta.pyi index 3eac226b7..9f791dab2 100644 --- a/stdlib/importlib/metadata/_meta.pyi +++ b/stdlib/importlib/metadata/_meta.pyi @@ -1,9 +1,12 @@ import sys +from _typeshed import StrPath from collections.abc import Iterator -from typing import Any, Protocol, TypeVar, overload +from os import PathLike +from typing import Any, Protocol, overload +from typing_extensions import TypeVar _T = TypeVar("_T") -_T_co = TypeVar("_T_co", covariant=True) +_T_co = TypeVar("_T_co", covariant=True, default=Any) class PackageMetadata(Protocol): def __len__(self) -> int: ... @@ -22,7 +25,18 @@ class PackageMetadata(Protocol): @overload def get(self, name: str, failobj: _T) -> _T | str: ... -if sys.version_info >= (3, 12): +if sys.version_info >= (3, 13): + class SimplePath(Protocol): + def joinpath(self, other: StrPath, /) -> SimplePath: ... + def __truediv__(self, other: StrPath, /) -> SimplePath: ... + # Incorrect at runtime + @property + def parent(self) -> PathLike[str]: ... + def read_text(self, encoding: str | None = None) -> str: ... + def read_bytes(self) -> bytes: ... + def exists(self) -> bool: ... + +elif sys.version_info >= (3, 12): class SimplePath(Protocol[_T_co]): # At runtime this is defined as taking `str | _T`, but that causes trouble. # See #11436. diff --git a/stdlib/importlib/metadata/diagnose.pyi b/stdlib/importlib/metadata/diagnose.pyi new file mode 100644 index 000000000..565872fd9 --- /dev/null +++ b/stdlib/importlib/metadata/diagnose.pyi @@ -0,0 +1,2 @@ +def inspect(path: str) -> None: ... +def run() -> None: ...