1
+ from __future__ import annotations
1
2
import io
2
3
import os
3
4
import sys
4
5
5
6
COLORIZE = True
6
7
8
+ # types
9
+ if False :
10
+ from typing import IO
11
+
7
12
8
13
class ANSIColors :
9
- BOLD_GREEN = "\x1b [1;32m"
10
- BOLD_MAGENTA = "\x1b [1;35m"
11
- BOLD_RED = "\x1b [1;31m"
14
+ RESET = "\x1b [0m"
15
+
16
+ BLACK = "\x1b [30m"
17
+ BLUE = "\x1b [34m"
18
+ CYAN = "\x1b [36m"
12
19
GREEN = "\x1b [32m"
13
- GREY = "\x1b [90m"
14
20
MAGENTA = "\x1b [35m"
15
21
RED = "\x1b [31m"
16
- RESET = "\x1b [0m"
22
+ WHITE = "\x1b [37m" # more like LIGHT GRAY
17
23
YELLOW = "\x1b [33m"
18
24
25
+ BOLD_BLACK = "\x1b [1;30m" # DARK GRAY
26
+ BOLD_BLUE = "\x1b [1;34m"
27
+ BOLD_CYAN = "\x1b [1;36m"
28
+ BOLD_GREEN = "\x1b [1;32m"
29
+ BOLD_MAGENTA = "\x1b [1;35m"
30
+ BOLD_RED = "\x1b [1;31m"
31
+ BOLD_WHITE = "\x1b [1;37m" # actual WHITE
32
+ BOLD_YELLOW = "\x1b [1;33m"
33
+
34
+ # intense = like bold but without being bold
35
+ INTENSE_BLACK = "\x1b [90m"
36
+ INTENSE_BLUE = "\x1b [94m"
37
+ INTENSE_CYAN = "\x1b [96m"
38
+ INTENSE_GREEN = "\x1b [92m"
39
+ INTENSE_MAGENTA = "\x1b [95m"
40
+ INTENSE_RED = "\x1b [91m"
41
+ INTENSE_WHITE = "\x1b [97m"
42
+ INTENSE_YELLOW = "\x1b [93m"
43
+
44
+ BACKGROUND_BLACK = "\x1b [40m"
45
+ BACKGROUND_BLUE = "\x1b [44m"
46
+ BACKGROUND_CYAN = "\x1b [46m"
47
+ BACKGROUND_GREEN = "\x1b [42m"
48
+ BACKGROUND_MAGENTA = "\x1b [45m"
49
+ BACKGROUND_RED = "\x1b [41m"
50
+ BACKGROUND_WHITE = "\x1b [47m"
51
+ BACKGROUND_YELLOW = "\x1b [43m"
52
+
53
+ INTENSE_BACKGROUND_BLACK = "\x1b [100m"
54
+ INTENSE_BACKGROUND_BLUE = "\x1b [104m"
55
+ INTENSE_BACKGROUND_CYAN = "\x1b [106m"
56
+ INTENSE_BACKGROUND_GREEN = "\x1b [102m"
57
+ INTENSE_BACKGROUND_MAGENTA = "\x1b [105m"
58
+ INTENSE_BACKGROUND_RED = "\x1b [101m"
59
+ INTENSE_BACKGROUND_WHITE = "\x1b [107m"
60
+ INTENSE_BACKGROUND_YELLOW = "\x1b [103m"
61
+
19
62
20
63
NoColors = ANSIColors ()
21
64
@@ -24,14 +67,16 @@ class ANSIColors:
24
67
setattr (NoColors , attr , "" )
25
68
26
69
27
- def get_colors (colorize : bool = False , * , file = None ) -> ANSIColors :
70
+ def get_colors (
71
+ colorize : bool = False , * , file : IO [str ] | IO [bytes ] | None = None
72
+ ) -> ANSIColors :
28
73
if colorize or can_colorize (file = file ):
29
74
return ANSIColors ()
30
75
else :
31
76
return NoColors
32
77
33
78
34
- def can_colorize (* , file = None ) -> bool :
79
+ def can_colorize (* , file : IO [ str ] | IO [ bytes ] | None = None ) -> bool :
35
80
if file is None :
36
81
file = sys .stdout
37
82
@@ -64,4 +109,4 @@ def can_colorize(*, file=None) -> bool:
64
109
try :
65
110
return os .isatty (file .fileno ())
66
111
except io .UnsupportedOperation :
67
- return file .isatty ()
112
+ return hasattr ( file , "isatty" ) and file .isatty ()
0 commit comments