Skip to content
This repository was archived by the owner on Apr 30, 2022. It is now read-only.

Commit e2540dc

Browse files
committed
Merge pull request #70 from quandl/AP-1808/handle-bad-error-response
handle non-json non quandl error responses
2 parents 4681d4e + 41c2273 commit e2540dc

File tree

5 files changed

+30
-6
lines changed

5 files changed

+30
-6
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
### 3.0.1 - 2016-05-25
2+
3+
* Handle unexpected errors
4+
15
### 3.0.0 - 2016-04-22
26

37
* Datatables for developers

quandl/connection.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,18 @@ def execute_request(cls, http_verb, url, **options):
5353
def parse(cls, response):
5454
try:
5555
return response.json()
56-
except ValueError as e:
57-
raise QuandlError(str(e), response.status_code, response.text)
56+
except ValueError:
57+
raise QuandlError(http_status=response.status_code, http_body=response.text)
5858

5959
@classmethod
6060
def handle_api_error(cls, resp):
6161
error_body = cls.parse(resp)
62+
63+
# if our app does not form a proper quandl_error response
64+
# throw generic error
65+
if 'quandl_error' not in error_body:
66+
raise QuandlError(http_status=resp.status_code, http_body=resp.text)
67+
6268
code = error_body['quandl_error']['code']
6369
message = error_body['quandl_error']['message']
6470
prog = re.compile('^QE([a-zA-Z])x')

quandl/errors/quandl_error.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
class QuandlError(RuntimeError):
2-
def __init__(self, quandl_message, http_status=None, http_body=None, http_headers=None,
2+
GENERIC_ERROR_MESSAGE = 'Something went wrong. Please try again. \
3+
If you continue to have problems, please contact us at connect@quandl.com.'
4+
5+
def __init__(self, quandl_message=None, http_status=None, http_body=None, http_headers=None,
36
quandl_error_code=None, response_data=None):
47
self.http_status = http_status
58
self.http_body = http_body
69
self.http_headers = http_headers if http_headers is not None else {}
710

811
self.quandl_error_code = quandl_error_code
9-
self.quandl_message = quandl_message
12+
self.quandl_message = quandl_message if quandl_message is not None \
13+
else self.GENERIC_ERROR_MESSAGE
1014
self.response_data = response_data
1115

1216
def __str__(self):

quandl/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
VERSION = '3.0.0'
1+
VERSION = '3.0.1'

test/test_connection.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,16 @@ def test_parse_error(self):
4343
self.assertRaises(
4444
QuandlError, lambda: Connection.request('get', 'databases'))
4545

46+
@httpretty.activate
47+
def test_non_quandl_error(self):
48+
httpretty.register_uri(httpretty.GET,
49+
"https://www.quandl.com/api/v3/databases",
50+
body=json.dumps(
51+
{'foobar':
52+
{'code': 'blah', 'message': 'something went wrong'}}), status=500)
53+
self.assertRaises(
54+
QuandlError, lambda: Connection.request('get', 'databases'))
55+
4656
@httpretty.activate
4757
@patch('quandl.connection.Connection.execute_request')
4858
def test_build_request(self, mock):
@@ -57,6 +67,6 @@ def test_build_request(self, mock):
5767
'accept': ('application/json, '
5868
'application/vnd.quandl+json;version=2015-04-09'),
5969
'request-source': 'python',
60-
'request-source-version': '3.0.0'},
70+
'request-source-version': '3.0.1'},
6171
params={'per_page': 10, 'page': 2})
6272
self.assertEqual(mock.call_args, expected)

0 commit comments

Comments
 (0)