Skip to content

Commit a8dc9d2

Browse files
committed
Move DEFAULT_BASE_URL and helper functions out of restsession.py
Move the DEFAULT_BASE_URL to the package __init__.py file, and move the helper functions to helper.py.
1 parent 8a53ea0 commit a8dc9d2

File tree

3 files changed

+95
-59
lines changed

3 files changed

+95
-59
lines changed

ciscosparkapi/__init__.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,27 @@
88
from api.teammemberships import TeamMembership, TeamMembershipsAPI
99
from api.webhooks import Webhook, WebhooksAPI
1010

11+
12+
# Default base URL
13+
DEFAULT_BASE_URL = 'https://api.ciscospark.com/v1/'
14+
15+
1116
class CiscoSparkAPI(object):
1217
"""Cisco Spark API wrapper class."""
1318

14-
def __init__(self, access_token, base_url=None, timeout=None):
19+
def __init__(self, access_token, base_url=DEFAULT_BASE_URL, timeout=None):
1520
# Process args
1621
assert isinstance(access_token, basestring)
1722
# Process kwargs
1823
session_args = {}
19-
if base_url: session_args['base_url'] = base_url
20-
if timeout: session_args['timeout'] = timeout
24+
if timeout:
25+
session_args['timeout'] = timeout
2126

2227
# Create API session
2328
# All of the API calls associated with a CiscoSparkAPI object will
2429
# leverage a single RESTful 'session' connecting to the Cisco Spark
2530
# cloud.
26-
self.session = RestSession(access_token, **session_args)
31+
self.session = RestSession(access_token, base_url, **session_args)
2732

2833
# Spark API wrappers
2934
self.people = PeopleAPI(self.session)
@@ -45,3 +50,4 @@ def base_url(self):
4550
@property
4651
def timeout(self):
4752
return self.session.timeout
53+

ciscosparkapi/helper.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,71 @@
1313

1414

1515
import functools
16+
import urlparse
17+
18+
from ciscosparkapi import ciscosparkapiException, SparkApiError
19+
20+
21+
# Cisco Spark cloud Expected Response Codes (HTTP Response Codes)
22+
ERC = {
23+
'GET': 200,
24+
'POST': 200,
25+
'PUT': 200,
26+
'DELETE': 204
27+
}
28+
29+
30+
def validate_base_url(base_url):
31+
"""Verify that base_url specifies a protocol and network location."""
32+
parsed_url = urlparse.urlparse(base_url)
33+
if parsed_url.scheme and parsed_url.netloc:
34+
return parsed_url.geturl()
35+
else:
36+
error_message = "base_url must contain a valid scheme (protocol " \
37+
"specifier) and network location (hostname)"
38+
raise ciscosparkapiException(error_message)
39+
40+
41+
def raise_if_extra_kwargs(kwargs):
42+
"""Raise a TypeError if kwargs is not empty."""
43+
if kwargs:
44+
raise TypeError("Unexpected **kwargs: %r" % kwargs)
45+
46+
47+
def check_response_code(response, erc):
48+
"""Check response code against the expected code; raise SparkApiError.
49+
50+
Checks the requests.response.status_code against the provided expected
51+
response code (erc), and raises a SparkApiError if they do not match.
52+
53+
Args:
54+
response(requests.response): The response object returned by a request
55+
using the requests package.
56+
erc(int): The expected response code (HTTP response code).
57+
58+
Raises:
59+
SparkApiError: If the requests.response.status_code does not match the
60+
provided expected response code (erc).
61+
62+
"""
63+
if response.status_code != erc:
64+
raise SparkApiError(response.status_code,
65+
request=response.request,
66+
response=response)
67+
68+
69+
def extract_and_parse_json(response):
70+
"""Extract and parse the JSON data from an requests.response object.
71+
72+
Args:
73+
response(requests.response): The response object returned by a request
74+
using the requests package.
75+
76+
Returns:
77+
The parsed JSON data as the appropriate native Python data type.
78+
79+
"""
80+
return response.json()
1681

1782

1883
def utf8(string):

ciscosparkapi/restsession.py

Lines changed: 20 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,18 @@
11
"""RestSession class for creating 'connections' to the Cisco Spark APIs."""
22

3-
43
import urlparse
5-
import requests
6-
from .exceptions import ciscosparkapiException, SparkApiError
7-
8-
9-
# Default api.ciscospark.com base URL
10-
DEFAULT_API_URL = 'https://api.ciscospark.com/v1/'
11-
12-
# Cisco Spark cloud Expected Response Codes (HTTP Response Codes)
13-
ERC = {
14-
'GET': 200,
15-
'POST': 200,
16-
'PUT': 200,
17-
'DELETE': 204
18-
}
19-
20-
21-
def _validate_base_url(base_url):
22-
parsed_url = urlparse.urlparse(base_url)
23-
if parsed_url.scheme and parsed_url.netloc:
24-
return parsed_url.geturl()
25-
else:
26-
error_message = "base_url must contain a valid scheme (protocol " \
27-
"specifier) and network location (hostname)"
28-
raise ciscosparkapiException(error_message)
29-
30-
31-
def _raise_if_extra_kwargs(kwargs):
32-
if kwargs:
33-
raise TypeError("Unexpected **kwargs: %r" % kwargs)
34-
35-
36-
def _check_response_code(response, erc):
37-
if response.status_code != erc:
38-
raise SparkApiError(response.status_code,
39-
request=response.request,
40-
response=response)
414

