cuenca-validations 2.1.32.dev4__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.dev4 → cuenca_validations-2.1.33}/PKG-INFO +1 -1
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/__init__.py +2 -8
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/queries.py +0 -6
- {cuenca_validations-2.1.32.dev4 → 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.dev4 → cuenca_validations-2.1.33}/cuenca_validations.egg-info/PKG-INFO +1 -1
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/tests/test_requests.py +28 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/tests/test_types.py +0 -84
- cuenca_validations-2.1.32.dev4/cuenca_validations/version.py +0 -1
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/LICENSE +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/README.md +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/__init__.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/card_bins.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/errors.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/py.typed +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/card.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/enums.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/files.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/general.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/helpers.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/identities.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/morals.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/typing.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/validators.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations.egg-info/SOURCES.txt +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations.egg-info/dependency_links.txt +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations.egg-info/requires.txt +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations.egg-info/top_level.txt +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/setup.cfg +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/setup.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/tests/__init__.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/tests/test_card.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/tests/test_errors.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/tests/test_helpers.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/tests/test_statement.py +0 -0
- {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/tests/test_validators.py +0 -0
{cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/__init__.py
RENAMED
|
@@ -44,10 +44,6 @@ __all__ = [
|
|
|
44
44
|
'FileBatchUploadRequest',
|
|
45
45
|
'FileRequest',
|
|
46
46
|
'FileUploadRequest',
|
|
47
|
-
'FraudFundsTransferAcceptedResponse',
|
|
48
|
-
'FraudFundsTransferQuery',
|
|
49
|
-
'FraudFundsTransferRequest',
|
|
50
|
-
'FraudFundsTransferResultEvent',
|
|
51
47
|
'Gender',
|
|
52
48
|
'IncomeType',
|
|
53
49
|
'IssuerNetwork',
|
|
@@ -95,6 +91,7 @@ __all__ = [
|
|
|
95
91
|
'TransferNetwork',
|
|
96
92
|
'TransferQuery',
|
|
97
93
|
'TransferRequest',
|
|
94
|
+
'UpdateTransferRequest',
|
|
98
95
|
'UserCardNotification',
|
|
99
96
|
'UserCredentialRequest',
|
|
100
97
|
'UserCredentialUpdateRequest',
|
|
@@ -211,7 +208,6 @@ from .queries import (
|
|
|
211
208
|
DepositQuery,
|
|
212
209
|
EventQuery,
|
|
213
210
|
FileQuery,
|
|
214
|
-
FraudFundsTransferQuery,
|
|
215
211
|
IdentityQuery,
|
|
216
212
|
PostalCodeQuery,
|
|
217
213
|
QueryParams,
|
|
@@ -235,9 +231,6 @@ from .requests import (
|
|
|
235
231
|
FileBatchUploadRequest,
|
|
236
232
|
FileRequest,
|
|
237
233
|
FileUploadRequest,
|
|
238
|
-
FraudFundsTransferAcceptedResponse,
|
|
239
|
-
FraudFundsTransferRequest,
|
|
240
|
-
FraudFundsTransferResultEvent,
|
|
241
234
|
KYCValidationRequest,
|
|
242
235
|
LimitedWalletRequest,
|
|
243
236
|
PartnerRequest,
|
|
@@ -251,6 +244,7 @@ from .requests import (
|
|
|
251
244
|
StrictTransferRequest,
|
|
252
245
|
TOSRequest,
|
|
253
246
|
TransferRequest,
|
|
247
|
+
UpdateTransferRequest,
|
|
254
248
|
UserCredentialRequest,
|
|
255
249
|
UserCredentialUpdateRequest,
|
|
256
250
|
UserListsRequest,
|
{cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/queries.py
RENAMED
|
@@ -24,7 +24,6 @@ from .enums import (
|
|
|
24
24
|
KYCFileType,
|
|
25
25
|
SessionType,
|
|
26
26
|
TermsOfService,
|
|
27
|
-
TransactionStatus,
|
|
28
27
|
TransferNetwork,
|
|
29
28
|
UserStatus,
|
|
30
29
|
)
|
|
@@ -154,11 +153,6 @@ class WalletTransactionQuery(QueryParams):
|
|
|
154
153
|
wallet_uri: Optional[str] = None
|
|
155
154
|
|
|
156
155
|
|
|
157
|
-
class FraudFundsTransferQuery(QueryParams):
|
|
158
|
-
request_id: Optional[str] = None
|
|
159
|
-
status: Optional[TransactionStatus] = None
|
|
160
|
-
|
|
161
|
-
|
|
162
156
|
class UserQuery(QueryParams):
|
|
163
157
|
phone_number: Optional[str] = None
|
|
164
158
|
email_address: Optional[EmailStr] = None
|
{cuenca_validations-2.1.32.dev4 → 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.dev4'
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.32.dev4 → 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.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/card.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/enums.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/files.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/general.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/helpers.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/identities.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/morals.py
RENAMED
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/validators.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.32.dev4 → 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
|