diff options
author | Lars Wirzenius <liw@liw.fi> | 2017-10-16 18:21:12 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2017-10-16 18:21:12 +0300 |
commit | baf79ed645e61762e4155b83183c2765a470bf8d (patch) | |
tree | 03a86b9abffa5d93fa865adfc5f5c81b7c6fc7d0 /ick2 | |
parent | 180e7fe74959914c551d1c742d79e5751e25e793 (diff) | |
download | ick2-baf79ed645e61762e4155b83183c2765a470bf8d.tar.gz |
Refactor: break ControllerAPI into VersionAPI, ProjectAPI
Diffstat (limited to 'ick2')
-rw-r--r-- | ick2/__init__.py | 6 | ||||
-rw-r--r-- | ick2/controllerapi.py | 134 | ||||
-rw-r--r-- | ick2/controllerapi_tests.py | 57 |
3 files changed, 145 insertions, 52 deletions
diff --git a/ick2/__init__.py b/ick2/__init__.py index e24092e..605c6fa 100644 --- a/ick2/__init__.py +++ b/ick2/__init__.py @@ -16,4 +16,8 @@ from .version import __version__, __version_info__ from .logging import setup_logging, log from .state import ControllerState, NotFound -from .controllerapi import ControllerAPI +from .controllerapi import ( + ControllerAPI, + ProjectAPI, + VersionAPI, +) diff --git a/ick2/controllerapi.py b/ick2/controllerapi.py index cb553d7..958b35d 100644 --- a/ick2/controllerapi.py +++ b/ick2/controllerapi.py @@ -30,62 +30,83 @@ class ControllerAPI: def set_state_directory(self, dirname): self._state.set_state_directory(dirname) - def load_projects(self): + def load_projects(self): # pragma: no cover return self._state.load_projects() - def find_missing_route(self, path): # pragma: no cover + def find_missing_route(self, missing_path): # pragma: no cover + self.load_projects() + + apis = { + '/version': VersionAPI, + '/projects': ProjectAPI, + } + + routes = [] + for path in apis: + api = apis[path](self._state) + routes.extend(api.get_routes(path)) + ick2.log.log('info', msg_texg='Found routes', routes=routes) + return routes + + +class APIbase: # pragma: no cover + + def __init__(self, state): + self._state = state + + def get_routes(self, path): return [ { - 'method': 'GET', - 'path': '/version', - 'callback': self.GET(self.get_version), - }, - { 'method': 'POST', - 'path': '/projects', - 'callback': self.POST(self.post_projects), + 'path': path, + 'callback': self.POST(self.create), }, { 'method': 'GET', - 'path': '/projects', - 'callback': self.GET(self.get_projects), + 'path': path, + 'callback': self.GET(self.list), }, { 'method': 'GET', - 'path': '/projects/<project>', - 'callback': self.GET(self.get_project), + 'path': '{}/<name>'.format(path), + 'callback': self.GET(self.show), }, { 'method': 'PUT', - 'path': '/projects/<project>', - 'callback': self.PUT(self.put_projects), + 'path': '{}/<name>'.format(path), + 'callback': self.PUT(self.update), }, { 'method': 'DELETE', - 'path': '/projects/<project>', - 'callback': self.DELETE(self.delete_projects), + 'path': '{}/<name>'.format(path), + 'callback': self.DELETE(self.delete), }, ] - def GET(self, callback): # pragma: no cover + def GET(self, callback): def wrapper(content_type, body, **kwargs): + ick2.log.log( + 'xxx', msg_text='GET called', kwargs=kwargs, + content_type=content_type, body=body) try: if 'raw_uri_path' in kwargs: del kwargs['raw_uri_path'] - body = callback(**kwargs) + body = callback(**kwargs) + ick2.log.log( + 'xxx', msg_text='GET callback returned', body=body) except ick2.NotFound as e: return not_found(e) return OK(body) return wrapper - def POST(self, callback): # pragma: no cover + def POST(self, callback): def wrapper(content_type, body, **kwargs): body = callback(body) ick2.log.log('trace', msg_text='returned body', body=repr(body)) return created(body) return wrapper - def PUT(self, callback): # pragma: no cover + def PUT(self, callback): def wrapper(content_type, body, **kwargs): if 'raw_uri_path' in kwargs: del kwargs['raw_uri_path'] @@ -94,7 +115,7 @@ class ControllerAPI: return OK(body) return wrapper - def DELETE(self, callback): # pragma: no cover + def DELETE(self, callback): def wrapper(content_type, body, **kwargs): try: if 'raw_uri_path' in kwargs: @@ -105,27 +126,74 @@ class ControllerAPI: return OK(body) return wrapper + def create(self, body): + raise NotImplementedError() + + def update(self, body, name): + raise NotImplementedError() + + def delete(self, name): + raise NotImplementedError() + + def list(self): + raise NotImplementedError() + + def show(self, name): + raise NotImplementedError() + + +class VersionAPI(APIbase): + + def __init__(self, state): + super().__init__(state) + + def get_routes(self, path): # pragma: no cover + return [ + { + 'method': 'GET', + 'path': path, + 'callback': self.GET(self.get_version), + } + ] + def get_version(self): return {'version': ick2.__version__} - def get_projects(self): + def create(self, *args): # pragma: no cover + pass + + def update(self, *args): # pragma: no cover + pass + + def delete(self, *args): # pragma: no cover + pass + + def list(self): # pragma: no cover + pass + + def show(self, *args): # pragma: no cover + pass + + +class ProjectAPI(APIbase): + + def list(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 show(self, name): + ick2.log.log('xxxxxxx') + return self._state.get_project(name) - def post_projects(self, project): - return self._state.add_project(project) + def create(self, body): + return self._state.add_project(body) - def put_projects(self, body, project=None): - assert project is not None - return self._state.update_project(project, body) + def update(self, body, name): + return self._state.update_project(name, body) - def delete_projects(self, project): - self._state.remove_project(project) + def delete(self, name): + self._state.remove_project(name) def response(status_code, body, headers): # pragma: no cover diff --git a/ick2/controllerapi_tests.py b/ick2/controllerapi_tests.py index e37dff4..42d1003 100644 --- a/ick2/controllerapi_tests.py +++ b/ick2/controllerapi_tests.py @@ -47,8 +47,15 @@ class ControllerAPITests(unittest.TestCase): self.assertEqual(statedir, self.statedir) self.assertTrue(os.path.exists(statedir)) + +class VersionAPITests(unittest.TestCase): + + def create_api(self): + api = ick2.VersionAPI(None) + return api + def test_returns_version_correcly(self): - api = self.create_api() + api = ick2.VersionAPI(None) response = api.get_version() self.assertEqual( response, @@ -57,9 +64,24 @@ class ControllerAPITests(unittest.TestCase): } ) + +class ProjectAPITests(unittest.TestCase): + + def setUp(self): + self.tempdir = tempfile.mkdtemp() + self.statedir = os.path.join(self.tempdir, 'state/dir') + self.state = ick2.ControllerState() + self.state.set_state_directory(self.statedir) + + def tearDown(self): + shutil.rmtree(self.tempdir) + + def create_api(self): + return ick2.ProjectAPI(self.state) + def test_has_not_projects_initially(self): api = self.create_api() - self.assertEqual(api.get_projects(), {'projects': []}) + self.assertEqual(api.list(), {'projects': []}) def test_creates_project(self): project = { @@ -67,8 +89,8 @@ class ControllerAPITests(unittest.TestCase): 'shell_steps': ['build'], } api = self.create_api() - self.assertEqual(api.post_projects(project), project) - self.assertEqual(api.get_projects(), {'projects': [project]}) + self.assertEqual(api.create(project), project) + self.assertEqual(api.list(), {'projects': [project]}) def test_loads_projects_from_state_directory(self): project = { @@ -76,11 +98,10 @@ class ControllerAPITests(unittest.TestCase): 'shell_steps': ['build'], } api = self.create_api() - api.post_projects(project) + api.create(project) api2 = self.create_api() - api2.load_projects() - self.assertEqual(api2.get_projects(), {'projects': [project]}) + self.assertEqual(api2.list(), {'projects': [project]}) def test_gets_named_project(self): project = { @@ -88,8 +109,8 @@ class ControllerAPITests(unittest.TestCase): 'shell_steps': ['build'], } api = self.create_api() - api.post_projects(project) - self.assertEqual(api.get_project('foo'), project) + api.create(project) + self.assertEqual(api.show('foo'), project) def test_updates_named_project(self): project_v1 = { @@ -99,10 +120,10 @@ class ControllerAPITests(unittest.TestCase): project_v2 = dict(project_v1) project_v2['shell_steps'] = ['build it using magic'] api = self.create_api() - api.post_projects(project_v1) - updated = api.put_projects(project_v2, project='foo') + api.create(project_v1) + updated = api.update(project_v2, 'foo') self.assertEqual(updated, project_v2) - self.assertEqual(api.get_project('foo'), project_v2) + self.assertEqual(api.show('foo'), project_v2) def test_deletes_named_project(self): project = { @@ -110,13 +131,13 @@ class ControllerAPITests(unittest.TestCase): 'shell_steps': ['build'], } api = self.create_api() - api.post_projects(project) - api.delete_projects('foo') - self.assertEqual(api.get_projects(), {'projects': []}) + api.create(project) + api.delete('foo') + self.assertEqual(api.list(), {'projects': []}) with self.assertRaises(ick2.NotFound): - api.get_project('foo') + api.show('foo') - def test_raises_errro_deleting_missing_project(self): + def test_raises_error_deleting_missing_project(self): api = self.create_api() with self.assertRaises(ick2.NotFound): - api.delete_projects('foo') + api.delete('foo') |