Skip to content

Commit f42829e

Browse files
committed
Merge pull request #9 from /issues/8
Fixing issue 8, adding tests for logs, fixing lint errors.
2 parents 324c8d4 + 4c7f2fb commit f42829e

File tree

6 files changed

+146
-83
lines changed

6 files changed

+146
-83
lines changed

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ nose_opts=-v
99
nose=python $(source)/nose/bin/nosetests
1010
cov_opts= --with-coverage --cover-package=maxcdn
1111

12+
benchmark=./test/benchmark.py
1213
tests=./test/test.py
1314
int=./test/int.py
1415

@@ -26,6 +27,9 @@ clean:
2627
coverage: build/coverage
2728
$(pypath) python $(nose) $(cov_opts) $(tests)
2829

30+
benchmark:
31+
$(pypath) python $(benchmark)
32+
2933
test:
3034
$(pypath) python $(tests)
3135

maxcdn/maxcdn.py

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
from requests_oauthlib import OAuth1Session as OAuth1
2-
from os import environ as env
32

43
try:
54
import urlparse
6-
except ImportError: # handly python 3.x
5+
except ImportError: # handly python 3.x
76
from urllib import parse as urlparse
87

8+
99
class MaxCDN(object):
1010
def __init__(self, alias, key, secret, server="rws.maxcdn.com", **kwargs):
11-
self.url = "https://%s/%s" % (server, alias)
11+
self.url = "https://%s/%s" % (server, alias)
1212
self.client = OAuth1(key, client_secret=secret, **kwargs)
1313

1414
def _get_headers(self, json=True):
15-
headers = { "User-Agent": "Python MaxCDN API Client" }
15+
headers = {"User-Agent": "Python MaxCDN API Client"}
1616
if json:
1717
headers["Content-Type"] = "application/json"
1818
return headers
@@ -30,14 +30,15 @@ def _data_request(self, method, end_point, data, **kwargs):
3030
params = urlparse.parse_qs(params)
3131
data = params
3232

33-
return getattr(self.client, method)(self._get_url(end_point),
34-
data=data, headers=self._get_headers(json=True),
35-
**kwargs).json()
33+
action = getattr(self.client, method)
34+
return action(self._get_url(end_point), data=data,
35+
headers=self._get_headers(json=True), **kwargs).json()
3636

37-
def get(self, end_point, **kwargs):
38-
return self.client.get(self._get_url(end_point),
39-
headers=self._get_headers(json=False),
40-
**kwargs).json()
37+
def get(self, end_point, data=None, **kwargs):
38+
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()
4142

