U
    \Sh~F                  
   @  s@  U d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
mZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ erddlmZ dZdZedd ejejejej ej!eej"dZ#de$d< edd ej!eej"dZ%de$d< edd ejdej dej"diZ&de$d< dd d!d"d#Z'd$d%d&d'd(Z(G d)d* d*ej)Z*G d+d, d,e*Z+G d-d. d.e*Z,G d/d  d ej-Z.G d0d1 d1ej/Z0G d2d3 d3ej/Z1G d4d5 d5ej2j3Z4ed6d7d8d9Z5ed:d7d;d<Z6ed:d7d=d>Z7edpd@dAdBdCdDZ8eddAdEdFdGZ9G dHdI dIZ:G dJdK dKej;Z<dddLd@dMdNdOZ=G dPdQ dQej;Z>G dRdS dSej;Z?G dTdU dUej;Z@G dVdW dWej;ZAG dXdY dYej;ZBG dZd[ d[ej;ZCG d\d] d]eCZDG d^d_ d_eCZEd`dadbdcddZFG dedf dfejGZHG dgdh dhZIG didj djZJdkdldld%dmdndoZKdS )qz%Logging utility functions for Sphinx.    )annotationsN)defaultdict)contextmanager)IOTYPE_CHECKINGAny	Generator)nodes)Node)get_source_line)SphinxWarning)colorize)abspath)SphinxZsphinx   c                   C  s   t jS N)loggingWARNING r   r   F/root/rtd-docs/venv/lib/python3.8/site-packages/sphinx/util/logging.py<lambda>       r   )CRITICALZSEVEREERRORr   INFOVERBOSEDEBUGzdefaultdict[str, int]LEVEL_NAMESc                   C  s   t jS r   )r   NOTSETr   r   r   r   r   $   r   )r         zdefaultdict[int, int]VERBOSITY_MAPc                   C  s   dS )Nbluer   r   r   r   r   r   *   r   ZdarkredredZdarkgrayzdefaultdict[int, str]	COLOR_MAPstrSphinxLoggerAdapternamereturnc                 C  s"   t td |  }d|_t|i S )a  Get logger wrapped by :class:`sphinx.util.logging.SphinxLoggerAdapter`.

    Sphinx logger always uses ``sphinx.*`` namespace to be independent from
    settings of root logger.  It ensures logging is consistent even if a
    third-party extension or imported application resets logger settings.

    Example usage::

        >>> from sphinx.util import logging
        >>> logger = logging.getLogger(__name__)
        >>> logger.info('Hello, this is an extension!')
        Hello, this is an extension!
    .F)r   	getLogger	NAMESPACEdisabledr&   )r(   loggerr   r   r   r+   1   s    r+   list[logging.LogRecord]None)recordsr)   c                 C  s@   | D ]6}|  |_d|_t|dd}t|tjrt||_qdS )zConvert LogRecord serializable.r   locationN)	
getMessagemsgargsgetattr
isinstancer	   r
   get_node_locationr2   )r1   rr2   r   r   r   convert_serializableG   s    
r:   c                      s8   e Zd ZU dZdZdZded< dd fdd	Z  ZS )
SphinxLogRecordz$Log record class supporting location Nr   r2   r%   r)   c                   sH   t   }t| dd }|r0| d| j | }n| j|krD| j| }|S )Nr2   z: )superr3   r6   prefix)selfmessager2   	__class__r   r   r3   X   s    


zSphinxLogRecord.getMessage)	__name__
__module____qualname____doc__r?   r2   __annotations__r3   __classcell__r   r   rB   r   r;   S   s   
r;   c                   @  s   e Zd ZdZdZdS )SphinxInfoLogRecordz)Info log record class supporting locationr<   N)rD   rE   rF   rG   r?   r   r   r   r   rJ   c   s   rJ   c                   @  s"   e Zd ZdZeddddZdS )SphinxWarningLogRecordz,Warning log record class supporting locationr%   r=   c                 C  s(   | j tjkrdS | j tjkr dS dS d S )Nz
CRITICAL: zERROR: z	WARNING: )levelnor   r   r   r@   r   r   r   r?   j   s
    zSphinxWarningLogRecord.prefixN)rD   rE   rF   rG   propertyr?   r   r   r   r   rK   h   s   rK   c                      st   e Zd ZdZddddddgZdd	d
