Skip to content

Commit 15bcf65

Browse files
author
Josh Mervine
committed
Merge branch 'master' of github.com:MaxCDN/python-maxcdn
2 parents e7507d3 + 171765e commit 15bcf65

File tree

4 files changed

+72
-9
lines changed

4 files changed

+72
-9
lines changed

.travis.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
language: python
22
python:
3-
- "2.6"
43
- "2.7"
54
- "3.2"
65
- "3.3"

Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ init: clean setup test
2020
setup: distribute
2121
pip install -r requirements.txt -t $(target) -b $(source)
2222

23+
console:
24+
$(pypath) python
25+
2326
clean:
2427
rm -rf $(source) $(target) .ropeproject .coverage junit-report.xml
2528
find . -type f -name "*.pyc" -exec rm -v {} \;

maxcdn/maxcdn.py

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from requests_oauthlib import OAuth1Session as OAuth1
22

3+
# handle python 3.x
34
try:
45
import urlparse
5-
except ImportError: # handly python 3.x
6+
except ImportError:
67
from urllib import parse as urlparse
78

89

@@ -19,26 +20,33 @@ def _get_headers(self, json=True):
1920

2021
def _get_url(self, end_point):
2122
if not end_point.startswith("/"):
22-
return "%s/%s" % (self.url, end_point)
23+
return "{0}/{1}".format(self.url, end_point)
2324
else:
2425
return self.url + end_point
2526

27+
def _parse_json(self, response):
28+
try:
29+
return response.json()
30+
except ValueError as e:
31+
raise self.ServerError(response, str(e))
32+
2633
def _data_request(self, method, end_point, data, **kwargs):
2734
if data is None and "params" in kwargs:
2835
params = kwargs.pop("params")
2936
if type(params) is str:
3037
params = urlparse.parse_qs(params)
3138
data = params
32-
3339
action = getattr(self.client, method)
34-
return action(self._get_url(end_point), data=data,
35-
headers=self._get_headers(json=True), **kwargs).json()
40+
response = action(self._get_url(end_point), data=data,
41+
headers=self._get_headers(json=True), **kwargs)
42+
43+
if (response.status_code > 299):
44+
raise self.ServerError(response)
45+
46+
return self._parse_json(response)
3647

3748
def get(self, end_point, data=None, **kwargs):
3849
return self._data_request("post", end_point, data=data, **kwargs)
39-
#return self.client.get(self._get_url(end_point), data,
40-
#headers=self._get_headers(json=False),
41-
#**kwargs).json()
4250

4351
def patch(self, end_point, data=None, **kwargs):
4452
return self._data_request("post", end_point, data=data, **kwargs)
@@ -57,3 +65,26 @@ def purge(self, zoneid, file_or_files=None, **kwargs):
5765
if file_or_files is not None:
5866
return self.delete(path, data={"files": file_or_files}, **kwargs)
5967
return self.delete(path, **kwargs)
68+
69+
class ServerError(Exception):
70+
def __init__(self, response, message=None):
71+
try:
72+
resp = response.json()
73+
if message is None:
74+
message = "{0}:: {1}".format(resp['error']['type'],
75+
resp['error']['message'])
76+
self.reason = resp['error']['type']
77+
except ValueError:
78+
if message is None:
79+
message = "{0} {1} from {2}".format(response.status_code,
80+
response.reason,
81+
response.url)
82+
83+
self.reason = response.reason
84+
85+
self.headers = response.headers
86+
self.code = response.status_code
87+
self.body = response._content
88+
self.url = response.url
89+
90+
super(Exception, self).__init__(message)

test/test.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,38 @@ def mock_request(method, url, *args, **kwargs):
1212
class Response(object):
1313
def __init__(self, method, code=200, data={"foo": "bar"}):
1414
self._json = {"code": code, "method": method, "data": data}
15+
self.status_code = code
16+
self.reason = "Success"
17+
self.headers = ""
18+
self.url = "http://www.example.com/foo/bar"
1519

1620
def json(self):
1721
return self._json
1822

1923

24+
class ErrorResponse(object):
25+
def __init__(self, code=200, badcontent="Some bad content."):
26+
self._content = badcontent
27+
self.status_code = code
28+
self.reason = "Error Response"
29+
self.headers = ""
30+
self.url = "http://www.example.com/foo/bar"
31+
32+
def json(self):
33+
raise ValueError("No JSON object could be decoded")
34+
35+
2036
def response(method, **kwargs):
2137
return Response(method, **kwargs)
2238

2339

40+
def error_response(**kwargs):
41+
return ErrorResponse(**kwargs)
42+
2443
#
2544
###############################################################################
2645

46+
2747
class MaxCDNTests(unittest.TestCase):
2848

2949
def setUp(self):
@@ -56,13 +76,23 @@ def test_data_request(self):
5676
expected = {"code": 200, "method": meth, "data": {"foo": "bar"}}
5777
self.assertEqual(rsp, expected)
5878

79+
requests.Session.request = mock.create_autospec(mock_request,
80+
return_value=error_response())
81+
with self.assertRaises(MaxCDN.ServerError, None):
82+
self.maxcdn._data_request(meth, meth+".json", data={"foo":"bar"})
83+
5984
def test_get(self):
6085
requests.Session.request = mock.create_autospec(mock_request,
6186
return_value=response("get"))
6287

6388
expected = {"code": 200, "method": "get", "data": {"foo": "bar"}}
6489
self.assertEqual(self.maxcdn.get("/get.json"), expected)
6590

91+
requests.Session.request = mock.create_autospec(mock_request,
92+
return_value=error_response())
93+
with self.assertRaises(MaxCDN.ServerError, None):
94+
self.maxcdn.get("/get.json")
95+
6696
def test_post(self):
6797
requests.Session.request = mock.create_autospec(mock_request,
6898
return_value=response("post"))

0 commit comments

Comments
 (0)