|
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': |
|
|
|
raise ImportError |
|
else: |
|
|
|
from colorama import Fore, init |
|
from colorama import initialise |
|
|
|
def _lazy_colorama_init(): |
|
""" |
|
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: |
|
|
|
|
|
|
|
initialise.atexit_done = True |
|
try: |
|
init(strip=False) |
|
except Exception: |
|
|
|
|
|
pass |
|
_inited = True |
|
|
|
except ImportError: |
|
class Fore: |
|
RED = '' |
|
GREEN = '' |
|
YELLOW = '' |
|
MAGENTA = '' |
|
RESET = '' |
|
BLUE = '' |
|
|
|
NOTICE = object() |
|
WARNING = object() |
|
SPEED = object() |
|
|
|
enable_speed = False |
|
enable_warning = False |
|
enable_notice = False |
|
|
|
|
|
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) |
|
|