Skip to content
This repository was archived by the owner on Dec 11, 2023. It is now read-only.

Commit 133d5b8

Browse files
authored
Merge pull request #122 from librato/bugfix/rate_limit_error_parsing
Fix issue with parsing 'error' key vs 'errors' key from API
2 parents b8e241e + ef625ff commit 133d5b8

2 files changed

Lines changed: 38 additions & 18 deletions

File tree

librato/exceptions.py

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -63,30 +63,41 @@ def error_message(self):
6363
# }
6464
# }
6565
#
66+
#
67+
# Rate limiting example:
68+
# {
69+
# u'request_time': 1467306906,
70+
# u'error': u'You have hit the API limit for measurements
71+
# [measure:raw_rate]. Contact: support@librato.com to adjust this limit.'
72+
# }
6673
def _parse_error_message(self):
6774
if isinstance(self.error_payload, str):
6875
# Payload is just a string
6976
return self.error_payload
7077
elif isinstance(self.error_payload, dict):
71-
payload = self.error_payload['errors']
72-
messages = []
73-
for key in payload:
74-
error_list = payload[key]
75-
if isinstance(error_list, str):
76-
# The error message is a scalar string, just tack it on
77-
msg = "%s: %s" % (key, error_list)
78-
messages.append(msg)
79-
elif isinstance(error_list, list):
80-
for error_message in error_list:
81-
msg = "%s: %s" % (key, error_message)
82-
messages.append(msg)
83-
elif isinstance(error_list, dict):
84-
for k in error_list:
85-
# e.g. "params: measure_time: "
86-
msg = "%s: %s: " % (key, k)
87-
msg += self._flatten_error_message(error_list[k])
78+
# The API could return 'errors' or just 'error' with a flat message
79+
if 'error' in self.error_payload:
80+
return self.error_payload['error']
81+
else:
82+
payload = self.error_payload['errors']
83+
messages = []
84+
for key in payload:
85+
error_list = payload[key]
86+
if isinstance(error_list, str):
87+
# The error message is a scalar string, just tack it on
88+
msg = "%s: %s" % (key, error_list)
8889
messages.append(msg)
89-
return ", ".join(messages)
90+
elif isinstance(error_list, list):
91+
for error_message in error_list:
92+
msg = "%s: %s" % (key, error_message)
93+
messages.append(msg)
94+
elif isinstance(error_list, dict):
95+
for k in error_list:
96+
# e.g. "params: measure_time: "
97+
msg = "%s: %s: " % (key, k)
98+
msg += self._flatten_error_message(error_list[k])
99+
messages.append(msg)
100+
return ", ".join(messages)
90101

91102
def _flatten_error_message(self, error_msg):
92103
if isinstance(error_msg, str):

tests/test_exceptions.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,15 @@ def test_error_message(self):
9696
ex = exceptions.ClientError(400, {"errors": {"request": ["Not found"]}})
9797
self.assertEqual("[400] request: Not found", ex.error_message())
9898

99+
def test_error_vs_errors(self):
100+
msg = "You have hit the rate limit, etc"
101+
# The API actually returns 'errors' in most cases, but for rate
102+
# limiting we get 'error' (singular)
103+
error_resp = {'request_time': 1467306906, 'error': msg}
104+
ex = exceptions.ClientError(403, error_resp)
105+
parsed_msg = ex._parse_error_message()
106+
self.assertEqual(msg, parsed_msg)
107+
99108

100109
if __name__ == '__main__':
101110
unittest.main()

0 commit comments

Comments
 (0)