diff --git a/importlib_resources/_compat.py b/importlib_resources/_compat.py index 8d7ade08..a93a8826 100644 --- a/importlib_resources/_compat.py +++ b/importlib_resources/_compat.py @@ -72,9 +72,6 @@ def _file_reader(spec): return readers.FileReader(self) return ( - # native reader if it supplies 'files' - _native_reader(self.spec) - or # local ZipReader if a zip module _zip_reader(self.spec) or @@ -83,8 +80,12 @@ def _file_reader(spec): or # local FileReader _file_reader(self.spec) + or + # native reader if it supplies 'files' + _native_reader(self.spec) + or # fallback - adapt the spec ResourceReader to TraversableReader - or _adapters.CompatibilityFiles(self.spec) + _adapters.CompatibilityFiles(self.spec) ) diff --git a/importlib_resources/tests/test_custom.py b/importlib_resources/tests/test_custom.py new file mode 100644 index 00000000..e85ddd65 --- /dev/null +++ b/importlib_resources/tests/test_custom.py @@ -0,0 +1,45 @@ +import unittest +import contextlib +import pathlib + +import importlib_resources as resources +from ..abc import TraversableResources, ResourceReader +from . import util +from ._compat import os_helper + + +class SimpleLoader: + """ + A simple loader that only implements a resource reader. + """ + + def __init__(self, reader: ResourceReader): + self.reader = reader + + def get_resource_reader(self, package): + return self.reader + + +class MagicResources(TraversableResources): + """ + Magically returns the resources at path. + """ + + def __init__(self, path: pathlib.Path): + self.path = path + + def files(self): + return self.path + + +class CustomTraversableResourcesTests(unittest.TestCase): + def setUp(self): + self.fixtures = contextlib.ExitStack() + self.addCleanup(self.fixtures.close) + + def test_custom_loader(self): + temp_dir = self.fixtures.enter_context(os_helper.temp_dir()) + loader = SimpleLoader(MagicResources(temp_dir)) + pkg = util.create_package_from_loader(loader) + files = resources.files(pkg) + assert files is temp_dir