From fe61a295daed3920760b1c72431615636e879e96 Mon Sep 17 00:00:00 2001 From: Joel Collins Date: Thu, 30 Apr 2020 17:16:28 +0100 Subject: [PATCH 1/2] Added LabThing-level property and action builders --- examples/builder.py | 32 +++++++++++++++----------------- labthings/server/labthing.py | 13 +++++++++++++ 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/examples/builder.py b/examples/builder.py index 38f58403..eae286e7 100644 --- a/examples/builder.py +++ b/examples/builder.py @@ -28,27 +28,25 @@ labthing.add_component(my_component, "org.labthings.example.mycomponent") # Add routes for the API views we created -labthing.add_view( - property_of(my_component, "magic_denoise", description="A magic denoise property"), - "/denoise", + +labthing.build_property( + my_component, "magic_denoise", "/denoise", description="A magic denoise property", ) -labthing.add_view( - property_of( - my_component, - "magic_dictionary", - description="A big dictionary of little properties", - ), + +labthing.build_property( + my_component, + "magic_dictionary", "/dictionary", + description="A big dictionary of little properties", ) -labthing.add_view( - action_from( - my_component.average_data, - description="Take an averaged measurement", - task=True, # Is the action a long-running task? - safe=True, # Is the state of the Thing unchanged by calling the action? - idempotent=True, # Can the action be called repeatedly with the same result? - ), + +labthing.build_action( + my_component.average_data, "/average", + description="Take an averaged measurement", + task=True, # Is the action a long-running task? + safe=True, # Is the state of the Thing unchanged by calling the action? + idempotent=True, # Can the action be called repeatedly with the same result? ) diff --git a/labthings/server/labthing.py b/labthings/server/labthing.py index 23fe03f3..6924a4e6 100644 --- a/labthings/server/labthing.py +++ b/labthings/server/labthing.py @@ -19,12 +19,16 @@ from .decorators import tag from .sockets import Sockets +from .view.builder import property_of, action_from + from .default_views.extensions import ExtensionList from .default_views.tasks import TaskList, TaskView from .default_views.docs import docs_blueprint, SwaggerUIView from .default_views.root import RootView from .default_views.sockets import socket_handler +from typing import Callable + import weakref import logging @@ -333,3 +337,12 @@ def add_root_link(self, view, rel, kwargs=None, params=None): if params is None: params = {} self.thing_description.add_link(view, rel, kwargs=kwargs, params=params) + + # Convenience methods + def build_property( + self, property_object: object, property_name: str, *urls, **kwargs + ): + self.add_view(property_of(property_object, property_name, **kwargs), *urls) + + def build_action(self, function: Callable, *urls, **kwargs): + self.add_view(action_from(function, **kwargs), *urls) From ffe795298c7ac069b522a78e9958ff3222804274 Mon Sep 17 00:00:00 2001 From: Joel Collins Date: Thu, 30 Apr 2020 17:17:00 +0100 Subject: [PATCH 2/2] Added specific error-log handler to server --- labthings/server/wsgi/gevent.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/labthings/server/wsgi/gevent.py b/labthings/server/wsgi/gevent.py index 85f11c27..92be94ff 100644 --- a/labthings/server/wsgi/gevent.py +++ b/labthings/server/wsgi/gevent.py @@ -12,7 +12,14 @@ class Server: def __init__( - self, app, host="0.0.0.0", port=7485, log=None, debug=False, zeroconf=True + self, + app, + host="0.0.0.0", + port=7485, + log=None, + error_log=None, + debug=False, + zeroconf=True, ): self.app = app # Find LabThing attached to app @@ -22,6 +29,7 @@ def __init__( self.host = host self.port = port self.log = log + self.error_log = error_log self.debug = debug self.zeroconf = zeroconf @@ -79,6 +87,8 @@ def start(self): # Handle logging if not self.log: self.log = logging.getLogger() + if not self.error_log: + self.error_log = logging.getLogger() # Handle debug mode if self.debug: @@ -114,7 +124,7 @@ def start(self): self.stop() # pragma: no cover def run( - self, host=None, port=None, log=None, debug=None, zeroconf=None, + self, host=None, port=None, log=None, error_log=None, debug=None, zeroconf=None, ): """Starts the server allowing for runtime parameters. Designed to immitate the old Flask app.run style of starting an app @@ -135,6 +145,9 @@ def run( if log is not None: self.log = log + if error_log is not None: + self.error_log = error_log + if debug is not None: self.debug = debug