d
dd fddZd	d
d
ddddZd	dddddZdddddZ  Z	S )r&   z9LoggerAdapter allowing ``type`` and ``subtype`` keywords.typesubtyper2   nonlcoloroncez	int | strr%   r   r0   )levelr4   r5   kwargsr)   c                   sD   t |tr"t j||f|| nt| }t j||f|| d S r   )r7   intr>   logr   )r@   rT   r4   r5   rU   rL   rB   r   r   rW   x   s    
zSphinxLoggerAdapter.log)r4   r5   rU   r)   c                 O  s   | j t|f|| d S r   )rW   r   )r@   r4   r5   rU   r   r   r   verbose   s    zSphinxLoggerAdapter.verbosedictztuple[str, dict])r4   rU   r)   c                 C  s6   | di }| jD ]}||kr||||< q||fS )Nextra)
setdefaultKEYWORDSpop)r@   r4   rU   rZ   keywordr   r   r   process   s
    
zSphinxLoggerAdapter.processlogging.LogRecordrecordr)   c                 C  s   | j | d S r   )r.   handler@   rb   r   r   r   rc      s    zSphinxLoggerAdapter.handle)
rD   rE   rF   rG   r\   rW   rX   r_   rc   rI   r   r   rB   r   r&   t   s   	c                   @  s   e Zd ZdZdS )WarningStreamHandlerzStreamHandler for warnings.N)rD   rE   rF   rG   r   r   r   r   re      s   re   c                      s(   e Zd ZdZddd fddZ  ZS )NewLineStreamHandlerzAStreamHandler which switches line terminator by record.nonl flag.r`   r0   ra   c                   s@   z*|   t|ddrd| _ t | W 5 d| _ |   X d S )N
rQ   Fr<   )
terminatorreleaseacquirer6   r>   emitrd   rB   r   r   rk      s    zNewLineStreamHandler.emit)rD   rE   rF   rG   rk   rI   r   r   rB   r   rf      s   rf   c                      sl   e Zd ZU dZded< dd fddZdd	d
ddZddddZdddddZddddZ	  Z
S )MemoryHandlerzHandler buffering all logs.r/   bufferr0   r=   c                   s   t  d d S )N)r>   __init__rM   rB   r   r   ro      s    zMemoryHandler.__init__r`   boolra   c                 C  s   dS )NFr   rd   r   r   r   shouldFlush   s    zMemoryHandler.shouldFlushc                 C  s   d S r   r   rM   r   r   r   flush   s    zMemoryHandler.flushzlogging.Logger)r.   r)   c                 C  s8   |    z | jD ]}|| qg | _W 5 |   X d S r   )rj   ri   rm   rc   )r@   r.   rb   r   r   r   flushTo   s    

zMemoryHandler.flushToc                 C  s   | j g  }| _ |S r   )rm   )r@   rm   r   r   r   clear   s    zMemoryHandler.clear)rD   rE   rF   rG   rH   ro   rq   rr   rs   rt   rI   r   r   rB   r   rl      s   
	rl   z&Generator[logging.Handler, None, None]r=   c               
   c  s   t t} t }|t j zJg }| j	dd D ]"}t
|tr0| | || q0| | |V  W 5 | | |D ]}| | qv||  X dS )zgContext manager to postpone logging warnings temporarily.

    Similar to :func:`pending_logging`.
    N)r   r+   r,   rl   setLevelr   removeHandler
addHandlerrs   handlersr7   re   appendr.   
memhandlerrx   handlerr   r   r   pending_warnings   s    





