
    Ri"M                       U d Z ddlm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 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mZmZmZ ddlmZmZmZ ddlmZ ddl m!Z! dZ"dZ# ed ejH                  ejH                  ejJ                  ejL                  ejN                  e#ejP                  d      Z)de*d<    ed ejN                  e#ejP                  d      Z+de*d<   ejJ                  dejL                  dejP                  diZ,de*d<   dNdZ-dOd Z. G d! d"ej^                        Z0 G d# d$e0      Z1 G d% d&e0      Z2 G d' dejf                  ejh                           Z5 G d( d)ejl                  d*         Z7 G d+ d,ejl                  d*         Z8 G d- d.ejr                  jt                        Z;e
dPd/       Z<e
dQd0       Z=e
dQd1       Z>eZ?e
dRd2       Z@ G d3 d4      ZA G d5 d6ej                        ZC G d7 d8ej                        ZD	 	 	 	 	 	 	 	 dSd9ZE G d: d;ej                        ZF G d< d=ej                        ZG G d> d?ej                        ZH G d@ dAej                        ZI G dB dCeI      ZJ G dD dEeI      ZKdTdFZL G dG dHej                        ZN G dI d*      ZO G dJ dK      ZPddL	 	 	 	 	 	 	 	 	 dUdMZQy)Vz%Logging utility functions for Sphinx.    )annotationsN)defaultdict)contextmanagernullcontext)TYPE_CHECKING)nodes)get_source_line)	colourise)SphinxWarning)IteratorMappingSequenceSet)IOAnyNoReturn)Node)Sphinxsphinx   c                 "    t         j                  S N)loggingWARNING     K/home/agent/.friday_env/lib/python3.12/site-packages/sphinx/util/logging.py<lambda>r      s
    GOO r   )CRITICALSEVEREERRORr   INFOVERBOSEDEBUGzdefaultdict[str, int]LEVEL_NAMESc                 "    t         j                  S r   )r   NOTSETr   r   r   r   r   ,   s
    GNN r   )r         zdefaultdict[int, int]VERBOSITY_MAPdarkredreddarkgrayzdict[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   r2   r2   ;   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_locationr8   )recordsrr8   s      r   convert_serializablerA   Q   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   r8   c                    t         |          }t        | dd       }|r| d| j                   | }|S | j                  |vr| j                  |z   }|S )Nr8   z: )superr9   r<   prefix)selfmessager8   	__class__s      r   r9   zSphinxLogRecord.getMessagec   sa    '$&4T2!
"T[[M';G  [['kkG+Gr   returnstr)	__name__
__module____qualname____doc__rG   r8   __annotations__r9   __classcell__rJ   s   @r   rC   rC   ]   s    .FHc r   rC   c                      e Zd ZdZdZy)SphinxInfoLogRecordz)Info log record class supporting locationrD   N)rN   rO   rP   rQ   rG   r   r   r   rV   rV   n   s
    3Fr   rV   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!   rH   s    r   rG   zSphinxWarningLogRecord.prefixw   s-    <<7+++\\W]]*r   NrK   )rN   rO   rP   rQ   propertyrG   r   r   r   rX   rX   t   s    6 r   rX   c                       e Zd ZdZg dZ	 	 	 	 	 	 	 	 	 	 d fdZddZddZddZdddddd	d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fd
Z	 xZ
S )r/   z9LoggerAdapter allowing ``type`` and ``subtype`` keywords.typesubtyper8   nonlcoloroncec                    t        |t              rt        |   ||g|i | y t        |   }t        |   ||g|i | y r   )r=   intrF   logr%   )rH   levelr:   r;   kwargsrZ   rJ   s         r   rf   zSphinxLoggerAdapter.log   sI     eS!GKs4T4V4!%(GGK6t6v6r   c                :     | j                   t        |g|i | y r   )rf   r#   )rH   r:   r;   rh   s       r   verbosezSphinxLoggerAdapter.verbose   s    #///r   c                    |j                  di       }| j                  D ]  }||v s|j                  |      ||<    ||fS )Nextra)
setdefaultKEYWORDSpop)rH   r:   rh   rl   keywords        r   processzSphinxLoggerAdapter.process   sM    !!'2.}} 	5G& !'G!4g	5 F{r   c                :    | j                   j                  |       y r   )r6   handlerH   records     r   rs   zSphinxLoggerAdapter.handle   s    6"r   NTFc          
     8    t        
