| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 | from __future__ import unicode_literalsfrom __future__ import absolute_importfrom ..packages.docker import Clientfrom requests.exceptions import ConnectionErrorimport errnoimport loggingimport osimport reimport yamlfrom ..packages import siximport sysfrom ..project import Projectfrom ..service import ConfigErrorfrom .docopt_command import DocoptCommandfrom .formatter import Formatterfrom .utils import cached_property, docker_url, call_silently, is_mac, is_ubuntufrom . import errorslog = logging.getLogger(__name__)class Command(DocoptCommand):    base_dir = '.'    def __init__(self):        self._yaml_path = os.environ.get('FIG_FILE', None)        self.explicit_project_name = None    def dispatch(self, *args, **kwargs):        try:            super(Command, self).dispatch(*args, **kwargs)        except ConnectionError:            if call_silently(['which', 'docker']) != 0:                if is_mac():                    raise errors.DockerNotFoundMac()                elif is_ubuntu():                    raise errors.DockerNotFoundUbuntu()                else:                    raise errors.DockerNotFoundGeneric()            elif call_silently(['which', 'docker-osx']) == 0:                raise errors.ConnectionErrorDockerOSX()            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'])        if options['--project-name'] is not None:            self.explicit_project_name = options['--project-name']        return super(Command, self).perform_command(options, *args, **kwargs)    @cached_property    def client(self):        return Client(docker_url())    @cached_property    def project(self):        try:            config = yaml.safe_load(open(self.yaml_path))        except IOError as e:            if e.errno == errno.ENOENT:                raise errors.FigFileNotFound(os.path.basename(e.filename))            raise errors.UserError(six.text_type(e))        try:            return Project.from_config(self.project_name, config, self.client)        except ConfigError as e:            raise errors.UserError(six.text_type(e))    @cached_property    def project_name(self):        project = os.path.basename(os.path.dirname(os.path.abspath(self.yaml_path)))        if self.explicit_project_name is not None:            project = self.explicit_project_name        project = re.sub(r'[^a-zA-Z0-9]', '', project)        if not project:            project = 'default'        return project    @cached_property    def formatter(self):        return Formatter()    @cached_property    def yaml_path(self):        if self._yaml_path is not None:            return self._yaml_path        elif os.path.exists(os.path.join(self.base_dir, 'fig.yaml')):            log.warning("Fig just read the file 'fig.yaml' on startup, rather than 'fig.yml'")            log.warning("Please be aware that fig.yml the expected extension in most cases, and using .yaml can cause compatibility issues in future")            return os.path.join(self.base_dir, 'fig.yaml')        else:            return os.path.join(self.base_dir, 'fig.yml')    @yaml_path.setter    def yaml_path(self, value):        self._yaml_path = value
 |