U
    ÌZj¸*  ã                   @   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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¡ r| dkp|   d¡S )NÚ_ÚdispatchZ	_sa_event)Ú
startswith)Úname© r   úX/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/sqlalchemy/event/base.pyÚ_is_event_name   s    ÿþr   c                   @   s   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   s8   |j D ]$}d|jkr|jd j |¡  S qtdƒ‚d S )Nr
   z*No class with a 'dispatch' member present.)Ú__mro__Ú__dict__r
   Ú
_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e
d
d„ ƒZdd„ Z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                    sb   || _ ˆ | _ˆ rXz| jˆ  | _W q^ tk
rT   ‡ fdd„|jD ƒ | _| jˆ < Y q^X ni | _d S )Nc                    s   i | ]}|j t|ˆ ƒ“qS r   )r   r   )Ú.0Úls©Úinstance_clsr   r   Ú
<dictcomp>]   s   ÿ z&_Dispatch.__init__.<locals>.<dictcomp>)r   r   Ú_empty_listener_regr   ÚKeyErrorÚ_event_descriptors)r   Úparentr#   r   r"   r   Ú__init__S   s    
þþ
ÿ
z_Dispatch.__init__c                 C   sB   z| j | }W n tk
r*   t|ƒ‚Y nX t| |j|ƒ |S d S ©N)r   r&   r   Úsetattrr   )r   r   r!   r   r   r   Ú__getattr__d   s    z_Dispatch.__getattr__c                 c   s   | j D ]}t| |ƒV  qd S r*   )Ú_event_namesÚgetattr)r   Úkr   r   r   r'   o   s    
z_Dispatch._event_descriptorsc                 C   s   | j jS r*   )Ú_eventsÚ_listen©r   r   r   r   r1   v   s    z_Dispatch._listenc                 C   s   |   | |¡S r*   )Ú	__class__)r   r#   r   r   r   r   z   s    z_Dispatch._for_classc                 C   s   |j }|  |¡S r*   )r3   r   )r   Úinstancer#   r   r   r   Ú_for_instance}   s    z_Dispatch._for_instancec                 C   s<   d| j jkr0t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   Ú_JoinedDispatcherr-   r6   )r   Úotherr   r   r   r   Ú_join�   s    
ýz_Dispatch._joinc                 C   s   t ƒ | jffS r*   )r   r   r2   r   r   r   Ú
__reduce__’   s    z_Dispatch.__reduce__Tc                 C   s8   |j D ],}t|tƒrqt| |jƒ | ¡j||d� qdS )zIPopulate from the listeners in another :class:`_Dispatch`
        object.)Úonly_propagateN)r'   Ú
isinstancer   r.   r   Ú
for_modifyÚ_update)r   r:   r=   r!   r   r   r   r@   •   s    

 ÿz_Dispatch._updatec                 C   s   | j D ]}| | ¡ ¡  qd S r*   )r'   r?   Úclear)r   r!   r   r   r   Ú_clearŸ   s    
z_Dispatch._clear)N)T)r   r   r   r   r7   ÚweakrefÚWeakKeyDictionaryr%   r)   r,   Úpropertyr'   r1   r   r5   r;   r<   r@   rB   r   r   r   r   r   9   s   




r   c                   @   s   e Zd ZdZdd„ ZdS )Ú
_EventMetazKIntercept new Event subclasses and create
    associated _Dispatch classes.c                 C   s"   t | |||ƒ t | |||¡ d S r*   )Ú_create_dispatcher_classr8   r)   )r   Ú	classnameÚbasesÚdict_r   r   r   r)   ¨   s    z_EventMeta.__init__N)r   r   r   r   r)   r   r   r   r   rF   ¤   s   rF   c                 C   s  t | dƒr| jj}nt}dd„ |D ƒ}td| |fd|iƒ}||_|  | |¡}|jD ](}t||t| || ƒƒ t	|  
| ¡ qT|jD ]B}	t|	tƒr„|	tk	r„|	jjjD ] }
t||
j|
ƒ |j 
|
j¡ q¤q„t| ddƒ�r
| j}t |dƒrþd|jkrþt| ƒ| j_nt| ƒ| j_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    r/   r   r   r   Ú
<listcomp>¹   s      z,_create_dispatcher_class.<locals>.<listcomp>z
%sDispatchr7   Ú_dispatch_targetNÚ_slots_dispatch)Úhasattrr
   r3   r   r8   r-   Ú_set_dispatchr+   r   Ú_registrarsÚappendÚ	__bases__Ú