r}   z$Generator[MemoryHandler, None, None]c               
   c  sv   t t} t }z@g }| jdd D ]}| | || q$| | |V  W 5 | | |D ]}| | q`X dS )zContext manager to suppress logging all logs temporarily.

    For example::

        >>> with suppress_logging():
        >>>     logger.warning('Warning message!')  # suppressed
        >>>     some_long_process()
        >>>
    N)r   r+   r,   rl   rv   rw   rx   ry   rz   r   r   r   suppress_logging   s    




r~   c               	   c  s8   t t} zt }|V  W 5 Q R X W 5 ||  X dS )a$  Context manager to postpone logging all logs temporarily.

    For example::

        >>> with pending_logging():
        >>>     logger.warning('Warning message!')  # not flushed yet
        >>>     some_long_process()
        >>>
        Warning message!  # the warning is flushed here
    N)r   r+   r,   rs   r~   )r.   r{   r   r   r   pending_logging   s
    
r   Trp   Generator[(None, None, None)])skipr)   c              
   c  sb   t t}| dkrdV  nDz*t }|jD ]}|jd| q(dV  W 5 |jD ]}|| qLX dS )z9Context manager to skip WarningIsErrorFilter temporarily.FNr   )r   r+   r,   rx   removeFilterDisableWarningIsErrorFilterfiltersinsert)r   r.   r|   Zdisablerr   r   r   skip_warningiserror  s    



r   r?   r)   c              	   c  s   t t}d}|jD ]}t|tr|} q6qdV  dS d}|jD ]}t|tr@|} qXq@|r~z|j}| |_dV  W 5 ||_X n*t| }z|
| dV  W 5 |	| X dS )zContext manager to prepend prefix to all warning log records temporarily.

    For example::

        >>> with prefixed_warnings("prefix:"):
        >>>     logger.warning('Warning message!')  # => prefix: Warning message!

    .. versionadded:: 2.0
    N)r   r+   r,   rx   r7   re   r   MessagePrefixFilterr?   r   	addFilter)r?   r.   warning_handlerr|   Zprefix_filterZ_filterpreviousr   r   r   prefixed_warnings#  s0    








r   c                   @  s,   e Zd ZddddZeddddZdS )	LogCollectorr0   r=   c                 C  s
   g | _ d S r   )logsrM   r   r   r   ro   R  s    zLogCollector.__init__r   c              	   c  s&   t  }d V  | | _W 5 Q R X d S r   )r   rt   r   )r@   r{   r   r   r   collectU  s    zLogCollector.collectN)rD   rE   rF   ro   r   r   r   r   r   r   r   Q  s   r   c                   @  s    e Zd ZdZdddddZdS )
InfoFilterz"Filter error and warning messages.r`   rp   ra   c                 C  s   |j tjk S r   )rL   r   r   rd   r   r   r   filter`  s    zInfoFilter.filterNrD   rE   rF   rG   r   r   r   r   r   r   ]  s   r   z	list[str])rO   rP   suppress_warningsr)   c                 C  sZ   | dkrdS |D ]D}d|kr.| dd\}}n
|d }}|| kr|d|dfkr dS qdS )z/Check whether the warning is suppressed or not.NFr*   r   *T)split)rO   rP   r   Zwarning_typetargetZ	subtargetr   r   r   is_suppressed_warningd  s    
r   c                      s8   e Zd ZdZddd fddZddd	d
dZ  ZS )WarningSuppressorz#Filter logs by `suppress_warnings`.r   r0   appr)   c                   s   || _ t   d S r   r   r>   ro   r@   r   rB   r   r   ro   z  s    zWarningSuppressor.__init__r`   rp   ra   c                 C  sh   t |dd}t |dd}z| jjj}W n tk
r>   g }Y nX t|||rPdS | j jd7  _dS d S )NrO   r<   rP   Fr   T)r6   r   configr   AttributeErrorr   Z
_warncount)r@   rb   rO   rP   r   r   r   r   r   ~  s    
zWarningSuppressor.filterrD   rE   rF   rG   ro   r   rI   r   r   rB   r   r   w  s   r   c                      s8   e Zd ZdZddd fddZddd	d
dZ  ZS )WarningIsErrorFilterz#Raise exception if warning emitted.r   r0   r   c                   s   || _ t   d S r   r   r   rB   r   r   ro     s    zWarningIsErrorFilter.__init__r`   rp   ra   c              	   C  s   t |ddrdS | jjrt |dd}z|j|j }W n ttfk
rR   |j}Y nX |rnt|d t| }nt|}|j	d k	r||j	d q|ndS d S )Nskip_warningsiserrorFTr2   r<   :r   )
r6   r   Zwarningiserrorr4   r5   	TypeError
ValueErrorr   r%   exc_info)r@   rb   r2   rA   excr   r   r   r     s    
zWarningIsErrorFilter.filterr   r   r   rB   r   r     s   r   c                   @  s    e Zd ZdZdddddZdS )r   z6Disable WarningIsErrorFilter if this filter installed.r`   rp   ra   c                 C  s
   d|_ dS )NT)r   rd   r   r   r   r     s    z"DisableWarningIsErrorFilter.filterNr   r   r   r   r   r     s   r   c                      s8   e Zd ZdZddd fddZddd	d
dZ  ZS )r   z"Prepend prefix to all log records.r%   r0   r   c                   s   || _ t   d S r   )r?   r>   ro   )r@   r?   rB   r   r   ro     s    zMessagePrefixFilter.__init__r`   rp   ra   c                 C  s   | j r| j d |j |_dS )N T)r?   r4   rd   r   r   r   r     s    zMessagePrefixFilter.filterr   r   r   rB   r   r     s   r   c                      s:   e Zd ZdZdddd fddZdd	d
ddZ  ZS )
OnceFilterzShow the message only once.r<   r%   r0   r'   c                   s   t  | i | _d S r   )r>   ro   messages)r@   r(   rB   r   r   ro     s    zOnceFilter.__init__r`   rp   ra   c                 C  sF   t |dd}|sdS | j|jg }|j|kr2dS ||j dS d S )NrS   r<   TF)r6   r   r[   r4   r5   ry   )r@   rb   rS   paramsr   r   r   r     s    
zOnceFilter.filter)r<   r   r   r   rB   r   r     s   r   c                      sB   e Zd ZU dZded< ddd fddZd	d
dddZ  ZS )SphinxLogRecordTranslatorzConverts a log record to one Sphinx expects

    * Make a instance of SphinxLogRecord
    * docname to path if location given
    ztype[logging.LogRecord]LogRecordClassr   r0   r   c                   s   || _ t   d S r   r   r   rB   r   r   ro     s    z"SphinxLogRecordTranslator.__init__rK   rp   ra   c                 C  s   t |tjr| j|_t|dd }t |trr|\}}|rj|rV| jj	| d| |_
