Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions importlib_resources/_adapters.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,9 +160,9 @@ def files(self):
return CompatibilityFiles.SpecPath(self.spec, self._reader)


def wrap_spec(package):
def wrap_spec(spec):
"""
Construct a package spec with traversable compatibility
on the spec/loader/reader.
"""
return SpecLoaderAdapter(package.__spec__, TraversableResourcesLoader)
return SpecLoaderAdapter(spec, TraversableResourcesLoader)
8 changes: 7 additions & 1 deletion importlib_resources/_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,13 @@ def from_package(package: types.ModuleType):
# deferred for performance (python/cpython#109829)
from .future.adapters import wrap_spec

spec = wrap_spec(package)
if package.__spec__ is None:
Comment thread
jaraco marked this conversation as resolved.
Outdated
raise TypeError(
f"Cannot access resources for '{package.__name__ or package!r}' "
"as it does not appear to correspond to an importable module (its __spec__ is None)."
Comment thread
jaraco marked this conversation as resolved.
Outdated
)
Comment thread
jaraco marked this conversation as resolved.
Outdated

spec = wrap_spec(package.__spec__)
reader = spec.loader.get_resource_reader(spec.name)
return reader.files()

Expand Down
13 changes: 13 additions & 0 deletions importlib_resources/tests/test_resource.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import types
import unittest
from importlib import import_module

Expand Down Expand Up @@ -234,5 +235,17 @@ class ResourceFromNamespaceZipTests(
MODULE = 'namespacedata01'


class ResourceFromMainModuleWithNoneSpecTests(unittest.TestCase):
Comment thread
jaraco marked this conversation as resolved.
Outdated
# `__main__.__spec__` can be `None` depending on how it is populated.
# https://docs.python.org/3/reference/import.html#main-spec
Comment thread
jaraco marked this conversation as resolved.
Outdated
def test_main_module_with_none_spec(self):
mainmodule = types.ModuleType("__main__")

self.assertIsNone(mainmodule.__spec__)

with self.assertRaises(TypeError, msg="Cannot access resources for '__main__' as it does not appear to correspond to an importable module (its __spec__ is None)."):
resources.files(mainmodule)


if __name__ == '__main__':
unittest.main()