o
    3go&                     @  s<  d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
 d0ddZd	Zd
ZejdddZeZe
eedf Zd1ddZd2ddZd3ddZddd4ddZedd5ddZG d d! d!ejZG d"d# d#ejZddd6d%d&Zd'd( Zed)kre  e	sd*d+l m!Z! e!d,d-d. Z"e!d,d/d Z#dS dS )7    )annotationsN)	lru_cache)TYPE_CHECKINGUnionreturnNonec               
   C  s   ddl m}  dd }zd j W n ty# } z|}W Y d }~nd }~ww |d td}|d |d t  |d	 |d
 || |d t	d}|
d |d |d |d || |d tdtj |d d S )Nr   )Callablec                 S  s   t | tjdS )N)file)printsysstderr)s r   )/home/garg/my-data/HPI/my/core/logging.py<lambda>   s    ztest.<locals>.<lambda>z+   Logging module's defaults are not great:default_loggerztFor example, this should be logged as error. But it's not even formatted properly, doesn't have logger name or levelzY
   The reason is that you need to remember to call basicConfig() first. Let's do it now:zkOK, this is better. But the default format kinda sucks, I prefer having timestamps and the file/line numberzr
   Also exception logging is kinda lame, doesn't print traceback by default unless you remember to pass exc_info:zq

    With make_logger you get a reasonable logging format, colours (via colorlog library) and other neat things:testzdefault level is INFOz"... so this shouldn't be displayedzwarnings are easy to spot!z/
    Exceptions print traceback by default now:zt
    You can (and should) use it via regular logging.getLogger after that, e.g. let's set logging level to DEBUG nowz)... now debug messages are also displayed)typingr   whatever	Exceptionlogging	getLoggererrorbasicConfig	exceptionmake_loggerinfodebugwarningsetLevelDEBUG)r   Meexlllr   r   r   r      s4   








r   INFOzX{start}[%(levelname)-7s %(asctime)s %(name)s %(filename)s:%(lineno)-4d]{end} %(message)s startendlevelLevelIshLevelc                 C  s*   | d u rt jS t| tr| S tt |  S N)r   NOTSET
isinstanceintgetattrupperr+   r   r   r   mklevel:   s
   
r5   Level | Nonec                  C  s>   t jdd } | d urt| S t jdd } | d urtjS d S )NLOGGING_COLLAPSECOLLAPSE_DEBUG_LOGS)osenvirongetr5   r   r    )clr   r   r   get_collapse_levelB   s   r=   namestrc                 C  s   d}t j||  d pt j|| dd d }|d ur t|S dt jv r,tt jd S dt jv rBddlm} |d tt jd S d S )	NLOGGING_LEVEL_._LOGGING_LEVEL_HPIHPI_LOGSr   )mediumzNThe HPI_LOGS environment variable is deprecated, use LOGGING_LEVEL_HPI instead)r9   r:   r;   replacer5   my.core.warningsrE   )r>   PREFIXlvlrE   r   r   r   get_env_levelN   s   ,

rJ   r4   loggerstr | logging.Loggerc                C  sf   t | tr
t| } |du rt}t| j}|dur|}nt|}| jtj	kr+| 
| t| jd dS )z,
    Wrapper to simplify logging setup.
    N)r>   )r0   r?   r   r   DEFAULT_LEVELrJ   r>   r5   r+   r/   r   _setup_handlers_and_formatters)rK   r+   	env_levelrI   r   r   r   setup_loggerd   s   



rP   c                 C  s   t | }|t  t }|d u stj st  }nt	|d}|
| d|_zdd l}W n tyD   tjddd t t}Y nw tjddd	}|j rW||}nt t}|| d S )
N)maxlevelFr   z>You might want to 'pip install colorlog' for nice colored logs   
stacklevelz%(log_color)sz	%(reset)sr(   )r   r   	addFilterAddExceptionTracebackr=   r   r   isattyStreamHandlerCollapseLogsHandler
addHandler	propagatecolorlogModuleNotFoundErrorwarningswarn	FormatterFORMAT_NOCOLORFORMATformatstreamColoredFormattersetFormatter)r>   rK   collapse_levelhandlerr\   	formatterFORMAT_COLORr   r   r   rN   }   s&   





rN   c                   @  s   e Zd ZdddZdS )	rV   recordlogging.LogRecordr   boolc                 C  sH   |j dkr"|j}t|tr"|jd u s|jdkr"t|||jf}||_dS )NERROR)NNNT)	levelnamemsgr0   BaseExceptionexc_infotype__traceback__)selfrk   excrr   r   r   r   filter   s   

zAddExceptionTraceback.filterN)rk   rl   r   rm   )__name__
__module____qualname__rw   r   r   r   r   rV      s    rV   c                      sH   e Zd ZU dZdZded< ejZded< d fd	d
Z	dddZ
  ZS )rY   z
    Collapses subsequent debug log lines and redraws on the same line.
    Hopefully this gives both a sense of progress and doesn't clutter the terminal as much?
    Frm   lastr-   rQ   r   r   c                  s   t  j|i | || _d S r.   )super__init__rQ   )ru   rQ   argskwargs	__class__r   r   r}      s   
zCollapseLogsHandler.__init__rk   rl   c              	   C  s   zL|  |}|j| jkod|v}|r| jr| jd n	| jr%| jd || _td\}}| j|dtd|t	|   |rBdnd  | 
  W d S    | | Y d S )N
z[Kr    r'   )rc   levelnorQ   r{   rd   writer9   get_terminal_sizemaxlenflushhandleError)ru   rk   rp   curcolumnsrB   r   r   r   emit   s   
.zCollapseLogsHandler.emit)rQ   r-   r   r   )rk   rl   r   r   )rx   ry   rz   __doc__r{   __annotations__r   r    rQ   r}   r   __classcell__r   r   r   r   rY      s   
 rY   logging.Loggerc                C  s   t | }t||d |S )Nr4   )r   r   rP   )r>   r+   rK   r   r   r   r      s   
r   c                  C  s   ddl m}  tjdd d u r|  S zdd l}W n ty+   tjddd |   Y S w t	|dd }|d ur8|S |
 }t|d| |S )Nr   )MockENLIGHTEN_ENABLEzAYou might want to 'pip install enlighten' for a nice progress barrR   rS   INSTANCE)unittest.mockr   r9   r:   r;   	enlightenr]   r^   r_   r2   get_managersetattr)r   r   instancer   r   r   get_enlighten   s   
r   __main__rR   )
deprecatedzuse make_logger insteadc                  O     t | i |S r.   r   r~   r   r   r   r   
LazyLogger     r   c                  O  r   r.   r   r   r   r   r   rK     r   )r   r   )r+   r,   r   r-   )r   r6   )r>   r?   r   r6   )rK   rL   r+   r,   r   r   )r>   r?   r   r   )r>   r?   r+   r,   r   r   )$
__future__r   r   r9   r   r^   	functoolsr   r   r   r   r   rM   rb   rc   ra   r1   r-   r?   r,   r5   r=   rJ   rP   rN   FilterrV   rX   rY   r   r   rx   compatr   r   rK   r   r   r   r   <module>   s@    
&


*"	
