Skip to content

Commit 6923337

Browse files
committed
Test get and set on closed stores
1 parent 5f00efd commit 6923337

File tree

4 files changed

+40
-4
lines changed

4 files changed

+40
-4
lines changed

src/zarr/storage/_zip.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,8 @@ def _get(
146146
prototype: BufferPrototype,
147147
byte_range: ByteRequest | None = None,
148148
) -> Buffer | None:
149+
if not self._is_open:
150+
self._sync_open()
149151
# docstring inherited
150152
try:
151153
with self._zf.open(key) as f: # will raise KeyError
@@ -190,6 +192,8 @@ async def get_partial_values(
190192
return out
191193

192194
def _set(self, key: str, value: Buffer) -> None:
195+
if not self._is_open:
196+
self._sync_open()
193197
# generally, this should be called inside a lock
194198
keyinfo = zipfile.ZipInfo(filename=key, date_time=time.localtime(time.time())[:6])
195199
keyinfo.compress_type = self.compression
@@ -203,6 +207,8 @@ def _set(self, key: str, value: Buffer) -> None:
203207
async def set(self, key: str, value: Buffer) -> None:
204208
# docstring inherited
205209
self._check_writable()
210+
if not self._is_open:
211+
self._sync_open()
206212
assert isinstance(key, str)
207213
if not isinstance(value, Buffer):
208214
raise TypeError("ZipStore.set(): `value` must a Buffer instance")

src/zarr/testing/store.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ def open_kwargs(self, store_kwargs: dict[str, Any]) -> dict[str, Any]:
6666
async def store(self, open_kwargs: dict[str, Any]) -> Store:
6767
return await self.store_cls.open(**open_kwargs)
6868

69+
@pytest.fixture
70+
async def store_not_open(self, store_kwargs: dict[str, Any]) -> Store:
71+
return self.store_cls(**store_kwargs)
72+
6973
def test_store_type(self, store: S) -> None:
7074
assert isinstance(store, Store)
7175
assert isinstance(store, self.store_cls)
@@ -137,6 +141,17 @@ async def test_get(self, store: S, key: str, data: bytes, byte_range: ByteReques
137141
expected = data_buf[start:stop]
138142
assert_bytes_equal(observed, expected)
139143

144+
async def test_get_not_open(self, store_not_open: S) -> None:
145+
"""
146+
Ensure that data can be read from the store that isn't yet open using the store.get method.
147+
"""
148+
assert not store_not_open._is_open
149+
data_buf = self.buffer_cls.from_bytes(b"\x01\x02\x03\x04")
150+
key = "c/0"
151+
await self.set(store_not_open, key, data_buf)
152+
observed = await store_not_open.get(key, prototype=default_buffer_prototype())
153+
assert_bytes_equal(observed, data_buf)
154+
140155
async def test_get_raises(self, store: S) -> None:
141156
"""
142157
Ensure that a ValueError is raise for invalid byte range syntax
@@ -211,6 +226,17 @@ async def test_set(self, store: S, key: str, data: bytes) -> None:
211226
observed = await self.get(store, key)
212227
assert_bytes_equal(observed, data_buf)
213228

229+
async def test_set_not_open(self, store_not_open: S) -> None:
230+
"""
231+
Ensure that data can be written to the store that's not yet open using the store.set method.
232+
"""
233+
assert not store_not_open._is_open
234+
data_buf = self.buffer_cls.from_bytes(b"\x01\x02\x03\x04")
235+
key = "c/0"
236+
await store_not_open.set(key, data_buf)
237+
observed = await self.get(store_not_open, key)
238+
assert_bytes_equal(observed, data_buf)
239+
214240
async def test_set_many(self, store: S) -> None:
215241
"""
216242
Test that a dict of key : value pairs can be inserted into the store via the

tests/test_store/test_logging.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
from zarr.testing.store import StoreTests
1212

1313
if TYPE_CHECKING:
14+
from _pytest.compat import LEGACY_PATH
15+
1416
from zarr.abc.store import Store
1517

1618

@@ -28,8 +30,8 @@ async def set(self, store: LoggingStore, key: str, value: Buffer) -> None:
2830
(store._store.root / key).write_bytes(value.to_bytes())
2931

3032
@pytest.fixture
31-
def store_kwargs(self, local_store) -> dict[str, str]:
32-
return {"store": local_store, "log_level": "DEBUG"}
33+
def store_kwargs(self, tmpdir: LEGACY_PATH) -> dict[str, str]:
34+
return {"store": LocalStore(str(tmpdir)), "log_level": "DEBUG"}
3335

3436
@pytest.fixture
3537
def open_kwargs(self, tmpdir) -> dict[str, str]:

tests/test_store/test_wrapper.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
from zarr.testing.store import StoreTests
1010

1111
if TYPE_CHECKING:
12+
from _pytest.compat import LEGACY_PATH
13+
1214
from zarr.abc.store import Store
1315
from zarr.core.buffer.core import BufferPrototype
1416

@@ -27,8 +29,8 @@ async def set(self, store: WrapperStore, key: str, value: Buffer) -> None:
2729
(store._store.root / key).write_bytes(value.to_bytes())
2830

2931
@pytest.fixture
30-
def store_kwargs(self, local_store) -> dict[str, str]:
31-
return {"store": local_store}
32+
def store_kwargs(self, tmpdir: LEGACY_PATH) -> dict[str, str]:
33+
return {"store": LocalStore(str(tmpdir))}
3234

3335
@pytest.fixture
3436
def open_kwargs(self, tmpdir) -> dict[str, str]:

0 commit comments

Comments
 (0)