Skip to content

Commit 06ffa14

Browse files
committed
Refactor SparkData sub-classes to mixins and create composed data model classes and factory function
Refactor the SparkData sub-classes (Room, Message, Webhook, etc.) containing basic data attributes to be mixin classes. Then create the actual data model classes as classes composed from the SparkData base class and the appropriate mixins. This will enable further composability in the ciscosparksdk package and in user implementations of custom data models. Then create a factory function for generating objects from the set of data model classes. The API methods will be updated to use factory functions to enable data model selection at run time.
1 parent 733269b commit 06ffa14

File tree

14 files changed

+155
-219
lines changed

14 files changed

+155
-219
lines changed

ciscosparkapi/models/__init__.py

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,108 @@
11
# -*- coding: utf-8 -*-
2+
"""Cisco Spark data models."""
3+
4+
5+
from __future__ import (
6+
absolute_import,
7+
division,
8+
print_function,
9+
unicode_literals,
10+
)
11+
12+
from collections import defaultdict
13+
14+
from .access_token import AccessTokenBasicPropertiesMixin
15+
from .license import LicenseBasicPropertiesMixin
16+
from .membership import MembershipBasicPropertiesMixin
17+
from .message import MessageBasicPropertiesMixin
18+
from .organization import OrganizationBasicPropertiesMixin
19+
from .person import PersonBasicPropertiesMixin
20+
from .role import RoleBasicPropertiesMixin
21+
from .room import RoomBasicPropertiesMixin
22+
from .sparkdata import SparkData
23+
from .team import TeamBasicPropertiesMixin
24+
from .team_membership import TeamMembershipBasicPropertiesMixin
25+
from .webhook import WebhookBasicPropertiesMixin
26+
from .webhook_event import WebhookEventBasicPropertiesMixin
27+
28+
29+
__author__ = "Chris Lunsford"
30+
__author_email__ = "[email protected]"
31+
__copyright__ = "Copyright (c) 2016-2018 Cisco and/or its affiliates."
32+
__license__ = "MIT"
33+
34+
35+
class AccessToken(SparkData, AccessTokenBasicPropertiesMixin):
36+
"""Cisco Spark Access-Token data model."""
37+
38+
39+
class License(SparkData, LicenseBasicPropertiesMixin):
40+
"""Cisco Spark License data model."""
41+
42+
43+
class Membership(SparkData, MembershipBasicPropertiesMixin):
44+
"""Cisco Spark Membership data model."""
45+
46+
47+
class Message(SparkData, MessageBasicPropertiesMixin):
48+
"""Cisco Spark Message data model."""
49+
50+
51+
class Organization(SparkData, OrganizationBasicPropertiesMixin):
52+
"""Cisco Spark Organization data model."""
53+
54+
55+
class Person(SparkData, PersonBasicPropertiesMixin):
56+
"""Cisco Spark Person data model."""
57+
58+
59+
class Role(SparkData, RoleBasicPropertiesMixin):
60+
"""Cisco Spark Role data model."""
61+
62+
63+
class Team(SparkData, TeamBasicPropertiesMixin):
64+
"""Cisco Spark Team data model."""
65+
66+
67+
class TeamMembership(SparkData, TeamMembershipBasicPropertiesMixin):
68+
"""Cisco Spark Team-Membership data model."""
69+
70+
71+
class Webhook(SparkData, WebhookBasicPropertiesMixin):
72+
"""Cisco Spark Webhook data model."""
73+
74+
75+
class WebhookEvent(SparkData, WebhookEventBasicPropertiesMixin):
76+
"""Cisco Spark Webhook-Events data model."""
77+
78+
79+
sparkdata_models = defaultdict(
80+
lambda: SparkData,
81+
access_token=AccessToken,
82+
license=License,
83+
membership=Membership,
84+
message=Message,
85+
organization=Organization,
86+
person=Person,
87+
role=Role,
88+
team=Team,
89+
team_membership=TeamMembership,
90+
webhook=Webhook,
91+
webhook_event=WebhookEvent,
92+
)
93+
94+
95+
def sparkdata_factory(model, json_data):
96+
"""Factory function for creating SparkData objects.
97+
98+
Args:
99+
model(basestring): The data model to use when creating the SparkData
100+
object (message, room, membership, etc.).
101+
json_data(basestring, dict): The JSON string or dictionary data with
102+
which to initialize the object.
103+
104+
Returns:
105+
SparkData: The created SparkData object.
106+
107+
"""
108+
return sparkdata_models[model](json_data)