issubclassr0   r'   r   r.   rL   r7   Úslots_dispatcherÚ
dispatcher)r   rH   rI   rJ   Zdispatch_baseZevent_namesÚdispatch_clsZdispatch_instr/   Zsuper_r!   Zthe_clsr   r   r   rG   ­   s6    

  ÿ

ÿþrG   c                 C   s.   | j jD ] }t|  | ¡ t| st|= qd S r*   )r
   r-   rP   Úremove)r   r/   r   r   r   Ú_remove_dispatcherÖ   s    rX   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
   r0   )r   rV   r   r   r   rO   à   s    
zEvents._set_dispatchc                    sX   ‡ fdd„}‡ fdd„}t ˆ dƒrT|| jjƒsP|t| jjƒsP|tƒrT|| jjƒrTˆ S d S )Nc                     s   t ‡ fdd„| D ƒƒS )Nc                 3   s   | ]}t ˆ j|ƒV  qd S r*   )r>   r
   )r    Út©Útargetr   r   Ú	<genexpr>î   s     z;Events._accept_with.<locals>.dispatch_is.<locals>.<genexpr>)Úall)Útypesr[   r   r   Údispatch_isí   s    z(Events._accept_with.<locals>.dispatch_isc                    s   t ˆ jj| ƒS r*   )r>   r
   r(   )rZ   r[   r   r   Údispatch_parent_isð   s    z/Events._accept_with.<locals>.dispatch_parent_isr
   )rN   r
   r3   r8   r9   )r   r\   r`   ra   r   r[   r   Ú_accept_withë   s    

ÿþü
ûzEvents._accept_withFc                 C   s   |j ||||d� d S )N)Ú	propagateÚinsertÚnamedÚasyncio)Zbase_listen)r   Ú	event_keyrc   rd   re   rf   r   r   r   r1      s    	   ÿzEvents._listenc                 C   s   |  ¡  d S r*   )rW   )r   rg   r   r   r   Ú_remove  s    zEvents._removec                 C   s   | j  ¡  d S r*   )r
   rB   )r   r   r   r   rB     s    zEvents._clearN)FFFF)r   r   r   r   ÚstaticmethodrO   Úclassmethodrb   r1   rh   rB   r   r   r   r   rY   Ý   s   


    ú
rY   c                   @   s<   e Zd ZdZdZdd„ Zdd„ Zedd„ ƒZed	d
„ ƒZ	dS )r9   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*   )r.   rl   r   r(   r   r+   )r   r   r!   Újlr   r   r   r,      s    z_JoinedDispatcher.__getattr__c                 C   s   | j jS r*   )r(   r1   r2   r   r   r   r1   (  s    z_JoinedDispatcher._listenc                 C   s   | j jS r*   )r(   r0   r2   r   r   r   r0   ,  s    z_JoinedDispatcher._eventsN)
r   r   r   r   r7   r)   r,   rE   r1   r0   r   r   r   r   r9     s   
r9   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )rU   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
   Úevents)r   rn   r   r   r   r)   9  s    zdispatcher.__init__c              
   C   sh   |d kr| j S | j  |¡}z||jd< W n: tk
rb } ztjtd|f ƒ|d� W 5 d }~X Y nX |S )Nr
   zGtarget %r doesn't have __dict__, should it be defining _slots_dispatch?)Zreplace_context)r
   r5   r   r   r   Zraise_Ú	TypeError)r   Úobjr   ÚdispZaer   r   r   Ú__get__=  s    ÿÿûzdispatcher.__get__N)r   r   r   r   r)   rr   r   r   r   r   rU   1  s   rU   c                   @   s   e Zd Zdd„ ZdS )rT   c                 C   s4   |d kr| j S t|dƒr|jS | j  |¡}||_|S )NrM   )r
   rN   rM   r5   )r   rp   r   rq   r   r   r   rr   P  s    
zslots_dispatcher.__get__N)r   r   r   rr   r   r   r   r   rT   O  s   rT   )r   Ú
__future__r   rC   Úattrr   r   r   Ú r   ÚdefaultdictÚlistrP   r   Úobjectr   r   r8   rF   rG   rX   Úwith_metaclassrY   r9   rU   rT   r   r   r   r   Ú<module>   s"   


k	)9