
    FeF                    f   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 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rddlmZ ddlmZ ddlmZ dZdZ ed ej>                  ej>                  ej@                  ejB                  ejD                  eejF                  d      Z$de%d<    ed ejD                  eejF                  d      Z&de%d<    ed ej@                  dejB                  dejF                  di      Z'de%d<   dQd Z(dRd!Z) G d" d#ejT                        Z+ G d$ d%e+      Z, G d& d'e+      Z- G d( dej\                        Z/ G d) d*ej`                        Z1 G d+ d,ej`                        Z2 G d- d.ejf                  jh                        Z5edSd/       Z6edTd0       Z7edTd1       Z8edUdVd2       Z9edWd3       Z: G d4 d5      Z; G d6 d7ejx                        Z=dXd8Z> G d9 d:ejx                        Z? G d; d<ejx                        Z@ G d= d>ejx                        ZA G d? d@ejx                        ZB G dA dBejx                        ZC G dC dDejx                        ZD G dE dFeD      ZE G dG dHeD      ZFdYdIZG G dJ dKej                        ZI G dL dM      ZJ G dN dO      ZKdZdPZLy)[z%Logging utility functions for Sphinx.    )annotationsN)defaultdict)contextmanager)IOTYPE_CHECKINGAny)nodes)get_source_line)SphinxWarning)colorize)abspath)	Generator)Node)Sphinxsphinx   c                 "    t         j                  S N)loggingWARNING     5/usr/lib/python3/dist-packages/sphinx/util/logging.py<lambda>r      s
     r   )CRITICALSEVEREERRORr   INFOVERBOSEDEBUGzdefaultdict[str, int]LEVEL_NAMESc                 "    t         j                  S r   )r   NOTSETr   r   r   r   r   '   s
    7>> r   )r         zdefaultdict[int, int]VERBOSITY_MAPc                      y)Nbluer   r   r   r   r   r   -   s    r   darkredreddarkgrayzdefaultdict[int, str]	COLOR_MAPSphinxLoggerAdapterc                f    t        j                  t        dz   | z         }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-   )nameloggers     r   r0   r0   4   s1     y356FFOvr**r   c                    | D ]V  }|j                         |_        d|_        t        |dd      }t	        |t
        j                        sGt        |      |_        X y)zConvert LogRecord serializable.r   locationN)	
getMessagemsgargsgetattr
isinstancer	   r   get_node_locationr6   )recordsrr6   s      r   convert_serializabler?   J   sM     51j$/h

+*84AJ5r   c                  8     e Zd ZU dZdZdZded<   d fdZ xZS )SphinxLogRecordz$Log record class supporting location Nr   r6   c                    t         |          }t        | dd       }|r| d| j                   | }|S | j                  |vr| j                  |z   }|S )Nr6   z: )superr7   r:   prefix)selfmessager6   	__class__s      r   r7   zSphinxLogRecord.getMessage[   sa    '$&4T2!
"T[[M';G  [['kkG+Gr   returnstr)	__name__
__module____qualname____doc__rE   r6   __annotations__r7   __classcell__rH   s   @r   rA   rA   V   s    .FHc r   rA   c                      e Zd ZdZdZy)SphinxInfoLogRecordz)Info log record class supporting locationrB   N)rL   rM   rN   rO   rE   r   r   r   rT   rT   f   s
    3Fr   rT   c                  "    e Zd ZdZedd       Zy)SphinxWarningLogRecordz,Warning log record class supporting locationc                |    | j                   t        j                  k\  ry| j                   t        j                  k\  ryy)Nz
