o
    y¬´\Z%  ã                   @   sÖ   d Z ddlmZ ddlZddlmZ ddlmZ ddlmZ dd	lm	Z	 e	 
e¡Zd
d„ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZdd„ Zdd„ ZG dd„ de	 ee¡ƒZG dd„ deƒZG dd„ deƒZdS )aµ  Base implementation classes.

The public-facing ``Events`` serves as the base class for an event interface;
its public attributes represent different kinds of events.   These attributes
are mirrored onto a ``_Dispatch`` class, which serves as a container for
collections of listener functions.   These collections are represented both
at the class level of a particular ``_Dispatch`` class as well as within
instances of ``_Dispatch``.

é    )Úabsolute_importNé   )Ú_ClsLevelDispatch)Ú_EmptyListener)Ú_JoinedListeneré   )Úutilc                 C   s   |   d¡ o	| dkS )NÚ_Údispatch)Ú
startswith)Úname© r   úG/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/event/base.pyÚ_is_event_name   s   r   c                   @   ó   e Zd ZdZdd„ ZdS )Ú_UnpickleDispatchz�Serializable callable that re-generates an instance of
    :class:`_Dispatch` given a particular :class:`.Events` subclass.

    c                 C   s4   |j D ]}d|jv r|jd j |¡  S qtdƒ‚)Nr
   z*No class with a 'dispatch' member present.)Ú__mro__Ú__dict__Údispatch_clsÚ
_for_classÚAttributeError)ÚselfÚ_instance_clsÚclsr   r   r   Ú__call__(   s   

ÿÿz_UnpickleDispatch.__call__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   "   s    r   c                   @   sx   e Zd ZdZdZe ¡ Zddd„Zdd„ Z	e
dd	„ ƒZd
d„ Zdd„ Ze
dd„ ƒZdd„ Zdd„ Zddd„Zdd„ ZdS )Ú	_Dispatcha;  Mirror the event listening definitions of an Events class with
    listener collections.

    Classes which define a "dispatch" member will return a
    non-instantiated :class:`._Dispatch` subclass when the member
    is accessed at the class level.  When the "dispatch" member is
    accessed at the instance level of its owner, an instance
    of the :class:`._Dispatch` class is returned.

    A :class:`._Dispatch` class is generated for each :class:`.Events`
    class defined, by the :func:`._create_dispatcher_class` function.
    The original :class:`.Events` classes remain untouched.
    This decouples the construction of :class:`.Events` subclasses from
    the implementation used by the event internals, and allows
    inspecting tools like Sphinx to work in an unsurprising
    way against the public API.

    )Ú_parentr   r   Ú_empty_listenersNc                    sf   || _ ˆ | _ˆ r.z	| jˆ  | _W d S  ty-   t‡ fdd„|jD ƒƒ | _| jˆ < Y d S w i | _d S )Nc                 3   s    � | ]}|j t|ˆ ƒfV  qd S ©N)r   r   )Ú.0Úls©Úinstance_clsr   r   Ú	<genexpr>U   s
   € ÿ
ÿz%_Dispatch.__init__.<locals>.<genexpr>)r    r   Ú_empty_listener_regr!   ÚKeyErrorÚdictÚ_event_descriptors)r   Úparentr&   r   r%   r   Ú__init__L   s   þ
þÿÿ
z_Dispatch.__init__c                 C   s8   z| j | }W n ty   t|ƒ‚w t| |j|ƒ |S r"   )r!   r)   r   Úsetattrr   )r   r   r$   r   r   r   Ú__getattr__\   s   ÿz_Dispatch.__getattr__c                 c   s   � | j D ]}t| |ƒV  qd S r"   )Ú_event_namesÚgetattr)r   Úkr   r   r   r+   g   s   €
ÿz_Dispatch._event_descriptorsc                 C   s   |   | |¡S r"   )Ú	__class__)r   r&   r   r   r   r   l   s   z_Dispatch._for_classc                 C   s   |j }|  |¡S r"   )r3   r   )r   Úinstancer&   r   r   r   Ú_for_instanceo   s   
z_Dispatch._for_instancec                 C   ó   | j jS r"   )Ú_eventsÚ_listen©r   r   r   r   r8   s   ó   z_Dispatch._listenc                 C   s<   d| j jvrtd| j j tfd| jiƒ}|| j _|  | |¡S )z¡Create a 'join' of this :class:`._Dispatch` and another.

        This new dispatcher will dispatch events to both
        :class:`._Dispatch` objects.

        Ú_joined_dispatch_clszJoined%sÚ	__slots__)r3   r   Útyper   Ú_JoinedDispatcherr0   r;   )r   Úotherr   r   r   r   Ú_joinw   s   
ýz_Dispatch._joinc                 C   s   t ƒ | jffS r"   )r   r   r9   r   r   r   Ú
__reduce__ˆ   s   z_Dispatch.__reduce__Tc                 C   s8   |j D ]}t|tƒrqt| |jƒ | ¡j||d� qdS )zMPopulate from the listeners in another :class:`_Dispatch`
            object.)Úonly_propagateN)r+   Ú
isinstancer   r1   r   Ú
for_modifyÚ_update)r   r?   rB   r$   r   r   r   rE   ‹   s   

