@@ -260,7 +260,7 @@ def test_delta_astype(store: StorePath):
260260 dtype = data .dtype ,
261261 fill_value = 0 ,
262262 filters = [
263- numcodecs .zarr3 . Delta (dtype = "i8" , astype = "i2" ), # type: ignore[arg-type]
263+ numcodecs .Delta (dtype = "i8" , astype = "i2" ), # type: ignore[arg-type]
264264 ],
265265 )
266266
@@ -277,3 +277,49 @@ def test_repr():
277277def test_to_dict ():
278278 codec = numcodecs .zarr3 .LZ4 (level = 5 )
279279 assert codec .to_dict () == {"name" : "numcodecs.lz4" , "configuration" : {"level" : 5 }}
280+
281+ @pytest .mark .parametrize (("codec_v2" , "expected_v3_cls" ),[
282+ (numcodecs .BZ2 (), numcodecs .zarr3 .BZ2 ),
283+ (numcodecs .CRC32 (), numcodecs .zarr3 .CRC32 ),
284+ (numcodecs .CRC32C (), numcodecs .zarr3 .CRC32C ),
285+ (numcodecs .LZ4 (), numcodecs .zarr3 .LZ4 ),
286+ (numcodecs .LZMA (), numcodecs .zarr3 .LZMA ),
287+ (numcodecs .ZFPY (), numcodecs .zarr3 .ZFPY ),
288+ (numcodecs .Adler32 (), numcodecs .zarr3 .Adler32 ),
289+ (numcodecs .AsType (encode_dtype = np .float64 ,decode_dtype = np .float32 ), numcodecs .zarr3 .AsType ),
290+ (numcodecs .BitRound (keepbits = 10 ), numcodecs .zarr3 .BitRound ),
291+ (numcodecs .Blosc (), numcodecs .zarr3 .Blosc ),
292+ (numcodecs .Delta (dtype = np .float64 ), numcodecs .zarr3 .Delta ),
293+ (numcodecs .FixedScaleOffset (offset = 1000 , scale = 10 , dtype = 'f8' , astype = 'u1' ), numcodecs .zarr3 .FixedScaleOffset ),
294+ (numcodecs .Fletcher32 (), numcodecs .zarr3 .Fletcher32 ),
295+ (numcodecs .GZip (), numcodecs .zarr3 .GZip ),
296+ (numcodecs .JenkinsLookup3 (), numcodecs .zarr3 .JenkinsLookup3 ),
297+ (numcodecs .PCodec (), numcodecs .zarr3 .PCodec ),
298+ (numcodecs .PackBits (), numcodecs .zarr3 .PackBits ),
299+ (numcodecs .Quantize (digits = 1 , dtype = 'f8' ), numcodecs .zarr3 .Quantize ),
300+ (numcodecs .Shuffle (), numcodecs .zarr3 .Shuffle ),
301+ (numcodecs .Zlib (), numcodecs .zarr3 .Zlib ),
302+ (numcodecs .Zstd (), numcodecs .zarr3 .Zstd ),
303+ ])
304+ def test_cast_numcodecs_to_v3 (store : Store , codec_v2 , expected_v3_cls ) -> None :
305+ result_v3 = numcodecs .zarr3 .to_zarr3 (codec_v2 )
306+
307+ assert result_v3 .__class__ == expected_v3_cls
308+ assert result_v3 .codec_config == codec_v2 .get_config ()
309+
310+ if issubclass (expected_v3_cls , numcodecs .zarr3 ._NumcodecsArrayArrayCodec ):
311+ codec_args = {"filters" : [result_v3 ]}
312+ elif issubclass (expected_v3_cls , numcodecs .zarr3 ._NumcodecsArrayBytesCodec ):
313+ codec_args = {"serializer" : result_v3 }
314+ elif issubclass (expected_v3_cls , numcodecs .zarr3 ._NumcodecsBytesBytesCodec ):
315+ codec_args = {"compressors" : [result_v3 ]}
316+ else :
317+ raise TypeError (f"unsupported type: { expected_v3_cls } " )
318+ zarr .create_array (
319+ store ,
320+ shape = (64 ,),
321+ chunks = (64 ,),
322+ dtype = np .bool ,
323+ fill_value = 0 ,
324+ ** codec_args
325+ )
0 commit comments