python (3.12.0)
1 import os.path
2 import sys
3 import pathlib
4 import unittest
5
6 from importlib import import_module
7 from importlib.readers import MultiplexedPath, NamespaceReader
8
9
10 class ESC[4;38;5;81mMultiplexedPathTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
11 @classmethod
12 def setUpClass(cls):
13 path = pathlib.Path(__file__).parent / 'namespacedata01'
14 cls.folder = str(path)
15
16 def test_init_no_paths(self):
17 with self.assertRaises(FileNotFoundError):
18 MultiplexedPath()
19
20 def test_init_file(self):
21 with self.assertRaises(NotADirectoryError):
22 MultiplexedPath(os.path.join(self.folder, 'binary.file'))
23
24 def test_iterdir(self):
25 contents = {path.name for path in MultiplexedPath(self.folder).iterdir()}
26 try:
27 contents.remove('__pycache__')
28 except (KeyError, ValueError):
29 pass
30 self.assertEqual(contents, {'binary.file', 'utf-16.file', 'utf-8.file'})
31
32 def test_iterdir_duplicate(self):
33 data01 = os.path.abspath(os.path.join(__file__, '..', 'data01'))
34 contents = {
35 path.name for path in MultiplexedPath(self.folder, data01).iterdir()
36 }
37 for remove in ('__pycache__', '__init__.pyc'):
38 try:
39 contents.remove(remove)
40 except (KeyError, ValueError):
41 pass
42 self.assertEqual(
43 contents,
44 {'__init__.py', 'binary.file', 'subdirectory', 'utf-16.file', 'utf-8.file'},
45 )
46
47 def test_is_dir(self):
48 self.assertEqual(MultiplexedPath(self.folder).is_dir(), True)
49
50 def test_is_file(self):
51 self.assertEqual(MultiplexedPath(self.folder).is_file(), False)
52
53 def test_open_file(self):
54 path = MultiplexedPath(self.folder)
55 with self.assertRaises(FileNotFoundError):
56 path.read_bytes()
57 with self.assertRaises(FileNotFoundError):
58 path.read_text()
59 with self.assertRaises(FileNotFoundError):
60 path.open()
61
62 def test_join_path(self):
63 prefix = os.path.abspath(os.path.join(__file__, '..'))
64 data01 = os.path.join(prefix, 'data01')
65 path = MultiplexedPath(self.folder, data01)
66 self.assertEqual(
67 str(path.joinpath('binary.file'))[len(prefix) + 1 :],
68 os.path.join('namespacedata01', 'binary.file'),
69 )
70 self.assertEqual(
71 str(path.joinpath('subdirectory'))[len(prefix) + 1 :],
72 os.path.join('data01', 'subdirectory'),
73 )
74 self.assertEqual(
75 str(path.joinpath('imaginary'))[len(prefix) + 1 :],
76 os.path.join('namespacedata01', 'imaginary'),
77 )
78 self.assertEqual(path.joinpath(), path)
79
80 def test_join_path_compound(self):
81 path = MultiplexedPath(self.folder)
82 assert not path.joinpath('imaginary/foo.py').exists()
83
84 def test_join_path_common_subdir(self):
85 prefix = os.path.abspath(os.path.join(__file__, '..'))
86 data01 = os.path.join(prefix, 'data01')
87 data02 = os.path.join(prefix, 'data02')
88 path = MultiplexedPath(data01, data02)
89 self.assertIsInstance(path.joinpath('subdirectory'), MultiplexedPath)
90 self.assertEqual(
91 str(path.joinpath('subdirectory', 'subsubdir'))[len(prefix) + 1 :],
92 os.path.join('data02', 'subdirectory', 'subsubdir'),
93 )
94
95 def test_repr(self):
96 self.assertEqual(
97 repr(MultiplexedPath(self.folder)),
98 f"MultiplexedPath('{self.folder}')",
99 )
100
101 def test_name(self):
102 self.assertEqual(
103 MultiplexedPath(self.folder).name,
104 os.path.basename(self.folder),
105 )
106
107
108 class ESC[4;38;5;81mNamespaceReaderTest(ESC[4;38;5;149munittestESC[4;38;5;149m.ESC[4;38;5;149mTestCase):
109 site_dir = str(pathlib.Path(__file__).parent)
110
111 @classmethod
112 def setUpClass(cls):
113 sys.path.append(cls.site_dir)
114
115 @classmethod
116 def tearDownClass(cls):
117 sys.path.remove(cls.site_dir)
118
119 def test_init_error(self):
120 with self.assertRaises(ValueError):
121 NamespaceReader(['path1', 'path2'])
122
123 def test_resource_path(self):
124 namespacedata01 = import_module('namespacedata01')
125 reader = NamespaceReader(namespacedata01.__spec__.submodule_search_locations)
126
127 root = os.path.abspath(os.path.join(__file__, '..', 'namespacedata01'))
128 self.assertEqual(
129 reader.resource_path('binary.file'), os.path.join(root, 'binary.file')
130 )
131 self.assertEqual(
132 reader.resource_path('imaginary'), os.path.join(root, 'imaginary')
133 )
134
135 def test_files(self):
136 namespacedata01 = import_module('namespacedata01')
137 reader = NamespaceReader(namespacedata01.__spec__.submodule_search_locations)
138 root = os.path.abspath(os.path.join(__file__, '..', 'namespacedata01'))
139 self.assertIsInstance(reader.files(), MultiplexedPath)
140 self.assertEqual(repr(reader.files()), f"MultiplexedPath('{root}')")
141
142
143 if __name__ == '__main__':
144 unittest.main()