data_types: Date - a new data type

This commit is contained in:
Richard Kubíček
2025-01-16 13:02:53 +01:00
parent 710acdfc2d
commit e84383373a
2 changed files with 62 additions and 0 deletions

0
utils/__init__.py Normal file
View File

62
utils/data_types.py Normal file
View File

@@ -0,0 +1,62 @@
from datetime import datetime
from typing import Optional
import json
class Date:
def __init__(self, date_str: Optional[str] = None):
"""
Creates a Date instance that supports typing and validation for the format YYYY-MM-DD.
:param date_str: Date in the format YYYY-MM-DD or None.
"""
self.date: Optional[datetime] = None
if date_str:
self.date = self._validate_date(date_str)
@staticmethod
def _validate_date(date_str: str) -> datetime:
"""
Validates that the date is in the format YYYY-MM-DD.
:param date_str: Date as a string.
:return: Validated date as a datetime instance.
"""
try:
return datetime.strptime(date_str, "%Y-%m-%d")
except ValueError:
raise ValueError(f"Date must be in format YYYY-MM-DD, got: {date_str}")
def __str__(self) -> str:
"""
Returns the date as a string in the format YYYY-MM-DD, or 'None' if not set.
"""
return self.date.strftime("%Y-%m-%d") if self.date else "None"
def is_set(self) -> bool:
"""
Returns True if the date is set, otherwise False.
"""
return self.date is not None
def to_dict(self) -> Optional[str]:
"""
Converts the Date object to a serializable format.
:return: The date as a string in YYYY-MM-DD format, or None if not set.
"""
return self.date.strftime("%Y-%m-%d") if self.date else None
def to_json(self) -> Optional[str]:
"""
Converts the Date object to a JSON serializable format.
:return: The date as a string in YYYY-MM-DD format, or None if not set.
"""
return self.to_dict()
class DateEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, Date):
return o.to_json()
return super().default(o)