Skip to content

Commit 94ba77a

Browse files
committed
use Numcodec instead of numcodecs.abc.Codec
1 parent 1eb5b3c commit 94ba77a

File tree

10 files changed

+49
-63
lines changed

10 files changed

+49
-63
lines changed

src/zarr/api/asynchronous.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,7 @@
4646
if TYPE_CHECKING:
4747
from collections.abc import Iterable
4848

49-
from zarr.abc.codec import Codec
50-
from zarr.codecs._v2 import Numcodec
49+
from zarr.abc.codec import Codec, Numcodec
5150
from zarr.core.buffer import NDArrayLikeOrScalar
5251
from zarr.core.chunk_key_encodings import ChunkKeyEncoding
5352
from zarr.storage import StoreLike

src/zarr/api/synchronous.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@
1717
import numpy as np
1818
import numpy.typing as npt
1919

20-
from zarr.abc.codec import Codec
20+
from zarr.abc.codec import Codec, Numcodec
2121
from zarr.api.asynchronous import ArrayLike, PathLike
22-
from zarr.codecs._v2 import Numcodec
2322
from zarr.core.array import (
2423
CompressorsLike,
2524
FiltersLike,

src/zarr/codecs/_numcodecs.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
from zarr.abc.codec import CodecJSON_V2
2-
from zarr.abc.codec import Numcodec
1+
from zarr.abc.codec import CodecJSON_V2, Numcodec
32

43

54
def get_numcodec(data: CodecJSON_V2[str]) -> Numcodec:

src/zarr/codecs/_v2.py

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,19 @@
22

33
import asyncio
44
from dataclasses import dataclass
5-
from typing import TYPE_CHECKING, ClassVar, Self, TypeGuard
5+
from typing import TYPE_CHECKING, TypeGuard
66

77
import numpy as np
88
from numcodecs.compat import ensure_bytes, ensure_ndarray_like
9-
from typing_extensions import Protocol
109

11-
from zarr.abc.codec import ArrayBytesCodec, CodecJSON_V2
10+
from zarr.abc.codec import ArrayBytesCodec, Numcodec
1211
from zarr.registry import get_ndbuffer_class
1312

1413
if TYPE_CHECKING:
1514
from zarr.core.array_spec import ArraySpec
1615
from zarr.core.buffer import Buffer, NDBuffer
1716

1817

19-
class Numcodec(Protocol):
20-
"""
21-
A protocol that models the ``numcodecs.abc.Codec`` interface.
22-
"""
23-
24-
codec_id: ClassVar[str]
25-
26-
def encode(self, buf: Buffer | NDBuffer) -> Buffer | NDBuffer: ...
27-
28-
def decode(
29-
self, buf: Buffer | NDBuffer, out: Buffer | NDBuffer | None = None
30-
) -> Buffer | NDBuffer: ...
31-
32-
def get_config(self) -> CodecJSON_V2[str]: ...
33-
34-
@classmethod
35-
def from_config(cls, config: CodecJSON_V2[str]) -> Self: ...
36-
37-
3818
def _is_numcodec(obj: object) -> TypeGuard[Numcodec]:
3919
"""
4020
Check if the given object implements the Numcodec protocol.

src/zarr/core/_info.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
import textwrap
55
from typing import TYPE_CHECKING, Literal
66

7-
if TYPE_CHECKING:
8-
import numcodecs.abc
7+
from zarr.abc.codec import Numcodec
98

9+
if TYPE_CHECKING:
1010
from zarr.abc.codec import ArrayArrayCodec, ArrayBytesCodec, BytesBytesCodec
1111
from zarr.core.common import ZarrFormat
1212
from zarr.core.dtype.wrapper import TBaseDType, TBaseScalar, ZDType
@@ -88,9 +88,9 @@ class ArrayInfo:
8888
_order: Literal["C", "F"]
8989
_read_only: bool
9090
_store_type: str
91-
_filters: tuple[numcodecs.abc.Codec, ...] | tuple[ArrayArrayCodec, ...] = ()
91+
_filters: tuple[Numcodec, ...] | tuple[ArrayArrayCodec, ...] = ()
9292
_serializer: ArrayBytesCodec | None = None
93-
_compressors: tuple[numcodecs.abc.Codec, ...] | tuple[BytesBytesCodec, ...] = ()
93+
_compressors: tuple[Numcodec, ...] | tuple[BytesBytesCodec, ...] = ()
9494
_count_bytes: int | None = None
9595
_count_bytes_stored: int | None = None
9696
_count_chunks_initialized: int | None = None

src/zarr/core/array.py

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
from typing_extensions import deprecated
2626

2727
import zarr
28-
from zarr.abc.codec import ArrayArrayCodec, ArrayBytesCodec, BytesBytesCodec, Codec
28+
from zarr.abc.codec import ArrayArrayCodec, ArrayBytesCodec, BytesBytesCodec, Codec, Numcodec
2929
from zarr.abc.store import Store, set_or_delete
30-
from zarr.codecs._v2 import Numcodec, V2Codec
30+
from zarr.codecs._v2 import V2Codec
3131
from zarr.codecs.bytes import BytesCodec
3232
from zarr.codecs.vlen_utf8 import VLenBytesCodec, VLenUTF8Codec
3333
from zarr.codecs.zstd import ZstdCodec
@@ -1033,7 +1033,7 @@ def size(self) -> int:
10331033
return np.prod(self.metadata.shape).item()
10341034

10351035
@property
1036-
def filters(self) -> tuple[numcodecs.abc.Codec, ...] | tuple[ArrayArrayCodec, ...]:
1036+
def filters(self) -> tuple[Numcodec, ...] | tuple[ArrayArrayCodec, ...]:
10371037
"""
10381038
Filters that are applied to each chunk of the array, in order, before serializing that
10391039
chunk to bytes.
@@ -1062,7 +1062,7 @@ def serializer(self) -> ArrayBytesCodec | None:
10621062

10631063
@property
10641064
@deprecated("Use AsyncArray.compressors instead.")
1065-
def compressor(self) -> numcodecs.abc.Codec | None:
1065+
def compressor(self) -> Numcodec | None:
10661066
"""
10671067
Compressor that is applied to each chunk of the array.
10681068
@@ -1075,7 +1075,7 @@ def compressor(self) -> numcodecs.abc.Codec | None:
10751075
raise TypeError("`compressor` is not available for Zarr format 3 arrays.")
10761076

10771077
@property
1078-
def compressors(self) -> tuple[numcodecs.abc.Codec, ...] | tuple[BytesBytesCodec, ...]:
1078+
def compressors(self) -> tuple[Numcodec, ...] | tuple[BytesBytesCodec, ...]:
10791079
"""
10801080
Compressors that are applied to each chunk of the array. Compressors are applied in order, and after any
10811081
filters are applied (if any are specified) and the data is serialized into bytes.
@@ -2227,7 +2227,7 @@ def fill_value(self) -> Any:
22272227
return self.metadata.fill_value
22282228

22292229
@property
2230-
def filters(self) -> tuple[numcodecs.abc.Codec, ...] | tuple[ArrayArrayCodec, ...]:
2230+
def filters(self) -> tuple[Numcodec, ...] | tuple[ArrayArrayCodec, ...]:
22312231
"""
22322232
Filters that are applied to each chunk of the array, in order, before serializing that
22332233
chunk to bytes.
@@ -2243,7 +2243,7 @@ def serializer(self) -> None | ArrayBytesCodec:
22432243

22442244
@property
22452245
@deprecated("Use Array.compressors instead.")
2246-
def compressor(self) -> numcodecs.abc.Codec | None:
2246+
def compressor(self) -> Numcodec | None:
22472247
"""
22482248
Compressor that is applied to each chunk of the array.
22492249
@@ -2254,7 +2254,7 @@ def compressor(self) -> numcodecs.abc.Codec | None:
22542254
return self._async_array.compressor
22552255

22562256
@property
2257-
def compressors(self) -> tuple[numcodecs.abc.Codec, ...] | tuple[BytesBytesCodec, ...]:
2257+
def compressors(self) -> tuple[Numcodec, ...] | tuple[BytesBytesCodec, ...]:
22582258
"""
22592259
Compressors that are applied to each chunk of the array. Compressors are applied in order, and after any
22602260
filters are applied (if any are specified) and the data is serialized into bytes.
@@ -3900,15 +3900,13 @@ def _build_parents(
39003900
FiltersLike: TypeAlias = (
39013901
Iterable[dict[str, JSON] | ArrayArrayCodec | Numcodec]
39023902
| ArrayArrayCodec
3903-
| Iterable[numcodecs.abc.Codec]
3904-
| numcodecs.abc.Codec
3903+
| Iterable[Numcodec]
3904+
| Numcodec
39053905
| Literal["auto"]
39063906
| None
39073907
)
39083908
# Union of acceptable types for users to pass in for both v2 and v3 compressors
3909-
CompressorLike: TypeAlias = (
3910-
dict[str, JSON] | BytesBytesCodec | numcodecs.abc.Codec | Literal["auto"] | None
3911-
)
3909+
CompressorLike: TypeAlias = dict[str, JSON] | BytesBytesCodec | Numcodec | Literal["auto"] | None
39123910

39133911
CompressorsLike: TypeAlias = (
39143912
Iterable[dict[str, JSON] | BytesBytesCodec | Numcodec]
@@ -4775,7 +4773,7 @@ def default_serializer_v3(dtype: ZDType[Any, Any]) -> ArrayBytesCodec:
47754773
return serializer
47764774

47774775

4778-
def default_filters_v2(dtype: ZDType[Any, Any]) -> tuple[numcodecs.abc.Codec] | None:
4776+
def default_filters_v2(dtype: ZDType[Any, Any]) -> tuple[Numcodec] | None:
47794777
"""
47804778
Given a data type, return the default filters for that data type.
47814779
@@ -4813,12 +4811,12 @@ def _parse_chunk_encoding_v2(
48134811
compressor: CompressorsLike,
48144812
filters: FiltersLike,
48154813
dtype: ZDType[TBaseDType, TBaseScalar],
4816-
) -> tuple[tuple[numcodecs.abc.Codec, ...] | None, numcodecs.abc.Codec | None]:
4814+
) -> tuple[tuple[Numcodec, ...] | None, Numcodec | None]:
48174815
"""
48184816
Generate chunk encoding classes for Zarr format 2 arrays with optional defaults.
48194817
"""
4820-
_filters: tuple[numcodecs.abc.Codec, ...] | None
4821-
_compressor: numcodecs.abc.Codec | None
4818+
_filters: tuple[Numcodec, ...] | None
4819+
_compressor: Numcodec | None
48224820

