cuenca-validations 2.1.14.dev4__tar.gz → 2.1.14.dev5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/PKG-INFO +1 -1
- cuenca_validations-2.1.14.dev5/cuenca_validations/types/helpers.py +44 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/types/requests.py +6 -24
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/validators.py +0 -9
- cuenca_validations-2.1.14.dev5/cuenca_validations/version.py +1 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations.egg-info/PKG-INFO +1 -1
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/tests/test_types.py +2 -7
- cuenca_validations-2.1.14.dev4/cuenca_validations/types/helpers.py +0 -22
- cuenca_validations-2.1.14.dev4/cuenca_validations/version.py +0 -1
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/LICENSE +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/README.md +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/__init__.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/card_bins.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/errors.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/py.typed +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/types/__init__.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/types/card.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/types/enums.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/types/files.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/types/general.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/types/identities.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/types/morals.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/types/queries.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/typing.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations.egg-info/SOURCES.txt +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations.egg-info/dependency_links.txt +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations.egg-info/requires.txt +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations.egg-info/top_level.txt +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/setup.cfg +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/setup.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/tests/__init__.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/tests/test_card.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/tests/test_errors.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/tests/test_helpers.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/tests/test_requests.py +0 -0
- {cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/tests/test_statement.py +0 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import datetime as dt
|
|
2
|
+
import uuid
|
|
3
|
+
from base64 import urlsafe_b64encode
|
|
4
|
+
from typing import Callable, Optional, Union
|
|
5
|
+
|
|
6
|
+
from dateutil.relativedelta import relativedelta
|
|
7
|
+
from pydantic.fields import FieldInfo
|
|
8
|
+
|
|
9
|
+
from .general import LogConfig
|
|
10
|
+
from .identities import Curp
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def uuid_field(prefix: str = '') -> Callable[[], str]:
|
|
14
|
+
def base64_uuid_func() -> str:
|
|
15
|
+
return prefix + urlsafe_b64encode(uuid.uuid4().bytes).decode()[:-2]
|
|
16
|
+
|
|
17
|
+
return base64_uuid_func
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def get_log_config(field: FieldInfo) -> Optional[LogConfig]:
|
|
21
|
+
"""Helper function to find LogConfig in field metadata"""
|
|
22
|
+
try:
|
|
23
|
+
return next(m for m in field.metadata if isinstance(m, LogConfig))
|
|
24
|
+
except StopIteration:
|
|
25
|
+
return None
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def get_birth_date_from_curp(curp: Curp) -> dt.date:
|
|
29
|
+
curp_date = curp[4:10] # YYMMDD
|
|
30
|
+
yy = int(curp_date[:2])
|
|
31
|
+
current_yy = dt.date.today().year % 100
|
|
32
|
+
century = '19' if yy > current_yy else '20'
|
|
33
|
+
birth_date = dt.datetime.strptime(century + curp_date, '%Y%m%d').date()
|
|
34
|
+
return birth_date
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def validate_age_requirement(birth_date: Union[dt.date, Curp]) -> dt.date:
|
|
38
|
+
if isinstance(birth_date, str):
|
|
39
|
+
birth_date = get_birth_date_from_curp(birth_date)
|
|
40
|
+
|
|
41
|
+
current_date = dt.date.today()
|
|
42
|
+
if relativedelta(current_date, birth_date).years < 18:
|
|
43
|
+
raise ValueError('User does not meet age requirement.')
|
|
44
|
+
return birth_date
|
|
@@ -50,7 +50,6 @@ from ..types.enums import (
|
|
|
50
50
|
WebhookObject,
|
|
51
51
|
)
|
|
52
52
|
from ..typing import DictStrAny
|
|
53
|
-
from ..validators import validate_age_requirement
|
|
54
53
|
from .card import (
|
|
55
54
|
Cvv,
|
|
56
55
|
ExpMonth,
|
|
@@ -66,6 +65,7 @@ from .general import (
|
|
|
66
65
|
SerializableIPvAnyAddress,
|
|
67
66
|
StrictPositiveInt,
|
|
68
67
|
)
|
|
68
|
+
from .helpers import validate_age_requirement
|
|
69
69
|
from .identities import (
|
|
70
70
|
AddressRequest,
|
|
71
71
|
Beneficiary,
|
|
@@ -329,14 +329,14 @@ class CurpValidationRequest(BaseModel):
|
|
|
329
329
|
names: Optional[str] = None
|
|
330
330
|
first_surname: Optional[str] = None
|
|
331
331
|
second_surname: Optional[str] = Field(
|
|
332
|
-
None, description='Not necessary for foreigners'
|
|
332
|
+
default=None, description='Not necessary for foreigners'
|
|
333
333
|
)
|
|
334
334
|
date_of_birth: Optional[dt.date] = None
|
|
335
335
|
state_of_birth: Optional[State] = Field(
|
|
336
|
-
None, description='In format ISO 3166 Alpha-2'
|
|
336
|
+
default=None, description='In format ISO 3166 Alpha-2'
|
|
337
337
|
)
|
|
338
338
|
country_of_birth: Optional[Country] = Field(
|
|
339
|
-
None, description='In format ISO 3166 Alpha-2'
|
|
339
|
+
default=None, description='In format ISO 3166 Alpha-2'
|
|
340
340
|
)
|
|
341
341
|
gender: Optional[Gender] = None
|
|
342
342
|
manual_curp: Optional[Curp] = Field(
|
|
@@ -381,16 +381,7 @@ class CurpValidationRequest(BaseModel):
|
|
|
381
381
|
cls, manual_curp: Optional[Curp]
|
|
382
382
|
) -> Optional[Curp]:
|
|
383
383
|
if manual_curp:
|
|
384
|
-
|
|
385
|
-
curp_date = manual_curp[4:10]
|
|
386
|
-
yy = int(curp_date[:2])
|
|
387
|
-
current_yy = current_date.year % 100
|
|
388
|
-
century = '19' if yy > current_yy else '20'
|
|
389
|
-
birth_date = dt.datetime.strptime(century + curp_date, '%Y%m%d')
|
|
390
|
-
try:
|
|
391
|
-
validate_age_requirement(birth_date)
|
|
392
|
-
except ValueError:
|
|
393
|
-
raise
|
|
384
|
+
validate_age_requirement(manual_curp)
|
|
394
385
|
return manual_curp
|
|
395
386
|
|
|
396
387
|
@model_validator(mode="before")
|
|
@@ -485,16 +476,7 @@ class UserRequest(BaseModel):
|
|
|
485
476
|
@classmethod
|
|
486
477
|
def validate_birth_date(cls, curp: Optional[Curp]) -> Optional[Curp]:
|
|
487
478
|
if curp:
|
|
488
|
-
|
|
489
|
-
curp_date = curp[4:10]
|
|
490
|
-
yy = int(curp_date[:2])
|
|
491
|
-
current_yy = current_date.year % 100
|
|
492
|
-
century = '19' if yy > current_yy else '20'
|
|
493
|
-
birth_date = dt.datetime.strptime(century + curp_date, '%Y%m%d')
|
|
494
|
-
try:
|
|
495
|
-
validate_age_requirement(birth_date)
|
|
496
|
-
except ValueError:
|
|
497
|
-
raise
|
|
479
|
+
validate_age_requirement(curp)
|
|
498
480
|
return curp
|
|
499
481
|
|
|
500
482
|
|
{cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/validators.py
RENAMED
|
@@ -3,8 +3,6 @@ import datetime as dt
|
|
|
3
3
|
from enum import Enum
|
|
4
4
|
from typing import Any, Callable, Optional, Union
|
|
5
5
|
|
|
6
|
-
from dateutil.relativedelta import relativedelta
|
|
7
|
-
|
|
8
6
|
|
|
9
7
|
def sanitize_dict(d: dict) -> dict:
|
|
10
8
|
for k, v in d.items():
|
|
@@ -42,10 +40,3 @@ def sanitize_item(
|
|
|
42
40
|
else:
|
|
43
41
|
rv = item
|
|
44
42
|
return rv
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
def validate_age_requirement(birth_date: dt.date) -> dt.date:
|
|
48
|
-
current_date = dt.date.today()
|
|
49
|
-
if relativedelta(current_date, birth_date).years < 18:
|
|
50
|
-
raise ValueError('User does not meet age requirement.')
|
|
51
|
-
return birth_date
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '2.1.14.dev5'
|
|
@@ -385,14 +385,9 @@ def test_curp_validation_request():
|
|
|
385
385
|
assert 'state_of_birth required' in str(v)
|
|
386
386
|
|
|
387
387
|
|
|
388
|
-
def test_curp_validation_request_underage():
|
|
389
|
-
request = dict(
|
|
390
|
-
manual_curp='ABCD240614HDFSRN03', # underage CURP
|
|
391
|
-
)
|
|
392
|
-
|
|
388
|
+
def test_curp_validation_request_underage() -> None:
|
|
393
389
|
with pytest.raises(ValueError) as v:
|
|
394
|
-
CurpValidationRequest(
|
|
395
|
-
|
|
390
|
+
CurpValidationRequest(manual_curp='ABCD240614HDFSRN03')
|
|
396
391
|
assert 'User does not meet age requirement.' in str(v)
|
|
397
392
|
|
|
398
393
|
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import uuid
|
|
2
|
-
from base64 import urlsafe_b64encode
|
|
3
|
-
from typing import Callable, Optional
|
|
4
|
-
|
|
5
|
-
from pydantic.fields import FieldInfo
|
|
6
|
-
|
|
7
|
-
from .general import LogConfig
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def uuid_field(prefix: str = '') -> Callable[[], str]:
|
|
11
|
-
def base64_uuid_func() -> str:
|
|
12
|
-
return prefix + urlsafe_b64encode(uuid.uuid4().bytes).decode()[:-2]
|
|
13
|
-
|
|
14
|
-
return base64_uuid_func
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def get_log_config(field: FieldInfo) -> Optional[LogConfig]:
|
|
18
|
-
"""Helper function to find LogConfig in field metadata"""
|
|
19
|
-
try:
|
|
20
|
-
return next(m for m in field.metadata if isinstance(m, LogConfig))
|
|
21
|
-
except StopIteration:
|
|
22
|
-
return None
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = '2.1.14.dev4'
|
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/__init__.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/card_bins.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/errors.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/py.typed
RENAMED
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/types/card.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/types/enums.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/types/files.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/types/morals.py
RENAMED
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.14.dev4 → cuenca_validations-2.1.14.dev5}/cuenca_validations/typing.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|