o
    g;                     @  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< d8d!d"Z"G d#d$ d$Z#G d%d& d&ee Z$G d'd( d(e$e Z%d9d,d-Z&G d.d/ d/ee Z'G d0d1 d1e$e Z(G d2d3 d3e'e Z)G d4d5 d5ee Z*G d6d7 d7e*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``.

    )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namestrreturnboolc                 C  s   |  d o	| dkp|  dS )N_dispatch	_sa_event)
startswith)r    r#   W/var/www/html/ecg_monitoring/venv/lib/python3.10/site-packages/sqlalchemy/event/base.py_is_event_name2   s   r%   c                   @  s   e Zd ZdZd	ddZdS )
_UnpickleDispatchzSerializable callable that re-generates an instance of
    :class:`_Dispatch` given a particular :class:`.Events` subclass.

    _instance_cls	Type[_ET]r   _Dispatch[_ET]c                 C  s:   |j D ]}d|jv rtd|jd j|  S qtd)Nr    r)   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)r'   r(   r   r)   )__name__
__module____qualname____doc__r0   r#   r#   r#   r$   r&   <   s    r&   c                   @  s<   e Zd ZU dZded< ddd	ZdddZedddZdS )_DispatchCommonr#   Optional[Type[_ET]]r'   other_DispatchCommon[_ET]r   _JoinedDispatcher[_ET]c                 C     t  NNotImplementedErrorr.   r7   r#   r#   r$   _joinQ      z_DispatchCommon._joinr   r   _InstanceLevelDispatch[_ET]c                 C  r:   r;   r<   r.   r   r#   r#   r$   __getattr__T   r@   z_DispatchCommon.__getattr__Type[_HasEventsDispatch[_ET]]c                 C  r:   r;   r<   r.   r#   r#   r$   _eventsW   s   z_DispatchCommon._eventsNr7   r8   r   r9   r   r   r   rA   r   rD   )	r1   r2   r3   	__slots____annotations__r?   rC   propertyrF   r#   r#   r#   r$   r5   L   s   
 

r5   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Z	d?ddZ
ed@ddZdAd%d&ZdBd)d*ZdCd-d.ZdDd2d3ZdEd5d6Z	7dFdGd9d:ZdHd;d<ZdS )I	_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   _active_historyz9MutableMapping[Type[_ET], Dict[str, _EmptyListener[_ET]]]_empty_listener_regzDict[str, _EmptyListener[_ET]]rO   z	List[str]_event_namesr6   r'   zType[_JoinedDispatcher[_ET]]_joined_dispatch_clsrD   rF   NparentOptional[_Dispatch[_ET]]instance_clsc                   sn   || _  | _ r2|d usJ z	| j  | _W d S  ty1    fdd|jD  | _| j < Y d S w i | _d S )Nc                   s   i | ]	}|j t| qS r#   )r   r   ).0lsrV   r#   r$   
<dictcomp>   s    z&_Dispatch.__init__.<locals>.<dictcomp>)rN   r'   rQ   rO   KeyError_event_descriptors)r.   rT   rV   r#   rY   r$   __init__   s   


z_Dispatch.__init__r   r   r   rA   c                 C  s8   z| j | }W n ty   t|w t| |j| |S r;   )rO   r[   r-   setattrr   )r.   r   rX   r#   r#   r$   rC      s   z_Dispatch.__getattr__ Iterator[_ClsLevelDispatch[_ET]]c                 c  s    | j D ]}t| |V  qd S r;   )rR   getattr)r.   kr#   r#   r$   r\      s   
z_Dispatch._event_descriptors	event_key_EventKey[_ET]kwr   Nonec                 K     | j j|fi |S r;   )rF   _listenr.   rb   rd   r#   r#   r$   rg         z_Dispatch._listenr(   r)   c                 C  s   |  | |S r;   )	__class__)r.   rV   r#   r#   r$   r,      s   z_Dispatch._for_classinstancer   c                 C  s   |j }| |S r;   )rj   r,   )r.   rk   rV   r#   r#   r$   _for_instance   s   
z_Dispatch._for_instancer7   r8   r9   c                 C  s   d| j jv sJ | | |S )zCreate a 'join' of this :class:`._Dispatch` and another.

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

        rS   )rj   r+   rS   r>   r#   r#   r$   r?      s   z_Dispatch._joinUnion[str, Tuple[Any, ...]]c                 C  s   t  | jffS r;   )r&   r'   rE   r#   r#   r$   
__reduce__   s   z_Dispatch.__reduce__Tonly_propagatec                 C  s8   |j D ]}t|trqt| |j| j||d qdS )zIPopulate from the listeners in another :class:`_Dispatch`
        object.)ro   N)r\   
isinstancer   r`   r   
for_modify_update)r.   r7   ro   rX   r#   r#   r$   rr      s   

z_Dispatch._updatec                 C  s   | j D ]	}||   qd S r;   )r\   rq   clear)r.   rX   r#   r#   r$   _clear   s   
z_Dispatch._clearr;   )rT   rU   rV   r6   rH   )r   r_   rb   rc   rd   r   r   re   )rV   r(   r   r)   )rk   r   r   r)   rG   )r   rm   )T)r7   r)   ro   r   r   re   r   re   )r1   r2   r3   r4   rJ   rK   weakrefWeakKeyDictionaryrQ   r]   rC   rL   r\   rg   r,   rl   r?   rn   rr   rt   r#   r#   r#   r$   rM   \   s2   
 
	





rM   r/   rD   re   c                 C  s.   | j jD ]}t| |  t| st|= qd S r;   )r    rR   r   remove)r/   ra   r#   r#   r$   _remove_dispatcher   s   rz   c                   @  s   e Zd ZU ded< 	 ded< 	 ejrd-d	d
Zd.ddZed/ddZ	edddddd0ddZ
ed1d#d$Zed2d*d+Zd,S )3_HasEventsDispatchr6   _dispatch_targetr)   r    r   r   r   rA   c                 C     d S r;   r#   rB   r#   r#   r$   rC      s    z_HasEventsDispatch.__getattr__re   c                 C  s   |  | j| j| j dS )zOIntercept new Event subclasses and create associated _Dispatch
        classes.N)_create_dispatcher_classr1   	__bases__r+   r/   r#   r#   r$   __init_subclass__   s   z$_HasEventsDispatch.__init_subclass__targetUnion[_ET, Type[_ET]]
identifierOptional[Union[_ET, Type[_ET]]]c                 C  r:   r;   r<   )r/   r   r   r#   r#   r$   _accept_with   s   z_HasEventsDispatch._accept_withF	propagateinsertnamedasynciorb   rc   r   r   r   r   r   c                C  r:   r;   r<   r/   rb   r   r   r   r   r#   r#   r$   rg      s   
z_HasEventsDispatch._listenklassrD   dispatch_clsType[_Dispatch[_ET]]c                 C  s   |d | _ | |_| j S r;   )r    rF   )r   r   r#   r#   r$   _set_dispatch  s   

z _HasEventsDispatch._set_dispatch	classnamebasesTuple[type, ...]dict_Mapping[str, Any]c                 C  sD  t | dr
| jj}nt}dd |D }tdtd| |fd|i}||_| | |}|jD ]}t||t	| ||  t
| |  q-|jD ]!}	t|	trf|	turf|	jjjD ]}
t||
j|
 |j|
j qUqEt| ddr| j}|dusvJ t |drd	|jv rt| |_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%   )rW   ra   r#   r#   r$   
<listcomp>%  s    z?_HasEventsDispatch._create_dispatcher_class.<locals>.<listcomp>r   z
%sDispatchrJ   r|   N_slots_dispatchzJoined%s)hasattrr    rj   rM   r   typerR   r   r^   r   r   appendr   
issubclassrF   r\   r   r`   r|   rJ   slots_dispatcher
dispatcherr1   _JoinedDispatcherrS   globals)r/   r   r   r   dispatch_baseevent_namesr   dispatch_instra   super_rX   dispatch_target_clsr   r#   r#   r$   r~     sL   


	



z+_HasEventsDispatch._create_dispatcher_classNrH   rv   r   r   r   r   r   r   rb   rc   r   r   r   r   r   r   r   r   r   re   )r   rD   r   r   r   r)   )r   r   r   r   r   r   r   re   )r1   r2   r3   rK   typingTYPE_CHECKINGrC   r   classmethodr   rg   staticmethodr   r~   r#   r#   r#   r$   r{      s(   
 

r{   c                   @  sd   e Zd ZU dZdZded< ded< ded< ddd	ZdddZdddZd ddZ	e
d!ddZdS )"r   z5Represent a connection between two _Dispatch objects.localrT   r'   r8   r   rT   r6   r'   c                 C  s   || _ || _| j j| _d S r;   r   )r.   r   rT   r#   r#   r$   r]   Z  s   z_JoinedDispatcher.__init__r   r   c                 C  s   | j | j| jffS r;   )rj   r   rT   rE   r#   r#   r$   rn   a  s   z_JoinedDispatcher.__reduce__r   r   _JoinedListener[_ET]c                 C  s.   t | j|}t| j|j|}t| |j| |S r;   )r`   r   r   rT   r   r^   )r.   r   rX   jlr#   r#   r$   rC   d  s   z_JoinedDispatcher.__getattr__rb   rc   rd   re   c                 K  rf   r;   )rT   rg   rh   r#   r#   r$   rg   l  ri   z_JoinedDispatcher._listenrD   c                 C  s   | j jS r;   )rT   rF   rE   r#   r#   r$   rF   o  s   z_JoinedDispatcher._eventsN)r   r8   rT   r8   )r   r   )r   r   r   r   ru   rI   )r1   r2   r3   r4   rJ   rK   r]   rn   rC   rg   rL   rF   r#   r#   r#   r$   r   Q  s   
 



r   c                   @  sT   e Zd ZdZeddd	Zed
d
d
d
ddddZedddZedddZdS )Eventsz>Define event listening functions for a particular target type.r   r   r   r   r   r   c                   s\   d fdd}d fdd	}t  d
r,|| jjs*|t| jjs*|tr,|| jjr, S d S )Ntypes	Type[Any]r   r   c                    s   t  fdd| D S )Nc                 3  s    | ]	}t  j|V  qd S r;   )rp   r    )rW   tr   r#   r$   	<genexpr>|  s    z;Events._accept_with.<locals>.dispatch_is.<locals>.<genexpr>)all)r   r   r#   r$   dispatch_is{  s   z(Events._accept_with.<locals>.dispatch_isr   c                   s   t td jj| S )Nr9   )rp   r   r    rT   )r   r   r#   r$   dispatch_parent_is~  s   z/Events._accept_with.<locals>.dispatch_parent_isr    )r   r   r   r   )r   r   r   r   )r   r    rj   r   r   )r/   r   r   r   r   r#   r   r$   r   w  s   


zEvents._accept_withFr   rb   rc   r   r   r   r   r   re   c                C  s   |j ||||d d S )Nr   )base_listenr   r#   r#   r$   rg     s   

zEvents._listenc                 C  s   |   d S r;   )ry   )r/   rb   r#   r#   r$   _remove  s   zEvents._removec                 C  s   | j   d S r;   )r    rt   r   r#   r#   r$   rt     s   zEvents._clearNr   r   )rb   rc   r   re   rv   )	r1   r2   r3   r4   r   r   rg   r   rt   r#   r#   r#   r$   r   t  s    r   c                   @  s@   e Zd ZdZdddZedddZedddZdddZdS )r   zDescriptor used by target classes to
    deliver the _Dispatch class at the class level
    and produce new _Dispatch instances for target
    instances.

    eventsrD   c                 C  s   |j | _ || _d S r;   )r    r   )r.   r   r#   r#   r$   r]     s   
zdispatcher.__init__objLiteral[None]r/   r   r   r   c                 C  r}   r;   r#   r.   r   r/   r#   r#   r$   __get__  s   zdispatcher.__get__r   r8   c                 C  r}   r;   r#   r   r#   r#   r$   r     s   c              
   C  sT   |d u r| j S | j |}z||jd< W |S  ty) } ztd|f |d }~ww )Nr    zGtarget %r doesn't have __dict__, should it be defining _slots_dispatch?)r    rl   r+   r-   	TypeError)r.   r   r/   dispaer#   r#   r$   r     s    N)r   rD   )r   r   r/   r   r   r   )r   r   r/   r   r   r8   r   r   r/   r   r   r   )r1   r2   r3   r4   r]   r   r   r#   r#   r#   r$   r     s    
r   c                   @  s   e Zd Zd	ddZdS )
r   r   r   r/   r   r   c                 C  s4   |d u r| j S t|dr|jS | j |}||_|S )Nr   )r    r   r   rl   )r.   r   r/   r   r#   r#   r$   r     s   
zslots_dispatcher.__get__Nr   )r1   r2   r3   r   r#   r#   r#   r$   r     s    r   )r   r   r   r   )r/   rD   r   re   ),r4   
__future__r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   rw   attrr   r   r   r   registryr   r    r   util.typingr   defaultdictlistr   rK   r%   r&   r5   rM   rz   r{   r   r   r   r   r#   r#   r#   r$   <module>   sJ   




~p#5#