Skip to content

Commit 6f92dbf

Browse files
authored
Merge pull request #53 from CiscoDevNet/feature-51-refactor-data-models
Feature 51 refactor data models - All tests passing!
2 parents abd095f + 7146b1c commit 6f92dbf

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1435
-1293
lines changed

ciscosparkapi/__init__.py

Lines changed: 50 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -2,71 +2,51 @@
22
"""Python API wrapper for the Cisco Spark APIs."""
33

44

5-
# Use future for Python v2 and v3 compatibility
65
from __future__ import (
76
absolute_import,
87
division,
98
print_function,
109
unicode_literals,
1110
)
12-
from builtins import *
13-
from past.builtins import basestring
14-
15-
16-
__author__ = "Chris Lunsford"
17-
__author_email__ = "[email protected]"
18-
__copyright__ = "Copyright (c) 2016-2018 Cisco and/or its affiliates."
19-
__license__ = "MIT"
20-
__all__ = [
21-
"CiscoSparkAPI", "ciscosparkapiException", "SparkApiError",
22-
"SparkRateLimitError", "Person", "Room", "Membership", "Message", "Team",
23-
"TeamMembership", "Webhook", "WebhookEvent", "Organization", "License",
24-
"Role", "AccessToken"
25-
]
26-
2711

12+
from builtins import *
2813
import logging
2914
import os
3015

31-
from .api.people import Person
32-
from .api.rooms import Room
33-
from .api.memberships import Membership
34-
from .api.messages import Message
35-
from .api.teams import Team
36-
from .api.team_memberships import TeamMembership
37-
from .api.webhooks import Webhook, WebhookEvent
38-
from .api.organizations import Organization
39-
from .api.licenses import License
40-
from .api.roles import Role
41-
from .api.access_tokens import AccessToken
16+
from past.builtins import basestring
4217

43-
from .api.people import PeopleAPI as _PeopleAPI
44-
from .api.rooms import RoomsAPI as _RoomsAPI
18+
from .api.access_tokens import AccessTokensAPI as _AccessTokensAPI
19+
from .api.licenses import LicensesAPI as _LicensesAPI
4520
from .api.memberships import MembershipsAPI as _MembershipsAPI
4621
from .api.messages import MessagesAPI as _MessagesAPI
47-
from .api.teams import TeamsAPI as _TeamsAPI
48-
from .api.team_memberships import TeamMembershipsAPI as _TeamMembershipsAPI
49-
from .api.webhooks import WebhooksAPI as _WebhooksAPI
5022
from .api.organizations import OrganizationsAPI as _OrganizationsAPI
51-
from .api.licenses import LicensesAPI as _LicensesAPI
23+
from .api.people import PeopleAPI as _PeopleAPI
5224
from .api.roles import RolesAPI as _RolesAPI
53-
from .api.access_tokens import AccessTokensAPI as _AccessTokensAPI
54-
25+
from .api.rooms import RoomsAPI as _RoomsAPI
26+
from .api.team_memberships import TeamMembershipsAPI as _TeamMembershipsAPI
27+
from .api.teams import TeamsAPI as _TeamsAPI
28+
from .api.webhooks import WebhooksAPI as _WebhooksAPI
5529
from .exceptions import (
56-
ciscosparkapiException,
57-
SparkApiError,
58-
SparkRateLimitError,
30+
SparkApiError, SparkRateLimitError, ciscosparkapiException,
31+
)
32+
from .models import (
33+
AccessToken, License, Membership, Message, Organization, Person, Role,
34+
Room, Team, TeamMembership, Webhook, WebhookEvent, sparkdata_factory,
5935
)
60-
6136
from .restsession import (
6237
DEFAULT_SINGLE_REQUEST_TIMEOUT,
6338
DEFAULT_WAIT_ON_RATE_LIMIT,
6439
RestSession as _RestSession,
6540
)
66-
6741
from .utils import check_type
6842

6943

