1+ from .imports import stdout ,stderr ,datetime
2+ DEBUG = 1
3+ INFO = 2
4+ WARNING = 3
5+ ERROR = 4
6+ CRITICAL = 5
7+ UNKNOWN = 6
8+ class Override :
9+ def __init__ (self ,function ):
10+ self .__funcmap = {}
11+ self .__default = function
12+ self .override (function )
13+ def override (self ,function ):
14+ args = function .__annotations__ .copy ()
15+ args .pop ("return" ,None )
16+ args = tuple (args .values ())
17+ self .__funcmap [args ] = function
18+ return function
19+ def override_manual (self ,* args ):
20+ args = tuple ([arg .__class__ if type (arg ) != type else arg for arg in args ])
21+ funcmap = self .__funcmap
22+ def wrapper (function ):
23+ funcmap [args ]= function
24+ return function
25+ return wrapper
26+ def default (self ,function )-> None :self .__default = function
27+ def __call__ (self , * args , ** kwargs ) -> any :
28+ arg = [type (a ) for a in args ] + [type (k ) for k in kwargs .values ()]
29+ func = self .__funcmap .get (tuple (arg ), self .__default )
30+ return func (* args , ** kwargs ) if func else None
31+ class SpecialAscii :
32+ reset = "\033 [0m"
33+ bold = "\033 [1m"
34+ underline = "\033 [4m"
35+ invert = "\033 [7m"
36+ black = "\033 [30m"
37+ red = "\033 [31m"
38+ green = "\033 [32m"
39+ yellow = "\033 [33m"
40+ blue = "\033 [34m"
41+ purple = "\033 [35m"
42+ cyan = "\033 [36m"
43+ white = "\033 [37m"
44+ bg_black = "\033 [40m"
45+ bg_red = "\033 [41m"
46+ bg_green = "\033 [42m"
47+ bg_yellow = "\033 [43m"
48+ bg_blue = "\033 [44m"
49+ bg_purple = "\033 [45m"
50+ bg_cyan = "\033 [46m"
51+ bg_white = "\033 [47m"
52+ bright_black = "\033 [90m"
53+ bright_red = "\033 [91m"
54+ bright_green = "\033 [92m"
55+ bright_yellow = "\033 [93m"
56+ bright_blue = "\033 [94m"
57+ bright_purple = "\033 [95m"
58+ bright_cyan = "\033 [96m"
59+ bright_white = "\033 [97m"
60+ bg_bright_black = "\033 [100m"
61+ bg_bright_red = "\033 [101m"
62+ bg_bright_green = "\033 [102m"
63+ bg_bright_yellow = "\033 [103m"
64+ bg_bright_blue = "\033 [104m"
65+ bg_bright_purple = "\033 [105m"
66+ bg_bright_cyan = "\033 [106m"
67+ bg_bright_white = "\033 [107m"
68+ class Logger :
69+ colorized = {DEBUG :SpecialAscii .bright_cyan + "DEBUG" + SpecialAscii .reset ,INFO :SpecialAscii .bright_green + "INFO" + SpecialAscii .reset ,WARNING :SpecialAscii .bright_yellow + "WARNING" + SpecialAscii .reset ,ERROR :SpecialAscii .red + "ERROR" + SpecialAscii .reset ,CRITICAL :SpecialAscii .bright_white + SpecialAscii .bg_red + "CRITICAL" + SpecialAscii .reset ,UNKNOWN :SpecialAscii .white + SpecialAscii .bg_purple + "UNKNOWN" + SpecialAscii .reset }
70+ non_colorized = {DEBUG :"DEBUG" ,INFO :"INFO" ,WARNING :"WARNING" ,ERROR :"ERROR" ,CRITICAL :"CRITICAL" ,UNKNOWN :"UNKNOWN" }
71+ def __init__ (self ,name :str = __name__ ,log_level :int = INFO ,color :bool = True ,std_out = stdout ,std_err = stderr ):
72+ self .__name = name
73+ self .__textmap = self .colorized if color else self .non_colorized
74+ self .__level = log_level
75+ self .__stdout = std_out
76+ self .__stderr = std_err
77+ def log (self ,message :str ,level :int )-> None :
78+ if level < self .__level :return
79+ time = datetime .now ().strftime ("%Y-%m-%d %H:%M:%S" )
80+ level_msg = self .__textmap .get (level )
81+ if not level_msg :level_msg = self .__textmap .get (UNKNOWN )
82+ print ("[{}] [{}] {}: {}" .format (time ,level_msg ,self .__name ,message ),file = self .__stdout if level <= WARNING else self .__stderr )
0 commit comments