1
- import contextlib
1
+ import functools
2
2
import pathlib
3
3
from contextlib import suppress
4
4
from types import SimpleNamespace
5
5
6
6
from .. import readers , _adapters
7
7
8
8
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
+
9
42
class TraversableResourcesLoader (_adapters .TraversableResourcesLoader ):
10
43
"""
11
44
Adapt loaders to provide TraversableResources and other
@@ -16,18 +49,10 @@ class TraversableResourcesLoader(_adapters.TraversableResourcesLoader):
16
49
"""
17
50
18
51
def get_resource_reader (self , name ):
19
- with contextlib .suppress (Exception ):
20
- return self ._block_standard (super ().get_resource_reader (name ))
21
- return self ._standard_reader ()
22
-
23
- def _block_standard (self , reader ):
24
- """
25
- If the reader is from the standard library, raise an exception to
26
- allow likely newer implementations in this library to take precedence.
27
- """
28
- if reader .__class__ .__module__ .startswith ('importlib.resources.' ):
29
- raise RuntimeError ("Reader blocked to be superseded." )
30
- return reader
52
+ return (
53
+ _block_standard (super ().get_resource_reader )(name )
54
+ or self ._standard_reader ()
55
+ )
31
56
32
57
def _standard_reader (self ):
33
58
return self ._zip_reader () or self ._namespace_reader () or self ._file_reader ()
0 commit comments