102
102
T_ArrayMetadata,
103
103
)
104
104
from zarr.core.metadata.v2 import (
105
+ CompressorLikev2,
105
106
_default_compressor,
106
107
_default_filters,
107
108
parse_compressor,
@@ -303,7 +304,7 @@ async def create(
303
304
dimension_separator: Literal[".", "/"] | None = None,
304
305
order: MemoryOrder | None = None,
305
306
filters: list[dict[str, JSON]] | None = None,
306
- compressor: dict[str, JSON] | None = None ,
307
+ compressor: CompressorLikev2 | Literal["auto"] = "auto" ,
307
308
# runtime
308
309
overwrite: bool = False,
309
310
data: npt.ArrayLike | None = None,
@@ -394,7 +395,7 @@ async def create(
394
395
dimension_separator: Literal[".", "/"] | None = None,
395
396
order: MemoryOrder | None = None,
396
397
filters: list[dict[str, JSON]] | None = None,
397
- compressor: dict[str, JSON] | None = None ,
398
+ compressor: CompressorLike = "auto" ,
398
399
# runtime
399
400
overwrite: bool = False,
400
401
data: npt.ArrayLike | None = None,
@@ -429,7 +430,7 @@ async def create(
429
430
dimension_separator: Literal[".", "/"] | None = None,
430
431
order: MemoryOrder | None = None,
431
432
filters: list[dict[str, JSON]] | None = None,
432
- compressor: dict[str, JSON] | None = None ,
433
+ compressor: CompressorLike = "auto" ,
433
434
# runtime
434
435
overwrite: bool = False,
435
436
data: npt.ArrayLike | None = None,
@@ -570,7 +571,7 @@ async def _create(
570
571
dimension_separator: Literal[".", "/"] | None = None,
571
572
order: MemoryOrder | None = None,
572
573
filters: list[dict[str, JSON]] | None = None,
573
- compressor: dict[str, JSON] | None = None ,
574
+ compressor: CompressorLike = "auto" ,
574
575
# runtime
575
576
overwrite: bool = False,
576
577
data: npt.ArrayLike | None = None,
@@ -604,7 +605,7 @@ async def _create(
604
605
raise ValueError(
605
606
"filters cannot be used for arrays with zarr_format 3. Use array-to-array codecs instead."
606
607
)
607
- if compressor is not None :
608
+ if compressor != "auto" :
608
609
raise ValueError(
609
610
"compressor cannot be used for arrays with zarr_format 3. Use bytes-to-bytes codecs instead."
610
611
)
@@ -768,7 +769,7 @@ def _create_metadata_v2(
768
769
dimension_separator: Literal[".", "/"] | None = None,
769
770
fill_value: float | None = None,
770
771
filters: Iterable[dict[str, JSON] | numcodecs.abc.Codec] | None = None,
771
- compressor: dict[str, JSON] | numcodecs.abc.Codec | None = None,
772
+ compressor: CompressorLikev2 = None,
772
773
attributes: dict[str, JSON] | None = None,
773
774
) -> ArrayV2Metadata:
774
775
if dimension_separator is None:
@@ -809,7 +810,7 @@ async def _create_v2(
809
810
dimension_separator: Literal[".", "/"] | None = None,
810
811
fill_value: float | None = None,
811
812
filters: Iterable[dict[str, JSON] | numcodecs.abc.Codec] | None = None,
812
- compressor: dict[str, JSON] | numcodecs.abc.Codec | None = None ,
813
+ compressor: CompressorLike = "auto" ,
813
814
attributes: dict[str, JSON] | None = None,
814
815
overwrite: bool = False,
815
816
) -> AsyncArray[ArrayV2Metadata]:
@@ -821,6 +822,17 @@ async def _create_v2(
821
822
else:
822
823
await ensure_no_existing_node(store_path, zarr_format=2)
823
824
825
+ compressor_parsed: CompressorLikev2
826
+ if compressor == "auto":
827
+ compressor_parsed = _default_compressor(dtype)
828
+ elif isinstance(compressor, BytesBytesCodec):
829
+ raise ValueError(
830
+ "Cannot use a BytesBytesCodec as a compressor for zarr v2 arrays. "
831
+ "Use a numcodecs codec directly instead."
832
+ )
833
+ else:
834
+ compressor_parsed = compressor
835
+
824
836
metadata = cls._create_metadata_v2(
825
837
shape=shape,
826
838
dtype=dtype,
@@ -829,7 +841,7 @@ async def _create_v2(
829
841
dimension_separator=dimension_separator,
830
842
fill_value=fill_value,
831
843
filters=filters,
832
- compressor=compressor ,
844
+ compressor=compressor_parsed ,
833
845
attributes=attributes,
834
846
)
835
847
@@ -1751,7 +1763,7 @@ def create(
1751
1763
dimension_separator: Literal[".", "/"] | None = None,
1752
1764
order: MemoryOrder | None = None,
1753
1765
filters: list[dict[str, JSON]] | None = None,
1754
- compressor: dict[str, JSON] | None = None ,
1766
+ compressor: CompressorLike = "auto" ,
1755
1767
# runtime
1756
1768
overwrite: bool = False,
1757
1769
config: ArrayConfigLike | None = None,
@@ -1880,7 +1892,7 @@ def _create(
1880
1892
dimension_separator: Literal[".", "/"] | None = None,
1881
1893
order: MemoryOrder | None = None,
1882
1894
filters: list[dict[str, JSON]] | None = None,
1883
- compressor: dict[str, JSON] | None = None ,
1895
+ compressor: CompressorLike = "auto" ,
1884
1896
# runtime
1885
1897
overwrite: bool = False,
1886
1898
config: ArrayConfigLike | None = None,
@@ -3792,7 +3804,11 @@ def _get_default_codecs(
3792
3804
| Literal["auto"]
3793
3805
| None
3794
3806
)
3795
- CompressorLike: TypeAlias = dict[str, JSON] | BytesBytesCodec | numcodecs.abc.Codec | None
3807
+ # Union of acceptable types for users to pass in for both v2 and v3 compressors
3808
+ CompressorLike: TypeAlias = (
3809
+ dict[str, JSON] | BytesBytesCodec | numcodecs.abc.Codec | Literal["auto"] | None
3810
+ )
3811
+
3796
3812
CompressorsLike: TypeAlias = (
3797
3813
Iterable[dict[str, JSON] | BytesBytesCodec | numcodecs.abc.Codec]
3798
3814
| dict[str, JSON]
0 commit comments