Skip to content

Commit c597a2a

Browse files
authored
Merge pull request #50 from devicehive/develop
New release
2 parents bb6ffef + d7f03d8 commit c597a2a

7 files changed

Lines changed: 141 additions & 230 deletions

File tree

devicehive/api.py

Lines changed: 112 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -35,36 +35,112 @@ def __init__(self, transport, auth):
3535
self._transport = transport
3636
self._token = Token(self, auth)
3737
self._connected = True
38-
self._subscription_calls = {self.subscribe_insert_commands: set(),
39-
self.subscribe_update_commands: set(),
40-
self.subscribe_notifications: set()}
38+
self._subscriptions = set()
4139
self.server_timestamp = None
4240

43-
@staticmethod
44-
def _hashable_args(args):
45-
args = list(args)
46-
for i in range(len(args)):
47-
if not isinstance(args[i], list):
48-
continue
49-
args[i] = tuple(args[i])
50-
return tuple(args)
51-
52-
def _set_subscription_call(self, call, args):
53-
args = self._hashable_args(args)
54-
if args in self._subscription_calls[call]:
41+
def _subscribe_insert_commands(self, device_id=None, network_ids=(),
42+
device_type_ids=(), names=(),
43+
timestamp=None):
44+
action = 'command/insert'
45+
join_names = ','.join(map(str, names))
46+
join_network_ids = ','.join(map(str, network_ids))
47+
join_device_type_ids = ','.join(map(str, device_type_ids))
48+
if not timestamp:
49+
timestamp = self.server_timestamp
50+
auth_subscription_api_request = AuthSubscriptionApiRequest(self)
51+
auth_subscription_api_request.action(action)
52+
auth_subscription_api_request.url('device/command/poll')
53+
auth_subscription_api_request.param('deviceId', device_id)
54+
auth_subscription_api_request.param('networkIds', join_network_ids)
55+
auth_subscription_api_request.param('deviceTypeIds',
56+
join_device_type_ids)
57+
auth_subscription_api_request.param('names', join_names)
58+
auth_subscription_api_request.param('timestamp', timestamp)
59+
auth_subscription_api_request.response_key('command')
60+
api_request = ApiRequest(self)
61+
api_request.action('command/subscribe')
62+
api_request.set('deviceId', device_id)
63+
api_request.set('networkIds', network_ids)
64+
api_request.set('deviceTypeIds', device_type_ids)
65+
api_request.set('names', names)
66+
api_request.set('timestamp', timestamp)
67+
api_request.subscription_request(auth_subscription_api_request)
68+
return api_request.execute('Subscribe insert commands failure.')
69+
70+
def _subscribe_update_commands(self, device_id=None, network_ids=(),
71+
device_type_ids=(), names=(),
72+
timestamp=None):
73+
action = 'command/update'
74+
join_names = ','.join(map(str, names))
75+
join_network_ids = ','.join(map(str, network_ids))
76+
join_device_type_ids = ','.join(map(str, device_type_ids))
77+
if not timestamp:
78+
timestamp = self.server_timestamp
79+
auth_subscription_api_request = AuthSubscriptionApiRequest(self)
80+
auth_subscription_api_request.action(action)
81+
auth_subscription_api_request.url('device/command/poll')
82+
auth_subscription_api_request.param('returnUpdatedCommands', True)
83+
auth_subscription_api_request.param('deviceId', device_id)
84+
auth_subscription_api_request.param('networkIds', join_network_ids)
85+
auth_subscription_api_request.param('deviceTypeIds',
86+
join_device_type_ids)
87+
auth_subscription_api_request.param('names', join_names)
88+
auth_subscription_api_request.param('timestamp', timestamp)
89+
auth_subscription_api_request.response_timestamp_key('lastUpdated')
90+
auth_subscription_api_request.response_key('command')
91+
api_request = ApiRequest(self)
92+
api_request.action('command/subscribe')
93+
api_request.set('returnUpdatedCommands', True)
94+
api_request.set('deviceId', device_id)
95+
api_request.set('networkIds', network_ids)
96+
api_request.set('deviceTypeIds', device_type_ids)
97+
api_request.set('names', names)
98+
api_request.set('timestamp', timestamp)
99+
api_request.subscription_request(auth_subscription_api_request)
100+
return api_request.execute('Subscribe update commands failure.')
101+
102+
def _subscribe_notifications(self, device_id=None, network_ids=(),
103+
device_type_ids=(), names=(),
104+
timestamp=None):
105+
action = 'notification/insert'
106+
join_names = ','.join(map(str, names))
107+
join_network_ids = ','.join(map(str, network_ids))
108+
join_device_type_ids = ','.join(map(str, device_type_ids))
109+
if not timestamp:
110+
timestamp = self.server_timestamp
111+
auth_subscription_api_request = AuthSubscriptionApiRequest(self)
112+
auth_subscription_api_request.action(action)
113+
auth_subscription_api_request.url('device/notification/poll')
114+
auth_subscription_api_request.param('deviceId', device_id)
115+
auth_subscription_api_request.param('networkIds', join_network_ids)
116+
auth_subscription_api_request.param('deviceTypeIds',
117+
join_device_type_ids)
118+
auth_subscription_api_request.param('names', join_names)
119+
auth_subscription_api_request.param('timestamp', timestamp)
120+
auth_subscription_api_request.response_key('notification')
121+
api_request = ApiRequest(self)
122+
api_request.action('notification/subscribe')
123+
api_request.set('deviceId', device_id)
124+
api_request.set('networkIds', network_ids)
125+
api_request.set('deviceTypeIds', device_type_ids)
126+
api_request.set('names', names)
127+
api_request.set('timestamp', timestamp)
128+
api_request.subscription_request(auth_subscription_api_request)
129+
return api_request.execute('Subscribe notifications failure.')
130+
131+
def _add_subscription(self, subscription):
132+
if subscription in self._subscriptions:
55133
return
56-
self._subscription_calls[call].add(args)
134+
self._subscriptions.add(subscription)
57135

