diff options
author | Brett Cannon <brettcannon@users.noreply.github.com> | 2017-12-16 00:29:35 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-12-16 00:29:35 (GMT) |
commit | 4ac5150e068a3a795ef00465f6dff51747b62b91 (patch) | |
tree | b9e051b66549fae628764ca110a61fc1c153a827 /Lib | |
parent | d2b02310acbfe6c978a8ad3cd3ac8b3f12927442 (diff) | |
download | cpython-4ac5150e068a3a795ef00465f6dff51747b62b91.zip cpython-4ac5150e068a3a795ef00465f6dff51747b62b91.tar.gz cpython-4ac5150e068a3a795ef00465f6dff51747b62b91.tar.bz2 |
bpo-32248: Implement importlib.abc.ResourceReader (GH-4892)
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/importlib/abc.py | 38 | ||||
-rw-r--r-- | Lib/test/test_importlib/test_abc.py | 39 |
2 files changed, 77 insertions, 0 deletions
diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py index d7cadf2..b772db3 100644 --- a/Lib/importlib/abc.py +++ b/Lib/importlib/abc.py @@ -340,3 +340,41 @@ class SourceLoader(_bootstrap_external.SourceLoader, ResourceLoader, ExecutionLo """ _register(SourceLoader, machinery.SourceFileLoader) + + +class ResourceReader(Loader): + + """Abstract base class for loaders to provide resource reading support.""" + + @abc.abstractmethod + def open_resource(self, resource): + """Return an opened, file-like object for binary reading. + + The 'resource' argument is expected to represent only a file name + and thus not contain any subdirectory components. + + If the resource cannot be found, FileNotFoundError is raised. + """ + raise FileNotFoundError + + @abc.abstractmethod + def resource_path(self, resource): + """Return the file system path to the specified resource. + + The 'resource' argument is expected to represent only a file name + and thus not contain any subdirectory components. + + If the resource does not exist on the file system, raise + FileNotFoundError. + """ + raise FileNotFoundError + + @abc.abstractmethod + def is_resource(self, name): + """Return True if the named 'name' is consider a resource.""" + raise FileNotFoundError + + @abc.abstractmethod + def contents(self): + """Return an iterator of strings over the contents of the package.""" + return iter([]) diff --git a/Lib/test/test_importlib/test_abc.py b/Lib/test/test_importlib/test_abc.py index 4ba28c6..f1e1db3 100644 --- a/Lib/test/test_importlib/test_abc.py +++ b/Lib/test/test_importlib/test_abc.py @@ -305,6 +305,45 @@ class ExecutionLoaderDefaultsTests(ABCTestHarness): ) = test_util.test_both(InspectLoaderDefaultsTests) +class ResourceReader: + + def open_resource(self, *args, **kwargs): + return super().open_resource(*args, **kwargs) + + def resource_path(self, *args, **kwargs): + return super().resource_path(*args, **kwargs) + + def is_resource(self, *args, **kwargs): + return super().is_resource(*args, **kwargs) + + def contents(self, *args, **kwargs): + return super().contents(*args, **kwargs) + + +class ResourceReaderDefaultsTests(ABCTestHarness): + + SPLIT = make_abc_subclasses(ResourceReader) + + def test_open_resource(self): + with self.assertRaises(FileNotFoundError): + self.ins.open_resource('dummy_file') + + def test_resource_path(self): + with self.assertRaises(FileNotFoundError): + self.ins.resource_path('dummy_file') + + def test_is_resource(self): + with self.assertRaises(FileNotFoundError): + self.ins.is_resource('dummy_file') + + def test_contents(self): + self.assertEqual([], list(self.ins.contents())) + +(Frozen_RRDefaultTests, + Source_RRDefaultsTests + ) = test_util.test_both(ResourceReaderDefaultsTests) + + ##### MetaPathFinder concrete methods ########################################## class MetaPathFinderFindModuleTests: |