diff --git a/src/bo4e/com/zeitreihenwertkompakt.py b/src/bo4e/com/zeitreihenwertkompakt.py new file mode 100644 index 000000000..55ba6751f --- /dev/null +++ b/src/bo4e/com/zeitreihenwertkompakt.py @@ -0,0 +1,53 @@ +""" +Contains Zeitreihenwertkompakt class +and corresponding marshmallow schema for de-/serialization +""" +from decimal import Decimal + +import attr + +from marshmallow import fields, post_load +from marshmallow_enum import EnumField # type:ignore[import] + +from bo4e.com.com import COM, COMSchema +from bo4e.enum.messwertstatus import Messwertstatus +from bo4e.enum.messwertstatuszusatz import Messwertstatuszusatz + + +# pylint: disable=too-few-public-methods +@attr.s(auto_attribs=True, kw_only=True) +class Zeitreihenwertkompakt(COM): + """ + Abbildung eines kompakten Zeitreihenwertes in dem ausschliesslich der Wert und Statusinformationen stehen. + """ + + # required attributes + wert: Decimal = attr.ib(validator=attr.validators.instance_of(Decimal)) #: Der im Zeitintervall gültige Wert. + + # optional attributes + status: Messwertstatus = attr.ib( + default=None + ) #: Der Status gibt an, wie der Wert zu interpretieren ist, z.B. in Berechnungen. + + statuszusatz: Messwertstatuszusatz = attr.ib( + default=None + ) #: Eine Zusatzinformation zum Status, beispielsweise ein Grund für einen fehlenden Wert. + + +class ZeitreihenwertkompaktSchema(COMSchema): + """ + Schema for de-/serialization of Zeitreihenwertkompakt. + """ + + # required attributes + wert = fields.Decimal(as_string=True) + + # optional attributes + status = EnumField(Messwertstatus) + statuszusatz = EnumField(Messwertstatuszusatz) + + # pylint: disable=no-self-use, unused-argument + @post_load + def deserialize(self, data, **kwargs) -> Zeitreihenwertkompakt: + """Deserialize JSON to Zeitreihenwertkompakt object""" + return Zeitreihenwertkompakt(**data) diff --git a/tests/test_zeitreihenwertkompakt.py b/tests/test_zeitreihenwertkompakt.py new file mode 100644 index 000000000..54fc30969 --- /dev/null +++ b/tests/test_zeitreihenwertkompakt.py @@ -0,0 +1,43 @@ +from decimal import Decimal + +import pytest # type:ignore[import] + +from bo4e.com.zeitreihenwertkompakt import Zeitreihenwertkompakt, ZeitreihenwertkompaktSchema +from bo4e.enum.messwertstatus import Messwertstatus +from bo4e.enum.messwertstatuszusatz import Messwertstatuszusatz + + +class TestZeitreihenwertkompakt: + def test_serialization(self): + zrwk = Zeitreihenwertkompakt( + wert=Decimal(1.5), status=Messwertstatus.ABGELESEN, statuszusatz=Messwertstatuszusatz.Z78_GERAETEWECHSEL + ) + + schema = ZeitreihenwertkompaktSchema() + + json_string = schema.dumps(zrwk, ensure_ascii=False) + + assert "1.5" in json_string + assert "ABGELESEN" in json_string + assert "Z78_GERAETEWECHSEL" in json_string + deserialized_zrwk: Zeitreihenwertkompakt = schema.loads(json_string) + + assert isinstance(deserialized_zrwk.wert, Decimal) + assert deserialized_zrwk.wert == Decimal(1.5) + assert isinstance(deserialized_zrwk.status, Messwertstatus) + assert deserialized_zrwk.status == Messwertstatus.ABGELESEN + assert isinstance(deserialized_zrwk.statuszusatz, Messwertstatuszusatz) + assert deserialized_zrwk.statuszusatz == Messwertstatuszusatz.Z78_GERAETEWECHSEL + assert deserialized_zrwk == zrwk + + def test_wrong_datatype(self): + with pytest.raises(TypeError) as excinfo: + _ = Zeitreihenwertkompakt(wert="1.5") + + assert "wert" in str(excinfo.value) + + def test_missing_required_attribute(self): + with pytest.raises(TypeError) as excinfo: + _ = Zeitreihenwertkompakt(status=Messwertstatus.ABGELESEN) + + assert "missing 1 required" in str(excinfo.value)