Revision: 4585
Author: KariHusa
Date: Wed Feb 2 05:55:56 2011
Log: monitor: Add coloring to Windows console
http://code.google.com/p/robotframework/source/detail?r=4585
Modified:
/trunk/src/robot/output/monitor.py
=======================================
--- /trunk/src/robot/output/monitor.py Wed Feb 2 03:13:47 2011
+++ /trunk/src/robot/output/monitor.py Wed Feb 2 05:55:56 2011
@@ -13,6 +13,7 @@
# limitations under the License.
+import os
import sys
from robot import utils
@@ -59,7 +60,7 @@
def message(self, msg):
# called by LOGGER
if self._is_logged(msg.level):
- self._status_text(msg.level).write_msg(msg.message)
+ self._status_text(msg.level).write_message(msg.message)
def _status_text(self, text):
return StatusText(text, self._colors)
@@ -98,11 +99,14 @@
def StatusText(msg, colors=True):
if colors:
+ if os.sep == '\\':
+ return DosHiglightedStatusText(msg)
return HiglightedStatusText(msg)
return PlainStatusText(msg)
class PlainStatusText:
+ _highlight_colors = {}
def __init__(self, msg):
self._msg = msg
@@ -111,34 +115,107 @@
return self._msg
def write_status(self, stream=sys.__stdout__):
- self.write(' | %s |' % self, stream)
-
- def write_msg(self, msg):
- self.write('[ %s ] %s' % (self, msg), stream=sys.__stderr__)
+ self.write(' | %s |' % self._msg, stream)
+
+ def write_message(self, message):
+ self.write('[ %s ] %s' % (self._msg, message),
stream=sys.__stderr__)
def write(self, message, newline=True, stream=sys.__stdout__):
if newline:
message += '\n'
- stream.write(utils.encode_output(message).replace('\t', ' '*8))
+ self._write_encoded_with_tab_replacing(stream, message)
stream.flush()
+ def _write_encoded_with_tab_replacing(self, stream, message):
+ stream.write(utils.encode_output(message).replace('\t', ' '*8))
+
+ def _get_highlight_color(self, text):
+ if text in self._highlight_colors:
+ return self._highlight_colors[text]
+ raise FrameworkError
+
class HiglightedStatusText(PlainStatusText):
ANSI_RED = '\033[31m'
ANSI_GREEN = '\033[32m'
ANSI_YELLOW = '\033[33m'
ANSI_RESET = '\033[0m'
+
+ _highlight_colors = {'FAIL': ANSI_RED,
+ 'ERROR': ANSI_RED,
+ 'WARN': ANSI_YELLOW,
+ 'PASS': ANSI_GREEN}
def __str__(self):
color = self._get_highlight_color(self._msg)
reset = color != '' and self.ANSI_RESET or ''
return color + self._msg + reset
- def _get_highlight_color(self, text):
- if text in ['FAIL','ERROR']:
- return self.ANSI_RED
- elif text == 'WARN':
- return self.ANSI_YELLOW
- elif text == 'PASS':
- return self.ANSI_GREEN
- raise FrameworkError
+
+from ctypes import windll, Structure, c_short, c_ushort, byref
+
+SHORT = c_short
+WORD = c_ushort
+
+class COORD(Structure):
+ _fields_ = [
+ ("X", SHORT),
+ ("Y", SHORT)]
+
+class SMALL_RECT(Structure):
+ _fields_ = [
+ ("Left", SHORT),
+ ("Top", SHORT),
+ ("Right", SHORT),
+ ("Bottom", SHORT)]
+
+class CONSOLE_SCREEN_BUFFER_INFO(Structure):
+ _fields_ = [
+ ("dwSize", COORD),
+ ("dwCursorPosition", COORD),
+ ("wAttributes", WORD),
+ ("srWindow", SMALL_RECT),
+ ("dwMaximumWindowSize", COORD)]
+
+
+class DosHiglightedStatusText(PlainStatusText):
+ FOREGROUND_RED = 0x0004
+ FOREGROUND_YELLOW = 0x0006
+ FOREGROUND_GREEN = 0x0002
+ FOREGROUND_INTENSITY = 0x0008
+ FOREGROUND_GREY = 0x0007
+
+ STD_OUTPUT_HANDLE = -11
+
+ _highlight_colors = {'FAIL': FOREGROUND_RED,
+ 'ERROR': FOREGROUND_RED,
+ 'WARN': FOREGROUND_YELLOW,
+ 'PASS': FOREGROUND_GREEN}
+
+ def write_status(self, newline=True, stream=sys.__stdout__):
+ self._write(None, ' |', '|', newline, stream)
+
+ def write_message(self, message, newline=True, stream=sys.__stderr__):
+ self._write(message, '[', ']', newline, stream)
+
+ def _write(self, message, start_sep, end_sep, newline=True,
stream=sys.__stdout__):
+ default_colors = self._get_text_attr()
+ default_fg = default_colors & 0x0007
+ default_bg = default_colors & 0x0070
+ self._write_encoded_with_tab_replacing(stream, start_sep)
+ self._set_text_attr(self._get_highlight_color(self._msg) |
self.FOREGROUND_INTENSITY)
+ self._write_encoded_with_tab_replacing(stream, ' %s ' % self._msg)
+ self._set_text_attr(default_fg | default_bg |
self.FOREGROUND_INTENSITY)
+ self._write_encoded_with_tab_replacing(stream, end_sep)
+ if message:
+ stream.write(' %s' % message)
+ if newline:
+ self._write_encoded_with_tab_replacing(stream, '\n')
+
+ def _set_text_attr(self, color):
+
windll.kernel32.SetConsoleTextAttribute(windll.kernel32.GetStdHandle(self.STD_OUTPUT_HANDLE),
color)
+
+ def _get_text_attr(self):
+ csbi = CONSOLE_SCREEN_BUFFER_INFO()
+ windll.kernel32.GetConsoleScreenBufferInfo(self.STD_OUTPUT_HANDLE,
byref(csbi))
+ return csbi.wAttributes