cuenca-validations 2.0.5.dev4__py3-none-any.whl → 2.0.5.dev5__py3-none-any.whl

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.
@@ -1,6 +1,8 @@
1
1
  import uuid
2
2
  from base64 import urlsafe_b64encode
3
- from typing import Callable
3
+ from typing import Callable, Optional
4
+
5
+ from pydantic.fields import FieldInfo
4
6
 
5
7
  from .general import LogConfig
6
8
 
@@ -12,6 +14,9 @@ def uuid_field(prefix: str = '') -> Callable[[], str]:
12
14
  return base64_uuid_func
13
15
 
14
16
 
15
- def get_log_config(field) -> LogConfig:
17
+ def get_log_config(field: FieldInfo) -> Optional[LogConfig]:
16
18
  """Helper function to find LogConfig in field metadata"""
17
- return next(m for m in field.metadata if isinstance(m, LogConfig))
19
+ try:
20
+ return next(m for m in field.metadata if isinstance(m, LogConfig))
21
+ except StopIteration:
22
+ return None
@@ -1 +1 @@
1
- __version__ = '2.0.5.dev4'
1
+ __version__ = '2.0.5.dev5'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: cuenca_validations
3
- Version: 2.0.5.dev4
3
+ Version: 2.0.5.dev5
4
4
  Summary: Cuenca common validations
5
5
  Home-page: https://github.com/cuenca-mx/cuenca-validations
6
6
  Author: Cuenca
@@ -4,13 +4,13 @@ cuenca_validations/errors.py,sha256=OtM8EgiKqYdz9Hn66AbBO96orL1or7efkyt0vh0Zxbs,
4
4
  cuenca_validations/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  cuenca_validations/typing.py,sha256=1QCu81IbVZZpyInjyeAuO-nF36gpT5Gi4o6V9PozuOU,204
6
6
  cuenca_validations/validators.py,sha256=wzwLnJ4wHggZvqp3mearbFkzvDERGeTNvJkuofQnuMc,1484
7
- cuenca_validations/version.py,sha256=J-AVT3MMt_Bx5yrfH9pqBApN4wu2VT9f5b0js4qbDGA,27
7
+ cuenca_validations/version.py,sha256=eGc3rVDo8qGTJ6w0S48t7UEtk08zXtVYAbGr3tyVCF0,27
8
8
  cuenca_validations/types/__init__.py,sha256=8fiuz26oYQT2DriQ7sbD740yFJergVhB1OYoUGETB5A,4783
9
9
  cuenca_validations/types/card.py,sha256=UGzz8NTFAverUmdUKAK1oGHnOnjSNTpIRUm93vKSSGY,1295
10
10
  cuenca_validations/types/enums.py,sha256=1ACr7I1iknXfm49y0YeP2sY1ZdZfreFC5cV4_6OJCw8,18825
11
11
  cuenca_validations/types/files.py,sha256=2CszbwF9ytXV9suFFwyDjYG4XxY8UhCjRw3HttVXXNw,269
12
12
  cuenca_validations/types/general.py,sha256=hC8zeiJttPdTE4U5VFJ9IfuwXV_aos--Aj-pZsMPrIk,2222
13
- cuenca_validations/types/helpers.py,sha256=vCZ-iPt8beT2AdbXioIjYOYmgBjESaPAIXIHbxVJ_n0,481
13
+ cuenca_validations/types/helpers.py,sha256=6rHUhwoQ7jJZtGcW3LX-W5ZDl42PWE1RoBpGme7KCkk,610
14
14
  cuenca_validations/types/identities.py,sha256=TivJcz0I_zolAWXZB3RTwt80OUAyW_wGdCL_6VJlxSM,4735
15
15
  cuenca_validations/types/morals.py,sha256=m8kAedevmwfSPTA9GYe03l7pkgipynwYgKfejyVtnuI,1813
16
16
  cuenca_validations/types/queries.py,sha256=KCRx0sPzWDtDDbZysmFGVgANgfqil17EITWaG7tGQ-A,4700
@@ -20,9 +20,9 @@ tests/test_card.py,sha256=QAfRz7e11gWICPnFJZ2tiYgUsFV3C9TwzJXrDnDNXFw,1202
20
20
  tests/test_errors.py,sha256=ixiIgEuBuzfsL5p4uCFdF32XqFRtTPF6EVhGJ0keOrI,930
21
21
  tests/test_helpers.py,sha256=ubzpi1UXCryLQdgsT_Zm2IX-XE_4L0dnHnhLwH06xK8,748
22
22
  tests/test_statement.py,sha256=IOE0rRRBgBZSJv_FLaETEyn5NzzXKMNTqgjv99GX-68,1436