4243
def patch(self, end_point, data=None, **kwargs):
4344
return self._data_request("post", end_point, data=data, **kwargs)
@@ -54,7 +55,5 @@ def delete(self, end_point, data=None, **kwargs):
5455
def purge(self, zoneid, file_or_files=None, **kwargs):
5556
path = "/zones/pull.json/%s/cache" % (zoneid)
5657
if file_or_files is not None:
57-
return self.delete(path, data = { "files": file_or_files },
58-
**kwargs)
58+
return self.delete(path, data={"files": file_or_files}, **kwargs)
5959
return self.delete(path, **kwargs)
60-

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
options = {
55
"name" : "maxcdn",
6-
"version" : "0.0.3",
6+
"version" : "0.0.4",
77
"description" : "A Python REST Client for MaxCDN REST Web Services",
88
"author" : "Joshua P. Mervine",
99
"author_email" : "[email protected]",

test/benchmark.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import os
2+
from maxcdn import MaxCDN
3+
4+
alias = os.environ["ALIAS"]
5+
key = os.environ["KEY"]
6+
secret = os.environ["SECRET"]
7+
maxcdn = MaxCDN(alias, key, secret)
8+
9+
def get_logs():
10+
maxcdn.get("v3/reporing/logs.json")
11+
12+
def get_users():
13+
maxcdn.get("users.json")
14+
15+
def get_account():
16+
maxcdn.get("account.json")
17+
18+
def get_pullzones():
19+
maxcdn.get("zones/pull.json")
20+
21+
22+
if __name__ == '__main__':
23+
import timeit
24+
25+
for f in [ 'get_logs',
26+
'get_users',
27+
'get_account',
28+
'get_pullzones' ]:
29+
t = timeit.Timer(f + "()", setup = "from __main__ import " + f)
30+
print("%-20s %5.0fms" % (f + ":", (t.timeit(number=1) * 1000)))
31+

test/int.py

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,69 @@
11
#!/usr/bin/env python
22
import unittest
3-
import re
43
import time
54
import os
65

76
from maxcdn import MaxCDN
87

9-
class MaxCDNIntegration(unittest.TestCase):
108

9+
class MaxCDNIntegration(unittest.TestCase):
1110
def setUp(self):
12-
self.alias = os.environ["ALIAS"]
13-
self.key = os.environ["KEY"]
14-
self.secret = os.environ["SECRET"]
15-
self.time = str(int(time.mktime(time.gmtime())))
11+
self.alias = os.environ["ALIAS"]
12+
self.key = os.environ["KEY"]
13+
self.secret = os.environ["SECRET"]
14+
self.time = str(int(time.mktime(time.gmtime())))
1615

17-
self.max = MaxCDN(self.alias, self.key, self.secret)
16+
self.max = MaxCDN(self.alias, self.key, self.secret)
1817

1918
def test_get(self):
20-
for end_point in [ "account.json", "account.json/address", "users.json", "zones.json" ]:
19+
for end_point in ["account.json",
20+
"account.json/address",
21+
"users.json",
22+
"zones.json"]:
2123
if "/" in end_point:
2224
key = end_point.split("/")[1]
2325
else:
2426
key = end_point.replace(".json", "")
2527

26-
res = self.max.get(end_point)
27-
self.assertTrue(res["data"][key], "get "+key+" with data")
28+
rsp = self.max.get(end_point)
29+
self.assertTrue(rsp["data"][key], "get " + key + " with data")
30+
31+
def test_get_logs(self):
32+
rsp = self.max.get("v3/reporting/logs.json")
33+
self.assertTrue(rsp["next_page_key"],
34+
"get v3/reporting/logs.json with data")
2835

2936
def test_post_and_delete(self):
30-
data = { "name": self.time, "url": "http://www.example.com/" }
31-
res = self.max.post("/zones/pull.json", data=data)
32-
zid = str(res["data"]["pullzone"]["id"])
37+
data = {"name": self.time, "url": "http://www.example.com/"}
38+
res = self.max.post("/zones/pull.json", data=data)
39+
zid = str(res["data"]["pullzone"]["id"])
3340

41+
rsp = self.max.delete("/zones/pull.json/" + zid)
3442
self.assertTrue(zid, "post")
35-
self.assertEqual(200, self.max.delete("/zones/pull.json/"+zid)["code"], "delete")
43+
self.assertEqual(200, rsp["code"], "delete")
3644

3745
def test_put(self):
3846
street = self.time + "_put"
39-
self.assertEqual(street, str(self.max.put("/account.json/address", { "street1": street })["data"]["address"]["street1"]))
47+
rsp = self.max.put("/account.json/address", {"street1": street})
48+
self.assertEqual(street, str(rsp["data"]["address"]["street1"]))
4049

4150
def test_purge(self):
42-
zone = self.max.get("zones/pull.json")["data"]["pullzones"][0]["id"]
43-
self.assertEqual(200, self.max.purge(zone)["code"])
51+
rsp = self.max.get("zones/pull.json")
52+
zones = rsp["data"]["pullzones"]
53+
zone = zones[len(zones) - 1]["id"]
54+
55+
rsp = self.max.purge(zone)
56+
self.assertEqual(200, rsp["code"])
57+
58+
rsp = self.max.get("reports/popularfiles.json")
59+
popularfiles = rsp["data"]["popularfiles"]
4460

45-
popularfiles = self.max.get("reports/popularfiles.json")["data"]["popularfiles"]
61+
rsp = self.max.purge(zone, popularfiles[0]["uri"])
62+
self.assertEqual(200, rsp["code"])
4663

47-
self.assertEqual(200, self.max.purge(zone, popularfiles[0]["uri"])["code"])
48-
self.assertEqual(200, self.max.purge(zone, [ popularfiles[0]["uri"], popularfiles[1]["uri"]])["code"])
64+
files = [popularfiles[0]["uri"], popularfiles[1]["uri"]]
65+
rsp = self.max.purge(zone, files)
66+
self.assertEqual(200, rsp["code"])
4967

5068
if __name__ == '__main__':
5169
unittest.main()

test/test.py

Lines changed: 59 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,102 +3,113 @@
33
import requests
44
from maxcdn import MaxCDN
55

6-
################################################################################
6+
###############################################################################
77
# Mock as needed.
88
def mock_request(method, url, *args, **kwargs):
99
pass
1010

11+
1112
class Response(object):
12-
def __init__(self, method, code=200, data={"foo":"bar"}):
13-
self._json = { "code": code, "method": method, "data": data }
13+
def __init__(self, method, code=200, data={"foo": "bar"}):
14+
self._json = {"code": code, "method": method, "data": data}
1415

1516
def json(self):
1617
return self._json
1718

19+
1820
def response(method, **kwargs):
1921
return Response(method, **kwargs)
2022

23+
2124
#
22-
################################################################################
25+
###############################################################################
2326

2427
class MaxCDNTests(unittest.TestCase):
2528

2629
def setUp(self):
27-
self.alias = "test_alias"
28-
self.key = "test_key"
30+
self.alias = "test_alias"
31+
self.key = "test_key"
2932
self.secret = "test_secret"
3033
self.server = "rws.example.com"
31-
self.maxcdn = MaxCDN(self.alias, self.key, self.secret, server=self.server)
34+
self.maxcdn = MaxCDN(self.alias, self.key,
35+
self.secret, server=self.server)
3236

3337
def test_init(self):
3438
self.assertTrue(self.maxcdn)
35-
self.assertEqual(self.maxcdn.url, "https://rws.example.com/test_alias")
39+
self.assertEqual(self.maxcdn.url,
40+
"https://rws.example.com/test_alias")
3641

3742
def test_get_url(self):
3843
self.assertEqual(self.maxcdn._get_url("/foo.json"),
39-
"https://rws.example.com/test_alias/foo.json")
44+
"https://rws.example.com/test_alias/foo.json")
4045

