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 b85f74a

Browse filesBrowse files
committed
Move more of the compatibility behavior into _compat.
1 parent 66b5337 commit b85f74a
Copy full SHA for b85f74a

File tree

3 files changed

+42
-37
lines changed
Filter options

3 files changed

+42
-37
lines changed

‎importlib_resources/_common.py

Copy file name to clipboardExpand all lines: importlib_resources/_common.py
+3-24Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import contextlib
66

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

1212

@@ -15,28 +15,7 @@ def from_package(package):
1515
Return a Traversable object for the given package.
1616
1717
"""
18-
spec = package_spec(package)
19-
return from_traversable_resources(spec) or fallback_resources(spec)
20-
21-
22-
def from_traversable_resources(spec):
23-
"""
24-
If the spec.loader implements TraversableResources,
25-
directly or implicitly, it will have a ``files()`` method.
26-
"""
27-
with suppress(AttributeError):
28-
return spec.loader.files()
29-
30-
31-
def fallback_resources(spec):
32-
package_directory = Path(spec.origin).parent
33-
try:
34-
archive_path = spec.loader.archive
35-
rel_path = package_directory.relative_to(archive_path)
36-
return ZipPath(archive_path, str(rel_path) + '/')
37-
except Exception:
38-
pass
39-
return package_directory
18+
return traversable_reader(package).files()
4019

4120

4221
@contextlib.contextmanager

‎importlib_resources/_compat.py

Copy file name to clipboardExpand all lines: importlib_resources/_compat.py
+33-7Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,39 @@ def runtime_checkable(cls): # type: ignore
6161

6262

6363
class PackageSpec(object):
64-
def __init__(self, **kwargs):
65-
vars(self).update(kwargs)
64+
def __init__(self, **kwargs):
65+
vars(self).update(kwargs)
6666

6767

6868
def package_spec(package):
69-
return getattr(package, '__spec__', None) or \
70-
PackageSpec(
71-
origin=package.__file__,
72-
loader=getattr(package, '__loader__', None),
73-
)
69+
"""
70+
Construct a minimal package spec suitable for
71+
matching the interfaces this library relies upon
72+
in later Python versions.
73+
"""
74+
return getattr(package, '__spec__', None) or \
75+
PackageSpec(
76+
origin=package.__file__,
77+
loader=getattr(package, '__loader__', None),
78+
name=package.__name__,
79+
)
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)

‎importlib_resources/readers.py

Copy file name to clipboardExpand all lines: importlib_resources/readers.py
+6-6Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,18 @@
44

55

66
class FileReader(abc.TraversableResources):
7-
def __init__(self, loader):
8-
self.path = Path(loader.path).parent
7+
def __init__(self, spec):
8+
self.path = Path(spec.origin).parent
99

1010
def files(self):
1111
return self.path
1212

1313

1414
class ZipReader(FileReader):
15-
def __init__(self, loader, module):
16-
_, _, name = module.rpartition('.')
17-
prefix = loader.prefix.replace('\\', '/') + name + '/'
18-
self.path = ZipPath(loader.archive, prefix)
15+
def __init__(self, spec):
16+
_, _, name = spec.name.rpartition('.')
17+
prefix = spec.loader.prefix.replace('\\', '/') + name + '/'
18+
self.path = ZipPath(spec.loader.archive, prefix)
1919

2020
def open_resource(self, resource):
2121
try:

0 commit comments

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