Skip to content

Commit

Permalink
Merge e758b3a into 285d694
Browse files Browse the repository at this point in the history
  • Loading branch information
liampauling committed Jul 6, 2019
2 parents 285d694 + e758b3a commit 32cf0be
Show file tree
Hide file tree
Showing 22 changed files with 86 additions and 43 deletions.
7 changes: 6 additions & 1 deletion betfairlightweight/compat.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import sys
import datetime


_ver = sys.version_info

#: Python 2.x?
Expand Down Expand Up @@ -31,9 +30,15 @@ class FileNotFoundError(OSError):

try:
import ujson as json

def json_loads(s, **kwargs):
return json.loads(s, precise_float=True, **kwargs)
except ImportError:
import json

def json_loads(s, **kwargs):
return json.loads(s, **kwargs)

try:
import ciso8601

Expand Down
9 changes: 2 additions & 7 deletions betfairlightweight/endpoints/baseendpoint.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import requests
import datetime
from requests import ConnectionError

Expand All @@ -7,11 +6,7 @@
InvalidResponse,
)
from ..utils import check_status_code
from ..compat import json

# monkeypatching requests
# https://github.com/kennethreitz/requests/issues/1595
requests.models.json = json
from ..compat import json, json_loads


class BaseEndpoint(object):
Expand Down Expand Up @@ -50,7 +45,7 @@ def request(self, method, params, session):

check_status_code(response)
try:
response_data = response.json()
response_data = json_loads(response.text)
except ValueError:
raise InvalidResponse(response.text)

Expand Down
9 changes: 2 additions & 7 deletions betfairlightweight/endpoints/historic.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,10 @@
APIError,
InvalidResponse,
)
from ..compat import json
# from .. import resources
from ..compat import json, json_loads
from .baseendpoint import BaseEndpoint
from ..utils import clean_locals, check_status_code

# monkeypatching requests
# https://github.com/kennethreitz/requests/issues/1595
requests.models.json = json


class Historic(BaseEndpoint):

Expand Down Expand Up @@ -162,7 +157,7 @@ def request(self, method, params, session):

check_status_code(response)
try:
response_data = response.json()
response_data = json_loads(response.text)
except ValueError:
raise InvalidResponse(response.text)

Expand Down
3 changes: 2 additions & 1 deletion betfairlightweight/endpoints/inplayservice.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from ..utils import check_status_code
from .baseendpoint import BaseEndpoint
from .. import resources
from ..compat import json_loads


class InPlayService(BaseEndpoint):
Expand Down Expand Up @@ -90,7 +91,7 @@ def request(self, method=None, params=None, session=None, url=None):

check_status_code(response)
try:
response_data = response.json()
response_data = json_loads(response.text)
except ValueError:
raise InvalidResponse(response.text)

Expand Down
3 changes: 2 additions & 1 deletion betfairlightweight/endpoints/keepalive.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
InvalidResponse,
)
from ..utils import check_status_code
from ..compat import json_loads


class KeepAlive(BaseEndpoint):
Expand Down Expand Up @@ -44,7 +45,7 @@ def request(self, payload=None, params=None, session=None):

check_status_code(response)
try:
response_data = response.json()
response_data = json_loads(response.text)
except ValueError:
raise InvalidResponse(response.text)

Expand Down
3 changes: 2 additions & 1 deletion betfairlightweight/endpoints/login.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
InvalidResponse
)
from ..utils import check_status_code
from ..compat import json_loads


class Login(BaseEndpoint):
Expand Down Expand Up @@ -44,7 +45,7 @@ def request(self, method=None, params=None, session=None):

check_status_code(response)
try:
response_data = response.json()
response_data = json_loads(response.text)
except ValueError:
raise InvalidResponse(response.text)

Expand Down
3 changes: 2 additions & 1 deletion betfairlightweight/endpoints/logininteractive.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
InvalidResponse
)
from ..utils import check_status_code
from ..compat import json_loads


class LoginInteractive(BaseEndpoint):
Expand Down Expand Up @@ -44,7 +45,7 @@ def request(self, method=None, params=None, session=None):

check_status_code(response)
try:
response_data = response.json()
response_data = json_loads(response.text)
except ValueError:
raise InvalidResponse(response.text)

Expand Down
3 changes: 2 additions & 1 deletion betfairlightweight/endpoints/logout.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
InvalidResponse,
)
from ..utils import check_status_code
from ..compat import json_loads


class Logout(BaseEndpoint):
Expand Down Expand Up @@ -44,7 +45,7 @@ def request(self, payload=None, params=None, session=None):

check_status_code(response)
try:
response_data = response.json()
response_data = json_loads(response.text)
except ValueError:
raise InvalidResponse(response.text)