|   |g|||||||d|	S )aj  Log a sphinx warning.

        It is recommended to include a ``type`` and ``subtype`` for warnings as
        these can be displayed to the user using :confval:`show_warning_types`
        and used in :confval:`suppress_warnings` to suppress specific warnings.

        It is also recommended to specify a ``location`` whenever possible
        to help users in correcting the warning.

        :param msg: The message, which may contain placeholders for ``args``.
        :param args: The arguments to substitute into ``msg``.
        :param type: The type of the warning.
        :param subtype: The subtype of the warning.
        :param location: The source location of the warning's origin,
            which can be a string (the ``docname`` or ``docname:lineno``),
            a tuple of ``(docname, lineno)``,
            or the docutils node object.
        :param nonl: Whether to append a new line terminator to the message.
        :param color: A color code for the message.
        :param once: Do not log this warning,
            if a previous warning already has same ``msg``, ``args`` and ``once=True``.
        r^   )rF   warning)rH   r:   r_   r`   r8   ra   rb   rc   r;   rh   rJ   s             r   rw   zSphinxLoggerAdapter.warning   sE    D w



 

 

 
	
r   )
rg   z	int | strr:   rM   r;   r   rh   r   rL   None)r:   rM   r;   r   rh   r   rL   rx   )r:   rM   rh   zdict[str, Any]rL   ztuple[str, dict[str, Any]]ru   logging.LogRecordrL   rx   )r:   objectr;   r{   r_   
str | Noner`   r|   r8   z1str | tuple[str | None, int | None] | Node | Nonera   boolrb   r|   rc   r}   rh   r   rL   rx   )rN   rO   rP   rQ   rn   rf   rj   rq   rs   rw   rS   rT   s   @r   r/   r/      s    CGH77%(7147@C7	70#  "FJ ,
,
 ,
 	,

 ,
 D,
 ,
 ,
 ,
 ,
 
,
 ,
r   c                      e Zd ZdZy)WarningStreamHandlerzStreamHandler for warnings.N)rN   rO   rP   rQ   r   r   r   r   r      s    %r   r   SafeEncodingWriterc                  $     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)Nra   FrD   
)acquirer<   
terminatorrF   emitrelease)rH   ru   rJ   s     r   r   zNewLineStreamHandler.emit   sT    	LLNvvu-"$GL "DOLLN #DOLLNs   3A A'ry   )rN   rO   rP   rQ   r   rS   rT   s   @r   r   r      s    K	 	r   r   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)rF   __init__)rH   rJ   s    r   r   zMemoryHandler.__init__   s    r   c                     y)NFr   rt   s     r   shouldFlushzMemoryHandler.shouldFlush   s    r   c                     y r   r   r[   s    r   flushzMemoryHandler.flush   s     	r   c                    | j                          	 | j                  D ]  }|j                  |        g | _        | j                          y # | j                          w xY wr   )r   r   rs   r   )rH   r6   ru   s      r   flushTozMemoryHandler.flushTo   sI    	++ &f%&DKLLNDLLNs   )A Ac                .    | j                   g c}| _         |S r   )r   )rH   r   s     r   clearzMemoryHandler.clear   s    "kk2r   rL   rx   ru   rz   rL   r}   )r6   zlogging.LoggerrL   rx   )rL   r   )rN   rO   rP   rQ   rR   r   r   r   r   r   rS   rT   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   r2   r3   r   setLevelr   handlersr=   r   removeHandlerappend
addHandlerr   r6   
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   r2   r3   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   r2   r3   r   r   )r6   r   s     r   pending_loggingr   8  s`      y)F# 	:	 	6"	 	 	6"s1   A(
A AA A(AA A%%A(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   r2   r3   r   r=   r   filtersMessagePrefixFilterrG   	addFilterremoveFilter)rG   r6   warning_handlerr   prefix_filter_filterpreviouss          r   prefixed_warningsr   O  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   )logsr[   s    r   r   zLogCollector.__init__~  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   )rH   r   s     r   collectzLogCollector.collect  s5      	+*"((*DI	+ 	+ 	+s   <0	<9<Nr   )rL   Iterator[None])rN   rO   rP   r   r   r   r   r   r   r   r   }  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   )rZ   r   r   rt   s     r   filterzInfoFilter.filter  s    ~~//r   Nr   rN   rO   rP   rQ   r   r   r   r   r   r     s
    ,0r   r   c                      e Zd ZdZddZy)_RaiseOnWarningFilterz(Raise exception if a warning is emitted.c                   	 |j                   |j                  z  }t	        |dd      x}r| d| }|j
                  t        |      |j
                  d   t        |      # t        t        f$ r |j                   }Y cw xY w)Nr8   rD   :r(   )r:   r;   	TypeError
ValueErrorr<   exc_infor   )rH   ru   rI   r8   s       r   r   z_RaiseOnWarningFilter.filter  s    	!jj6;;.G vz26686!
!G9-G??&(fooa.@@G$$ :& 	!jjG	!s   A! !A?>A?N)ru   rz   rL   r   r   r   r   r   r   r     s
    2	%r   r   c                f    | t        |      dk(  ryt        |      }| |v ry|  d|v ry|  d| |v S )z/Check whether the warning is suppressed or not.r   FTz.*r1   )len	frozenset)warning_typesub_typesuppress_warningssuppressed_warningss       r   is_suppressed_warningr     s\     s#45:#$56**
r11^1XJ'+>>>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   _apprF   r   rH   apprJ   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 d}Y ;w xY w)Nr_   rD   r`   r   Fr(   T)r<   r   configr   AttributeErrorr   
_warncount)rH   ru   r_   r`   r   s        r   r   zWarningSuppressor.filter  sz    vvr*&)R0	# $		 0 0 B B
 !w0ABII  A%   	# "	#s    A* *A87A8r   r   rL   rx   r   rN   rO   rP   rQ   r   r   rS   rT   s   @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   )rG   rF   r   )rH   rG   rJ   s     r   r   zMessagePrefixFilter.__init__  s    r   c                ^    | j                   r!| j                   dz   |j                  z   |_        y)N T)rG   r:   rt   s     r   r   zMessagePrefixFilter.filter  s%    ;;s*VZZ7FJr   )rG   rM   rL   rx   r   r   rT   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   )rF   r   messages)rH   r5   rJ   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)Nrc   rD   TF)r<   r   rm   r:   r;   r   )rH   ru   rc   paramss       r   r   zOnceFilter.filter  sR    vvr*]]--fjj"=F{{f$MM&++&r   )rD   )r5   rM   rL   rx   r   r   rT   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
    * append warning type/subtype to message if :confval:`show_warning_types` is ``True``
    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)Nr8   r   T)r=   r   	LogRecordr   rJ   r<   tupler   envdoc2pathr8   r   r   r>   )rH   ru   r8   docnamelinenos        r   r   z SphinxLogRecordTranslator.filter  s    fg//0#22F6:t4h&&OGV)-)?)?)H(I6(&SFO  *.)?)?)H(IFO  #'  %**-/9FO  #X-!%!7!7!A BFOr   r   ru   rX   rL   r}   )rN   rO   rP   rQ   rR   r   r   rS   rT   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)rN   rO   rP   rQ   rV   r   r   r   r   r   r     s
    9(Nr   r   c                  (     e Zd ZdZeZd fdZ xZS )WarningLogRecordTranslatorz2LogRecordTranslator for WARNING level log records.c                8   t         |   |      }	 | j                  j                  j                  }|rUt        |dd      x}rFt        |dd      x}r|xj                  d| d| dz  c_        |S |xj                  d| dz  c_        |S # t
        $ r d}Y fw xY w)NFr_   rD   r`   z [r1   ])rF   r   r   r   show_warning_typesr   r<   r:   )rH   ru   retr   log_typelog_subtyperJ   s         r   r   z!WarningLogRecordTranslator.filter  s    gnV$	'!%!1!1!D!D "66266x6")&)R"@@;@JJBxj+a"@@J 
 JJBxj"22J
  	'!&	's    B BBr   )rN   rO   rP   rQ   rX   r   r   rS   rT   s   @r   r   r     s    <+N r   r   c                    t        |       \  }}|r&|r$t        j                  j                  |       d| S |r"t        j                  j                  |       dS |rd| S y )Nr   z
