From 3f59d8c8e96c36c616311dfcdedbaf28c2bb2bf2 Mon Sep 17 00:00:00 2001 From: stevenhsd <56357022+stevenhsd@users.noreply.github.com> Date: Wed, 11 Mar 2026 15:46:13 +0000 Subject: [PATCH 1/2] fix: add ability to strictly enforce date format in conformatteddate --- src/dve/metadata_parser/domain_types.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/dve/metadata_parser/domain_types.py b/src/dve/metadata_parser/domain_types.py index 6c4a5c4..dd06843 100644 --- a/src/dve/metadata_parser/domain_types.py +++ b/src/dve/metadata_parser/domain_types.py @@ -260,6 +260,8 @@ class ConFormattedDate(dt.date): DATE_FORMAT: ClassVar[Optional[str]] = None """The specific format of the date as a Python 'strptime' string.""" + strict: ClassVar[Optional[bool]] = False + """Add additional check to ensure that date supplied meets the date format exactly.""" ge: ClassVar[Optional[dt.date]] = None """The earliest date allowed.""" le: ClassVar[Optional[dt.date]] = None @@ -280,12 +282,17 @@ def validate(cls, value: Optional[Union[dt.date, str]]) -> Optional[dt.date]: elif cls.DATE_FORMAT is not None: try: date = dt.datetime.strptime(value, cls.DATE_FORMAT).date() + if cls.strict and not (date.strftime(cls.DATE_FORMAT) == value): + raise ValueError except ValueError as err: raise ValueError( f"Unable to parse provided datetime in format {cls.DATE_FORMAT}" ) from err # pylint: disable=line-too-long else: raise ValueError("No date format provided") + + + return date @@ -317,6 +324,7 @@ def __get_validators__(cls) -> Iterator[classmethod]: @validate_arguments def conformatteddate( date_format: Optional[str] = None, + strict: Optional[bool] = False, ge: Optional[dt.date] = None, # pylint: disable=invalid-name le: Optional[dt.date] = None, # pylint: disable=invalid-name gt: Optional[dt.date] = None, # pylint: disable=invalid-name @@ -331,6 +339,7 @@ def conformatteddate( dict_ = ConFormattedDate.__dict__.copy() dict_["DATE_FORMAT"] = date_format + dict_["strict"] = strict dict_["ge"] = ge dict_["le"] = le dict_["gt"] = gt From d45428a985c2263250c18fa4228e1e04e667bb0c Mon Sep 17 00:00:00 2001 From: stevenhsd <56357022+stevenhsd@users.noreply.github.com> Date: Thu, 12 Mar 2026 11:27:04 +0000 Subject: [PATCH 2/2] refactor: tweaks to sort review comments --- src/dve/metadata_parser/domain_types.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/dve/metadata_parser/domain_types.py b/src/dve/metadata_parser/domain_types.py index dd06843..545429f 100644 --- a/src/dve/metadata_parser/domain_types.py +++ b/src/dve/metadata_parser/domain_types.py @@ -282,7 +282,7 @@ def validate(cls, value: Optional[Union[dt.date, str]]) -> Optional[dt.date]: elif cls.DATE_FORMAT is not None: try: date = dt.datetime.strptime(value, cls.DATE_FORMAT).date() - if cls.strict and not (date.strftime(cls.DATE_FORMAT) == value): + if cls.strict and (date.strftime(cls.DATE_FORMAT) != value): raise ValueError except ValueError as err: raise ValueError( @@ -290,9 +290,6 @@ def validate(cls, value: Optional[Union[dt.date, str]]) -> Optional[dt.date]: ) from err # pylint: disable=line-too-long else: raise ValueError("No date format provided") - - - return date