CRITICAL: zERROR: z	WARNING: )levelnor   r   r   rF   s    r   rE   zSphinxWarningLogRecord.prefixm   s-    <<7+++\\W]]*r   NrI   )rL   rM   rN   rO   propertyrE   r   r   r   rV   rV   k   s    6 r   rV   c                  X     e Zd ZdZg dZ	 	 	 	 	 	 	 	 	 	 d fdZddZd	dZd
dZ xZ	S )r-   z9LoggerAdapter allowing ``type`` and ``subtype`` keywords.)typesubtyper6   nonlcoloroncec                    t        |t              rt        |   ||g|i | y t        |   }t        |   ||g|i | y r   )r;   intrD   logr!   )rF   levelr8   r9   kwargsrX   rH   s         r   rc   zSphinxLoggerAdapter.log{   sI     eS!GKs4T4V4!%(GGK6t6v6r   c                :     | j                   t        |g|i | y r   )rc   r   )rF   r8   r9   re   s       r   verbosezSphinxLoggerAdapter.verbose   s    #///r   c                    |j                  di       }| j                  D ]  }||v s|j                  |      ||<    ||fS )Nextra)
setdefaultKEYWORDSpop)rF   r8   re   ri   keywords        r   processzSphinxLoggerAdapter.process   sM    !!'2.}} 	5G& !'G!4g	5 F{r   c                :    | j                   j                  |       y r   )r4   handlerF   records     r   rp   zSphinxLoggerAdapter.handle   s    6"r   )
rd   z	int | strr8   rK   r9   r   re   r   rJ   None)r8   rK   r9   r   re   r   rJ   rs   )r8   rK   re   dictrJ   ztuple[str, dict]rr   logging.LogRecordrJ   rs   )
rL   rM   rN   rO   rk   rc   rg   rn   rp   rQ   rR   s   @r   r-   r-   w   sG    CGH77%(7147@C7	70#r   c                      e Zd ZdZy)WarningStreamHandlerzStreamHandler for warnings.N)rL   rM   rN   rO   r   r   r   rx   rx      s    %r   rx   c                  $     e Zd ZdZd fdZ xZS )NewLineStreamHandlerzAStreamHandler which switches line terminator by record.nonl flag.c                    	 | j                          t        |dd      rd| _        t        |   |       d| _        | j                          y # d| _        | j                          w xY w)Nr^   FrB   
)acquirer:   
terminatorrD   emitrelease)rF   rr   rH   s     r   r   zNewLineStreamHandler.emit   sT    	LLNvvu-"$GL "DOLLN #DOLLNs   3A A'ru   )rL   rM   rN   rO   r   rQ   rR   s   @r   rz   rz      s    K	 	r   rz   c                  P     e Zd ZU dZded<   d	 fdZd
dZd	dZddZddZ	 xZ
S )MemoryHandlerzHandler buffering all logs.list[logging.LogRecord]bufferc                $    t         |   d       y )N)rD   __init__)rF   rH   s    r   r   zMemoryHandler.__init__   s    r   c                     y)NFr   rq   s     r   shouldFlushzMemoryHandler.shouldFlush   s    r   c                     y r   r   rY   s    r   flushzMemoryHandler.flush   s     	r   c                    | j                          	 | j                  D ]  }|j                  |        g | _        | j                          y # | j                          w xY wr   )r}   r   rp   r   )rF   r4   rr   s      r   flushTozMemoryHandler.flushTo   sI    	++ &f%&DKLLNDLLNs   )A Ac                .    | j                   g c}| _         |S r   )r   )rF   r   s     r   clearzMemoryHandler.clear   s    "kk2r   rJ   rs   rr   rv   rJ   bool)r4   zlogging.LoggerrJ   rs   )rJ   r   )rL   rM   rN   rO   rP   r   r   r   r   r   rQ   rR   s   @r   r   r      s%    %##
r   r   c               #  @  K   t        j                  t              } t               }|j	                  t         j
                         	 g }| j                  dd D ]5  }t        |t              s| j                  |       |j                  |       7 | j                  |       | | j                  |       |D ]  }| j                  |        |j                  |        y# | j                  |       D ]  }| j                  |        |j                  |        w xY ww)zgContext manager to postpone logging warnings temporarily.

    Similar to :func:`pending_logging`.
    N)r   r0   r1   r   setLevelr   handlersr;   rx   removeHandlerappend
addHandlerr   r4   
memhandlerr   handlers       r   pending_warningsr      s     y)FJ(#q) 	)G'#78$$W-(	)
 	*%Z( 	'Gg&	' 	6" 	Z( 	'Gg&	' 	6"s$   AD$C +9C $;D<DDc               #    K   t        j                  t              } t               }	 g }| j                  dd D ]$  }| j                  |       |j                  |       & | j                  |       | | j                  |       |D ]  }| j                  |        y# | j                  |       D ]  }| j                  |        w xY ww)zContext manager to suppress logging all logs temporarily.

    For example::

        >>> with suppress_logging():
        >>>     logger.warning('Warning message!')  # suppressed
        >>>     some_long_process()
        >>>
    N)r   r0   r1   r   r   r   r   r   r   s       r   suppress_loggingr      s      y)FJ'q) 	%G  )OOG$	% 	*%Z( 	'Gg&	' 	Z( 	'Gg&	's   $CAB 4*C+C		Cc               #     K   t        j                  t              } 	 t               5 }| ddd       j	                  |        y# 1 sw Y   xY w# j	                  |        w xY ww)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   r0   r1   r   r   )r4   r   s     r   pending_loggingr      s`      y)F# 	:	 	6"	 	 	6"s1   A(
