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