cuenca-validations 2.1.33.dev0__tar.gz → 2.1.35__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.33.dev0 → cuenca_validations-2.1.35}/PKG-INFO +1 -1
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/__init__.py +2 -8
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/queries.py +0 -6
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/requests.py +16 -56
- cuenca_validations-2.1.35/cuenca_validations/version.py +1 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations.egg-info/PKG-INFO +1 -1
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/tests/test_requests.py +29 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/tests/test_types.py +0 -84
- cuenca_validations-2.1.33.dev0/cuenca_validations/version.py +0 -1
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/LICENSE +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/README.md +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/__init__.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/card_bins.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/errors.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/py.typed +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/card.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/enums.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/files.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/general.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/helpers.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/identities.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/morals.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/typing.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/validators.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations.egg-info/SOURCES.txt +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations.egg-info/dependency_links.txt +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations.egg-info/requires.txt +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations.egg-info/top_level.txt +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/setup.cfg +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/setup.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/tests/__init__.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/tests/test_card.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/tests/test_errors.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/tests/test_helpers.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/tests/test_statement.py +0 -0
- {cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/tests/test_validators.py +0 -0
{cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/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.33.dev0 → cuenca_validations-2.1.35}/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.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/requests.py
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import datetime as dt
|
|
2
|
-
from typing import Annotated, Any,
|
|
2
|
+
from typing import Annotated, Any, Optional, Union
|
|
3
3
|
|
|
4
4
|
from clabe import Clabe
|
|
5
5
|
from pydantic import (
|
|
@@ -45,6 +45,7 @@ from ..types.enums import (
|
|
|
45
45
|
State,
|
|
46
46
|
TermsOfService,
|
|
47
47
|
TrackDataMethod,
|
|
48
|
+
TransactionStatus,
|
|
48
49
|
TransactionTokenValidationStatus,
|
|
49
50
|
UserCardNotification,
|
|
50
51
|
UserStatus,
|
|
@@ -154,6 +155,20 @@ class StrictTransferRequest(BaseTransferRequest):
|
|
|
154
155
|
)
|
|
155
156
|
|
|
156
157
|
|
|
158
|
+
class UpdateTransferRequest(BaseRequest):
|
|
159
|
+
status: TransactionStatus
|
|
160
|
+
|
|
161
|
+
@field_validator('status')
|
|
162
|
+
@classmethod
|
|
163
|
+
def validate_status(cls, status: TransactionStatus) -> TransactionStatus:
|
|
164
|
+
if status not in (
|
|
165
|
+
TransactionStatus.succeeded,
|
|
166
|
+
TransactionStatus.failed,
|
|
167
|
+
):
|
|
168
|
+
raise ValueError('status must be succeeded or failed')
|
|
169
|
+
return status
|
|
170
|
+
|
|
171
|
+
|
|
157
172
|
class CardUpdateRequest(BaseRequest):
|
|
158
173
|
status: Optional[CardStatus] = None
|
|
159
174
|
pin_block: Optional[str] = None
|
|
@@ -309,61 +324,6 @@ class WalletTransactionRequest(BaseRequest):
|
|
|
309
324
|
amount: StrictPositiveInt
|
|
310
325
|
|
|
311
326
|
|
|
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
327
|
class FraudValidationRequest(BaseModel):
|
|
368
328
|
amount: StrictPositiveInt
|
|
369
329
|
merchant_name: str
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '2.1.35'
|
|
@@ -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,31 @@ 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('status', ['succeeded', 'failed'])
|
|
101
|
+
def test_update_transfer_request_valid_status(status: str) -> None:
|
|
102
|
+
req = UpdateTransferRequest.model_validate({'status': status})
|
|
103
|
+
assert req.status == status
|
|
104
|
+
assert req.model_dump() == {'status': status}
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
@pytest.mark.parametrize('status', ['created', 'submitted', 'in_review'])
|
|
108
|
+
def test_update_transfer_request_invalid_status(status: str) -> None:
|
|
109
|
+
with pytest.raises(ValidationError) as ex:
|
|
110
|
+
UpdateTransferRequest.model_validate({'status': status})
|
|
111
|
+
assert 'status' in str(ex.value)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def test_update_transfer_request_missing_status() -> None:
|
|
115
|
+
with pytest.raises(ValidationError) as ex:
|
|
116
|
+
UpdateTransferRequest.model_validate({})
|
|
117
|
+
assert 'status' in str(ex.value)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def test_update_transfer_request_forbids_extra() -> None:
|
|
121
|
+
with pytest.raises(ValidationError) as ex:
|
|
122
|
+
UpdateTransferRequest.model_validate(
|
|
123
|
+
{'status': 'succeeded', 'foo': 'bar'}
|
|
124
|
+
)
|
|
125
|
+
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.33.dev0'
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/card_bins.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/card.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/enums.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/files.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/general.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/helpers.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/identities.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/types/morals.py
RENAMED
|
File without changes
|
|
File without changes
|
{cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/cuenca_validations/validators.py
RENAMED
|
File without changes
|
{cuenca_validations-2.1.33.dev0 → cuenca_validations-2.1.35}/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
|