cuenca 1.0.3.dev0__py3-none-any.whl → 1.0.3.dev1__py3-none-any.whl

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/__init__.py CHANGED
@@ -23,6 +23,7 @@ __all__ = [
23
23
  'KYCVerification',
24
24
  'LimitedWallet',
25
25
  'LoginToken',
26
+ 'Otp',
26
27
  'Platform',
27
28
  'Questionnaires',
28
29
  'Saving',
@@ -70,6 +71,7 @@ from .resources import (
70
71
  KYCVerification,
71
72
  LimitedWallet,
72
73
  LoginToken,
74
+ Otp,
73
75
  Platform,
74
76
  Questionnaires,
75
77
  Saving,
@@ -22,6 +22,7 @@ __all__ = [
22
22
  'KYCVerification',
23
23
  'LimitedWallet',
24
24
  'LoginToken',
25
+ 'Otp',
25
26
  'Platform',
26
27
  'Questionnaires',
27
28
  'Saving',
@@ -62,6 +63,7 @@ from .kyc_validations import KYCValidation
62
63
  from .kyc_verifications import KYCVerification
63
64
  from .limited_wallets import LimitedWallet
64
65
  from .login_tokens import LoginToken
66
+ from .otps import Otp
65
67
  from .platforms import Platform
66
68
  from .questionnaires import Questionnaires
67
69
  from .resources import RESOURCES
cuenca/resources/base.py CHANGED
@@ -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, Generator, Optional, Type, TypeVar
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 (
@@ -18,7 +18,6 @@ from ..exc import MultipleResultsFound, NoResultFound
18
18
  from ..http import Session, session as global_session
19
19
 
20
20
  R_co = TypeVar('R_co', bound='Resource', covariant=True)
21
- Q_co = TypeVar('Q_co', bound='Queryable', covariant=True)
22
21
 
23
22
 
24
23
  class Resource(BaseModel):
@@ -138,9 +137,9 @@ class Queryable(Resource):
138
137
 
139
138
  @classmethod
140
139
  def one(
141
- cls: Type[Q_co], *, session: Session = global_session, **query_params
142
- ) -> Q_co:
143
- 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)
144
143
  resp = session.get(cls._resource, q.dict())
145
144
  items = resp['items']
146
145
  len_items = len(items)
@@ -152,9 +151,9 @@ class Queryable(Resource):
152
151
 
153
152
  @classmethod
154
153
  def first(
155
- cls: Type[Q_co], *, session: Session = global_session, **query_params
156
- ) -> Optional[Q_co]:
157
- 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)
158
157
  resp = session.get(cls._resource, q.dict())
159
158
  try:
160
159
  item = resp['items'][0]
@@ -166,18 +165,18 @@ class Queryable(Resource):
166
165
 
167
166
  @classmethod
168
167
  def count(
169
- cls: Type[Q_co], *, session: Session = global_session, **query_params
168
+ cls: Type[R_co], *, session: Session = global_session, **query_params
170
169
  ) -> int:
171
- q = cls._query_params(count=True, **query_params)
170
+ q = cast(Queryable, cls)._query_params(count=True, **query_params)
172
171
  resp = session.get(cls._resource, q.dict())
173
172
  return resp['count']
174
173
 
175
174
  @classmethod
176
175
  def all(
177
- cls: Type[Q_co], *, session: Session = global_session, **query_params
178
- ) -> Generator[Q_co, None, None]:
176
+ cls: Type[R_co], *, session: Session = global_session, **query_params
177
+ ) -> Generator[R_co, None, None]:
179
178
  session = session or global_session
180
- q = cls._query_params(**query_params)
179
+ q = cast(Queryable, cls)._query_params(**query_params)
181
180
  next_page_uri = f'{cls._resource}?{urlencode(q.dict())}'
182
181
  while next_page_uri:
183
182
  page = session.get(next_page_uri)
@@ -0,0 +1,24 @@
1
+ from typing import ClassVar, cast
2
+
3
+ from ..http import Session, session as global_session
4
+ from .base import Creatable
5
+
6
+
7
+ class Otp(Creatable):
8
+ _resource: ClassVar = 'otps'
9
+ secret: str
10
+
11
+ class Config:
12
+ schema_extra = {
13
+ 'example': {
14
+ 'id': 'OTNEUInh69SuKXXmK95sROwQ',
15
+ 'secret': 'somesecret',
16
+ }
17
+ }
18
+
19
+ @classmethod
20
+ def create(cls, session: Session = global_session) -> 'Otp':
21
+ """
22
+ Use this method to create a OTP seed
23
+ """
24
+ return cast('Otp', cls._create(session=session))
cuenca/version.py CHANGED
@@ -1,3 +1,3 @@
1
- __version__ = '1.0.3.dev0'
1
+ __version__ = '1.0.3.dev1'
2
2
  CLIENT_VERSION = __version__
3
3
  API_VERSION = '2020-03-19'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cuenca
3
- Version: 1.0.3.dev0
3
+ Version: 1.0.3.dev1
4
4
  Summary: Cuenca API Client
5
5
  Home-page: https://github.com/cuenca-mx/cuenca-python
6
6
  Author: Cuenca
@@ -1,16 +1,16 @@
1
- cuenca/__init__.py,sha256=aUXUxZNqqVyukpUIKEkNxBcM3H5Xf7s0jYWugX5ClLI,1787
1
+ cuenca/__init__.py,sha256=vFLEaVgT93FvqGtuoGyMFd_mQLABRm6T7zIcTZSMKjc,1807
2
2
  cuenca/exc.py,sha256=r_lL03-JS0AsXw71wuNbiwNYLHNDagM56tRxpYyK6Lw,601
3
3
  cuenca/jwt.py,sha256=plB2ttHPZnL0xq3gqubw_Jjtj1QYG2E5bk99N3cn5zg,1502
4
4
  cuenca/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- cuenca/version.py,sha256=FW9sG478l3dxmQrNLjEAKb8ZQrow5NXjLYgbiCIAAMM,83
5
+ cuenca/version.py,sha256=wc5LRS5XIvvpujmHjGckQ9yvyHKeKdoXr2DA21JiEZ0,83
6
6
  cuenca/http/__init__.py,sha256=V5TG6Ro9d3VY7umzcbtanmvHlGkv-k71H0tqrdMyH-s,49
7
7
  cuenca/http/client.py,sha256=psXJiSgd3SUSJ5jwvhdBWsVMNadenG353BNVXdh7HMY,4168
8
- cuenca/resources/__init__.py,sha256=9TYP93f7sIC5nYABiuycd4LLzZkgQrkWz-pJWRGJsKM,2986
8
+ cuenca/resources/__init__.py,sha256=pySyBur3jnWA5yfHFuVZfdnk6nROj3BsLRy7vVWXFoc,3019
9
9
  cuenca/resources/accounts.py,sha256=5yfNxAHpxWFosoR4WrPrDGpBCRkaQk98V-w0wCPPXqU,345
10
10
  cuenca/resources/api_keys.py,sha256=98ye291Z9bt7J2lbTp64fxA9EsFz4XjqFLc3mRcTuCI,2471
11
11
  cuenca/resources/arpc.py,sha256=pdpVkAOQKkhEX4UsbD90oOw1NJv6JrupjLjVpt4jHHs,1669
12
12
  cuenca/resources/balance_entries.py,sha256=aw07ntL9D1AfsuBbcDk5xR9nQIIopQ_WHXd0KHBAges,1104
13
- cuenca/resources/base.py,sha256=prc3jQZCYEY6Dez5eoWRLsyqAqziPe7-sPNBZYhpPxY,5409
13
+ cuenca/resources/base.py,sha256=C6BR6g4mEOtXdsbo2VrjRXxHdWnnmRBUIb8Vk1G_BdI,5425
14
14
  cuenca/resources/bill_payments.py,sha256=spZSVCkLoJTOJIvfYim3R1JEUCvCKdRqLmr98M9y8oo,529
15
15
  cuenca/resources/card_activations.py,sha256=CxiXuVcXRZ6Hsd0alCNhC2OqrOdd1S2hqBe2ZQEQ9K0,1277
16
16
  cuenca/resources/card_transactions.py,sha256=_7RvYXaHiGJyTfySIPV65vRAA1uWi7l_tE3fzKT5LSg,1083
@@ -30,6 +30,7 @@ cuenca/resources/kyc_validations.py,sha256=EWbvTHuXee9YilnPGdIuRGXm5RTBxNDpx5qdO
30
30
  cuenca/resources/kyc_verifications.py,sha256=YECzqLfJPU8-yHRKManUUMB3UgIuErzRBakLYlllzMI,1504
31
31
  cuenca/resources/limited_wallets.py,sha256=br6YxQaXR93FuHXm2Fi3--X2oOzt1FWxhjmlRkWk5us,1051
32
32
  cuenca/resources/login_tokens.py,sha256=WnVLer9ajZeh04-omoFTmTyXMhBB8xrZlcOc2Dx5mdE,613
33
+ cuenca/resources/otps.py,sha256=M4eTocovZlvRXVahdnPfQy1cl1RMy7gzUh9DRHVEJDE,582
33
34
  cuenca/resources/platforms.py,sha256=koalWdedx1BNmCkHNB46X_t0f25-Gp1tCbgRXcdqq9E,2719
34
35
  cuenca/resources/questionnaires.py,sha256=CV-jVgxbGttA2HLorfq-b_nQ1TeiM9gA-uXl7-0ZA1w,983
35
36
  cuenca/resources/resources.py,sha256=IUd_rsjlsn4grujxZ24PQs2Nhphcd4uIUZ2YDKlSbqA,681
@@ -78,6 +79,7 @@ tests/resources/test_kyc_validations.py,sha256=TEyS6encW-InRpcAR4nDCfmkqqnn8yMC9
78
79
  tests/resources/test_kyc_verifications.py,sha256=Y-ZU61o18I_3NFqMN2w4WGZTzwsIhULAtESqIXiizUY,634
79
80
  tests/resources/test_limited_wallets.py,sha256=c0zDDOip3lJk8chbcGr_nWCdkO9yuL_HbD1IikR5jH4,527
80
81
  tests/resources/test_login_tokens.py,sha256=kn0gXFOanIXjgKjbeOzfNyKsGAUkc2iKnuVmzIRaMD8,572
82
+ tests/resources/test_otps.py,sha256=kr-NCK8V8EwI8iku06hEDW1y0BVSW-Q3FRfnn9u1-Jo,612
81
83
  tests/resources/test_platforms.py,sha256=5b6-XC3uAz8GARFkFoanH62jxE1uJIMXcdpeUhmI8Kg,211
82
84
  tests/resources/test_questionnaires.py,sha256=Sl8YHXgL42xiijUncycOUzGu5MtI3jEnhADS8Nol6N8,321
83
85
  tests/resources/test_resources.py,sha256=rTcfjZOxujOJXjfqvOV6TPpYl8lae4bgbZj4jTAWm_o,170
@@ -95,8 +97,8 @@ tests/resources/test_verifications.py,sha256=yyL-bdryQU3MvqnmAgnnzGG9t7UTxWwPiVu
95
97
  tests/resources/test_wallet_transactions.py,sha256=_L2hjPHT4FwwhxksUoaoVHwFFYOGWfF4ScCbk0kb7Hw,3945
96
98
  tests/resources/test_webhooks.py,sha256=nYCqAnlNJcMJKRHhgoHOWTQnFLWQHHvFyY8GVCxGTD8,328
97
99
  tests/resources/test_whatsapp_transfers.py,sha256=4Dmrsbytx7LRrLQo9M8TAL7cGKJufPStkp51UdRCnYU,1030
98
- cuenca-1.0.3.dev0.dist-info/LICENSE,sha256=aWv5PmUiAcNENEAdghcVQSeU56pXJHWexJYgklK9XLg,1063
99
- cuenca-1.0.3.dev0.dist-info/METADATA,sha256=BAvf3P0KvgdkG7YSrZbKtBPPOwswIzA9ULF8dsezVM8,4588
100
- cuenca-1.0.3.dev0.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
101
- cuenca-1.0.3.dev0.dist-info/top_level.txt,sha256=5h3K7XJTmJniDloPq4sIJHni_xLw-Uoc6ZJ5mcw_lZY,13
102
- cuenca-1.0.3.dev0.dist-info/RECORD,,
100
+ cuenca-1.0.3.dev1.dist-info/LICENSE,sha256=aWv5PmUiAcNENEAdghcVQSeU56pXJHWexJYgklK9XLg,1063
101
+ cuenca-1.0.3.dev1.dist-info/METADATA,sha256=ECD-XNiJRenAaIXI_9x3AGn1wNhFS45ilGLn4G_KHUo,4588
102
+ cuenca-1.0.3.dev1.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
103
+ cuenca-1.0.3.dev1.dist-info/top_level.txt,sha256=5h3K7XJTmJniDloPq4sIJHni_xLw-Uoc6ZJ5mcw_lZY,13
104
+ cuenca-1.0.3.dev1.dist-info/RECORD,,
@@ -0,0 +1,28 @@
1
+ import pytest
2
+
3
+ from cuenca import LoginToken, Otp, UserLogin
4
+ from cuenca.http.client import Session
5
+
6
+
7
+ @pytest.fixture(scope='function')
8
+ def session():
9
+ session = Session()
10
+ session.configure(
11
+ 'api_key',
12
+ 'api_secret',
13
+ sandbox=True,
14
+ )
15
+ return session
16
+
17
+
18
+ @pytest.mark.vcr
19
+ def test_otps(session):
20
+ UserLogin.create('111111', session=session)
21
+ login_token = LoginToken.create(session=session)
22
+ session.headers.pop(
23
+ 'X-Cuenca-LoginId',
24
+ )
25
+ session.configure(login_token=login_token.id)
26
+ otp = Otp.create()
27
+ assert otp
28
+ assert type(otp.secret) == str