summaryrefslogtreecommitdiff
path: root/ick2/controllerapi.py
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2017-08-06 11:46:02 +0300
committerLars Wirzenius <liw@liw.fi>2017-08-06 18:56:34 +0300
commit6299228754893813341085d99c3924f7fefe1c18 (patch)
tree432e9f076b3b226487b8a77359545adba50e1714 /ick2/controllerapi.py
parent888db73b93aefe70d838d499f7f9cc43eee7372b (diff)
downloadick2-6299228754893813341085d99c3924f7fefe1c18.tar.gz
Add: ControllerAPI, ControllerState
Diffstat (limited to 'ick2/controllerapi.py')
-rw-r--r--ick2/controllerapi.py120
1 files changed, 120 insertions, 0 deletions
diff --git a/ick2/controllerapi.py b/ick2/controllerapi.py
new file mode 100644
index 0000000..c2b3213
--- /dev/null
+++ b/ick2/controllerapi.py
@@ -0,0 +1,120 @@
+# Copyright (C) 2017 Lars Wirzenius
+
+
+import glob
+import os
+
+
+import apifw
+import yaml
+
+
+import ick2
+
+
+class ControllerAPI:
+
+ def __init__(self):
+ self._state = ick2.ControllerState()
+
+ def get_state_directory(self):
+ return self._state.get_state_directory()
+
+ def set_state_directory(self, dirname):
+ self._state.set_state_directory(dirname)
+
+ def load_projects(self):
+ return self._state.load_projects()
+
+ def find_missing_route(self, path): # pragma: no cover
+ return [
+ {
+ 'method': 'POST',
+ 'path': '/projects',
+ 'callback': self.post_callback(self.post_projects),
+ },
+ {
+ 'method': 'GET',
+ 'path': '/projects',
+ 'callback': self.get_callback(self.get_projects),
+ },
+ {
+ 'method': 'GET',
+ 'path': '/projects/<project>',
+ 'callback': self.get_callback(self.get_project),
+ },
+ {
+ 'method': 'PUT',
+ 'path': '/projects/<project>',
+ 'callback': self.put_callback(self.put_projects),
+ },
+ {
+ 'method': 'DELETE',
+ 'path': '/projects/<project>',
+ 'callback': self.get_callback(self.delete_projects),
+ },
+ ]
+
+ def get_callback(self, callback): # pragma: no cover
+ def wrapper(content_type, body, **kwargs):
+ try:
+ body = callback(**kwargs)
+ except ick2.NotFound as e:
+ return apifw.Response({
+ 'status': apifw.HTTP_NOT_FOUND,
+ 'body': str(e),
+ 'headers': [],
+ })
+ return apifw.Response({
+ 'status': apifw.HTTP_OK,
+ 'body': body,
+ 'headers': {
+ 'Content-Type': 'application/json',
+ },
+ })
+ return wrapper
+
+ def post_callback(self, callback): # pragma: no cover
+ def wrapper(content_type, body):
+ body = callback(body)
+ ick2.log.log('trace', msg_text='returned body', body=repr(body))
+ return apifw.Response({
+ 'status': apifw.HTTP_CREATED,
+ 'body': body,
+ 'headers': {
+ 'Content-Type': 'application/json',
+ },
+ })
+ return wrapper
+
+ def put_callback(self, callback): # pragma: no cover
+ def wrapper(content_type, body, **kwargs):
+ body = callback(body, **kwargs)
+ ick2.log.log('trace', msg_text='returned body', body=repr(body))
+ return apifw.Response({
+ 'status': apifw.HTTP_OK,
+ 'body': body,
+ 'headers': {
+ 'Content-Type': 'application/json',
+ },
+ })
+ return wrapper
+
+ def get_projects(self):
+ return {
+ 'projects': self._state.get_projects(),
+ }
+
+ def get_project(self, project=None):
+ assert project is not None
+ return self._state.get_project(project)
+
+ def post_projects(self, project):
+ return self._state.add_project(project)
+
+ def put_projects(self, body, project=None):
+ assert project is not None
+ return self._state.update_project(project, body)
+
+ def delete_projects(self, project):
+ self._state.remove_project(project)