A AA A(AA A%%A(c              #  Z  K   t        j                  t              }| du rd y	 t               }|j                  D ]  }|j
                  j                  d|         d |j                  D ]  }|j                  |        y# |j                  D ]  }|j                          w xY ww)z9Context manager to skip WarningIsErrorFilter temporarily.FNr   )r   r0   r1   DisableWarningIsErrorFilterr   filtersinsertremoveFilter)skipr4   disablerr   s       r   skip_warningiserrorr     s      y)Fu}		/24H!?? 4 &&q(34 !?? /$$X./6?? /$$X./s   #B+;B !#B+$B((B+c              #    K   t        j                  t              }d}|j                  D ]  }t	        |t
              s|} n d yd}|j                  D ]  }t	        |t              s|} n |r 	 |j                  }| |_        d ||_        yt        |       }	 |j                  |       d |j                  |       y# |_        w xY w# |j                  |       w xY ww)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   r0   r1   r   r;   rx   r   MessagePrefixFilterrE   	addFilterr   )rE   r4   warning_handlerr   prefix_filter_filterpreviouss          r   prefixed_warningsr   &  s      y)FO?? g34%O 	M"** g23#M
 	,$++H#)M #+M  ,F3	8%%m4((7 $,M  ((7s@   ;C&+C&*C&2C 	C&C 2C&	CC&C##C&c                  &    e Zd ZddZedd       Zy)LogCollectorc                    g | _         y r   )logsrY   s    r   r   zLogCollector.__init__U  s	    -/	r   c              #  |   K   t               5 }d  |j                         | _        d d d        y # 1 sw Y   y xY wwr   )r   r   r   )rF   r   s     r   collectzLogCollector.collectX  s5      	+*"((*DI	+ 	+ 	+s   <0	<9<Nr   )rJ   Generator[None, None, None])rL   rM   rN   r   r   r   r   r   r   r   r   T  s    0 + +r   r   c                      e Zd ZdZddZy)
InfoFilterz"Filter error and warning messages.c                <    |j                   t        j                  k  S r   )rX   r   r   rq   s     r   filterzInfoFilter.filterc  s    ~~//r   Nr   rL   rM   rN   rO   r   r   r   r   r   r   `  s
    ,0r   r   c                r    | y|D ]/  }d|v r|j                  dd      \  }}n|d}}|| k(  s'|d|dfv s/ y y)z/Check whether the warning is suppressed or not.NFr/   r$   *T)split)r\   r]   suppress_warningswarning_typetarget	subtargets         r   is_suppressed_warningr   g  s`    | * , , 2 23 :FI ,dIFT>iD'3+?? r   c                  ,     e Zd ZdZd fdZddZ xZS )WarningSuppressorz#Filter logs by `suppress_warnings`.c                0    || _         t        | 	          y r   apprD   r   rF   r   rH   s     r   r   zWarningSuppressor.__init__}      r   c                    t        |dd      }t        |dd      }	 | j                  j                  j                  }t        |||      ry| j                  xj                  dz  c_        y# t        $ r g }Y ;w xY w)Nr\   rB   r]   Fr$   T)r:   r   configr   AttributeErrorr   
_warncount)rF   rr   r\   r]   r   s        r   r   zWarningSuppressor.filter  sx    vvr*&)R0	# $ A A
 !w0ABHH1$  	# "	#s    A* *A87A8r   r   rJ   rs   r   rL   rM   rN   rO   r   r   rQ   rR   s   @r   r   r   z  s    -r   r   c                  ,     e Zd ZdZd fdZddZ xZS )WarningIsErrorFilterz#Raise exception if warning emitted.c                0    || _         t        | 	          y r   r   r   s     r   r   zWarningIsErrorFilter.__init__  r   r   c                h   t        |dd      ry| j                  j                  rmt        |dd      }	 |j                  |j                  z  }|rt        |dz   t        |      z         }nt        |      }|j                  ||j                  d   |y# t
        t        f$ r |j                  }Y dw xY w)Nskip_warningsiserrorFTr6   rB   :r$   )
