Skip to content

Commit acce63e

Browse files
committed
Update set_partial_values to accept Buffer rather than BytesLike
1 parent 678b2e8 commit acce63e

File tree

9 files changed

+27
-20
lines changed

9 files changed

+27
-20
lines changed

src/zarr/abc/store.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
from typing import Any, Self, TypeAlias
1717

1818
from zarr.core.buffer import Buffer, BufferPrototype
19-
from zarr.core.common import BytesLike
2019

2120
__all__ = ["ByteGetter", "ByteSetter", "Store", "set_or_delete"]
2221

@@ -285,9 +284,7 @@ def supports_partial_writes(self) -> bool:
285284
...
286285

287286
@abstractmethod
288-
async def set_partial_values(
289-
self, key_start_values: Iterable[tuple[str, int, BytesLike]]
290-
) -> None:
287+
async def set_partial_values(self, key_start_values: Iterable[tuple[str, int, Buffer]]) -> None:
291288
"""Store values at a given key, starting at byte range_start.
292289
293290
Parameters

src/zarr/storage/_fsspec.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
from fsspec.asyn import AsyncFileSystem
1919

2020
from zarr.core.buffer import Buffer, BufferPrototype
21-
from zarr.core.common import BytesLike
2221

2322

2423
ALLOWED_EXCEPTIONS: tuple[type[Exception], ...] = (
@@ -316,9 +315,7 @@ async def get_partial_values(
316315

317316
return [None if isinstance(r, Exception) else prototype.buffer.from_bytes(r) for r in res]
318317

319-
async def set_partial_values(
320-
self, key_start_values: Iterable[tuple[str, int, BytesLike]]
321-
) -> None:
318+
async def set_partial_values(self, key_start_values: Iterable[tuple[str, int, Buffer]]) -> None:
322319
# docstring inherited
323320
raise NotImplementedError
324321

src/zarr/storage/_local.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,8 @@ async def _set(self, key: str, value: Buffer, exclusive: bool = False) -> None:
174174
await asyncio.to_thread(_put, path, value, start=None, exclusive=exclusive)
175175

176176
async def set_partial_values(
177-
self, key_start_values: Iterable[tuple[str, int, bytes | bytearray | memoryview]]
177+
self,
178+
key_start_values: Iterable[tuple[str, int, Buffer]],
178179
) -> None:
179180
# docstring inherited
180181
self._check_writable()

src/zarr/storage/_logging.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,7 @@ async def delete(self, key: str) -> None:
197197
with self.log(key):
198198
return await self._store.delete(key=key)
199199

200-
async def set_partial_values(
201-
self, key_start_values: Iterable[tuple[str, int, bytes | bytearray | memoryview]]
202-
) -> None:
200+
async def set_partial_values(self, key_start_values: Iterable[tuple[str, int, Buffer]]) -> None:
203201
# docstring inherited
204202
keys = ",".join([k[0] for k in key_start_values])
205203
with self.log(keys):

src/zarr/storage/_memory.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class MemoryStore(Store):
3838

3939
supports_writes: bool = True
4040
supports_deletes: bool = True
41-
supports_partial_writes: bool = True
41+
supports_partial_writes: bool = False
4242
supports_listing: bool = True
4343

4444
_store_dict: MutableMapping[str, Buffer]
@@ -134,7 +134,7 @@ async def delete(self, key: str) -> None:
134134
except KeyError:
135135
logger.debug("Key %s does not exist.", key)
136136

137-
async def set_partial_values(self, key_start_values: Iterable[tuple[str, int, bytes]]) -> None:
137+
async def set_partial_values(self, key_start_values: Iterable[tuple[str, int, Buffer]]) -> None:
138138
# docstring inherited
139139
raise NotImplementedError
140140

src/zarr/storage/_wrapper.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
from zarr.abc.store import ByteRequest
1111
from zarr.core.buffer import Buffer, BufferPrototype
12-
from zarr.core.common import BytesLike
1312

1413
from zarr.abc.store import Store
1514

@@ -108,9 +107,7 @@ async def delete(self, key: str) -> None:
108107
def supports_partial_writes(self) -> bool:
109108
return self._store.supports_partial_writes
110109

111-
async def set_partial_values(
112-
self, key_start_values: Iterable[tuple[str, int, BytesLike]]
113-
) -> None:
110+
async def set_partial_values(self, key_start_values: Iterable[tuple[str, int, Buffer]]) -> None:
114111
return await self._store.set_partial_values(key_start_values)
115112

116113
@property

src/zarr/storage/_zip.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ async def set(self, key: str, value: Buffer) -> None:
209209
with self._lock:
210210
self._set(key, value)
211211

212-
async def set_partial_values(self, key_start_values: Iterable[tuple[str, int, bytes]]) -> None:
212+
async def set_partial_values(self, key_start_values: Iterable[tuple[str, int, Buffer]]) -> None:
213213
raise NotImplementedError
214214

215215
async def set_if_not_exists(self, key: str, value: Buffer) -> None:

src/zarr/testing/store.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,23 @@ async def test_set_many(self, store: S) -> None:
181181
for k, v in store_dict.items():
182182
assert (await self.get(store, k)).to_bytes() == v.to_bytes()
183183

184+
@pytest.mark.parametrize("key", ["zarr.json", "c/0", "foo/c/0.0", "foo/0/0"])
185+
async def test_set_partial_values(self, store: S, key: str) -> None:
186+
"""
187+
Ensure that data can be written to the store using the store.set method.
188+
"""
189+
assert not store.read_only
190+
# Create empty key
191+
await store.set(key, self.buffer_cls.from_bytes(b""))
192+
data_buf = self.buffer_cls.from_bytes(b"\x01\x02\x03\x04")
193+
if store.supports_partial_writes:
194+
await store.set_partial_values([(key, 0, data_buf[:2]), (key, 2, data_buf[2:])])
195+
observed = await self.get(store, key)
196+
assert_bytes_equal(observed.to_bytes(), data_buf)
197+
else:
198+
with pytest.raises(NotImplementedError):
199+
await store.set_partial_values([(key, 0, data_buf[:2]), (key, 2, data_buf[2:])])
200+
184201
@pytest.mark.parametrize(
185202
"key_ranges",
186203
[

tests/test_store/test_memory.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def test_store_supports_listing(self, store: MemoryStore) -> None:
4141
assert store.supports_listing
4242

4343
def test_store_supports_partial_writes(self, store: MemoryStore) -> None:
44-
assert store.supports_partial_writes
44+
assert not store.supports_partial_writes
4545

4646
def test_list_prefix(self, store: MemoryStore) -> None:
4747
assert True

0 commit comments

Comments
 (0)