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()