Skip to content

Commit d95ab35

Browse files
test: Add tests for importlib.resources.simple module
Add tests for ResourceContainer and ResourceHandle classes to verify: - ResourceContainer instantiation with name property - ResourceContainer.iterdir() calling resources() method - ResourceHandle.joinpath() accepting *descendants parameter - ResourceHandle.iterdir() returning empty iterator - ResourceHandle name as property instead of instance variable Also fix ResourceHandle.name to be a property to satisfy Traversable abstract base class requirements.
1 parent b3b1772 commit d95ab35

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed

Lib/importlib/resources/simple.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,11 @@ class ResourceHandle(Traversable):
8181

8282
def __init__(self, parent: ResourceContainer, name: str):
8383
self.parent = parent
84-
self.name = name # type: ignore[misc]
84+
self._name = name
85+
86+
@property
87+
def name(self):
88+
return self._name
8589

8690
def is_file(self):
8791
return True

Lib/test/test_importlib/resources/test_reader.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import io
12
import os.path
23
import pathlib
34
import unittest
45

56
from importlib import import_module
67
from importlib.readers import MultiplexedPath, NamespaceReader
8+
from importlib.resources.simple import ResourceContainer, ResourceHandle, SimpleReader
79

810
from . import util
911

@@ -133,5 +135,67 @@ def test_files(self):
133135
self.assertEqual(repr(reader.files()), f"MultiplexedPath('{root}')")
134136

135137

138+
class SimpleReaderTest(unittest.TestCase):
139+
def test_resource_container_instantiation(self):
140+
class R(SimpleReader):
141+
@property
142+
def package(self):
143+
return 'x'
144+
145+
def children(self):
146+
return []
147+
148+
def resources(self):
149+
return []
150+
151+
def open_binary(self, r):
152+
return io.BytesIO(b'')
153+
154+
container = ResourceContainer(R())
155+
self.assertEqual(container.name, 'x')
156+
self.assertTrue(container.is_dir())
157+
158+
def test_resource_container_iterdir(self):
159+
class R(SimpleReader):
160+
@property
161+
def package(self):
162+
return 'test'
163+
164+
def children(self):
165+
return []
166+
167+
def resources(self):
168+
return ['file.txt']
169+
170+
def open_binary(self, r):
171+
return io.BytesIO(b'data')
172+
173+
container = ResourceContainer(R())
174+
items = list(container.iterdir())
175+
self.assertEqual(len(items), 1)
176+
self.assertIsInstance(items[0], ResourceHandle)
177+
178+
def test_resource_handle_joinpath(self):
179+
class R(SimpleReader):
180+
@property
181+
def package(self):
182+
return 'test'
183+
184+
def children(self):
185+
return []
186+
187+
def resources(self):
188+
return []
189+
190+
def open_binary(self, r):
191+
return io.BytesIO(b'')
192+
193+
container = ResourceContainer(R())
194+
handle = ResourceHandle(container, 'file.txt')
195+
self.assertIs(handle.joinpath(), handle)
196+
with self.assertRaises(RuntimeError):
197+
handle.joinpath('subpath')
198+
199+
136200
if __name__ == '__main__':
137201
unittest.main()

0 commit comments

Comments
 (0)