
    \e<.                        d Z ddlmZ ddlmZmZmZ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mZ dd
lmZ dZdedefdZdededefdZedfdee         dee         dedefdZefdedeee         gef         dee         fdZ G d deeef                   Z dedeeef         defdZ!dedefdZ"dedefdZ#dedefd Z$d!d!d!efded"e%d#e%d$e%deegef         defd%Z&d&S )'z&
Tools for formatting logging events.
    )datetime)AnyCallableIteratorMappingOptionalUnioncast)NamedConstant)FixedOffsetTimeZone)Failure)	safe_repr   )
aFormatter
flatFormat)LogEventz%Y-%m-%dT%H:%M:%S%zeventreturnc                 (    t          | ddd          S )aa  
    Formats an event as text, using the format in C{event["log_format"]}.

    This implementation should never raise an exception; if the formatting
    cannot be done, the returned string will describe the event generically so
    that a useful message is emitted regardless.

    @param event: A logging event.

    @return: A formatted string.
    F)includeTracebackincludeTimestampincludeSystem)eventAsText)r   s    6lib/python3.11/site-packages/twisted/logger/_format.pyformatEventr      s'     	       errorc                    	 d                     | |          S # t          $ rg t                      }d                    d |                                 D                       }d                     t          |          ||          cY S w xY w)z
    Formats an event as text that describes the event generically and a
    formatting error.

    @param event: A logging event.
    @param error: The formatting error.

    @return: A formatted string.
    z)Unable to format event {event!r}: {error})r   r   z, c              3   ~   K   | ]8\  }}d                      t          |          t          |          f          V  9dS )z = N)joinr   ).0keyvalues      r   	<genexpr>z+formatUnformattableEvent.<locals>.<genexpr>A   sY       
 
U JJ	#	%(8(89::
 
 
 
 
 
r   zrMESSAGE LOST: unformattable object logged: {error}
Recoverable data: {text}
Exception during formatting:
{failure})r   failuretext)formatBaseExceptionr   r    itemsr   )r   r   r%   r&   s       r   formatUnformattableEventr*   +   s    
:AAu B 
 
 	
  
 
 
 ))yy 
 
#kkmm
 
 
 
 
66<f&&d 7= 7 7	
 	
 	

s    A.B
	B
-when
timeFormatdefaultc                     || |S t          j        |           }t          j        | |          }t	          |                    |                    S )a  
    Format a timestamp as text.

    Example::

        >>> from time import time
        >>> from twisted.logger import formatTime
        >>>
        >>> t = time()
        >>> formatTime(t)
        u'2013-10-22T14:19:11-0700'
        >>> formatTime(t, timeFormat="%Y/%W")  # Year and week number
        u'2013/42'
        >>>

    @param when: A timestamp.
    @param timeFormat: A time format.
    @param default: Text to return if C{when} or C{timeFormat} is L{None}.

    @return: A formatted time.
    )r   fromLocalTimeStampDateTimefromtimestampstrstrftime)r,   r-   r.   tzr   s        r   
formatTimer6   O   sQ    4 T\ 3D99)$338$$Z00111r   r6   c                 b    t          | |          }|sdS |                    dd          }|dz   S )a&  
    Format an event as a line of human-readable text for, e.g. traditional log
    file output.

    The output format is C{"{timeStamp} [{system}] {event}\n"}, where:

        - C{timeStamp} is computed by calling the given C{formatTime} callable
          on the event's C{"log_time"} value

        - C{system} is the event's C{"log_system"} value, if set, otherwise,
          the C{"log_namespace"} and C{"log_level"}, joined by a C{"#"}.  Each
          defaults to C{"-"} is not set.

        - C{event} is the event, as formatted by L{formatEvent}.

    Example::

        >>> from time import time
        >>> from twisted.logger import formatEventAsClassicLogText
        >>> from twisted.logger import LogLevel
        >>>
        >>> formatEventAsClassicLogText(dict())  # No format, returns None
        >>> formatEventAsClassicLogText(dict(log_format="Hello!"))
        u'- [-#-] Hello!\n'
        >>> formatEventAsClassicLogText(dict(
        ...     log_format="Hello!",
        ...     log_time=time(),
        ...     log_namespace="my_namespace",
        ...     log_level=LogLevel.info,
        ... ))
        u'2013-10-22T17:30:02-0700 [my_namespace#info] Hello!\n'
        >>> formatEventAsClassicLogText(dict(
        ...     log_format="Hello!",
        ...     log_time=time(),
        ...     log_system="my_system",
        ... ))
        u'2013-11-11T17:22:06-0800 [my_system] Hello!\n'
        >>>

    @param event: an event.
    @param formatTime: A time formatter

    @return: A formatted event, or L{None} if no output is appropriate.
    )r6   N
