You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			133 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
import os
 | 
						|
import time
 | 
						|
from contextlib import contextmanager
 | 
						|
from typing import Callable, Optional
 | 
						|
 | 
						|
_inited = False
 | 
						|
 | 
						|
 | 
						|
def _lazy_colorama_init():
 | 
						|
    """
 | 
						|
    Lazily init colorama if necessary, not to screw up stdout if debugging is
 | 
						|
    not enabled.
 | 
						|
 | 
						|
    This version of the function does nothing.
 | 
						|
    """
 | 
						|
 | 
						|
 | 
						|
try:
 | 
						|
    if os.name == 'nt':
 | 
						|
        # Does not work on Windows, as pyreadline and colorama interfere
 | 
						|
        raise ImportError
 | 
						|
    else:
 | 
						|
        # Use colorama for nicer console output.
 | 
						|
        from colorama import Fore, init  # type: ignore[import]
 | 
						|
        from colorama import initialise
 | 
						|
 | 
						|
        def _lazy_colorama_init():  # noqa: F811
 | 
						|
            """
 | 
						|
            Lazily init colorama if necessary, not to screw up stdout is
 | 
						|
            debug not enabled.
 | 
						|
 | 
						|
            This version of the function does init colorama.
 | 
						|
            """
 | 
						|
            global _inited
 | 
						|
            if not _inited:
 | 
						|
                # pytest resets the stream at the end - causes troubles. Since
 | 
						|
                # after every output the stream is reset automatically we don't
 | 
						|
                # need this.
 | 
						|
                initialise.atexit_done = True
 | 
						|
                try:
 | 
						|
                    init(strip=False)
 | 
						|
                except Exception:
 | 
						|
                    # Colorama fails with initializing under vim and is buggy in
 | 
						|
                    # version 0.3.6.
 | 
						|
                    pass
 | 
						|
            _inited = True
 | 
						|
 | 
						|
except ImportError:
 | 
						|
    class Fore:  # type: ignore[no-redef]
 | 
						|
        RED = ''
 | 
						|
        GREEN = ''
 | 
						|
        YELLOW = ''
 | 
						|
        MAGENTA = ''
 | 
						|
        RESET = ''
 | 
						|
        BLUE = ''
 | 
						|
 | 
						|
NOTICE = object()
 | 
						|
WARNING = object()
 | 
						|
SPEED = object()
 | 
						|
 | 
						|
enable_speed = False
 | 
						|
enable_warning = False
 | 
						|
enable_notice = False
 | 
						|
 | 
						|
# callback, interface: level, str
 | 
						|
debug_function: Optional[Callable[[str, str], None]] = None
 | 
						|
_debug_indent = 0
 | 
						|
_start_time = time.time()
 | 
						|
 | 
						|
 | 
						|
def reset_time():
 | 
						|
    global _start_time, _debug_indent
 | 
						|
    _start_time = time.time()
 | 
						|
    _debug_indent = 0
 | 
						|
 | 
						|
 | 
						|
def increase_indent(func):
 | 
						|
    """Decorator for makin """
 | 
						|
    def wrapper(*args, **kwargs):
 | 
						|
        with increase_indent_cm():
 | 
						|
            return func(*args, **kwargs)
 | 
						|
    return wrapper
 | 
						|
 | 
						|
 | 
						|
@contextmanager
 | 
						|
def increase_indent_cm(title=None, color='MAGENTA'):
 | 
						|
    global _debug_indent
 | 
						|
    if title:
 | 
						|
        dbg('Start: ' + title, color=color)
 | 
						|
    _debug_indent += 1
 | 
						|
    try:
 | 
						|
        yield
 | 
						|
    finally:
 | 
						|
        _debug_indent -= 1
 | 
						|
        if title:
 | 
						|
            dbg('End: ' + title, color=color)
 | 
						|
 | 
						|
 | 
						|
def dbg(message, *args, color='GREEN'):
 | 
						|
    """ Looks at the stack, to see if a debug message should be printed. """
 | 
						|
    assert color
 | 
						|
 | 
						|
    if debug_function and enable_notice:
 | 
						|
        i = ' ' * _debug_indent
 | 
						|
        _lazy_colorama_init()
 | 
						|
        debug_function(color, i + 'dbg: ' + message % tuple(repr(a) for a in args))
 | 
						|
 | 
						|
 | 
						|
def warning(message, *args, format=True):
 | 
						|
    if debug_function and enable_warning:
 | 
						|
        i = ' ' * _debug_indent
 | 
						|
        if format:
 | 
						|
            message = message % tuple(repr(a) for a in args)
 | 
						|
        debug_function('RED', i + 'warning: ' + message)
 | 
						|
 | 
						|
 | 
						|
def speed(name):
 | 
						|
    if debug_function and enable_speed:
 | 
						|
        now = time.time()
 | 
						|
        i = ' ' * _debug_indent
 | 
						|
        debug_function('YELLOW', i + 'speed: ' + '%s %s' % (name, now - _start_time))
 | 
						|
 | 
						|
 | 
						|
def print_to_stdout(color, str_out):
 | 
						|
    """
 | 
						|
    The default debug function that prints to standard out.
 | 
						|
 | 
						|
    :param str color: A string that is an attribute of ``colorama.Fore``.
 | 
						|
    """
 | 
						|
    col = getattr(Fore, color)
 | 
						|
    _lazy_colorama_init()
 | 
						|
    print(col + str_out + Fore.RESET)
 |