Mercurial > repos > bcclaywell > argo_navis
comparison venv/lib/python2.7/site-packages/pip/utils/logging.py @ 0:d67268158946 draft
planemo upload commit a3f181f5f126803c654b3a66dd4e83a48f7e203b
| author | bcclaywell |
|---|---|
| date | Mon, 12 Oct 2015 17:43:33 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:d67268158946 |
|---|---|
| 1 from __future__ import absolute_import | |
| 2 | |
| 3 import contextlib | |
| 4 import logging | |
| 5 import logging.handlers | |
| 6 import os | |
| 7 | |
| 8 try: | |
| 9 import threading | |
| 10 except ImportError: | |
| 11 import dummy_threading as threading | |
| 12 | |
| 13 from pip.compat import WINDOWS | |
| 14 | |
| 15 try: | |
| 16 from pip._vendor import colorama | |
| 17 # Lots of different errors can come from this, including SystemError and | |
| 18 # ImportError. | |
| 19 except Exception: | |
| 20 colorama = None | |
| 21 | |
| 22 | |
| 23 _log_state = threading.local() | |
| 24 _log_state.indentation = 0 | |
| 25 | |
| 26 | |
| 27 @contextlib.contextmanager | |
| 28 def indent_log(num=2): | |
| 29 """ | |
| 30 A context manager which will cause the log output to be indented for any | |
| 31 log messages emited inside it. | |
| 32 """ | |
| 33 _log_state.indentation += num | |
| 34 yield | |
| 35 _log_state.indentation -= num | |
| 36 | |
| 37 | |
| 38 def get_indentation(): | |
| 39 return _log_state.indentation | |
| 40 | |
| 41 | |
| 42 class IndentingFormatter(logging.Formatter): | |
| 43 | |
| 44 def format(self, record): | |
| 45 """ | |
| 46 Calls the standard formatter, but will indent all of the log messages | |
| 47 by our current indentation level. | |
| 48 """ | |
| 49 formatted = logging.Formatter.format(self, record) | |
| 50 formatted = "".join([ | |
| 51 (" " * get_indentation()) + line | |
| 52 for line in formatted.splitlines(True) | |
| 53 ]) | |
| 54 return formatted | |
| 55 | |
| 56 | |
| 57 def _color_wrap(*colors): | |
| 58 def wrapped(inp): | |
| 59 return "".join(list(colors) + [inp, colorama.Style.RESET_ALL]) | |
| 60 return wrapped | |
| 61 | |
| 62 | |
| 63 class ColorizedStreamHandler(logging.StreamHandler): | |
| 64 | |
| 65 # Don't build up a list of colors if we don't have colorama | |
| 66 if colorama: | |
| 67 COLORS = [ | |
| 68 # This needs to be in order from highest logging level to lowest. | |
| 69 (logging.ERROR, _color_wrap(colorama.Fore.RED)), | |
| 70 (logging.WARNING, _color_wrap(colorama.Fore.YELLOW)), | |
| 71 ] | |
| 72 else: | |
| 73 COLORS = [] | |
| 74 | |
| 75 def __init__(self, stream=None): | |
| 76 logging.StreamHandler.__init__(self, stream) | |
| 77 | |
| 78 if WINDOWS and colorama: | |
| 79 self.stream = colorama.AnsiToWin32(self.stream) | |
| 80 | |
| 81 def should_color(self): | |
| 82 # Don't colorize things if we do not have colorama | |
| 83 if not colorama: | |
| 84 return False | |
| 85 | |
| 86 real_stream = ( | |
| 87 self.stream if not isinstance(self.stream, colorama.AnsiToWin32) | |
| 88 else self.stream.wrapped | |
| 89 ) | |
| 90 | |
| 91 # If the stream is a tty we should color it | |
| 92 if hasattr(real_stream, "isatty") and real_stream.isatty(): | |
| 93 return True | |
| 94 | |
| 95 # If we have an ASNI term we should color it | |
| 96 if os.environ.get("TERM") == "ANSI": | |
| 97 return True | |
| 98 | |
| 99 # If anything else we should not color it | |
| 100 return False | |
| 101 | |
| 102 def format(self, record): | |
| 103 msg = logging.StreamHandler.format(self, record) | |
| 104 | |
| 105 if self.should_color(): | |
| 106 for level, color in self.COLORS: | |
| 107 if record.levelno >= level: | |
| 108 msg = color(msg) | |
| 109 break | |
| 110 | |
| 111 return msg | |
| 112 | |
| 113 | |
| 114 class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): | |
| 115 | |
| 116 def _open(self): | |
| 117 # Ensure the directory exists | |
| 118 if not os.path.exists(os.path.dirname(self.baseFilename)): | |
| 119 os.makedirs(os.path.dirname(self.baseFilename)) | |
| 120 | |
| 121 return logging.handlers.RotatingFileHandler._open(self) | |
| 122 | |
| 123 | |
| 124 class MaxLevelFilter(logging.Filter): | |
| 125 | |
| 126 def __init__(self, level): | |
| 127 self.level = level | |
| 128 | |
| 129 def filter(self, record): | |
| 130 return record.levelno < self.level |
