Skip to content

Commit 0220e45

Browse files
mannreisd-v-bdstansby
authored
Ensure backwards compatibility (#2695)
* Ensure backwards compatibility * Add test that detects backwards compatibility break * Add test description Co-authored-by: Davis Bennett <[email protected]> * Add fix to release notes * Minor improvement to release note --------- Co-authored-by: Davis Bennett <[email protected]> Co-authored-by: David Stansby <[email protected]>
1 parent b982224 commit 0220e45

File tree

3 files changed

+29
-3
lines changed

3 files changed

+29
-3
lines changed

docs/release-notes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ Bug fixes
1111
~~~~~~~~~
1212
* Fixes ``order`` argument for Zarr format 2 arrays (:issue:`2679`).
1313

14+
* Fixes a bug that prevented reading Zarr format 2 data with consolidated metadata written using ``zarr-python`` version 2 (:issue:`2694`).
15+
1416
Behaviour changes
1517
~~~~~~~~~~~~~~~~~
1618

src/zarr/core/group.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -573,8 +573,8 @@ def _from_bytes_v2(
573573
v2_consolidated_metadata = json.loads(consolidated_metadata_bytes.to_bytes())
574574
v2_consolidated_metadata = v2_consolidated_metadata["metadata"]
575575
# We already read zattrs and zgroup. Should we ignore these?
576-
v2_consolidated_metadata.pop(".zattrs")
577-
v2_consolidated_metadata.pop(".zgroup")
576+
v2_consolidated_metadata.pop(".zattrs", None)
577+
v2_consolidated_metadata.pop(".zgroup", None)
578578

579579
consolidated_metadata: defaultdict[str, dict[str, Any]] = defaultdict(dict)
580580

tests/test_metadata/test_consolidated.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
open,
1818
open_consolidated,
1919
)
20-
from zarr.core.buffer import default_buffer_prototype
20+
from zarr.core.buffer import cpu, default_buffer_prototype
2121
from zarr.core.group import ConsolidatedMetadata, GroupMetadata
2222
from zarr.core.metadata import ArrayV3Metadata
2323
from zarr.core.metadata.v2 import ArrayV2Metadata
@@ -476,6 +476,30 @@ async def test_open_consolidated_raises_async(self, zarr_format: ZarrFormat):
476476
with pytest.raises(ValueError):
477477
await zarr.api.asynchronous.open_consolidated(store, zarr_format=None)
478478

479+
@pytest.fixture
480+
async def v2_consolidated_metadata_empty_dataset(
481+
self, memory_store: zarr.storage.MemoryStore
482+
) -> AsyncGroup:
483+
zgroup_bytes = cpu.Buffer.from_bytes(json.dumps({"zarr_format": 2}).encode())
484+
zmetadata_bytes = cpu.Buffer.from_bytes(
485+
b'{"metadata":{".zgroup":{"zarr_format":2}},"zarr_consolidated_format":1}'
486+
)
487+
return AsyncGroup._from_bytes_v2(
488+
None, zgroup_bytes, zattrs_bytes=None, consolidated_metadata_bytes=zmetadata_bytes
489+
)
490+
491+
async def test_consolidated_metadata_backwards_compatibility(
492+
self, v2_consolidated_metadata_empty_dataset
493+
):
494+
"""
495+
Test that consolidated metadata handles a missing .zattrs key. This is necessary for backwards compatibility with zarr-python 2.x. See https://github.com/zarr-developers/zarr-python/issues/2694
496+
"""
497+
store = zarr.storage.MemoryStore()
498+
await zarr.api.asynchronous.open(store=store, zarr_format=2)
499+
await zarr.api.asynchronous.consolidate_metadata(store)
500+
result = await zarr.api.asynchronous.open_consolidated(store, zarr_format=2)
501+
assert result.metadata == v2_consolidated_metadata_empty_dataset.metadata
502+
479503
async def test_consolidated_metadata_v2(self):
480504
store = zarr.storage.MemoryStore()
481505
g = await AsyncGroup.from_store(store, attributes={"key": "root"}, zarr_format=2)

0 commit comments

Comments
 (0)