44+
__author__ = "Chris Lunsford"
45+
__author_email__ = "[email protected]"
46+
__copyright__ = "Copyright (c) 2016-2018 Cisco and/or its affiliates."
47+
__license__ = "MIT"
48+
49+
7050
# Versioneer version control
7151
from ._version import get_versions
7252
__version__ = get_versions()['version']
@@ -94,34 +74,35 @@ class CiscoSparkAPI(object):
9474
CiscoSparkAPI wraps all of the individual Cisco Spark APIs and represents
9575
them in a simple hierarchical structure.
9676
97-
:CiscoSparkAPI: :class:`people <PeopleAPI>`
77+
:CiscoSparkAPI: :class:`people <_PeopleAPI>`
9878
99-
:class:`rooms <RoomsAPI>`
79+
:class:`rooms <_RoomsAPI>`
10080
101-
:class:`memberships <MembershipsAPI>`
81+
:class:`memberships <_MembershipsAPI>`
10282
103-
:class:`messages <MessagesAPI>`
83+
:class:`messages <_MessagesAPI>`
10484
105-
:class:`teams <TeamsAPI>`
85+
:class:`teams <_TeamsAPI>`
10686
107-
:class:`team_memberships <TeamMembershipsAPI>`
87+
:class:`team_memberships <_TeamMembershipsAPI>`
10888
109-
:class:`webhooks <WebhooksAPI>`
89+
:class:`webhooks <_WebhooksAPI>`
11090
111-
:class:`organizations <OrganizationsAPI>`
91+
:class:`organizations <_OrganizationsAPI>`
11292
113-
:class:`licenses <LicensesAPI>`
93+
:class:`licenses <_LicensesAPI>`
11494
115-
:class:`roles <RolesAPI>`
95+
:class:`roles <_RolesAPI>`
11696
117-
:class:`access_tokens <AccessTokensAPI>`
97+
:class:`access_tokens <_AccessTokensAPI>`
11898
11999
"""
120100

121101
def __init__(self, access_token=None, base_url=DEFAULT_BASE_URL,
122102
timeout=None,
123103
single_request_timeout=DEFAULT_SINGLE_REQUEST_TIMEOUT,
124-
wait_on_rate_limit=DEFAULT_WAIT_ON_RATE_LIMIT):
104+
wait_on_rate_limit=DEFAULT_WAIT_ON_RATE_LIMIT,
105+
object_factory=sparkdata_factory):
125106
"""Create a new CiscoSparkAPI object.
126107
127108
An access token must be used when interacting with the Cisco Spark API.
@@ -150,6 +131,8 @@ def __init__(self, access_token=None, base_url=DEFAULT_BASE_URL,
150131
ciscosparkapi.DEFAULT_SINGLE_REQUEST_TIMEOUT.
151132
wait_on_rate_limit(bool): Enables or disables automatic rate-limit
152133
handling. Defaults to ciscosparkapi.DEFAULT_WAIT_ON_RATE_LIMIT.
134+
object_factory(callable): The factory function to use to create
135+
Python objects from the returned Cisco Spark JSON data objects.
153136
154137
Returns:
155138
CiscoSparkAPI: A new CiscoSparkAPI object.
@@ -188,17 +171,21 @@ def __init__(self, access_token=None, base_url=DEFAULT_BASE_URL,
188171
)
189172

190173
# Spark API wrappers
191-
self.people = _PeopleAPI(self._session)
192-
self.rooms = _RoomsAPI(self._session)
193-
self.memberships = _MembershipsAPI(self._session)
194-
self.messages = _MessagesAPI(self._session)
195-
self.teams = _TeamsAPI(self._session)
196-
self.team_memberships = _TeamMembershipsAPI(self._session)
197-
self.webhooks = _WebhooksAPI(self._session)
198-
self.organizations = _OrganizationsAPI(self._session)
199-
self.licenses = _LicensesAPI(self._session)
200-
self.roles = _RolesAPI(self._session)
201-
self.access_tokens = _AccessTokensAPI(self.base_url, timeout=timeout)
174+
self.people = _PeopleAPI(self._session, object_factory)
175+
self.rooms = _RoomsAPI(self._session, object_factory)
176+
self.memberships = _MembershipsAPI(self._session, object_factory)
177+
self.messages = _MessagesAPI(self._session, object_factory)
178+
self.teams = _TeamsAPI(self._session, object_factory)
179+
self.team_memberships = _TeamMembershipsAPI(
180+
self._session, object_factory
181+
)
182+
self.webhooks = _WebhooksAPI(self._session, object_factory)
183+
self.organizations = _OrganizationsAPI(self._session, object_factory)
184+
self.licenses = _LicensesAPI(self._session, object_factory)
185+
self.roles = _RolesAPI(self._session, object_factory)
186+
self.access_tokens = _AccessTokensAPI(
187+
self.base_url, object_factory, timeout=single_request_timeout
188+
)
202189

203190
@property
204191
def access_token(self):

ciscosparkapi/api/access_tokens.py

Lines changed: 18 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,24 @@
11
# -*- coding: utf-8 -*-
2-
"""Cisco Spark Access-Tokens API wrapper.
2+
"""Cisco Spark Access-Tokens API."""
33

4-
Classes:
5-
AccessToken: Models a Spark 'access token' JSON object as a native Python
6-
object.
7-
AccessTokensAPI: Wraps the Cisco Spark Access-Tokens API and exposes the
8-
API as native Python methods that return native Python objects.
94

10-
"""
11-
12-
13-
# Use future for Python v2 and v3 compatibility
145
from __future__ import (
156
absolute_import,
167
division,
178
print_function,
189
unicode_literals,
1910
)
20-
from builtins import *
21-
from past.builtins import basestring
11+
2212
from future import standard_library
2313
standard_library.install_aliases()
2414

25-
26-
__author__ = "Chris Lunsford"
27-
__author_email__ = "[email protected]"
28-
__copyright__ = "Copyright (c) 2016-2018 Cisco and/or its affiliates."
29-
__license__ = "MIT"
30-
31-
15+
from builtins import *
3216
import urllib.parse
3317

18+
from past.builtins import basestring
3419
import requests
3520

3621
from ..response_codes import EXPECTED_RESPONSE_CODE
37-
from ..sparkdata import SparkData
3822
from ..utils import (
3923
check_response_code,
4024
check_type,
@@ -44,54 +28,27 @@
4428
)
4529

4630

47-
API_ENDPOINT = "access_token"
48-
49-
50-
class AccessToken(SparkData):
51-
"""Model a Spark 'access token' JSON object as a native Python object."""
52-
53-
def __init__(self, json):
54-
"""Init a new AccessToken data object from a dictionary or JSON string.
55-
56-
Args:
57-
json(dict, basestring): Input dictionary or JSON string.
58-
59-
Raises:
60-
TypeError: If the input object is not a dictionary or string.
61-
62-
"""
63-
super(AccessToken, self).__init__(json)
31+
__author__ = "Chris Lunsford"
32+
__author_email__ = "[email protected]"
33+
__copyright__ = "Copyright (c) 2016-2018 Cisco and/or its affiliates."
34+
__license__ = "MIT"
6435

65-
@property
66-
def access_token(self):
67-
"""Cisco Spark access token."""
68-
return self._json_data.get('access_token')
6936

70-
@property
71-
def expires_in(self):
72-
"""Access token expiry time (in seconds)."""
73-
return self._json_data.get('expires_in')
7437

75-
@property
76-
def refresh_token(self):
77-
"""Refresh token used to request a new/refreshed access token."""
78-
return self._json_data.get('refresh_token')
7938

80-
@property
81-
def refresh_token_expires_in(self):
82-
"""Refresh token expiry time (in seconds)."""
83-
return self._json_data.get('refresh_token_expires_in')
39+
API_ENDPOINT = 'access_token'
40+
OBJECT_TYPE = 'access_token'
8441

8542

8643
class AccessTokensAPI(object):
87-
"""Cisco Spark Access-Tokens API wrapper.
44+
"""Cisco Spark Access-Tokens API.
8845
8946
Wraps the Cisco Spark Access-Tokens API and exposes the API as native
9047
Python methods that return native Python objects.
9148
9249
"""
9350

94-
def __init__(self, base_url, timeout=None):
51+
def __init__(self, base_url, object_factory, timeout=None):
9552
"""Initialize an AccessTokensAPI object with the provided RestSession.
9653
9754
Args:
@@ -112,6 +69,8 @@ def __init__(self, base_url, timeout=None):
11269
self._endpoint_url = urllib.parse.urljoin(self.base_url, API_ENDPOINT)
11370
self._request_kwargs = {"timeout": timeout}
11471

72+
self._object_factory = object_factory
73+
11574
@property
11675
def base_url(self):
11776
"""The base URL the API endpoints."""
@@ -138,7 +97,7 @@ def get(self, client_id, client_secret, code, redirect_uri):
13897
process.
13998
14099
Returns:
141-
AccessToken: An AccessToken object with the access token provided
100+
ciscosparkapi.AccessToken: An AccessToken object with the access token provided
142101
by the Cisco Spark cloud.
143102
144103
Raises:
@@ -165,8 +124,8 @@ def get(self, client_id, client_secret, code, redirect_uri):
165124
check_response_code(response, EXPECTED_RESPONSE_CODE['POST'])
166125
json_data = extract_and_parse_json(response)
167126

168-
# Return a AccessToken object created from the response JSON data
169-
return AccessToken(json_data)
127+
# Return a access_token object created from the response JSON data
128+
return self._object_factory(OBJECT_TYPE, json_data)
170129

171130
def refresh(self, client_id, client_secret, refresh_token):
172131
"""Return a refreshed Access Token from the provided refresh_token.
@@ -205,4 +164,4 @@ def refresh(self, client_id, client_secret, refresh_token):
205164
json_data = extract_and_parse_json(response)
206165

207166
# Return a AccessToken object created from the response JSON data
208-
return AccessToken(json_data)
167+
return self._object_factory(OBJECT_TYPE, json_data)

0 commit comments

Comments
 (0)