z
	)r   replace)r   r6   	eventTexts      r   formatEventAsClassicLogTextr;   q   sD    ^ Ej999I t!!$//Itr   c                   f    e Zd ZdZdeeef         ddfdZdee         fdZ	de
fdZdedefd	ZdS )
CallMappingz
    Read-only mapping that turns a C{()}-suffix in key names into an invocation
    of the key rather than a lookup of the key.

    Implementation support for L{formatWithCall}.
    
submappingr   Nc                     || _         dS )zo
        @param submapping: Another read-only mapping which will be used to look
            up items.
        N)_submapping)selfr>   s     r   __init__zCallMapping.__init__   s    
 &r   c                 *    t          | j                  S N)iterr@   rA   s    r   __iter__zCallMapping.__iter__   s    D$%%%r   c                 *    t          | j                  S rD   )lenr@   rF   s    r   __len__zCallMapping.__len__   s    4#$$$r   r"   c                 ~    |                     d          }|r
|dd         n|}| j        |         }|r
 |            }|S )z|
        Look up an item in the submapping for this L{CallMapping}, calling it
        if C{key} ends with C{"()"}.
        z()N)endswithr@   )rA   r"   callitrealKeyr#   s        r   __getitem__zCallMapping.__getitem__   sP    
 d##$-#crc((# ) 	EGGEr   )__name__
__module____qualname____doc__r   r3   r   rB   r   rG   intrJ   rP    r   r   r=   r=      s         &738#4 & & & & &&(3- & & & &% % % % %
s 
s 
 
 
 
 
 
r   r=   formatStringmappingc           	      b    t          t          j        | dt          |                              S )a  
    Format a string like L{str.format}, but:

        - taking only a name mapping; no positional arguments

        - with the additional syntax that an empty set of parentheses
          correspond to a formatting item that should be called, and its result
          C{str}'d, rather than calling C{str} on the element directly as
          normal.

    For example::

        >>> formatWithCall("{string}, {function()}.",
        ...                dict(string="just a string",
        ...                     function=lambda: "a function"))
        'just a string, a function.'

    @param formatString: A PEP-3101 format string.
    @param mapping: A L{dict}-like object to format.

    @return: The string with formatted values interpolated.
    rV   )r3   r   vformatr=   )rW   rX   s     r   formatWithCallr[      s)    . z!,K4H4HIIJJJr   c                    	 d| v rt          |           S t          t          t          t          t
          f                  |                     dd                    }|dS t          |t                    rn=t          |t
                    r|                    d          }nt          d|          t          ||           S # t          $ r}t          | |          cY d}~S d}~ww xY w)ae  
    Formats an event as a string, using the format in C{event["log_format"]}.

    This implementation should never raise an exception; if the formatting
    cannot be done, the returned string will describe the event generically so
    that a useful message is emitted regardless.

    @param event: A logging event.

    @return: A formatted string.
    log_flattened
log_formatN zutf-8zLog format must be str, not )r   r
   r   r	   r3   bytesget
