Skip to content

Commit 72a28e2

Browse files
committed
if data type has endianness, then codecs must specify endian attribute
1 parent 4967003 commit 72a28e2

File tree

2 files changed

+79
-9
lines changed

2 files changed

+79
-9
lines changed

src/zarr/core/metadata/v3.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,10 @@ def parse_node_type_array(data: object) -> Literal["array"]:
6464
raise NodeTypeValidationError("node_type", "array", data)
6565

6666

67-
def parse_codecs(data: object) -> tuple[Codec, ...]:
67+
def parse_codecs(data: object, data_type_has_endianness: bool) -> tuple[Codec, ...]:
68+
"""
69+
if data type has endianness, then codecs must specify endian attribute
70+
"""
6871
out: tuple[Codec, ...] = ()
6972

7073
if not isinstance(data, Iterable):
@@ -79,8 +82,18 @@ def parse_codecs(data: object) -> tuple[Codec, ...]:
7982
else:
8083
if isinstance(c, str):
8184
c = {"name": c}
82-
name_parsed, _ = parse_named_configuration(c, require_configuration=False)
83-
out += (get_codec_class(name_parsed).from_dict(c),)
85+
name_parsed, config_parsed = parse_named_configuration(c, require_configuration=False)
86+
codec = get_codec_class(name_parsed).from_dict(c)
87+
88+
if (
89+
hasattr(codec, "endian")
90+
and data_type_has_endianness
91+
and (config_parsed is None or "endian" not in config_parsed)
92+
):
93+
raise ValueError(
94+
f"Expected {name_parsed} codec to specify argument endian for data types for which endianness is applicable."
95+
)
96+
out += (codec,)
8497

8598
return out
8699

@@ -282,7 +295,9 @@ def __init__(
282295
fill_value, dtype=cast(ALL_DTYPES, data_type_parsed.value)
283296
)
284297
attributes_parsed = parse_attributes(attributes)
285-
codecs_parsed_partial = parse_codecs(codecs)
298+
codecs_parsed_partial = parse_codecs(
299+
codecs, data_type_has_endianness=data_type_parsed.has_endianness
300+
)
286301
storage_transformers_parsed = parse_storage_transformers(storage_transformers)
287302

288303
array_spec = ArraySpec(

tests/test_metadata/test_v3.py

Lines changed: 60 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -451,8 +451,63 @@ def test_string_codecs() -> None:
451451
assert result1.codecs == expected.codecs
452452
result2 = ArrayV3Metadata.from_dict(default_metadata_dict(data_type="bool", codecs="bytes"))
453453
assert result2.codecs == expected.codecs
454-
# TODO
455-
# with pytest.raises(
456-
# ValueError, match="Expected bytes codec to specify argument endian for data_type=int16"
457-
# ):
458-
# ArrayV3Metadata.from_dict(default_metadata_dict(data_type="int16", codecs=["bytes"]))
454+
455+
456+
def test_codec_requires_endian() -> None:
457+
with pytest.raises(
458+
ValueError,
459+
match="Expected bytes codec to specify argument endian for data types for which endianness is applicable.",
460+
):
461+
ArrayV3Metadata.from_dict(
462+
default_metadata_dict(data_type="int16", codecs=[{"name": "bytes"}])
463+
)
464+
465+
with pytest.raises(
466+
ValueError,
467+
match="Expected bytes codec to specify argument endian for data types for which endianness is applicable.",
468+
):
469+
ArrayV3Metadata.from_dict(
470+
default_metadata_dict(
471+
data_type="int16", codecs=[{"name": "bytes", "configuration": {}}]
472+
)
473+
)
474+
475+
ArrayV3Metadata.from_dict(
476+
default_metadata_dict(
477+
data_type="int16", codecs=[{"name": "bytes", "configuration": {"endian": "little"}}]
478+
)
479+
)
480+
481+
ArrayV3Metadata.from_dict(
482+
default_metadata_dict(
483+
data_type="int16",
484+
codecs=[
485+
{
486+
"name": "sharding_indexed",
487+
"configuration": {
488+
"chunk_shape": (1,),
489+
"codecs": [{"name": "bytes", "configuration": {"endian": "little"}}]
490+
},
491+
}
492+
],
493+
)
494+
)
495+
496+
#TODO
497+
with pytest.raises(
498+
ValueError,
499+
match="Expected bytes codec to specify argument endian for data types for which endianness is applicable.",
500+
):
501+
ArrayV3Metadata.from_dict(
502+
default_metadata_dict(
503+
data_type="int16",
504+
codecs=[
505+
{
506+
"name": "sharding_indexed",
507+
"configuration": {
508+
"chunk_shape": (1,),
509+
},
510+
}
511+
],
512+
)
513+
)

0 commit comments

Comments
 (0)