4
4
# found in the LICENSE file.
5
5
6
6
"""Enables colored logger just by importing this module
7
+
8
+ Also, provides utiliy functions to use ANSI colors in the terminal.
7
9
"""
8
10
9
11
import ctypes
10
12
import sys
11
13
import 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 ()
12
60
13
61
14
62
def ansi_color_available ():
@@ -34,30 +82,35 @@ def ansi_color_available():
34
82
35
83
def add_coloring_to_emit_ansi (fn ):
36
84
# add methods we need to the class
85
+ @wraps (fn )
37
86
def new (* args ):
38
87
levelno = args [1 ].levelno
88
+ color = None
39
89
if levelno >= 40 :
40
- color = ' \x1b [31m' # red
90
+ color = RED
41
91
elif levelno >= 30 :
42
- color = ' \x1b [33m' # yellow
92
+ color = YELLOW
43
93
elif levelno >= 20 :
44
- color = ' \x1b [32m' # green
94
+ color = GREEN
45
95
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 )
50
99
return fn (* args )
51
100
52
101
new .orig_func = fn
53
102
return new
54
103
55
104
56
- def enable ():
57
- if ansi_color_available ():
105
+ def enable (force = False ):
106
+ global color_enabled
107
+ if force or ansi_color_available ():
58
108
logging .StreamHandler .emit = add_coloring_to_emit_ansi (logging .StreamHandler .emit )
109
+ color_enabled = True
59
110
60
111
61
112
def disable ():
113
+ global color_enabled
62
114
if hasattr (logging .StreamHandler .emit , 'orig_func' ):
63
115
logging .StreamHandler .emit = logging .StreamHandler .emit .orig_func
116
+ color_enabled = False
0 commit comments