Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Zeitmenge and Zeitspanne (as future replacements for Zeitraum) #611

Closed
wants to merge 13 commits into from
45 changes: 45 additions & 0 deletions json_schemas/com/Zeitmenge.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{
"$defs": {
"Zeiteinheit": {
"description": "Auflistung möglicher Einheiten zur Verwendung in zeitbezogenen Angaben.",
"enum": [
"SEKUNDE",
"MINUTE",
"STUNDE",
"VIERTEL_STUNDE",
"TAG",
"WOCHE",
"MONAT",
"QUARTAL",
"HALBJAHR",
"JAHR"
],
"title": "Zeiteinheit",
"type": "string"
}
},
"additionalProperties": true,
"description": "Eine Zeitmenge ist eine Anzahl mit Zeiteinheit; z.B. \"5 Tage\" oder \"1 Monat\".\nDer Unterschied zur Zeitspanne ist, dass Start- und Endzeitpunkt nicht angegeben werden.\nDie Zeitmenge ist aus dem COM Zeitraum hervorgegangen, das in Zeitspanne und Zeitmenge aufgeteilt wurde.",
"properties": {
"dauer": {
"anyOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"title": "Dauer"
},
"einheit": {
"$ref": "#/$defs/Zeiteinheit"
}
},
"required": [
"einheit",
"dauer"
],
"title": "Zeitmenge",
"type": "object"
}
36 changes: 36 additions & 0 deletions json_schemas/com/Zeitspanne.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"additionalProperties": true,
"description": "Eine Zeitspanne ist definiert aus Start und/oder Ende.\nDer Unterschied zur Zeitmenge ist, dass konkrete Start- und Endzeitpunkt angegeben werden.\nDie Zeitspanne ist aus dem COM Zeitraum hervorgegangen, das in Zeitspanne und Zeitmenge aufgeteilt wurde.",
"properties": {
"ende": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"title": "Ende"
},
"start": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"title": "Start"
}
},
"required": [
"start",
"ende"
],
"title": "Zeitspanne",
"type": "object"
}
19 changes: 19 additions & 0 deletions src/bo4e/com/zeitmenge.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
"""
contains the COM Zeitmenge
"""
from decimal import Decimal

from bo4e.com.com import COM
from bo4e.enum.zeiteinheit import Zeiteinheit


class Zeitmenge(COM):
"""
Eine Zeitmenge ist eine Anzahl mit Zeiteinheit; z.B. "5 Tage" oder "1 Monat".
Der Unterschied zur Zeitspanne ist, dass Start- und Endzeitpunkt nicht angegeben werden.
Die Zeitmenge ist aus dem COM Zeitraum hervorgegangen, das in Zeitspanne und Zeitmenge aufgeteilt wurde.
"""

# I made those _not_ optional because the entire instance of Zeitmenge is pointless if one of the two is missing
einheit: Zeiteinheit #: z.B. Tage
dauer: Decimal #: z.B: 5
Copy link
Collaborator

Choose a reason for hiding this comment

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

Das soll doch mit dem COM Menge verheiratet werden. Planst du, das hier einzuführen, um es später wieder rauszukicken?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

dfer PR ist von gestern.

19 changes: 19 additions & 0 deletions src/bo4e/com/zeitspanne.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
"""
contains the COM Zeitspanne
"""
from datetime import datetime
from typing import Optional

from bo4e.com.com import COM


class Zeitspanne(COM):
"""
Eine Zeitspanne ist definiert aus Start und/oder Ende.
Der Unterschied zur Zeitmenge ist, dass konkrete Start- und Endzeitpunkt angegeben werden.
Die Zeitspanne ist aus dem COM Zeitraum hervorgegangen, das in Zeitspanne und Zeitmenge aufgeteilt wurde.
"""

# I made those _not_ optional because the entire instance of Zeitmenge is pointless if one of the two is missing
start: Optional[datetime] #: inklusiver Beginn
Copy link
Collaborator

Choose a reason for hiding this comment

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

In Pydantic v2 musst du explizit den default-Wert None mitgeben, wenn du das Feld auch weglassen können willst.

ende: Optional[datetime] #: exklusives Ende
21 changes: 21 additions & 0 deletions tests/test_zeitmenge.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from datetime import datetime, timezone

from bo4e.com.zeitspanne import Zeitspanne


class TestZeitspanne:
def test_zeitspanne(self) -> None:
"""
Test de-/serialisation of Zeitspanne
"""
zeitspanne = Zeitspanne(
start=datetime(2013, 5, 1, tzinfo=timezone.utc), ende=datetime(2022, 1, 28, tzinfo=timezone.utc)
)

json_string = zeitspanne.model_dump_json(by_alias=True)

assert "2013-05-01T00:00:00Z" in json_string
assert "2022-01-28T00:00:00Z" in json_string

zeitspanne_deserialized = Zeitspanne.model_validate_json(json_string)
assert zeitspanne_deserialized == zeitspanne
21 changes: 21 additions & 0 deletions tests/test_zeitspanne.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from datetime import datetime, timezone

from bo4e.com.zeitspanne import Zeitspanne


class TestZeitspanne:
def test_zeitspanne(self) -> None:
"""
Test de-/serialisation of Zeitspanne
"""
zeitspanne = Zeitspanne(
start=datetime(2013, 5, 1, tzinfo=timezone.utc), ende=datetime(2022, 1, 28, tzinfo=timezone.utc)
)

json_string = zeitspanne.model_dump_json(by_alias=True)

assert "2013-05-01T00:00:00Z" in json_string
assert "2022-01-28T00:00:00Z" in json_string

zeitspanne_deserialized = Zeitspanne.model_validate_json(json_string)
assert zeitspanne_deserialized == zeitspanne