U
    \Sh                     @  s   d Z ddlmZ ddlmZ ddlmZ ddl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.
    )annotations)defaultdict)
attrgetter)TYPE_CHECKINGAnyCallable
NamedTuple)ExtensionErrorSphinxError)__)logging)safe_getattr)Sphinxc                   @  s&   e Zd ZU ded< ded< ded< dS )EventListenerintidr   handlerpriorityN)__name__
__module____qualname____annotations__ r   r   @/root/rtd-docs/venv/lib/python3.8/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dddd	d
ZdddddddZdddddZdddddddddZdddddddddZ	dS )EventManagerzEvent manager for Sphinx.r   None)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__5   s    

zEventManager.__init__str)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   add;   s    
zEventManager.addr   r   )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   connectA   s    
zEventManager.connect)r0   r!   c                 C  s:   | j  D ]*}|dd D ]}|j|kr|| qq
dS )zDisconnect a handler.N)r&   valuesr   remove)r(   r0   r&   listenerr   r   r   
disconnectK   s    
zEventManager.disconnectr   )allowed_exceptionsr   ztuple[type[Exception], ...]r%   )r+   argsr6   r!   c          	      G  s   zt d|t|dd  W n tk
r2   Y nX g }t| j| tdd}|D ]}z||j| j	f|  W qR |k
r    Y qR t
k
r    Y qR tk
r } z:| j	jr t|jdd}ttd|j|f ||d|W 5 d}~X Y qRX qR|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   r/   r   r    r
   Zpdbr   r	   r   )	r(   r+   r6   r7   resultsr&   r4   excr:   r   r   r   emitR   s4     zEventManager.emitc                G  s0   | j |f|d|iD ]}|dk	r|  S qdS )zEmit a Sphinx event and returns first result.

        This returns the result of the first handler that doesn't return ``None``.
        r6   N)rB   )r(   r+   r6   r7   resultr   r   r   emit_firstresulto   s    
zEventManager.emit_firstresultN)
r   r   r   __doc__r)   r,   r1   r5   rB   rD   r   r   r   r   r   2   s   
r   N)rE   
__future__r   collectionsr   operatorr   typingr   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>   s:   
