diff --git a/nomad/datamodel/data.py b/nomad/datamodel/data.py index 6fcfd9080d6d3e8a3110a70a450358dc5ff6fc95..f5aa652d28a6078ce830b89358cd6dcbe51054dd 100644 --- a/nomad/datamodel/data.py +++ b/nomad/datamodel/data.py @@ -208,7 +208,7 @@ class UserReference(Reference): return value.user_id -user_reference = UserReference() +user_reference = UserReference class AuthorReference(Reference): @@ -233,7 +233,7 @@ class AuthorReference(Reference): raise ValueError(f'Cannot serialize {value}.') -author_reference = AuthorReference() +author_reference = AuthorReference class Query(JSON): diff --git a/nomad/metainfo/metainfo.py b/nomad/metainfo/metainfo.py index b659239c55615b1cae221e7b5664d39c8b1210fc..83a20b3094eb49c78e119ab6c9342e7d7c8dd349 100644 --- a/nomad/metainfo/metainfo.py +++ b/nomad/metainfo/metainfo.py @@ -474,7 +474,24 @@ class Reference: @property def _proxy_type(self): - return self._definition.type if self._definition else SectionReference() + return SectionReference() if self._definition is None else self._definition.type + + def _check_shape(self, value): + dimension: int = 0 + target = value + while isinstance(target, list): + dimension += 1 + if len(target) == 0: + break + # assuming consistent data + target = target[0] + + if dimension != ( + 0 if self._definition is None else len(self._definition.shape) + ): + raise ValueError(f'Invalid shape for {value}.') + + return value def serialize_self(self, section): if (context := section.m_root().m_context) is not None: @@ -540,7 +557,7 @@ class Reference: return self._normalize_impl(section, _v) - return _convert(value) + return self._check_shape(_convert(value)) def _serialize_impl(self, section, value): return _append_id( diff --git a/tests/metainfo/test_references.py b/tests/metainfo/test_references.py index d3bb48375742fc9cc0c72f550cbe4949b3d161ff..79e6a6cf34399e10d2cdc87af65cafb3c8b2fdcf 100644 --- a/tests/metainfo/test_references.py +++ b/tests/metainfo/test_references.py @@ -426,7 +426,7 @@ def test_user_author(def_type, value, expected_name): assert quantity.m_proxy_value == value assert ( quantity.m_proxy_type.target_section_def.name - == def_type.target_section_def.name + == def_type().target_section_def.name ) assert quantity.m_proxy_section == section assert resolved_quantity.name == expected_name @@ -443,6 +443,6 @@ def test_user_author(def_type, value, expected_name): assert deserialized_quantity.m_proxy_value == value assert ( deserialized_quantity.m_proxy_type.target_section_def.name - == def_type.target_section_def.name + == def_type().target_section_def.name ) assert resolved_deserialized_quantity.name == expected_name