Support fig.y(a)ml and show a deprecation warning

Closes #864

Signed-off-by: Aanand Prasad <aanand.prasad@gmail.com>
This commit is contained in:
Aanand Prasad 2015-01-28 17:27:53 -05:00
parent 9bc7604e0e
commit 7c087f1c07
3 changed files with 77 additions and 18 deletions

View File

@ -1,7 +1,6 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from __future__ import absolute_import from __future__ import absolute_import
from requests.exceptions import ConnectionError, SSLError from requests.exceptions import ConnectionError, SSLError
import errno
import logging import logging
import os import os
import re import re
@ -75,8 +74,6 @@ class Command(DocoptCommand):
with open(config_path, 'r') as fh: with open(config_path, 'r') as fh:
return yaml.safe_load(fh) return yaml.safe_load(fh)
except IOError as e: except IOError as e:
if e.errno == errno.ENOENT:
raise errors.ComposeFileNotFound(os.path.basename(e.filename))
raise errors.UserError(six.text_type(e)) raise errors.UserError(six.text_type(e))
def get_project(self, config_path, project_name=None, verbose=False): def get_project(self, config_path, project_name=None, verbose=False):
@ -110,13 +107,34 @@ class Command(DocoptCommand):
if file_path: if file_path:
return os.path.join(self.base_dir, file_path) return os.path.join(self.base_dir, file_path)
if os.path.exists(os.path.join(self.base_dir, 'docker-compose.yaml')): supported_filenames = [
log.warning("Compose just read the file 'docker-compose.yaml' on startup, rather " 'docker-compose.yml',
"than 'docker-compose.yml'") 'docker-compose.yaml',
'fig.yml',
'fig.yaml',
]
def expand(filename):
return os.path.join(self.base_dir, filename)
candidates = [filename for filename in supported_filenames if os.path.exists(expand(filename))]
if len(candidates) == 0:
raise errors.ComposeFileNotFound(supported_filenames)
winner = candidates[0]
if len(candidates) > 1:
log.warning("Found multiple config files with supported names: %s", ", ".join(candidates))
log.warning("Using %s\n", winner)
if winner == 'docker-compose.yaml':
log.warning("Please be aware that .yml is the expected extension " log.warning("Please be aware that .yml is the expected extension "
"in most cases, and using .yaml can cause compatibility " "in most cases, and using .yaml can cause compatibility "
"issues in future") "issues in future.\n")
return os.path.join(self.base_dir, 'docker-compose.yaml') if winner.startswith("fig."):
log.warning("%s is deprecated and will not be supported in future. "
"Please rename your config file to docker-compose.yml\n" % winner)
return os.path.join(self.base_dir, 'docker-compose.yml') return expand(winner)

View File

@ -56,7 +56,9 @@ class ConnectionErrorGeneric(UserError):
class ComposeFileNotFound(UserError): class ComposeFileNotFound(UserError):
def __init__(self, filename): def __init__(self, supported_filenames):
super(ComposeFileNotFound, self).__init__(""" super(ComposeFileNotFound, self).__init__("""
Can't find %s. Are you in the right directory? Can't find a suitable configuration file. Are you in the right directory?
""" % filename)
Supported filenames: %s
""" % ", ".join(supported_filenames))

View File

@ -2,12 +2,15 @@ from __future__ import unicode_literals
from __future__ import absolute_import from __future__ import absolute_import
import logging import logging
import os import os
import tempfile
import shutil
from .. import unittest from .. import unittest
import mock import mock
from compose.cli import main from compose.cli import main
from compose.cli.main import TopLevelCommand from compose.cli.main import TopLevelCommand
from compose.cli.errors import ComposeFileNotFound
from six import StringIO from six import StringIO
@ -57,12 +60,30 @@ class CLITestCase(unittest.TestCase):
project_name = command.get_project_name(None) project_name = command.get_project_name(None)
self.assertEquals(project_name, name) self.assertEquals(project_name, name)
def test_yaml_filename_check(self): def test_filename_check(self):
command = TopLevelCommand() self.assertEqual('docker-compose.yml', get_config_filename_for_files([
command.base_dir = 'tests/fixtures/longer-filename-composefile' 'docker-compose.yml',
with mock.patch('compose.cli.command.log', autospec=True) as mock_log: 'docker-compose.yaml',
self.assertTrue(command.get_config_path()) 'fig.yml',
self.assertEqual(mock_log.warning.call_count, 2) 'fig.yaml',
]))
self.assertEqual('docker-compose.yaml', get_config_filename_for_files([
'docker-compose.yaml',
'fig.yml',
'fig.yaml',
]))
self.assertEqual('fig.yml', get_config_filename_for_files([
'fig.yml',
'fig.yaml',
]))
self.assertEqual('fig.yaml', get_config_filename_for_files([
'fig.yaml',
]))
self.assertRaises(ComposeFileNotFound, lambda: get_config_filename_for_files([]))
def test_get_project(self): def test_get_project(self):
command = TopLevelCommand() command = TopLevelCommand()
@ -81,3 +102,21 @@ class CLITestCase(unittest.TestCase):
main.setup_logging() main.setup_logging()
self.assertEqual(logging.getLogger().level, logging.DEBUG) self.assertEqual(logging.getLogger().level, logging.DEBUG)
self.assertEqual(logging.getLogger('requests').propagate, False) self.assertEqual(logging.getLogger('requests').propagate, False)
def get_config_filename_for_files(filenames):
project_dir = tempfile.mkdtemp()
try:
make_files(project_dir, filenames)
command = TopLevelCommand()
command.base_dir = project_dir
return os.path.basename(command.get_config_path())
finally:
shutil.rmtree(project_dir)
def make_files(dirname, filenames):
for fname in filenames:
with open(os.path.join(dirname, fname), 'w') as f:
f.write('')