From e84383373ab75da912201382c8340364872f7af8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Richard=20Kub=C3=AD=C4=8Dek?= Date: Thu, 16 Jan 2025 13:02:53 +0100 Subject: [PATCH] data_types: Date - a new data type --- utils/__init__.py | 0 utils/data_types.py | 62 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 utils/__init__.py create mode 100644 utils/data_types.py diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/utils/data_types.py b/utils/data_types.py new file mode 100644 index 0000000..af65e71 --- /dev/null +++ b/utils/data_types.py @@ -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)