cuenca-validations 2.1.7.dev0__tar.gz → 2.1.7.dev2__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.
Files changed (34) hide show
  1. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/PKG-INFO +1 -1
  2. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations/types/enums.py +16 -0
  3. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations/types/identities.py +12 -30
  4. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations/types/requests.py +13 -31
  5. cuenca_validations-2.1.7.dev2/cuenca_validations/version.py +1 -0
  6. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations.egg-info/PKG-INFO +1 -1
  7. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/tests/test_types.py +23 -34
  8. cuenca_validations-2.1.7.dev0/cuenca_validations/version.py +0 -1
  9. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/LICENSE +0 -0
  10. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/README.md +0 -0
  11. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations/__init__.py +0 -0
  12. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations/card_bins.py +0 -0
  13. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations/errors.py +0 -0
  14. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations/py.typed +0 -0
  15. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations/types/__init__.py +0 -0
  16. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations/types/card.py +0 -0
  17. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations/types/files.py +0 -0
  18. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations/types/general.py +0 -0
  19. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations/types/helpers.py +0 -0
  20. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations/types/morals.py +0 -0
  21. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations/types/queries.py +0 -0
  22. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations/typing.py +0 -0
  23. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations/validators.py +0 -0
  24. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations.egg-info/SOURCES.txt +0 -0
  25. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations.egg-info/dependency_links.txt +0 -0
  26. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations.egg-info/requires.txt +0 -0
  27. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/cuenca_validations.egg-info/top_level.txt +0 -0
  28. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/setup.cfg +0 -0
  29. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/setup.py +0 -0
  30. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/tests/__init__.py +0 -0
  31. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/tests/test_card.py +0 -0
  32. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/tests/test_errors.py +0 -0
  33. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/tests/test_helpers.py +0 -0
  34. {cuenca_validations-2.1.7.dev0 → cuenca_validations-2.1.7.dev2}/tests/test_statement.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cuenca_validations
3
- Version: 2.1.7.dev0
3
+ Version: 2.1.7.dev2
4
4
  Summary: Cuenca common validations
5
5
  Home-page: https://github.com/cuenca-mx/cuenca-validations
6
6
  Author: Cuenca
@@ -688,3 +688,19 @@ class SATRegimeCode(str, Enum):
688
688
  ING_PREM = "615" # Régimen de los ingresos por obtención de premios
689
689
  AE_PLAT_TEC = "625" # Régimen de las Actividades Empresariales con ingresos a través de Plataformas Tecnológicas # noqa: E501
690
690
  RS_CONF = "626" # Régimen Simplificado de Confianza
691
+
692
+
693
+ class Profession(str, Enum):
694
+ arts = 'arts'
695
+ agriculture = 'agriculture'
696
+ commerce = 'commerce'
697
+ student = 'student'
698
+ employee = 'employee'
699
+ entrepreneur = 'entrepreneur'
700
+ homemaker = 'homemaker'
701
+ teacher = 'teacher'
702
+ professional = 'professional'
703
+ public_servant = 'public_servant'
704
+ it_communications = 'it_communications'
705
+ freelancer = 'freelancer'
706
+ skilled_trades = 'skilled_trades'
@@ -1,18 +1,11 @@
1
1
  import datetime as dt
2
- from typing import Annotated, Any, Optional
2
+ from typing import Annotated, Optional
3
3
 
4
- from pydantic import (
5
- BaseModel,
6
- ConfigDict,
7
- Field,
8
- SecretStr,
9
- StringConstraints,
10
- model_validator,
11
- )
4
+ from pydantic import BaseModel, ConfigDict, Field, SecretStr, StringConstraints
12
5
  from pydantic_extra_types.phone_numbers import PhoneNumber
13
6
 
14
7
  from .enums import Country, KYCFileType, State, VerificationStatus
