summaryrefslogtreecommitdiff
path: root/ick2/state.py
diff options
context:
space:
mode:
Diffstat (limited to 'ick2/state.py')
-rw-r--r--ick2/state.py83
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')