diff --git a/fig/project.py b/fig/project.py index d0c556c487c..1b0dac1da86 100644 --- a/fig/project.py +++ b/fig/project.py @@ -64,13 +64,19 @@ def from_dicts(cls, name, service_dicts, client): @classmethod def from_config(cls, name, config, client): - dicts = [] + services = [] + project_config = config.pop('.project', {}) + name = project_config.get('name', name) + 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.') + 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) + services.append(service) + return cls.from_dicts(name, services, client) def get_service(self, name): """ diff --git a/tests/unit/project_test.py b/tests/unit/project_test.py index 5c8d35b1d92..439acce20f7 100644 --- a/tests/unit/project_test.py +++ b/tests/unit/project_test.py @@ -65,6 +65,15 @@ def test_from_config_throws_error_when_not_dict(self): 'web': 'busybox:latest', }, None) + def test_from_config_with_project_config(self): + project_name = 'theprojectnamefromconfig' + project = Project.from_config('default_name_not_used', { + '.project': {'name': project_name}, + 'web': {'image': 'busybox:latest'} + }, None) + + self.assertEqual(project.name, project_name) + def test_get_service(self): web = Service( project='figtest',