Skip to content

Commit 2091fe7

Browse files
authored
Bump importlib to 3.14 (#14138)
1 parent 8cbb716 commit 2091fe7

File tree

10 files changed

+200
-79
lines changed

10 files changed

+200
-79
lines changed

stdlib/@tests/stubtest_allowlists/py314.txt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,6 @@ fractions.Fraction.__rpow__
2121
gzip.GzipFile.readinto
2222
gzip.GzipFile.readinto1
2323
gzip.compress
24-
importlib.abc.ResourceReader
25-
importlib.abc.Traversable
26-
importlib.abc.TraversableResources
27-
importlib.machinery.__all__
28-
importlib.machinery.AppleFrameworkLoader
29-
importlib.util.__all__
30-
importlib.util.Loader
3124
multiprocessing.forkserver.main
3225
multiprocessing.managers.BaseListProxy.clear
3326
multiprocessing.managers.BaseListProxy.copy
@@ -93,6 +86,7 @@ typing.NewType.__mro_entries__
9386

9487
builtins.ellipsis # type is not exposed anywhere
9588
importlib._abc.Loader.exec_module # See Lib/importlib/_abc.py. Might be defined for backwards compatibility
89+
importlib.util.Loader.exec_module
9690

9791
# positional-only complaints caused by differences between typing aliases and the "real" classes in the stdlib
9892
_collections_abc.Coroutine.send

stdlib/@tests/test_cases/check_importlib.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from __future__ import annotations
22

3-
import importlib.abc
43
import importlib.util
54
import pathlib
65
import sys
@@ -10,9 +9,14 @@
109
from types import ModuleType
1110
from typing_extensions import Self
1211

12+
if sys.version_info >= (3, 11):
13+
from importlib.resources.abc import Traversable
14+
else:
15+
from importlib.abc import Traversable
16+
1317

1418
# Assert that some Path classes are Traversable.
15-
def traverse(t: importlib.abc.Traversable) -> None:
19+
def traverse(t: Traversable) -> None:
1620
pass
1721

1822

stdlib/importlib/abc.pyi

Lines changed: 59 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -113,63 +113,71 @@ class FileLoader(_bootstrap_external.FileLoader, ResourceLoader, ExecutionLoader
113113
def get_filename(self, name: str | None = None) -> str: ...
114114
def load_module(self, name: str | None = None) -> types.ModuleType: ...
115115

116-
class ResourceReader(metaclass=ABCMeta):
117-
@abstractmethod
118-
def open_resource(self, resource: str) -> IO[bytes]: ...
119-
@abstractmethod
120-
def resource_path(self, resource: str) -> str: ...
121-
if sys.version_info >= (3, 10):
116+
if sys.version_info < (3, 11):
117+
class ResourceReader(metaclass=ABCMeta):
122118
@abstractmethod
123-
def is_resource(self, path: str) -> bool: ...
124-
else:
119+
def open_resource(self, resource: str) -> IO[bytes]: ...
125120
@abstractmethod
126-
def is_resource(self, name: str) -> bool: ...
121+
def resource_path(self, resource: str) -> str: ...
122+
if sys.version_info >= (3, 10):
123+
@abstractmethod
124+
def is_resource(self, path: str) -> bool: ...
125+
else:
126+
@abstractmethod
127+
def is_resource(self, name: str) -> bool: ...
127128

128-
@abstractmethod
129-
def contents(self) -> Iterator[str]: ...
129+
@abstractmethod
130+
def contents(self) -> Iterator[str]: ...
130131

131-
@runtime_checkable
132-
class Traversable(Protocol):
133-
@abstractmethod
134-
def is_dir(self) -> bool: ...
135-
@abstractmethod
136-
def is_file(self) -> bool: ...
137-
@abstractmethod
138-
def iterdir(self) -> Iterator[Traversable]: ...
139-
if sys.version_info >= (3, 11):
132+
@runtime_checkable
133+
class Traversable(Protocol):
140134
@abstractmethod
141-
def joinpath(self, *descendants: str) -> Traversable: ...
142-
else:
135+
def is_dir(self) -> bool: ...
143136
@abstractmethod
144-
def joinpath(self, child: str, /) -> Traversable: ...
145-
146-
# The documentation and runtime protocol allows *args, **kwargs arguments,
147-
# but this would mean that all implementers would have to support them,
148-
# which is not the case.
149-
@overload
150-
@abstractmethod
151-
def open(self, mode: Literal["r"] = "r", *, encoding: str | None = None, errors: str | None = None) -> IO[str]: ...
152-
@overload
153-
@abstractmethod
154-
def open(self, mode: Literal["rb"]) -> IO[bytes]: ...
155-
@property
156-
@abstractmethod
157-
def name(self) -> str: ...
158-
if sys.version_info >= (3, 10):
159-
def __truediv__(self, child: str, /) -> Traversable: ...
160-
else:
137+
def is_file(self) -> bool: ...
138+
@abstractmethod
139+
def iterdir(self) -> Iterator[Traversable]: ...
140+
if sys.version_info >= (3, 11):
141+
@abstractmethod
142+
def joinpath(self, *descendants: str) -> Traversable: ...
143+
else:
144+
@abstractmethod
145+
def joinpath(self, child: str, /) -> Traversable: ...
146+
147+
# The documentation and runtime protocol allows *args, **kwargs arguments,
148+
# but this would mean that all implementers would have to support them,
149+
# which is not the case.
150+
@overload
151+
@abstractmethod
152+
def open(self, mode: Literal["r"] = "r", *, encoding: str | None = None, errors: str | None = None) -> IO[str]: ...
153+
@overload
161154
@abstractmethod
162-
def __truediv__(self, child: str, /) -> Traversable: ...
155+
def open(self, mode: Literal["rb"]) -> IO[bytes]: ...
156+
@property
157+
@abstractmethod
158+
def name(self) -> str: ...
159+
if sys.version_info >= (3, 10):
160+
def __truediv__(self, child: str, /) -> Traversable: ...
161+
else:
162+
@abstractmethod
163+
def __truediv__(self, child: str, /) -> Traversable: ...
163164

164-
@abstractmethod
165-
def read_bytes(self) -> bytes: ...
166-
@abstractmethod
167-
def read_text(self, encoding: str | None = None) -> str: ...
165+
@abstractmethod
166+
def read_bytes(self) -> bytes: ...
167+
@abstractmethod
168+
def read_text(self, encoding: str | None = None) -> str: ...
168169

169-
class TraversableResources(ResourceReader):
170-
@abstractmethod
171-
def files(self) -> Traversable: ...
172-
def open_resource(self, resource: str) -> BufferedReader: ...
173-
def resource_path(self, resource: Any) -> str: ...
174-
def is_resource(self, path: str) -> bool: ...
175-
def contents(self) -> Iterator[str]: ...
170+
class TraversableResources(ResourceReader):
171+
@abstractmethod
172+
def files(self) -> Traversable: ...
173+
def open_resource(self, resource: str) -> BufferedReader: ...
174+
def resource_path(self, resource: Any) -> str: ...
175+
def is_resource(self, path: str) -> bool: ...
176+
def contents(self) -> Iterator[str]: ...
177+
178+
elif sys.version_info < (3, 14):
179+
from importlib.resources.abc import (
180+
ResourceReader as ResourceReader,
181+
Traversable as Traversable,
182+
TraversableResources as TraversableResources,
183+
)

stdlib/importlib/machinery.pyi

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,28 @@ from importlib._bootstrap_external import (
1616

1717
if sys.version_info >= (3, 11):
1818
from importlib._bootstrap_external import NamespaceLoader as NamespaceLoader
19+
if sys.version_info >= (3, 14):
20+
from importlib._bootstrap_external import AppleFrameworkLoader as AppleFrameworkLoader
1921

2022
def all_suffixes() -> list[str]: ...
23+
24+
if sys.version_info >= (3, 14):
25+
__all__ = [
26+
"AppleFrameworkLoader",
27+
"BYTECODE_SUFFIXES",
28+
"BuiltinImporter",
29+
"DEBUG_BYTECODE_SUFFIXES",
30+
"EXTENSION_SUFFIXES",
31+
"ExtensionFileLoader",
32+
"FileFinder",
33+
"FrozenImporter",
34+
"ModuleSpec",
35+
"NamespaceLoader",
36+
"OPTIMIZED_BYTECODE_SUFFIXES",
37+
"PathFinder",
38+
"SOURCE_SUFFIXES",
39+
"SourceFileLoader",
40+
"SourcelessFileLoader",
41+
"WindowsRegistryFinder",
42+
"all_suffixes",
43+
]

stdlib/importlib/resources/__init__.pyi

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@ import os
22
import sys
33
from collections.abc import Iterator
44
from contextlib import AbstractContextManager
5-
from importlib.abc import Traversable
65
from pathlib import Path
76
from types import ModuleType
87
from typing import Any, BinaryIO, Literal, TextIO
98
from typing_extensions import TypeAlias
109

10+
if sys.version_info >= (3, 11):
11+
from importlib.resources.abc import Traversable
12+
else:
13+
from importlib.abc import Traversable
14+
1115
if sys.version_info >= (3, 11):
1216
from importlib.resources._common import Package as Package
1317
else:
@@ -72,5 +76,7 @@ if sys.version_info >= (3, 11):
7276
else:
7377
def files(package: Package) -> Traversable: ...
7478

75-
if sys.version_info >= (3, 10):
79+
if sys.version_info >= (3, 11):
80+
from importlib.resources.abc import ResourceReader as ResourceReader
81+
elif sys.version_info >= (3, 10):
7682
from importlib.abc import ResourceReader as ResourceReader

stdlib/importlib/resources/_common.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ if sys.version_info >= (3, 11):
55
import types
66
from collections.abc import Callable
77
from contextlib import AbstractContextManager
8-
from importlib.abc import ResourceReader, Traversable
8+
from importlib.resources.abc import ResourceReader, Traversable
99
from pathlib import Path
1010
from typing import Literal, overload
1111
from typing_extensions import TypeAlias, deprecated

stdlib/importlib/resources/abc.pyi

Lines changed: 64 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,69 @@
11
import sys
2+
from abc import ABCMeta, abstractmethod
3+
from collections.abc import Iterator
4+
from io import BufferedReader
5+
from typing import IO, Any, Literal, Protocol, overload, runtime_checkable
26

37
if sys.version_info >= (3, 11):
4-
# These are all actually defined in this file on 3.11+,
5-
# and re-exported from importlib.abc,
6-
# but it's much less code duplication for typeshed if we pretend that they're still defined
7-
# in importlib.abc on 3.11+, and re-exported from this file
8-
from importlib.abc import (
9-
ResourceReader as ResourceReader,
10-
Traversable as Traversable,
11-
TraversableResources as TraversableResources,
12-
)
8+
class ResourceReader(metaclass=ABCMeta):
9+
@abstractmethod
10+
def open_resource(self, resource: str) -> IO[bytes]: ...
11+
@abstractmethod
12+
def resource_path(self, resource: str) -> str: ...
13+
if sys.version_info >= (3, 10):
14+
@abstractmethod
15+
def is_resource(self, path: str) -> bool: ...
16+
else:
17+
@abstractmethod
18+
def is_resource(self, name: str) -> bool: ...
19+
20+
@abstractmethod
21+
def contents(self) -> Iterator[str]: ...
22+
23+
@runtime_checkable
24+
class Traversable(Protocol):
25+
@abstractmethod
26+
def is_dir(self) -> bool: ...
27+
@abstractmethod
28+
def is_file(self) -> bool: ...
29+
@abstractmethod
30+
def iterdir(self) -> Iterator[Traversable]: ...
31+
if sys.version_info >= (3, 11):
32+
@abstractmethod
33+
def joinpath(self, *descendants: str) -> Traversable: ...
34+
else:
35+
@abstractmethod
36+
def joinpath(self, child: str, /) -> Traversable: ...
37+
38+
# The documentation and runtime protocol allows *args, **kwargs arguments,
39+
# but this would mean that all implementers would have to support them,
40+
# which is not the case.
41+
@overload
42+
@abstractmethod
43+
def open(self, mode: Literal["r"] = "r", *, encoding: str | None = None, errors: str | None = None) -> IO[str]: ...
44+
@overload
45+
@abstractmethod
46+
def open(self, mode: Literal["rb"]) -> IO[bytes]: ...
47+
@property
48+
@abstractmethod
49+
def name(self) -> str: ...
50+
if sys.version_info >= (3, 10):
51+
def __truediv__(self, child: str, /) -> Traversable: ...
52+
else:
53+
@abstractmethod
54+
def __truediv__(self, child: str, /) -> Traversable: ...
55+
56+
@abstractmethod
57+
def read_bytes(self) -> bytes: ...
58+
@abstractmethod
59+
def read_text(self, encoding: str | None = None) -> str: ...
60+
61+
class TraversableResources(ResourceReader):
62+
@abstractmethod
63+
def files(self) -> Traversable: ...
64+
def open_resource(self, resource: str) -> BufferedReader: ...
65+
def resource_path(self, resource: Any) -> str: ...
66+
def is_resource(self, path: str) -> bool: ...
67+
def contents(self) -> Iterator[str]: ...
1368

1469
__all__ = ["ResourceReader", "Traversable", "TraversableResources"]

stdlib/importlib/util.pyi

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import importlib.abc
21
import importlib.machinery
32
import sys
43
import types
@@ -12,6 +11,7 @@ from importlib._bootstrap_external import (
1211
source_from_cache as source_from_cache,
1312
spec_from_file_location as spec_from_file_location,
1413
)
14+
from importlib.abc import Loader
1515
from typing_extensions import ParamSpec
1616

1717
_P = ParamSpec("_P")
@@ -24,10 +24,26 @@ if sys.version_info < (3, 12):
2424
def resolve_name(name: str, package: str | None) -> str: ...
2525
def find_spec(name: str, package: str | None = None) -> importlib.machinery.ModuleSpec | None: ...
2626

27-
class LazyLoader(importlib.abc.Loader):
28-
def __init__(self, loader: importlib.abc.Loader) -> None: ...
27+
class LazyLoader(Loader):
28+
def __init__(self, loader: Loader) -> None: ...
2929
@classmethod
30-
def factory(cls, loader: importlib.abc.Loader) -> Callable[..., LazyLoader]: ...
30+
def factory(cls, loader: Loader) -> Callable[..., LazyLoader]: ...
3131
def exec_module(self, module: types.ModuleType) -> None: ...
3232

3333
def source_hash(source_bytes: ReadableBuffer) -> bytes: ...
34+
35+
if sys.version_info >= (3, 14):
36+
__all__ = [
37+
"LazyLoader",
38+
"Loader",
39+
"MAGIC_NUMBER",
40+
"cache_from_source",
41+
"decode_source",
42+
"find_spec",
43+
"module_from_spec",
44+
"resolve_name",
45+
"source_from_cache",
46+
"source_hash",
47+
"spec_from_file_location",
48+
"spec_from_loader",
49+
]

stdlib/zipimport.pyi

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import sys
22
from _typeshed import StrOrBytesPath
3-
from importlib.abc import ResourceReader
43
from importlib.machinery import ModuleSpec
54
from types import CodeType, ModuleType
65
from typing_extensions import deprecated
76

7+
if sys.version_info >= (3, 10):
8+
from importlib.readers import ZipReader
9+
else:
10+
from importlib.abc import ResourceReader
11+
812
if sys.version_info >= (3, 10):
913
from _frozen_importlib_external import _LoaderBasics
1014
else:
@@ -29,7 +33,13 @@ class zipimporter(_LoaderBasics):
2933
def get_code(self, fullname: str) -> CodeType: ...
3034
def get_data(self, pathname: str) -> bytes: ...
3135
def get_filename(self, fullname: str) -> str: ...
32-
def get_resource_reader(self, fullname: str) -> ResourceReader | None: ... # undocumented
36+
if sys.version_info >= (3, 14):
37+
def get_resource_reader(self, fullname: str) -> ZipReader: ... # undocumented
38+
elif sys.version_info >= (3, 10):
39+
def get_resource_reader(self, fullname: str) -> ZipReader | None: ... # undocumented
40+
else:
41+
def get_resource_reader(self, fullname: str) -> ResourceReader | None: ... # undocumented
42+
3343
def get_source(self, fullname: str) -> str | None: ...
3444
def is_package(self, fullname: str) -> bool: ...
3545
@deprecated("Deprecated since 3.10; use exec_module() instead")

0 commit comments

Comments
 (0)