B
    f<                 @  s  U 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 ddlmZ dd	lm	Z	 dd
lm
Z
 ddlmZ ddlmZ ddlmZ ddlmZ ddlm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 ddlmZ ddlmZ ddlmZ ddlmZ eeZ de!d< dddd d!Z"G d"d# d#Z#G d$d% d%ee Z$G d&d' d'e$e Z%d(d)d*d+d,Z&G d-d. d.ee Z'G d/d0 d0e$e Z(G d1d2 d2e'e Z)G d3d4 d4ee Z*G d5d6 d6e*e Z+dS )7a  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``.

    )annotationsN)Any)cast)Dict)Generic)Iterator)List)Mapping)MutableMapping)Optional)overload)Tuple)Type)Union   )_ClsLevelDispatch)_EmptyListener)_InstanceLevelDispatch)_JoinedListener)_ET)	_EventKey   )util)Literalz8MutableMapping[str, List[Type[_HasEventsDispatch[Any]]]]_registrarsstrbool)namereturnc             C  s   |  d r| dkp|  dS )N_dispatchZ	_sa_event)
startswith)r    r"   WC:\Users\Lenovo\AppData\Local\Temp\pip-unpacked-wheel-4nia5yor\sqlalchemy\event\base.py_is_event_name2   s    r$   c               @  s    e Zd ZdZdddddZdS )_UnpickleDispatchzSerializable callable that re-generates an instance of
    :class:`_Dispatch` given a particular :class:`.Events` subclass.

    z	Type[_ET]z_Dispatch[_ET])_instance_clsr   c             C  s>   x8|j D ]&}d|jkrtd|jd j|S qW tdd S )Nr    z_Dispatch[_ET]z*No class with a 'dispatch' member present.)__mro____dict__r   r    
_for_classAttributeError)selfr&   clsr"   r"   r#   __call__B   s    

z_UnpickleDispatch.__call__N)__name__
__module____qualname____doc__r-   r"   r"   r"   r#   r%   <   s   r%   c               @  sL   e Zd ZU dZded< dddddZd	d
dddZeddddZdS )_DispatchCommonr"   zOptional[Type[_ET]]r&   z_DispatchCommon[_ET]z_JoinedDispatcher[_ET])otherr   c             C  s
   t  d S )N)NotImplementedError)r+   r3   r"   r"   r#   _joinQ   s    z_DispatchCommon._joinr   z_InstanceLevelDispatch[_ET])r   r   c             C  s
   t  d S )N)r4   )r+   r   r"   r"   r#   __getattr__T   s    z_DispatchCommon.__getattr__zType[_HasEventsDispatch[_ET]])r   c             C  s
   t  d S )N)r4   )r+   r"   r"   r#   _eventsW   s    z_DispatchCommon._eventsN)	r.   r/   r0   	__slots____annotations__r5   r6   propertyr7   r"   r"   r"   r#   r2   L   s
   
r2   c               @  s   e Zd ZU dZdZded< e Zded< ded< d	ed
< ded< ded< ded< d<dddddZ	dddddZ
eddddZdd d!d"d#d$Zd%d&d'd(d)Zd*d&d+d,d-Zd.d/d0d1d2Zd3dd4d5Zd=d&dd!d7d8d9Zd!dd:d;ZdS )>	_DispatchaM  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 :meth:`._HasEventsDispatch._create_dispatcher_class`
    method.  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_listenersr   Z_active_historyz9MutableMapping[Type[_ET], Dict[str, _EmptyListener[_ET]]]_empty_listener_regzDict[str, _EmptyListener[_ET]]r=   z	List[str]_event_nameszOptional[Type[_ET]]r&   zType[_JoinedDispatcher[_ET]]_joined_dispatch_clszType[_HasEventsDispatch[_ET]]r7   NzOptional[_Dispatch[_ET]])parentinstance_clsc               sn   || _  | _ rd|d k	sty| j  | _W qj tk
r`    fdd|jD  | _| j < Y qjX ni | _d S )Nc               s   i | ]}t | |jqS r"   )r   r   ).0ls)rB   r"   r#   
<dictcomp>   s   z&_Dispatch.__init__.<locals>.<dictcomp>)r<   r&   AssertionErrorr>   r=   KeyError_event_descriptors)r+   rA   rB   r"   )rB   r#   __init__   s    
z_Dispatch.__init__r   z_InstanceLevelDispatch[_ET])r   r   c             C  sB   y| j | }W n tk
r*   t|Y nX t| |j| |S d S )N)r=   rG   r*   setattrr   )r+   r   rD   r"   r"   r#   r6      s    z_Dispatch.__getattr__z Iterator[_ClsLevelDispatch[_ET]])r   c             c  s    x| j D ]}t| |V  qW d S )N)r?   getattr)r+   kr"   r"   r#   rH      s    z_Dispatch._event_descriptorsz_EventKey[_ET]r   None)	event_keykwr   c             K  s   | j j|f|S )N)r7   _listen)r+   rN   rO   r"   r"   r#   rP      s    z_Dispatch._listenz	Type[_ET]z_Dispatch[_ET])rB   r   c             C  s   |  | |S )N)	__class__)r+   rB   r"   r"   r#   r)      s    z_Dispatch._for_classr   )instancer   c             C  s   |j }| |S )N)rQ   r)   )r+   rR   rB   r"   r"   r#   _for_instance   s    z_Dispatch._for_instancez_DispatchCommon[_ET]z_JoinedDispatcher[_ET])r3   r   c             C  s   d| j jkst| | |S )zCreate a 'join' of this :class:`._Dispatch` and another.

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

        r@   )rQ   r(   rF   r@   )r+   r3   r"   r"   r#   r5      s    z_Dispatch._joinzUnion[str, Tuple[Any, ...]]c             C  s   t  | jffS )N)r%   r&   )r+   r"   r"   r#   
__reduce__   s    z_Dispatch.__reduce__T)r3   only_propagater   c             C  s<   x6|j D ],}t|trqt| |j| j||d qW dS )zIPopulate from the listeners in another :class:`_Dispatch`
        object.)rU   N)rH   
isinstancer   rK   r   
for_modify_update)r+   r3   rU   rD   r"   r"   r#   rX      s
    
z_Dispatch._updatec             C  s"   x| j D ]}||   qW d S )N)rH   rW   clear)r+   rD   r"   r"   r#   _clear   s    z_Dispatch._clear)N)T)r.   r/   r0   r1   r8   r9   weakrefWeakKeyDictionaryr>   rI   r6   r:   rH   rP   r)   rS   r5   rT   rX   rZ   r"   r"   r"   r#   r;   \   s&   

r;   zType[_HasEventsDispatch[_ET]]rM   )r,   r   c             C  s2   x,| j jD ] }t| |  t| s
t|= q
W d S )N)r    r?   r   remove)r,   rL   r"   r"   r#   _remove_dispatcher   s    r^   c            	   @  s   e Zd ZU ded< ded< ejr0ddddd	Zd
dddZeddddddZ	eddddddddddd
dddZ
eddddddZeddd d
d!d"d#Zd$S )%_HasEventsDispatchzOptional[Type[_ET]]_dispatch_targetz_Dispatch[_ET]r    r   z_InstanceLevelDispatch[_ET])r   r   c             C  s   d S )Nr"   )r+   r   r"   r"   r#   r6          z_HasEventsDispatch.__getattr__rM   )r   c             C  s   |  | j| j| j dS )zOIntercept new Event subclasses and create associated _Dispatch
        classes.N)_create_dispatcher_classr.   	__bases__r(   )r,   r"   r"   r#   __init_subclass__   s    z$_HasEventsDispatch.__init_subclass__zUnion[_ET, Type[_ET]]zOptional[Union[_ET, Type[_ET]]])target
identifierr   c             C  s
   t  d S )N)r4   )r,   re   rf   r"   r"   r#   _accept_with   s    z_HasEventsDispatch._accept_withF)	propagateinsertnamedasyncioz_EventKey[_ET]r   )rN   rh   ri   rj   rk   r   c            C  s
   t  d S )N)r4   )r,   rN   rh   ri   rj   rk   r"   r"   r#   rP      s    
z_HasEventsDispatch._listenzType[_HasEventsDispatch[_ET]]zType[_Dispatch[_ET]])klassdispatch_clsr   c             C  s   |d | _ | |_| j S )N)r    r7   )rl   rm   r"   r"   r#   _set_dispatch  s    

z _HasEventsDispatch._set_dispatchzTuple[type, ...]zMapping[str, Any])	classnamebasesdict_r   c             C  sV  t | dr| jj}nt}dd |D }tdtd| |fd|i}||_| | |}x2|jD ](}t||t	| ||  t
| |  q\W xP|jD ]F}	t|	tr|	tk	rx.|	jjjD ] }
t||
j|
 |j|
j qW qW t| ddr(| j}|dk	stt |drd	|jkrt| |_n
t| |_td
|j tfd|i}||_|t |j< dS )zVCreate a :class:`._Dispatch` class corresponding to an
        :class:`.Events` class.r    c             S  s   g | ]}t |r|qS r"   )r$   )rC   rL   r"   r"   r#   
<listcomp>%  s    z?_HasEventsDispatch._create_dispatcher_class.<locals>.<listcomp>zType[_Dispatch[_ET]]z
%sDispatchr8   r`   N_slots_dispatchzJoined%s)hasattrr    rQ   r;   r   typer?   rn   rJ   r   r   appendrc   
issubclassr7   rH   r   rK   r`   rF   r8   slots_dispatcher
dispatcherr.   _JoinedDispatcherr@   globals)r,   ro   rp   rq   Zdispatch_baseZevent_namesrm   Zdispatch_instrL   Zsuper_rD   Zdispatch_target_clsrl   r"   r"   r#   rb     sB    




z+_HasEventsDispatch._create_dispatcher_classN)r.   r/   r0   r9   typingTYPE_CHECKINGr6   rd   classmethodrg   rP   staticmethodrn   rb   r"   r"   r"   r#   r_      s   
 r_   c               @  s   e Zd ZU dZdZded< ded< ded< dddd	d
ZddddZdddddZddddddZ	e
ddddZdS )rz   z5Represent a connection between two _Dispatch objects.)localrA   r&   z_DispatchCommon[_ET]r   rA   zOptional[Type[_ET]]r&   )r   rA   c             C  s   || _ || _| j j| _d S )N)r   rA   r&   )r+   r   rA   r"   r"   r#   rI   Z  s    z_JoinedDispatcher.__init__r   )r   c             C  s   | j | j| jffS )N)rQ   r   rA   )r+   r"   r"   r#   rT   a  s    z_JoinedDispatcher.__reduce__r   z_JoinedListener[_ET])r   r   c             C  s.   t | j|}t| j|j|}t| |j| |S )N)rK   r   r   rA   r   rJ   )r+   r   rD   Zjlr"   r"   r#   r6   d  s    z_JoinedDispatcher.__getattr__z_EventKey[_ET]rM   )rN   rO   r   c             K  s   | j j|f|S )N)rA   rP   )r+   rN   rO   r"   r"   r#   rP   l  s    z_JoinedDispatcher._listenzType[_HasEventsDispatch[_ET]]c             C  s   | j jS )N)rA   r7   )r+   r"   r"   r#   r7   o  s    z_JoinedDispatcher._eventsN)r.   r/   r0   r1   r8   r9   rI   rT   r6   rP   r:   r7   r"   r"   r"   r#   rz   Q  s   
rz   c            	   @  st   e Zd ZdZeddddddZeddddd	d
ddddddddZed
ddddZeddddZdS )Eventsz>Define event listening functions for a particular target type.zUnion[_ET, Type[_ET]]r   zOptional[Union[_ET, Type[_ET]]])re   rf   r   c               sh   ddd fdd}ddd fdd}t  d	rd|| jjs`|t| jjs`|trd|| jjrd S d S )
Nz	Type[Any]r   )typesr   c                s   t  fdd| D S )Nc             3  s   | ]}t  j|V  qd S )N)rV   r    )rC   t)re   r"   r#   	<genexpr>|  s    z;Events._accept_with.<locals>.dispatch_is.<locals>.<genexpr>)all)r   )re   r"   r#   dispatch_is{  s    z(Events._accept_with.<locals>.dispatch_is)r   r   c               s   t td jj| S )Nz_JoinedDispatcher[_ET])rV   r   r    rA   )r   )re   r"   r#   dispatch_parent_is~  s    z/Events._accept_with.<locals>.dispatch_parent_isr    )rt   r    rQ   ru   rz   )r,   re   rf   r   r   r"   )re   r#   rg   w  s    
zEvents._accept_withF)rh   ri   rj   rk   z_EventKey[_ET]r   rM   )rN   rh   ri   rj   rk   r   c            C  s   |j ||||d d S )N)rh   ri   rj   rk   )Zbase_listen)r,   rN   rh   ri   rj   rk   r"   r"   r#   rP     s    
zEvents._listen)rN   r   c             C  s   |   d S )N)r]   )r,   rN   r"   r"   r#   _remove  s    zEvents._remove)r   c             C  s   | j   d S )N)r    rZ   )r,   r"   r"   r#   rZ     s    zEvents._clearN)	r.   r/   r0   r1   r~   rg   rP   r   rZ   r"   r"   r"   r#   r   t  s    r   c               @  s\   e Zd ZdZddddZedddd	d
dZedddd	ddZdddd	ddZdS )ry   zDescriptor used by target classes to
    deliver the _Dispatch class at the class level
    and produce new _Dispatch instances for target
    instances.

    zType[_HasEventsDispatch[_ET]])eventsc             C  s   |j | _ || _d S )N)r    r   )r+   r   r"   r"   r#   rI     s    zdispatcher.__init__zLiteral[None]z	Type[Any]zType[_Dispatch[_ET]])objr,   r   c             C  s   d S )Nr"   )r+   r   r,   r"   r"   r#   __get__  s    zdispatcher.__get__r   z_DispatchCommon[_ET]c             C  s   d S )Nr"   )r+   r   r,   r"   r"   r#   r     s    c          
   C  s`   |d kr| j S | j |}y||jd< W n2 tk
rZ } ztd|f |W d d }~X Y nX |S )Nr    zGtarget %r doesn't have __dict__, should it be defining _slots_dispatch?)r    rS   r(   r*   	TypeError)r+   r   r,   dispZaer"   r"   r#   r     s    N)r.   r/   r0   r1   rI   r   r   r"   r"   r"   r#   ry     s
   ry   c               @  s   e Zd ZddddddZdS )rx   r   z	Type[Any])r   r,   r   c             C  s4   |d kr| j S t|dr|jS | j |}||_|S )Nrs   )r    rt   rs   rS   )r+   r   r,   r   r"   r"   r#   r     s    
zslots_dispatcher.__get__N)r.   r/   r0   r   r"   r"   r"   r#   rx     s   rx   ),r1   
__future__r   r|   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r[   attrr   r   r   r   registryr   r    r   Zutil.typingr   defaultdictlistr   r9   r$   r%   r2   r;   r^   r_   rz   r   ry   rx   r"   r"   r"   r#   <module>   sF   
~p#5#