diff --git a/fig/cli/command.py b/fig/cli/command.py index 268258993..0a224273c 100644 --- a/fig/cli/command.py +++ b/fig/cli/command.py @@ -22,6 +22,9 @@ log = logging.getLogger(__name__) class Command(DocoptCommand): base_dir = '.' + def __init__(self): + self.yaml_path = os.environ.get('FIG_FILE', None) + def dispatch(self, *args, **kwargs): try: super(Command, self).dispatch(*args, **kwargs) @@ -38,6 +41,11 @@ class Command(DocoptCommand): else: raise errors.ConnectionErrorGeneric(self.client.base_url) + def perform_command(self, options, *args, **kwargs): + if options['--file'] is not None: + self.yaml_path = os.path.join(self.base_dir, options['--file']) + return super(Command, self).perform_command(options, *args, **kwargs) + @cached_property def client(self): return Client(docker_url()) @@ -45,9 +53,10 @@ class Command(DocoptCommand): @cached_property def project(self): try: - yaml_path = self.check_yaml_filename() + yaml_path = self.yaml_path + if yaml_path is None: + yaml_path = self.check_yaml_filename() config = yaml.load(open(yaml_path)) - except IOError as e: if e.errno == errno.ENOENT: raise errors.FigFileNotFound(os.path.basename(e.filename)) diff --git a/fig/cli/main.py b/fig/cli/main.py index dfd02d0bb..e6a8f5ff5 100644 --- a/fig/cli/main.py +++ b/fig/cli/main.py @@ -70,6 +70,7 @@ class TopLevelCommand(Command): Options: --verbose Show more output --version Print version and exit + -f, --file FILE Specify an alternate fig file (default: fig.yml) Commands: build Build or rebuild services diff --git a/tests/cli_test.py b/tests/cli_test.py index b6d02daad..38a9cd28c 100644 --- a/tests/cli_test.py +++ b/tests/cli_test.py @@ -31,6 +31,28 @@ class CLITestCase(DockerClientTestCase): self.command.dispatch(['ps'], None) self.assertIn('fig_simple_1', mock_stdout.getvalue()) + @patch('sys.stdout', new_callable=StringIO) + def test_default_figfile(self, mock_stdout): + self.command.base_dir = 'tests/fixtures/multiple-figfiles' + self.command.dispatch(['up', '-d'], None) + self.command.dispatch(['ps'], None) + + output = mock_stdout.getvalue() + self.assertIn('fig_simple_1', output) + self.assertIn('fig_another_1', output) + self.assertNotIn('fig_yetanother_1', output) + + @patch('sys.stdout', new_callable=StringIO) + def test_alternate_figfile(self, mock_stdout): + self.command.base_dir = 'tests/fixtures/multiple-figfiles' + self.command.dispatch(['-f', 'fig2.yml', 'up', '-d'], None) + self.command.dispatch(['-f', 'fig2.yml', 'ps'], None) + + output = mock_stdout.getvalue() + self.assertNotIn('fig_simple_1', output) + self.assertNotIn('fig_another_1', output) + self.assertIn('fig_yetanother_1', output) + def test_scale(self): project = self.command.project diff --git a/tests/fixtures/multiple-figfiles/fig.yml b/tests/fixtures/multiple-figfiles/fig.yml new file mode 100644 index 000000000..225323755 --- /dev/null +++ b/tests/fixtures/multiple-figfiles/fig.yml @@ -0,0 +1,6 @@ +simple: + image: ubuntu + command: /bin/sleep 300 +another: + image: ubuntu + command: /bin/sleep 300 diff --git a/tests/fixtures/multiple-figfiles/fig2.yml b/tests/fixtures/multiple-figfiles/fig2.yml new file mode 100644 index 000000000..330ed771d --- /dev/null +++ b/tests/fixtures/multiple-figfiles/fig2.yml @@ -0,0 +1,3 @@ +yetanother: + image: ubuntu + command: /bin/sleep 300