formatter.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. import logging
  4. import shutil
  5. import six
  6. import texttable
  7. from compose.cli import colors
  8. if hasattr(shutil, "get_terminal_size"):
  9. from shutil import get_terminal_size
  10. else:
  11. from backports.shutil_get_terminal_size import get_terminal_size
  12. def get_tty_width():
  13. try:
  14. width, _ = get_terminal_size()
  15. return int(width)
  16. except OSError:
  17. return 0
  18. class Formatter:
  19. """Format tabular data for printing."""
  20. @staticmethod
  21. def table(headers, rows):
  22. table = texttable.Texttable(max_width=get_tty_width())
  23. table.set_cols_dtype(['t' for h in headers])
  24. table.add_rows([headers] + rows)
  25. table.set_deco(table.HEADER)
  26. table.set_chars(['-', '|', '+', '-'])
  27. return table.draw()
  28. class ConsoleWarningFormatter(logging.Formatter):
  29. """A logging.Formatter which prints WARNING and ERROR messages with
  30. a prefix of the log level colored appropriate for the log level.
  31. """
  32. def get_level_message(self, record):
  33. separator = ': '
  34. if record.levelno == logging.WARNING:
  35. return colors.yellow(record.levelname) + separator
  36. if record.levelno == logging.ERROR:
  37. return colors.red(record.levelname) + separator
  38. return ''
  39. def format(self, record):
  40. if isinstance(record.msg, six.binary_type):
  41. record.msg = record.msg.decode('utf-8')
  42. message = super(ConsoleWarningFormatter, self).format(record)
  43. return '{0}{1}'.format(self.get_level_message(record), message)