U
    c6{i©  ã                   @   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	ƒe
ddœ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                   @   s`   e Zd ZdZeddœdd„Zeddœdd„Zeddœd	d
„Zeddœdd„Z	ee
dœ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.
    N)Ú	observersÚreturnc                 G   s   t |ƒ| _t| d�| _d S )N©Úobserver)ÚlistÚ
_observersr	   Úlog)Úselfr   © r   ú</tmp/pip-unpacked-wheel-hfbvu0bz/twisted/logger/_observer.pyÚ__init__   s    
zLogPublisher.__init__©r   r   c                 C   s0   t |ƒstd|›�ƒ‚|| jkr,| j |¡ 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 n tk
r$   Y nX dS )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©Úeventr   c              	      s¢   dˆ krd}nt ddœ‡ ‡fdd„}g }ˆjD ]F}|dk	rB||ƒ z|ˆ ƒ W q. tk
rr   | |tƒ f¡ Y q.X q.|D ]"\}}ˆ |¡}|jt||d� qzdS )z8
        Forward events to contained observers.
        Ú	log_traceNr   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#   ZbrokenObserversr   ZbrokenObserverr$   Z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   | ]}|ˆ k	r|V  qd S )Nr   )Ú.0Zobsr   r   r   Ú	<genexpr>g   s      z7LogPublisher._errorLoggerForObserver.<locals>.<genexpr>r   )r
   r   r	   )r   r   Z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
   Nr   c                 C   s   dS )zD
    I{ILogObserver} that does nothing with the events it sees.
    Nr   )r    r   r   r   ÚbitbucketLogObserverl   s    r/   )r.   Útypingr   r   Zzope.interfacer   Ztwisted.python.failurer   Z_interfacesr   r   Z_loggerr	   r'   r
   r/   r   r   r   r   Ú<module>   s   ÿU