colors.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import enum
  2. import os
  3. from ..const import IS_WINDOWS_PLATFORM
  4. NAMES = [
  5. 'grey',
  6. 'red',
  7. 'green',
  8. 'yellow',
  9. 'blue',
  10. 'magenta',
  11. 'cyan',
  12. 'white'
  13. ]
  14. @enum.unique
  15. class AnsiMode(enum.Enum):
  16. """Enumeration for when to output ANSI colors."""
  17. NEVER = "never"
  18. ALWAYS = "always"
  19. AUTO = "auto"
  20. def use_ansi_codes(self, stream):
  21. if self is AnsiMode.ALWAYS:
  22. return True
  23. if self is AnsiMode.NEVER or os.environ.get('CLICOLOR') == '0':
  24. return False
  25. return stream.isatty()
  26. def get_pairs():
  27. for i, name in enumerate(NAMES):
  28. yield (name, str(30 + i))
  29. yield ('intense_' + name, str(30 + i) + ';1')
  30. def ansi(code):
  31. return '\033[{}m'.format(code)
  32. def ansi_color(code, s):
  33. return '{}{}{}'.format(ansi(code), s, ansi(0))
  34. def make_color_fn(code):
  35. return lambda s: ansi_color(code, s)
  36. if IS_WINDOWS_PLATFORM:
  37. import colorama
  38. colorama.init(strip=False)
  39. for (name, code) in get_pairs():
  40. globals()[name] = make_color_fn(code)
  41. def rainbow():
  42. cs = ['cyan', 'yellow', 'green', 'magenta', 'blue',
  43. 'intense_cyan', 'intense_yellow', 'intense_green',
  44. 'intense_magenta', 'intense_blue']
  45. for c in cs:
  46. yield globals()[c]