108108 T_ArrayMetadata ,
109109)
110110from zarr .core .metadata .v2 import (
111+ CompressorLikev2 ,
111112 parse_compressor ,
112113 parse_filters ,
113114)
@@ -310,7 +311,7 @@ async def create(
310311 dimension_separator : Literal ["." , "/" ] | None = None ,
311312 order : MemoryOrder | None = None ,
312313 filters : list [dict [str , JSON ]] | None = None ,
313- compressor : dict [ str , JSON ] | None = None ,
314+ compressor : CompressorLikev2 | Literal [ "auto" ] = "auto" ,
314315 # runtime
315316 overwrite : bool = False ,
316317 data : npt .ArrayLike | None = None ,
@@ -401,7 +402,7 @@ async def create(
401402 dimension_separator : Literal ["." , "/" ] | None = None ,
402403 order : MemoryOrder | None = None ,
403404 filters : list [dict [str , JSON ]] | None = None ,
404- compressor : dict [ str , JSON ] | None = None ,
405+ compressor : CompressorLike = "auto" ,
405406 # runtime
406407 overwrite : bool = False ,
407408 data : npt .ArrayLike | None = None ,
@@ -436,7 +437,7 @@ async def create(
436437 dimension_separator : Literal ["." , "/" ] | None = None ,
437438 order : MemoryOrder | None = None ,
438439 filters : list [dict [str , JSON ]] | None = None ,
439- compressor : dict [ str , JSON ] | None = None ,
440+ compressor : CompressorLike = "auto" ,
440441 # runtime
441442 overwrite : bool = False ,
442443 data : npt .ArrayLike | None = None ,
@@ -577,7 +578,7 @@ async def _create(
577578 dimension_separator : Literal ["." , "/" ] | None = None ,
578579 order : MemoryOrder | None = None ,
579580 filters : list [dict [str , JSON ]] | None = None ,
580- compressor : dict [ str , JSON ] | None = None ,
581+ compressor : CompressorLike = "auto" ,
581582 # runtime
582583 overwrite : bool = False ,
583584 data : npt .ArrayLike | None = None ,
@@ -612,7 +613,7 @@ async def _create(
612613 raise ValueError (
613614 "filters cannot be used for arrays with zarr_format 3. Use array-to-array codecs instead."
614615 )
615- if compressor is not None :
616+ if compressor != "auto" :
616617 raise ValueError (
617618 "compressor cannot be used for arrays with zarr_format 3. Use bytes-to-bytes codecs instead."
618619 )
@@ -782,7 +783,7 @@ def _create_metadata_v2(
782783 dimension_separator : Literal ["." , "/" ] | None = None ,
783784 fill_value : float | None = None ,
784785 filters : Iterable [dict [str , JSON ] | numcodecs .abc .Codec ] | None = None ,
785- compressor : dict [ str , JSON ] | numcodecs . abc . Codec | None = None ,
786+ compressor : CompressorLikev2 = None ,
786787 attributes : dict [str , JSON ] | None = None ,
787788 ) -> ArrayV2Metadata :
788789 if dimension_separator is None :
@@ -813,7 +814,7 @@ async def _create_v2(
813814 dimension_separator : Literal ["." , "/" ] | None = None ,
814815 fill_value : float | None = None ,
815816 filters : Iterable [dict [str , JSON ] | numcodecs .abc .Codec ] | None = None ,
816- compressor : dict [ str , JSON ] | numcodecs . abc . Codec | None = None ,
817+ compressor : CompressorLike = "auto" ,
817818 attributes : dict [str , JSON ] | None = None ,
818819 overwrite : bool = False ,
819820 ) -> AsyncArray [ArrayV2Metadata ]:
@@ -825,6 +826,17 @@ async def _create_v2(
825826 else :
826827 await ensure_no_existing_node (store_path , zarr_format = 2 )
827828
829+ compressor_parsed : CompressorLikev2
830+ if compressor == "auto" :
831+ _ , compressor_parsed = _get_default_chunk_encoding_v2 (dtype )
832+ elif isinstance (compressor , BytesBytesCodec ):
833+ raise ValueError (
834+ "Cannot use a BytesBytesCodec as a compressor for zarr v2 arrays. "
835+ "Use a numcodecs codec directly instead."
836+ )
837+ else :
838+ compressor_parsed = compressor
839+
828840 metadata = cls ._create_metadata_v2 (
829841 shape = shape ,
830842 dtype = dtype ,
@@ -833,7 +845,7 @@ async def _create_v2(
833845 dimension_separator = dimension_separator ,
834846 fill_value = fill_value ,
835847 filters = filters ,
836- compressor = compressor ,
848+ compressor = compressor_parsed ,
837849 attributes = attributes ,
838850 )
839851
@@ -1780,7 +1792,7 @@ def create(
17801792 dimension_separator : Literal ["." , "/" ] | None = None ,
17811793 order : MemoryOrder | None = None ,
17821794 filters : list [dict [str , JSON ]] | None = None ,
1783- compressor : dict [ str , JSON ] | None = None ,
1795+ compressor : CompressorLike = "auto" ,
17841796 # runtime
17851797 overwrite : bool = False ,
17861798 config : ArrayConfigLike | None = None ,
@@ -1909,7 +1921,7 @@ def _create(
19091921 dimension_separator : Literal ["." , "/" ] | None = None ,
19101922 order : MemoryOrder | None = None ,
19111923 filters : list [dict [str , JSON ]] | None = None ,
1912- compressor : dict [ str , JSON ] | None = None ,
1924+ compressor : CompressorLike = "auto" ,
19131925 # runtime
19141926 overwrite : bool = False ,
19151927 config : ArrayConfigLike | None = None ,
@@ -3814,7 +3826,11 @@ def _build_parents(
38143826 | Literal ["auto" ]
38153827 | None
38163828)
3817- CompressorLike : TypeAlias = dict [str , JSON ] | BytesBytesCodec | numcodecs .abc .Codec | None
3829+ # Union of acceptable types for users to pass in for both v2 and v3 compressors
3830+ CompressorLike : TypeAlias = (
3831+ dict [str , JSON ] | BytesBytesCodec | numcodecs .abc .Codec | Literal ["auto" ] | None
3832+ )
3833+
38183834CompressorsLike : TypeAlias = (
38193835 Iterable [dict [str , JSON ] | BytesBytesCodec | numcodecs .abc .Codec ]
38203836 | dict [str , JSON ]
0 commit comments