diff --git a/CHANGELOG.md b/CHANGELOG.md index ec583f9..f94a81d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +### 3.0.1 - 2016-05-25 + +* Handle unexpected errors + ### 3.0.0 - 2016-04-22 * Datatables for developers diff --git a/quandl/connection.py b/quandl/connection.py index 27c78bc..8796722 100644 --- a/quandl/connection.py +++ b/quandl/connection.py @@ -53,12 +53,18 @@ def execute_request(cls, http_verb, url, **options): def parse(cls, response): try: return response.json() - except ValueError as e: - raise QuandlError(str(e), response.status_code, response.text) + except ValueError: + raise QuandlError(http_status=response.status_code, http_body=response.text) @classmethod def handle_api_error(cls, resp): error_body = cls.parse(resp) + + # if our app does not form a proper quandl_error response + # throw generic error + if 'quandl_error' not in error_body: + raise QuandlError(http_status=resp.status_code, http_body=resp.text) + code = error_body['quandl_error']['code'] message = error_body['quandl_error']['message'] prog = re.compile('^QE([a-zA-Z])x') diff --git a/quandl/errors/quandl_error.py b/quandl/errors/quandl_error.py index f0682bb..f8f6b8a 100644 --- a/quandl/errors/quandl_error.py +++ b/quandl/errors/quandl_error.py @@ -1,12 +1,16 @@ class QuandlError(RuntimeError): - def __init__(self, quandl_message, http_status=None, http_body=None, http_headers=None, + GENERIC_ERROR_MESSAGE = 'Something went wrong. Please try again. \ +If you continue to have problems, please contact us at connect@quandl.com.' + + def __init__(self, quandl_message=None, http_status=None, http_body=None, http_headers=None, quandl_error_code=None, response_data=None): self.http_status = http_status self.http_body = http_body self.http_headers = http_headers if http_headers is not None else {} self.quandl_error_code = quandl_error_code - self.quandl_message = quandl_message + self.quandl_message = quandl_message if quandl_message is not None \ + else self.GENERIC_ERROR_MESSAGE self.response_data = response_data def __str__(self): diff --git a/quandl/version.py b/quandl/version.py index aaa4264..a29b27e 100644 --- a/quandl/version.py +++ b/quandl/version.py @@ -1 +1 @@ -VERSION = '3.0.0' +VERSION = '3.0.1' diff --git a/test/test_connection.py b/test/test_connection.py index 7f18fda..1977f5b 100644 --- a/test/test_connection.py +++ b/test/test_connection.py @@ -43,6 +43,16 @@ def test_parse_error(self): self.assertRaises( QuandlError, lambda: Connection.request('get', 'databases')) + @httpretty.activate + def test_non_quandl_error(self): + httpretty.register_uri(httpretty.GET, + "https://www.quandl.com/api/v3/databases", + body=json.dumps( + {'foobar': + {'code': 'blah', 'message': 'something went wrong'}}), status=500) + self.assertRaises( + QuandlError, lambda: Connection.request('get', 'databases')) + @httpretty.activate @patch('quandl.connection.Connection.execute_request') def test_build_request(self, mock): @@ -57,6 +67,6 @@ def test_build_request(self, mock): 'accept': ('application/json, ' 'application/vnd.quandl+json;version=2015-04-09'), 'request-source': 'python', - 'request-source-version': '3.0.0'}, + 'request-source-version': '3.0.1'}, params={'per_page': 10, 'page': 2}) self.assertEqual(mock.call_args, expected)