B
    d}                 @   s   d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZ ddlmZmZ ddlmZ ddlmZ ddlmZ erdd	lmZ eeZG d
d deZddddddddddddddddZG dd dZdS )zLSphinx core events.

Gracefully adapted from the TextPress system by Armin.
    )defaultdict)
attrgetter)TYPE_CHECKINGAnyCallableDictList
NamedTupleTupleType)ExtensionErrorSphinxError)__)logging)safe_getattr)Sphinxc               @   s&   e Zd ZU eed< eed< eed< dS )EventListeneridhandlerpriorityN)__name__
__module____qualname__int__annotations__r    r   r   Z/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/sphinx/events.pyr      s   
r    configzenv, added, changed, removedenvzenv, docnamezenv, docnameszdocname, source textz the doctree before being pickledz&env, read docnames, other env instancezenv, node, contnodezdomain, nodezdoctree, docname	exception)zbuilder-initedzconfig-initedzenv-get-outdatedzenv-get-updatedzenv-purge-doczenv-before-read-docszenv-check-consistencyzsource-readzdoctree-readzenv-merge-infozmissing-referencezwarn-missing-referencezdoctree-resolvedzenv-updatedzbuild-finishedc               @   s   e Zd ZdZdddddZedddd	Zeeeed
ddZ	eddddZ
ddeeeee df edddZddeeeee df edddZdS )EventManagerzEvent manager for Sphinx.r   N)appreturnc             C   s$   || _ t | _tt| _d| _d S )Nr   )r"   core_eventscopyeventsr   list	listenersnext_listener_id)selfr"   r   r   r   __init__3   s    

zEventManager.__init__)namer#   c             C   s(   || j krttd| d| j |< dS )zRegister a custom Sphinx event.zEvent %r already presentr   N)r&   r   r   )r*   r,   r   r   r   add9   s    
zEventManager.add)r,   callbackr   r#   c             C   sJ   || j krttd| | j}|  jd7  _| j| t||| |S )z$Connect a handler to specific event.zUnknown event name: %s   )r&   r   r   r)   r(   appendr   )r*   r,   r.   r   listener_idr   r   r   connect?   s    
zEventManager.connect)r1   r#   c             C   sB   x<| j  D ].}x(|dd D ]}|j|kr|| qW qW dS )zDisconnect a handler.N)r(   valuesr   remove)r*   r1   r(   listenerr   r   r   
disconnectI   s    
zEventManager.disconnectr   )allowed_exceptions.)r,   argsr7   r#   c      	      G   s   yt d|t|dd  W n tk
r2   Y nX g }t| j| tdd}x|D ]}y||j| j	f|  W qT |k
r    Y qT t
k
r    Y qT tk
r } z:| j	jr t|jdd}ttd|j|f ||d|W dd}~X Y qTX qTW |S )	zEmit a Sphinx event.z[app] emitting event: %r%sNd   r   )keyr   z*Handler %r for event %r threw an exception)modname)loggerdebugrepr	Exceptionsortedr(   r   r0   r   r"   r   pdbr   r   r   )	r*   r,   r7   r8   resultsr(   r5   excr;   r   r   r   emitP   s(    
,zEventManager.emitc            G   s0   x*| j |f|d|iD ]}|dk	r|S qW dS )zEmit a Sphinx event and returns first result.

        This returns the result of the first handler that doesn't return ``None``.
        r7   N)rD   )r*   r,   r7   r8   resultr   r   r   emit_firstresultm   s    zEventManager.emit_firstresult)r   r   r   __doc__r+   strr-   r   r   r2   r6   r   r
   r   r?   r   rD   rF   r   r   r   r   r!   0   s   
&r!   N)rG   collectionsr   operatorr   typingr   r   r   r   r   r	   r
   r   Zsphinx.errorsr   r   Zsphinx.localer   Zsphinx.utilr   Zsphinx.util.inspectr   Zsphinx.applicationr   	getLoggerr   r<   r   r$   r!   r   r   r   r   <module>   s6   (
