diff options
-rw-r--r-- | ick2/controllerapi.py | 17 | ||||
-rw-r--r-- | ick2/state.py | 48 | ||||
-rw-r--r-- | ick2/state_tests.py | 57 | ||||
-rw-r--r-- | ick_controller.py | 3 |
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') |