Skip to content

Commit 463ce8c

Browse files
committed
Created proper Event class
1 parent 282d6c0 commit 463ce8c

File tree

6 files changed

+48
-18
lines changed

6 files changed

+48
-18
lines changed

src/labthings/server/decorators.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ def wrapped(*args, **kwargs):
191191

192192
if current_labthing():
193193
current_labthing().emit(
194-
{property_name: property_value}, type="propertyStatus"
194+
"propertyStatus", {property_name: property_value},
195195
)
196196

197197
return original_response

src/labthings/server/event.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import datetime
2+
3+
4+
class Event:
5+
def __init__(self, name, schema=None):
6+
self.name = name
7+
self.schema = schema
8+
9+
self.events = [] # TODO: Make rotating
10+
11+
def emit(self, data):
12+
response = {
13+
"messageType": self.name,
14+
"timestamp": datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
15+
"data": data,
16+
} # TODO: Format data with schema
17+
self.events.append(response)
18+
return response

src/labthings/server/labthing.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from .spec.td import ThingDescription
2121
from .decorators import tag
2222
from .sockets import Sockets
23+
from .event import Event
2324

2425
from .view.builder import property_of, action_from
2526

@@ -55,6 +56,8 @@ def __init__(
5556

5657
self.extensions = {}
5758

59+
self.events = {}
60+
5861
self.views = []
5962
self._property_views = {}
6063
self._action_views = {}
@@ -163,6 +166,10 @@ def init_app(self, app):
163166
self.sockets = Sockets(app)
164167
self._create_base_sockets()
165168

169+
# Create base events
170+
self.add_event("propertyStatus")
171+
self.add_event("logging")
172+
166173
def _create_base_routes(self):
167174
# Add root representation
168175
self.add_view(RootView, "/", endpoint="root")
@@ -320,17 +327,19 @@ def _register_view(self, app, view, *urls, endpoint=None, **kwargs):
320327
self._property_views[view.endpoint] = view
321328

322329
# Event stuff
323-
def emit(self, data: dict, type="event"):
324-
"""Emit an event to all subscribers
330+
def add_event(self, name, schema=None):
331+
# TODO: Handle schema
332+
# TODO: Add view for event, returning list of Event.events
333+
self.events[name] = Event(name, schema=schema)
334+
self.thing_description.event(self.events[name])
325335

326-
Arguments:
327-
data {dict} -- Event data
328-
329-
Keyword Arguments:
330-
type {str} -- Event type (default: {"event"})
336+
def emit(self, event_type: str, data: dict):
337+
"""
338+
Emit an event to all subscribers
331339
"""
340+
event_response = self.events[event_type].emit(data)
332341
for sub in self.subscribers:
333-
sub.emit({"messageType": type, "data": data})
342+
sub.emit(event_response)
334343

335344
# Utilities
336345

src/labthings/server/logging.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,7 @@ def emit(self, record):
1313

1414
# Broadcast to subscribers
1515
if current_labthing():
16-
current_labthing().emit(log_event)
16+
current_labthing().emit("logging", log_event)
1717

1818
def rest_format_record(self, record):
19-
data = {
20-
"data": str(record.msg),
21-
"timestamp": datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
22-
}
23-
level_string = record.levelname.lower()
24-
25-
return {level_string: data}
19+
return {"message": str(record.msg), "level": record.levelname.lower()}

src/labthings/server/spec/td.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import weakref
44

55
from ..view import View
6+
from ..event import Event
67

78
from .utilities import get_spec, convert_schema, schema_to_json, get_topmost_spec_attr
89
from .paths import rule_to_params, rule_to_path
@@ -92,12 +93,17 @@ def to_dict(self):
9293
"description": current_labthing().description,
9394
"properties": self.properties,
9495
"actions": self.actions,
96+
# "events": self.events, # TODO: Enable once properly populated
9597
"links": self.links,
9698
# TODO: Add proper security schemes
9799
"securityDefinitions": {"nosec_sc": {"scheme": "nosec"}},
98100
"security": ["nosec_sc"],
99101
}
100102

103+
def event_to_thing_event(self, event: Event):
104+
# TODO: Include event schema
105+
return {"forms": []}
106+
101107
def view_to_thing_property(self, rules: list, view: View):
102108
prop_urls = [rule_to_path(rule) for rule in rules]
103109

@@ -237,3 +243,6 @@ def build_forms_for_view(self, rules: list, view: View, op: list):
237243
forms.append({"op": op, "href": url, "contentType": content_type})
238244

239245
return forms
246+
247+
def event(self, event: Event):
248+
self.events[event.name] = self.event_to_thing_event(event)

tests/test_server_default_views_socket_handler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ def test_socket_handler(thing_ctx, fake_websocket):
77
socket_handler(ws)
88
# Only responses should be announcing new subscribers
99
for response in ws.responses:
10-
assert '"data": "Added subscriber' in response
10+
assert '"message": "Added subscriber' in response

0 commit comments

Comments
 (0)