Repository: bo4e/BO4E-python (language: python)

Issue:
Implement COM Zeitreihenwertkompakt
https://www.bo4e.de/dokumentation/komponenten/com-zeitreihenwertkompakt
- #100 
- #115 


Discussion / hints:

Fix patch:
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)


Test patch:
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)