<s> import ctypes <EOL> import logging <EOL> import os <EOL> class ColorizingStreamHandler ( logging . StreamHandler ) : <EOL> color_map = { <EOL> '<STR_LIT>' : <NUM_LIT:0> , <EOL> '<STR_LIT>' : <NUM_LIT:1> , <EOL> '<STR_LIT>' : <NUM_LIT:2> , <EOL> '<STR_LIT>' : <NUM_LIT:3> , <EOL> '<STR_LIT>' : <NUM_LIT:4> , <EOL> '<STR_LIT>' : <NUM_LIT:5> , <EOL> '<STR_LIT>' : <NUM_LIT:6> , <EOL> '<STR_LIT>' : <NUM_LIT:7> , <EOL> } <EOL> if os . name == '<STR_LIT>' : <EOL> level_map = { <EOL> logging . DEBUG : ( None , '<STR_LIT>' , True ) , <EOL> logging . INFO : ( None , '<STR_LIT>' , False ) , <EOL> logging . WARNING : ( None , '<STR_LIT>' , True ) , <EOL> logging . ERROR : ( None , '<STR_LIT>' , True ) , <EOL> logging . CRITICAL : ( '<STR_LIT>' , '<STR_LIT>' , True ) , <EOL> } <EOL> else : <EOL> level_map = { <EOL> logging . DEBUG : ( None , '<STR_LIT>' , False ) , <EOL> logging . INFO : ( None , '<STR_LIT>' , False ) , <EOL> logging . WARNING : ( None , '<STR_LIT>' , False ) , <EOL> logging . ERROR : ( None , '<STR_LIT>' , False ) , <EOL> logging . CRITICAL : ( '<STR_LIT>' , '<STR_LIT>' , True ) , <EOL> } <EOL> csi = '<STR_LIT>' <EOL> reset = '<STR_LIT>' <EOL> @ property <EOL> def is_tty ( self ) : <EOL> if os . environ . get ( '<STR_LIT>' ) : <EOL> return True <EOL> isatty = getattr ( self . stream , '<STR_LIT>' , None ) <EOL> return isatty and isatty ( ) <EOL> def emit ( self , record ) : <EOL> try : <EOL> message = self . format ( record ) <EOL> stream = self . stream <EOL> if not self . is_tty : <EOL> stream . write ( message ) <EOL> else : <EOL> self . output_colorized ( message ) <EOL> stream . write ( getattr ( self , '<STR_LIT>' , '<STR_LIT:\n>' ) ) <EOL> self . flush ( ) <EOL> except ( KeyboardInterrupt , SystemExit ) : <EOL> raise <EOL> except : <EOL> self . handleError ( record ) <EOL> if os . name != '<STR_LIT>' : <EOL> def output_colorized ( self , message ) : <EOL> self . stream . write ( message ) <EOL> else : <EOL> import re <EOL> ansi_esc = re . compile ( r'<STR_LIT>' ) <EOL> nt_color_map = { <EOL> <NUM_LIT:0> : <NUM_LIT> , <EOL> <NUM_LIT:1> : <NUM_LIT> , <EOL> <NUM_LIT:2> : <NUM_LIT> , <EOL> <NUM_LIT:3> : <NUM_LIT> , <EOL> <NUM_LIT:4> : <NUM_LIT> , <EOL> <NUM_LIT:5> : <NUM_LIT> , <EOL> <NUM_LIT:6> : <NUM_LIT> , <EOL> <NUM_LIT:7> : <NUM_LIT> , <EOL> } <EOL> def output_colorized ( self , message ) : <EOL> parts = self . ansi_esc . split ( message ) <EOL> write = self . stream . write <EOL> h = None <EOL> fd = getattr ( self . stream , '<STR_LIT>' , None ) <EOL> if fd is not None : <EOL> fd = fd ( ) <EOL> if fd in ( <NUM_LIT:1> , <NUM_LIT:2> ) : <EOL> h = ctypes . windll . kernel32 . GetStdHandle ( - <NUM_LIT:10> - fd ) <EOL> while parts : <EOL> text = parts . pop ( <NUM_LIT:0> ) <EOL> if text : <EOL> write ( text ) <EOL> if parts : <EOL> params = parts . pop ( <NUM_LIT:0> ) <EOL> if h is not None : <EOL> params = [ int ( p ) for p in params . split ( '<STR_LIT:;>' ) ] <EOL> color = <NUM_LIT:0> <EOL> for p in params : <EOL> if <NUM_LIT> <= p <= <NUM_LIT> : <EOL> color |= self . nt_color_map [ p - <NUM_LIT> ] << <NUM_LIT:4> <EOL> elif <NUM_LIT:30> <= p <= <NUM_LIT> : <EOL> color |= self . nt_color_map [ p - <NUM_LIT:30> ] <EOL> elif p == <NUM_LIT:1> : <EOL> color |= <NUM_LIT> <EOL> elif p == <NUM_LIT:0> : <EOL> color = <NUM_LIT> <EOL> else : <EOL> pass <EOL> ctypes . windll . kernel32 . SetConsoleTextAttribute ( h , <EOL> color ) <EOL> def colorize ( self , message , record ) : <EOL> if record . levelno in self . level_map : <EOL> bg , fg , bold = self . level_map [ record . levelno ] <EOL> params = [ ] <EOL> if bg in self . color_map : <EOL> params . append ( str ( self . color_map [ bg ] + <NUM_LIT> ) ) <EOL> if fg in self . color_map : <EOL> params . append ( str ( self . color_map [ fg ] + <NUM_LIT:30> ) ) <EOL> if bold : <EOL> params . append ( '<STR_LIT:1>' ) <EOL> if params : <EOL> message = '<STR_LIT>' . join ( ( self . csi , '<STR_LIT:;>' . join ( params ) , <EOL> '<STR_LIT:m>' , message , self . reset ) ) <EOL> return message <EOL> def format ( self , record ) : <EOL> message = logging . StreamHandler . format ( self , record ) <EOL> if self . is_tty : <EOL> parts = message . split ( '<STR_LIT:\n>' , <NUM_LIT:1> ) <EOL> parts [ <NUM_LIT:0> ] = self . colorize ( parts [ <NUM_LIT:0> ] , record ) <EOL> message = '<STR_LIT:\n>' . join ( parts ) <EOL> return message <EOL> def main ( ) : <EOL> root = logging . getLogger ( ) <EOL> root . setLevel ( logging . DEBUG ) <EOL> root . addHandler ( ColorizingStreamHandler ( ) ) <EOL> logging . debug ( '<STR_LIT>' ) <EOL> logging . info ( '<STR_LIT>' ) <EOL> logging . warning ( '<STR_LIT>' ) <EOL> logging . error ( '<STR_LIT>' ) <EOL> logging . critical ( '<STR_LIT>' ) <EOL> if __name__ == '<STR_LIT:__main__>' : <EOL> main ( ) </s>