58-
def remove_subscription_call(self, call, args):
59-
args = self._hashable_args(args)
60-
if args not in self._subscription_calls[call]:
136+
def remove_subscription(self, subscription):
137+
if subscription not in self._subscriptions:
61138
return
62-
self._subscription_calls[call].remove(args)
139+
self._subscriptions.remove(subscription)
63140

64141
def apply_subscription_calls(self):
65-
for call in self._subscription_calls:
66-
for args in self._subscription_calls[call]:
67-
call(*args)
142+
for subscription in self._subscriptions:
143+
subscription.subscribe()
68144

69145
@property
70146
def transport(self):
@@ -150,115 +226,32 @@ def refresh_token(self):
150226
return self._token.access_token
151227

152228
def subscribe_insert_commands(self, device_id=None, network_ids=(),
153-
device_type_ids=(), names=(),
154-
timestamp=None):
155-
action = 'command/insert'
156-
join_names = ','.join(map(str, names))
157-
join_network_ids = ','.join(map(str, network_ids))
158-
join_device_type_ids = ','.join(map(str, device_type_ids))
159-
request_timestamp = None
160-
if not timestamp:
161-
request_timestamp = self.server_timestamp
162-
auth_subscription_api_request = AuthSubscriptionApiRequest(self)
163-
auth_subscription_api_request.action(action)
164-
auth_subscription_api_request.url('device/command/poll')
165-
auth_subscription_api_request.param('deviceId', device_id)
166-
auth_subscription_api_request.param('networkIds', join_network_ids)
167-
auth_subscription_api_request.param('deviceTypeIds',
168-
join_device_type_ids)
169-
auth_subscription_api_request.param('names', join_names)
170-
auth_subscription_api_request.param('timestamp', request_timestamp)
171-
auth_subscription_api_request.response_key('command')
172-
api_request = ApiRequest(self)
173-
api_request.action('command/subscribe')
174-
api_request.set('deviceId', device_id)
175-
api_request.set('networkIds', network_ids)
176-
api_request.set('deviceTypeIds', device_type_ids)
177-
api_request.set('names', names)
178-
api_request.set('timestamp', request_timestamp)
179-
api_request.subscription_request(auth_subscription_api_request)
180-
subscription = api_request.execute('Subscribe insert commands failure.')
181-
call = self.subscribe_insert_commands
229+
device_type_ids=(), names=(), timestamp=None):
230+
call = self._subscribe_insert_commands
182231
args = (device_id, network_ids, device_type_ids, names, timestamp)
183-
commands_subscription = CommandsSubscription(self, subscription,
184-
call, args)
185-
self._set_subscription_call(call, args)
232+
commands_subscription = CommandsSubscription(self, call, args)
233+
commands_subscription.subscribe()
234+
self._add_subscription(commands_subscription)
186235
return commands_subscription
187236

188237
def subscribe_update_commands(self, device_id=None, network_ids=(),
189238
device_type_ids=(), names=(),
190239
timestamp=None):
191-
action = 'command/update'
192-
join_names = ','.join(map(str, names))
193-
join_network_ids = ','.join(map(str, network_ids))
194-
join_device_type_ids = ','.join(map(str, device_type_ids))
195-
request_timestamp = None
196-
if not timestamp:
197-
request_timestamp = self.server_timestamp
198-
auth_subscription_api_request = AuthSubscriptionApiRequest(self)
199-
auth_subscription_api_request.action(action)
200-
auth_subscription_api_request.url('device/command/poll')
201-
auth_subscription_api_request.param('returnUpdatedCommands', True)
202-
auth_subscription_api_request.param('deviceId', device_id)
203-
auth_subscription_api_request.param('networkIds', join_network_ids)
204-
auth_subscription_api_request.param('deviceTypeIds',
205-
join_device_type_ids)
206-
auth_subscription_api_request.param('names', join_names)
207-
auth_subscription_api_request.param('timestamp', request_timestamp)
208-
auth_subscription_api_request.response_timestamp_key('lastUpdated')
209-
auth_subscription_api_request.response_key('command')
210-
api_request = ApiRequest(self)
211-
api_request.action('command/subscribe')
212-
api_request.set('returnUpdatedCommands', True)
213-
api_request.set('deviceId', device_id)
214-
api_request.set('networkIds', network_ids)
215-
api_request.set('deviceTypeIds', device_type_ids)
216-
api_request.set('names', names)
217-
api_request.set('timestamp', request_timestamp)
218-
api_request.subscription_request(auth_subscription_api_request)
219-
subscription = api_request.execute('Subscribe update commands failure.')
220-
call = self.subscribe_update_commands
240+
call = self._subscribe_update_commands
221241
args = (device_id, network_ids, device_type_ids, names, timestamp)
222-
commands_subscription = CommandsSubscription(self, subscription,
223-
call, args)
224-
self._set_subscription_call(call, args)
242+
commands_subscription = CommandsSubscription(self, call, args)
243+
commands_subscription.subscribe()
244+
self._add_subscription(commands_subscription)
225245
return commands_subscription
226246

