Chris@87: # Colored log, requires Python 2.3 or up. Chris@87: from __future__ import division, absolute_import, print_function Chris@87: Chris@87: import sys Chris@87: from distutils.log import * Chris@87: from distutils.log import Log as old_Log Chris@87: from distutils.log import _global_log Chris@87: Chris@87: if sys.version_info[0] < 3: Chris@87: from .misc_util import (red_text, default_text, cyan_text, green_text, Chris@87: is_sequence, is_string) Chris@87: else: Chris@87: from numpy.distutils.misc_util import (red_text, default_text, cyan_text, Chris@87: green_text, is_sequence, is_string) Chris@87: Chris@87: Chris@87: def _fix_args(args,flag=1): Chris@87: if is_string(args): Chris@87: return args.replace('%', '%%') Chris@87: if flag and is_sequence(args): Chris@87: return tuple([_fix_args(a, flag=0) for a in args]) Chris@87: return args Chris@87: Chris@87: Chris@87: class Log(old_Log): Chris@87: def _log(self, level, msg, args): Chris@87: if level >= self.threshold: Chris@87: if args: Chris@87: msg = msg % _fix_args(args) Chris@87: if 0: Chris@87: if msg.startswith('copying ') and msg.find(' -> ') != -1: Chris@87: return Chris@87: if msg.startswith('byte-compiling '): Chris@87: return Chris@87: print(_global_color_map[level](msg)) Chris@87: sys.stdout.flush() Chris@87: Chris@87: def good(self, msg, *args): Chris@87: """ Chris@87: If we log WARN messages, log this message as a 'nice' anti-warn Chris@87: message. Chris@87: Chris@87: """ Chris@87: if WARN >= self.threshold: Chris@87: if args: Chris@87: print(green_text(msg % _fix_args(args))) Chris@87: else: Chris@87: print(green_text(msg)) Chris@87: sys.stdout.flush() Chris@87: Chris@87: Chris@87: _global_log.__class__ = Log Chris@87: Chris@87: good = _global_log.good Chris@87: Chris@87: def set_threshold(level, force=False): Chris@87: prev_level = _global_log.threshold Chris@87: if prev_level > DEBUG or force: Chris@87: # If we're running at DEBUG, don't change the threshold, as there's Chris@87: # likely a good reason why we're running at this level. Chris@87: _global_log.threshold = level Chris@87: if level <= DEBUG: Chris@87: info('set_threshold: setting threshold to DEBUG level,' Chris@87: ' it can be changed only with force argument') Chris@87: else: Chris@87: info('set_threshold: not changing threshold from DEBUG level' Chris@87: ' %s to %s' % (prev_level, level)) Chris@87: return prev_level Chris@87: Chris@87: Chris@87: def set_verbosity(v, force=False): Chris@87: prev_level = _global_log.threshold Chris@87: if v < 0: Chris@87: set_threshold(ERROR, force) Chris@87: elif v == 0: Chris@87: set_threshold(WARN, force) Chris@87: elif v == 1: Chris@87: set_threshold(INFO, force) Chris@87: elif v >= 2: Chris@87: set_threshold(DEBUG, force) Chris@87: return {FATAL:-2,ERROR:-1,WARN:0,INFO:1,DEBUG:2}.get(prev_level, 1) Chris@87: Chris@87: Chris@87: _global_color_map = { Chris@87: DEBUG:cyan_text, Chris@87: INFO:default_text, Chris@87: WARN:red_text, Chris@87: ERROR:red_text, Chris@87: FATAL:red_text Chris@87: } Chris@87: Chris@87: # don't use INFO,.. flags in set_verbosity, these flags are for set_threshold. Chris@87: set_verbosity(0, force=True)