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.
Files changed (36) hide show
  1. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/PKG-INFO +1 -1
  2. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/__init__.py +2 -8
  3. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/queries.py +0 -6
  4. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/requests.py +7 -59
  5. cuenca_validations-2.1.33/cuenca_validations/version.py +1 -0
  6. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations.egg-info/PKG-INFO +1 -1
  7. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/tests/test_requests.py +28 -0
  8. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/tests/test_types.py +0 -84
  9. cuenca_validations-2.1.32.dev4/cuenca_validations/version.py +0 -1
  10. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/LICENSE +0 -0
  11. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/README.md +0 -0
  12. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/__init__.py +0 -0
  13. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/card_bins.py +0 -0
  14. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/errors.py +0 -0
  15. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/py.typed +0 -0
  16. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/card.py +0 -0
  17. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/enums.py +0 -0
  18. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/files.py +0 -0
  19. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/general.py +0 -0
  20. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/helpers.py +0 -0
  21. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/identities.py +0 -0
  22. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/types/morals.py +0 -0
  23. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/typing.py +0 -0
  24. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations/validators.py +0 -0
  25. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations.egg-info/SOURCES.txt +0 -0
  26. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations.egg-info/dependency_links.txt +0 -0
  27. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations.egg-info/requires.txt +0 -0
  28. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/cuenca_validations.egg-info/top_level.txt +0 -0
  29. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/setup.cfg +0 -0
  30. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/setup.py +0 -0
  31. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/tests/__init__.py +0 -0
  32. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/tests/test_card.py +0 -0
  33. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/tests/test_errors.py +0 -0
  34. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/tests/test_helpers.py +0 -0
  35. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/tests/test_statement.py +0 -0
  36. {cuenca_validations-2.1.32.dev4 → cuenca_validations-2.1.33}/tests/test_validators.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cuenca_validations
3
- Version: 2.1.32.dev4
3
+ Version: 2.1.33
4
4
  Summary: Cuenca common validations
5
5
  Home-page: https://github.com/cuenca-mx/cuenca-validations
6
6
  Author: Cuenca
@@ -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,
@@ -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
@@ -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' in values
462
- and values['country_of_birth'] == 'MX'
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 r not in values.keys()]
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'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cuenca_validations
3
- Version: 2.1.32.dev4
3
+ Version: 2.1.33
4
4
  Summary: Cuenca common validations
5
5
  Home-page: https://github.com/cuenca-mx/cuenca-validations
6
6
  Author: Cuenca
@@ -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'