Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions src/bo4e/com/zeitreihenwertkompakt.py
Original file line number Diff line number Diff line change
@@ -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)
43 changes: 43 additions & 0 deletions tests/test_zeitreihenwertkompakt.py
Original file line number Diff line number Diff line change
@@ -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)