Skip to content

Commit 2f01c48

Browse files
d-v-bclaude
andcommitted
refactor: rename SetsRange to SupportsSetRange, explicit subclassing
Consistent with SupportsGetSync/SupportsSetSync naming convention. MemoryStore and LocalStore now explicitly subclass SupportsSetRange. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 103f93d commit 2f01c48

5 files changed

Lines changed: 15 additions & 12 deletions

File tree

src/zarr/abc/store.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
__all__ = [
2020
"ByteGetter",
2121
"ByteSetter",
22-
"SetsRange",
2322
"Store",
2423
"SupportsDeleteSync",
2524
"SupportsGetSync",
25+
"SupportsSetRange",
2626
"SupportsSetSync",
2727
"SupportsSyncStore",
2828
"set_or_delete",
@@ -711,7 +711,7 @@ async def set_if_not_exists(self, default: Buffer) -> None: ...
711711

712712

713713
@runtime_checkable
714-
class SetsRange(Protocol):
714+
class SupportsSetRange(Protocol):
715715
"""Protocol for stores that support writing to a byte range within an existing value."""
716716

717717
async def set_range(self, key: str, value: Buffer, start: int) -> None: ...

src/zarr/core/codec_pipeline.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1953,7 +1953,7 @@ async def _process_chunk(
19531953
out_selection: SelectorTuple,
19541954
is_complete: bool,
19551955
) -> None:
1956-
from zarr.abc.store import SetsRange
1956+
from zarr.abc.store import SupportsSetRange
19571957
from zarr.storage._common import StorePath
19581958

19591959
# Stage 1: IO — fetch existing (skip for complete overwrites)
@@ -1964,7 +1964,7 @@ async def _process_chunk(
19641964

19651965
# Determine whether the store supports byte-range writes
19661966
supports_partial_store = isinstance(byte_setter, StorePath) and isinstance(
1967-
byte_setter.store, SetsRange
1967+
byte_setter.store, SupportsSetRange
19681968
)
19691969

19701970
# Stage 2: Compute — decode, merge, re-encode (thread pool)
@@ -2106,15 +2106,17 @@ def write_sync(
21062106
if not batch:
21072107
return
21082108

2109-
from zarr.abc.store import SetsRange
2109+
from zarr.abc.store import SupportsSetRange
21102110
from zarr.storage._common import StorePath
21112111

21122112
for bs, chunk_spec, chunk_selection, out_selection, is_complete in batch:
21132113
existing: Buffer | None = None
21142114
if not is_complete:
21152115
existing = bs.get_sync(prototype=chunk_spec.prototype) # type: ignore[attr-defined]
21162116

2117-
supports_partial_store = isinstance(bs, StorePath) and isinstance(bs.store, SetsRange)
2117+
supports_partial_store = isinstance(bs, StorePath) and isinstance(
2118+
bs.store, SupportsSetRange
2119+
)
21182120

21192121
blob = self._transform_write(
21202122
existing,

src/zarr/storage/_local.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
RangeByteRequest,
1717
Store,
1818
SuffixByteRequest,
19+
SupportsSetRange,
1920
)
2021
from zarr.core.buffer import Buffer
2122
from zarr.core.buffer.core import default_buffer_prototype
@@ -92,7 +93,7 @@ def _put(path: Path, value: Buffer, exclusive: bool = False) -> int:
9293
return f.write(view)
9394

9495

95-
class LocalStore(Store):
96+
class LocalStore(Store, SupportsSetRange):
9697
"""
9798
Store for the local file system.
9899

src/zarr/storage/_memory.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from logging import getLogger
44
from typing import TYPE_CHECKING, Any, Self
55

6-
from zarr.abc.store import ByteRequest, Store
6+
from zarr.abc.store import ByteRequest, Store, SupportsSetRange
77
from zarr.core.buffer import Buffer, gpu
88
from zarr.core.buffer.core import default_buffer_prototype
99
from zarr.core.common import concurrent_map
@@ -18,7 +18,7 @@
1818
logger = getLogger(__name__)
1919

2020

21-
class MemoryStore(Store):
21+
class MemoryStore(Store, SupportsSetRange):
2222
"""
2323
Store for local memory.
2424

tests/test_phased_codec_pipeline.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import pytest
1010

1111
import zarr
12-
from zarr.abc.store import SetsRange
12+
from zarr.abc.store import SupportsSetRange
1313
from zarr.codecs.bytes import BytesCodec
1414
from zarr.codecs.gzip import GzipCodec
1515
from zarr.codecs.transpose import TransposeCodec
@@ -425,9 +425,9 @@ def test_streaming_write_partial_update() -> None:
425425

426426

427427
def test_memory_store_supports_byte_range_setter() -> None:
428-
"""MemoryStore should implement SetsRange."""
428+
"""MemoryStore should implement SupportsSetRange."""
429429
store = zarr.storage.MemoryStore()
430-
assert isinstance(store, SetsRange)
430+
assert isinstance(store, SupportsSetRange)
431431

432432

433433
def test_memory_store_set_range() -> None:

0 commit comments

Comments
 (0)