From 4cc4098220a3fdaca5a67aaae568bdb0d10a8432 Mon Sep 17 00:00:00 2001 From: Nitwix Date: Sat, 12 Apr 2025 15:56:29 +0200 Subject: [PATCH] xval_age_description_passport --- tests/test_cross_validate.py | 12 +++++++++++- validation/cross_validate.py | 18 +++++++++++++++++- validation/from_description.py | 4 ++-- validation/llm_validate.py | 2 +- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/tests/test_cross_validate.py b/tests/test_cross_validate.py index c006a41..d98c070 100644 --- a/tests/test_cross_validate.py +++ b/tests/test_cross_validate.py @@ -1,5 +1,5 @@ from tests.dummy import dummy_data -from validation.cross_validate import xval_all, xval_email_account_profile, xval_name_account_description +from validation.cross_validate import xval_age_description_passport, xval_all, xval_email_account_profile, xval_name_account_description @@ -11,6 +11,16 @@ def test_xval_email_account_profile() -> None: failure = xval_email_account_profile(dummy_data()) assert failure is None +def test_xval_age_description_passport() -> None: + failure = xval_age_description_passport(dummy_data()) + assert failure is None + +def test_xval_age_description_passport_failure() -> None: + dummy = dummy_data() + dummy.description.age = 99 # should not correspond to dummy age from birth_date + failure = xval_age_description_passport(dummy) + assert not failure is None + def test_xval_all() -> None: failures = xval_all(dummy_data()) assert len(failures) == 0 \ No newline at end of file diff --git a/validation/cross_validate.py b/validation/cross_validate.py index c5a1b8f..b7e80a3 100644 --- a/validation/cross_validate.py +++ b/validation/cross_validate.py @@ -1,3 +1,4 @@ +from datetime import date, timedelta from enum import StrEnum from typing import Any, Callable, Optional from pydantic import BaseModel @@ -59,11 +60,26 @@ def xval_passport_no_account_passport(data: ExtractedData) -> Optional[XValFailu doc2_val=f"{data.passport.passport_number=}" ) +def birth_date_to_age(birth_date: date) -> int: + today = date.today() + return today.year - birth_date.year - ((today.month, today.day) < (birth_date.month, birth_date.day)) + +def xval_age_description_passport(data: ExtractedData) -> Optional[XValFailure]: + age_from_birth_date = birth_date_to_age(data.passport.birth_date) + if data.description.age != age_from_birth_date: + return XValFailure( + doc1_type=DocType.description, + doc1_val=f"{data.description.age=}", + doc2_type=DocType.passport, + doc2_val=f"{data.passport.birth_date=}" + ) + def xval_all(data: ExtractedData) -> list[XValFailure]: xref_validators: list[Callable[[ExtractedData], Optional[XValFailure]]] = [ xval_name_account_description, xval_email_account_profile, - xval_passport_no_account_passport + xval_passport_no_account_passport, + xval_age_description_passport ] validation_failures = [] diff --git a/validation/from_description.py b/validation/from_description.py index e19420e..fab40b8 100644 --- a/validation/from_description.py +++ b/validation/from_description.py @@ -1,5 +1,5 @@ -from typing import Literal, Optional -from pydantic import BaseModel, ConfigDict, EmailStr, Field +from typing import Literal +from pydantic import BaseModel, ConfigDict, Field class FromDescription(BaseModel): diff --git a/validation/llm_validate.py b/validation/llm_validate.py index f2e155a..b937457 100644 --- a/validation/llm_validate.py +++ b/validation/llm_validate.py @@ -2,6 +2,6 @@ # account.reference_currency corresponds to passport.country # account.country ~ passport.country +# account.country ~ description.nationality # account.city is in account.country -