4146
self.assertEqual(self.maxcdn._get_url("foo.json"),
42-
"https://rws.example.com/test_alias/foo.json")
47+
"https://rws.example.com/test_alias/foo.json")
4348

4449
def test_data_request(self):
45-
for meth in [ "post", "put", "delete" ]:
50+
for meth in ["post", "put", "delete"]:
4651
requests.Session.request = mock.create_autospec(mock_request,
47-
return_value=response(meth))
48-
self.assertEqual(self.maxcdn._data_request(meth, meth+".json",
49-
data={"foo":"bar"}), { "code": 200, "method": meth, "data": { "foo":"bar" } })
52+
return_value=response(meth))
53+
54+
data = {"foo": "bar"}
55+
rsp = self.maxcdn._data_request(meth, meth + ".json", data=data)
56+
expected = {"code": 200, "method": meth, "data": {"foo": "bar"}}
57+
self.assertEqual(rsp, expected)
5058

5159
def test_get(self):
5260
requests.Session.request = mock.create_autospec(mock_request,
53-
return_value=response("get"))
54-
self.assertEqual(self.maxcdn.get("/get.json"),
55-
{ "code": 200, "method": "get", "data": { "foo":"bar" } })
61+
return_value=response("get"))
62+
63+
expected = {"code": 200, "method": "get", "data": {"foo": "bar"}}
64+
self.assertEqual(self.maxcdn.get("/get.json"), expected)
5665