5+
import requests
426

43-
def _extract_and_parse_json(response):
44-
return response.json()
7+
from .exceptions import ciscosparkapiException
8+
from .helper import ERC, validate_base_url, \
9+
raise_if_extra_kwargs, check_response_code, extract_and_parse_json
4510

4611

4712
class RestSession(object):
48-
def __init__(self, access_token, base_url=DEFAULT_API_URL, timeout=None):
13+
def __init__(self, access_token, base_url, timeout=None):
4914
super(RestSession, self).__init__()
50-
self._base_url = _validate_base_url(base_url)
15+
self._base_url = validate_base_url(base_url)
5116
self._access_token = access_token
5217
self._req_session = requests.session()
5318
self._timeout = None
@@ -91,13 +56,13 @@ def get(self, url, params=None, **kwargs):
9156
# Process kwargs
9257
timeout = kwargs.pop('timeout', self.timeout)
9358
erc = kwargs.pop('erc', ERC['GET'])
94-
_raise_if_extra_kwargs(kwargs)
59+
raise_if_extra_kwargs(kwargs)
9560
# API request
9661
response = self._req_session.get(abs_url, params=params,
9762
timeout=timeout)
9863
# Process response
99-
_check_response_code(response, erc)
100-
return _extract_and_parse_json(response)
64+
check_response_code(response, erc)
65+
return extract_and_parse_json(response)
10166

10267
def get_pages(self, url, params=None, **kwargs):
10368
# Process args
@@ -107,14 +72,14 @@ def get_pages(self, url, params=None, **kwargs):
10772
# Process kwargs
10873
timeout = kwargs.pop('timeout', self.timeout)
10974
erc = kwargs.pop('erc', ERC['GET'])
110-
_raise_if_extra_kwargs(kwargs)
75+
raise_if_extra_kwargs(kwargs)
11176
# API request - get first page
11277
response = self._req_session.get(abs_url, params=params,
11378
timeout=timeout)
11479
while True:
11580
# Process response - Yield page's JSON data
116-
_check_response_code(response, erc)
117-
yield _extract_and_parse_json(response)
81+
check_response_code(response, erc)
82+
yield extract_and_parse_json(response)
11883
# Get next page
11984
if response.links.get('next'):
12085
next_url = response.links.get('next').get('url')
@@ -148,12 +113,12 @@ def post(self, url, json, **kwargs):
148113
# Process kwargs
149114
timeout = kwargs.pop('timeout', self.timeout)
150115
erc = kwargs.pop('erc', ERC['POST'])
151-
_raise_if_extra_kwargs(kwargs)
116+
raise_if_extra_kwargs(kwargs)
152117
# API request
153118
response = self._req_session.post(abs_url, json=json, timeout=timeout)
154119
# Process response
155-
_check_response_code(response, erc)
156-
return _extract_and_parse_json(response)
120+
check_response_code(response, erc)
121+
return extract_and_parse_json(response)
157122

158123
def put(self, url, json, **kwargs):
159124
# Process args
@@ -163,12 +128,12 @@ def put(self, url, json, **kwargs):
163128
# Process kwargs
164129
timeout = kwargs.pop('timeout', self.timeout)
165130
erc = kwargs.pop('erc', ERC['PUT'])
166-
_raise_if_extra_kwargs(kwargs)
131+
raise_if_extra_kwargs(kwargs)
167132
# API request
168133
response = self._req_session.put(abs_url, json=json, timeout=timeout)
169134
# Process response
170-
_check_response_code(response, erc)
171-
return _extract_and_parse_json(response)
135+
check_response_code(response, erc)
136+
return extract_and_parse_json(response)
172137

173138
def delete(self, url, **kwargs):
174139
# Process args
@@ -177,8 +142,8 @@ def delete(self, url, **kwargs):
177142
# Process kwargs
178143
timeout = kwargs.pop('timeout', self.timeout)
179144
erc = kwargs.pop('erc', ERC['DELETE'])
180-
_raise_if_extra_kwargs(kwargs)
145+
raise_if_extra_kwargs(kwargs)
181146
# API request
182147
response = self._req_session.delete(abs_url, timeout=timeout)
183148
# Process response
184-
_check_response_code(response, erc)
149+
check_response_code(response, erc)

0 commit comments

Comments
 (0)