B
    \B              
   @   s  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
 ddlmZ ddlmZmZ dd	lmZ dd
lmZ dZdZedd Zeejejejejejeejd edd Zeejeejd edd Zeejdejdejdi dd Z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 d"d# d#ej'Z(G d$d% d%ej'Z)G d&d' d'ej'Z*ere)Z+ne*Z+G d(d) d)ej,j-Z.ed*d+ Z/ed,d- Z0edMd/d0Z1G d1d2 d2e2Z3G d3d4 d4ej4Z5d5d6 Z6G d7d8 d8ej4Z7G d9d: d:ej4Z8G d;d< d<ej4Z9G d=d> d>ej4Z:G d?d@ d@e:Z;G dAdB dBe:Z<dCdD Z=G dEdF dFej>Z?G dGdH dHe2Z@G dIdJ dJe2ZAdKdL ZBdS )Nz
    sphinx.util.logging
    ~~~~~~~~~~~~~~~~~~~

    Logging utility functions for Sphinx.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    )absolute_importN)defaultdict)contextmanager)nodes)get_source_line)PY2StringIO)SphinxWarning)colorizeZsphinx   c               C   s   t jS )N)loggingWARNING r   r   2lib/python3.7/site-packages/sphinx/util/logging.py<lambda>#   s    r   )CRITICALZSEVEREERRORr   INFOVERBOSEDEBUGc               C   s   dS )Nr   r   r   r   r   r   r   .   s    )r         c               C   s   dS )NZbluer   r   r   r   r   r   5   s    ZdarkredZredZdarkgrayc             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	NAMESPACEZdisabledSphinxLoggerAdapter)nameloggerr   r   r   r   =   s    r   c             C   sD   x>| D ]6}|  |_d|_t|dd}t|tjrt||_qW dS )zConvert LogRecord serializable.r   locationN)	
getMessagemsgargsgetattr
isinstancer   Nodeget_node_locationr   )Zrecordsrr   r   r   r   convert_serializableT   s    

r'   c                   s(   e Zd ZdZdZdZ fddZ  ZS )SphinxLogRecordz$Log record class supporting location Nc                sH   t t|  }t| dd }|r0d|| j|f }n| j|krD| j| }|S )Nr   z%s: %s%s)superr(   r   r"   prefix)selfmessager   )	__class__r   r   r   f   s    

zSphinxLogRecord.getMessage)__name__
__module____qualname____doc__r+   r   r   __classcell__r   r   )r.   r   r(   a   s   r(   c               @   s   e Zd ZdZdZdS )SphinxInfoLogRecordz)Info log record class supporting locationr)   N)r/   r0   r1   r2   r+   r   r   r   r   r4   r   s   r4   c               @   s   e Zd ZdZdZdS )SphinxWarningLogRecordz,Warning log record class supporting locationz	WARNING: N)r/   r0   r1   r2   r+   r   r   r   r   r5   w   s   r5   c                   s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
r   z9LoggerAdapter allowing ``type`` and ``subtype`` keywords.c                sL   t |tr&tt| j||f|| n"t| }tt| j||f|| d S )N)r#   intr*   r   logLEVEL_NAMES)r,   levelr    r!   kwargslevelno)r.   r   r   r7      s    
zSphinxLoggerAdapter.logc             O   s   | j t|f|| d S )N)r7   r   )r,   r    r!   r:   r   r   r   verbose   s    zSphinxLoggerAdapter.verbosec             C   s   | di }d|kr"|d|d< d|kr8|d|d< d|krN|d|d< d|krd|d|d< d|krz|d|d< ||fS )Nextratypesubtyper   nonlcolor)
setdefaultpop)r,   r    r:   r=   r   r   r   process   s    zSphinxLoggerAdapter.processc             C   s   | j | d S )N)r   handle)r,   recordr   r   r   rE      s    zSphinxLoggerAdapter.handle)	r/   r0   r1   r2   r7   r<   rD   rE   r3   r   r   )r.   r   r   |   s
   r   c               @   s   e Zd ZdZdS )WarningStreamHandlerzStreamHandler for warnings.N)r/   r0   r1   r2   r   r   r   r   rG      s   rG   c                   s    e Zd ZdZ fddZ  ZS )NewLineStreamHandlerPY2zAStreamHandler which switches line terminator by record.nonl flag.c                s~   zh|    | j}t|ddrVt | _tt| | || j d d  |	  ntt| | W d || _| 
  X d S )Nr@   F)acquirestreamr"   r   r*   rH   emitwritegetvalueflushrelease)r,   rF   rK   )r.   r   r   rL      s    
