Skip to content

Commit 9352430

Browse files
Merge branch 'main' of https://github.com/NHSDigital/data-validation-engine into release_v09
2 parents 3ea52a9 + 040d288 commit 9352430

7 files changed

Lines changed: 149 additions & 99 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
- upgrade pydantic to v2 (#107)
1111

12+
## v0.8.4 (2026-08-11)
13+
1214
## v0.8.3 (2026-07-14)
1315

1416
### Fix

poetry.lock

Lines changed: 52 additions & 55 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ optional = true
6969
behave = "1.3.3"
7070
coverage = "7.11.0"
7171
moto = {extras = ["s3"], version = "4.2.14"}
72-
cryptography = "48.0.1" # dependency of `moto`
72+
cryptography = "50.0.0" # dependency of `moto`
7373
requests = "2.33.0" # dependency of `moto`
7474
Werkzeug = "3.1.6"
7575
pytest = "9.0.3"
@@ -107,7 +107,7 @@ click = "8.2.1"
107107
mkdocs = "1.6.1"
108108
mkdocstrings = { version = "1.0.3", extras = ["python"] }
109109
griffelib = "2.0.1"
110-
pymdown-extensions = "10.21.3"
110+
pymdown-extensions = "11.0.1"
111111
zensical = "0.0.46"
112112

113113
[tool.ruff]

src/dve/core_engine/backends/implementations/duckdb/duckdb_helpers.py

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from dve.core_engine.backends.utilities import DEFAULT_ISO_FORMATS, datetime_format_to_regex
2525
from dve.core_engine.constants import RECORD_INDEX_COLUMN_NAME
2626
from dve.core_engine.type_hints import URI, EntityName
27+
from dve.metadata_parser.utilities import resilient_get
2728
from dve.parser.file_handling.service import LocalFilesystemImplementation, _get_implementation
2829

2930

@@ -459,23 +460,27 @@ def get_duckdb_cast_statement_from_annotation(
459460
raise ValueError(f"dict must be `typing.TypedDict` subclass, got {type_annotation!r}")
460461

461462
for type_ in type_annotation.mro():
462-
_date_format: str = getattr( # type: ignore
463-
type_, "DATE_FORMAT", DEFAULT_ISO_FORMATS.get(type_, DEFAULT_ISO_FORMATS.get(datetime))
464-
)
465-
dt_cast_statement = rf"CASE WHEN REGEXP_FULL_MATCH(TRIM({quoted_name}), '{datetime_format_to_regex(_date_format)}') THEN TRY_STRPTIME(TRIM({quoted_name}), '{_date_format}') ELSE NULL END" # pylint: disable=C0301
466-
467-
# datetime is subclass of date, so needs to be handled first
468-
if issubclass(type_, datetime):
469-
stmt = rf"TRY_CAST({dt_cast_statement} as TIMESTAMP)"
470-
return stmt
471-
if issubclass(type_, date):
472-
stmt = rf"TRY_CAST({dt_cast_statement} as DATE)"
473-
return stmt
474-
if issubclass(type_, time):
475-
stmt = rf"TRY_CAST({dt_cast_statement} as TIME)"
476-
return stmt
477-
duck_type = get_duckdb_type_from_annotation(type_)
478-
if duck_type:
479-
stmt = f"TRIM({quoted_name})"
480-
return _cast_as_ddb_type(stmt, type_) if parent_element else stmt
463+
if issubclass(type_, (date, time)):
464+
_date_format: str = resilient_get(
465+
type_, "DATE_FORMAT", "TIME_FORMAT"
466+
) or DEFAULT_ISO_FORMATS.get(
467+
type_, DEFAULT_ISO_FORMATS.get(datetime)
468+
) # type: ignore
469+
dt_cast_statement = rf"CASE WHEN REGEXP_FULL_MATCH(TRIM({quoted_name}), '{datetime_format_to_regex(_date_format)}') THEN TRY_STRPTIME(TRIM({quoted_name}), '{_date_format}') ELSE NULL END" # pylint: disable=C0301
470+
471+
# datetime is subclass of date, so needs to be handled first
472+
if issubclass(type_, datetime):
473+
stmt = rf"TRY_CAST({dt_cast_statement} as TIMESTAMP)"
474+
return stmt
475+
if issubclass(type_, date):
476+
stmt = rf"TRY_CAST({dt_cast_statement} as DATE)"
477+
return stmt
478+
if issubclass(type_, time):
479+
stmt = rf"TRY_CAST({dt_cast_statement} as TIME)"
480+
return stmt
481+
else:
482+
duck_type = get_duckdb_type_from_annotation(type_)
483+
if duck_type:
484+
stmt = f"TRIM({quoted_name})"
485+
return _cast_as_ddb_type(stmt, type_) if parent_element else stmt
481486
raise ValueError(f"No equivalent DuckDB type for {type_annotation!r}")

0 commit comments

Comments
 (0)