5766
def test_post(self):
5867
requests.Session.request = mock.create_autospec(mock_request,
59-
return_value=response("post"))
60-
self.assertEqual(self.maxcdn.post("/post.json", data={ "foo": "bar" }),
61-
{ "code": 200, "method": "post", "data": { "foo":"bar" } })
62-
self.assertEqual(self.maxcdn.post("/post.json", params={ "foo": "bar" }),
63-
{ "code": 200, "method": "post", "data": { "foo":"bar" } })
64-
self.assertEqual(self.maxcdn.post("/post.json", params="foo=bar"),
65-
{ "code": 200, "method": "post", "data": { "foo":"bar" } })
68+
return_value=response("post"))
69+
70+
rsp = self.maxcdn.post("/post.json", data={"foo": "bar"})
71+
expected = {"code": 200, "method": "post", "data": {"foo": "bar"}}
72+
self.assertEqual(rsp, expected)
73+
74+
rsp = self.maxcdn.post("/post.json", params={"foo": "bar"})
75+
self.assertEqual(rsp, expected)
76+
77+
rsp = self.maxcdn.post("/post.json", params="foo=bar")
78+
self.assertEqual(rsp, expected)
6679

6780
def test_put(self):
6881
requests.Session.request = mock.create_autospec(mock_request,
69-
return_value=response("put"))
70-
self.assertEqual(self.maxcdn.put("/put.json"),
71-
{ "code": 200, "method": "put", "data": { "foo":"bar" } })
82+
return_value=response("put"))
7283

73-
def test_purge(self):
74-
requests.Session.request = mock.create_autospec(mock_request,
75-
return_value=response("purge"))
76-
self.assertEqual(self.maxcdn.purge("/purge.json"),
77-
{ "code": 200, "method": "purge", "data": { "foo":"bar" } })
84+
expected = {"code": 200, "method": "put", "data": {"foo": "bar"}}
85+
self.assertEqual(self.maxcdn.put("/put.json"), expected)
7886

7987
def test_delete(self):
8088
requests.Session.request = mock.create_autospec(mock_request,
81-
return_value=response("delete"))
82-
self.assertEqual(self.maxcdn.delete("/delete.json"),
83-
{ "code": 200, "method": "delete", "data": { "foo":"bar" } })
89+
return_value=response("delete"))
90+
91+
expected = {"code": 200, "method": "delete", "data": {"foo": "bar"}}
92+
self.assertEqual(self.maxcdn.delete("/delete.json"), expected)
8493

85-
self.assertEqual(self.maxcdn.patch("/delete.json",
86-
file_or_files="/foo.css"),
87-
{ "code": 200, "method": "delete", "data": { "foo":"bar" } })
94+
rsp = self.maxcdn.patch("/delete.json", file_or_files="/foo.css")
95+
self.assertEqual(rsp, expected)
8896

89-
self.assertEqual(self.maxcdn.patch("/delete.json",
90-
file_or_files=["/foo.css", "/bar.css"]),
91-
{ "code": 200, "method": "delete", "data": { "foo":"bar" } })
97+
files = ["/foo.css", "/bar.css"]
98+
expected = {"code": 200, "method": "delete", "data": {"foo": "bar"}}
99+
rsp = self.maxcdn.patch("/delete.json", file_or_files=files)
100+
self.assertEqual(rsp, expected)
92101

93102
def test_purge(self):
94103
requests.Session.request = mock.create_autospec(mock_request,
95-
return_value=response("delete"))
96-
self.assertEqual(self.maxcdn.purge(12345),
97-
{ "code": 200, "method": "delete", "data": { "foo":"bar" } })
98-
self.assertEqual(self.maxcdn.purge(12345, "/master.css"),
99-
{ "code": 200, "method": "delete", "data": { "foo":"bar" } })
100-
self.assertEqual(self.maxcdn.purge(12345, ["/master.css", "/other.css"]),
101-
{ "code": 200, "method": "delete", "data": { "foo":"bar" } })
104+
return_value=response("delete"))
105+
106+
expected = {"code": 200, "method": "delete", "data": {"foo": "bar"}}
107+
self.assertEqual(self.maxcdn.purge(12345), expected)
108+
109+
self.assertEqual(self.maxcdn.purge(12345, "/master.css"), expected)
110+
111+
files = ["/master.css", "/other.css"]
112+
self.assertEqual(self.maxcdn.purge(12345, files), expected)
102113

103114
if __name__ == '__main__':
104115
unittest.main()

0 commit comments

Comments
 (0)