zNewLineStreamHandlerPY2.emit)r/   r0   r1   r2   rL   r3   r   r   )r.   r   rH      s   rH   c                   s    e Zd ZdZ fddZ  ZS )NewLineStreamHandlerPY3zAStreamHandler which switches line terminator by record.nonl flag.c                sD   z.|    t|ddrd| _tt| | W d d| _|   X d S )Nr@   Fr)   
)rJ   r"   
terminatorr*   rQ   rL   rP   )r,   rF   )r.   r   r   rL      s    zNewLineStreamHandlerPY3.emit)r/   r0   r1   r2   rL   r3   r   r   )r.   r   rQ      s   rQ   c                   s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )
MemoryHandlerzHandler buffering all logs.c                s   t t| d d S )NrI   )r*   rT   __init__)r,   )r.   r   r   rU      s    zMemoryHandler.__init__c             C   s   dS )NFr   )r,   rF   r   r   r   shouldFlush   s    zMemoryHandler.shouldFlushc             C   s<   |    z$x| jD ]}|| qW g | _W d |   X d S )N)rJ   bufferrE   rP   )r,   r   rF   r   r   r   flushTo   s    
zMemoryHandler.flushToc             C   s   | j g  }| _ |S )N)rW   )r,   rW   r   r   r   clear   s    zMemoryHandler.clear)	r/   r0   r1   r2   rU   rV   rX   rY   r3   r   r   )r.   r   rT      s
   
rT   c           
   c   s   t t} t }|t j zNg }x4| jdd D ]"}t|tr2| 	| |
| q2W | | |V  W d| 	| x|D ]}| | q|W ||  X dS )z`Contextmanager to pend logging warnings temporary.

    Similar to :func:`pending_logging`.
    N)r   r   r   rT   setLevelr   handlersr#   rG   removeHandlerappend
addHandlerrX   )r   
memhandlerr[   handlerr   r   r   pending_warnings   s    






ra   c           
   c   s   t t} t }zDg }x*| jdd D ]}| | || q&W | | |V  W d| | x|D ]}| | qfW ||  X dS )a  Contextmanager to pend logging all logs temporary.

    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   rT   r[   r\   r]   r^   rX   )r   r_   r[   r`   r   r   r   pending_logging  s    





