o
    ¯b©  ã                   @   s€   d Z ddl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Zee	ƒG d	d
„ d
ƒƒZee	ƒde
ddfdd„ƒZdS )z
Basic log observers.
é    )ÚCallableÚOptional)Úimplementer)ÚFailureé   )ÚILogObserverÚLogEvent)ÚLoggerzITemporarily disabling observer {observer} due to exception: {log_failure}c                   @   sj   e Zd ZdZdeddfdd„Zdeddfdd	„Zdeddfd
d„Zdeddfdd„Z	dede
fdd„ZdS )ÚLogPublisherz˜
    I{ILogObserver} that fans out events to other observers.

    Keeps track of a set of L{ILogObserver} objects and forwards
    events to each.
    Ú	observersÚreturnNc                 G   s   t |ƒ| _t| d�| _d S )N©Úobserver)ÚlistÚ
_observersr	   Úlog)Úselfr   © r   ú:/usr/lib/python3/dist-packages/twisted/logger/_observer.pyÚ__init__   s   
zLogPublisher.__init__r   c                 C   s4   t |ƒstd|›�ƒ‚|| jvr| j |¡ dS dS )zq
        Registers an observer with this publisher.

        @param observer: An L{ILogObserver} to add.
        zObserver is not callable: N)ÚcallableÚ	TypeErrorr   Úappend©r   r   r   r   r   ÚaddObserver#   s
   
ÿzLogPublisher.addObserverc                 C   s(   z	| j  |¡ W dS  ty   Y dS w )zv
        Unregisters an observer with this publisher.

        @param observer: An L{ILogObserver} to remove.
        N)r   ÚremoveÚ
ValueErrorr   r   r   r   ÚremoveObserver.   s
   ÿzLogPublisher.removeObserverÚeventc              	      s    dˆ vrd}ndt ddf‡ ‡fdd„}g }ˆjD ]!}|dur"||ƒ z|ˆ ƒ W q ty9   | |tƒ f¡ Y qw |D ]\}}ˆ |¡}|jt||d� q<dS )z8
        Forward events to contained observers.
        Ú	log_traceNr   r   c                    s   ˆ d   ˆ| f¡ dS )z‹
                Add tracing information for an observer.

                @param observer: an observer being forwarded to
                r   N)r   r   ©r   r   r   r   ÚtraceB   s   z$LogPublisher.__call__.<locals>.trace)Úfailurer   )r   r   Ú	Exceptionr   r   Ú_errorLoggerForObserverr"   ÚOBSERVER_DISABLED)r   r   r!   ÚbrokenObserversr   ÚbrokenObserverr"   ÚerrorLoggerr   r    r   Ú__call__9   s(   
ÿ
ýþzLogPublisher.__call__c                    s"   t ‡ fdd„| jD ƒŽ }t|d�S )zõ
        Create an error-logger based on this logger, which does not contain the
        given bad observer.

        @param observer: The observer which previously had an error.

        @return: A L{Logger} without the given observer.
        c                 3   s   � | ]	}|ˆ ur|V  qd S )Nr   )Ú.0Úobsr   r   r   Ú	<genexpr>g   s   € z7LogPublisher._errorLoggerForObserver.<locals>.<genexpr>r   )r
   r   r	   )r   r   ÚerrorPublisherr   r   r   r$   ]   s   	ÿ
z$LogPublisher._errorLoggerForObserver)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r)   r	   r$   r   r   r   r   r
      s    $r
   r   r   Nc                 C   s   dS )zD
    I{ILogObserver} that does nothing with the events it sees.
    Nr   )r   r   r   r   ÚbitbucketLogObserverl   s    r2   )r1   Útypingr   r   Úzope.interfacer   Útwisted.python.failurer   Ú_interfacesr   r   Ú_loggerr	   r%   r
   r2   r   r   r   r   Ú<module>   s   ÿU