10000 Merge pull request #297 from python/feature/better-native-reader-support · python/importlib_resources@ec50a15 · GitHub
[go: up one dir, main page]

Skip to content

Commit ec50a15

Browse files
authored
Merge pull request #297 from python/feature/better-native-reader-support
Give precedence to native traversable readers.
2 parents 56bd2b9 + 6d48bc9 commit ec50a15

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

importlib_resources/future/adapters.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,44 @@
1+
import functools
12
import pathlib
23
from contextlib import suppress
34
from types import SimpleNamespace
45

56
from .. import readers, _adapters
67

78

9+
def _block_standard(reader_getter):
10+
"""
11+
Wrap _adapters.TraversableResourcesLoader.get_resource_reader
12+
and intercept any standard library readers.
13+
"""
14+
15+
@functools.wraps(reader_getter)
16+
def wrapper(*args, **kwargs):
17+
"""
18+
If the reader is from the standard library, return None to allow
19+
allow likely newer implementations in this library to take precedence.
20+
"""
21+
try:
22+
reader = reader_getter(*args, **kwargs)
23+
except NotADirectoryError:
24+
# MultiplexedPath may fail on zip subdirectory
25+
return
26+
# Python 3.10+
27+
if reader.__class__.__module__.startswith('importlib.resources.'):
28+
return
29+
# Python 3.8, 3.9
30+
if isinstance(reader, _adapters.CompatibilityFiles) and (
31+
reader.spec.loader.__class__.__module__.startswith('zipimport')
32+
or reader.spec.loader.__class__.__module__.startswith(
33+
'_frozen_importlib_external'
34+
)
35+
):
36+
return
37+
return reader
38+
39+
return wrapper
40+
41+
842
class TraversableResourcesLoader(_adapters.TraversableResourcesLoader):
943
"""
1044
Adapt loaders to provide TraversableResources and other
@@ -15,7 +49,10 @@ class TraversableResourcesLoader(_adapters.TraversableResourcesLoader):
1549
"""
1650

1751
def get_resource_reader(self, name):
18-
return self._standard_reader() or super().get_resource_reader(name)
52+
return (
53+
_block_standard(super().get_resource_reader)(name)
54+
or self._standard_reader()
55+
)
1956

2057
def _standard_reader(self):
2158
return self._zip_reader() or self._namespace_reader() or self._file_reader()

newsfragments/295.feature.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Future compatibility adapters now ensure that standard library readers are replaced without overriding non-standard readers.

0 commit comments

Comments
 (0)
0