From 168bd9782679faa703bd1d1d5bed42b0c9884ccb Mon Sep 17 00:00:00 2001 From: Gregory Lee Date: Thu, 15 Apr 2021 10:03:19 -0400 Subject: [PATCH 1/5] BUG: respect key_separator for FSStore --- zarr/core.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/zarr/core.py b/zarr/core.py index 02419af63a..b6f82ff7d7 100644 --- a/zarr/core.py +++ b/zarr/core.py @@ -1950,7 +1950,11 @@ def _process_for_setitem(self, ckey, chunk_selection, value, fields=None): return self._encode_chunk(chunk) def _chunk_key(self, chunk_coords): - return self._key_prefix + '.'.join(map(str, chunk_coords)) + if hasattr(self._store, 'key_separator'): + separator = self._store.key_separator + else: + separator = '.' + return self._key_prefix + separator.join(map(str, chunk_coords)) def _decode_chunk(self, cdata, start=None, nitems=None, expected_shape=None): # decompress From 323b20a77c0eebddfd262fd02f98d4e140d7820e Mon Sep 17 00:00:00 2001 From: Gregory Lee Date: Thu, 15 Apr 2021 12:20:25 -0400 Subject: [PATCH 2/5] TST: add test case for nested FSStore --- zarr/tests/test_hierarchy.py | 54 ++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/zarr/tests/test_hierarchy.py b/zarr/tests/test_hierarchy.py index afecfabdf1..d62d268913 100644 --- a/zarr/tests/test_hierarchy.py +++ b/zarr/tests/test_hierarchy.py @@ -17,15 +17,16 @@ from numcodecs import Zlib from numpy.testing import assert_array_equal +import zarr from zarr.attrs import Attributes from zarr.core import Array from zarr.creation import open_array from zarr.hierarchy import Group, group, open_group -from zarr.storage import (ABSStore, DBMStore, DirectoryStore, LMDBStore, - LRUStoreCache, MemoryStore, NestedDirectoryStore, - SQLiteStore, ZipStore, array_meta_key, atexit_rmglob, - atexit_rmtree, group_meta_key, init_array, - init_group) +from zarr.storage import (ABSStore, DBMStore, DirectoryStore, FSStore, + LMDBStore, LRUStoreCache, MemoryStore, + NestedDirectoryStore, SQLiteStore, ZipStore, + array_meta_key, atexit_rmglob, atexit_rmtree, + group_meta_key, init_array, init_group) from zarr.util import InfoReporter from zarr.tests.util import skip_test_env_var @@ -971,6 +972,49 @@ def create_store(): return store, None +class TestGroupWithFSStore(TestGroup): + + @staticmethod + def create_store(): + path = tempfile.mkdtemp() + atexit.register(atexit_rmtree, path) + store = FSStore(path) + return store, None + + def test_round_trip_nd(self): + data = np.arange(1000).reshape(10, 10, 10) + name = 'raw' + + store, _ = self.create_store() + f = zarr.open(store, mode='w') + f.create_dataset(name, data=data, chunks=(5, 5, 5), + compressor=None) + h = zarr.open(store, mode='r') + np.testing.assert_array_equal(h[name][:], data) + + +class TestGroupWithNestedFSStore(TestGroup): + + @staticmethod + def create_store(): + path = tempfile.mkdtemp() + atexit.register(atexit_rmtree, path) + store = FSStore(path, key_separator='/', auto_mkdir=True) + return store, None + + def test_round_trip_nd(self): + # data must be >1D to test the key_separator + data = np.arange(1000).reshape(10, 10, 10) + name = 'raw' + + store, _ = self.create_store() + f = zarr.open(store, mode='w') + f.create_dataset(name, data=data, chunks=(5, 5, 5), + compressor=None) + h = zarr.open(store, mode='r') + np.testing.assert_array_equal(h[name][:], data) + + class TestGroupWithZipStore(TestGroup): @staticmethod From c249a58e02bdbdc13fe44681ba3f35ec0e04866b Mon Sep 17 00:00:00 2001 From: Gregory Lee Date: Thu, 15 Apr 2021 12:21:57 -0400 Subject: [PATCH 3/5] TST: switch from zarr.open to open_group --- zarr/tests/test_hierarchy.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/zarr/tests/test_hierarchy.py b/zarr/tests/test_hierarchy.py index d62d268913..93ef9a88da 100644 --- a/zarr/tests/test_hierarchy.py +++ b/zarr/tests/test_hierarchy.py @@ -17,7 +17,6 @@ from numcodecs import Zlib from numpy.testing import assert_array_equal -import zarr from zarr.attrs import Attributes from zarr.core import Array from zarr.creation import open_array @@ -986,10 +985,10 @@ def test_round_trip_nd(self): name = 'raw' store, _ = self.create_store() - f = zarr.open(store, mode='w') + f = open_group(store, mode='w') f.create_dataset(name, data=data, chunks=(5, 5, 5), compressor=None) - h = zarr.open(store, mode='r') + h = open_group(store, mode='r') np.testing.assert_array_equal(h[name][:], data) @@ -1008,10 +1007,10 @@ def test_round_trip_nd(self): name = 'raw' store, _ = self.create_store() - f = zarr.open(store, mode='w') + f = open_group(store, mode='w') f.create_dataset(name, data=data, chunks=(5, 5, 5), compressor=None) - h = zarr.open(store, mode='r') + h = open_group(store, mode='r') np.testing.assert_array_equal(h[name][:], data) From bea6b107bbe63fb209d08adba2ef0de19c21aa65 Mon Sep 17 00:00:00 2001 From: Gregory Lee Date: Thu, 15 Apr 2021 12:59:55 -0400 Subject: [PATCH 4/5] TST: avoid FSStore test method duplication --- zarr/tests/test_hierarchy.py | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/zarr/tests/test_hierarchy.py b/zarr/tests/test_hierarchy.py index 93ef9a88da..5cecd26844 100644 --- a/zarr/tests/test_hierarchy.py +++ b/zarr/tests/test_hierarchy.py @@ -992,7 +992,7 @@ def test_round_trip_nd(self): np.testing.assert_array_equal(h[name][:], data) -class TestGroupWithNestedFSStore(TestGroup): +class TestGroupWithNestedFSStore(TestGroupWithFSStore): @staticmethod def create_store(): @@ -1001,18 +1001,6 @@ def create_store(): store = FSStore(path, key_separator='/', auto_mkdir=True) return store, None - def test_round_trip_nd(self): - # data must be >1D to test the key_separator - data = np.arange(1000).reshape(10, 10, 10) - name = 'raw' - - store, _ = self.create_store() - f = open_group(store, mode='w') - f.create_dataset(name, data=data, chunks=(5, 5, 5), - compressor=None) - h = open_group(store, mode='r') - np.testing.assert_array_equal(h[name][:], data) - class TestGroupWithZipStore(TestGroup): From 14db70e1161f813f5e5a180bdbfb7d8806f842b3 Mon Sep 17 00:00:00 2001 From: Gregory Lee Date: Thu, 15 Apr 2021 20:43:06 -0400 Subject: [PATCH 5/5] skip FSStore tests unless fsspec is available --- zarr/tests/test_hierarchy.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/zarr/tests/test_hierarchy.py b/zarr/tests/test_hierarchy.py index 5cecd26844..0b6566a2a5 100644 --- a/zarr/tests/test_hierarchy.py +++ b/zarr/tests/test_hierarchy.py @@ -27,7 +27,7 @@ array_meta_key, atexit_rmglob, atexit_rmtree, group_meta_key, init_array, init_group) from zarr.util import InfoReporter -from zarr.tests.util import skip_test_env_var +from zarr.tests.util import skip_test_env_var, have_fsspec # noinspection PyStatementEffect @@ -971,6 +971,7 @@ def create_store(): return store, None +@pytest.mark.skipif(have_fsspec is False, reason="needs fsspec") class TestGroupWithFSStore(TestGroup): @staticmethod @@ -992,6 +993,7 @@ def test_round_trip_nd(self): np.testing.assert_array_equal(h[name][:], data) +@pytest.mark.skipif(have_fsspec is False, reason="needs fsspec") class TestGroupWithNestedFSStore(TestGroupWithFSStore): @staticmethod