Skip to content

Commit d71fc2d

Browse files
author
Keryc Diaz
authored
Statement and downlooad with BytesIO (#97)
* Statement and downlooad with BytesIO * link and structure resp * fix revert * rebase and fix * fix endd * tests xml * fix lint * fix typing * fix linter * change version cuenca-validations * fix of review, matin * file_format potitional * fix of review * new cassette statement xml
1 parent 9d8ced9 commit d71fc2d

File tree

12 files changed

+910
-18
lines changed

12 files changed

+910
-18
lines changed

cuenca/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
'Commission',
1010
'Deposit',
1111
'ServiceProvider',
12+
'Statement',
1213
'Transfer',
1314
'WhatsappTransfer',
1415
'configure',
@@ -26,6 +27,7 @@
2627
Commission,
2728
Deposit,
2829
ServiceProvider,
30+
Statement,
2931
Transfer,
3032
WhatsappTransfer,
3133
)

cuenca/http/client.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import json
12
import os
23
from typing import Optional, Tuple
34
from urllib.parse import urljoin
@@ -72,20 +73,21 @@ def configure(
7273
self.jwt_token = Jwt.create(self)
7374

7475
def get(
75-
self,
76-
endpoint: str,
77-
params: ClientRequestParams = None,
76+
self, endpoint: str, params: ClientRequestParams = None
7877
) -> DictStrAny:
79-
return self.request('get', endpoint, params=params)
78+
return self._request_json('get', endpoint, params=params)
8079

8180
def post(self, endpoint: str, data: DictStrAny) -> DictStrAny:
82-
return self.request('post', endpoint, data=data)
81+
return self._request_json('post', endpoint, data=data)
8382

84-
def patch(self, endpoint: str, data: DictStrAny) -> DictStrAny:
85-
return self.request('patch', endpoint, data=data)
83+
def patch(self, endpoint: str, data: DictStrAny, **kwargs) -> DictStrAny:
84+
return self._request_json('patch', endpoint, data=data)
8685

8786
def delete(self, endpoint: str, data: OptionalDict = None) -> DictStrAny:
88-
return self.request('delete', endpoint, data=data)
87+
return self._request_json('delete', endpoint, data=data)
88+
89+
def _request_json(self, *args, **kwargs) -> DictStrAny:
90+
return json.loads(self.request(*args, **kwargs))
8991

9092
def request(
9193
self,
@@ -94,12 +96,11 @@ def request(
9496
params: ClientRequestParams = None,
9597
data: OptionalDict = None,
9698
**kwargs,
97-
) -> DictStrAny:
99+
) -> bytes:
98100
if self.jwt_token:
99101
if self.jwt_token.is_expired:
100102
self.jwt_token = Jwt.create(self)
101103
self.session.headers['X-Cuenca-Token'] = self.jwt_token.token
102-
103104
resp = self.session.request(
104105
method=method,
105106
url='https://' + self.host + urljoin('/', endpoint),
@@ -109,7 +110,7 @@ def request(
109110
**kwargs,
110111
)
111112
self._check_response(resp)
112-
return resp.json()
113+
return resp.content
113114

114115
@staticmethod
115116
def _check_response(response: Response):

cuenca/resources/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
'Commission',
99
'Deposit',
1010
'ServiceProvider',
11+
'Statement',
1112
'Transfer',
1213
'WhatsappTransfer',
1314
]
@@ -22,6 +23,7 @@
2223
from .deposits import Deposit
2324
from .resources import RESOURCES
2425
from .service_providers import ServiceProvider
26+
from .statements import Statement
2527
from .transfers import Transfer
2628
from .whatsapp_transfers import WhatsappTransfer
2729

@@ -36,6 +38,7 @@
3638
Commission,
3739
Deposit,
3840
ServiceProvider,
41+
Statement,
3942
Transfer,
4043
WhatsappTransfer,
4144
]

cuenca/resources/base.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import datetime as dt
22
from dataclasses import asdict, dataclass, fields
3+
from io import BytesIO
34
from typing import ClassVar, Dict, Generator, Optional, Union
45
from urllib.parse import urlencode
56

67
from cuenca_validations.types import (
8+
FileFormat,
79
QueryParams,
810
SantizedDict,
911
TransactionQuery,
@@ -77,6 +79,32 @@ def _update(
7779
return cls._from_dict(resp)
7880

7981

82+
@dataclass
83+
class Downloadable(Resource):
84+
@classmethod
85+
def download(
86+
cls,
87+
instance,
88+
file_format: FileFormat,
89+
*,
90+
session: Session = global_session,
91+
) -> BytesIO:
92+
resp = session.request(
93+
'get',
94+
f'/{cls._resource}/{instance.id}',
95+
headers=dict(Accept=file_format.value),
96+
)
97+
return BytesIO(resp)
98+
99+
@property
100+
def pdf(self) -> bytes:
101+
return self.download(self, file_format=FileFormat.pdf).read()
102+
103+
@property
104+
def xml(self) -> bytes:
105+
return self.download(self, file_format=FileFormat.xml).read()
106+
107+
80108
@dataclass
81109
class Queryable(Resource):
82110
_query_params: ClassVar = QueryParams

cuenca/resources/statements.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from typing import ClassVar
2+
3+
from cuenca_validations.types import StatementQuery
4+
from pydantic.dataclasses import dataclass
5+
6+
from .base import Downloadable, Queryable
7+
8+
9+
@dataclass
10+
class Statement(Queryable, Downloadable):
11+
_resource: ClassVar = 'statements'
12+
_query_params: ClassVar = StatementQuery
13+
14+
month: int
15+
year: int

cuenca/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
__version__ = '0.5.0'
1+
__version__ = '0.6.0'
22
CLIENT_VERSION = __version__
33
API_VERSION = '2020-03-19'

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
requests==2.25.0
2-
cuenca-validations==0.6.9
2+
cuenca-validations==0.7.1
33
dataclasses>=0.7;python_version<"3.7"

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
install_requires=[
2626
'aws-requests-auth==0.4.3',
2727
'requests>=2.24,<2.26',
28-
'cuenca-validations>=0.6.0,<0.7.0',
28+
'cuenca-validations>=0.7.0,<0.8.0',
2929
'dataclasses>=0.7;python_version<"3.7"',
3030
],
3131
classifiers=[

tests/http/test_client.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import datetime as dt
2-
from unittest.mock import MagicMock, patch
2+
from unittest.mock import patch
33

44
import pytest
55
from freezegun import freeze_time
@@ -62,9 +62,8 @@ def test_request_expired_token():
6262

6363
@patch('cuenca.http.client.requests.Session.request')
6464
def test_overrides_session(mock_request):
65-
magic_mock = MagicMock()
66-
magic_mock.json.return_value = dict(items=[])
67-
mock_request.return_value = magic_mock
65+
mock_request.return_value.ok = True
66+
mock_request.return_value.content = '{"items": []}'
6867
session = Session()
6968
session.configure(
7069
api_key='USER_API_KEY', api_secret='USER_SECRET', sandbox=True

0 commit comments

Comments
 (0)