From 2bd9048421fcf044adb080c738ddbc7b46545168 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Fri, 17 Feb 2023 16:32:57 -0500 Subject: [PATCH 1/3] Add tests capturing expectation of custom loaders. Ref #268. --- importlib_resources/tests/test_custom.py | 45 ++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 importlib_resources/tests/test_custom.py 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 From 68be8b432051731aae620297e42660bd547d5551 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Wed, 5 Oct 2022 16:45:06 -0400 Subject: [PATCH 2/3] Disable native reader even if it supplies files, because it might not have features/fixes present in this library. Fixes #257. --- importlib_resources/_compat.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/importlib_resources/_compat.py b/importlib_resources/_compat.py index 8d7ade08..5dc1f288 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 From 8da2027c506edd294445c93bd810f760696185a3 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Fri, 17 Feb 2023 16:44:54 -0500 Subject: [PATCH 3/3] Give the local zip/namespace/file readers precedence over the native reader. --- importlib_resources/_compat.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/importlib_resources/_compat.py b/importlib_resources/_compat.py index 5dc1f288..a93a8826 100644 --- a/importlib_resources/_compat.py +++ b/importlib_resources/_compat.py @@ -80,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) )