cuenca 1.0.2__tar.gz → 1.0.3.dev1__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-1.0.2 → cuenca-1.0.3.dev1}/PKG-INFO +1 -1
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/api_keys.py +4 -5
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/arpc.py +2 -2
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/base.py +39 -50
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/card_activations.py +1 -3
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/cards.py +4 -5
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/clabes.py +2 -2
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/curp_validations.py +2 -5
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/endpoints.py +3 -4
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/file_batches.py +2 -2
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/files.py +2 -8
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/kyc_validations.py +2 -4
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/kyc_verifications.py +3 -3
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/limited_wallets.py +2 -2
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/login_tokens.py +2 -2
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/platforms.py +2 -2
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/questionnaires.py +2 -4
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/resources.py +2 -2
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/savings.py +3 -3
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/sessions.py +2 -2
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/transfers.py +1 -1
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/user_credentials.py +3 -8
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/user_lists_validation.py +2 -5
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/user_logins.py +2 -2
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/users.py +3 -6
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/verifications.py +3 -6
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/wallet_transactions.py +1 -1
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/version.py +1 -1
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca.egg-info/PKG-INFO +1 -1
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_api_keys.py +1 -1
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/LICENSE +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/README.md +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/__init__.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/exc.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/http/__init__.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/http/client.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/jwt.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/py.typed +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/__init__.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/accounts.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/balance_entries.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/bill_payments.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/card_transactions.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/card_validations.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/cash_references.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/commissions.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/deposits.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/identities.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/identity_events.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/otps.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/service_providers.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/statements.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/user_events.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/webhooks.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca/resources/whatsapp_transfers.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca.egg-info/SOURCES.txt +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca.egg-info/dependency_links.txt +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca.egg-info/requires.txt +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/cuenca.egg-info/top_level.txt +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/setup.cfg +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/setup.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/__init__.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/conftest.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/http/__init__.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/http/conftest.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/http/test_client.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/__init__.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_accounts.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_arpc.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_balance_entries.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_bill_payments.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_card_activations.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_card_transactions.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_card_validations.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_cards.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_cash_references.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_clabes.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_commissions.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_curp_validations.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_deposits.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_endpoints.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_file_batches.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_files.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_identities.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_identity_events.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_kyc_validations.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_kyc_verifications.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_limited_wallets.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_login_tokens.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_otps.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_platforms.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_questionnaires.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_resources.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_savings.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_service_providers.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_sessions.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_statements.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_transfers.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_user_credentials.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_user_events.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_user_lists_validation.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_user_logins.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_users.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_verifications.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_wallet_transactions.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_webhooks.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/resources/test_whatsapp_transfers.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/test_cuenca.py +0 -0
- {cuenca-1.0.2 → cuenca-1.0.3.dev1}/tests/test_jwt.py +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import datetime as dt
|
|
2
|
-
from typing import ClassVar, Optional
|
|
2
|
+
from typing import ClassVar, Optional
|
|
3
3
|
|
|
4
4
|
from cuenca_validations.types import ApiKeyQuery, ApiKeyUpdateRequest
|
|
5
5
|
|
|
@@ -36,7 +36,7 @@ class ApiKey(Creatable, Queryable, Retrievable, Updateable):
|
|
|
36
36
|
|
|
37
37
|
@classmethod
|
|
38
38
|
def create(cls, *, session: Session = global_session) -> 'ApiKey':
|
|
39
|
-
return
|
|
39
|
+
return cls._create(session=session)
|
|
40
40
|
|
|
41
41
|
@classmethod
|
|
42
42
|
def deactivate(
|
|
@@ -55,7 +55,7 @@ class ApiKey(Creatable, Queryable, Retrievable, Updateable):
|
|
|
55
55
|
"""
|
|
56
56
|
url = cls._resource + f'/{api_key_id}'
|
|
57
57
|
resp = session.delete(url, dict(minutes=minutes))
|
|
58
|
-
return
|
|
58
|
+
return cls(**resp)
|
|
59
59
|
|
|
60
60
|
@classmethod
|
|
61
61
|
def update(
|
|
@@ -74,5 +74,4 @@ class ApiKey(Creatable, Queryable, Retrievable, Updateable):
|
|
|
74
74
|
req = ApiKeyUpdateRequest(
|
|
75
75
|
metadata=metadata, user_id=user_id, platform_id=platform_id
|
|
76
76
|
)
|
|
77
|
-
|
|
78
|
-
return cast('ApiKey', resp)
|
|
77
|
+
return cls._update(api_key_id, **req.dict(), session=session)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import datetime as dt
|
|
2
|
-
from typing import ClassVar, Optional
|
|
2
|
+
from typing import ClassVar, Optional
|
|
3
3
|
|
|
4
4
|
from cuenca_validations.types.requests import ARPCRequest
|
|
5
5
|
|
|
@@ -52,4 +52,4 @@ class Arpc(Creatable):
|
|
|
52
52
|
unique_number=unique_number,
|
|
53
53
|
track_data_method=track_data_method,
|
|
54
54
|
)
|
|
55
|
-
return
|
|
55
|
+
return cls._create(session=session, **req.dict())
|
|
@@ -2,7 +2,7 @@ import base64
|
|
|
2
2
|
import datetime as dt
|
|
3
3
|
import json
|
|
4
4
|
from io import BytesIO
|
|
5
|
-
from typing import ClassVar,
|
|
5
|
+
from typing import ClassVar, Generator, Optional, Type, TypeVar, cast
|
|
6
6
|
from urllib.parse import urlencode
|
|
7
7
|
|
|
8
8
|
from cuenca_validations.types import (
|
|
@@ -12,34 +12,21 @@ from cuenca_validations.types import (
|
|
|
12
12
|
TransactionQuery,
|
|
13
13
|
TransactionStatus,
|
|
14
14
|
)
|
|
15
|
-
from pydantic import BaseModel
|
|
15
|
+
from pydantic import BaseModel, Extra
|
|
16
16
|
|
|
17
17
|
from ..exc import MultipleResultsFound, NoResultFound
|
|
18
18
|
from ..http import Session, session as global_session
|
|
19
19
|
|
|
20
|
+
R_co = TypeVar('R_co', bound='Resource', covariant=True)
|
|
21
|
+
|
|
20
22
|
|
|
21
23
|
class Resource(BaseModel):
|
|
22
24
|
_resource: ClassVar[str]
|
|
23
25
|
|
|
24
26
|
id: str
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
cls._filter_excess_fields(obj_dict)
|
|
29
|
-
return cls(**obj_dict)
|
|
30
|
-
|
|
31
|
-
@classmethod
|
|
32
|
-
def _filter_excess_fields(cls, obj_dict):
|
|
33
|
-
"""
|
|
34
|
-
dataclasses don't allow __init__ to be called with excess fields. This
|
|
35
|
-
method allows the API to add fields in the response body without
|
|
36
|
-
breaking the client
|
|
37
|
-
"""
|
|
38
|
-
excess = set(obj_dict.keys()) - set(
|
|
39
|
-
cls.schema().get("properties").keys()
|
|
40
|
-
)
|
|
41
|
-
for f in excess:
|
|
42
|
-
del obj_dict[f]
|
|
28
|
+
class Config:
|
|
29
|
+
extra = Extra.ignore
|
|
43
30
|
|
|
44
31
|
def to_dict(self):
|
|
45
32
|
return SantizedDict(self.dict())
|
|
@@ -48,12 +35,12 @@ class Resource(BaseModel):
|
|
|
48
35
|
class Retrievable(Resource):
|
|
49
36
|
@classmethod
|
|
50
37
|
def retrieve(
|
|
51
|
-
cls, id: str, *, session: Session = global_session
|
|
52
|
-
) ->
|
|
38
|
+
cls: Type[R_co], id: str, *, session: Session = global_session
|
|
39
|
+
) -> R_co:
|
|
53
40
|
resp = session.get(f'/{cls._resource}/{id}')
|
|
54
|
-
return cls
|
|
41
|
+
return cls(**resp)
|
|
55
42
|
|
|
56
|
-
def refresh(self, *, session: Session = global_session):
|
|
43
|
+
def refresh(self, *, session: Session = global_session) -> None:
|
|
57
44
|
new = self.retrieve(self.id, session=session)
|
|
58
45
|
for attr, value in new.__dict__.items():
|
|
59
46
|
setattr(self, attr, value)
|
|
@@ -61,9 +48,11 @@ class Retrievable(Resource):
|
|
|
61
48
|
|
|
62
49
|
class Creatable(Resource):
|
|
63
50
|
@classmethod
|
|
64
|
-
def _create(
|
|
51
|
+
def _create(
|
|
52
|
+
cls: Type[R_co], *, session: Session = global_session, **data
|
|
53
|
+
) -> R_co:
|
|
65
54
|
resp = session.post(cls._resource, data)
|
|
66
|
-
return cls
|
|
55
|
+
return cls(**resp)
|
|
67
56
|
|
|
68
57
|
|
|
69
58
|
class Updateable(Resource):
|
|
@@ -72,10 +61,10 @@ class Updateable(Resource):
|
|
|
72
61
|
|
|
73
62
|
@classmethod
|
|
74
63
|
def _update(
|
|
75
|
-
cls, id: str, *, session: Session = global_session, **data
|
|
76
|
-
) ->
|
|
64
|
+
cls: Type[R_co], id: str, *, session: Session = global_session, **data
|
|
65
|
+
) -> R_co:
|
|
77
66
|
resp = session.patch(f'/{cls._resource}/{id}', data)
|
|
78
|
-
return cls
|
|
67
|
+
return cls(**resp)
|
|
79
68
|
|
|
80
69
|
|
|
81
70
|
class Deactivable(Resource):
|
|
@@ -83,20 +72,20 @@ class Deactivable(Resource):
|
|
|
83
72
|
|
|
84
73
|
@classmethod
|
|
85
74
|
def deactivate(
|
|
86
|
-
cls, id: str, *, session: Session = global_session, **data
|
|
87
|
-
) ->
|
|
75
|
+
cls: Type[R_co], id: str, *, session: Session = global_session, **data
|
|
76
|
+
) -> R_co:
|
|
88
77
|
resp = session.delete(f'/{cls._resource}/{id}', data)
|
|
89
|
-
return cls
|
|
78
|
+
return cls(**resp)
|
|
90
79
|
|
|
91
80
|
@property
|
|
92
|
-
def is_active(self):
|
|
81
|
+
def is_active(self) -> bool:
|
|
93
82
|
return not self.deactivated_at
|
|
94
83
|
|
|
95
84
|
|
|
96
85
|
class Downloadable(Resource):
|
|
97
86
|
@classmethod
|
|
98
87
|
def download(
|
|
99
|
-
cls,
|
|
88
|
+
cls: Type[R_co],
|
|
100
89
|
id: str,
|
|
101
90
|
file_format: FileFormat = FileFormat.any,
|
|
102
91
|
*,
|
|
@@ -121,13 +110,13 @@ class Downloadable(Resource):
|
|
|
121
110
|
class Uploadable(Resource):
|
|
122
111
|
@classmethod
|
|
123
112
|
def _upload(
|
|
124
|
-
cls,
|
|
113
|
+
cls: Type[R_co],
|
|
125
114
|
file: bytes,
|
|
126
115
|
user_id: str,
|
|
127
116
|
*,
|
|
128
117
|
session: Session = global_session,
|
|
129
118
|
**data,
|
|
130
|
-
) ->
|
|
119
|
+
) -> R_co:
|
|
131
120
|
encoded_file = base64.b64encode(file)
|
|
132
121
|
resp = session.request(
|
|
133
122
|
'post',
|
|
@@ -138,7 +127,7 @@ class Uploadable(Resource):
|
|
|
138
127
|
**{k: (None, v) for k, v in data.items()},
|
|
139
128
|
),
|
|
140
129
|
)
|
|
141
|
-
return cls
|
|
130
|
+
return cls(**json.loads(resp))
|
|
142
131
|
|
|
143
132
|
|
|
144
133
|
class Queryable(Resource):
|
|
@@ -148,9 +137,9 @@ class Queryable(Resource):
|
|
|
148
137
|
|
|
149
138
|
@classmethod
|
|
150
139
|
def one(
|
|
151
|
-
cls, *, session: Session = global_session, **query_params
|
|
152
|
-
) ->
|
|
153
|
-
q = cls._query_params(limit=2, **query_params)
|
|
140
|
+
cls: Type[R_co], *, session: Session = global_session, **query_params
|
|
141
|
+
) -> R_co:
|
|
142
|
+
q = cast(Queryable, cls)._query_params(limit=2, **query_params)
|
|
154
143
|
resp = session.get(cls._resource, q.dict())
|
|
155
144
|
items = resp['items']
|
|
156
145
|
len_items = len(items)
|
|
@@ -158,40 +147,40 @@ class Queryable(Resource):
|
|
|
158
147
|
raise NoResultFound
|
|
159
148
|
if len_items > 1:
|
|
160
149
|
raise MultipleResultsFound
|
|
161
|
-
return cls
|
|
150
|
+
return cls(**items[0])
|
|
162
151
|
|
|
163
152
|
@classmethod
|
|
164
153
|
def first(
|
|
165
|
-
cls, *, session: Session = global_session, **query_params
|
|
166
|
-
) -> Optional[
|
|
167
|
-
q = cls._query_params(limit=1, **query_params)
|
|
154
|
+
cls: Type[R_co], *, session: Session = global_session, **query_params
|
|
155
|
+
) -> Optional[R_co]:
|
|
156
|
+
q = cast(Queryable, cls)._query_params(limit=1, **query_params)
|
|
168
157
|
resp = session.get(cls._resource, q.dict())
|
|
169
158
|
try:
|
|
170
159
|
item = resp['items'][0]
|
|
171
160
|
except IndexError:
|
|
172
161
|
rv = None
|
|
173
162
|
else:
|
|
174
|
-
rv = cls
|
|
163
|
+
rv = cls(**item)
|
|
175
164
|
return rv
|
|
176
165
|
|
|
177
166
|
@classmethod
|
|
178
167
|
def count(
|
|
179
|
-
cls, *, session: Session = global_session, **query_params
|
|
168
|
+
cls: Type[R_co], *, session: Session = global_session, **query_params
|
|
180
169
|
) -> int:
|
|
181
|
-
q = cls._query_params(count=True, **query_params)
|
|
170
|
+
q = cast(Queryable, cls)._query_params(count=True, **query_params)
|
|
182
171
|
resp = session.get(cls._resource, q.dict())
|
|
183
172
|
return resp['count']
|
|
184
173
|
|
|
185
174
|
@classmethod
|
|
186
175
|
def all(
|
|
187
|
-
cls, *, session: Session = global_session, **query_params
|
|
188
|
-
) -> Generator[
|
|
176
|
+
cls: Type[R_co], *, session: Session = global_session, **query_params
|
|
177
|
+
) -> Generator[R_co, None, None]:
|
|
189
178
|
session = session or global_session
|
|
190
|
-
q = cls._query_params(**query_params)
|
|
179
|
+
q = cast(Queryable, cls)._query_params(**query_params)
|
|
191
180
|
next_page_uri = f'{cls._resource}?{urlencode(q.dict())}'
|
|
192
181
|
while next_page_uri:
|
|
193
182
|
page = session.get(next_page_uri)
|
|
194
|
-
yield from (cls
|
|
183
|
+
yield from (cls(**item) for item in page['items'])
|
|
195
184
|
next_page_uri = page['next_page_uri']
|
|
196
185
|
|
|
197
186
|
|
|
@@ -42,9 +42,7 @@ class CardActivation(Creatable):
|
|
|
42
42
|
exp_year=exp_year,
|
|
43
43
|
cvv2=cvv2,
|
|
44
44
|
)
|
|
45
|
-
return
|
|
46
|
-
'CardActivation', cls._create(session=session, **req.dict())
|
|
47
|
-
)
|
|
45
|
+
return cls._create(session=session, **req.dict())
|
|
48
46
|
|
|
49
47
|
@property
|
|
50
48
|
def card(self) -> Optional[Card]:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import datetime as dt
|
|
2
|
-
from typing import ClassVar, Optional
|
|
2
|
+
from typing import ClassVar, Optional
|
|
3
3
|
|
|
4
4
|
from cuenca_validations.types import (
|
|
5
5
|
CardFundingType,
|
|
@@ -81,7 +81,7 @@ class Card(Retrievable, Queryable, Creatable, Updateable):
|
|
|
81
81
|
card_holder_user_id=card_holder_user_id,
|
|
82
82
|
is_dynamic_cvv=is_dynamic_cvv,
|
|
83
83
|
)
|
|
84
|
-
return
|
|
84
|
+
return cls._create(session=session, **req.dict())
|
|
85
85
|
|
|
86
86
|
@classmethod
|
|
87
87
|
def update(
|
|
@@ -106,8 +106,7 @@ class Card(Retrievable, Queryable, Creatable, Updateable):
|
|
|
106
106
|
req = CardUpdateRequest(
|
|
107
107
|
status=status, pin_block=pin_block, is_dynamic_cvv=is_dynamic_cvv
|
|
108
108
|
)
|
|
109
|
-
|
|
110
|
-
return cast('Card', resp)
|
|
109
|
+
return cls._update(card_id, session=session, **req.dict())
|
|
111
110
|
|
|
112
111
|
@classmethod
|
|
113
112
|
def deactivate(
|
|
@@ -118,4 +117,4 @@ class Card(Retrievable, Queryable, Creatable, Updateable):
|
|
|
118
117
|
"""
|
|
119
118
|
url = f'{cls._resource}/{card_id}'
|
|
120
119
|
resp = session.delete(url)
|
|
121
|
-
return
|
|
120
|
+
return cls(**resp)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import ClassVar
|
|
1
|
+
from typing import ClassVar
|
|
2
2
|
|
|
3
3
|
from ..http import Session, session as global_session
|
|
4
4
|
from .base import Creatable, Queryable, Retrievable
|
|
@@ -11,4 +11,4 @@ class Clabe(Creatable, Queryable, Retrievable):
|
|
|
11
11
|
|
|
12
12
|
@classmethod
|
|
13
13
|
def create(cls, session: Session = global_session):
|
|
14
|
-
return
|
|
14
|
+
return cls._create(session=session)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import datetime as dt
|
|
2
|
-
from typing import ClassVar, Optional
|
|
2
|
+
from typing import ClassVar, Optional
|
|
3
3
|
|
|
4
4
|
from cuenca_validations.types import (
|
|
5
5
|
Country,
|
|
@@ -98,7 +98,4 @@ class CurpValidation(Creatable, Retrievable):
|
|
|
98
98
|
gender=gender,
|
|
99
99
|
manual_curp=manual_curp,
|
|
100
100
|
)
|
|
101
|
-
return
|
|
102
|
-
'CurpValidation',
|
|
103
|
-
cls._create(session=session, **req.dict()),
|
|
104
|
-
)
|
|
101
|
+
return cls._create(session=session, **req.dict())
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import ClassVar, List, Optional
|
|
1
|
+
from typing import ClassVar, List, Optional
|
|
2
2
|
|
|
3
3
|
from cuenca_validations.types.enums import WebhookEvent
|
|
4
4
|
from cuenca_validations.types.requests import (
|
|
@@ -72,7 +72,7 @@ class Endpoint(Creatable, Deactivable, Retrievable, Queryable, Updateable):
|
|
|
72
72
|
:return: New active endpoint
|
|
73
73
|
"""
|
|
74
74
|
req = EndpointRequest(url=url, events=events)
|
|
75
|
-
return
|
|
75
|
+
return cls._create(session=session, **req.dict())
|
|
76
76
|
|
|
77
77
|
@classmethod
|
|
78
78
|
def update(
|
|
@@ -96,5 +96,4 @@ class Endpoint(Creatable, Deactivable, Retrievable, Queryable, Updateable):
|
|
|
96
96
|
req = EndpointUpdateRequest(
|
|
97
97
|
url=url, is_enable=is_enable, events=events
|
|
98
98
|
)
|
|
99
|
-
|
|
100
|
-
return cast('Endpoint', resp)
|
|
99
|
+
return cls._update(endpoint_id, session=session, **req.dict())
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import ClassVar, Dict, List
|
|
1
|
+
from typing import ClassVar, Dict, List
|
|
2
2
|
|
|
3
3
|
from cuenca_validations.types import BatchFileMetadata, FileBatchUploadRequest
|
|
4
4
|
|
|
@@ -22,4 +22,4 @@ class FileBatch(Creatable, Queryable):
|
|
|
22
22
|
session: Session = global_session,
|
|
23
23
|
) -> 'FileBatch':
|
|
24
24
|
req = FileBatchUploadRequest(files=files, user_id=user_id)
|
|
25
|
-
return
|
|
25
|
+
return cls._create(session=session, **req.dict())
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from io import BytesIO
|
|
2
|
-
from typing import ClassVar, Optional
|
|
2
|
+
from typing import ClassVar, Optional
|
|
3
3
|
|
|
4
4
|
from cuenca_validations.types import FileQuery, FileUploadRequest, KYCFileType
|
|
5
5
|
from pydantic import HttpUrl
|
|
@@ -44,13 +44,7 @@ class File(Downloadable, Queryable, Uploadable):
|
|
|
44
44
|
is_back=is_back,
|
|
45
45
|
user_id=user_id,
|
|
46
46
|
)
|
|
47
|
-
return
|
|
48
|
-
'File',
|
|
49
|
-
cls._upload(
|
|
50
|
-
session=session,
|
|
51
|
-
**req.dict(),
|
|
52
|
-
),
|
|
53
|
-
)
|
|
47
|
+
return cls._upload(session=session, **req.dict())
|
|
54
48
|
|
|
55
49
|
@property
|
|
56
50
|
def file(self) -> bytes:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import ClassVar, List, Optional
|
|
1
|
+
from typing import ClassVar, List, Optional
|
|
2
2
|
|
|
3
3
|
from cuenca_validations.types import KYCFile, KYCValidationRequest
|
|
4
4
|
|
|
@@ -38,6 +38,4 @@ class KYCValidation(Creatable, Retrievable, Queryable):
|
|
|
38
38
|
force=force,
|
|
39
39
|
documents=documents,
|
|
40
40
|
)
|
|
41
|
-
return
|
|
42
|
-
'KYCValidation', cls._create(**req.dict(), session=session)
|
|
43
|
-
)
|
|
41
|
+
return cls._create(**req.dict(), session=session)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import datetime as dt
|
|
2
|
-
from typing import ClassVar, Optional
|
|
2
|
+
from typing import ClassVar, Optional
|
|
3
3
|
|
|
4
4
|
from cuenca_validations.types import (
|
|
5
5
|
Address,
|
|
@@ -39,7 +39,7 @@ class KYCVerification(Creatable, Retrievable, Updateable):
|
|
|
39
39
|
|
|
40
40
|
@classmethod
|
|
41
41
|
def create(cls, session: Session = global_session) -> 'KYCVerification':
|
|
42
|
-
return
|
|
42
|
+
return cls._create(session=session)
|
|
43
43
|
|
|
44
44
|
@classmethod
|
|
45
45
|
def update(
|
|
@@ -48,4 +48,4 @@ class KYCVerification(Creatable, Retrievable, Updateable):
|
|
|
48
48
|
curp: Optional[CurpField] = None,
|
|
49
49
|
) -> 'KYCVerification':
|
|
50
50
|
req = KYCVerificationUpdateRequest(curp=curp)
|
|
51
|
-
return
|
|
51
|
+
return cls._update(id=kyc_id, **req.dict())
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import ClassVar, Optional
|
|
1
|
+
from typing import ClassVar, Optional
|
|
2
2
|
|
|
3
3
|
from clabe import Clabe
|
|
4
4
|
from cuenca_validations.types import (
|
|
@@ -37,4 +37,4 @@ class LimitedWallet(Wallet):
|
|
|
37
37
|
allowed_curp=allowed_curp,
|
|
38
38
|
allowed_rfc=allowed_rfc,
|
|
39
39
|
)
|
|
40
|
-
return
|
|
40
|
+
return cls._create(**request.dict())
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from typing import ClassVar
|
|
1
|
+
from typing import ClassVar
|
|
2
2
|
|
|
3
3
|
from ..http import Session, session as global_session
|
|
4
4
|
from .base import Creatable
|
|
@@ -17,4 +17,4 @@ class LoginToken(Creatable):
|
|
|
17
17
|
Make sure to store this token in a safe place
|
|
18
18
|
:return: Token that you can use in cuenca.configure
|
|
19
19
|
"""
|
|
20
|
-
return
|
|
20
|
+
return cls._create(session=session)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import datetime as dt
|
|
2
|
-
from typing import ClassVar, Optional
|
|
2
|
+
from typing import ClassVar, Optional
|
|
3
3
|
|
|
4
4
|
from cuenca_validations.types import Country, PlatformRequest, State
|
|
5
5
|
|
|
@@ -76,4 +76,4 @@ class Platform(Creatable):
|
|
|
76
76
|
phone_number=phone_number,
|
|
77
77
|
email_address=email_address,
|
|
78
78
|
)
|
|
79
|
-
return
|
|
79
|
+
return cls._create(session=session, **req.dict())
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import datetime as dt
|
|
2
|
-
from typing import ClassVar
|
|
2
|
+
from typing import ClassVar
|
|
3
3
|
|
|
4
4
|
from cuenca_validations.types import QuestionnairesRequest
|
|
5
5
|
|
|
@@ -38,6 +38,4 @@ class Questionnaires(Creatable, Retrievable):
|
|
|
38
38
|
token=token,
|
|
39
39
|
form_id=form_id,
|
|
40
40
|
)
|
|
41
|
-
return
|
|
42
|
-
'Questionnaires', cls._create(session=session, **req.dict())
|
|
43
|
-
)
|
|
41
|
+
return cls._create(session=session, **req.dict())
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import re
|
|
2
2
|
from concurrent.futures import ThreadPoolExecutor
|
|
3
|
-
from typing import Dict, List
|
|
3
|
+
from typing import Dict, List
|
|
4
4
|
|
|
5
5
|
from .base import Retrievable
|
|
6
6
|
|
|
@@ -13,7 +13,7 @@ def retrieve_uri(uri: str) -> Retrievable:
|
|
|
13
13
|
if not m:
|
|
14
14
|
raise ValueError(f'uri is not a valid format: {uri}')
|
|
15
15
|
resource, id_ = m.groups()
|
|
16
|
-
return
|
|
16
|
+
return RESOURCES[resource].retrieve(id_)
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
def retrieve_uris(uris: List[str]) -> List[Retrievable]:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import datetime as dt
|
|
2
|
-
from typing import ClassVar, Optional
|
|
2
|
+
from typing import ClassVar, Optional
|
|
3
3
|
|
|
4
4
|
from cuenca_validations.types import (
|
|
5
5
|
SavingCategory,
|
|
@@ -34,7 +34,7 @@ class Saving(Wallet, Updateable):
|
|
|
34
34
|
goal_amount=goal_amount,
|
|
35
35
|
goal_date=goal_date,
|
|
36
36
|
)
|
|
37
|
-
return
|
|
37
|
+
return cls._create(**request.dict())
|
|
38
38
|
|
|
39
39
|
@classmethod
|
|
40
40
|
def update(
|
|
@@ -51,4 +51,4 @@ class Saving(Wallet, Updateable):
|
|
|
51
51
|
goal_amount=goal_amount,
|
|
52
52
|
goal_date=goal_date,
|
|
53
53
|
)
|
|
54
|
-
return
|
|
54
|
+
return cls._update(id=saving_id, **request.dict())
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import datetime as dt
|
|
2
|
-
from typing import ClassVar, Optional
|
|
2
|
+
from typing import ClassVar, Optional
|
|
3
3
|
|
|
4
4
|
from cuenca_validations.types import SessionRequest, SessionType
|
|
5
5
|
from pydantic import AnyUrl
|
|
@@ -50,4 +50,4 @@ class Session(Creatable, Retrievable, Queryable):
|
|
|
50
50
|
success_url=success_url,
|
|
51
51
|
failure_url=failure_url,
|
|
52
52
|
)
|
|
53
|
-
return
|
|
53
|
+
return cls._create(session=session, **req.dict())
|
|
@@ -69,7 +69,7 @@ class Transfer(Transaction, Creatable):
|
|
|
69
69
|
idempotency_key=idempotency_key,
|
|
70
70
|
user_id=user_id,
|
|
71
71
|
)
|
|
72
|
-
return
|
|
72
|
+
return cls._create(**req.dict())
|
|
73
73
|
|
|
74
74
|
@classmethod
|
|
75
75
|
def create_many(cls, requests: List[TransferRequest]) -> DictStrAny:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import datetime as dt
|
|
2
|
-
from typing import ClassVar, Optional
|
|
2
|
+
from typing import ClassVar, Optional
|
|
3
3
|
|
|
4
4
|
from cuenca_validations.types.requests import (
|
|
5
5
|
UserCredentialRequest,
|
|
@@ -25,9 +25,7 @@ class UserCredential(Creatable, Updateable):
|
|
|
25
25
|
session: Session = global_session,
|
|
26
26
|
) -> 'UserCredential':
|
|
27
27
|
req = UserCredentialRequest(password=password, user_id=user_id)
|
|
28
|
-
return
|
|
29
|
-
'UserCredential', cls._create(**req.dict(), session=session)
|
|
30
|
-
)
|
|
28
|
+
return cls._create(**req.dict(), session=session)
|
|
31
29
|
|
|
32
30
|
@classmethod
|
|
33
31
|
def update(
|
|
@@ -42,7 +40,4 @@ class UserCredential(Creatable, Updateable):
|
|
|
42
40
|
is_active=is_active,
|
|
43
41
|
password=password,
|
|
44
42
|
)
|
|
45
|
-
return
|
|
46
|
-
'UserCredential',
|
|
47
|
-
cls._update(id=user_id, **req.dict(), session=session),
|
|
48
|
-
)
|
|
43
|
+
return cls._update(id=user_id, **req.dict(), session=session)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import datetime as dt
|
|
2
|
-
from typing import ClassVar, Optional
|
|
2
|
+
from typing import ClassVar, Optional
|
|
3
3
|
|
|
4
4
|
from cuenca_validations.types import UserListsRequest, VerificationStatus
|
|
5
5
|
from cuenca_validations.types.identities import CurpField
|
|
@@ -36,7 +36,4 @@ class UserListsValidation(Creatable, Retrievable):
|
|
|
36
36
|
curp=curp,
|
|
37
37
|
account_number=account_number,
|
|
38
38
|
)
|
|
39
|
-
return
|
|
40
|
-
'UserListsValidation',
|
|
41
|
-
cls._create(session=session, **req.dict()),
|
|
42
|
-
)
|
|
39
|
+
return cls._create(session=session, **req.dict())
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import datetime as dt
|
|
2
|
-
from typing import ClassVar, Optional
|
|
2
|
+
from typing import ClassVar, Optional
|
|
3
3
|
|
|
4
4
|
from cuenca_validations.types.requests import UserLoginRequest
|
|
5
5
|
|
|
@@ -31,7 +31,7 @@ class UserLogin(Creatable):
|
|
|
31
31
|
session: Session = global_session,
|
|
32
32
|
) -> 'UserLogin':
|
|
33
33
|
req = UserLoginRequest(password=password, user_id=user_id)
|
|
34
|
-
login =
|
|
34
|
+
login = cls._create(session=session, **req.dict())
|
|
35
35
|
if login.success:
|
|
36
36
|
session.headers['X-Cuenca-LoginId'] = login.id
|
|
37
37
|
return login
|
|
@@ -59,7 +59,7 @@ class User(Creatable, Retrievable, Updateable, Queryable):
|
|
|
59
59
|
|
|
60
60
|
@property
|
|
61
61
|
def balance(self) -> int:
|
|
62
|
-
be =
|
|
62
|
+
be = BalanceEntry.first(user_id=self.id)
|
|
63
63
|
return be.rolling_balance if be else 0
|
|
64
64
|
|
|
65
65
|
class Config:
|
|
@@ -135,7 +135,7 @@ class User(Creatable, Retrievable, Updateable, Queryable):
|
|
|
135
135
|
status=status,
|
|
136
136
|
terms_of_service=terms_of_service,
|
|
137
137
|
)
|
|
138
|
-
return
|
|
138
|
+
return cls._create(session=session, **req.dict())
|
|
139
139
|
|
|
140
140
|
@classmethod
|
|
141
141
|
def update(
|
|
@@ -174,10 +174,7 @@ class User(Creatable, Retrievable, Updateable, Queryable):
|
|
|
174
174
|
curp_document=curp_document,
|
|
175
175
|
status=status,
|
|
176
176
|
)
|
|
177
|
-
return
|
|
178
|
-
'User',
|
|
179
|
-
cls._update(id=user_id, **request.dict(), session=session),
|
|
180
|
-
)
|
|
177
|
+
return cls._update(id=user_id, **request.dict(), session=session)
|
|
181
178
|
|
|
182
179
|
@property
|
|
183
180
|
def identity(self) -> Identity:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import datetime as dt
|
|
2
|
-
from typing import ClassVar, Optional, Union
|
|
2
|
+
from typing import ClassVar, Optional, Union
|
|
3
3
|
|
|
4
4
|
from cuenca_validations.types import (
|
|
5
5
|
VerificationAttemptRequest,
|
|
@@ -44,7 +44,7 @@ class Verification(Creatable, Updateable):
|
|
|
44
44
|
req = VerificationRequest(
|
|
45
45
|
recipient=recipient, type=type, platform_id=platform_id
|
|
46
46
|
)
|
|
47
|
-
return
|
|
47
|
+
return cls._create(**req.dict(), session=session)
|
|
48
48
|
|
|
49
49
|
@classmethod
|
|
50
50
|
def verify(
|
|
@@ -54,7 +54,4 @@ class Verification(Creatable, Updateable):
|
|
|
54
54
|
session: Session = global_session,
|
|
55
55
|
) -> 'Verification':
|
|
56
56
|
req = VerificationAttemptRequest(code=code)
|
|
57
|
-
return
|
|
58
|
-
'Verification',
|
|
59
|
-
cls._update(id=id, **req.dict(), session=session),
|
|
60
|
-
)
|
|
57
|
+
return cls._update(id=id, **req.dict(), session=session)
|
|
@@ -84,7 +84,7 @@ def test_api_key_from_dict():
|
|
|
84
84
|
metadata=None,
|
|
85
85
|
user_id=None,
|
|
86
86
|
)
|
|
87
|
-
api_key = ApiKey
|
|
87
|
+
api_key = ApiKey(**api_keys_dict)
|
|
88
88
|
assert not hasattr(api_key, 'extra_field_1')
|
|
89
89
|
assert not hasattr(api_key, 'extra_field_2')
|
|
90
90
|
assert api_key.id is not None
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|