~ubuntu-branches/debian/wheezy/agtl/wheezy

« back to all changes in this revision

Viewing changes to files/advancedcaching/colorer.py

  • Committer: Bazaar Package Importer
  • Author(s): Heiko Stuebner
  • Date: 2011-01-22 13:55:12 UTC
  • mfrom: (1.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20110122135512-1mik0vssgpnx2fgu
Tags: 0.8.0.3-1
New upstream release

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
# source: http://stackoverflow.com/questions/384076/how-can-i-make-the-python-logging-output-to-be-colored
 
3
# encoding: utf-8
 
4
import logging
 
5
# now we patch Python code to add color support to logging.StreamHandler
 
6
def add_coloring_to_emit_windows(fn):
 
7
        # add methods we need to the class
 
8
    def _out_handle(self):
 
9
        import ctypes
 
10
        return ctypes.windll.kernel32.GetStdHandle(self.STD_OUTPUT_HANDLE)
 
11
    out_handle = property(_out_handle)
 
12
 
 
13
    def _set_color(self, code):
 
14
        import ctypes
 
15
        # Constants from the Windows API
 
16
        self.STD_OUTPUT_HANDLE = -11
 
17
        hdl = ctypes.windll.kernel32.GetStdHandle(self.STD_OUTPUT_HANDLE)
 
18
        ctypes.windll.kernel32.SetConsoleTextAttribute(hdl, code)
 
19
 
 
20
    setattr(logging.StreamHandler, '_set_color', _set_color)
 
21
 
 
22
    def new(*args):
 
23
        FOREGROUND_BLUE      = 0x0001 # text color contains blue.
 
24
        FOREGROUND_GREEN     = 0x0002 # text color contains green.
 
25
        FOREGROUND_RED       = 0x0004 # text color contains red.
 
26
        FOREGROUND_INTENSITY = 0x0008 # text color is intensified.
 
27
        FOREGROUND_WHITE     = FOREGROUND_BLUE|FOREGROUND_GREEN |FOREGROUND_RED
 
28
       # winbase.h
 
29
        STD_INPUT_HANDLE = -10
 
30
        STD_OUTPUT_HANDLE = -11
 
31
        STD_ERROR_HANDLE = -12
 
32
 
 
33
        # wincon.h
 
34
        FOREGROUND_BLACK     = 0x0000
 
35
        FOREGROUND_BLUE      = 0x0001
 
36
        FOREGROUND_GREEN     = 0x0002
 
37
        FOREGROUND_CYAN      = 0x0003
 
38
        FOREGROUND_RED       = 0x0004
 
39
        FOREGROUND_MAGENTA   = 0x0005
 
40
        FOREGROUND_YELLOW    = 0x0006
 
41
        FOREGROUND_GREY      = 0x0007
 
42
        FOREGROUND_INTENSITY = 0x0008 # foreground color is intensified.
 
43
 
 
44
        BACKGROUND_BLACK     = 0x0000
 
45
        BACKGROUND_BLUE      = 0x0010
 
46
        BACKGROUND_GREEN     = 0x0020
 
47
        BACKGROUND_CYAN      = 0x0030
 
48
        BACKGROUND_RED       = 0x0040
 
49
        BACKGROUND_MAGENTA   = 0x0050
 
50
        BACKGROUND_YELLOW    = 0x0060
 
51
        BACKGROUND_GREY      = 0x0070
 
52
        BACKGROUND_INTENSITY = 0x0080 # background color is intensified.
 
53
 
 
54
        levelno = args[1].levelno
 
55
        if(levelno>=50):
 
56
            color = BACKGROUND_YELLOW | FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_INTENSITY
 
57
        elif(levelno>=40):
 
58
            color = FOREGROUND_RED | FOREGROUND_INTENSITY
 
59
        elif(levelno>=30):
 
60
            color = FOREGROUND_YELLOW | FOREGROUND_INTENSITY
 
61
        elif(levelno>=20):
 
62
            color = FOREGROUND_GREEN
 
63
        elif(levelno>=10):
 
64
            color = FOREGROUND_BLACK
 
65
        else:
 
66
            color =  FOREGROUND_WHITE
 
67
        args[0]._set_color(color)
 
68
 
 
69
        ret = fn(*args)
 
70
        args[0]._set_color( FOREGROUND_WHITE )
 
71
        #print "after"
 
72
        return ret
 
73
    return new
 
74
 
 
75
def add_coloring_to_emit_ansi(fn):
 
76
    # add methods we need to the class
 
77
    def new(*args):
 
78
        levelno = args[1].levelno
 
79
        if(levelno>=50):
 
80
            color = '\x1b[31m' # red
 
81
        elif(levelno>=40):
 
82
            color = '\x1b[31m' # red
 
83
        elif(levelno>=30):
 
84
            color = '\x1b[33m' # yellow
 
85
        elif(levelno>=20):
 
86
            color = '\x1b[32m' # green
 
87
        elif(levelno>=10):
 
88
            color = '\x1b[39m' # pink
 
89
        else:
 
90
            color = '\x1b[0m' # normal
 
91
        args[1].msg = '%s%s%s' % (color, args[1].msg, '\x1b[0m')  # normal
 
92
        #print "after"
 
93
        return fn(*args)
 
94
    return new
 
95
 
 
96
import platform
 
97
if platform.system()=='Windows':
 
98
    # Windows does not support ANSI escapes and we are using API calls to set the console color
 
99
    logging.StreamHandler.emit = add_coloring_to_emit_windows(logging.StreamHandler.emit)
 
100
else:
 
101
    # all non-Windows platforms are supporting ANSI escapes so we use them
 
102
    logging.StreamHandler.emit = add_coloring_to_emit_ansi(logging.StreamHandler.emit)
 
 
b'\\ No newline at end of file'