r:   r   warningiserrorr8   r9   	TypeError
ValueErrorr   rK   exc_info)rF   rr   r6   rG   excs        r   r   zWarningIsErrorFilter.filter  s    6159XX$$vz26H% **v{{2 #HsNS\$AB#G,*vq11	 z* % **%s   B B10B1r   r   r   rR   s   @r   r   r     s    -r   r   c                      e Zd ZdZddZy)r   z6Disable WarningIsErrorFilter if this filter installed.c                    d|_         y)NT)r   rq   s     r   r   z"DisableWarningIsErrorFilter.filter  s    &*#r   Nr   r   r   r   r   r   r     s
    @r   r   c                  ,     e Zd ZdZd fdZddZ xZS )r   z"Prepend prefix to all log records.c                0    || _         t        | 	          y r   )rE   rD   r   )rF   rE   rH   s     r   r   zMessagePrefixFilter.__init__  s    r   c                ^    | j                   r!| j                   dz   |j                  z   |_        y)N T)rE   r8   rq   s     r   r   zMessagePrefixFilter.filter  s%    ;;s*VZZ7FJr   )rE   rK   rJ   rs   r   r   rR   s   @r   r   r     s    ,r   r   c                  .     e Zd ZdZdd fdZddZ xZS )
OnceFilterzShow the message only once.c                2    t         |   |       i | _        y r   )rD   r   messages)rF   r3   rH   s     r   r   zOnceFilter.__init__  s    )+r   c                    t        |dd      }|sy| j                  j                  |j                  g       }|j                  |v ry|j                  |j                         y)Nr`   rB   TF)r:   r   rj   r8   r9   r   )rF   rr   r`   paramss       r   r   zOnceFilter.filter  sR    vvr*]]--fjj"=F{{f$MM&++&r   )rB   )r3   rK   rJ   rs   r   r   rR   s   @r   r   r     s    %,
r   r   c                  8     e Zd ZU dZded<   d fdZddZ x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]LogRecordClassc                0    || _         t        | 	          y r   r   r   s     r   r   z"SphinxLogRecordTranslator.__init__  r   r   c                &   t        |t        j                        r| j                  |_        t        |dd       }t        |t              rm|\  }}|r^|r0| j                  j                  j                  |       d| |_
        y| j                  j                  j                  |       |_
        yd |_
        yt        |t        j                        rt        |      |_
        y|r/d|vr+| j                  j                  j                  |       |_
        y)Nr6   r   T)r;   r   	LogRecordr   rH   r:   tupler   envdoc2pathr6   r	   r   r<   )rF   rr   r6   docnamelinenos        r   r   z SphinxLogRecordTranslator.filter  s    fg//0#22F6:t4h&&OGV)-)>)>w)G(H&&RFO  *.)>)>w)G(HFO  #'  %**-/9FO  #X-!%!6!6x!@ AFOr   r   )rr   rV   rJ   r   )rL   rM   rN   rO   rP   r   r   rQ   rR   s   @r   r   r     s    
 ,+r   r   c                      e Zd ZdZeZy)InfoLogRecordTranslatorz/LogRecordTranslator for INFO level log records.N)rL   rM   rN   rO   rT   r   r   r   r   r   r     s
    9(Nr   r   c                      e Zd ZdZeZy)WarningLogRecordTranslatorz2LogRecordTranslator for WARNING level log records.N)rL   rM   rN   rO   rV   r   r   r   r   r   r     s
    <+Nr   r   c                l    t        |       \  }}|rt        |      }|r	|r| d| S |r| dS |rd| S y )Nr   z