<unknown>:)r	   ospathabspath)nodesourcelines      r   r>   r>   *  se    "4(LFD$''//&)*!D622''//&)*!,,D6""r   c                        e Zd Zd fdZ xZS )ColorizeFormatterc                    t         |   |      }t        |dd      }|s t        j	                  |j
                  d      }|s|S 	 t        ||      S # t        $ r |cY S w xY w)Nrb   rD   )rF   formatr<   r.   getrZ   r
   r   )rH   ru   rI   colour_namerJ   s       r   r  zColorizeFormatter.format6  sd    '.(fgr2#--;KN	['22 	N	s   A AA)ru   rz   rL   rM   )rN   rO   rP   r  rS   rT   s   @r   r  r  5  s    
 
r   r  c                  (    e Zd ZdZddZddZddZy)	r   z7Stream writer which ignores UnicodeEncodeError silentlyc                >    || _         t        |dd      xs d| _        y )Nencodingascii)streamr<   r
  )rH   r  s     r   r   zSafeEncodingWriter.__init__F  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rH   datas     r   r  zSafeEncodingWriter.writeJ  s]    	KKd#! 	 KKDMM95<<T]]K	s    AA87A8c                f    t        | j                  d      r| j                  j                          y y )Nr   )hasattrr  r   r[   s    r   r   zSafeEncodingWriter.flushT  s%    4;;(KK )r   N)r  IO[str]rL   rx   r  rM   rL   rx   r   )rN   rO   rP   rQ   r   r  r   r   r   r   r   r   C  s    AH 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   )rH   r   r  s      r   r   zLastMessagesWriter.__init__\  s	    	r   c                N    | j                   j                  j                  |       y r   )r   
