o
    by                  	   @   s   d Z ddl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mZ ddlmZ ddlmZmZ er:dd	lmZ eeG d
d dZdedeeef deeeef gee f ddfddZdS )z)
Integration with L{twisted.python.log}.
    )TYPE_CHECKINGAnyCallableDictOptional)implementer   )formatEvent)ILogObserverLogEvent)LogLevel)StringifiableFromEventfromStdlibLogLevelMapping)r
   c                   @   s:   e Zd ZdZdddZdefdd	Zd
eddfddZdS )LegacyLogObserverWrapperz
    L{ILogObserver} that wraps a L{twisted.python.log.ILogObserver}.

    Received (new-style) events are modified prior to forwarding to
    the legacy observer to ensure compatibility with observers that
    expect legacy events.
    legacyObserverILegacyLogObserverreturnNc                 C   s
   || _ dS )zr
        @param legacyObserver: a legacy observer to which this observer will
            forward events.
        N)r   )selfr    r   8/usr/lib/python3/dist-packages/twisted/logger/_legacy.py__init__    s   
z!LegacyLogObserverWrapper.__init__c                 C   s   dj | dS )Nz0{self.__class__.__name__}({self.legacyObserver})r   )formatr   r   r   r   __repr__'   s   z!LegacyLogObserverWrapper.__repr__eventc                 C   s   d|vrd|d< d|vr|d |d< d|vr| dd|d< d|vrA| d	d
d
urAd|d< t| |d< t|d tsAd|d< d|v rbd|vrO|d |d< d|vrWd|d< d|vrat||d< nd|vry|d tjtjfv rud|d< nd|d< | 	| d
S )z
        Forward events to the legacy observer after editing them to
        ensure compatibility.

        @param event: an event
        messager   timelog_timesystem
log_system-r   
log_formatNz%(log_legacy)s
log_legacylog_failurefailureisErrorr   why	log_levelr   )
getr   copy
isinstancetupler	   r   errorcriticalr   )r   r   r   r   r   __call__*   s0   	
z!LegacyLogObserverWrapper.__call__)r   r   r   N)	__name__
__module____qualname____doc__r   strr   r   r.   r   r   r   r   r      s
    
r   observer	eventDicttextFromEventDictr   Nc                 C   s   d|vr
|d |d< d|vr||}|dur||d< d|d< d|vrUd|v r:zt |d  }W n ty9   d}Y nw d	|v rJ|d	 rFtj}ntj}ntj}|durU||d< d
|vr]d|d
< d|vrkd|v rk|d |d< | | dS )a"  
    Publish an old-style (L{twisted.python.log}) event to a new-style
    (L{twisted.logger}) observer.

    @note: It's possible that a new-style event was sent to a
        L{LegacyLogObserverWrapper}, and may now be getting sent back to a
        new-style observer.  In this case, it's already a new-style event,
        adapted to also look like an old-style event, and we don't need to
        tweak it again to be a new-style event, hence this checks for
        already-defined new-style keys.

    @param observer: A new-style observer to handle this event.
    @param eventDict: An L{old-style <twisted.python.log>}, log event.
    @param textFromEventDict: callable that can format an old-style event as a
        string.  Passed here rather than imported to avoid circular dependency.
    r   r   r!   Nlog_textz
{log_text}r'   logLevelr%   log_namespacer"   r   r   )r   KeyErrorr   r-   info)r4   r5   r6   textlevelr   r   r   publishToNewObserver]   s4   r>   )r2   typingr   r   r   r   r   zope.interfacer   _formatr	   _interfacesr
   r   _levelsr   _stdlibr   r   twisted.python.logr   r   r3   r>   r   r   r   r   <module>   s(   F
