20 from contextlib
import contextmanager
24 from ctypes
import windll, Structure, c_short, c_ushort, byref
39 options = {
'AUTO': Highlighter
if isatty(stream)
else NoHighlighting,
41 'OFF': NoHighlighting,
42 'ANSI': AnsiHighlighter}
44 highlighter = options[colors.upper()]
46 raise DataError(
"Invalid console color value '%s'. Available "
47 "'AUTO', 'ON', 'OFF' and 'ANSI'." % colors)
48 return highlighter(stream)
50 def write(self, text, flush=True):
60 except IOError
as err:
61 if not (WINDOWS
and err.errno == 0
and retry > 0):
63 self.
_write_write(text, retry-1)
73 self.
writewrite(text, flush)
79 return WINDOWS
and not isinstance(self.
_highlighter_highlighter, NoHighlighting)
81 def error(self, message, level):
82 self.
writewrite(
'[ ', flush=
False)
83 self.
highlighthighlight(level, flush=
False)
84 self.
writewrite(
' ] %s\n' % message)
89 start = {
'PASS': highlighter.green,
90 'FAIL': highlighter.red,
91 'ERROR': highlighter.red,
92 'WARN': highlighter.yellow}[status]
110 _ANSI_GREEN =
'\033[32m'
114 _ANSI_RED =
'\033[31m'
118 _ANSI_YELLOW =
'\033[33m'
122 _ANSI_RESET =
'\033[0m'
149 class DosHighlighter():
153 _FOREGROUND_GREEN = 0x2
157 _FOREGROUND_RED = 0x4
161 _FOREGROUND_YELLOW = 0x6
165 _FOREGROUND_GREY = 0x7
169 _FOREGROUND_INTENSITY = 0x8
173 _BACKGROUND_MASK = 0xF0
202 if stream
is sys.__stdout__
else self.
_STDERR_HANDLE_STDERR_HANDLE
203 return windll.kernel32.GetStdHandle(handle)
207 ok = windll.kernel32.GetConsoleScreenBufferInfo(self.
_handle_handle, byref(csbi))
210 return csbi.wAttributes
216 windll.kernel32.SetConsoleTextAttribute(self.
_handle_handle, colors)
225 _fields_ = [(
"X", c_short),
232 _fields_ = [(
"Left", c_short),
241 _fields_ = [(
"dwSize", _COORD),
242 (
"dwCursorPosition", _COORD),
243 (
"wAttributes", c_ushort),
244 (
"srWindow", _SMALL_RECT),
245 (
"dwMaximumWindowSize", _COORD)]
Used when variable does not exist.
def __init__(self, stream)
def _set_color(self, color)
def _set_foreground_colors(self, colors)
int _FOREGROUND_INTENSITY
def _set_colors(self, colors)
def _get_std_handle(self, stream)
def __init__(self, stream)
def _get_highlighter(self, stream, colors)
def highlight(self, text, status=None, flush=True)
def write(self, text, flush=True)
def _highlighting(self, status)
def _must_flush_before_and_after_highlighting(self)
def error(self, message, level)
def __init__(self, stream, colors='AUTO')
def _write(self, text, retry=5)
def _set_color(self, color)
def write(msg, level='INFO', html=False)
Writes the message to the log file using the given level.
def console_encode(string, errors='replace', stream=sys.__stdout__)
Encodes Unicode to bytes in console or system encoding.