Skip to content

Commit c0c1b24

Browse files
committed
scrub out set-range logic
1 parent 9710a74 commit c0c1b24

5 files changed

Lines changed: 1 addition & 122 deletions

File tree

src/zarr/abc/store.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
"Store",
2323
"SupportsDeleteSync",
2424
"SupportsGetSync",
25-
"SupportsSetRangeSync",
2625
"SupportsSetSync",
2726
"SupportsSyncStore",
2827
"set_or_delete",
@@ -726,20 +725,13 @@ class SupportsSetSync(Protocol):
726725
def set_sync(self, key: str, value: Buffer) -> None: ...
727726

728727

729-
@runtime_checkable
730-
class SupportsSetRangeSync(Protocol):
731-
def set_range_sync(self, key: str, value: Buffer, start: int) -> None: ...
732-
733-
734728
@runtime_checkable
735729
class SupportsDeleteSync(Protocol):
736730
def delete_sync(self, key: str) -> None: ...
737731

738732

739733
@runtime_checkable
740-
class SupportsSyncStore(
741-
SupportsGetSync, SupportsSetSync, SupportsSetRangeSync, SupportsDeleteSync, Protocol
742-
): ...
734+
class SupportsSyncStore(SupportsGetSync, SupportsSetSync, SupportsDeleteSync, Protocol): ...
743735

744736

745737
async def set_or_delete(byte_setter: ByteSetter, value: Buffer | None) -> None:

src/zarr/storage/_common.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
Store,
1111
SupportsDeleteSync,
1212
SupportsGetSync,
13-
SupportsSetRangeSync,
1413
SupportsSetSync,
1514
)
1615
from zarr.core.buffer import Buffer, default_buffer_prototype
@@ -258,14 +257,6 @@ def set_sync(self, value: Buffer) -> None:
258257
raise TypeError(f"Store {type(self.store).__name__} does not support synchronous set.")
259258
self.store.set_sync(self.path, value)
260259

261-
def set_range_sync(self, value: Buffer, start: int) -> None:
262-
"""Synchronous byte-range write."""
263-
if not isinstance(self.store, SupportsSetRangeSync):
264-
raise TypeError(
265-
f"Store {type(self.store).__name__} does not support synchronous set_range."
266-
)
267-
self.store.set_range_sync(self.path, value, start)
268-
269260
def delete_sync(self) -> None:
270261
"""Synchronous delete — delegates to ``self.store.delete_sync(self.path)``."""
271262
if not isinstance(self.store, SupportsDeleteSync):

src/zarr/storage/_local.py

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -85,19 +85,6 @@ def _put(path: Path, value: Buffer, exclusive: bool = False) -> int:
8585
return f.write(view)
8686

8787

