o
    g#                      @  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 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jrWd
dlmZ d
dlmZ eeee eedef  f Z	d5d6ddZd7d#d$Zd8d'd(Zd9d+d,Zd:d-d.Zd;d1d2Zd<d3d4ZdS )=zhRoutines to handle adaption of legacy call signatures,
generation of deprecation notes and docstrings.

    )annotationsN)Any)Callable)List)Optional)Tuple)Type   )_ET)_ListenerFnType   )util)FullArgSpec)_ClsLevelDispatch)_HasEventsDispatch.sincestrargnames	List[str]	converterOptional[Callable[..., Any]]return2Callable[[Callable[..., Any]], Callable[..., Any]]c                   s   d fdd}|S )a_  legacy sig decorator


    :param since: string version for deprecation warning
    :param argnames: list of strings, which is *all* arguments that the legacy
     version accepted, including arguments that are still there
    :param converter: lambda that will accept tuple of this full arg signature
     and return tuple of new arg signature.

    fnCallable[..., Any]r   c                   s&   t | dsg | _| j f | S )N_legacy_signatures)hasattrr   append)r   r   r   r    Y/var/www/html/ecg_monitoring/venv/lib/python3.10/site-packages/sqlalchemy/event/legacy.pyleg3   s   
z_legacy_signature.<locals>.legN)r   r   r   r   r   )r   r   r   r!   r   r   r    _legacy_signature#   s   r"   dispatch_collection_ClsLevelDispatch[_ET]r   r   argspecr   c                   s   j D ]f\  d dkrd dd  ndt t|jkrit|ju ridjdjr5dnd	f }d
jj|f d urYrKJ dfdd}|  S d fdd}|  S qS )Nz**kwTr   Fzdef %s(%s%s), , **kw zThe argument signature for the "%s.%s" event listener has changed as of version %s, and conversion for the old argument signature will be removed in a future release.  The new signature is "%s"argsr   kwr   c                    s&   t jd  d usJ  |   S )Nversion)r   warn_deprecated)r*   r+   )convr   r   warning_txtr   r    wrap_leg`   s   z%_wrap_fn_for_legacy.<locals>.wrap_legc                    sJ   t jd ttj|   fddD }r!|i |S | S )Nr,   c                   s   g | ]} | qS r   r   ).0nameargdictr   r    
<listcomp>j   s    z9_wrap_fn_for_legacy.<locals>.wrap_leg.<locals>.<listcomp>)r   r.   dictzip	arg_names)r*   r+   args_from_dict)r   r#   r   has_kwr   r0   r4   r    r1   g   s   )r*   r   r+   r   r   r   )	legacy_signatureslenr*   boolvarkwr3   joinr9   clsname)r#   r   r%   formatted_defr1   r   )r   r/   r#   r   r;   r   r0   r    _wrap_fn_for_legacy<   s:   

	rC   textindentc                   s   d  fdd| dD S )N
c                 3  s    | ]} | V  qd S Nr   )r2   linerE   r   r    	<genexpr>v   s    z_indent.<locals>.<genexpr>)r@   split)rD   rE   r   rI   r    _indentu   s   rL   sample_targetr   c                 C  s   t ddd | jdd D d}| jr tdd | jD }nd }d}||r+d	| nd
|j| jr3dnd
d| j||d; }|S )NrF   c                 s  s    | ]	}d d|i V  qdS )z%(arg)s = kw['%(arg)s']argNr   )r2   rN   r   r   r    rJ      s
    

z+_standard_listen_example.<locals>.<genexpr>r   r   z    c                 s  s    | ]\}}}|V  qd S rG   r   )r2   r   r*   r/   r   r   r    rJ      s
    
zfrom sqlalchemy import event


@event.listens_for(%(sample_target)s, '%(event_name)s')
def receive_%(event_name)s(%(named_event_arguments)s%(has_kw_arguments)s):
    "listen for the '%(event_name)s' event"

    # ... (event handling logic) ...
z (arguments as of %s)r)   r(   r'   )current_since
event_namehas_kw_argumentsnamed_event_argumentsexample_kw_argrM   )rL   r@   r9   r<   max__name__r;   )r#   rM   r   rS   rO   rD   r   r   r    _standard_listen_exampley   s,   

	

rV   c              	   C  sD   d}| j D ]\}}}|d||j| jrdndd||d 7 }q|S )Nr)   a&  
# DEPRECATED calling style (pre-%(since)s, will be removed in a future release)
@event.listens_for(%(sample_target)s, '%(event_name)s')
def receive_%(event_name)s(%(named_event_arguments)s%(has_kw_arguments)s):
    "listen for the '%(event_name)s' event"

    # ... (event handling logic) ...
z **kwr'   )r   rP   rQ   rR   rM   )r<   rU   r;   r@   )r#   rM   r   rD   r   r*   r/   r   r   r    _legacy_listen_examples   s   rW   parent_dispatch_clsType[_HasEventsDispatch[_ET]]c              	     sP    j d \}}}d|j jd fdd jD  jr#dd S dd S )	Nr   a=  
.. versionchanged:: %(since)s
    The :meth:`.%(clsname)s.%(event_name)s` event now accepts the 
    arguments %(named_event_arguments)s%(has_kw_arguments)s.
    Support for listener functions which accept the previous 
    argument signature(s) listed above as "deprecated" will be 
    removed in a future release.r'   c                 3  s$    | ]}d j  j|d V  qdS )z6:paramref:`.%(clsname)s.%(event_name)s.%(param_name)s`)rA   rP   
param_nameN)rU   r3   )r2   rZ   r#   rX   r   r    rJ      s    
z-_version_signature_changes.<locals>.<genexpr>r(   r)   )r   rA   rP   rR   rQ   )r<   rU   r3   r@   r9   r;   )rX   r#   r   r*   r/   r   r[   r    _version_signature_changes   s    	r\   c                 C  s`   d}t |dd}|tt| ||d }| jr(|tt| ||d7 }|t|| 7 }t|j|dS )Nz@.. container:: event_signatures

     Example argument forms::

_target_class_docobjz        r	   )	getattrrL   rV   r<   rW   r\   r   inject_docstring_text__doc__)r#   rX   r   headerrM   rD   r   r   r    _augment_fn_docs   s    

rc   rG   )r   r   r   r   r   r   r   r   )r#   r$   r   r   r%   r   r   r   )rD   r   rE   r   r   r   )r#   r$   rM   r   r   r   r   r   )r#   r$   rM   r   r   r   r   r   )rX   rY   r#   r$   r   r   )r#   r$   rX   rY   r   r   r   r   )ra   
__future__r   typingr   r   r   r   r   r   registryr
   r   r)   r   util.compatr   TYPE_CHECKINGattrr   baser   r   _LegacySignatureTyper"   rC   rL   rV   rW   r\   rc   r   r   r   r    <module>   s2   

9

)
