瀏覽代碼

Improve error when service is not a dict

Fixes #127
Ben Firshman 11 年之前
父節點
當前提交
3e7360c2c6
共有 3 個文件被更改,包括 31 次插入4 次删除
  1. 2 2
      fig/cli/main.py
  2. 7 1
      fig/project.py
  3. 22 1
      tests/project_test.py

+ 2 - 2
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:

+ 7 - 1
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
+

+ 22 - 1
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)