@@ -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 (
0 commit comments