messagelogr   r  s     r   r  zLastMessagesWriter.write_  s    		##D)r   N)r   r   r  r  rL   rx   r  )rN   rO   rP   rQ   r   r  r   r   r   r  r  Y  s    L*r   r  )	verbosityc               H   t         t        |d         }t        j                  t              }|j                  t        j                         d|_        |j                  dd D ]  }|j                  |        t        t        |            }|j                  t                      |j                  t        |              |j                  |       |j                  t!                      t#        t        |            }| j$                  r|j                  t'                      |j                  t)        |              |j                  t+        |              |j                  t-                      |j                  t        j.                         |j                  t!                      t        j0                  t3        | |            }	|	j                  t                      |	j                  |       |j5                  |       |j5                  |       |j5                  |	       y)zSetup root logger for Sphinxr   FN)r*   maxr   r2   r3   r   r$   	propagater   r   r   r   r   r   r   setFormatterr  r   _exception_on_warningr   r   r   r   r   StreamHandlerr  r   )
r   statusrw   r  	log_levelr6   r   info_handlerr   messagelog_handlers
             r   setupr)  c  s    c)Q/0Iy)F
OOGMM"F ??1% &W%& ((:6(BCL:<(2378)$/12*+=g+FGO
  !!"7"9:/458=>jl+W__-  !2!45 ../A#v/NO  .	*
l#
o&
()r   )r5   rM   rL   r/   )r?   r   rL   rx   )rL   zIterator[logging.Handler])rL   zIterator[MemoryHandler])rG   rM   rL   r   )r   rM   r   rM   r   zSet[str] | Sequence[str]rL   r}   )r   r   rL   r|   )
r   r   r%  r  rw   r  r  re   rL   rx   )RrQ   
__future__r   r   logging.handlersos.pathr   collectionsr   
contextlibr   r   typingr   docutilsr   docutils.utilsr	   sphinx._cli.util.colourr
   sphinx.errorsr   collections.abcr   r   r   r   r   r   r   docutils.nodesr   sphinx.applicationr   r3   r#   r   r!   r   r"   r$   r%   rR   r*   r.   r2   rA   r   rC   rV   rX   LoggerAdapterLoggerr/   r$  r   r   r   BufferingHandlerr   r   r   r   skip_warningiserrorr   r   Filterr   r   r   r   r   r   r   r   r   r>   	Formatterr  r   r  r)  r   r   r   <module>r=     s   + "    # 2    * - '@@((#) 	
%0$$""??&"  (3<<==($  MM9OOUMM:	> +,	5g'' "/ 
_ 
H
'//? H
V	7001EF 	7001EF G$$55 < # #6 ' '8 # #& "  *8 *8Z	+ 	+0 0%GNN %??!$?9Q?	? 0
'.. 
 ," "J)7 )!: .))    ,* * IJ#*	#* #*+2#*BE#*	#*r   