diff --git a/nomad/metainfo/metainfo.py b/nomad/metainfo/metainfo.py index 59e554b9a31e582c3d1dd908e7588032f10f45b3..4523faddd567fa0c0e425a6130c6ba9c6e224a7f 100644 --- a/nomad/metainfo/metainfo.py +++ b/nomad/metainfo/metainfo.py @@ -392,20 +392,11 @@ class _Unit(DataType): return value.__str__() - # The delta prefixes are not serialized: only implicit deltas are - # allowed currently. - # return reduce(lambda a, b: a.replace(b, ''), _delta_symbols, value) - def deserialize(self, section, quantity_def: Quantity, value): check_unit(value) - - # The serialized version has the deltas always in correct locations, so - # we skip the automatic delta conversion. This way users can also choose - # to not use delta units with ureg.parse_units('celsius/hr', - # as_delta=False) - value = units.parse_units(value, as_delta=False) - + value = units.parse_units(value) check_dimensionality(quantity_def, value) + return value diff --git a/tests/metainfo/test_metainfo.py b/tests/metainfo/test_metainfo.py index f4702c2528b2183573450facefd2856b47e71055..cb7d75da73e70680de7e7a9e29f3b125f62a7896 100644 --- a/tests/metainfo/test_metainfo.py +++ b/tests/metainfo/test_metainfo.py @@ -215,58 +215,71 @@ class TestM2: assert System.lattice_vectors.unit is not None @pytest.mark.parametrize( - 'unit, serialization', + 'unit, serialized, deserialized', [ pytest.param( 'delta_degC', 'delta_degree_Celsius', + 'delta_degree_Celsius', id='explicit delta full, non-multiplicative, string', ), pytest.param( 'ΔdegC', 'delta_degree_Celsius', + 'delta_degree_Celsius', id='explicit delta short, non-multiplicative, string', ), pytest.param( 'delta_degC / hr', 'delta_degree_Celsius / hour', + 'delta_degree_Celsius / hour', id='explicit delta full, multiplicative, string', ), pytest.param( 'ΔdegC / hr', 'delta_degree_Celsius / hour', + 'delta_degree_Celsius / hour', id='explicit delta short, multiplicative, string', ), pytest.param( ureg.delta_degC / ureg.hour, 'delta_degree_Celsius / hour', + 'delta_degree_Celsius / hour', id='explicit delta, multiplicative, objects', ), pytest.param( 'degC / hr', 'delta_degree_Celsius / hour', + 'delta_degree_Celsius / hour', id='implicit delta, multiplicative, string', ), - pytest.param('degC', 'degree_Celsius', id='no delta, non-multiplicative'), + pytest.param( + 'degC', + 'degree_Celsius', + 'degree_Celsius', + id='no delta, non-multiplicative', + ), pytest.param( ureg.parse_units('degC / hr', as_delta=False), 'degree_Celsius / hour', - id='no delta, multiplicative, string', + 'delta_degree_Celsius / hour', + id='non-delta units ignored in deserialization 1', ), pytest.param( ureg.degC / ureg.hour, 'degree_Celsius / hour', - id='no delta, multiplicative, objects', + 'delta_degree_Celsius / hour', + id='non-delta units ignored in deserialization 2', ), ], ) - def test_unit_delta(self, unit, serialization): + def test_unit_delta(self, unit, serialized, deserialized): quantity = Quantity(type=np.dtype(np.float64), unit=unit) - serialized = quantity.m_to_dict() - deserialized = quantity.m_from_dict(serialized) + serialized_dict = quantity.m_to_dict() + deserialized_obj = quantity.m_from_dict(serialized_dict) - assert serialized['unit'] == serialization - assert str(deserialized.unit) == str(quantity.unit) + assert serialized_dict['unit'] == serialized + assert str(deserialized_obj.unit) == deserialized @pytest.mark.parametrize( 'dtype', [pytest.param(np.longlong), pytest.param(np.ulonglong)]