227247
def subscribe_notifications(self, device_id=None, network_ids=(),
228248
device_type_ids=(), names=(),
229249
timestamp=None):
230-
action = 'notification/insert'
231-
join_names = ','.join(map(str, names))
232-
join_network_ids = ','.join(map(str, network_ids))
233-
join_device_type_ids = ','.join(map(str, device_type_ids))
234-
request_timestamp = None
235-
if not timestamp:
236-
request_timestamp = self.server_timestamp
237-
auth_subscription_api_request = AuthSubscriptionApiRequest(self)
238-
auth_subscription_api_request.action(action)
239-
auth_subscription_api_request.url('device/notification/poll')
240-
auth_subscription_api_request.param('deviceId', device_id)
241-
auth_subscription_api_request.param('networkIds', join_network_ids)
242-
auth_subscription_api_request.param('deviceTypeIds',
243-
join_device_type_ids)
244-
auth_subscription_api_request.param('names', join_names)
245-
auth_subscription_api_request.param('timestamp', request_timestamp)
246-
auth_subscription_api_request.response_key('notification')
247-
api_request = ApiRequest(self)
248-
api_request.action('notification/subscribe')
249-
api_request.set('deviceId', device_id)
250-
api_request.set('networkIds', network_ids)
251-
api_request.set('deviceTypeIds', device_type_ids)
252-
api_request.set('names', names)
253-
api_request.set('timestamp', request_timestamp)
254-
api_request.subscription_request(auth_subscription_api_request)
255-
subscription = api_request.execute('Subscribe notifications failure.')
256-
call = self.subscribe_notifications
250+
call = self._subscribe_notifications
257251
args = (device_id, network_ids, device_type_ids, names, timestamp)
258-
notifications_subscription = NotificationsSubscription(self,
259-
subscription,
260-
call, args)
261-
self._set_subscription_call(call, args)
252+
notifications_subscription = NotificationsSubscription(self, call, args)
253+
notifications_subscription.subscribe()
254+
self._add_subscription(notifications_subscription)
262255
return notifications_subscription
263256

264257
def list_devices(self, name=None, name_pattern=None, network_id=None,

devicehive/subscription.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,37 @@ class BaseSubscription(object):
2323

2424
ID_KEY = 'subscriptionId'
2525

26-
def __init__(self, api, subscription=None, call=None, args=None):
26+
def __init__(self, api, call, args):
2727
self._api = api
28-
self._id = None
29-
if subscription:
30-
self._id = subscription[self.ID_KEY]
3128
self._call = call
32-
self._args = args
29+
self._args = self._hashable_args(args)
30+
self._id = None
31+
32+
@staticmethod
33+
def _hashable_args(args):
34+
args = list(args)
35+
for i in range(len(args)):
36+
if not isinstance(args[i], list):
37+
continue
38+
args[i] = tuple(args[i])
39+
return tuple(args)
3340

3441
def _ensure_exists(self):
3542
if self._id:
3643
return
3744
raise SubscriptionError('Subscription does not exist.')
3845

46+
def _get_subscription_type(self):
47+
raise NotImplementedError
48+
49+
def subscribe(self):
50+
subscription = self._call(*self._args)
51+
self._id = subscription[self.ID_KEY]
52+
3953
@property
4054
def id(self):
4155
return self._id
4256

43-
def _get_subscription_type(self):
44-
raise NotImplementedError
45-
4657
def remove(self):
4758
self._ensure_exists()
4859
remove_subscription_api_request = RemoveSubscriptionApiRequest()
@@ -52,9 +63,8 @@ def remove(self):
5263
api_request.set('subscriptionId', self._id)
5364
api_request.remove_subscription_request(remove_subscription_api_request)
5465
api_request.execute('Unsubscribe failure.')
66+
self._api.remove_subscription(self)
5567
self._id = None
56-
if self._call and self._args:
57-
self._api.remove_subscription_call(self._call, self._args)
5868

5969

6070
class CommandsSubscription(BaseSubscription):

setup.py

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

2424

2525
setup(name='devicehive',
26-
version='2.1.5',
26+
version='2.1.6',
2727
author='DataArt (http://dataart.com)',
2828
author_email='info@devicehive.com',
2929
url='https://devicehive.com',

0 commit comments

Comments
 (0)