Skip to content
This repository was archived by the owner on Jun 7, 2021. It is now read-only.

Commit 96a9def

Browse files
pimoensmrstegeman
authored andcommitted
Subscriber abstracted class (#64)
1 parent 5b779b5 commit 96a9def

4 files changed

Lines changed: 96 additions & 52 deletions

File tree

webthing/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
from .event import Event
66
from .property import Property
77
from .server import MultipleThings, SingleThing, WebThingServer
8+
from .subscriber import Subscriber
89
from .thing import Thing
910
from .value import Value

webthing/server.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import tornado.websocket
1212

1313
from .errors import PropertyError
14+
from .subscriber import Subscriber
1415
from .utils import get_addresses, get_ip
1516

1617

@@ -161,7 +162,7 @@ def get(self):
161162
self.write(json.dumps(descriptions))
162163

163164

164-
class ThingHandler(tornado.websocket.WebSocketHandler):
165+
class ThingHandler(tornado.websocket.WebSocketHandler, Subscriber):
165166
"""Handle a request to /."""
166167

167168
def initialize(self, things, hosts):
@@ -341,6 +342,47 @@ def check_origin(self, origin):
341342
"""Allow connections from all origins."""
342343
return True
343344

345+
def update_property(self, property_):
346+
"""
347+
Send an update about a Property.
348+
349+
:param property_: Property
350+
"""
351+
message = json.dumps({
352+
'messageType': 'propertyStatus',
353+
'data': {
354+
property_.name: property_.get_value(),
355+
}
356+
})
357+
358+
self.write_message(message)
359+
360+
def update_action(self, action):
361+
"""
362+
Send an update about an Action.
363+
364+
:param action: Action
365+
"""
366+
message = json.dumps({
367+
'messageType': 'actionStatus',
368+
'data': action.as_action_description(),
369+
})
370+
371+
self.write_message(message)
372+
373+
def update_event(self, event):
374+
"""
375+
Send an update about an Event.
376+
377+
:param event: Event
378+
"""
379+
message = json.dumps({
380+
'messageType': 'event',
381+
'data': event.as_event_description(),
382+
})
383+
384+
self.write_message(message)
385+
344386

345387
class PropertiesHandler(BaseHandler):
346388
"""Handle a request to /properties."""

webthing/subscriber.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"""High-level Subscriber base class implementation."""
2+
3+
4+
class Subscriber:
5+
"""Abstract Subscriber class."""
6+
7+
def update_property(self, property_):
8+
"""
9+
Send an update about a Property.
10+
11+
:param property_: Property
12+
"""
13+
raise NotImplementedError
14+
15+
def update_action(self, action):
16+
"""
17+
Send an update about an Action.
18+
19+
:param action: Action
20+
"""
21+
raise NotImplementedError
22+
23+
def update_event(self, event):
24+
"""
25+
Send an update about an Event.
26+
27+
:param event: Event
28+
"""
29+
raise NotImplementedError

webthing/thing.py

Lines changed: 23 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
from jsonschema import validate
44
from jsonschema.exceptions import ValidationError
5-
import json
6-
import tornado.websocket
75

86

97
class Thing:
@@ -391,99 +389,73 @@ def add_available_action(self, name, metadata, cls):
391389
}
392390
self.actions[name] = []
393391

394-
def add_subscriber(self, ws):
392+
def add_subscriber(self, subscriber):
395393
"""
396394
Add a new websocket subscriber.
397395
398-
ws -- the websocket
396+
:param subscriber: Subscriber
399397
"""
400-
self.subscribers.add(ws)
398+
self.subscribers.add(subscriber)
401399

402-
def remove_subscriber(self, ws):
400+
def remove_subscriber(self, subscriber):
403401
"""
404402
Remove a websocket subscriber.
405403
406-
ws -- the websocket
404+
:param subscriber: Subscriber
407405
"""
408-
if ws in self.subscribers:
409-
self.subscribers.remove(ws)
406+
if subscriber in self.subscribers:
407+
self.subscribers.remove(subscriber)
410408

411409
for name in self.available_events:
412-
self.remove_event_subscriber(name, ws)
410+
self.remove_event_subscriber(name, subscriber)
413411

414-
def add_event_subscriber(self, name, ws):
412+
def add_event_subscriber(self, name, subscriber):
415413
"""
416414
Add a new websocket subscriber to an event.
417415
418-
name -- name of the event
419-
ws -- the websocket
416+
:param name: Name of the event
417+
:param subscriber: Subscriber
420418
"""
421419
if name in self.available_events:
422-
self.available_events[name]['subscribers'].add(ws)
420+
self.available_events[name]['subscribers'].add(subscriber)
423421

424-
def remove_event_subscriber(self, name, ws):
422+
def remove_event_subscriber(self, name, subscriber):
425423
"""
426424
Remove a websocket subscriber from an event.
427425
428-
name -- name of the event
429-
ws -- the websocket
426+
:param name: Name of the event
427+
:param subscriber: Subscriber
430428
"""
431429
if name in self.available_events and \
432-
ws in self.available_events[name]['subscribers']:
433-
self.available_events[name]['subscribers'].remove(ws)
430+
subscriber in self.available_events[name]['subscribers']:
431+
self.available_events[name]['subscribers'].remove(subscriber)
434432

435433
def property_notify(self, property_):
436434
"""
437435
Notify all subscribers of a property change.
438436
439-
property_ -- the property that changed
437+
:param property_: the property that changed
440438
"""
441-
message = json.dumps({
442-
'messageType': 'propertyStatus',
443-
'data': {
444-
property_.name: property_.get_value(),
445-
}
446-
})
447-
448439
for subscriber in list(self.subscribers):
449-
try:
450-
subscriber.write_message(message)
451-
except tornado.websocket.WebSocketClosedError:
452-
pass
440+
subscriber.update_property(property_)
453441

454442
def action_notify(self, action):
455443
"""
456444
Notify all subscribers of an action status change.
457445
458-
action -- the action whose status changed
446+
:param action: The action whose status changed
459447
"""
460-
message = json.dumps({
461-
'messageType': 'actionStatus',
462-
'data': action.as_action_description(),
463-
})
464-
465448
for subscriber in list(self.subscribers):
466-
try:
467-
subscriber.write_message(message)
468-
except tornado.websocket.WebSocketClosedError:
469-
pass
449+
subscriber.update_action(action)
470450

471451
def event_notify(self, event):
472452
"""
473453
Notify all subscribers of an event.
474454
475-
event -- the event that occurred
455+
:param event: The event that occurred
476456
"""
477457
if event.name not in self.available_events:
478458
return
479459

480-
message = json.dumps({
481-
'messageType': 'event',
482-
'data': event.as_event_description(),
483-
})
484-
485460
for subscriber in self.available_events[event.name]['subscribers']:
486-
try:
487-
subscriber.write_message(message)
488-
except tornado.websocket.WebSocketClosedError:
489-
pass
461+
subscriber.update_event(event)

0 commit comments

Comments
 (0)