15
- from .general import SerializableIPvAnyAddress
8
+ from .general import NonEmptyStr, SerializableIPvAnyAddress
16
9
 
17
10
  Password = Annotated[
18
11
  SecretStr,
@@ -45,15 +38,15 @@ Rfc = Annotated[
45
38
 
46
39
 
47
40
  class Address(BaseModel):
48
- street: Optional[str] = None
49
- ext_number: Optional[str] = None
50
- int_number: Optional[str] = None
51
- colonia: Optional[str] = None
52
- postal_code: Optional[str] = None
41
+ street: NonEmptyStr
42
+ ext_number: NonEmptyStr
43
+ int_number: Optional[NonEmptyStr] = None
44
+ colonia: NonEmptyStr
45
+ postal_code: NonEmptyStr
53
46
  state: Optional[State] = None
54
- country: Optional[Country] = None
55
- city: Optional[str] = None
56
- full_name: Optional[str] = None
47
+ country: Country
48
+ city: NonEmptyStr
49
+
57
50
  model_config = ConfigDict(
58
51
  json_schema_extra={
59
52
  "example": {
@@ -69,24 +62,13 @@ class Address(BaseModel):
69
62
  }
70
63
  )
71
64
 
72
- @model_validator(mode='before')
73
- @classmethod
74
- def full_name_complete(cls, values: dict[str, Any]) -> dict[str, Any]:
75
- if values.get('full_name'):
76
- return values
77
- if not values.get('street'):
78
- raise ValueError('required street')
79
- if not values.get('ext_number'):
80
- raise ValueError('required ext_number')
81
- return values
82
-
83
65
 
84
66
  class Beneficiary(BaseModel):
85
67
  name: str
86
68
  birth_date: dt.date
87
69
  phone_number: PhoneNumber
88
70
  user_relationship: str
89
- percentage: int
71
+ percentage: Annotated[int, Field(ge=1, le=100)]
90
72
  model_config = ConfigDict(
91
73
  json_schema_extra={
92
74
  "example": {
@@ -32,6 +32,7 @@ from ..types.enums import (
32
32
  KYCValidationSource,
33
33
  PlatformType,
34
34
  PosCapability,
35
+ Profession,
35
36
  SavingCategory,
36
37
  SessionType,
37
38
  State,
@@ -410,44 +411,25 @@ class UserTOSAgreementRequest(BaseModel):
410
411
 
411
412
 
412
413
  class UserRequest(BaseModel):
413
- # curp: Curp = Field(
414
- # description='Previously validated in `curp_validations`'
415
- # )
416
- curp_verification_id: str = Field(
417
- ...,
418
- description='Previously validated in `curp_validations`',
414
+ curp: Curp = Field(
415
+ description=(
416
+ 'Mexican government ID (18 characters). ' 'Must be pre-validated.'
417
+ )
418
+ )
419
+
420
+ profession: Profession = Field(description='User profession or occupation')
421
+ address: Address = Field(
422
+ description='User residential address information'
419
423
  )
420
- # phone_number: PhoneNumber = Field(
421
- # ..., description='Only if you validated previously on your side'
422
- # )
423
- # email_address: EmailStr = Field(
424
- # ..., description='Only if you validated previously on your side'
425
- # )
426
- profession: Optional[str] = None
427
- address: Optional[Address] = None
428
- # status: Optional[UserStatus] = Field(
429
- # None,
430
- # description='Status that the user will have when created. '
431
- # 'Defined by platform',
432
- # )
433
- # required_level: Optional[int] = Field(
434
- # None,
435
- # ge=1,
436
- # le=3,
437
- # description='Maximum level a User can reach. Defined by platform',
438
- # )
439
424
  phone_verification_id: str = Field(
440
425
  ...,
441
- description='Only if you validated it previously with the '
442
- 'resource `verifications`',
426
+ description='ID of previously validated phone verification',
443
427
  )
444
428
  email_verification_id: str = Field(
445
429
  ...,
446
- description='Only if you validated it previously with the '
447
- 'resource `verifications`',
430
+ description='ID of previously validated email verification',
448
431
  )
449
- # terms_of_service: Optional[TOSRequest] = None
450
- # signature: Optional[KYCFile] = None
432
+
451
433
  model_config = ConfigDict(
452
434
  json_schema_extra={
453
435
  'example': {
@@ -0,0 +1 @@
1
+ __version__ = '2.1.7.dev2'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cuenca_validations
3
- Version: 2.1.7.dev0
3
+ Version: 2.1.7.dev2
4
4
  Summary: Cuenca common validations
5
5
  Home-page: https://github.com/cuenca-mx/cuenca-validations
6
6
  Author: Cuenca
@@ -10,7 +10,6 @@ from pydantic import AfterValidator, BaseModel, SecretStr, ValidationError
10
10
  from pydantic.fields import FieldInfo
11
11
 
12
12
  from cuenca_validations.types import (
13
- Address,
14
13
  CardQuery,
15
14
  JSONEncoder,
16
15
  QueryParams,
@@ -303,60 +302,50 @@ def test_saving_update_request():
303
302
  SavingUpdateRequest(**data)
304
303
 
305
304
 
306
- def test_address_validation():
307
- data = dict(
308
- full_name='Varsovia 36, Col Cuahutemoc',
309
- )
310
- assert Address(**data)
311
- with pytest.raises(ValueError) as v:
312
- Address(**dict())
313
- assert 'required street' in str(v)
314
- data = dict(street='somestreet')
315
- with pytest.raises(ValueError) as v:
316
- Address(**data)
317
- assert 'required ext_number' in str(v)
318
- data = dict(
319
- street='varsovia',
320
- ext_number='36',
321
- state=State.DF,
322
- country=Country.MX,
323
- )
324
- assert Address(**data)
325
-
326
-
327
305
  @freeze_time('2022-01-01')
328
306
  def test_user_request():
329
307
  request = dict(
330
- id=None,
331
308
  curp='ABCD920604HDFSRN03',
332
- phone_number='+525555555555',
333
- email_address='email@email.com',
334
309
  profession='worker',
335
- status='active',
336
310
  address=dict(
337
311
  street='calle 1',
338
312
  ext_number='2',
339
313
  int_number='3',
340
314
  colonia='Juarez',
341
315
  postal_code='09900',
342
- state=State.DF.value,
316
+ state=State.DF,
343
317
  country=Country.MX,
344
318
  city='Obrera',
345
- full_name=None,
346
319
  ),
347
320
  phone_verification_id='VE12345678',
348
321
  email_verification_id='VE0987654321',
349
- required_level=3,
350
- terms_of_service=None,
351
- signature=None,
352
322
  )
353
323
  assert UserRequest(**request).model_dump() == request
354
324
 
355
- # changing curp so user is underage
356
- request['curp'] = 'ABCD060604HDFSRN03'
325
+
326
+ @freeze_time('2022-01-01')
327
+ def test_user_request_underage():
328
+ request = dict(
329
+ curp='ABCD060604HDFSRN03', # underage CURP
330
+ profession='worker',
331
+ address=dict(
332
+ street='calle 1',
333
+ ext_number='2',
334
+ int_number='3',
335
+ colonia='Juarez',
336
+ postal_code='09900',
337
+ state=State.DF,
338
+ country=Country.MX,
339
+ city='Obrera',
340
+ ),
341
+ phone_verification_id='VE12345678',
342
+ email_verification_id='VE0987654321',
343
+ )
344
+
357
345
  with pytest.raises(ValueError) as v:
358
346
  UserRequest(**request)
359
- assert 'User does not meet age requirement.' in str(v)
347
+
348
+ assert 'User does not meet age requirement.' in str(v)
360
349
 
361
350
 
362
351
  @freeze_time('2022-01-01')
@@ -1 +0,0 @@
1
- __version__ = '2.1.7.dev0'