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
8 changes: 8 additions & 0 deletions docs/api/bo4e.com.rst
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,14 @@ bo4e.com.dienstleistung module
:undoc-members:
:show-inheritance:

bo4e.com.energieherkunft module
-------------------------------

.. automodule:: bo4e.com.energieherkunft
:members:
:undoc-members:
:show-inheritance:

bo4e.com.externereferenz module
-------------------------------

Expand Down
50 changes: 50 additions & 0 deletions src/bo4e/com/energieherkunft.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
"""
Contains Energieherkunft 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.erzeugungsart import Erzeugungsart


# pylint: disable=too-few-public-methods
@attr.s(auto_attribs=True, kw_only=True)
class Energieherkunft(COM):
"""
Abbildung einer Energieherkunft.
"""

# required attributes
#: Art der Erzeugung der Energie.
erzeugungsart: Erzeugungsart = attr.ib(validator=attr.validators.in_(Erzeugungsart))
#: Prozentualer Anteil der jeweiligen Erzeugungsart.
anteil_prozent: Decimal = attr.ib(validator=attr.validators.instance_of(Decimal))
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

kannste da noch prüfen, dass es 0<=anteil_prozent<=100 ist?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


@anteil_prozent.validator
# pylint: disable=unused-argument, no-self-use
def check_percentage_between_0_100(self, attribute, value):
"""Checks that the percentage is between 0 and 100."""
if not 0 <= value <= 100:
raise ValueError("anteil_prozent must be between 0 and 100")


class EnergieherkunftSchema(COMSchema):
"""
Schema for de-/serialization of Energieherkunft.
"""

# required attributes
erzeugungsart = EnumField(Erzeugungsart)
anteil_prozent = fields.Decimal(as_string=True)

# pylint: disable=no-self-use, unused-argument
@post_load
def deserialize(self, data, **kwargs) -> Energieherkunft:
"""Deserialize JSON to Energieherkunft object"""
return Energieherkunft(**data)
46 changes: 46 additions & 0 deletions tests/test_energieherkunft.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
from decimal import Decimal

import pytest # type:ignore[import]

from bo4e.com.energieherkunft import Energieherkunft, EnergieherkunftSchema
from bo4e.enum.erzeugungsart import Erzeugungsart
from tests.serialization_helper import assert_serialization_roundtrip # type:ignore[import]


class TestEnergieherkunft:
@pytest.mark.parametrize(
"energieherkunft, expected_json_dict",
[
pytest.param(
Energieherkunft(erzeugungsart=Erzeugungsart.BIOMASSE, anteil_prozent=Decimal(25.5)),
{
"erzeugungsart": "BIOMASSE",
"anteilProzent": "25.5",
},
),
],
)
def test_energieherkunft_required_attributes(self, energieherkunft, expected_json_dict):
"""
Test de-/serialisation of Energieherkunft with minimal attributes.
"""
assert_serialization_roundtrip(energieherkunft, EnergieherkunftSchema(), expected_json_dict)

def test_energieherkunft_missing_required_attribute(self):
with pytest.raises(TypeError) as excinfo:
_ = Energieherkunft()

assert "missing 2 required" in str(excinfo.value)

@pytest.mark.parametrize(
"failing_percentage",
[
pytest.param(100.1),
pytest.param(-2),
],
)
def test_energieherkunft_failing_validation(self, failing_percentage):
with pytest.raises(ValueError) as excinfo:
_ = (Energieherkunft(erzeugungsart=Erzeugungsart.BIOMASSE, anteil_prozent=Decimal(failing_percentage)),)

assert "anteil_prozent must be between 0 and 100" in str(excinfo.value)