You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					112 lines
				
				2.8 KiB
			
		
		
			
		
	
	
					112 lines
				
				2.8 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								# Colored log
							 | 
						||
| 
								 | 
							
								import sys
							 | 
						||
| 
								 | 
							
								from distutils.log import *  # noqa: F403
							 | 
						||
| 
								 | 
							
								from distutils.log import Log as old_Log
							 | 
						||
| 
								 | 
							
								from distutils.log import _global_log
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from numpy.distutils.misc_util import (red_text, default_text, cyan_text,
							 | 
						||
| 
								 | 
							
								        green_text, is_sequence, is_string)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def _fix_args(args,flag=1):
							 | 
						||
| 
								 | 
							
								    if is_string(args):
							 | 
						||
| 
								 | 
							
								        return args.replace('%', '%%')
							 | 
						||
| 
								 | 
							
								    if flag and is_sequence(args):
							 | 
						||
| 
								 | 
							
								        return tuple([_fix_args(a, flag=0) for a in args])
							 | 
						||
| 
								 | 
							
								    return args
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Log(old_Log):
							 | 
						||
| 
								 | 
							
								    def _log(self, level, msg, args):
							 | 
						||
| 
								 | 
							
								        if level >= self.threshold:
							 | 
						||
| 
								 | 
							
								            if args:
							 | 
						||
| 
								 | 
							
								                msg = msg % _fix_args(args)
							 | 
						||
| 
								 | 
							
								            if 0:
							 | 
						||
| 
								 | 
							
								                if msg.startswith('copying ') and msg.find(' -> ') != -1:
							 | 
						||
| 
								 | 
							
								                    return
							 | 
						||
| 
								 | 
							
								                if msg.startswith('byte-compiling '):
							 | 
						||
| 
								 | 
							
								                    return
							 | 
						||
| 
								 | 
							
								            print(_global_color_map[level](msg))
							 | 
						||
| 
								 | 
							
								            sys.stdout.flush()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def good(self, msg, *args):
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        If we log WARN messages, log this message as a 'nice' anti-warn
							 | 
						||
| 
								 | 
							
								        message.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        if WARN >= self.threshold:
							 | 
						||
| 
								 | 
							
								            if args:
							 | 
						||
| 
								 | 
							
								                print(green_text(msg % _fix_args(args)))
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                print(green_text(msg))
							 | 
						||
| 
								 | 
							
								            sys.stdout.flush()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_global_log.__class__ = Log
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								good = _global_log.good
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def set_threshold(level, force=False):
							 | 
						||
| 
								 | 
							
								    prev_level = _global_log.threshold
							 | 
						||
| 
								 | 
							
								    if prev_level > DEBUG or force:
							 | 
						||
| 
								 | 
							
								        # If we're running at DEBUG, don't change the threshold, as there's
							 | 
						||
| 
								 | 
							
								        # likely a good reason why we're running at this level.
							 | 
						||
| 
								 | 
							
								        _global_log.threshold = level
							 | 
						||
| 
								 | 
							
								        if level <= DEBUG:
							 | 
						||
| 
								 | 
							
								            info('set_threshold: setting threshold to DEBUG level,'
							 | 
						||
| 
								 | 
							
								                    ' it can be changed only with force argument')
							 | 
						||
| 
								 | 
							
								    else:
							 | 
						||
| 
								 | 
							
								        info('set_threshold: not changing threshold from DEBUG level'
							 | 
						||
| 
								 | 
							
								                ' %s to %s' % (prev_level, level))
							 | 
						||
| 
								 | 
							
								    return prev_level
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def get_threshold():
							 | 
						||
| 
								 | 
							
									return _global_log.threshold
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def set_verbosity(v, force=False):
							 | 
						||
| 
								 | 
							
								    prev_level = _global_log.threshold
							 | 
						||
| 
								 | 
							
								    if v < 0:
							 | 
						||
| 
								 | 
							
								        set_threshold(ERROR, force)
							 | 
						||
| 
								 | 
							
								    elif v == 0:
							 | 
						||
| 
								 | 
							
								        set_threshold(WARN, force)
							 | 
						||
| 
								 | 
							
								    elif v == 1:
							 | 
						||
| 
								 | 
							
								        set_threshold(INFO, force)
							 | 
						||
| 
								 | 
							
								    elif v >= 2:
							 | 
						||
| 
								 | 
							
								        set_threshold(DEBUG, force)
							 | 
						||
| 
								 | 
							
								    return {FATAL:-2,ERROR:-1,WARN:0,INFO:1,DEBUG:2}.get(prev_level, 1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_global_color_map = {
							 | 
						||
| 
								 | 
							
								    DEBUG:cyan_text,
							 | 
						||
| 
								 | 
							
								    INFO:default_text,
							 | 
						||
| 
								 | 
							
								    WARN:red_text,
							 | 
						||
| 
								 | 
							
								    ERROR:red_text,
							 | 
						||
| 
								 | 
							
								    FATAL:red_text
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# don't use INFO,.. flags in set_verbosity, these flags are for set_threshold.
							 | 
						||
| 
								 | 
							
								set_verbosity(0, force=True)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_error = error
							 | 
						||
| 
								 | 
							
								_warn = warn
							 | 
						||
| 
								 | 
							
								_info = info
							 | 
						||
| 
								 | 
							
								_debug = debug
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def error(msg, *a, **kw):
							 | 
						||
| 
								 | 
							
								    _error(f"ERROR: {msg}", *a, **kw)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def warn(msg, *a, **kw):
							 | 
						||
| 
								 | 
							
								    _warn(f"WARN: {msg}", *a, **kw)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def info(msg, *a, **kw):
							 | 
						||
| 
								 | 
							
								    _info(f"INFO: {msg}", *a, **kw)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def debug(msg, *a, **kw):
							 | 
						||
| 
								 | 
							
								    _debug(f"DEBUG: {msg}", *a, **kw)
							 |