48 lines
1.3 KiB
Python
48 lines
1.3 KiB
Python
"""
|
|
pprint and pformat wrappers with colorization support
|
|
"""
|
|
|
|
import ctypes
|
|
import platform
|
|
import sys
|
|
from distutils.version import LooseVersion as parse_version
|
|
from pprint import pformat as pformat_
|
|
|
|
|
|
def _enable_windows_terminal_processing():
|
|
# https://stackoverflow.com/a/36760881
|
|
kernel32 = ctypes.windll.kernel32
|
|
return bool(kernel32.SetConsoleMode(kernel32.GetStdHandle(-11), 7))
|
|
|
|
|
|
def _tty_supports_color():
|
|
if sys.platform != "win32":
|
|
return True
|
|
|
|
if parse_version(platform.version()) < parse_version("10.0.14393"):
|
|
return True
|
|
|
|
# Windows >= 10.0.14393 interprets ANSI escape sequences providing terminal
|
|
# processing is enabled.
|
|
return _enable_windows_terminal_processing()
|
|
|
|
|
|
def _colorize(text, colorize=True):
|
|
if not colorize or not sys.stdout.isatty() or not _tty_supports_color():
|
|
return text
|
|
try:
|
|
from pygments import highlight
|
|
except ImportError:
|
|
return text
|
|
else:
|
|
from pygments.formatters import TerminalFormatter
|
|
from pygments.lexers import PythonLexer
|
|
return highlight(text, PythonLexer(), TerminalFormatter())
|
|
|
|
|
|
def pformat(obj, *args, **kwargs):
|
|
return _colorize(pformat_(obj), kwargs.pop('colorize', True))
|
|
|
|
|
|
def pprint(obj, *args, **kwargs):
|
|
print(pformat(obj, *args, **kwargs))
|