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
3 changes: 2 additions & 1 deletion src/bo4e/bo/geschaeftsobjekt.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,13 @@ 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
"""

alias_generator = camelize
allow_population_by_field_name = True
extra = "allow"
json_encoders = {Decimal: str}
4 changes: 4 additions & 0 deletions src/bo4e/com/com.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,21 @@ class COM(BaseModel):

"""

# pylint:disable=duplicate-code
class Config:
"""
basic configuration for pydantic's behaviour
"""

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
13 changes: 13 additions & 0 deletions tests/test_externe_referenz.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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]
Comment on lines +71 to +76
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

nur für mein Verständnis, das hätte auch ohne das extra = "allow" geklappt oder?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Nein, genau dafür is extra="allow" da. Siehe

 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]

E AttributeError: 'ExterneReferenz' object has no attribute 'additional_key'

#441

15 changes: 15 additions & 0 deletions tests/test_messlokation.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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]