U
    ¯ªhZ1  ã                   @   s’   d dl 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 ddlm	Z	 ddl
mZ dd„ Zd	d
„ Zdd„ ZG dd„ deƒZG dd„ dƒZdS )é    N)Úcontextmanager)ÚThreadé   )Ú	Colorizer)Úcreate_handler_lockc                 C   s   t  | ¡}|| |¡fS ©N)r   Úprepare_formatÚcolorize)Úformat_Ú
ansi_levelÚcolored© r   ú3/tmp/pip-unpacked-wheel-j9z6yzd1/loguru/_handler.pyÚprepare_colored_format   s    
r   c                 C   s   t  | ¡}| ¡ S r   )r   r   Ústrip)r
   r   r   r   r   Úprepare_stripped_format   s    
r   c                 C   s   t jdd| ƒS )Né@   )Úmaxsize)Ú	functoolsÚ	lru_cache)Úfunctionr   r   r   Úmemoize   s    r   c                   @   s   e Zd ZdZdS )ÚMessage)ÚrecordN)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r   r   r   r   r      s   r   c                   @   s€   e Zd Zdd„ Zdd„ Zedd„ ƒZdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zedd„ ƒZedd„ ƒZdd„ Zdd„ Zdd„ ZdS )ÚHandlerc                C   s€  || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
|| _|| _|| _d | _i | _d | _d| _tƒ | _t ¡ | _d | _d | _d | _d | _d | _d | _| jrÆ| jrºttƒ| _qðttƒ| _n*| jrä| jD ]}|   |¡ qÒn| j !¡ | _| jr|| j	d kr$t" #¡ | _t" $¡ | _t" %¡ | _n$| j	 #¡ | _| j	 $¡ | _| j	 %¡ | _tƒ | _t& '¡ | _t(| j)dd| j d| _| j *¡  d S )NFTzloguru-writer-%d)ÚtargetÚdaemonÚname)+Ú_nameÚ_sinkÚ_levelnoÚ
_formatterÚ_is_formatter_dynamicÚ_filterÚ	_colorizeÚ
_serializeÚ_enqueueZ_multiprocessing_contextÚ_error_interceptorÚ_exception_formatterÚ_idÚ_levels_ansi_codesÚ_decolorized_formatÚ_precolorized_formatsÚ_memoize_dynamic_formatÚ_stoppedr   Ú_lockÚ	threadingÚlocalÚ_lock_acquiredÚ_queueÚ_queue_lockÚ_confirmation_eventÚ_confirmation_lockÚ_owner_process_pidÚ_threadr   r   r   Úupdate_formatr   ÚmultiprocessingÚSimpleQueueÚEventÚLockÚosÚgetpidr   Ú_queued_writerÚstart)ÚselfZsinkr!   ÚlevelnoÚ	formatterZis_formatter_dynamicZfilter_r	   Ú	serializeÚenqueueZmultiprocessing_contextZerror_interceptorZexception_formatterZid_Zlevels_ansi_codesZ
level_namer   r   r   Ú__init__    sd    




  ÿzHandler.__init__c                 C   s   d| j | j| jf S )Nz(id=%d, level=%d, sink=%s))r-   r$   r"   ©rF   r   r   r   Ú__repr__k   s    zHandler.__repr__c              	   c   sJ   t | jddƒrtdƒ‚d| j_z| j dV  W 5 Q R X W 5 d| j_X dS )zNAcquire the lock, but fail fast if its already acquired by the current thread.ÚacquiredFa
  Could not acquire internal lock because it was already in use (deadlock avoided). This likely happened because the logger was re-used inside a sink, a signal handler or a '__del__' method. This is not permitted because the logger and its handlers are not re-entrant.TN)Úgetattrr6   ÚRuntimeErrorrN   r3   rL   r   r   r   Ú_protected_lockn   s    ÿzHandler._protected_lockc              	   C   s   zh| j |d jkrW d S | jd k	r4|  |¡s4W d S | jrD|  |¡}| ¡ }|d s^d|d< n4|d \}}	}
| j}|j||	|
|d}d |¡|d< |d k	r¬|j	|d kr¬d }|rà|d ks¾| j
sÈ|d }n| j| }| |¡}n| jrx| j
s|  |¡}| |¡}np|d kr6| j| }|  ||¡\}}| |¡}n@| j| }|  ||¡\}}|j|d ||d}||d< | |¡}n€| j
s’| j}| |¡}nf|d kr¼| j| }| j| }| |¡}n<| j| }| j| }| jj|d ||d}||d< | |¡}| jr|  ||¡}t|ƒ}||_|  ¡ @ | jr<W 5 Q R £ W d S | jrR| j |¡ n| j |¡ W 5 Q R X W n0 tk
rš   | j ¡ sŠ‚ | j  |¡ Y nX d S )NÚlevelÚ	exceptionÚ )Úfrom_decoratorÚmessage)r   Úcolored_message)!r$   Únor'   r&   r%   Úcopyr,   Úformat_exceptionÚjoinÚstrippedr(   r.   r	   r1   Ú
format_mapZmake_coloring_messager/   r0   r)   Ú_serialize_recordr   r   rQ   r2   r*   r7   Úputr#   ÚwriteÚ	Exceptionr+   Zshould_catchÚprint)rF   r   Úlevel_idrU   Zis_rawrW   Zdynamic_formatZformatter_recordÚtype_ÚvalueÚtbrH   ÚlinesÚ	formattedr   Zprecomputed_formatÚ_Zcoloring_messageZ
str_recordr   r   r   Úemit   s    









 ÿ  ÿ




  ÿ

