1
+ import functools
1
2
import pathlib
2
3
from contextlib import suppress
3
4
from types import SimpleNamespace
4
5
5
6
from .. import readers , _adapters
6
7
7
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
+
8
42
class TraversableResourcesLoader (_adapters .TraversableResourcesLoader ):
9
43
"""
10
44
Adapt loaders to provide TraversableResources and other
@@ -15,7 +49,10 @@ class TraversableResourcesLoader(_adapters.TraversableResourcesLoader):
15
49
"""
16
50
17
51
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
+ )
19
56
20
57
def _standard_reader (self ):
21
58
return self ._zip_reader () or self ._namespace_reader () or self ._file_reader ()
0 commit comments