@@ -510,9 +510,9 @@ def test_info_v3(self, chunks: tuple[int, int], shards: tuple[int, int] | None)
510510 _order = "C" ,
511511 _read_only = False ,
512512 _store_type = "MemoryStore" ,
513- _codecs = [ BytesCodec (), ZstdCodec ()]
513+ _codecs = ( BytesCodec (), ZstdCodec ())
514514 if shards is None
515- else [ ShardingCodec (chunk_shape = chunks , codecs = [BytesCodec (), ZstdCodec ()])] ,
515+ else ( ShardingCodec (chunk_shape = chunks , codecs = [BytesCodec (), ZstdCodec ()]),) ,
516516 _count_bytes = 512 ,
517517 )
518518 assert result == expected
@@ -536,7 +536,7 @@ def test_info_complete(self, chunks: tuple[int, int], shards: tuple[int, int] |
536536 _order = "C" ,
537537 _read_only = False ,
538538 _store_type = "MemoryStore" ,
539- _codecs = [ BytesCodec ()] if shards is None else [ ShardingCodec (chunk_shape = chunks )] ,
539+ _codecs = ( BytesCodec (),) if shards is None else ( ShardingCodec (chunk_shape = chunks ),) ,
540540 _count_bytes = 512 ,
541541 _count_chunks_initialized = 0 ,
542542 _count_bytes_stored = 373 if shards is None else 578 , # the metadata?
@@ -596,9 +596,9 @@ async def test_info_v3_async(
596596 _order = "C" ,
597597 _read_only = False ,
598598 _store_type = "MemoryStore" ,
599- _codecs = [ BytesCodec (), ZstdCodec ()]
599+ _codecs = ( BytesCodec (), ZstdCodec ())
600600 if shards is None
601- else [ ShardingCodec (chunk_shape = chunks , codecs = [BytesCodec (), ZstdCodec ()])] ,
601+ else ( ShardingCodec (chunk_shape = chunks , codecs = [BytesCodec (), ZstdCodec ()]),) ,
602602 _count_bytes = 512 ,
603603 )
604604 assert result == expected
@@ -624,7 +624,7 @@ async def test_info_complete_async(
624624 _order = "C" ,
625625 _read_only = False ,
626626 _store_type = "MemoryStore" ,
627- _codecs = [ BytesCodec ()] if shards is None else [ ShardingCodec (chunk_shape = chunks )] ,
627+ _codecs = ( BytesCodec (),) if shards is None else ( ShardingCodec (chunk_shape = chunks ),) ,
628628 _count_bytes = 512 ,
629629 _count_chunks_initialized = 0 ,
630630 _count_bytes_stored = 373 if shards is None else 578 , # the metadata?
@@ -839,7 +839,8 @@ def test_array_create_metadata_order_v2(
839839 arr = zarr .create_array (store = store , shape = (2 , 2 ), order = order , zarr_format = 2 , dtype = "i4" )
840840
841841 expected = order or zarr .config .get ("array.order" )
842- assert arr .metadata .order == expected # type: ignore[union-attr]
842+ assert arr .metadata .zarr_format == 2 # guard for mypy
843+ assert arr .metadata .order == expected
843844
844845
845846@pytest .mark .parametrize ("order_config" , ["C" , "F" , None ])
@@ -1048,10 +1049,15 @@ async def test_create_array_no_filters_compressors(
10481049 compressors = empty_value ,
10491050 filters = empty_value ,
10501051 )
1052+ # Test metadata explicitly
1053+ assert arr .metadata .zarr_format == 2 # guard for mypy
10511054 # The v2 metadata stores None and () separately
1052- assert arr .metadata .filters == empty_value # type: ignore[union-attr]
1055+ assert arr .metadata .filters == empty_value
10531056 # The v2 metadata does not allow tuple for compressor, therefore it is turned into None
1054- assert arr .metadata .compressor is None # type: ignore[union-attr]
1057+ assert arr .metadata .compressor is None
1058+
1059+ assert arr .filters == ()
1060+ assert arr .compressors == ()
10551061
10561062 # v3
10571063 arr = await create_array (
@@ -1061,10 +1067,13 @@ async def test_create_array_no_filters_compressors(
10611067 compressors = empty_value ,
10621068 filters = empty_value ,
10631069 )
1070+ assert arr .metadata .zarr_format == 3 # guard for mypy
10641071 if dtype == "str" :
1065- assert arr .metadata .codecs == [VLenUTF8Codec ()] # type: ignore[union-attr]
1072+ assert arr .metadata .codecs == (VLenUTF8Codec (),)
1073+ assert arr .serializer == VLenUTF8Codec ()
10661074 else :
1067- assert arr .metadata .codecs == [BytesCodec ()] # type: ignore[union-attr]
1075+ assert arr .metadata .codecs == (BytesCodec (),)
1076+ assert arr .serializer == BytesCodec ()
10681077
10691078
10701079@pytest .mark .parametrize ("store" , ["memory" ], indirect = True )
@@ -1130,12 +1139,11 @@ async def test_create_array_v3_chunk_encoding(
11301139 filters = filters ,
11311140 compressors = compressors ,
11321141 )
1133- aa_codecs_expected , _ , bb_codecs_expected = _parse_chunk_encoding_v3 (
1142+ filters_expected , _ , compressors_expected = _parse_chunk_encoding_v3 (
11341143 filters = filters , compressors = compressors , serializer = "auto" , dtype = np .dtype (dtype )
11351144 )
1136- # TODO: find a better way to get the filters / compressors from the array.
1137- assert arr .codec_pipeline .array_array_codecs == aa_codecs_expected # type: ignore[attr-defined]
1138- assert arr .codec_pipeline .bytes_bytes_codecs == bb_codecs_expected # type: ignore[attr-defined]
1145+ assert arr .filters == filters_expected
1146+ assert arr .compressors == compressors_expected
11391147
11401148
11411149@pytest .mark .parametrize ("store" , ["memory" ], indirect = True )
@@ -1167,9 +1175,16 @@ async def test_create_array_v2_chunk_encoding(
11671175 filters_expected , compressor_expected = _parse_chunk_encoding_v2 (
11681176 filters = filters , compressor = compressors , dtype = np .dtype (dtype )
11691177 )
1170- # TODO: find a better way to get the filters/compressor from the array.
1171- assert arr .metadata .compressor == compressor_expected # type: ignore[union-attr]
1172- assert arr .metadata .filters == filters_expected # type: ignore[union-attr]
1178+ assert arr .metadata .zarr_format == 2 # guard for mypy
1179+ assert arr .metadata .compressor == compressor_expected
1180+ assert arr .metadata .filters == filters_expected
1181+
1182+ # Normalize for property getters
1183+ compressor_expected = () if compressor_expected is None else (compressor_expected ,)
1184+ filters_expected = () if filters_expected is None else filters_expected
1185+
1186+ assert arr .compressors == compressor_expected
1187+ assert arr .filters == filters_expected
11731188
11741189
11751190@pytest .mark .parametrize ("store" , ["memory" ], indirect = True )
@@ -1185,12 +1200,12 @@ async def test_create_array_v3_default_filters_compressors(store: MemoryStore, d
11851200 shape = (10 ,),
11861201 zarr_format = 3 ,
11871202 )
1188- expected_aa , expected_ab , expected_bb = _get_default_chunk_encoding_v3 (np_dtype = np . dtype ( dtype ))
1189- # TODO: define the codec pipeline class such that these fields are required, which will obviate the
1190- # type ignore statements
1191- assert arr .codec_pipeline . array_array_codecs == expected_aa # type: ignore[attr-defined]
1192- assert arr .codec_pipeline . bytes_bytes_codecs == expected_bb # type: ignore[attr-defined]
1193- assert arr .codec_pipeline . array_bytes_codec == expected_ab # type: ignore[attr-defined]
1203+ expected_filters , expected_serializer , expected_compressors = _get_default_chunk_encoding_v3 (
1204+ np_dtype = np . dtype ( dtype )
1205+ )
1206+ assert arr .filters == expected_filters
1207+ assert arr .serializer == expected_serializer
1208+ assert arr .compressors == expected_compressors
11941209
11951210
11961211@pytest .mark .parametrize ("store" , ["memory" ], indirect = True )
@@ -1209,8 +1224,15 @@ async def test_create_array_v2_default_filters_compressors(store: MemoryStore, d
12091224 expected_filters , expected_compressors = _get_default_chunk_encoding_v2 (
12101225 np_dtype = np .dtype (dtype )
12111226 )
1212- assert arr .metadata .filters == expected_filters # type: ignore[union-attr]
1213- assert arr .metadata .compressor == expected_compressors # type: ignore[union-attr]
1227+ assert arr .metadata .zarr_format == 2 # guard for mypy
1228+ assert arr .metadata .filters == expected_filters
1229+ assert arr .metadata .compressor == expected_compressors
1230+
1231+ # Normalize for property getters
1232+ expected_filters = () if expected_filters is None else expected_filters
1233+ expected_compressors = () if expected_compressors is None else (expected_compressors ,)
1234+ assert arr .filters == expected_filters
1235+ assert arr .compressors == expected_compressors
12141236
12151237
12161238@pytest .mark .parametrize ("store" , ["memory" ], indirect = True )
0 commit comments