qp| jj	| |_
qd |_
n6t |tjrt||_
n|rd|kr| jj	| |_
dS )Nr2   r   T)r7   r   	LogRecordr   rC   r6   tupler   envZdoc2pathr2   r	   r
   r8   )r@   rb   r2   Zdocnamelinenor   r   r   r     s    
z SphinxLogRecordTranslator.filter)rD   rE   rF   rG   rH   ro   r   rI   r   r   rB   r   r     s   
r   c                   @  s   e Zd ZdZeZdS )InfoLogRecordTranslatorz/LogRecordTranslator for INFO level log records.N)rD   rE   rF   rG   rJ   r   r   r   r   r   r     s   r   c                   @  s   e Zd ZdZeZdS )WarningLogRecordTranslatorz2LogRecordTranslator for WARNING level log records.N)rD   rE   rF   rG   rK   r   r   r   r   r   r     s   r   r
   z
str | None)noder)   c                 C  sN   t | \}}|rt|}|r.|r.| d| S |r<| dS |rJd| S d S )Nr   z
<unknown>:)r   r   )r   sourceliner   r   r   r8     s    

r8   c                      s$   e Zd Zddd fddZ  ZS )ColorizeFormatterr`   r%   ra   c                   sB   t  |}t|dd }|d kr,t|j}|r:t||S |S d S )NrR   )r>   formatr6   r$   getrL   r   )r@   rb   rA   rR   rB   r   r   r     s    
zColorizeFormatter.format)rD   rE   rF   r   rI   r   r   rB   r   r     s   r   c                   @  s>   e Zd ZdZdddddZdddd	d
ZddddZdS )SafeEncodingWriterz7Stream writer which ignores UnicodeEncodeError silentlyr   r0   )streamr)   c                 C  s   || _ t|ddpd| _d S )Nencodingascii)r   r6   r   )r@   r   r   r   r   ro     s    zSafeEncodingWriter.__init__r%   datar)   c              	   C  sH   z| j | W n2 tk
rB   | j || jd| j Y nX d S )Nreplace)r   writeUnicodeEncodeErrorencoder   decoder@   r   r   r   r   r   #  s    zSafeEncodingWriter.writer=   c                 C  s   t | jdr| j  d S )Nrr   )hasattrr   rr   rM   r   r   r   rr   +  s    zSafeEncodingWriter.flushN)rD   rE   rF   rG   ro   r   rr   r   r   r   r   r     s   r   c                   @  s2   e Zd ZdZddddddZddd	d
dZdS )LastMessagesWriterzBStream writer storing last 10 messages in memory to save trackbackr   r   r0   )r   r   r)   c                 C  s
   || _ d S r   )r   )r@   r   r   r   r   r   ro   2  s    zLastMessagesWriter.__init__r%   r   c                 C  s   | j j| d S r   )r   Z
messagelogry   r   r   r   r   r   5  s    zLastMessagesWriter.writeN)rD   rE   rF   rG   ro   r   r   r   r   r   r   0  s   r   r   r   )r   statuswarningr)   c                 C  s$  t t}|t j d|_|jdd D ]}|| q*tt	|}|
t  |
t|  |t| j  |t  tt	|}|
t|  |
t|  |
t|  |
t  |t j |t  t t| |}|
t  |t| j  || || || dS )zSetup root logger for SphinxFN)r   r+   r,   ru   r   	propagaterx   rv   rf   r   r   r   r   r!   	verbositysetFormatterr   re   r   r   r   r   r   StreamHandlerr   rw   )r   r   r   r.   r|   Zinfo_handlerr   Zmessagelog_handlerr   r   r   setup9  s.    


r   )T)LrG   
__future__r   r   logging.handlerscollectionsr   
contextlibr   typingr   r   r   r   Zdocutilsr	   Zdocutils.nodesr
   Zdocutils.utilsr   Zsphinx.errorsr   Zsphinx.util.consoler   Zsphinx.util.osutilr   Zsphinx.applicationr   r,   r   r   r   r   r   r   r   rH   r!   r$   r+   r:   r   r;   rJ   rK   LoggerAdapterr&   r   re   rf   rx   BufferingHandlerrl   r}   r~   r   r   r   r   Filterr   r   r   r   r   r   r   r   r   r   r8   	Formatterr   r   r   r   r   r   r   r   <module>   s   
   -#	