ciscosparkapi/models/access_token.py

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,15 @@
1111

1212
from builtins import *
1313

14-
from .sparkdata import SparkData
15-
1614

1715
__author__ = "Chris Lunsford"
1816
__author_email__ = "[email protected]"
1917
__copyright__ = "Copyright (c) 2016-2018 Cisco and/or its affiliates."
2018
__license__ = "MIT"
2119

2220

23-
class AccessToken(SparkData):
24-
"""Model a Spark 'access token' JSON object as a native Python object."""
25-
26-
def __init__(self, json):
27-
"""Init a new AccessToken data object from a dictionary or JSON string.
28-
29-
Args:
30-
json(dict, basestring): Input dictionary or JSON string.
31-
32-
Raises:
33-
TypeError: If the input object is not a dictionary or string.
34-
35-
"""
36-
super(AccessToken, self).__init__(json)
21+
class AccessTokenBasicPropertiesMixin(object):
22+
"""A mixin for :class:`SparkData` classes."""
3723

3824
@property
3925
def access_token(self):

ciscosparkapi/models/license.py

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,15 @@
1111

1212
from builtins import *
1313

14-
from .sparkdata import SparkData
15-
1614

1715
__author__ = "Chris Lunsford"
1816
__author_email__ = "[email protected]"
1917
__copyright__ = "Copyright (c) 2016-2018 Cisco and/or its affiliates."
2018
__license__ = "MIT"
2119

2220

23-
class License(SparkData):
24-
"""Model a Spark License JSON object as a native Python object."""
25-
26-
def __init__(self, json):
27-
"""Initialize a License data object from a dictionary or JSON string.
28-
29-
Args:
30-
json(dict, basestring): Input dictionary or JSON string.
31-
32-
Raises:
33-
TypeError: If the input object is not a dictionary or string.
34-
35-
"""
36-
super(License, self).__init__(json)
21+
class LicenseBasicPropertiesMixin(object):
22+
"""A mixin for :class:`SparkData` classes."""
3723

3824
@property
3925
def id(self):

ciscosparkapi/models/membership.py

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,15 @@
1111

1212
from builtins import *
1313

14-
from .sparkdata import SparkData
15-
1614

1715
__author__ = "Chris Lunsford"
1816
__author_email__ = "[email protected]"
1917
__copyright__ = "Copyright (c) 2016-2018 Cisco and/or its affiliates."
2018
__license__ = "MIT"
2119

2220

23-
class Membership(SparkData):
24-
"""Model a Spark 'membership' JSON object as a native Python object."""
25-
26-
def __init__(self, json):
27-
"""Initialize a Membership object from a dictionary or JSON string.
28-
29-
Args:
30-
json(dict, basestring): Input dictionary or JSON string.
31-
32-
Raises:
33-
TypeError: If the input object is not a dictionary or string.
34-
35-
"""
36-
super(Membership, self).__init__(json)
21+
class MembershipBasicPropertiesMixin(object):
22+
"""A mixin for :class:`SparkData` classes."""
3723

3824
@property
3925
def id(self):

ciscosparkapi/models/message.py

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,15 @@
1111

1212
from builtins import *
1313

14-
from .sparkdata import SparkData
15-
1614

1715
__author__ = "Chris Lunsford"
1816
__author_email__ = "[email protected]"
1917
__copyright__ = "Copyright (c) 2016-2018 Cisco and/or its affiliates."
2018
__license__ = "MIT"
2119

2220

23-
class Message(SparkData):
24-
"""Model a Spark 'message' JSON object as a native Python object."""
25-
26-
def __init__(self, json):
27-
"""Initialize a Message data object from a dictionary or JSON string.
28-
29-
Args:
30-
json(dict, basestring): Input dictionary or JSON string.
31-
32-
Raises:
33-
TypeError: If the input object is not a dictionary or string.
34-
35-
"""
36-
super(Message, self).__init__(json)
21+
class MessageBasicPropertiesMixin(object):
22+
"""A mixin for :class:`SparkData` classes."""
3723