isinstancedecode	TypeErrorr[   r(   r*   )r   r'   es      r   _formatEventrf      s    2e##e$$$huS%Z01599\43P3PQQ>2 fc"" 	G&& 	G]]7++FFE6EEFFFfe,,, 2 2 2'q111111112s*   C AC A"C 
C&C!C&!C&r%   c                     	 |                                  }n)# t          $ r}dt          |          z   }Y d}~nd}~ww xY w|S )a^  
    Format a failure traceback, assuming UTF-8 and using a replacement
    strategy for errors.  Every effort is made to provide a usable
    traceback, but should not that not be possible, a message and the
    captured exception are logged.

    @param failure: The failure to retrieve a traceback from.

    @return: The formatted traceback.
    z((UNABLE TO OBTAIN TRACEBACK FROM EVENT):N)getTracebackr(   r3   )r%   	tracebackre   s      r   _formatTracebackrj     s^    H((**		 H H H>QG						Hs    
=8=c           	         t          t          t                   |                     dd                    }|t          t          t                   |                     dd                    }|d}n|j        }d                    t          t          |                     dd                    |          }n#	 t          |          }n# t          $ r d}Y nw xY w|S )	a  
    Format the system specified in the event in the "log_system" key if set,
    otherwise the C{"log_namespace"} and C{"log_level"}, joined by a C{"#"}.
    Each defaults to C{"-"} is not set.  If formatting fails completely,
    "UNFORMATTABLE" is returned.

    @param event: The event containing the system specification.

    @return: A formatted string representing the "log_system" key.
    
log_systemN	log_levelr+   z{namespace}#{level}log_namespace)	namespacelevelUNFORMATTABLE)r
   r   r3   ra   r   namer'   	Exception)r   systemrp   	levelNames       r   _formatSystemrv     s     (3-<!>!>??F~Xm,eiiT.J.JKK=II
I&--3		/3 ? ?@@ . 
 

	%[[FF 	% 	% 	%$FFF	%Ms   7C CCTr   r   r   c                    t          |           }|r2d| v r.| d         }t          |          }d                    ||f          }|s|S d}|rGd                     |t          t          |                     dd                              dg          }d}	|r&d                    dt          |           ddg          }	d	                    ||	|
          S )ah  
    Format an event as text.  Optionally, attach timestamp, traceback, and
    system information.

    The full output format is:
    C{"{timeStamp} [{system}] {event}\n{traceback}\n"} where:

        - C{timeStamp} is the event's C{"log_time"} value formatted with
          the provided C{formatTime} callable.

        - C{system} is the event's C{"log_system"} value, if set, otherwise,
          the C{"log_namespace"} and C{"log_level"}, joined by a C{"#"}.  Each
          defaults to C{"-"} is not set.

        - C{event} is the event, as formatted by L{formatEvent}.

        - C{traceback} is the traceback if the event contains a
          C{"log_failure"} key.  In the event the original traceback cannot
          be formatted, a message indicating the failure will be substituted.

    If the event cannot be formatted, and no traceback exists, an empty string
    is returned, even if includeSystem or includeTimestamp are true.

    @param event: A logging event.
    @param includeTraceback: If true and a C{"log_failure"} key exists, append
        a traceback.
    @param includeTimestamp: If true include a formatted timestamp before the
        event.
    @param includeSystem:  If true, include the event's C{"log_system"} value.
    @param formatTime: A time formatter

    @return: A formatted string with specified options.

    @since: Twisted 18.9.0
    log_failurer8   r_   log_timeN []z{timeStamp}{system}{eventText})	timeStamprt   r:   )rf   rj   r    r
   floatra   rv   r'   )
r   r   r   r   r6   r:   fri   r}   rt   s
             r   r   r   6  s    T U##I 6MU22- $Q''	IIy)455	 I YGGZZUEIIj$4O4O(P(PQQSVWXX	F @#}U33S#>??+22 3   r   N)'rT   r   r1   typingr   r   r   r   r   r	   r
   
constantlyr   twisted.python._tzhelperr   twisted.python.failurer   twisted.python.reflectr   _flattenr   r   _interfacesr   timeFormatRFC3339r3   r   r(   r*   r~   r6   r;   r=   r[   rf   rj   rv   boolr   rV   r   r   <module>r      s  
  * ) ) ) ) ) J J J J J J J J J J J J J J J J J J $ $ $ $ $ $ 8 8 8 8 8 8 * * * * * * , , , , , , , , , , , , , , ! ! ! ! ! !) x C    (!
H !
] !
s !
 !
 !
 !
L !22 2
5/22 2 		2 2 2 2F EO3 33!)8E?*;S*@!A3c]3 3 3 3l    '#s(#   DK KwsCx/@ KS K K K K42 2S 2 2 2 2Dg #    $ c    B "!)3? ??? ? 	?
 %#&? 	? ? ? ? ? ?r   