Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
added backoff to requests
  • Loading branch information
axshani committed Jul 25, 2022
commit f5926ca4c051c514ebf529818f08972ebd606405
5 changes: 4 additions & 1 deletion e2e_tests/event_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
from unit import Unit

token = os.environ.get("TOKEN")
client = Unit("https://api.s.unit.sh", token)
# client = Unit("https://api.s.unit.sh", token)
client = Unit("http://localhost:3000", token)

def test_list_and_get_events():
event_ids = []
Expand All @@ -23,3 +24,5 @@ def test_fire_event():
assert response.data == []


test_list_and_get_events()

1 change: 1 addition & 0 deletions requirements-dev.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
requests==2.26.0
pytest
backoff
3 changes: 3 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
requests~=2.28.0
backoff~=2.1.2c
pytest
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
keywords=['unit', 'finance', 'banking',
'banking-as-a-service', 'API', 'SDK'],
install_requires=[
'requests'
'requests', 'backoff'
],
classifiers=[
'Development Status :: 4 - Beta',
Expand Down
60 changes: 57 additions & 3 deletions unit/api/base_resource.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,86 @@
import json
from typing import Optional, Dict
import requests
import backoff

from typing import Optional, Dict
from unit.models.codecs import UnitEncoder

retries = 3
max_time = 300


def fatal_code(e):
code = e.response.status_code
print(code)
return not 500 <= code < 600 or code == 408 or code == 429


class BaseResource(object):
def __init__(self, api_url, token):
def __init__(self, api_url, token, retries_amount=3):
global retries

self.api_url = api_url.rstrip("/")
self.token = token
self.headers = {
"content-type": "application/vnd.api+json",
"authorization": f"Bearer {self.token}",
"user-agent": "unit-python-sdk"
}
retries = retries_amount

@backoff.on_exception(backoff.expo,
requests.exceptions.RequestException)
# max_tries=retries)
# max_time=300,
# giveup=fatal_code,
# jitter=backoff.random_jitter)
def get(self, resource: str, params: Dict = None, headers: Optional[Dict[str, str]] = None):
return requests.get(f"{self.api_url}/{resource}", params=params, headers=self.__merge_headers(headers))
print("try")
# try:
ans = requests.get(f"{self.api_url}/{resource}", params=params, headers=self.__merge_headers(headers))
# ans.raise_for_status()
# except requests.exceptions.RequestException as e:
# print("except")
# print(e)
#
# print('good to go')
return ans

@backoff.on_exception(backoff.expo,
requests.exceptions.RequestException,
max_tries=retries,
max_time=300,
giveup=fatal_code,
jitter=backoff.random_jitter)
def post(self, resource: str, data: Optional[Dict] = None, headers: Optional[Dict[str, str]] = None):
data = json.dumps(data, cls=UnitEncoder) if data is not None else None
return requests.post(f"{self.api_url}/{resource}", data=data, headers=self.__merge_headers(headers))

@backoff.on_exception(backoff.expo,
requests.exceptions.RequestException,
max_tries=retries,
max_time=300,
giveup=fatal_code,
jitter=backoff.random_jitter)
def patch(self, resource: str, data: Optional[Dict] = None, headers: Optional[Dict[str, str]] = None):
data = json.dumps(data, cls=UnitEncoder) if data is not None else None
return requests.patch(f"{self.api_url}/{resource}", data=data, headers=self.__merge_headers(headers))

@backoff.on_exception(backoff.expo,
requests.exceptions.RequestException,
max_tries=retries,
max_time=300,
giveup=fatal_code,
jitter=backoff.random_jitter)
def delete(self, resource: str, params: Dict = None, headers: Optional[Dict[str, str]] = None):
return requests.delete(f"{self.api_url}/{resource}", params=params, headers=self.__merge_headers(headers))

@backoff.on_exception(backoff.expo,
requests.exceptions.RequestException,
max_tries=retries,
max_time=300,
giveup=fatal_code,
jitter=backoff.random_jitter)
def put(self, resource: str, data: Optional[Dict] = None, headers: Optional[Dict[str, str]] = None):
return requests.put(f"{self.api_url}/{resource}", data=data, headers=self.__merge_headers(headers))

Expand All @@ -42,3 +95,4 @@ def __merge_headers(self, headers: Optional[Dict[str, str]] = None):
def is_20x(self, status: int):
return status == 200 or status == 201 or status == 204


3 changes: 2 additions & 1 deletion unit/api/event_resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ def get(self, event_id: str) -> Union[UnitResponse[EventDTO], UnitError]:

def list(self, params: ListEventParams = None) -> Union[UnitResponse[List[EventDTO]], UnitError]:
params = params or ListEventParams()
response = super().get(self.resource, params.to_dict())
response = super().get(self.resource)
# response = super().get(self.resource, params.to_dict())
if super().is_20x(response.status_code):
data = response.json().get("data")
return UnitResponse[EventDTO](DtoDecoder.decode(data), None)
Expand Down