44# found in the LICENSE file.
55
66"""Enables colored logger just by importing this module
7+
8+ Also, provides utiliy functions to use ANSI colors in the terminal.
79"""
810
911import ctypes
1012import sys
1113import logging
14+ from functools import wraps
15+
16+
17+ # ANSI colors
18+ RED = 1
19+ GREEN = 2
20+ YELLOW = 3
21+ BLUE = 4
22+ MAGENTA = 5
23+ CYAN = 6
24+ WHITE = 7
25+
26+ color_enabled = False
27+
28+
29+ def output_color (color ):
30+ assert color_enabled
31+ return '\033 [3%sm' % color
32+
33+
34+ def bold ():
35+ assert color_enabled
36+ return '\033 [1m'
37+
38+
39+ def reset_color ():
40+ assert color_enabled
41+ return '\033 [0m'
42+
43+
44+ def with_bold_color (color , string ):
45+ if not color_enabled :
46+ return string
47+ return output_color (color ) + bold () + string + reset_color ()
48+
49+
50+ def with_color (color , string ):
51+ if not color_enabled :
52+ return string
53+ return output_color (color ) + string + reset_color ()
54+
55+
56+ def with_bold (string ):
57+ if not color_enabled :
58+ return string
59+ return bold () + string + reset_color ()
1260
1361
1462def ansi_color_available ():
@@ -34,30 +82,35 @@ def ansi_color_available():
3482
3583def add_coloring_to_emit_ansi (fn ):
3684 # add methods we need to the class
85+ @wraps (fn )
3786 def new (* args ):
3887 levelno = args [1 ].levelno
88+ color = None
3989 if levelno >= 40 :
40- color = ' \x1b [31m' # red
90+ color = RED
4191 elif levelno >= 30 :
42- color = ' \x1b [33m' # yellow
92+ color = YELLOW
4393 elif levelno >= 20 :
44- color = ' \x1b [32m' # green
94+ color = GREEN
4595 elif levelno >= 10 :
46- color = '\x1b [35m' # pink
47- else :
48- color = '\x1b [0m' # normal
49- args [1 ].msg = color + args [1 ].msg + '\x1b [0m' # normal
96+ color = MAGENTA
97+ if color :
98+ args [1 ].msg = with_color (color , args [1 ].msg )
5099 return fn (* args )
51100
52101 new .orig_func = fn
53102 return new
54103
55104
56- def enable ():
57- if ansi_color_available ():
105+ def enable (force = False ):
106+ global color_enabled
107+ if force or ansi_color_available ():
58108 logging .StreamHandler .emit = add_coloring_to_emit_ansi (logging .StreamHandler .emit )
109+ color_enabled = True
59110
60111
61112def disable ():
113+ global color_enabled
62114 if hasattr (logging .StreamHandler .emit , 'orig_func' ):
63115 logging .StreamHandler .emit = logging .StreamHandler .emit .orig_func
116+ color_enabled = False
0 commit comments