Commit 35f13db1 authored by André Anjos's avatar André Anjos 💬
Browse files

[package] Add color support

parent 178d4b6a
......@@ -7,6 +7,10 @@
import sys
import logging
import click
import termcolor
# get the default root logger of Bob
_logger = logging.getLogger('bob')
......@@ -28,6 +32,87 @@ _debug_info.addFilter(_InfoFilter())
COLORMAP = dict(
warn=dict(color='yellow', attrs=['bold']),
warning=dict(color='yellow', attrs=['bold']),
exception=dict(color='red', attrs=['bold']),
critical=dict(color='red', attrs=['bold']),
'''Default color map for homogenized color display'''
def _supports_color():
Returns True if the running system's terminal supports color, and False
plat = sys.platform
supported_platform = plat != 'Pocket PC' and (plat != 'win32' or
'ANSICON' in os.environ)
# isatty is not always implemented, #6223.
is_a_tty = hasattr(sys.stdout, 'isatty') and sys.stdout.isatty()
if not supported_platform or not is_a_tty:
return False
return True
class ColorLog(object):
'''Colorizes logging colors'''
def __init__(self, logger):
self._log = logger
def __getattr__(self, name):
if name in ['debug', 'info', 'warn', 'warning', 'error', 'exception',
if _supports_color():
return lambda s, *args: getattr(self._log, name)(
termcolor.colored(s, **COLORMAP[name]), *args)
return lambda s, *args: getattr(self._log, name)(s, *args)
return getattr(self._log, name)
def get_logger(name):
"""Returns the default logger as setup by this module"""
return ColorLog(logging.getLogger(name))
def _echo(text, *args, **kwargs):
"""Provides a colorized version of :py:func:`click.echo` (for terminals)
The color is stripped off if outputting to a file or piping the results of
a command using this function.
text (str): The text to be printed
args (tuple): Tuple of attributes directly passed to
kwargs (dict): Dictionary of attributes directly passed to
click.echo(termcolor.colored(text, *args, **kwargs))
def echo_normal(text):
"""Color preset for normal text output for :py:func:`click.echo`"""
_echo(text, 'green')
def echo_warning(text):
"""Color preset for normal warning output for :py:func:`click.echo`"""
_echo(text, **COLORMAP['warn'])
# helper functions to instantiate and set-up logging
def setup(logger_name,
format="%(levelname)s:%(name)s@%(asctime)s: %(message)s"):
......@@ -68,7 +153,7 @@ def setup(logger_name,
for handler in _logger.handlers:
return logger
return ColorLog(logger)
def set_verbosity_level(logger, level):
......@@ -47,6 +47,7 @@ requirements:
- twine
- lxml
- jinja2
- termcolor
......@@ -21,6 +21,7 @@ requires = [
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment