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]]Úreturnú2Callable[[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   © úS/var/www/html/flaskapp/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 )Néÿÿÿÿz**kwTr   Fzdef %s(%s%s)ú, ú, **kwÚ zÁThe 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
   € ÿ
ÿzôfrom 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

)
