diff --git a/src/bo4e/bo/geschaeftsobjekt.py b/src/bo4e/bo/geschaeftsobjekt.py index 0c33cdd7e..3607809fc 100644 --- a/src/bo4e/bo/geschaeftsobjekt.py +++ b/src/bo4e/bo/geschaeftsobjekt.py @@ -35,7 +35,7 @@ class Geschaeftsobjekt(BaseModel): # optional attributes externe_referenzen: Optional[List[ExterneReferenz]] = [] #: Hier können IDs anderer Systeme hinterlegt werden (z.B. eine SAP-GP-Nummer oder eine GUID) - + # pylint:disable=duplicate-code class Config: """ basic configuration for pydantic's behaviour @@ -43,4 +43,5 @@ class Config: alias_generator = camelize allow_population_by_field_name = True + extra = "allow" json_encoders = {Decimal: str} diff --git a/src/bo4e/com/com.py b/src/bo4e/com/com.py index 384e8f7c4..52c086ad8 100644 --- a/src/bo4e/com/com.py +++ b/src/bo4e/com/com.py @@ -26,6 +26,7 @@ class COM(BaseModel): """ + # pylint:disable=duplicate-code class Config: """ basic configuration for pydantic's behaviour @@ -33,10 +34,13 @@ class Config: alias_generator = camelize allow_population_by_field_name = True + extra = "allow" json_encoders = {Decimal: str} # pylint: disable=invalid-name #: Any type derived from COM including those that do not directly inherit from COM TCom = TypeVar("TCom", bound=Type[COM]) + + # todo: find out if this way of typing is correct diff --git a/tests/test_externe_referenz.py b/tests/test_externe_referenz.py index 19cf0e991..16bec8fac 100644 --- a/tests/test_externe_referenz.py +++ b/tests/test_externe_referenz.py @@ -1,3 +1,5 @@ +from typing import Any, Dict + from bo4e.bo.geschaeftspartner import Geschaeftspartner from bo4e.com.adresse import Adresse from bo4e.com.externereferenz import ExterneReferenz @@ -61,3 +63,14 @@ def test_geschaeftspartner_with_no_externe_referenz(self) -> None: deserialized_gp: Geschaeftspartner = Geschaeftspartner.parse_raw(gp_json) assert deserialized_gp.externe_referenzen == [] + + def test_extension_data(self) -> None: + """ + tests the behaviour of the json extension data (`extra="allow"`) + """ + er = ExterneReferenz(ex_ref_name="foo.bar", ex_ref_wert="12345") + er_json: Dict[str, Any] = er.dict() + er_json["additional_key"] = "additional_value" + deserialized_er: ExterneReferenz = ExterneReferenz.parse_obj(er_json) + assert isinstance(deserialized_er, ExterneReferenz) + assert deserialized_er.additional_key == "additional_value" # type:ignore[attr-defined] diff --git a/tests/test_messlokation.py b/tests/test_messlokation.py index d7ff3d6f8..63f5e2985 100644 --- a/tests/test_messlokation.py +++ b/tests/test_messlokation.py @@ -1,6 +1,7 @@ import json from datetime import datetime from decimal import Decimal +from typing import Any, Dict import pytest from pydantic import ValidationError @@ -214,3 +215,17 @@ def _instantiate_melo(melo_id: str) -> None: _instantiate_melo(melo_id) else: _instantiate_melo(melo_id) + + def test_extension_data(self) -> None: + """ + tests the behaviour of the json extension data (`extra="allow"`) + """ + melo = Messlokation( + messlokations_id="DE00056266802AO6G56M11SN51G21M24S", + sparte=Sparte.STROM, + ) + melo_json: Dict[str, Any] = melo.dict() + melo_json["additional_key"] = "additional_value" + deserialized_melo: Messlokation = Messlokation.parse_obj(melo_json) + assert isinstance(deserialized_melo, Messlokation) + assert deserialized_melo.additional_key == "additional_value" # type:ignore[attr-defined]