3824
@property
3925
def id(self):

ciscosparkapi/models/organization.py

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,8 @@
2020
__license__ = "MIT"
2121

2222

23-
class Organization(SparkData):
24-
"""Model a Spark Organization JSON object as a native Python object."""
25-
26-
def __init__(self, json):
27-
"""Init a Organization data object from a dictionary or JSON string.
28-
29-
Args:
30-
json(dict, basestring): Input dictionary or JSON string.
31-
32-
Raises:
33-
TypeError: If the input object is not a dictionary or string.
34-
35-
"""
36-
super(Organization, self).__init__(json)
23+
class OrganizationBasicPropertiesMixin(object):
24+
"""A mixin for :class:`SparkData` classes."""
3725

3826
@property
3927
def id(self):

ciscosparkapi/models/person.py

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,15 @@
1111

1212
from builtins import *
1313

14-
from .sparkdata import SparkData
15-
1614

1715
__author__ = "Chris Lunsford"
1816
__author_email__ = "[email protected]"
1917
__copyright__ = "Copyright (c) 2016-2018 Cisco and/or its affiliates."
2018
__license__ = "MIT"
2119

2220

23-
class Person(SparkData):
24-
"""Model a Spark person JSON object as a native Python object."""
25-
26-
def __init__(self, json):
27-
"""Initialize a Person data object from a dictionary or JSON string.
28-
29-
Args:
30-
json(dict, basestring): Input dictionary or JSON string.
31-
32-
Raises:
33-
TypeError: If the input object is not a dictionary or string.
34-
35-
"""
36-
super(Person, self).__init__(json)
21+
class PersonBasicPropertiesMixin(object):
22+
"""A mixin for :class:`SparkData` classes."""
3723

3824
@property
3925
def type(self):

ciscosparkapi/models/role.py

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,15 @@
1111

1212
from builtins import *
1313

14-
from .sparkdata import SparkData
15-
1614

1715
__author__ = "Chris Lunsford"
1816
__author_email__ = "[email protected]"
1917
__copyright__ = "Copyright (c) 2016-2018 Cisco and/or its affiliates."
2018
__license__ = "MIT"
2119

2220

23-
class Role(SparkData):
24-
"""Model a Spark Role JSON object as a native Python object."""
25-
26-
def __init__(self, json):
27-
"""Initialize a new Role data object from a dictionary or JSON string.
28-
29-
Args:
30-
json(dict, basestring): Input dictionary or JSON string.
31-
32-
Raises:
33-
TypeError: If the input object is not a dictionary or string.
34-
35-
"""
36-
super(Role, self).__init__(json)
21+
class RoleBasicPropertiesMixin(object):
22+
"""A mixin for :class:`SparkData` classes."""
3723

3824
@property
3925
def id(self):

ciscosparkapi/models/room.py

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,15 @@
1111

1212
from builtins import *
1313

14-
from .sparkdata import SparkData
15-
1614

1715
__author__ = "Chris Lunsford"
1816
__author_email__ = "[email protected]"
1917
__copyright__ = "Copyright (c) 2016-2018 Cisco and/or its affiliates."
2018
__license__ = "MIT"
2119

2220

23-
class Room(SparkData):
24-
"""Model a Spark 'room' JSON object as a native Python object."""
25-
26-
def __init__(self, json):
27-
"""Initialize a Room data object from a dictionary or JSON string.
28-
29-
Args:
30-
json(dict, basestring): Input dictionary or JSON string.
31-
32-
Raises:
33-
TypeError: If the input object is not a dictionary or string.
34-
35-
"""
36-
super(Room, self).__init__(json)
21+
class RoomBasicPropertiesMixin(object):
22+
"""A mixin for :class:`SparkData` classes."""
3723

3824
@property
3925
def id(self):
@@ -52,7 +38,7 @@ def type(self):
5238

5339
@property
5440
def isLocked(self):
55-
"""Whether or not the room is locked and controled by moderator(s)."""
41+
"""Whether or not the room is locked and controlled by moderator(s)."""
5642
return self._json_data.get('isLocked')
5743

5844
@property

0 commit comments

Comments
 (0)