rb   Tc          
   c   sj   t t}| dkrdV  nLz.t }x|jD ]}|jd| q*W dV  W dx|jD ]}|| qRW X dS )z8contextmanager to skip WarningIsErrorFilter for a while.FNr   )r   r   r   DisableWarningIsErrorFilterr[   filtersinsertZremoveFilter)skipr   Zdisablerr`   r   r   r   skip_warningiserror)  s    

rg   c               @   s    e Zd Zdd Zedd ZdS )LogCollectorc             C   s
   g | _ d S )N)logs)r,   r   r   r   rU   ?  s    zLogCollector.__init__c          	   c   s&   t  }d V  | | _W d Q R X d S )N)rb   rY   ri   )r,   r_   r   r   r   collectC  s    zLogCollector.collectN)r/   r0   r1   rU   r   rj   r   r   r   r   rh   >  s   rh   c               @   s   e Zd ZdZdd ZdS )
InfoFilterz"Filter error and warning messages.c             C   s   |j tjk rdS dS d S )NTF)r;   r   r   )r,   rF   r   r   r   filterO  s    zInfoFilter.filterN)r/   r0   r1   r2   rl   r   r   r   r   rk   L  s   rk   c             C   sn   | dkrdS x\|D ]T}d|kr0| dd\}}n
|d }}|| kr|dksb|dksb||ksb|dkrdS qW dS )z'Check the warning is suppressed or not.NFr   r   *T)split)r>   r?   suppress_warningsZwarning_typetargetZ	subtargetr   r   r   is_suppressed_warningW  s    

rq   c                   s(   e Zd ZdZ fddZdd Z  ZS )WarningSuppressorz#Filter logs by `suppress_warnings`.c                s   || _ tt|   d S )N)appr*   rr   rU   )r,   rs   )r.   r   r   rU   n  s    zWarningSuppressor.__init__c             C   sh   t |dd }t |dd }y| jjj}W n tk
r>   g }Y nX t|||rPdS | j jd7  _dS d S )Nr>   r?   Fr   T)r"   rs   Zconfigro   AttributeErrorrq   Z
_warncount)r,   rF   r>   r?   ro   r   r   r   rl   s  s    
zWarningSuppressor.filter)r/   r0   r1   r2   rU   rl   r3   r   r   )r.   r   rr   k  s   rr   c                   s(   e Zd ZdZ fddZdd Z  ZS )WarningIsErrorFilterz#Raise exception if warning emitted.c                s   || _ tt|   d S )N)rs   r*   ru   rU   )r,   rs   )r.   r   r   rU     s    zWarningIsErrorFilter.__init__c          	   C   s|   t |ddrdS | jjrtt |dd}y|j|j }W n ttfk
rR   |j}Y nX |rjt|d | qxt|ndS d S )Nskip_warningsiserrorFTr   r)   :)r"   rs   Zwarningiserrorr    r!   	TypeError
ValueErrorr	   )r,   rF   r   r-   r   r   r   rl     s    
zWarningIsErrorFilter.filter)r/   r0   r1   r2   rU   rl   r3   r   r   )r.   r   ru     s   ru   c               @   s   e Zd ZdZdd ZdS )rc   z6Disable WarningIsErrorFilter if this filter installed.c             C   s
   d|_ dS )NT)rv   )r,   rF   r   r   r   rl     s    z"DisableWarningIsErrorFilter.filterN)r/   r0   r1   r2   rl   r   r   r   r   rc     s   rc   c                   s,   e Zd ZdZdZ fddZdd Z  ZS )SphinxLogRecordTranslatorzConverts a log record to one Sphinx expects

    * Make a instance of SphinxLogRecord
    * docname to path if location given
    Nc                s   || _ tt|   d S )N)rs   r*   rz   rU   )r,   rs   )r.   r   r   rU     s    z"SphinxLogRecordTranslator.__init__c             C   s   t |tjr| j|_t|dd }t |trv|\}}|rT|rTd| jj	||f |_
q|rnd| jj	| |_
qd |_
n8t |tjrt||_
n |rd|krd| jj	| |_
dS )Nr   z%s:%sz%srw   T)r#   r   	LogRecordLogRecordClassr.   r"   tuplers   envZdoc2pathr   r   r$   r%   )r,   rF   r   Zdocnamelinenor   r   r   rl     s    
z SphinxLogRecordTranslator.filter)r/   r0   r1   r2   r|   rU   rl   r3   r   r   )r.   r   rz     s   rz   c               @   s   e Zd ZdZeZdS )InfoLogRecordTranslatorz/LogRecordTranslator for INFO level log records.N)r/   r0   r1   r2   r4   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)r/   r0   r1   r2   r5   r|   r   r   r   r   r     s   r   c             C   s@   t | \}}|r |r d||f S |r,d| S |r8d| S d S d S )Nz%s:%sz%s:z<unknown>:%s)r   )Znodesourceliner   r   r   r%     s    r%   c                   s   e Zd Z fddZ  ZS )ColorizeFormatterc                sF   t t| |}t|dd }|d kr0t|j}|r>t||S |S d S )NrA   )r*   r   formatr"   	COLOR_MAPgetr;   r
   )r,   rF   r-   rA   )r.   r   r   r     s    
zColorizeFormatter.format)r/   r0   r1   r   r3   r   r   )r.   r   r     s   r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	SafeEncodingWriterz7Stream writer which ignores UnicodeEncodeError silentlyc             C   s   || _ t|ddpd| _d S )Nencodingascii)rK   r"   r   )r,   rK   r   r   r   rU     s    zSafeEncodingWriter.__init__c          	   C   sH   y| j | W n2 tk
rB   | j || jd| j Y nX d S )Nreplace)rK   rM   UnicodeEncodeErrorencoder   decode)r,   datar   r   r   rM     s    zSafeEncodingWriter.writec             C   s   t | jdr| j  d S )NrO   )hasattrrK   rO   )r,   r   r   r   rO     s    zSafeEncodingWriter.flushN)r/   r0   r1   r2   rU   rM   rO   r   r   r   r   r     s   	r   c               @   s    e Zd ZdZdd Zdd ZdS )LastMessagesWriterz?Stream writer which memories last 10 messages to save trackbackc             C   s
   || _ d S )N)rs   )r,   rs   rK   r   r   r   rU     s    zLastMessagesWriter.__init__c             C   s   | j j| d S )N)rs   Z
messagelogr]   )r,   r   r   r   r   rM     s    zLastMessagesWriter.writeN)r/   r0   r1   r2   rU   rM   r   r   r   r   r   	  s   r   c             C   s(  t t}|t j d|_x |jdd D ]}|| q,W tt	|}|
t  |
t|  |t| j  |t  tt	|}|
t|  |
t|  |
t|  |t j |t  t t| |}|
t  |t| j  |t  || || || dS )zSetup root logger for SphinxFN)r   r   r   rZ   r   Z	propagater[   r\   NewLineStreamHandlerr   Z	addFilterrk   r   VERBOSITY_MAP	verbosityZsetFormatterr   rG   rr   r   ru   r   StreamHandlerr   r^   )rs   ZstatusZwarningr   r`   Zinfo_handlerZwarning_handlerZmessagelog_handlerr   r   r   setup  s.    


r   )T)Cr2   Z
__future__r   r   Zlogging.handlerscollectionsr   
contextlibr   Zdocutilsr   Zdocutils.utilsr   Zsixr   r   Zsphinx.errorsr	   Zsphinx.util.consoler
   r   r   r8   updater   r   r   r   r   r   r   r   r'   r{   r(   r4   r5   ZLoggerAdapterr   r   rG   rH   rQ   r   r[   ZBufferingHandlerrT   ra   rb   rg   objectrh   ZFilterrk   rq   rr   ru   rc   rz   r   r   r%   Z	Formatterr   r   r   r   r   r   r   r   <module>
   s|   	$!	$