23
- tests/test_types.py,sha256=FMYLLYKooM7jHigwgrteO5kq-aX-9Pjbb6W__Czcqw4,17279
24
- cuenca_validations-2.0.5.dev4.dist-info/LICENSE,sha256=wR76FmxBbfnQpwELkkE5iMF8sFIafEMgXLTE4N4WPTc,1063
25
- cuenca_validations-2.0.5.dev4.dist-info/METADATA,sha256=F1CnROeHe1LHOWtJNlrJvQCEL-WDA7CctlSEPPuYcOM,1577
26
- cuenca_validations-2.0.5.dev4.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
27
- cuenca_validations-2.0.5.dev4.dist-info/top_level.txt,sha256=4233xdOs2HtuT-GFRjcDcwK0IwdwvWdczOtk0fPB6Gw,25
28
- cuenca_validations-2.0.5.dev4.dist-info/RECORD,,
23
+ tests/test_types.py,sha256=31l5Qh43hU-4_Tfdmog7T_P0n0r6-MPZBOideUMRutI,17844
24
+ cuenca_validations-2.0.5.dev5.dist-info/LICENSE,sha256=wR76FmxBbfnQpwELkkE5iMF8sFIafEMgXLTE4N4WPTc,1063
25
+ cuenca_validations-2.0.5.dev5.dist-info/METADATA,sha256=K_fkG7cMgWAOuSROZAjYIe-Srk5uGxzEetI-aVEVivc,1577
26
+ cuenca_validations-2.0.5.dev5.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
27
+ cuenca_validations-2.0.5.dev5.dist-info/top_level.txt,sha256=4233xdOs2HtuT-GFRjcDcwK0IwdwvWdczOtk0fPB6Gw,25
28
+ cuenca_validations-2.0.5.dev5.dist-info/RECORD,,
tests/test_types.py CHANGED
@@ -7,6 +7,7 @@ from typing import Annotated
7
7
  import pytest
8
8
  from freezegun import freeze_time
9
9
  from pydantic import AfterValidator, BaseModel, SecretStr, ValidationError
10
+ from pydantic.fields import FieldInfo
10
11
 
11
12
  from cuenca_validations.types import (
12
13
  Address,
@@ -27,6 +28,7 @@ from cuenca_validations.types.enums import (
27
28
  )
28
29
  from cuenca_validations.types.general import LogConfig, StrictPositiveInt
29
30
  from cuenca_validations.types.helpers import get_log_config
31
+ from cuenca_validations.types.identities import Password
30
32
  from cuenca_validations.types.requests import (
31
33
  ApiKeyUpdateRequest,
32
34
  BankAccountValidationRequest,
@@ -590,21 +592,22 @@ def test_strict_positive_int_invalid(value, expected_error, expected_message):
590
592
  IntModel(value=value)
591
593
 
592
594
 
593
- def validate_password(password: str) -> str:
595
+ def validate_repeated_digits(password: str) -> str:
594
596
  """
595
597
  Example of a custom validator
596
- Check if the password contains repeated numbers
598
+ Check if the str contains repeated numbers
597
599
  """
598
600
  import re
599
601
 
600
602
  if re.search(r'(\d).*\1', password):
601
- raise ValueError("Password cannot contain repeated digits")
603
+ raise ValueError("str cannot contain repeated digits")
602
604
  return password
603
605
 
604
606
 
605
- class MetadataModel(BaseModel):
606
- password: Annotated[
607
- str, AfterValidator(validate_password), LogConfig(masked=True)
607
+ class LogConfigModel(BaseModel):
608
+ password: Annotated[Password, LogConfig(masked=True)]
609
+ validated: Annotated[
610
+ str, AfterValidator(validate_repeated_digits), LogConfig(masked=True)
608
611
  ]
609
612
  secret: Annotated[str, LogConfig(masked=True)]
610
613
  partial_secret: Annotated[
@@ -612,26 +615,37 @@ class MetadataModel(BaseModel):
612
615
  ]
613
616
 
614
617
 
615
- def test_metadata():
616
- model = MetadataModel(
617
- password="Mypass123",
618
+ def test_log_config():
619
+ model = LogConfigModel(
620
+ password="Mypass123.",
621
+ validated="str123",
618
622
  secret="super-secret",
619
623
  partial_secret="1234567890",
620
624
  )
621
625
 
622
- password_field = MetadataModel.model_fields["password"]
623
- secret_field = MetadataModel.model_fields["secret"]
624
- partial_field = MetadataModel.model_fields["partial_secret"]
626
+ password_field = LogConfigModel.model_fields["password"]
627
+ validated_field = LogConfigModel.model_fields["validated"]
628
+ secret_field = LogConfigModel.model_fields["secret"]
629
+ partial_field = LogConfigModel.model_fields["partial_secret"]
625
630
 
626
631
  assert get_log_config(password_field).masked is True
627
632
  assert get_log_config(password_field).unmasked_chars_length == 0
628
633
 
634
+ assert get_log_config(validated_field).masked is True
635
+ assert get_log_config(validated_field).unmasked_chars_length == 0
636
+
629
637
  assert get_log_config(secret_field).masked is True
630
638
  assert get_log_config(secret_field).unmasked_chars_length == 0
631
639
 
632
640
  assert get_log_config(partial_field).masked is True
633
641
  assert get_log_config(partial_field).unmasked_chars_length == 4
634
642
 
635
- assert model.password == "Mypass123"
643
+ assert model.password.get_secret_value() == "Mypass123."
644
+ assert model.validated == "str123"
636
645
  assert model.secret == "super-secret"
637
646
  assert model.partial_secret == "1234567890"
647
+
648
+
649
+ def test_get_log_config_no_log_config():
650
+ field = FieldInfo(default=None)
651
+ assert get_log_config(field) is None