o
    )fj:                     @  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#   R/var/www/html/flask-app/venv/lib/python3.12/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   r@   r   rC   )	r1   r2   r3   	__slots____annotations__r>   rB   propertyrE   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]]rN   z	List[str]_event_namesr6   r'   zType[_JoinedDispatcher[_ET]]_joined_dispatch_clsrC   rE   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rU   r#   r$   
<dictcomp>   s    z&_Dispatch.__init__.<locals>.<dictcomp>)rM   r'   rP   rN   KeyError_event_descriptors)r.   rS   rU   r#   rX   r$   __init__   s   


z_Dispatch.__init__r   r   r   r@   c                 C  s8   z| j | }W n ty   t|w t| |j| |S r;   )rN   rZ   r-   setattrr   )r.   r   rW   r#   r#   r$   rB      s   z_Dispatch.__getattr__ Iterator[_ClsLevelDispatch[_ET]]c                 c  s    | j D ]}t| |V  qd S r;   )rQ   getattr)r.   kr#   r#   r$   r[      s   
z_Dispatch._event_descriptors	event_key_EventKey[_ET]kwr   Nonec                 K     | j j|fi |S r;   )rE   _listenr.   ra   rc   r#   r#   r$   rf         z_Dispatch._listenr(   r)   c                 C  s   |  | |S r;   )	__class__)r.   rU   r#   r#   r$   r,      s   z_Dispatch._for_classinstancer   c                 C  s   |j }| |S r;   )ri   r,   )r.   rj   rU   r#   r#   r$   _for_instance   s   
z_Dispatch._for_instancer7   r8   r9   c                 C  s<   d| j jvrtd| j j tfd| ji}|| j _| | |S )zCreate a 'join' of this :class:`._Dispatch` and another.

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

        rR   zJoined%srI   )ri   r+   typer1   _JoinedDispatcherrQ   rR   )r.   r7   r/   r#   r#   r$   r>      s   
z_Dispatch._joinUnion[str, Tuple[Any, ...]]c                 C  s   t  | jffS r;   )r&   r'   rD   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.)rp   N)r[   
isinstancer   r_   r   
for_modify_update)r.   r7   rp   rW   r#   r#   r$   rs      s   

z_Dispatch._updatec                 C  s   | j D ]	}||   qd S r;   )r[   rr   clear)r.   rW   r#   r#   r$   _clear   s   
z_Dispatch._clearr;   )rS   rT   rU   r6   rG   )r   r^   ra   rb   rc   r   r   rd   )rU   r(   r   r)   )rj   r   r   r)   rF   )r   rn   )T)r7   r)   rp   r   r   rd   r   rd   )r1   r2   r3   r4   rI   rJ   weakrefWeakKeyDictionaryrP   r\   rB   rK   r[   rf   r,   rk   r>   ro   rs   ru   r#   r#   r#   r$   rL   \   s2   
 
	





rL   r/   rC   rd   c                 C  s.   | j jD ]}t| |  t| st|= qd S r;   )r    rQ   r   remove)r/   r`   r#   r#   r$   _remove_dispatcher   s   r{   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   r@   c                 C     d S r;   r#   rA   r#   r#   r$   rB      s    z_HasEventsDispatch.__getattr__rd   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asynciora   rb   r   r   r   r   r   c                C  r:   r;   r<   r/   ra   r   r   r   r   r#   r#   r$   rf     s   
z_HasEventsDispatch._listenklassrC   dispatch_clsType[_Dispatch[_ET]]c                 C  s   |d | _ | |_| j S r;   )r    rE   )r   r   r#   r#   r$   _set_dispatch  s   

z _HasEventsDispatch._set_dispatch	classnamebasesTuple[type, ...]dict_Mapping[str, Any]c                 C  s   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| |_dS t| |_dS dS )
zVCreate a :class:`._Dispatch` class corresponding to an
        :class:`.Events` class.r    c                 S  s   g | ]}t |r|qS r#   )r%   )rV   r`   r#   r#   r$   
<listcomp>*  s    z?_HasEventsDispatch._create_dispatcher_class.<locals>.<listcomp>r   z
%sDispatchrI   r}   N_slots_dispatch)hasattrr    ri   rL   r   rl   rQ   r   r]   r   r   appendr   
issubclassrE   r[   r   r_   r}   rI   slots_dispatcher
dispatcher)r/   r   r   r   dispatch_baseevent_namesr   dispatch_instr`   super_rW   dispatch_target_clsr#   r#   r$   r     s@   


	


z+_HasEventsDispatch._create_dispatcher_classNrG   rw   r   r   r   r   r   r   ra   rb   r   r   r   r   r   r   r   r   r   rd   )r   rC   r   r   r   r)   )r   r   r   r   r   r   r   rd   )r1   r2   r3   rJ   typingTYPE_CHECKINGrB   r   classmethodr   rf   staticmethodr   r   r#   r#   r#   r$   r|      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;   )rq   r    )rV   tr   r#   r$   	<genexpr>T  s    z;Events._accept_with.<locals>.dispatch_is.<locals>.<genexpr>)all)r   r   r#   r$   dispatch_isS  s   z(Events._accept_with.<locals>.dispatch_isr   c                   s   t td jj| S )Nr9   )rq   r   r    rS   )r   r   r#   r$   dispatch_parent_isV  s   z/Events._accept_with.<locals>.dispatch_parent_isr    )r   r   r   r   )r   r   r   r   )r   r    ri   rl   rm   )r/   r   r   r   r   r#   r   r$   r   O  s   


zEvents._accept_withFr   ra   rb   r   r   r   r   r   rd   c                C  s   |j ||||d d S )Nr   )base_listenr   r#   r#   r$   rf   j  s   

zEvents._listenc                 C  s   |   d S r;   )rz   )r/   ra   r#   r#   r$   _removex  s   zEvents._removec                 C  s   | j   d S r;   )r    ru   r   r#   r#   r$   ru   |  s   zEvents._clearNr   r   )ra   rb   r   rd   rw   )	r1   r2   r3   r4   r   r   rf   r   ru   r#   r#   r#   r$   r   L  s    r   c                   @  sZ   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e	dddZ
dS )rm   z5Represent a connection between two _Dispatch objects.localrS   r'   r8   r   rS   r6   r'   c                 C  s   || _ || _| j j| _d S r;   r   )r.   r   rS   r#   r#   r$   r\     s   z_JoinedDispatcher.__init__r   r   r   _JoinedListener[_ET]c                 C  s.   t | j|}t| j|j|}t| |j| |S r;   )r_   r   r   rS   r   r]   )r.   r   rW   jlr#   r#   r$   rB     s   z_JoinedDispatcher.__getattr__ra   rb   rc   r   rd   c                 K  re   r;   )rS   rf   rg   r#   r#   r$   rf     rh   z_JoinedDispatcher._listenrC   c                 C  s   | j jS r;   )rS   rE   rD   r#   r#   r$   rE     s   z_JoinedDispatcher._eventsN)r   r8   rS   r8   )r   r   r   r   rv   rH   )r1   r2   r3   r4   rI   rJ   r\   rB   rf   rK   rE   r#   r#   r#   r$   rm     s   
 


rm   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.

    eventsrC   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    rk   r+   r-   	TypeError)r.   r   r/   dispaer#   r#   r$   r     s    N)r   rC   )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   rk   )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/   rC   r   rd   ),r4   
__future__r   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   rx   attrr   r   r   r   registryr   r    r   util.typingr   defaultdictlistr   rJ   r%   r&   r5   rL   r{   r|   r   rm   r   r   r#   r#   r#   r$   <module>   sL   



 
f5 #