88-
def _put_range(path: Path, value: Buffer, start: int) -> None:
89-
view = value.as_buffer_like()
90-
file_size = path.stat().st_size
91-
if start + len(view) > file_size:
92-
raise ValueError(
93-
f"set_range would write beyond the end of the stored value: "
94-
f"start={start}, len(value)={len(view)}, stored size={file_size}"
95-
)
96-
with path.open("r+b") as f:
97-
f.seek(start)
98-
f.write(view)
99-
100-
10188
class LocalStore(Store):
10289
"""
10390
Store for the local file system.
@@ -241,12 +228,6 @@ def set_sync(self, key: str, value: Buffer) -> None:
241228
path = self.root / key
242229
_put(path, value)
243230

244-
def set_range_sync(self, key: str, value: Buffer, start: int) -> None:
245-
self._ensure_open_sync()
246-
self._check_writable()
247-
path = self.root / key
248-
_put_range(path, value, start)
249-
250231
def delete_sync(self, key: str) -> None:
251232
self._ensure_open_sync()
252233
self._check_writable()

src/zarr/storage/_memory.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -172,26 +172,6 @@ async def set(self, key: str, value: Buffer, byte_range: tuple[int, int] | None
172172
else:
173173
self._store_dict[key] = value
174174

175-
def _set_range_impl(self, key: str, value: Buffer, start: int) -> None:
176-
buf = self._store_dict[key]
177-
target = buf.as_numpy_array()
178-
if start + len(value) > len(target):
179-
raise ValueError(
180-
f"set_range would write beyond the end of the stored value: "
181-
f"start={start}, len(value)={len(value)}, stored size={len(target)}"
182-
)
183-
if not target.flags.writeable:
184-
target = target.copy()
185-
self._store_dict[key] = buf.__class__(target)
186-
target[start : start + len(value)] = value.as_numpy_array()
187-
188-
def set_range_sync(self, key: str, value: Buffer, start: int) -> None:
189-
"""Synchronous byte-range write."""
190-
self._check_writable()
191-
if not self._is_open:
192-
self._is_open = True
193-
self._set_range_impl(key, value, start)
194-
195175
async def set_if_not_exists(self, key: str, value: Buffer) -> None:
196176
# docstring inherited
197177
self._check_writable()

src/zarr/testing/store.py

Lines changed: 0 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
from abc import abstractmethod
77
from typing import TYPE_CHECKING, Generic, Self, TypeVar
88

9-
import numpy as np
10-
119
from zarr.storage import WrapperStore
1210

1311
if TYPE_CHECKING:
@@ -25,7 +23,6 @@
2523
SuffixByteRequest,
2624
SupportsDeleteSync,
2725
SupportsGetSync,
28-
SupportsSetRangeSync,
2926
SupportsSetSync,
3027
)
3128
from zarr.core.buffer import Buffer, default_buffer_prototype
@@ -58,13 +55,6 @@ def _require_set_sync(store: S) -> SupportsSetSync:
5855
pytest.skip("store does not implement SupportsSetSync")
5956
return store # type: ignore[unreachable]
6057

61-
@staticmethod
62-
def _require_set_range_sync(store: S) -> SupportsSetRangeSync:
63-
"""Skip unless *store* implements :class:`SupportsSetRangeSync`."""
64-
if not isinstance(store, SupportsSetRangeSync):
65-
pytest.skip("store does not implement SupportsSetRangeSync")
66-
return store # type: ignore[unreachable]
67-
6858
@staticmethod
6959
def _require_delete_sync(store: S) -> SupportsDeleteSync:
7060
"""Skip unless *store* implements :class:`SupportsDeleteSync`."""
@@ -658,61 +648,6 @@ def test_delete_sync_missing(self, store: S) -> None:
658648
# should not raise
659649
deleter.delete_sync("nonexistent_sync")
660650

661-
# -------------------------------------------------------------------
662-
# set_range (sync only — set_range is exclusively a sync-path API)
663-
# -------------------------------------------------------------------
664-
665-
def test_set_range_sync(self, store: S) -> None:
666-
setter = self._require_set_sync(store)
667-
ranger = self._require_set_range_sync(store)
668-
getter = self._require_get_sync(store)
669-
data_buf = self.buffer_cls.from_bytes(b"hello world")
670-
key = "range_sync_key"
671-
setter.set_sync(key, data_buf)
672-
patch = default_buffer_prototype().buffer.from_bytes(b"WORLD")
673-
ranger.set_range_sync(key, patch, 6)
674-
result = getter.get_sync(key)
675-
assert result is not None
676-
assert result.to_bytes() == b"hello WORLD"
677-
678-
def test_set_range_sync_preserves_other_bytes(self, store: S) -> None:
679-
setter = self._require_set_sync(store)
680-
ranger = self._require_set_range_sync(store)
681-
getter = self._require_get_sync(store)
682-
data = np.arange(100, dtype="uint8")
683-
data_buf = default_buffer_prototype().buffer.from_array_like(data)
684-
key = "range_preserve"
685-
setter.set_sync(key, data_buf)
686-
patch = np.full(10, 255, dtype="uint8")
687-
patch_buf = default_buffer_prototype().buffer.from_array_like(patch)
688-
ranger.set_range_sync(key, patch_buf, 50)
689-
result = getter.get_sync(key)
690-
assert result is not None
691-
result_arr = np.frombuffer(result.to_bytes(), dtype="uint8")
692-
expected = data.copy()
693-
expected[50:60] = 255
694-
np.testing.assert_array_equal(result_arr, expected)
695-
696-
def test_set_range_sync_beyond_end_raises(self, store: S) -> None:
697-
setter = self._require_set_sync(store)
698-
ranger = self._require_set_range_sync(store)
699-
data_buf = self.buffer_cls.from_bytes(b"hello")
700-
key = "range_oob"
701-
setter.set_sync(key, data_buf)
702-
patch = default_buffer_prototype().buffer.from_bytes(b"world!")
703-
with pytest.raises(ValueError, match="set_range would write beyond"):
704-
ranger.set_range_sync(key, patch, 0)
705-
706-
def test_set_range_sync_start_beyond_end_raises(self, store: S) -> None:
707-
setter = self._require_set_sync(store)
708-
ranger = self._require_set_range_sync(store)
709-
data_buf = self.buffer_cls.from_bytes(b"hello")
710-
key = "range_oob2"
711-
setter.set_sync(key, data_buf)
712-
patch = default_buffer_prototype().buffer.from_bytes(b"x")
713-
with pytest.raises(ValueError, match="set_range would write beyond"):
714-
ranger.set_range_sync(key, patch, 10)
715-
716651

717652
class LatencyStore(WrapperStore[Store]):
718653
"""

0 commit comments

Comments
 (0)