Skip to content

Commit

Permalink
(fix): ensure zip directory store compares key to prefix correctly (#…
Browse files Browse the repository at this point in the history
…2758)

* (fix): ensure zip directory store compares key to prefix correctly

* (chore): add test for externally zipped zarr store

* (fix): no need for async test

* (chore): rel note

---------

Co-authored-by: Deepak Cherian <dcherian@users.noreply.github.com>
  • Loading branch information
ilan-gold and dcherian authored Feb 10, 2025
1 parent 037adf6 commit 1823a09
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 1 deletion.
1 change: 1 addition & 0 deletions changes/2758.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix zip-store path checking for stores with directories listed as files.
2 changes: 1 addition & 1 deletion src/zarr/storage/_zip.py
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,7 @@ async def list_dir(self, prefix: str) -> AsyncIterator[str]:
yield key
else:
for key in keys:
if key.startswith(prefix + "/") and key != prefix:
if key.startswith(prefix + "/") and key.strip("/") != prefix:
k = key.removeprefix(prefix + "/").split("/")[0]
if k not in seen:
seen.add(k)
Expand Down
14 changes: 14 additions & 0 deletions tests/test_store/test_zip.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from __future__ import annotations

import os
import shutil
import tempfile
import zipfile
from typing import TYPE_CHECKING
Expand All @@ -14,6 +15,7 @@
from zarr.testing.store import StoreTests

if TYPE_CHECKING:
from pathlib import Path
from typing import Any


Expand Down Expand Up @@ -111,3 +113,15 @@ async def test_zip_open_mode_translation(
kws = {**store_kwargs, "mode": zip_mode}
store = await self.store_cls.open(**kws)
assert store.read_only == read_only

def test_externally_zipped_store(self, tmp_path: Path) -> None:
# See: https://github.com/zarr-developers/zarr-python/issues/2757
zarr_path = tmp_path / "foo.zarr"
root = zarr.open_group(store=zarr_path, mode="w")
root.require_group("foo")
root["foo"]["bar"] = np.array([1])
shutil.make_archive(zarr_path, "zip", zarr_path)
zip_path = tmp_path / "foo.zarr.zip"
zipped = zarr.open_group(ZipStore(zip_path, mode="r"), mode="r")
assert list(zipped.keys()) == list(root.keys())
assert list(zipped["foo"].keys()) == list(root["foo"].keys())

0 comments on commit 1823a09

Please sign in to comment.