1+ import functools
12import pathlib
23from contextlib import suppress
34from types import SimpleNamespace
45
56from .. 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+
842class 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 ()
0 commit comments