48234821
if compressor is None or compressor == ():
48244822
_compressor = None

src/zarr/core/metadata/v2.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import numcodecs.abc
99

10+
from zarr.abc.codec import Numcodec
1011
from zarr.abc.metadata import Metadata
1112
from zarr.core.chunk_grids import RegularChunkGrid
1213
from zarr.core.dtype import get_data_type_from_json
@@ -56,7 +57,7 @@ class ArrayV2MetadataDict(TypedDict):
5657

5758

5859
# Union of acceptable types for v2 compressors
59-
CompressorLikev2: TypeAlias = dict[str, JSON] | numcodecs.abc.Codec | None
60+
CompressorLikev2: TypeAlias = dict[str, JSON] | Numcodec | None
6061

6162

6263
@dataclass(frozen=True, kw_only=True)
@@ -66,9 +67,9 @@ class ArrayV2Metadata(Metadata):
6667
dtype: ZDType[TBaseDType, TBaseScalar]
6768
fill_value: int | float | str | bytes | None = None
6869
order: MemoryOrder = "C"
69-
filters: tuple[numcodecs.abc.Codec, ...] | None = None
70+
filters: tuple[Numcodec, ...] | None = None
7071
dimension_separator: Literal[".", "/"] = "."
71-
compressor: numcodecs.abc.Codec | None
72+
compressor: Numcodec | None
7273
attributes: dict[str, JSON] = field(default_factory=dict)
7374
zarr_format: Literal[2] = field(init=False, default=2)
7475

