diff options
author | Lars Wirzenius <liw@liw.fi> | 2017-08-06 11:46:02 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2017-08-06 18:56:34 +0300 |
commit | 6299228754893813341085d99c3924f7fefe1c18 (patch) | |
tree | 432e9f076b3b226487b8a77359545adba50e1714 /ick2/controllerapi.py | |
parent | 888db73b93aefe70d838d499f7f9cc43eee7372b (diff) | |
download | ick2-6299228754893813341085d99c3924f7fefe1c18.tar.gz |
Add: ControllerAPI, ControllerState
Diffstat (limited to 'ick2/controllerapi.py')
-rw-r--r-- | ick2/controllerapi.py | 120 |
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) |