cuenca-validations 2.1.32.dev3__tar.gz → 2.1.33__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.32.dev3 → cuenca_validations-2.1.33}/PKG-INFO +1 -1
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/__init__.py +2 -6
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/requests.py +7 -59
- cuenca_validations-2.1.33/cuenca_validations/version.py +1 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations.egg-info/PKG-INFO +1 -1
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/tests/test_requests.py +28 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/tests/test_types.py +0 -84
- cuenca_validations-2.1.32.dev3/cuenca_validations/version.py +0 -1
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/LICENSE +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/README.md +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/__init__.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/card_bins.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/errors.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/py.typed +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/card.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/enums.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/files.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/general.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/helpers.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/identities.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/morals.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/queries.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/typing.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/validators.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations.egg-info/SOURCES.txt +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations.egg-info/dependency_links.txt +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations.egg-info/requires.txt +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations.egg-info/top_level.txt +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/setup.cfg +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/setup.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/tests/__init__.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/tests/test_card.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/tests/test_errors.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/tests/test_helpers.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/tests/test_statement.py +0 -0
- {cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/tests/test_validators.py +0 -0
{cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/__init__.py
RENAMED
|
@@ -44,9 +44,6 @@ __all__ = [
|
|
|
44
44
|
'FileBatchUploadRequest',
|
|
45
45
|
'FileRequest',
|
|
46
46
|
'FileUploadRequest',
|
|
47
|
-
'FraudFundsTransferAcceptedResponse',
|
|
48
|
-
'FraudFundsTransferRequest',
|
|
49
|
-
'FraudFundsTransferResultEvent',
|
|
50
47
|
'Gender',
|
|
51
48
|
'IncomeType',
|
|
52
49
|
'IssuerNetwork',
|
|
@@ -94,6 +91,7 @@ __all__ = [
|
|
|
94
91
|
'TransferNetwork',
|
|
95
92
|
'TransferQuery',
|
|
96
93
|
'TransferRequest',
|
|
94
|
+
'UpdateTransferRequest',
|
|
97
95
|
'UserCardNotification',
|
|
98
96
|
'UserCredentialRequest',
|
|
99
97
|
'UserCredentialUpdateRequest',
|
|
@@ -233,9 +231,6 @@ from .requests import (
|
|
|
233
231
|
FileBatchUploadRequest,
|
|
234
232
|
FileRequest,
|
|
235
233
|
FileUploadRequest,
|
|
236
|
-
FraudFundsTransferAcceptedResponse,
|
|
237
|
-
FraudFundsTransferRequest,
|
|
238
|
-
FraudFundsTransferResultEvent,
|
|
239
234
|
KYCValidationRequest,
|
|
240
235
|
LimitedWalletRequest,
|
|
241
236
|
PartnerRequest,
|
|
@@ -249,6 +244,7 @@ from .requests import (
|
|
|
249
244
|
StrictTransferRequest,
|
|
250
245
|
TOSRequest,
|
|
251
246
|
TransferRequest,
|
|
247
|
+
UpdateTransferRequest,
|
|
252
248
|
UserCredentialRequest,
|
|
253
249
|
UserCredentialUpdateRequest,
|
|
254
250
|
UserListsRequest,
|
{cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/requests.py
RENAMED
|
@@ -154,6 +154,10 @@ class StrictTransferRequest(BaseTransferRequest):
|
|
|
154
154
|
)
|
|
155
155
|
|
|
156
156
|
|
|
157
|
+
class UpdateTransferRequest(BaseRequest):
|
|
158
|
+
action: Literal['approve', 'reject']
|
|
159
|
+
|
|
160
|
+
|
|
157
161
|
class CardUpdateRequest(BaseRequest):
|
|
158
162
|
status: Optional[CardStatus] = None
|
|
159
163
|
pin_block: Optional[str] = None
|
|
@@ -309,61 +313,6 @@ class WalletTransactionRequest(BaseRequest):
|
|
|
309
313
|
amount: StrictPositiveInt
|
|
310
314
|
|
|
311
315
|
|
|
312
|
-
class FraudFundsTransferRequest(BaseRequest):
|
|
313
|
-
user_id: NonEmptyStr
|
|
314
|
-
clabe: Clabe
|
|
315
|
-
concepto: NonEmptyStr
|
|
316
|
-
amount: Optional[StrictPositiveInt] = None
|
|
317
|
-
reason: NonEmptyStr
|
|
318
|
-
request_id: NonEmptyStr
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
class FraudFundsTransferAcceptedResponse(BaseRequest):
|
|
322
|
-
request_id: NonEmptyStr
|
|
323
|
-
status: Literal['queued']
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
class FraudFundsTransferResultEvent(BaseRequest):
|
|
327
|
-
schema_version: NonEmptyStr
|
|
328
|
-
event_type: Literal[
|
|
329
|
-
'fraud_funds_transfer.succeeded',
|
|
330
|
-
'fraud_funds_transfer.failed',
|
|
331
|
-
]
|
|
332
|
-
request_id: NonEmptyStr
|
|
333
|
-
user_id: NonEmptyStr
|
|
334
|
-
transaction_id: Optional[NonEmptyStr] = None
|
|
335
|
-
amount: Optional[StrictPositiveInt] = None
|
|
336
|
-
clave_rastreo: Optional[NonEmptyStr] = None
|
|
337
|
-
reason_code: Optional[NonEmptyStr] = None
|
|
338
|
-
message: Optional[NonEmptyStr] = None
|
|
339
|
-
completed_at: dt.datetime
|
|
340
|
-
|
|
341
|
-
@model_validator(mode='after')
|
|
342
|
-
def validate_payload(self) -> 'FraudFundsTransferResultEvent':
|
|
343
|
-
if self.event_type == 'fraud_funds_transfer.succeeded':
|
|
344
|
-
required = {
|
|
345
|
-
'transaction_id': self.transaction_id,
|
|
346
|
-
'amount': self.amount,
|
|
347
|
-
}
|
|
348
|
-
missing = [
|
|
349
|
-
field for field, value in required.items() if value is None
|
|
350
|
-
]
|
|
351
|
-
if missing:
|
|
352
|
-
raise ValueError(
|
|
353
|
-
f'{", ".join(missing)} required for succeeded event'
|
|
354
|
-
)
|
|
355
|
-
return self
|
|
356
|
-
|
|
357
|
-
required = {
|
|
358
|
-
'reason_code': self.reason_code,
|
|
359
|
-
'message': self.message,
|
|
360
|
-
}
|
|
361
|
-
missing = [field for field, value in required.items() if value is None]
|
|
362
|
-
if missing:
|
|
363
|
-
raise ValueError(f'{", ".join(missing)} required for failed event')
|
|
364
|
-
return self
|
|
365
|
-
|
|
366
|
-
|
|
367
316
|
class FraudValidationRequest(BaseModel):
|
|
368
317
|
amount: StrictPositiveInt
|
|
369
318
|
merchant_name: str
|
|
@@ -458,9 +407,8 @@ class CurpValidationRequest(BaseRequest):
|
|
|
458
407
|
@classmethod
|
|
459
408
|
def validate_state_of_birth(cls, values: DictStrAny) -> DictStrAny:
|
|
460
409
|
if (
|
|
461
|
-
'country_of_birth'
|
|
462
|
-
and values
|
|
463
|
-
and 'state_of_birth' not in values
|
|
410
|
+
values.get('country_of_birth') == 'MX'
|
|
411
|
+
and values.get('state_of_birth') is None
|
|
464
412
|
):
|
|
465
413
|
raise ValueError('state_of_birth required')
|
|
466
414
|
return values
|
|
@@ -476,7 +424,7 @@ class CurpValidationRequest(BaseRequest):
|
|
|
476
424
|
'country_of_birth',
|
|
477
425
|
'gender',
|
|
478
426
|
]
|
|
479
|
-
missing = [r for r in required if
|
|
427
|
+
missing = [r for r in required if values.get(r) is None]
|
|
480
428
|
if not manual_curp and missing:
|
|
481
429
|
raise ValueError(f'values required: {",".join(missing)}')
|
|
482
430
|
return values
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '2.1.33'
|
|
@@ -5,6 +5,7 @@ from pydantic_extra_types.phone_numbers import PhoneNumber
|
|
|
5
5
|
from cuenca_validations.types.enums import VerificationType
|
|
6
6
|
from cuenca_validations.types.requests import (
|
|
7
7
|
PasswordResetRequest,
|
|
8
|
+
UpdateTransferRequest,
|
|
8
9
|
UserTOSAgreementRequest,
|
|
9
10
|
UserUpdateRequest,
|
|
10
11
|
VerificationRequest,
|
|
@@ -94,3 +95,30 @@ def test_user_update_request_normalizes_email() -> None:
|
|
|
94
95
|
def test_user_update_request_normalizes_phone() -> None:
|
|
95
96
|
req = UserUpdateRequest(phone_number=PhoneNumber('+116504401222'))
|
|
96
97
|
assert req.phone_number == '+16504401222'
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
@pytest.mark.parametrize('action', ['approve', 'reject'])
|
|
101
|
+
def test_update_transfer_request_valid_action(action: str) -> None:
|
|
102
|
+
req = UpdateTransferRequest.model_validate({'action': action})
|
|
103
|
+
assert req.action == action
|
|
104
|
+
assert req.model_dump() == {'action': action}
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def test_update_transfer_request_invalid_action() -> None:
|
|
108
|
+
with pytest.raises(ValidationError) as ex:
|
|
109
|
+
UpdateTransferRequest.model_validate({'action': 'cancel'})
|
|
110
|
+
assert 'action' in str(ex.value)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def test_update_transfer_request_missing_action() -> None:
|
|
114
|
+
with pytest.raises(ValidationError) as ex:
|
|
115
|
+
UpdateTransferRequest.model_validate({})
|
|
116
|
+
assert 'action' in str(ex.value)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def test_update_transfer_request_forbids_extra() -> None:
|
|
120
|
+
with pytest.raises(ValidationError) as ex:
|
|
121
|
+
UpdateTransferRequest.model_validate(
|
|
122
|
+
{'action': 'approve', 'foo': 'bar'}
|
|
123
|
+
)
|
|
124
|
+
assert 'Extra inputs are not permitted' in str(ex.value)
|
|
@@ -12,9 +12,6 @@ from pydantic.fields import FieldInfo
|
|
|
12
12
|
|
|
13
13
|
from cuenca_validations.types import (
|
|
14
14
|
CardQuery,
|
|
15
|
-
FraudFundsTransferAcceptedResponse,
|
|
16
|
-
FraudFundsTransferRequest,
|
|
17
|
-
FraudFundsTransferResultEvent,
|
|
18
15
|
JSONEncoder,
|
|
19
16
|
QueryParams,
|
|
20
17
|
SantizedDict,
|
|
@@ -639,87 +636,6 @@ def test_bank_account_validation_clabe_request():
|
|
|
639
636
|
assert BankAccountValidationRequest(account_number='646180157098510917')
|
|
640
637
|
|
|
641
638
|
|
|
642
|
-
def test_fraud_funds_transfer_models():
|
|
643
|
-
request = FraudFundsTransferRequest(
|
|
644
|
-
user_id='US123',
|
|
645
|
-
clabe='646180157098510917',
|
|
646
|
-
concepto=' fondos fraude ',
|
|
647
|
-
amount=100,
|
|
648
|
-
reason='fraud_report',
|
|
649
|
-
request_id='REQ123',
|
|
650
|
-
)
|
|
651
|
-
|
|
652
|
-
assert request.concepto == 'fondos fraude'
|
|
653
|
-
assert request.model_dump() == {
|
|
654
|
-
'user_id': 'US123',
|
|
655
|
-
'clabe': '646180157098510917',
|
|
656
|
-
'concepto': 'fondos fraude',
|
|
657
|
-
'amount': 100,
|
|
658
|
-
'reason': 'fraud_report',
|
|
659
|
-
'request_id': 'REQ123',
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
response = FraudFundsTransferAcceptedResponse(
|
|
663
|
-
request_id='REQ123',
|
|
664
|
-
status='queued',
|
|
665
|
-
)
|
|
666
|
-
|
|
667
|
-
assert response.status == 'queued'
|
|
668
|
-
|
|
669
|
-
succeeded_event = FraudFundsTransferResultEvent(
|
|
670
|
-
schema_version='1.0',
|
|
671
|
-
event_type='fraud_funds_transfer.succeeded',
|
|
672
|
-
request_id='REQ123',
|
|
673
|
-
user_id='US123',
|
|
674
|
-
transaction_id='TR123',
|
|
675
|
-
amount=100,
|
|
676
|
-
clave_rastreo='RASTREO123',
|
|
677
|
-
completed_at=now,
|
|
678
|
-
)
|
|
679
|
-
|
|
680
|
-
assert succeeded_event.transaction_id == 'TR123'
|
|
681
|
-
|
|
682
|
-
failed_event = FraudFundsTransferResultEvent(
|
|
683
|
-
schema_version='1.0',
|
|
684
|
-
event_type='fraud_funds_transfer.failed',
|
|
685
|
-
request_id='REQ123',
|
|
686
|
-
user_id='US123',
|
|
687
|
-
reason_code='insufficient_funds',
|
|
688
|
-
message='Insufficient funds',
|
|
689
|
-
completed_at=now,
|
|
690
|
-
)
|
|
691
|
-
|
|
692
|
-
assert failed_event.reason_code == 'insufficient_funds'
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
@pytest.mark.parametrize(
|
|
696
|
-
'event_type,expected_error',
|
|
697
|
-
[
|
|
698
|
-
(
|
|
699
|
-
'fraud_funds_transfer.succeeded',
|
|
700
|
-
'transaction_id, amount required for succeeded event',
|
|
701
|
-
),
|
|
702
|
-
(
|
|
703
|
-
'fraud_funds_transfer.failed',
|
|
704
|
-
'reason_code, message required for failed event',
|
|
705
|
-
),
|
|
706
|
-
],
|
|
707
|
-
)
|
|
708
|
-
def test_fraud_funds_transfer_result_event_requires_payload(
|
|
709
|
-
event_type, expected_error
|
|
710
|
-
):
|
|
711
|
-
with pytest.raises(ValidationError) as ex:
|
|
712
|
-
FraudFundsTransferResultEvent(
|
|
713
|
-
schema_version='1.0',
|
|
714
|
-
event_type=event_type,
|
|
715
|
-
request_id='REQ123',
|
|
716
|
-
user_id='US123',
|
|
717
|
-
completed_at=now,
|
|
718
|
-
)
|
|
719
|
-
|
|
720
|
-
assert expected_error in str(ex.value)
|
|
721
|
-
|
|
722
|
-
|
|
723
639
|
@pytest.mark.parametrize(
|
|
724
640
|
'input_data',
|
|
725
641
|
[
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = '2.1.32.dev3'
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/card_bins.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/card.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/enums.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/files.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/general.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/helpers.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/identities.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/morals.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/types/queries.py
RENAMED
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations/validators.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.32.dev3 → cuenca_validations-2.1.33}/cuenca_validations.egg-info/SOURCES.txt
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
|