| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 | import loggingimport shutilimport texttablefrom compose.cli import colorsif hasattr(shutil, "get_terminal_size"):    from shutil import get_terminal_sizeelse:    from backports.shutil_get_terminal_size import get_terminal_sizedef get_tty_width():    try:        # get_terminal_size can't determine the size if compose is piped        # to another command. But in such case it doesn't make sense to        # try format the output by terminal size as this output is consumed        # by another command. So let's pretend we have a huge terminal so        # output is single-lined        width, _ = get_terminal_size(fallback=(999, 0))        return int(width)    except OSError:        return 0class Formatter:    """Format tabular data for printing."""    @staticmethod    def table(headers, rows):        table = texttable.Texttable(max_width=get_tty_width())        table.set_cols_dtype(['t' for h in headers])        table.add_rows([headers] + rows)        table.set_deco(table.HEADER)        table.set_chars(['-', '|', '+', '-'])        return table.draw()class ConsoleWarningFormatter(logging.Formatter):    """A logging.Formatter which prints WARNING and ERROR messages with    a prefix of the log level colored appropriate for the log level.    """    def get_level_message(self, record):        separator = ': '        if record.levelno == logging.WARNING:            return colors.yellow(record.levelname) + separator        if record.levelno == logging.ERROR:            return colors.red(record.levelname) + separator        return ''    def format(self, record):        if isinstance(record.msg, bytes):            record.msg = record.msg.decode('utf-8')        message = super(ConsoleWarningFormatter, self).format(record)        return '{0}{1}'.format(self.get_level_message(record), message)
 |