test_reader.py 4.8 KB

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