ÿýz_Dispatch._updatec                 C   s   | j D ]	}| | ¡ ¡  qd S r"   )r+   rD   Úclear)r   r$   r   r   r   Ú_clear•   s   
ÿz_Dispatch._clearr"   )T)r   r   r   r   r<   ÚweakrefÚWeakKeyDictionaryr(   r-   r/   Úpropertyr+   r   r5   r8   r@   rA   rE   rG   r   r   r   r   r   2   s     




r   c                   @   r   )Ú
_EventMetazKIntercept new Event subclasses and create
    associated _Dispatch classes.c                 C   s   t | |||ƒ t | |||¡S r"   )Ú_create_dispatcher_classr=   r-   )r   Ú	classnameÚbasesÚdict_r   r   r   r-   ž   s   z_EventMeta.__init__N)r   r   r   r   r-   r   r   r   r   rK   š   s    rK   c                 C   sè   t | dƒr
| jj}nt}dd„ |D ƒ}td| |fd|iƒ}||_|  | |¡}|jD ]}t||t| || ƒƒ t	|  
| ¡ q*|jD ]!}	t|	tƒrc|	turc|	jjjD ]}
t||
j|
ƒ |j 
|
j¡ qRqBt| ddƒrrt| ƒ| j_dS dS )zRCreate a :class:`._Dispatch` class corresponding to an
    :class:`.Events` class.r
   c                 S   s   g | ]}t |ƒr|‘qS r   )r   )r#   r2   r   r   r   Ú
<listcomp>¯   s    z,_create_dispatcher_class.<locals>.<listcomp>z
%sDispatchr<   Ú_dispatch_targetN)Úhasattrr
   r3   r   r=   r0   Ú_set_dispatchr.   r   Ú_registrarsÚappendÚ	__bases__Ú
issubclassr7   r+   r   r1   Ú
dispatcherrQ   )r   rM   rN   rO   Údispatch_baseÚevent_namesr   Údispatch_instr2   Úsuper_r$   r   r   r   rL   £   s*   

ÿ

€ÿrL   c                 C   s.   | j jD ]}t|  | ¡ t| st|= qd S r"   )r
   r0   rT   Úremove)r   r2   r   r   r   Ú_remove_dispatcherÅ   s   €ýr^   c                   @   sN   e Zd ZdZedd„ ƒZedd„ ƒZeddd„ƒZed	d
„ ƒZ	edd„ ƒZ
dS )ÚEventsz>Define event listening functions for a particular target type.c                 C   s   |d ƒ| _ | |_| j S r"   )r
   r7   )r   r   r   r   r   rS   Ï   s   
zEvents._set_dispatchc                 C   s\   t |dƒr,t|j| jjƒs*t|jtƒrt|j| jjƒs*t|jtƒr,t|jj| jjƒr,|S d S ©Nr
   )rR   rC   r
   r3   r=   r>   r,   )r   Útargetr   r   r   Ú_accept_withÚ   s   
ÿ
ýü
ùøzEvents._accept_withFc                 C   s   |j |||d� d S )N)Ú	propagateÚinsertÚnamed)Úbase_listen)r   Ú	event_keyrc   rd   re   r   r   r   r8   í   s   zEvents._listenc                 C   s   |  ¡  d S r"   )r]   )r   rg   r   r   r   Ú_removeñ   s   zEvents._removec                 C   s   | j  ¡  d S r"   )r
   rG   )r   r   r   r   rG   õ   s   zEvents._clearN)FFF)r   r   r   r   ÚstaticmethodrS   Úclassmethodrb   r8   rh   rG   r   r   r   r   r_   Ì   s    



r_   c                   @   s0   e Zd ZdZdZdd„ Zdd„ Zedd„ ƒZd	S )
r>   z5Represent a connection between two _Dispatch objects.©Úlocalr,   r   c                 C   s   || _ || _| j j| _d S r"   rk   )r   rl   r,   r   r   r   r-   ÿ   s   z_JoinedDispatcher.__init__c                 C   s.   t | j|ƒ}t| j|j|ƒ}t| |j|ƒ |S r"   )r1   rl   r   r,   r   r.   )r   r   r$   Újlr   r   r   r/     s   z_JoinedDispatcher.__getattr__c                 C   r6   r"   )r,   r8   r9   r   r   r   r8     r:   z_JoinedDispatcher._listenN)	r   r   r   r   r<   r-   r/   rJ   r8   r   r   r   r   r>   ú   s    r>   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )rX   zŸDescriptor used by target classes to
    deliver the _Dispatch class at the class level
    and produce new _Dispatch instances for target
    instances.

    c                 C   s   |j | _|| _d S r"   )r
   r   Úevents)r   rn   r   r   r   r-     s   
zdispatcher.__init__c                 C   s(   |d u r| j S | j  |¡ |jd< }|S r`   )r   r5   r   )r   Úobjr   Údispr   r   r   Ú__get__  s   zdispatcher.__get__N)r   r   r   r   r-   rq   r   r   r   r   rX     s    rX   )r   Ú
__future__r   rH   Úattrr   r   r   Ú r   ÚdefaultdictÚlistrT   r   Úobjectr   r   r=   rK   rL   r^   Úwith_metaclassr_   r>   rX   r   r   r   r   Ú<module>   s"   

h	".