From adcddbfe01025774e296c445a79979776323b28a Mon Sep 17 00:00:00 2001 From: "george.robertson1" <50412379+georgeRobertson@users.noreply.github.com> Date: Thu, 5 Mar 2026 10:24:51 +0000 Subject: [PATCH] fix: fix issue where formattedtime type not triggering validate correctly --- src/dve/metadata_parser/domain_types.py | 5 ++++ .../test_duckdb/test_data_contract.py | 2 +- .../test_domain_types.py | 24 ++++++++++++++++++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/dve/metadata_parser/domain_types.py b/src/dve/metadata_parser/domain_types.py index 3153d26..064dac3 100644 --- a/src/dve/metadata_parser/domain_types.py +++ b/src/dve/metadata_parser/domain_types.py @@ -482,6 +482,11 @@ def validate(cls, value: Union[dt.time, dt.datetime, str]) -> dt.time | None: return new_time + @classmethod + def __get_validators__(cls) -> Iterator[classmethod]: + """Gets all validators""" + yield cls.validate # type: ignore + @lru_cache() @validate_arguments diff --git a/tests/test_core_engine/test_backends/test_implementations/test_duckdb/test_data_contract.py b/tests/test_core_engine/test_backends/test_implementations/test_duckdb/test_data_contract.py index 9e49338..0300808 100644 --- a/tests/test_core_engine/test_backends/test_implementations/test_duckdb/test_data_contract.py +++ b/tests/test_core_engine/test_backends/test_implementations/test_duckdb/test_data_contract.py @@ -50,7 +50,7 @@ def test_duckdb_data_contract_csv(temp_csv_file): "description": "test", "callable": "formattedtime", "constraints": { - "time_format": "%Y-%m-%d", + "time_format": "%H:%M:%S", "timezone_treatment": "forbid" } } diff --git a/tests/test_model_generation/test_domain_types.py b/tests/test_model_generation/test_domain_types.py index 6ceee74..019e10d 100644 --- a/tests/test_model_generation/test_domain_types.py +++ b/tests/test_model_generation/test_domain_types.py @@ -347,7 +347,8 @@ def test_formattedtime( ["23:00:00", "%H:%M:%S", "require",], ["23:00:00Z", "%I:%M:%S", "forbid",], [dt.datetime(2025, 12, 1, 13, 0, 5, tzinfo=UTC), "%H:%M:%S", "forbid",], - [dt.time(13, 0, 5, tzinfo=UTC), "%H:%M:%S", "forbid",] + [dt.time(13, 0, 5, tzinfo=UTC), "%H:%M:%S", "forbid",], + ["12:00", "%H:%M:%S", "forbid",], ] ) def test_formattedtime_raises( @@ -360,3 +361,24 @@ def test_formattedtime_raises( time_type = hct.formattedtime(time_format, timezone_treatment) with pytest.raises(ValueError): time_type.validate(time_to_validate) # pylint: disable=W0106 + + +class StrictTimeModel(BaseModel): + time_val: hct.formattedtime(time_format="%H:%M:%S", timezone_treatment="forbid") + + +@pytest.mark.parametrize( + ["time_to_validate", "expected_to_error"], + [ + ("12:00:00", False), + ("120000", True), + ("12:00", True), + ("12", True), + ] +) +def test_formattedtime_against_model(time_to_validate: str, expected_to_error: bool): + if expected_to_error: + with pytest.raises(ValueError): + StrictTimeModel(time_val=time_to_validate) + else: + StrictTimeModel(time_val=time_to_validate)