Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit c5f1bae

Browse filesBrowse files
committed
Move more of the compatibility behavior into _compat, this time allowing for _common.from_package to mirror upstream implementation.
1 parent b85f74a commit c5f1bae
Copy full SHA for c5f1bae

File tree

Expand file treeCollapse file tree

2 files changed

+43
-24
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+43
-24
lines changed

‎importlib_resources/_common.py

Copy file name to clipboardExpand all lines: importlib_resources/_common.py
+4-2Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from ._compat import (
88
Path, FileNotFoundError,
9-
singledispatch, traversable_reader,
9+
singledispatch, package_spec,
1010
)
1111

1212

@@ -15,7 +15,9 @@ def from_package(package):
1515
Return a Traversable object for the given package.
1616
1717
"""
18-
return traversable_reader(package).files()
18+
spec = package_spec(package)
19+
reader = spec.loader.get_resource_reader(spec.name)
20+
return reader.files()
1921

2022

2123
@contextlib.contextmanager

‎importlib_resources/_compat.py

Copy file name to clipboardExpand all lines: importlib_resources/_compat.py
+39-22Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -60,40 +60,57 @@ def runtime_checkable(cls): # type: ignore
6060
Protocol = ABC # type: ignore
6161

6262

63-
class PackageSpec(object):
63+
__metaclass__ = type
64+
65+
66+
class PackageSpec:
6467
def __init__(self, **kwargs):
6568
vars(self).update(kwargs)
6669

6770

71+
class TraversableResourcesAdapter:
72+
def __init__(self, spec):
73+
self.spec = spec
74+
self.loader = LoaderAdapter(self.spec)
75+
76+
def __getattr__(self, name):
77+
return getattr(self.spec, name)
78+
79+
80+
class LoaderAdapter:
81+
"""
82+
Adapt loaders on Python < 3.9 to provide TraversableResources
83+
readers.
84+
"""
85+
def __init__(self, spec):
86+
self.spec = spec
87+
88+
def get_resource_reader(self, name):
89+
from . import readers
90+
try:
91+
reader = self.spec.loader.get_resource_reader(name)
92+
reader.files
93+
except AttributeError:
94+
reader = _zip_reader(self.spec) or readers.FileReader(self.spec)
95+
return reader
96+
97+
98+
def _zip_reader(spec):
99+
from . import readers
100+
with suppress(AttributeError):
101+
return readers.ZipReader(spec)
102+
103+
68104
def package_spec(package):
69105
"""
70106
Construct a minimal package spec suitable for
71107
matching the interfaces this library relies upon
72108
in later Python versions.
73109
"""
74-
return getattr(package, '__spec__', None) or \
110+
spec = getattr(package, '__spec__', None) or \
75111
PackageSpec(
76112
origin=package.__file__,
77113
loader=getattr(package, '__loader__', None),
78114
name=package.__name__,
79115
)
80-
81-
82-
def traversable_reader(package):
83-
"""
84-
For a given package, ensure a TraversableResources.
85-
"""
86-
from . import readers
87-
try:
88-
spec = package_spec(package)
89-
reader = spec.loader.get_resource_reader(spec.name)
90-
reader.files
91-
except AttributeError:
92-
reader = _zip_reader(spec) or readers.FileReader(spec)
93-
return reader
94-
95-
96-
def _zip_reader(spec):
97-
from . import readers
98-
with suppress(AttributeError):
99-
return readers.ZipReader(spec)
116+
return TraversableResourcesAdapter(spec)

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.