<unknown>:)r
   r   )nodesourcelines      r   r<   r<     sT    "4(LFD$4&!!|D6""r   c                        e Zd Zd fdZ xZS )ColorizeFormatterc                    t         |   |      }t        |dd       }|t        j	                  |j
                        }|rt        ||      S |S )Nr_   )rD   formatr:   r,   getrX   r   )rF   rr   rG   r_   rH   s       r   r   zColorizeFormatter.format  sK    '.(.=MM&..1EE7++Nr   )rr   rv   rJ   rK   )rL   rM   rN   r   rQ   rR   s   @r   r   r     s    	 	r   r   c                  (    e Zd ZdZddZddZddZy)	SafeEncodingWriterz7Stream writer which ignores UnicodeEncodeError silentlyc                >    || _         t        |dd      xs d| _        y )Nencodingascii)streamr:   r  )rF   r  s     r   r   zSafeEncodingWriter.__init__"  s    
G<Gr   c                    	 | j                   j                  |       y # t        $ rQ | j                   j                  |j                  | j                  d      j                  | j                               Y y w xY w)Nreplace)r  writeUnicodeEncodeErrorencoder  decoderF   datas     r   r	  zSafeEncodingWriter.write&  s]    	[KKd#! 	[ KKdkk$--CJJ4==YZ	[s    AA87A8c                f    t        | j                  d      r| j                  j                          y y )Nr   )hasattrr  r   rY   s    r   r   zSafeEncodingWriter.flush.  s%    4;;(KK )r   N)r  r   rJ   rs   r  rK   rJ   rs   r   )rL   rM   rN   rO   r   r	  r   r   r   r   r  r     s    AH[ r   r  c                       e Zd ZdZddZddZy)LastMessagesWriterzBStream writer storing last 10 messages in memory to save trackbackc                    || _         y r   )r   )rF   r   r  s      r   r   zLastMessagesWriter.__init__5  s	    r   c                N    | j                   j                  j                  |       y r   )r   
messagelogr   r  s     r   r	  zLastMessagesWriter.write8  s    ""4(r   N)r   r   r  r   rJ   rs   r  )rL   rM   rN   rO   r   r	  r   r   r   r  r  3  s    L)r   r  c                P   t        j                  t              }|j                  t         j                         d|_        |j                  dd D ]  }|j                  |        t        t        |            }|j                  t                      |j                  t        |              |j                  t        | j                            |j                  t!                      t#        t        |            }|j                  t%        |              |j                  t'        |              |j                  t)        |              |j                  t+                      |j                  t         j,                         |j                  t!                      t        j.                  t1        | |            }|j                  t                      |j                  t        | j                            |j3                  |       |j3                  |       |j3                  |       y)zSetup root logger for SphinxFN)r   r0   r1   r   r    	propagater   r   rz   r  r   r   r   r&   	verbositysetFormatterr   rx   r   r   r   r   r   StreamHandlerr  r   )r   statuswarningr4   r   info_handlerr   messagelog_handlers           r   setupr   <  s   y)F
OOGMM"F ??1% &W%& ((:6(BCL:<(2378-67/12*+=g+FGO/458=>2378jl+W__-  !2!45 ../A#v/NO  .cmm <=
l#
o&
()r   )r3   rK   rJ   r-   )r=   r   rJ   rs   )rJ   z&Generator[logging.Handler, None, None])rJ   z$Generator[MemoryHandler, None, None])T)r   r   rJ   r   )rE   rK   rJ   r   )r\   rK   r]   rK   r   z	list[str]rJ   r   )r   r   rJ   z
str | None)r   r   r  r   r  r   rJ   rs   )MrO   
__future__r   r   logging.handlerscollectionsr   
contextlibr   typingr   r   r   docutilsr	   docutils.utilsr
   sphinx.errorsr   sphinx.util.consoler   sphinx.util.osutilr   collections.abcr   docutils.nodesr   sphinx.applicationr   r1   r   r   r   r   r   r    r!   rP   r&   r,   r0   r?   r   rA   rT   rV   LoggerAdapterr-   r  rx   rz   r   BufferingHandlerr   r   r   r   r   r   r   Filterr   r   r   r   r   r   r   r   r   r   r<   	Formatterr   r  r  r   r   r   r   <module>r2     s   + "   # % ) )  * ' ( &)#) 	
%01H  ]]LL]]K &"  (33I||}}L ($  $/~MM9OOUMM:@ $	  +,	5g''  / 
	_ 	#'// #8	700 	
700 G$$55 < # #6 ' '8 # #& / /& *8 *8Z	+ 	+0 0& 07>> <'.. 
'.. 
 (   F)7 )
,!: ,


)) 
   &) )*r   