@@ -82,7 +83,7 @@ def __init__(
8283
order: MemoryOrder,
8384
dimension_separator: Literal[".", "/"] = ".",
8485
compressor: CompressorLikev2 = None,
85-
filters: Iterable[numcodecs.abc.Codec | dict[str, JSON]] | None = None,
86+
filters: Iterable[Numcodec | dict[str, JSON]] | None = None,
8687
attributes: dict[str, JSON] | None = None,
8788
) -> None:
8889
"""
@@ -262,11 +263,11 @@ def parse_zarr_format(data: object) -> Literal[2]:
262263
raise ValueError(f"Invalid value. Expected 2. Got {data}.")
263264

264265

265-
def parse_filters(data: object) -> tuple[numcodecs.abc.Codec, ...] | None:
266+
def parse_filters(data: object) -> tuple[Numcodec, ...] | None:
266267
"""
267268
Parse a potential tuple of filters
268269
"""
269-
out: list[numcodecs.abc.Codec] = []
270+
out: list[Numcodec] = []
270271

271272
if data is None:
272273
return data
@@ -291,7 +292,7 @@ def parse_filters(data: object) -> tuple[numcodecs.abc.Codec, ...] | None:
291292
raise TypeError(msg)
292293

293294

294-
def parse_compressor(data: object) -> numcodecs.abc.Codec | None:
295+
def parse_compressor(data: object) -> Numcodec | None:
295296
"""
296297
Parse a potential compressor.
297298
"""

tests/test_config.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,18 @@ async def _encode_single(self, chunk_bytes: Buffer, chunk_spec: ArraySpec) -> Bu
180180
chunks=(10,),
181181
zarr_format=3,
182182
dtype="i4",
183-
compressors=[{"name": "blosc", "configuration": {"cname": "lz4", "clevel": 1, "shuffle": "noshuffle", "blocksize": 1, "typesize": 1}},],
183+
compressors=[
184+
{
185+
"name": "blosc",
186+
"configuration": {
187+
"cname": "lz4",
188+
"clevel": 1,
189+
"shuffle": "noshuffle",
190+
"blocksize": 1,
191+
"typesize": 1,
192+
},
193+
},
194+
],
184195
)
185196
arr[:] = range(100)
186197
_mock.call.assert_called()

tests/test_group.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,16 @@
1111

1212
import numpy as np
1313
import pytest
14-
from numcodecs import Blosc
1514

1615
import zarr
1716
import zarr.api.asynchronous
1817
import zarr.api.synchronous
19-
from zarr.core.array import default_compressor_v2, default_compressors_v3, default_serializer_v3
2018
import zarr.storage
2119
from zarr import Array, AsyncArray, AsyncGroup, Group
2220
from zarr.abc.store import Store
2321
from zarr.core import sync_group
2422
from zarr.core._info import GroupInfo
23+
from zarr.core.array import default_compressor_v2, default_compressors_v3, default_serializer_v3
2524
from zarr.core.buffer import default_buffer_prototype
2625
from zarr.core.config import config as zarr_config
2726
from zarr.core.dtype.common import unpack_dtype_json
@@ -524,7 +523,7 @@ def test_group_child_iterators(store: Store, zarr_format: ZarrFormat, consolidat
524523
"chunks": (1,),
525524
"order": "C",
526525
"filters": None,
527-
"compressor": default_compressor_v2(dtype).to_json(zarr_format=zarr_format),
526+
"compressor": default_compressor_v2(dtype).to_json(zarr_format=zarr_format),
528527
"zarr_format": zarr_format,
529528
},
530529
"subgroup": {

tests/test_regression/test_v2_dtype_regression.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from pathlib import Path
55
from typing import TYPE_CHECKING, Literal
66

7-
import numcodecs
87
import numpy as np
98
import pytest
109
from numcodecs import LZ4, LZMA, Blosc, GZip, VLenBytes, VLenUTF8, Zstd
@@ -13,6 +12,7 @@
1312
import zarr.abc
1413
import zarr.abc.codec
1514
import zarr.codecs as zarrcodecs
15+
from zarr.abc.codec import Numcodec
1616
from zarr.core.array import Array
1717
from zarr.core.chunk_key_encodings import V2ChunkKeyEncoding
1818
from zarr.core.dtype.npy.bytes import VariableLengthBytes
@@ -40,9 +40,9 @@ def runner_installed() -> bool:
4040
class ArrayParams:
4141
values: np.ndarray[tuple[int], np.dtype[np.generic]]
4242
fill_value: np.generic | str | int | bytes
43-
filters: tuple[numcodecs.abc.Codec, ...] = ()
43+
filters: tuple[Numcodec, ...] = ()
4444
serializer: str | None = None
45-
compressor: numcodecs.abc.Codec
45+
compressor: Numcodec
4646

4747

4848
basic_codecs = GZip(), Blosc(), LZ4(), LZMA(), Zstd()

0 commit comments

Comments
 (0)