102102 T_ArrayMetadata ,
103103)
104104from zarr .core .metadata .v2 import (
105+ CompressorLikev2 ,
105106 _default_compressor ,
106107 _default_filters ,
107108 parse_compressor ,
@@ -294,7 +295,7 @@ async def create(
294295 dimension_separator : Literal ["." , "/" ] | None = None ,
295296 order : MemoryOrder | None = None ,
296297 filters : list [dict [str , JSON ]] | None = None ,
297- compressor : dict [ str , JSON ] | None = None ,
298+ compressor : CompressorLikev2 | Literal [ "auto" ] = "auto" ,
298299 # runtime
299300 overwrite : bool = False ,
300301 data : npt .ArrayLike | None = None ,
@@ -385,7 +386,7 @@ async def create(
385386 dimension_separator : Literal ["." , "/" ] | None = None ,
386387 order : MemoryOrder | None = None ,
387388 filters : list [dict [str , JSON ]] | None = None ,
388- compressor : dict [ str , JSON ] | None = None ,
389+ compressor : CompressorLike = "auto" ,
389390 # runtime
390391 overwrite : bool = False ,
391392 data : npt .ArrayLike | None = None ,
@@ -420,7 +421,7 @@ async def create(
420421 dimension_separator : Literal ["." , "/" ] | None = None ,
421422 order : MemoryOrder | None = None ,
422423 filters : list [dict [str , JSON ]] | None = None ,
423- compressor : dict [ str , JSON ] | None = None ,
424+ compressor : CompressorLike = "auto" ,
424425 # runtime
425426 overwrite : bool = False ,
426427 data : npt .ArrayLike | None = None ,
@@ -561,7 +562,7 @@ async def _create(
561562 dimension_separator : Literal ["." , "/" ] | None = None ,
562563 order : MemoryOrder | None = None ,
563564 filters : list [dict [str , JSON ]] | None = None ,
564- compressor : dict [ str , JSON ] | None = None ,
565+ compressor : CompressorLike = "auto" ,
565566 # runtime
566567 overwrite : bool = False ,
567568 data : npt .ArrayLike | None = None ,
@@ -595,7 +596,7 @@ async def _create(
595596 raise ValueError (
596597 "filters cannot be used for arrays with zarr_format 3. Use array-to-array codecs instead."
597598 )
598- if compressor is not None :
599+ if compressor != "auto" :
599600 raise ValueError (
600601 "compressor cannot be used for arrays with zarr_format 3. Use bytes-to-bytes codecs instead."
601602 )
@@ -759,7 +760,7 @@ def _create_metadata_v2(
759760 dimension_separator : Literal ["." , "/" ] | None = None ,
760761 fill_value : float | None = None ,
761762 filters : Iterable [dict [str , JSON ] | numcodecs .abc .Codec ] | None = None ,
762- compressor : dict [ str , JSON ] | numcodecs . abc . Codec | None = None ,
763+ compressor : CompressorLikev2 = None ,
763764 attributes : dict [str , JSON ] | None = None ,
764765 ) -> ArrayV2Metadata :
765766 if dimension_separator is None :
@@ -800,7 +801,7 @@ async def _create_v2(
800801 dimension_separator : Literal ["." , "/" ] | None = None ,
801802 fill_value : float | None = None ,
802803 filters : Iterable [dict [str , JSON ] | numcodecs .abc .Codec ] | None = None ,
803- compressor : dict [ str , JSON ] | numcodecs . abc . Codec | None = None ,
804+ compressor : CompressorLike = "auto" ,
804805 attributes : dict [str , JSON ] | None = None ,
805806 overwrite : bool = False ,
806807 ) -> AsyncArray [ArrayV2Metadata ]:
@@ -812,6 +813,17 @@ async def _create_v2(
812813 else :
813814 await ensure_no_existing_node (store_path , zarr_format = 2 )
814815
816+ compressor_parsed : CompressorLikev2
817+ if compressor == "auto" :
818+ compressor_parsed = _default_compressor (dtype )
819+ elif isinstance (compressor , BytesBytesCodec ):
820+ raise ValueError (
821+ "Cannot use a BytesBytesCodec as a compressor for zarr v2 arrays. "
822+ "Use a numcodecs codec directly instead."
823+ )
824+ else :
825+ compressor_parsed = compressor
826+
815827 metadata = cls ._create_metadata_v2 (
816828 shape = shape ,
817829 dtype = dtype ,
@@ -820,7 +832,7 @@ async def _create_v2(
820832 dimension_separator = dimension_separator ,
821833 fill_value = fill_value ,
822834 filters = filters ,
823- compressor = compressor ,
835+ compressor = compressor_parsed ,
824836 attributes = attributes ,
825837 )
826838
@@ -1742,7 +1754,7 @@ def create(
17421754 dimension_separator : Literal ["." , "/" ] | None = None ,
17431755 order : MemoryOrder | None = None ,
17441756 filters : list [dict [str , JSON ]] | None = None ,
1745- compressor : dict [ str , JSON ] | None = None ,
1757+ compressor : CompressorLike = "auto" ,
17461758 # runtime
17471759 overwrite : bool = False ,
17481760 config : ArrayConfigLike | None = None ,
@@ -1871,7 +1883,7 @@ def _create(
18711883 dimension_separator : Literal ["." , "/" ] | None = None ,
18721884 order : MemoryOrder | None = None ,
18731885 filters : list [dict [str , JSON ]] | None = None ,
1874- compressor : dict [ str , JSON ] | None = None ,
1886+ compressor : CompressorLike = "auto" ,
18751887 # runtime
18761888 overwrite : bool = False ,
18771889 config : ArrayConfigLike | None = None ,
@@ -3783,7 +3795,11 @@ def _get_default_codecs(
37833795 | Literal ["auto" ]
37843796 | None
37853797)
3786- CompressorLike : TypeAlias = dict [str , JSON ] | BytesBytesCodec | numcodecs .abc .Codec | None
3798+ # Union of acceptable types for users to pass in for both v2 and v3 compressors
3799+ CompressorLike : TypeAlias = (
3800+ dict [str , JSON ] | BytesBytesCodec | numcodecs .abc .Codec | Literal ["auto" ] | None
3801+ )
3802+
37873803CompressorsLike : TypeAlias = (
37883804 Iterable [dict [str , JSON ] | BytesBytesCodec | numcodecs .abc .Codec ]
37893805 | dict [str , JSON ]
0 commit comments