Skip to content

Commit a9d1fc4

Browse files
committed
Add fecha_nacimiento_date computed field to Person model
1 parent 534f792 commit a9d1fc4

2 files changed

Lines changed: 55 additions & 6 deletions

File tree

quienesquien/person.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import datetime as dt
2+
13
from pydantic import (
24
BaseModel,
35
ConfigDict,
@@ -27,12 +29,22 @@ class Person(BaseModel):
2729
extra='allow',
2830
)
2931

30-
@computed_field # type: ignore[misc]
31-
@property
32+
@computed_field
3233
def peso1(self) -> str:
3334
# peso1 is required for backward compatibility with previous version.
3435
return str(self.coincidencia)
3536

37+
@computed_field
38+
def fecha_nacimiento_date(self) -> dt.date | None:
39+
if not self.fecha_nacimiento:
40+
return None
41+
try:
42+
return dt.datetime.strptime(
43+
self.fecha_nacimiento, '%d/%m/%Y'
44+
).date()
45+
except (TypeError, ValueError):
46+
return None
47+
3648
@model_validator(mode='after')
3749
def collect_extra_fields(self):
3850
if self.model_extra:

tests/test_person.py

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1+
import datetime as dt
2+
from typing import Any
3+
4+
import pytest
5+
16
from quienesquien.person import Person
27

38

4-
def test_collect_extra_fields():
5-
person_data = {
9+
def test_collect_extra_fields() -> None:
10+
person_data: dict[str, Any] = {
611
'LISTA': 'lista1',
712
'COINCIDENCIA': 100,
813
'NOMBRECOMP': 'Juan Pérez',
@@ -14,5 +19,37 @@ def test_collect_extra_fields():
1419
assert person.peso1 == '100'
1520
assert person.coincidencia == 100
1621
assert person.nombrecomp == 'Juan Pérez'
17-
assert person.campo_extra1 == 'valor1'
18-
assert person.campo_extra2 == 'valor2'
22+
23+
# Access extra fields through model_extra after lowercase conversion
24+
assert person.model_extra is not None
25+
assert person.model_extra['campo_extra1'] == 'valor1'
26+
assert person.model_extra['campo_extra2'] == 'valor2'
27+
28+
29+
@pytest.mark.parametrize(
30+
"fecha_nacimiento_input, expected_fecha_nacimiento, expected_date",
31+
[
32+
('13/11/1953', '13/11/1953', dt.date(1953, 11, 13)),
33+
(None, None, None),
34+
('', '', None),
35+
('invalid-date', 'invalid-date', None),
36+
('1953-11-13', '1953-11-13', None),
37+
('13/11', '13/11', None),
38+
('13-11-1953', '13-11-1953', None),
39+
],
40+
)
41+
def test_fecha_nacimiento_date(
42+
fecha_nacimiento_input: str | None,
43+
expected_fecha_nacimiento: str | None,
44+
expected_date: dt.date | None,
45+
) -> None:
46+
person_data: dict[str, Any] = {
47+
'LISTA': 'PPE',
48+
'COINCIDENCIA': 100,
49+
'NOMBRECOMP': 'Andres Manuel López Obrador',
50+
'FECHA_NACIMIENTO': fecha_nacimiento_input,
51+
}
52+
person = Person(**person_data)
53+
54+
assert person.fecha_nacimiento == expected_fecha_nacimiento
55+
assert person.fecha_nacimiento_date == expected_date

0 commit comments

Comments
 (0)