summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ick2/controllerapi.py17
-rw-r--r--ick2/state.py48
-rw-r--r--ick2/state_tests.py57
-rw-r--r--ick_controller.py3
4 files changed, 62 insertions, 63 deletions
diff --git a/ick2/controllerapi.py b/ick2/controllerapi.py
index 958b35d..c2d4ef4 100644
--- a/ick2/controllerapi.py
+++ b/ick2/controllerapi.py
@@ -30,12 +30,7 @@ class ControllerAPI:
def set_state_directory(self, dirname):
self._state.set_state_directory(dirname)
- def load_projects(self): # pragma: no cover
- return self._state.load_projects()
-
def find_missing_route(self, missing_path): # pragma: no cover
- self.load_projects()
-
apis = {
'/version': VersionAPI,
'/projects': ProjectAPI,
@@ -43,6 +38,7 @@ class ControllerAPI:
routes = []
for path in apis:
+ self._state.load_resources(path[1:])
api = apis[path](self._state)
routes.extend(api.get_routes(path))
ick2.log.log('info', msg_texg='Found routes', routes=routes)
@@ -179,21 +175,20 @@ class ProjectAPI(APIbase):
def list(self):
return {
- 'projects': self._state.get_projects(),
+ 'projects': self._state.get_resources('projects'),
}
def show(self, name):
- ick2.log.log('xxxxxxx')
- return self._state.get_project(name)
+ return self._state.get_resource('projects', name)
def create(self, body):
- return self._state.add_project(body)
+ return self._state.add_resource('projects', body['project'], body)
def update(self, body, name):
- return self._state.update_project(name, body)
+ return self._state.update_resource('projects', name, body)
def delete(self, name):
- self._state.remove_project(name)
+ self._state.remove_resource('projects', name)
def response(status_code, body, headers): # pragma: no cover
diff --git a/ick2/state.py b/ick2/state.py
index ab5d391..67cd057 100644
--- a/ick2/state.py
+++ b/ick2/state.py
@@ -34,52 +34,52 @@ class ControllerState:
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_resource_directory(self, type_name):
+ return os.path.join(self.get_state_directory(), type_name)
- def get_project_filename(self, project_name):
+ def get_resource_filename(self, type_name, project_name):
return os.path.join(
- self.get_project_directory(), project_name + '.yaml')
+ self.get_resource_directory(type_name), project_name + '.yaml')
- def load_projects(self):
+ def load_resources(self, type_name):
assert self._statedir is not None
- projects = []
- dirname = self.get_project_directory()
+ resources = []
+ dirname = self.get_resource_directory(type_name)
for filename in glob.glob(dirname + '/*.yaml'):
- obj = self.load_project(filename)
- projects.append(obj)
- return projects
+ obj = self.load_resource(filename)
+ resources.append(obj)
+ return resources
- def load_project(self, filename):
+ def load_resource(self, filename):
with open(filename, 'r') as f:
return yaml.safe_load(f)
- def get_projects(self):
- return self.load_projects()
+ def get_resources(self, type_name):
+ return self.load_resources(type_name)
- def get_project(self, project):
- filename = self.get_project_filename(project)
+ def get_resource(self, type_name, resource_name):
+ filename = self.get_resource_filename(type_name, resource_name)
if os.path.exists(filename):
- return self.load_project(filename)
+ return self.load_resource(filename)
raise NotFound()
- def add_project(self, project):
- filename = self.get_project_filename(project['project'])
+ def add_resource(self, type_name, resource_name, resource):
+ filename = self.get_resource_filename(type_name, resource_name)
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
+ yaml.safe_dump(resource, stream=f)
+ return resource
- def update_project(self, project, body):
- filename = self.get_project_filename(project)
+ def update_resource(self, type_name, resource_name, body):
+ filename = self.get_resource_filename(type_name, resource_name)
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)
+ def remove_resource(self, type_name, resource_name):
+ filename = self.get_resource_filename(type_name, resource_name)
if not os.path.exists(filename):
raise NotFound()
os.remove(filename)
diff --git a/ick2/state_tests.py b/ick2/state_tests.py
index 15a0a24..146ed6e 100644
--- a/ick2/state_tests.py
+++ b/ick2/state_tests.py
@@ -23,7 +23,7 @@ import unittest
import ick2
-class ControllerStateTests(unittest.TestCase):
+class StateTestsBase:
def setUp(self):
self.tempdir = tempfile.mkdtemp()
@@ -37,6 +37,9 @@ class ControllerStateTests(unittest.TestCase):
state.set_state_directory(self.statedir)
return state
+
+class ControllerStateTests(StateTestsBase, unittest.TestCase):
+
def test_has_no_state_directory_initially(self):
state = ick2.ControllerState()
self.assertTrue(state.get_state_directory() is None)
@@ -47,42 +50,46 @@ class ControllerStateTests(unittest.TestCase):
self.assertEqual(statedir, self.statedir)
self.assertTrue(os.path.exists(statedir))
- def test_has_not_projects_initially(self):
+
+class ResourceStateTests(StateTestsBase, unittest.TestCase):
+
+ def test_has_not_resources_initially(self):
state = self.create_state()
- self.assertEqual(state.get_projects(), [])
+ self.assertEqual(state.get_resources('project'), [])
- def test_creates_project(self):
+ def test_creates_resource(self):
project = {
'project': 'foo',
'shell_steps': ['build'],
}
state = self.create_state()
- state.add_project(project)
- self.assertEqual(state.get_projects(), [project])
- self.assertTrue(os.path.exists(state.get_project_filename('foo')))
+ state.add_resource('projects', project['project'], project)
+ self.assertEqual(state.get_resources('projects'), [project])
+ self.assertTrue(
+ os.path.exists(state.get_resource_filename('projects', 'foo')))
- def test_loads_projects_from_state_directory(self):
+ def test_loads_resource_from_state_directory(self):
project = {
'project': 'foo',
'shell_steps': ['build'],
}
state = self.create_state()
- state.add_project(project)
+ state.add_resource('projects', project['project'], project)
state2 = self.create_state()
- state2.load_projects()
- self.assertEqual(state2.get_projects(), [project])
+ state2.load_resources('projects')
+ self.assertEqual(state2.get_resources('projects'), [project])
- def test_gets_named_project(self):
+ def test_gets_named_resource(self):
project = {
'project': 'foo',
'shell_steps': ['build'],
}
state = self.create_state()
- state.add_project(project)
- self.assertEqual(state.get_project('foo'), project)
+ state.add_resource('projects', project['project'], project)
+ self.assertEqual(state.get_resource('projects', 'foo'), project)
- def test_updates_named_project(self):
+ def test_updates_named_resource(self):
project_v1 = {
'project': 'foo',
'shell_steps': ['build'],
@@ -90,24 +97,24 @@ class ControllerStateTests(unittest.TestCase):
project_v2 = dict(project_v1)
project_v2['shell_steps'] = ['build it using magic']
state = self.create_state()
- state.add_project(project_v1)
- updated = state.update_project('foo', project_v2)
+ state.add_resource('projects', 'foo', project_v1)
+ updated = state.update_resource('projects', 'foo', project_v2)
self.assertEqual(updated, project_v2)
- self.assertEqual(state.get_project('foo'), project_v2)
+ self.assertEqual(state.get_resource('projects', 'foo'), project_v2)
- def test_deletes_named_project(self):
+ def test_deletes_named_resource(self):
project = {
'project': 'foo',
'shell_steps': ['build'],
}
state = self.create_state()
- state.add_project(project)
- state.remove_project('foo')
- self.assertEqual(state.get_projects(), [])
+ state.add_resource('projects', project['project'], project)
+ state.remove_resource('projects', 'foo')
+ self.assertEqual(state.get_resources('projects'), [])
with self.assertRaises(ick2.NotFound):
- state.get_project('foo')
+ state.get_resource('projects', 'foo')
- def test_raises_error_deleting_missing_project(self):
+ def test_raises_error_deleting_missing_resource(self):
state = self.create_state()
with self.assertRaises(ick2.NotFound):
- state.remove_project('foo')
+ state.remove_resource('projects', 'foo')
diff --git a/ick_controller.py b/ick_controller.py
index a7a1c51..58b05e8 100644
--- a/ick_controller.py
+++ b/ick_controller.py
@@ -86,9 +86,6 @@ def main():
ick2.log.log(
'info', msg_text='called ControllerAPI.set_state_directory')
- api.load_projects()
- ick2.log.log('info', msg_text='called ControllerAPI.load_projects')
-
application = apifw.create_bottle_application(
api, counter, dict_logger, config)
ick2.log.log('info', msg_text='called apifw.create_bottle_application')