zHandler.emitc              	   C   sv   |   ¡ d d| _| jr^| jt ¡ kr2W 5 Q R £ d S | j d ¡ | j 	¡  t
| jdƒr^| j ¡  | j ¡  W 5 Q R X d S )NTÚclose)rQ   r2   r*   r;   rB   rC   r7   r_   r<   r[   Úhasattrrk   r#   ÚstoprL   r   r   r   rm   Ô   s    


zHandler.stopc              	   C   s@   | j s
d S | j& | j d¡ | j ¡  | j ¡  W 5 Q R X d S ©NT)r*   r:   r7   r_   r9   ÚwaitÚclearrL   r   r   r   Úcomplete_queueá   s    
zHandler.complete_queuec              
   C   sR   | j r| jt ¡ krg S | j r$| jn|  ¡ }| | j ¡ W  5 Q R £ S Q R X d S r   )r*   r;   rB   rC   r8   rQ   r#   Útasks_to_complete)rF   Úlockr   r   r   rr   ê   s
    zHandler.tasks_to_completec                 C   s0   | j r| jrd S | j| }| j |¡| j|< d S r   )r(   r&   r.   r%   r	   r0   )rF   rc   Z	ansi_coder   r   r   r=   ñ   s    
zHandler.update_formatc                 C   s   | j S r   )r$   rL   r   r   r   rG   ÷   s    zHandler.levelnoc                 C   sü   |d }|d k	r6|j d krd n|j j|jt|jƒdœ}| |d |d  ¡ dœ||d |d j|d jdœ|d |d	 j|d	 j|d	 j	d
œ|d |d |d |d |d j
|d jdœ|d j
|d jdœ|d |d  ¡ dœdœdœ}tj|tddd S )NrS   )Útypere   Ú	tracebackÚelapsed)ÚreprÚsecondsÚextraÚfile)r!   Úpathr   rR   )Úiconr!   rX   ÚlinerV   Úmoduler!   Úprocess)Úidr!   ÚthreadÚtime)rw   Ú	timestamp)rv   rS   ry   rz   r   rR   r}   rV   r~   r!   r   r   r‚   )Útextr   F)ÚdefaultÚensure_asciiÚ
)rt   r   re   Úboolru   Útotal_secondsr!   r{   r|   rX   r€   rƒ   ÚjsonÚdumpsÚstr)r„   r   rS   Zserializabler   r   r   r^   û   s8    ý
þýìþzHandler._serialize_recordc                 C   sº   d }| j }| j}z| ¡ }W n4 tk
rP   | | j d ¡ W 5 Q R X Y qY nX |d kr\q¶|dkrp| j ¡  q|: z| j 	|¡ W n" tk
r¨   | j |j
¡ Y nX W 5 Q R X qd S rn   )r7   r8   Úgetra   r+   rb   r9   Úsetr#   r`   r   )rF   rV   Úqueuers   r   r   r   rD   "  s&    

zHandler._queued_writerc                 C   sL   | j  ¡ }d |d< d |d< d |d< | jrHd |d< d |d< d |d< d |d< |S )Nr3   r6   r1   r#   r<   Z_owner_processr8   )Ú__dict__rY   r*   ©rF   Ústater   r   r   Ú__getstate__?  s    
zHandler.__getstate__c                 C   sR   | j  |¡ tƒ | _t ¡ | _| jr,tƒ | _| j	rN| j
rDttƒ| _n
ttƒ| _d S r   )r   Úupdater   r3   r4   r5   r6   r*   r8   r&   r(   r   r   r1   r   r‘   r   r   r   Ú__setstate__K  s    
zHandler.__setstate__N)r   r   r   rK   rM   r   rQ   rj   rm   rq   rr   r=   ÚpropertyrG   Ústaticmethodr^   rD   r“   r•   r   r   r   r   r      s    K
U	

&r   )r   rŠ   r>   rB   r4   Ú
contextlibr   r   Z
_colorizerr   Z_locks_machineryr   r   r   r   rŒ   r   r   r   r   r   r   Ú<module>   s   