diff options
Diffstat (limited to 'ick2/state.py')
-rw-r--r-- | ick2/state.py | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/ick2/state.py b/ick2/state.py new file mode 100644 index 0000000..3d4199f --- /dev/null +++ b/ick2/state.py @@ -0,0 +1,83 @@ +# Copyright (C) 2017 Lars Wirzenius + + +import glob +import os + + +import apifw +import yaml + + +import ick2 + + +class ControllerState: + + def __init__(self): + self._statedir = None + + def get_state_directory(self): + return self._statedir + + def set_state_directory(self, dirname): + self._statedir = dirname + if not os.path.exists(self._statedir): + os.makedirs(self._statedir) + + def get_project_directory(self): + return os.path.join(self.get_state_directory(), 'projects') + + def get_project_filename(self, project_name): + return os.path.join( + self.get_project_directory(), project_name + '.yaml') + + def load_projects(self): + assert self._statedir is not None + projects = [] + dirname = self.get_project_directory() + for filename in glob.glob(dirname + '/*.yaml'): + obj = self.load_project(filename) + projects.append(obj) + return projects + + def load_project(self, filename): + with open(filename, 'r') as f: + return yaml.safe_load(f) + + def get_projects(self): + return self.load_projects() + + def get_project(self, project): + filename = self.get_project_filename(project) + if os.path.exists(filename): + return self.load_project(filename) + raise NotFound() + + def add_project(self, project): + filename = self.get_project_filename(project['project']) + dirname = os.path.dirname(filename) + if not os.path.exists(dirname): + os.makedirs(dirname) + with open(filename, 'w') as f: + yaml.safe_dump(project, stream=f) + return project + + def update_project(self, project, body): + filename = self.get_project_filename(project) + dirname = os.path.dirname(filename) + with open(filename, 'w') as f: + yaml.safe_dump(body, stream=f) + return body + + def remove_project(self, project): + filename = self.get_project_filename(project) + if not os.path.exists(filename): + raise NotFound() + os.remove(filename) + + +class NotFound(Exception): + + def __init__(self): + super().__init__('Resource not found') |