From f39b4f955e855897414610c729fc6da9ab2df2f1 Mon Sep 17 00:00:00 2001 From: Elena ``of Valhalla'' Grandi Date: Mon, 10 Jun 2019 11:44:51 +0200 Subject: Add ctl command to add arbitrary objects --- pyapd/app.py | 2 +- pyapd/ctl.py | 36 +++++++++++++++++++++++------------- tests/test_ctl.py | 32 +++++++++++++++++++++++++++----- 3 files changed, 51 insertions(+), 19 deletions(-) diff --git a/pyapd/app.py b/pyapd/app.py index 39948ee..a1ef7bf 100644 --- a/pyapd/app.py +++ b/pyapd/app.py @@ -25,7 +25,7 @@ class App(tornado.web.Application): def __init__(self, config, *args, **kw): self.config = config self.store = getattr(stores, self.config.backend).Store() - self.ctl = ctl.CtlServer(config) + self.ctl = ctl.CtlServer(self) urls = [ (r'/', RootHandler), URLSpec(r'/object/(.*)', handler=ObjectHandler), diff --git a/pyapd/ctl.py b/pyapd/ctl.py index 8be523d..fa86ccd 100644 --- a/pyapd/ctl.py +++ b/pyapd/ctl.py @@ -7,21 +7,29 @@ import tornado.netutil import tornado.ioloop import tornado.iostream +from . import objects +from . import app as apd_app + class Commands(): - def __init__(self): - pass + def __init__(self, srv): + self.srv = srv def ping(self): return "pong" + def add_object(self, obj: dict): + new_obj = objects.Object(**obj) + self.srv.app.store.add(new_obj) + return "ok" + class CtlServer(): - def __init__(self, config): - self.commands = Commands() - self.config = config + def __init__(self, app): + self.commands = Commands(self) + self.app = app self.ctl_socket = tornado.netutil.bind_unix_socket( - self.config.ctl_socket, + self.app.config.ctl_socket, ) io_loop = tornado.ioloop.IOLoop.current() io_loop.add_handler( @@ -50,14 +58,16 @@ class CtlServer(): # stream.write(res.encode()) print("command result was:", res) - async def get_command(self, message): + async def get_command(self, message: str): args = json.loads(message) - cmd = args.pop('command') - try: - res = getattr(self.commands, cmd)(*args) - except AttributeError: + cmd_name = args.pop('command') + cmd = getattr(self.commands, cmd_name) + if not cmd: res = "no such command" - except TypeError: - res = "syntax error" + else: + try: + res = cmd(**args) + except TypeError: + res = "syntax error" # TODO: wrap res in a sensible json return res diff --git a/tests/test_ctl.py b/tests/test_ctl.py index ddac775..f58ce5a 100644 --- a/tests/test_ctl.py +++ b/tests/test_ctl.py @@ -3,18 +3,40 @@ import tempfile from tornado.testing import AsyncTestCase, gen_test -from pyapd import ctl, config +from pyapd import ctl, config, app -class TestCtlServer(AsyncTestCase): +class TestCtlServerCommands(AsyncTestCase): def setUp(self): super().setUp() self.tempdir = tempfile.TemporaryDirectory() - conf = config.Config('tests/data/test_config.yaml') - conf.ctl_socket = os.path.join(self.tempdir.name, 'pyapd.sock') - self.ctl_server = ctl.CtlServer(conf) + test_app = app.App(config.Config('tests/data/test_config.yaml')) + test_app.config.ctl_socket = os.path.join( + self.tempdir.name, + 'pyapd.sock' + ) + self.ctl_server = ctl.CtlServer(test_app) @gen_test def test_ping_command(self): res = yield self.ctl_server.get_command('{"command": "ping"}') self.assertIn('pong', res) + + @gen_test + def test_add_object_command(self): + self.assertEqual(len(self.ctl_server.app.store.objects), 0) + obj = ''' + { + "id": "http://example.org/123456", + "type": "object" + } + ''' + res = yield (self.ctl_server.get_command(''' + {{ + "command": "add_object", + "obj": {obj} + }} + '''.format(obj=obj) + )) + self.assertIn('ok', res) + self.assertEqual(len(self.ctl_server.app.store.objects), 1) -- cgit v1.2.3