def test_http_backend(self): http_backend = FileClient('http') img_url = 'https://raw.githubusercontent.com/open-mmlab/mmcv/' \ 'master/tests/data/color.jpg' text_url = 'https://raw.githubusercontent.com/open-mmlab/mmcv/' \ 'master/tests/data/filelist.txt' # input is path or Path object with pytest.raises(Exception): http_backend.get(self.img_path) with pytest.raises(Exception): http_backend.get(str(self.img_path)) with pytest.raises(Exception): http_backend.get_text(self.text_path) with pytest.raises(Exception): http_backend.get_text(str(self.text_path)) # input url is http image img_bytes = http_backend.get(img_url) img = mmcv.imfrombytes(img_bytes) assert img.shape == self.img_shape # input url is http text value_buf = http_backend.get_text(text_url) assert self.text_path.open('r').read() == value_buf
def test_petrel_backend(self): petrel_backend = FileClient('petrel') # input path is Path object with pytest.raises(NotImplementedError): petrel_backend.get_text(self.text_path) # input path is str with pytest.raises(NotImplementedError): petrel_backend.get_text(str(self.text_path)) # input path is Path object img_bytes = petrel_backend.get(self.img_path) img = mmcv.imfrombytes(img_bytes) assert img.shape == self.img_shape # input path is str img_bytes = petrel_backend.get(str(self.img_path)) img = mmcv.imfrombytes(img_bytes) assert img.shape == self.img_shape # `path_mapping` is either None or dict with pytest.raises(AssertionError): FileClient('petrel', path_mapping=1) # test `path_mapping` petrel_path = 's3://user/data' petrel_backend = FileClient( 'petrel', path_mapping={str(self.test_data_dir): petrel_path}) petrel_backend.client._client.Get = MagicMock( return_value=petrel_backend.client._client.Get(self.img_path)) img_bytes = petrel_backend.get(self.img_path) img = mmcv.imfrombytes(img_bytes) assert img.shape == self.img_shape petrel_backend.client._client.Get.assert_called_with( str(self.img_path).replace(str(self.test_data_dir), petrel_path))
def test_http_backend(self, backend, prefix): http_backend = FileClient(backend=backend, prefix=prefix) img_url = 'https://raw.githubusercontent.com/open-mmlab/mmcv/' \ 'master/tests/data/color.jpg' text_url = 'https://raw.githubusercontent.com/open-mmlab/mmcv/' \ 'master/tests/data/filelist.txt' # test `allow_symlink` attribute assert not http_backend.allow_symlink # input is path or Path object with pytest.raises(Exception): http_backend.get(self.img_path) with pytest.raises(Exception): http_backend.get(str(self.img_path)) with pytest.raises(Exception): http_backend.get_text(self.text_path) with pytest.raises(Exception): http_backend.get_text(str(self.text_path)) # input url is http image img_bytes = http_backend.get(img_url) img = mmcv.imfrombytes(img_bytes) assert img.shape == self.img_shape # input url is http text value_buf = http_backend.get_text(text_url) assert self.text_path.open('r').read() == value_buf # test `_get_local_path` # exist the with block and path will be released with http_backend.get_local_path(img_url) as path: assert mmcv.imread(path).shape == self.img_shape assert not osp.isfile(path)
def test_ceph_backend(self): ceph_backend = FileClient('ceph') # input path is Path object with pytest.raises(NotImplementedError): ceph_backend.get_text(self.text_path) # input path is str with pytest.raises(NotImplementedError): ceph_backend.get_text(str(self.text_path)) # input path is Path object img_bytes = ceph_backend.get(self.img_path) img = mmcv.imfrombytes(img_bytes) assert img.shape == self.img_shape # input path is str img_bytes = ceph_backend.get(str(self.img_path)) img = mmcv.imfrombytes(img_bytes) assert img.shape == self.img_shape
def test_memcached_backend(self): mc_cfg = dict(server_list_cfg='', client_cfg='', sys_path=None) mc_backend = FileClient('memcached', **mc_cfg) # input path is Path object with pytest.raises(NotImplementedError): mc_backend.get_text(self.text_path) # input path is str with pytest.raises(NotImplementedError): mc_backend.get_text(str(self.text_path)) # input path is Path object img_bytes = mc_backend.get(self.img_path) img = mmcv.imfrombytes(img_bytes) assert img.shape == self.img_shape # input path is str img_bytes = mc_backend.get(str(self.img_path)) img = mmcv.imfrombytes(img_bytes) assert img.shape == self.img_shape
def test_disk_backend(self): disk_backend = FileClient('disk') # input path is Path object img_bytes = disk_backend.get(self.img_path) img = mmcv.imfrombytes(img_bytes) assert self.img_path.open('rb').read() == img_bytes assert img.shape == self.img_shape # input path is str img_bytes = disk_backend.get(str(self.img_path)) img = mmcv.imfrombytes(img_bytes) assert self.img_path.open('rb').read() == img_bytes assert img.shape == self.img_shape # input path is Path object value_buf = disk_backend.get_text(self.text_path) assert self.text_path.open('r').read() == value_buf # input path is str value_buf = disk_backend.get_text(str(self.text_path)) assert self.text_path.open('r').read() == value_buf
def test_lmdb_backend(self): lmdb_path = self.test_data_dir / 'demo.lmdb' # db_path is Path object lmdb_backend = FileClient('lmdb', db_path=lmdb_path) with pytest.raises(NotImplementedError): lmdb_backend.get_text(self.text_path) img_bytes = lmdb_backend.get('baboon') img = mmcv.imfrombytes(img_bytes) assert img.shape == (120, 125, 3) # db_path is str lmdb_backend = FileClient('lmdb', db_path=str(lmdb_path)) with pytest.raises(NotImplementedError): lmdb_backend.get_text(str(self.text_path)) img_bytes = lmdb_backend.get('baboon') img = mmcv.imfrombytes(img_bytes) assert img.shape == (120, 125, 3)
def test_ceph_backend(self): with pytest.warns(Warning, match='Ceph is deprecate in favor of Petrel.'): FileClient('ceph') ceph_backend = FileClient('ceph') # input path is Path object with pytest.raises(NotImplementedError): ceph_backend.get_text(self.text_path) # input path is str with pytest.raises(NotImplementedError): ceph_backend.get_text(str(self.text_path)) # input path is Path object img_bytes = ceph_backend.get(self.img_path) img = mmcv.imfrombytes(img_bytes) assert img.shape == self.img_shape # input path is str img_bytes = ceph_backend.get(str(self.img_path)) img = mmcv.imfrombytes(img_bytes) assert img.shape == self.img_shape # `path_mapping` is either None or dict with pytest.raises(AssertionError): FileClient('ceph', path_mapping=1) # test `path_mapping` ceph_path = 's3://user/data' ceph_backend = FileClient( 'ceph', path_mapping={str(self.test_data_dir): ceph_path}) ceph_backend.client._client.Get = MagicMock( return_value=ceph_backend.client._client.Get(self.img_path)) img_bytes = ceph_backend.get(self.img_path) img = mmcv.imfrombytes(img_bytes) assert img.shape == self.img_shape ceph_backend.client._client.Get.assert_called_with( str(self.img_path).replace(str(self.test_data_dir), ceph_path))
def test_ceph_backend(self): ceph_backend = FileClient('ceph') # test `allow_symlink` attribute assert not ceph_backend.allow_symlink # input path is Path object with pytest.raises(NotImplementedError): ceph_backend.get_text(self.text_path) # input path is str with pytest.raises(NotImplementedError): ceph_backend.get_text(str(self.text_path)) # input path is Path object img_bytes = ceph_backend.get(self.img_path) img = mmcv.imfrombytes(img_bytes) assert img.shape == self.img_shape # input path is str img_bytes = ceph_backend.get(str(self.img_path)) img = mmcv.imfrombytes(img_bytes) assert img.shape == self.img_shape # `path_mapping` is either None or dict with pytest.raises(AssertionError): FileClient('ceph', path_mapping=1) # test `path_mapping` ceph_path = 's3://user/data' ceph_backend = FileClient( 'ceph', path_mapping={str(self.test_data_dir): ceph_path}) ceph_backend.client._client.Get = MagicMock( return_value=ceph_backend.client._client.Get(self.img_path)) img_bytes = ceph_backend.get(self.img_path) img = mmcv.imfrombytes(img_bytes) assert img.shape == self.img_shape ceph_backend.client._client.Get.assert_called_with( str(self.img_path).replace(str(self.test_data_dir), ceph_path))
def test_register_backend(self): with pytest.raises(TypeError): class TestClass1(object): pass FileClient.register_backend('TestClass1', TestClass1) with pytest.raises(TypeError): FileClient.register_backend('int', 0) class ExampleBackend(BaseStorageBackend): def get(self, filepath): return filepath def get_text(self, filepath): return filepath FileClient.register_backend('example', ExampleBackend) example_backend = FileClient('example') assert example_backend.get(self.img_path) == self.img_path assert example_backend.get_text(self.text_path) == self.text_path assert 'example' in FileClient._backends
def test_register_backend(self): # name must be a string with pytest.raises(TypeError): class TestClass1(object): pass FileClient.register_backend(1, TestClass1) # module must be a class with pytest.raises(TypeError): FileClient.register_backend('int', 0) # module must be a subclass of BaseStorageBackend with pytest.raises(TypeError): class TestClass1(object): pass FileClient.register_backend('TestClass1', TestClass1) class ExampleBackend(BaseStorageBackend): def get(self, filepath): return filepath def get_text(self, filepath): return filepath FileClient.register_backend('example', ExampleBackend) example_backend = FileClient('example') assert example_backend.get(self.img_path) == self.img_path assert example_backend.get_text(self.text_path) == self.text_path assert 'example' in FileClient._backends class Example2Backend(BaseStorageBackend): def get(self, filepath): return 'bytes2' def get_text(self, filepath): return 'text2' # force=False with pytest.raises(KeyError): FileClient.register_backend('example', Example2Backend) FileClient.register_backend('example', Example2Backend, force=True) example_backend = FileClient('example') assert example_backend.get(self.img_path) == 'bytes2' assert example_backend.get_text(self.text_path) == 'text2' @FileClient.register_backend(name='example3') class Example3Backend(BaseStorageBackend): def get(self, filepath): return 'bytes3' def get_text(self, filepath): return 'text3' example_backend = FileClient('example3') assert example_backend.get(self.img_path) == 'bytes3' assert example_backend.get_text(self.text_path) == 'text3' assert 'example3' in FileClient._backends # force=False with pytest.raises(KeyError): @FileClient.register_backend(name='example3') class Example4Backend(BaseStorageBackend): def get(self, filepath): return 'bytes4' def get_text(self, filepath): return 'text4' @FileClient.register_backend(name='example3', force=True) class Example5Backend(BaseStorageBackend): def get(self, filepath): return 'bytes5' def get_text(self, filepath): return 'text5' example_backend = FileClient('example3') assert example_backend.get(self.img_path) == 'bytes5' assert example_backend.get_text(self.text_path) == 'text5'
def test_register_backend(self): # name must be a string with pytest.raises(TypeError): class TestClass1: pass FileClient.register_backend(1, TestClass1) # module must be a class with pytest.raises(TypeError): FileClient.register_backend('int', 0) # module must be a subclass of BaseStorageBackend with pytest.raises(TypeError): class TestClass1: pass FileClient.register_backend('TestClass1', TestClass1) class ExampleBackend(BaseStorageBackend): def get(self, filepath): return filepath def get_text(self, filepath, encoding='utf-8'): return filepath FileClient.register_backend('example', ExampleBackend) example_backend = FileClient('example') assert example_backend.get(self.img_path) == self.img_path assert example_backend.get_text(self.text_path) == self.text_path assert 'example' in FileClient._backends class Example2Backend(BaseStorageBackend): def get(self, filepath): return b'bytes2' def get_text(self, filepath, encoding='utf-8'): return 'text2' # force=False with pytest.raises(KeyError): FileClient.register_backend('example', Example2Backend) FileClient.register_backend('example', Example2Backend, force=True) example_backend = FileClient('example') assert example_backend.get(self.img_path) == b'bytes2' assert example_backend.get_text(self.text_path) == 'text2' @FileClient.register_backend(name='example3') class Example3Backend(BaseStorageBackend): def get(self, filepath): return b'bytes3' def get_text(self, filepath, encoding='utf-8'): return 'text3' example_backend = FileClient('example3') assert example_backend.get(self.img_path) == b'bytes3' assert example_backend.get_text(self.text_path) == 'text3' assert 'example3' in FileClient._backends # force=False with pytest.raises(KeyError): @FileClient.register_backend(name='example3') class Example4Backend(BaseStorageBackend): def get(self, filepath): return b'bytes4' def get_text(self, filepath, encoding='utf-8'): return 'text4' @FileClient.register_backend(name='example3', force=True) class Example5Backend(BaseStorageBackend): def get(self, filepath): return b'bytes5' def get_text(self, filepath, encoding='utf-8'): return 'text5' example_backend = FileClient('example3') assert example_backend.get(self.img_path) == b'bytes5' assert example_backend.get_text(self.text_path) == 'text5' # prefixes is a str class Example6Backend(BaseStorageBackend): def get(self, filepath): return b'bytes6' def get_text(self, filepath, encoding='utf-8'): return 'text6' FileClient.register_backend('example4', Example6Backend, force=True, prefixes='example4_prefix') example_backend = FileClient('example4') assert example_backend.get(self.img_path) == b'bytes6' assert example_backend.get_text(self.text_path) == 'text6' example_backend = FileClient(prefix='example4_prefix') assert example_backend.get(self.img_path) == b'bytes6' assert example_backend.get_text(self.text_path) == 'text6' example_backend = FileClient('example4', prefix='example4_prefix') assert example_backend.get(self.img_path) == b'bytes6' assert example_backend.get_text(self.text_path) == 'text6' # prefixes is a list of str class Example7Backend(BaseStorageBackend): def get(self, filepath): return b'bytes7' def get_text(self, filepath, encoding='utf-8'): return 'text7' FileClient.register_backend( 'example5', Example7Backend, force=True, prefixes=['example5_prefix1', 'example5_prefix2']) example_backend = FileClient('example5') assert example_backend.get(self.img_path) == b'bytes7' assert example_backend.get_text(self.text_path) == 'text7' example_backend = FileClient(prefix='example5_prefix1') assert example_backend.get(self.img_path) == b'bytes7' assert example_backend.get_text(self.text_path) == 'text7' example_backend = FileClient(prefix='example5_prefix2') assert example_backend.get(self.img_path) == b'bytes7' assert example_backend.get_text(self.text_path) == 'text7' # backend has a higher priority than prefixes class Example8Backend(BaseStorageBackend): def get(self, filepath): return b'bytes8' def get_text(self, filepath, encoding='utf-8'): return 'text8' FileClient.register_backend('example6', Example8Backend, force=True, prefixes='example6_prefix') example_backend = FileClient('example6') assert example_backend.get(self.img_path) == b'bytes8' assert example_backend.get_text(self.text_path) == 'text8' example_backend = FileClient('example6', prefix='example4_prefix') assert example_backend.get(self.img_path) == b'bytes8' assert example_backend.get_text(self.text_path) == 'text8'
def test_petrel_backend(self, backend, prefix): petrel_backend = FileClient(backend=backend, prefix=prefix) # test `allow_symlink` attribute assert not petrel_backend.allow_symlink # input path is Path object img_bytes = petrel_backend.get(self.img_path) img = mmcv.imfrombytes(img_bytes) assert img.shape == self.img_shape # input path is str img_bytes = petrel_backend.get(str(self.img_path)) img = mmcv.imfrombytes(img_bytes) assert img.shape == self.img_shape # `path_mapping` is either None or dict with pytest.raises(AssertionError): FileClient('petrel', path_mapping=1) # test `_map_path` petrel_dir = 's3://user/data' petrel_backend = FileClient( 'petrel', path_mapping={str(self.test_data_dir): petrel_dir}) assert petrel_backend.client._map_path(str(self.img_path)) == \ str(self.img_path).replace(str(self.test_data_dir), petrel_dir) petrel_path = f'{petrel_dir}/test.jpg' petrel_backend = FileClient('petrel') # test `_format_path` assert petrel_backend.client._format_path('s3://user\\data\\test.jpg')\ == petrel_path # test `get` with patch.object(petrel_backend.client._client, 'Get', return_value=b'petrel') as mock_get: assert petrel_backend.get(petrel_path) == b'petrel' mock_get.assert_called_once_with(petrel_path) # test `get_text` with patch.object(petrel_backend.client._client, 'Get', return_value=b'petrel') as mock_get: assert petrel_backend.get_text(petrel_path) == 'petrel' mock_get.assert_called_once_with(petrel_path) # test `put` with patch.object(petrel_backend.client._client, 'put') as mock_put: petrel_backend.put(b'petrel', petrel_path) mock_put.assert_called_once_with(petrel_path, b'petrel') # test `put_text` with patch.object(petrel_backend.client._client, 'put') as mock_put: petrel_backend.put_text('petrel', petrel_path) mock_put.assert_called_once_with(petrel_path, b'petrel') # test `remove` assert has_method(petrel_backend.client._client, 'delete') # raise Exception if `delete` is not implemented with delete_and_reset_method(petrel_backend.client._client, 'delete'): assert not has_method(petrel_backend.client._client, 'delete') with pytest.raises(NotImplementedError): petrel_backend.remove(petrel_path) with patch.object(petrel_backend.client._client, 'delete') as mock_delete: petrel_backend.remove(petrel_path) mock_delete.assert_called_once_with(petrel_path) # test `exists` assert has_method(petrel_backend.client._client, 'contains') assert has_method(petrel_backend.client._client, 'isdir') # raise Exception if `delete` is not implemented with delete_and_reset_method(petrel_backend.client._client, 'contains'), delete_and_reset_method( petrel_backend.client._client, 'isdir'): assert not has_method(petrel_backend.client._client, 'contains') assert not has_method(petrel_backend.client._client, 'isdir') with pytest.raises(NotImplementedError): petrel_backend.exists(petrel_path) with patch.object(petrel_backend.client._client, 'contains', return_value=True) as mock_contains: assert petrel_backend.exists(petrel_path) mock_contains.assert_called_once_with(petrel_path) # test `isdir` assert has_method(petrel_backend.client._client, 'isdir') with delete_and_reset_method(petrel_backend.client._client, 'isdir'): assert not has_method(petrel_backend.client._client, 'isdir') with pytest.raises(NotImplementedError): petrel_backend.isdir(petrel_path) with patch.object(petrel_backend.client._client, 'isdir', return_value=True) as mock_isdir: assert petrel_backend.isdir(petrel_dir) mock_isdir.assert_called_once_with(petrel_dir) # test `isfile` assert has_method(petrel_backend.client._client, 'contains') with delete_and_reset_method(petrel_backend.client._client, 'contains'): assert not has_method(petrel_backend.client._client, 'contains') with pytest.raises(NotImplementedError): petrel_backend.isfile(petrel_path) with patch.object(petrel_backend.client._client, 'contains', return_value=True) as mock_contains: assert petrel_backend.isfile(petrel_path) mock_contains.assert_called_once_with(petrel_path) # test `join_path` assert petrel_backend.join_path(petrel_dir, 'file') == \ f'{petrel_dir}/file' assert petrel_backend.join_path(f'{petrel_dir}/', 'file') == \ f'{petrel_dir}/file' assert petrel_backend.join_path(petrel_dir, 'dir', 'file') == \ f'{petrel_dir}/dir/file' # test `get_local_path` with patch.object(petrel_backend.client._client, 'Get', return_value=b'petrel') as mock_get, \ patch.object(petrel_backend.client._client, 'contains', return_value=True) as mock_contains: with petrel_backend.get_local_path(petrel_path) as path: assert Path(path).open('rb').read() == b'petrel' # exist the with block and path will be released assert not osp.isfile(path) mock_get.assert_called_once_with(petrel_path) mock_contains.assert_called_once_with(petrel_path) # test `list_dir_or_file` assert has_method(petrel_backend.client._client, 'list') with delete_and_reset_method(petrel_backend.client._client, 'list'): assert not has_method(petrel_backend.client._client, 'list') with pytest.raises(NotImplementedError): list(petrel_backend.list_dir_or_file(petrel_dir)) with build_temporary_directory() as tmp_dir: # 1. list directories and files assert set(petrel_backend.list_dir_or_file(tmp_dir)) == set( ['dir1', 'dir2', 'text1.txt', 'text2.txt']) # 2. list directories and files recursively assert set(petrel_backend.list_dir_or_file( tmp_dir, recursive=True)) == set([ 'dir1', '/'.join(('dir1', 'text3.txt')), 'dir2', '/'.join( ('dir2', 'dir3')), '/'.join( ('dir2', 'dir3', 'text4.txt')), '/'.join( ('dir2', 'img.jpg')), 'text1.txt', 'text2.txt' ]) # 3. only list directories assert set( petrel_backend.list_dir_or_file( tmp_dir, list_file=False)) == set(['dir1', 'dir2']) with pytest.raises( TypeError, match=('`list_dir` should be False when `suffix` is not ' 'None')): # Exception is raised among the `list_dir_or_file` of client, # so we need to invode the client to trigger the exception petrel_backend.client.list_dir_or_file(tmp_dir, list_file=False, suffix='.txt') # 4. only list directories recursively assert set( petrel_backend.list_dir_or_file(tmp_dir, list_file=False, recursive=True)) == set([ 'dir1', 'dir2', '/'.join( ('dir2', 'dir3')) ]) # 5. only list files assert set(petrel_backend.list_dir_or_file( tmp_dir, list_dir=False)) == set(['text1.txt', 'text2.txt']) # 6. only list files recursively assert set( petrel_backend.list_dir_or_file( tmp_dir, list_dir=False, recursive=True)) == set([ '/'.join(('dir1', 'text3.txt')), '/'.join( ('dir2', 'dir3', 'text4.txt')), '/'.join( ('dir2', 'img.jpg')), 'text1.txt', 'text2.txt' ]) # 7. only list files ending with suffix assert set( petrel_backend.list_dir_or_file(tmp_dir, list_dir=False, suffix='.txt')) == set( ['text1.txt', 'text2.txt']) assert set( petrel_backend.list_dir_or_file( tmp_dir, list_dir=False, suffix=('.txt', '.jpg'))) == set(['text1.txt', 'text2.txt']) with pytest.raises( TypeError, match='`suffix` must be a string or tuple of strings'): petrel_backend.client.list_dir_or_file(tmp_dir, list_dir=False, suffix=['.txt', '.jpg']) # 8. only list files ending with suffix recursively assert set( petrel_backend.list_dir_or_file(tmp_dir, list_dir=False, suffix='.txt', recursive=True)) == set([ '/'.join( ('dir1', 'text3.txt')), '/'.join(('dir2', 'dir3', 'text4.txt')), 'text1.txt', 'text2.txt' ]) # 7. only list files ending with suffix assert set( petrel_backend.list_dir_or_file( tmp_dir, list_dir=False, suffix=('.txt', '.jpg'), recursive=True)) == set([ '/'.join(('dir1', 'text3.txt')), '/'.join( ('dir2', 'dir3', 'text4.txt')), '/'.join( ('dir2', 'img.jpg')), 'text1.txt', 'text2.txt' ])
def test_disk_backend(self): disk_backend = FileClient('disk') # test `name` attribute assert disk_backend.name == 'HardDiskBackend' # test `allow_symlink` attribute assert disk_backend.allow_symlink # test `get` # input path is Path object img_bytes = disk_backend.get(self.img_path) img = mmcv.imfrombytes(img_bytes) assert self.img_path.open('rb').read() == img_bytes assert img.shape == self.img_shape # input path is str img_bytes = disk_backend.get(str(self.img_path)) img = mmcv.imfrombytes(img_bytes) assert self.img_path.open('rb').read() == img_bytes assert img.shape == self.img_shape # test `get_text` # input path is Path object value_buf = disk_backend.get_text(self.text_path) assert self.text_path.open('r').read() == value_buf # input path is str value_buf = disk_backend.get_text(str(self.text_path)) assert self.text_path.open('r').read() == value_buf with tempfile.TemporaryDirectory() as tmp_dir: # test `put` filepath1 = Path(tmp_dir) / 'test.jpg' disk_backend.put(b'disk', filepath1) assert filepath1.open('rb').read() == b'disk' # test the `mkdir_or_exist` behavior in `put` _filepath1 = Path(tmp_dir) / 'not_existed_dir1' / 'test.jpg' disk_backend.put(b'disk', _filepath1) assert _filepath1.open('rb').read() == b'disk' # test `put_text` filepath2 = Path(tmp_dir) / 'test.txt' disk_backend.put_text('disk', filepath2) assert filepath2.open('r').read() == 'disk' # test the `mkdir_or_exist` behavior in `put_text` _filepath2 = Path(tmp_dir) / 'not_existed_dir2' / 'test.txt' disk_backend.put_text('disk', _filepath2) assert _filepath2.open('r').read() == 'disk' # test `isfile` assert disk_backend.isfile(filepath2) assert not disk_backend.isfile(Path(tmp_dir) / 'not/existed/path') # test `remove` disk_backend.remove(filepath2) # test `exists` assert not disk_backend.exists(filepath2) # test `get_local_path` # if the backend is disk, `get_local_path` just return the input with disk_backend.get_local_path(filepath1) as path: assert str(filepath1) == path assert osp.isfile(filepath1) # test `join_path` disk_dir = '/path/of/your/directory' assert disk_backend.join_path(disk_dir, 'file') == \ osp.join(disk_dir, 'file') assert disk_backend.join_path(disk_dir, 'dir', 'file') == \ osp.join(disk_dir, 'dir', 'file') # test `list_dir_or_file` with build_temporary_directory() as tmp_dir: # 1. list directories and files assert set(disk_backend.list_dir_or_file(tmp_dir)) == set( ['dir1', 'dir2', 'text1.txt', 'text2.txt']) # 2. list directories and files recursively assert set(disk_backend.list_dir_or_file( tmp_dir, recursive=True)) == set([ 'dir1', osp.join('dir1', 'text3.txt'), 'dir2', osp.join('dir2', 'dir3'), osp.join('dir2', 'dir3', 'text4.txt'), osp.join('dir2', 'img.jpg'), 'text1.txt', 'text2.txt' ]) # 3. only list directories assert set(disk_backend.list_dir_or_file( tmp_dir, list_file=False)) == set(['dir1', 'dir2']) with pytest.raises( TypeError, match='`suffix` should be None when `list_dir` is True'): # Exception is raised among the `list_dir_or_file` of client, # so we need to invode the client to trigger the exception disk_backend.client.list_dir_or_file(tmp_dir, list_file=False, suffix='.txt') # 4. only list directories recursively assert set( disk_backend.list_dir_or_file(tmp_dir, list_file=False, recursive=True)) == set([ 'dir1', 'dir2', osp.join('dir2', 'dir3') ]) # 5. only list files assert set(disk_backend.list_dir_or_file( tmp_dir, list_dir=False)) == set(['text1.txt', 'text2.txt']) # 6. only list files recursively assert set( disk_backend.list_dir_or_file( tmp_dir, list_dir=False, recursive=True)) == set([ osp.join('dir1', 'text3.txt'), osp.join('dir2', 'dir3', 'text4.txt'), osp.join('dir2', 'img.jpg'), 'text1.txt', 'text2.txt' ]) # 7. only list files ending with suffix assert set( disk_backend.list_dir_or_file(tmp_dir, list_dir=False, suffix='.txt')) == set( ['text1.txt', 'text2.txt']) assert set( disk_backend.list_dir_or_file(tmp_dir, list_dir=False, suffix=('.txt', '.jpg'))) == set( ['text1.txt', 'text2.txt']) with pytest.raises( TypeError, match='`suffix` must be a string or tuple of strings'): disk_backend.client.list_dir_or_file(tmp_dir, list_dir=False, suffix=['.txt', '.jpg']) # 8. only list files ending with suffix recursively assert set( disk_backend.list_dir_or_file( tmp_dir, list_dir=False, suffix='.txt', recursive=True)) == set([ osp.join('dir1', 'text3.txt'), osp.join('dir2', 'dir3', 'text4.txt'), 'text1.txt', 'text2.txt' ]) # 7. only list files ending with suffix assert set( disk_backend.list_dir_or_file( tmp_dir, list_dir=False, suffix=('.txt', '.jpg'), recursive=True)) == set([ osp.join('dir1', 'text3.txt'), osp.join('dir2', 'dir3', 'text4.txt'), osp.join('dir2', 'img.jpg'), 'text1.txt', 'text2.txt' ])