o
    i	!                     @  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 ddlmZ ejr]ddlmZ ddlmZ e
dedef dZeeee edef f Z	d:d;ddZd<d!d"Zd=d(d)Zd>d,d-Zd?d0d1Zd@d2d3ZdAd6d7Z dBd8d9Z!dS )CzhRoutines to handle adaption of legacy call signatures,
generation of deprecation notes and docstrings.

    )annotationsN)Any)Callable)List)Optional)Tuple)Type)TypeVar   )_ET)_ListenerFnType   )util)FullArgSpec)_ClsLevelDispatch)_HasEventsDispatch_F.)boundsincestrargnames	List[str]	converterOptional[Callable[..., Any]]returnCallable[[_F], _F]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.

    fnr   r   c                   s&   t | dsg | _| j f | S )N_legacy_signatures)hasattrr   appendr   r   r   r    ]/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/sqlalchemy/event/legacy.pyleg6   s   
z_legacy_signature.<locals>.legNr   r   r   r   r"   )r   r   r   r$   r"   r!   r#   _legacy_signature&   s   r&   r   c                 C  s
   d| _ | S )NT)_omit_standard_exampler    r"   r"   r#   r'   ?   s   r'   dispatch_collection_ClsLevelDispatch[_ET]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/   r0   )convr   r   warning_txtr"   r#   wrap_legh   s   z%_wrap_fn_for_legacy.<locals>.wrap_legc                    sJ   t jd ttj|   fddD }r!|i |S | S )Nr1   c                   s   g | ]} | qS r"   r"   ).0nameargdictr"   r#   
<listcomp>r   s    z9_wrap_fn_for_legacy.<locals>.wrap_leg.<locals>.<listcomp>)r   r3   dictzip	arg_names)r/   r0   args_from_dict)r   r(   r   has_kwr   r5   r9   r#   r6   o   s   )r/   r   r0   r   r   r   )	legacy_signatureslenr/   boolvarkwr8   joinr>   clsname)r(   r   r*   formatted_defr6   r"   )r   r4   r(   r   r@   r   r5   r#   _wrap_fn_for_legacyD   s:   

	rH   textindentc                   s   d  fdd| dD S )N
c                 3  s    | ]} | V  qd S Nr"   )r7   linerJ   r"   r#   	<genexpr>~   s    z_indent.<locals>.<genexpr>)rE   split)rI   rJ   r"   rN   r#   _indent}   s   rQ   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 )NrK   c                 s  s    | ]	}d d|i V  qdS )z%(arg)s = kw['%(arg)s']argNr"   )r7   rS   r"   r"   r#   rO      s
    

z+_standard_listen_example.<locals>.<genexpr>r   r   z    c                 s  s    | ]\}}}|V  qd S rL   r"   )r7   r   r/   r4   r"   r"   r#   rO      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_argrR   )rQ   rE   r>   rA   max__name__r@   )r(   rR   r   rX   rT   rI   r"   r"   r#   _standard_listen_example   s,   

	

r[   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   rU   rV   rW   rR   )rA   rZ   r@   rE   )r(   rR   r   rI   r   r/   r4   r"   r"   r#   _legacy_listen_examples   s   r\   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`)rF   rU   
param_nameN)rZ   r8   )r7   r_   r(   r]   r"   r#   rO      s    
z-_version_signature_changes.<locals>.<genexpr>r-   r.   )r   rF   rU   rW   rV   )rA   rZ   r8   rE   r>   r@   )r]   r(   r   r/   r4   r"   r`   r#   _version_signature_changes   s    	ra   c                 C  s|   t |ddr|jsJ |jS d}t |dd}|tt| ||d }| jr6|tt| ||d7 }|t|| 7 }t|j|dS )Nr'   Fz@.. container:: event_signatures

     Example argument forms::

_target_class_docobjz        r
   )	getattr__doc__rQ   r[   rA   r\   ra   r   inject_docstring_text)r(   r]   r   headerrR   rI   r"   r"   r#   _augment_fn_docs   s&   


rh   rL   )r   r   r   r   r   r   r   r   r%   )r(   r)   r   r   r*   r   r   r   )rI   r   rJ   r   r   r   )r(   r)   rR   r   r   r   r   r   )r(   r)   rR   r   r   r   r   r   )r]   r^   r(   r)   r   r   )r(   r)   r]   r^   r   r   r   r   )"re   
__future__r   typingr   r   r   r   r   r   r	   registryr   r   r.   r   util.compatr   TYPE_CHECKINGattrr   baser   r   r   _LegacySignatureTyper&   r'   rH   rQ   r[   r\   ra   rh   r"   r"   r"   r#   <module>   s8   


9

)
