From 3e7360c2c655a5397087c959b52ee0cbc2b4cf1b Mon Sep 17 00:00:00 2001 From: Ben Firshman Date: Mon, 3 Mar 2014 16:21:42 +0000 Subject: [PATCH] Improve error when service is not a dict Fixes #127 --- fig/cli/main.py | 4 ++-- fig/project.py | 8 +++++++- tests/project_test.py | 23 ++++++++++++++++++++++- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/fig/cli/main.py b/fig/cli/main.py index e6a8f5ff5..e64769f03 100644 --- a/fig/cli/main.py +++ b/fig/cli/main.py @@ -8,7 +8,7 @@ import signal from inspect import getdoc from .. import __version__ -from ..project import NoSuchService, DependencyError +from ..project import NoSuchService, ConfigurationError from ..service import CannotBeScaledError from .command import Command from .formatter import Formatter @@ -40,7 +40,7 @@ def main(): except KeyboardInterrupt: log.error("\nAborting.") sys.exit(1) - except (UserError, NoSuchService, DependencyError) as e: + except (UserError, NoSuchService, ConfigurationError) as e: log.error(e.msg) sys.exit(1) except NoSuchCommand as e: diff --git a/fig/project.py b/fig/project.py index 1b4d2725c..12ec7069b 100644 --- a/fig/project.py +++ b/fig/project.py @@ -67,6 +67,8 @@ class Project(object): def from_config(cls, name, config, client): dicts = [] for service_name, service in list(config.items()): + if not isinstance(service, dict): + raise ConfigurationError('Service "%s" doesn\'t have any configuration options. All top level keys in your fig.yml must map to a dictionary of configuration options.') service['name'] = service_name dicts.append(service) return cls.from_dicts(name, dicts, client) @@ -156,9 +158,13 @@ class NoSuchService(Exception): return self.msg -class DependencyError(Exception): +class ConfigurationError(Exception): def __init__(self, msg): self.msg = msg def __str__(self): return self.msg + +class DependencyError(ConfigurationError): + pass + diff --git a/tests/project_test.py b/tests/project_test.py index 13afe533b..07f383404 100644 --- a/tests/project_test.py +++ b/tests/project_test.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from fig.project import Project +from fig.project import Project, ConfigurationError from .testcases import DockerClientTestCase @@ -37,6 +37,27 @@ class ProjectTest(DockerClientTestCase): self.assertEqual(project.services[0].name, 'db') self.assertEqual(project.services[1].name, 'web') + def test_from_config(self): + project = Project.from_config('figtest', { + 'web': { + 'image': 'ubuntu', + }, + 'db': { + 'image': 'ubuntu', + }, + }, self.client) + self.assertEqual(len(project.services), 2) + self.assertEqual(project.get_service('web').name, 'web') + self.assertEqual(project.get_service('web').options['image'], 'ubuntu') + self.assertEqual(project.get_service('db').name, 'db') + self.assertEqual(project.get_service('db').options['image'], 'ubuntu') + + def test_from_config_throws_error_when_not_dict(self): + with self.assertRaises(ConfigurationError): + project = Project.from_config('figtest', { + 'web': 'ubuntu', + }, self.client) + def test_get_service(self): web = self.create_service('web') project = Project('test', [web], self.client)