Skip to content

Commit d7dfa85

Browse files
authored
Revert "bpo-44771: Apply changes from importlib_resources 5.2.1 (GH-27436)"
This reverts commit aaa83cd.
1 parent 7cad0be commit d7dfa85

19 files changed

+373
-714
lines changed

.gitattributes

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ Lib/test/test_email/data/*.txt -text
2828
Lib/test/xmltestdata/* -text
2929
Lib/test/coding20731.py -text
3030
Lib/test/test_importlib/data01/* -text
31-
Lib/test/test_importlib/namespacedata01/* -text
3231

3332
# CRLF files
3433
*.bat text eol=crlf

Lib/importlib/_adapters.py

Lines changed: 10 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from contextlib import suppress
2-
from io import TextIOWrapper
32

43
from . import abc
54

@@ -26,119 +25,32 @@ def __init__(self, spec):
2625
self.spec = spec
2726

2827
def get_resource_reader(self, name):
29-
return CompatibilityFiles(self.spec)._native()
28+
return DegenerateFiles(self.spec)._native()
3029

3130

32-
def _io_wrapper(file, mode='r', *args, **kwargs):
33-
if mode == 'r':
34-
return TextIOWrapper(file, *args, **kwargs)
35-
elif mode == 'rb':
36-
return file
37-
raise ValueError(
38-
"Invalid mode value '{}', only 'r' and 'rb' are supported".format(mode)
39-
)
40-
41-
42-
class CompatibilityFiles:
31+
class DegenerateFiles:
4332
"""
4433
Adapter for an existing or non-existant resource reader
45-
to provide a compability .files().
34+
to provide a degenerate .files().
4635
"""
4736

48-
class SpecPath(abc.Traversable):
49-
"""
50-
Path tied to a module spec.
51-
Can be read and exposes the resource reader children.
52-
"""
53-
54-
def __init__(self, spec, reader):
55-
self._spec = spec
56-
self._reader = reader
57-
58-
def iterdir(self):
59-
if not self._reader:
60-
return iter(())
61-
return iter(
62-
CompatibilityFiles.ChildPath(self._reader, path)
63-
for path in self._reader.contents()
64-
)
65-
66-
def is_file(self):
67-
return False
68-
69-
is_dir = is_file
70-
71-
def joinpath(self, other):
72-
if not self._reader:
73-
return CompatibilityFiles.OrphanPath(other)
74-
return CompatibilityFiles.ChildPath(self._reader, other)
75-
76-
@property
77-
def name(self):
78-
return self._spec.name
79-
80-
def open(self, mode='r', *args, **kwargs):
81-
return _io_wrapper(self._reader.open_resource(None), mode, *args, **kwargs)
82-
83-
class ChildPath(abc.Traversable):
84-
"""
85-
Path tied to a resource reader child.
86-
Can be read but doesn't expose any meaningfull children.
87-
"""
88-
89-
def __init__(self, reader, name):
90-
self._reader = reader
91-
self._name = name
92-
37+
class Path(abc.Traversable):
9338
def iterdir(self):
9439
return iter(())
9540

96-
def is_file(self):
97-
return self._reader.is_resource(self.name)
98-
9941
def is_dir(self):
100-
return not self.is_file()
101-
102-
def joinpath(self, other):
103-
return CompatibilityFiles.OrphanPath(self.name, other)
104-
105-
@property
106-
def name(self):
107-
return self._name
108-
109-
def open(self, mode='r', *args, **kwargs):
110-
return _io_wrapper(
111-
self._reader.open_resource(self.name), mode, *args, **kwargs
112-
)
113-
114-
class OrphanPath(abc.Traversable):
115-
"""
116-
Orphan path, not tied to a module spec or resource reader.
117-
Can't be read and doesn't expose any meaningful children.
118-
"""
119-
120-
def __init__(self, *path_parts):
121-
if len(path_parts) < 1:
122-
raise ValueError('Need at least one path part to construct a path')
123-
self._path = path_parts
124-
125-
def iterdir(self):
126-
return iter(())
127-
128-
def is_file(self):
12942
return False
13043

131-
is_dir = is_file
44+
is_file = exists = is_dir # type: ignore
13245

13346
def joinpath(self, other):
134-
return CompatibilityFiles.OrphanPath(*self._path, other)
47+
return DegenerateFiles.Path()
13548

136-
@property
13749
def name(self):
138-
return self._path[-1]
50+
return ''
13951

140-
def open(self, mode='r', *args, **kwargs):
141-
raise FileNotFoundError("Can't open orphan path")
52+
def open(self):
53+
raise ValueError()
14254

14355
def __init__(self, spec):
14456
self.spec = spec
@@ -159,7 +71,7 @@ def __getattr__(self, attr):
15971
return getattr(self._reader, attr)
16072

16173
def files(self):
162-
return CompatibilityFiles.SpecPath(self.spec, self._reader)
74+
return DegenerateFiles.Path()
16375

16476

16577
def wrap_spec(package):

Lib/importlib/_common.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from ._adapters import wrap_spec
1313

1414
Package = Union[types.ModuleType, str]
15-
Resource = Union[str, os.PathLike]
1615

1716

1817
def files(package):
@@ -94,7 +93,7 @@ def _tempfile(reader, suffix=''):
9493
finally:
9594
try:
9695
os.remove(raw_path)
97-
except (FileNotFoundError, PermissionError):
96+
except FileNotFoundError:
9897
pass
9998

10099

Lib/importlib/_itertools.py

Lines changed: 0 additions & 19 deletions
This file was deleted.

Lib/importlib/_legacy.py

Lines changed: 0 additions & 84 deletions
This file was deleted.

Lib/importlib/readers.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
import collections
2-
import operator
3-
import pathlib
42
import zipfile
5-
3+
import pathlib
64
from . import abc
75

8-
from ._itertools import unique_everseen
9-
106

117
def remove_duplicates(items):
128
return iter(collections.OrderedDict.fromkeys(items))
@@ -67,8 +63,13 @@ def __init__(self, *paths):
6763
raise NotADirectoryError('MultiplexedPath only supports directories')
6864

6965
def iterdir(self):
70-
files = (file for path in self._paths for file in path.iterdir())
71-
return unique_everseen(files, key=operator.attrgetter('name'))
66+
visited = []
67+
for path in self._paths:
68+
for file in path.iterdir():
69+
if file.name in visited:
70+
continue
71+
visited.append(file.name)
72+
yield file
7273

7374
def read_bytes(self):
7475
raise FileNotFoundError(f'{self} is not a file')

0 commit comments

Comments
 (0)