Expand Down
3 changes: 2 additions & 1 deletion betfairlightweight/endpoints/navigation.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
)
from ..utils import check_status_code
from .baseendpoint import BaseEndpoint
from ..compat import json_loads


class Navigation(BaseEndpoint):
Expand Down Expand Up @@ -36,7 +37,7 @@ def request(self, method=None, params=None, session=None):

check_status_code(response)
try:
response_data = response.json()
response_data = json_loads(response.text)
except ValueError:
raise InvalidResponse(response.text)

Expand Down
3 changes: 2 additions & 1 deletion betfairlightweight/endpoints/racecard.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from ..utils import check_status_code
from .baseendpoint import BaseEndpoint
from .. import resources
from ..compat import json_loads


class RaceCard(BaseEndpoint):
Expand Down Expand Up @@ -69,7 +70,7 @@ def request(self, method=None, params=None, session=None):

check_status_code(response)
try:
response_data = response.json()
response_data = json_loads(response.text)
except ValueError:
raise InvalidResponse(response.text)

Expand Down
4 changes: 2 additions & 2 deletions betfairlightweight/streaming/listener.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import json # ujson causes issues
import logging

from .stream import (
MarketStream,
OrderStream,
)
from ..compat import json_loads

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -91,7 +91,7 @@ def on_data(self, raw_data):
:return: Return False to stop stream and close connection
"""
try:
data = json.loads(raw_data)
data = json_loads(raw_data)
except ValueError:
logger.error('value error: %s' % raw_data)
return
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/test_baseendpoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,14 @@ def test_request_error(self, mock_post, mock_request_headers, mock_cert, mock_cr
with self.assertRaises(APIError):
self.base_endpoint.request(None, None, None)

@mock.patch('betfairlightweight.endpoints.baseendpoint.json_loads', side_effect=ValueError)
@mock.patch('betfairlightweight.endpoints.baseendpoint.BaseEndpoint.create_req')
@mock.patch('betfairlightweight.baseclient.BaseClient.cert')
@mock.patch('betfairlightweight.baseclient.BaseClient.request_headers')
@mock.patch('betfairlightweight.baseclient.requests.post')
def test_request_json_error(self, mock_post, mock_request_headers, mock_cert, mock_create_req):
def test_request_json_error(self, mock_post, mock_request_headers, mock_cert, mock_create_req, mock_json_loads):
mock_response = mock.Mock()
mock_response.status_code = 200
mock_response.json.side_effect = ValueError()
mock_post.return_value = mock_response

with self.assertRaises(InvalidResponse):
Expand Down
28 changes: 28 additions & 0 deletions tests/unit/test_compat.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import unittest
import datetime

from betfairlightweight import compat


class CompatTest(unittest.TestCase):

def test_json_loads(self):
self.assertEqual(
compat.json_loads('{"lastTradedPrice": 1000}'),
{'lastTradedPrice': 1000}
)

def test_parse_datetime(self):
self.assertIsNone(compat.parse_datetime(""))
self.assertEqual(
compat.parse_datetime("2016-08-17T18:10:00.000Z"),
datetime.datetime(2016, 8, 17, 18, 10)
)
self.assertEqual(
compat.parse_datetime("2016-08-17T18:10:01.000Z"),
datetime.datetime(2016, 8, 17, 18, 10, 1)
)
self.assertEqual(
compat.parse_datetime("2016-08-17T18:10:01.321Z"),
datetime.datetime(2016, 8, 17, 18, 10, 1, 321000)
)
4 changes: 4 additions & 0 deletions tests/unit/test_historical.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,10 @@ def test_request(self, mock_post, mock_headers, mock_check_status_code):
method = 'test'
url = 'https://historicdata.betfair.com/api/test'

mock_response = mock.Mock()
mock_response.text = '{}'
mock_post.return_value = mock_response

self.historic.request(method=method, params=params, session=None)

mock_post.assert_called_with(
Expand Down
12 changes: 8 additions & 4 deletions tests/unit/test_inplayservice.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ def test_get_scores(self, mock_request, mock_process_response):
def test_request(self, mock_get, mock_headers, mock_check_status_code):
params = [1, 2, 3]
url = '123'
mock_response = mock.Mock()
mock_response.text = '{}'
mock_get.return_value = mock_response

self.in_play_service.request(params=params, url=url)

Expand All @@ -97,16 +100,17 @@ def test_request_error(self, mock_get, mock_headers):
with self.assertRaises(APIError):
self.in_play_service.request(params=params, url=url)

@mock.patch('betfairlightweight.endpoints.inplayservice.json_loads', side_effect=ValueError)
@mock.patch('betfairlightweight.endpoints.inplayservice.check_status_code')
@mock.patch('betfairlightweight.endpoints.inplayservice.InPlayService.headers')
@mock.patch('betfairlightweight.baseclient.requests.get')
def test_request_json_error(self, mock_get, mock_headers, mock_check_status_code):
def test_request_json_error(self, mock_get, mock_headers, mock_check_status_code, mock_json_loads):
params = [1, 2, 3]
url = '123'

response = mock.Mock()
mock_get.return_value = response
response.json.side_effect = ValueError()
mock_response = mock.Mock()
mock_response.text = '{}'
mock_get.return_value = mock_response

with self.assertRaises(InvalidResponse):
self.in_play_service.request(params=params, url=url)
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/test_keepalive.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,12 @@ def test_request_error(self, mock_post, mock_keep_alive_headers):
with self.assertRaises(APIError):
self.keep_alive.request()

@mock.patch('betfairlightweight.endpoints.keepalive.json_loads', side_effect=ValueError)
@mock.patch('betfairlightweight.baseclient.BaseClient.keep_alive_headers')
@mock.patch('betfairlightweight.baseclient.requests.post')
def test_request_json_error(self, mock_post, mock_keep_alive_headers):
def test_request_json_error(self, mock_post, mock_keep_alive_headers, mock_json_loads):
mock_response = mock.Mock()
mock_response.status_code = 200
mock_response.json.side_effect = ValueError()
mock_post.return_value = mock_response

with self.assertRaises(InvalidResponse):
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/test_login.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,13 @@ def test_request_error(self, mock_post, mock_login_headers, mock_cert):
with self.assertRaises(APIError):
self.login.request()

@mock.patch('betfairlightweight.endpoints.login.json_loads', side_effect=ValueError)
@mock.patch('betfairlightweight.baseclient.BaseClient.cert')
@mock.patch('betfairlightweight.baseclient.BaseClient.login_headers')
@mock.patch('betfairlightweight.baseclient.requests.post')
def test_request_json_error(self, mock_post, mock_login_headers, mock_cert):
def test_request_json_error(self, mock_post, mock_login_headers, mock_cert, mock_json_loads):
mock_response = mock.Mock()
mock_response.status_code = 200
mock_response.json.side_effect = ValueError()
mock_post.return_value = mock_response

with self.assertRaises(InvalidResponse):
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/test_logininteractive.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,12 @@ def test_request_error(self, mock_post, mock_login_headers):
with self.assertRaises(APIError):
self.login.request()

@mock.patch('betfairlightweight.endpoints.logininteractive.json_loads', side_effect=ValueError)
@mock.patch('betfairlightweight.baseclient.BaseClient.login_headers')
@mock.patch('betfairlightweight.baseclient.requests.post')
def test_request_json_error(self, mock_post, mock_login_headers):
def test_request_json_error(self, mock_post, mock_login_headers, mock_json_loads):
mock_response = mock.Mock()
mock_response.status_code = 200
mock_response.json.side_effect = ValueError()
mock_post.return_value = mock_response

with self.assertRaises(InvalidResponse):
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/test_logout.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,13 @@ def test_request_error(self, mock_post, mock_logout_headers, mock_cert):
with self.assertRaises(APIError):
self.logout.request()

@mock.patch('betfairlightweight.endpoints.logout.json_loads', side_effect=ValueError)
@mock.patch('betfairlightweight.baseclient.BaseClient.cert')
@mock.patch('betfairlightweight.baseclient.BaseClient.keep_alive_headers')
@mock.patch('betfairlightweight.baseclient.requests.post')
def test_request_json_error(self, mock_post, mock_logout_headers, mock_cert):
def test_request_json_error(self, mock_post, mock_logout_headers, mock_cert, mock_json_loads):
mock_response = mock.Mock()
mock_response.status_code = 200
mock_response.json.side_effect = ValueError()
mock_post.return_value = mock_response

with self.assertRaises(InvalidResponse):
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/test_navigation.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,13 @@ def test_request_error(self, mock_get, mock_request_headers, mock_cert):
with self.assertRaises(APIError):
self.navigation.request()

@mock.patch('betfairlightweight.endpoints.navigation.json_loads', side_effect=ValueError)
@mock.patch('betfairlightweight.baseclient.BaseClient.cert')
@mock.patch('betfairlightweight.baseclient.BaseClient.request_headers')
@mock.patch('betfairlightweight.baseclient.requests.get')
def test_request_json_error(self, mock_get, mock_request_headers, mock_cert):
def test_request_json_error(self, mock_get, mock_request_headers, mock_cert, mock_json_loads):
mock_response = mock.Mock()
mock_response.status_code = 200
mock_response.json.side_effect = ValueError()
mock_get.return_value = mock_response

with self.assertRaises(InvalidResponse):
Expand Down

0 comments on commit 32cf0be

Please sign in to comment.