B
    þ¦†\  ã               @   sN   d Z ddlmZ ddd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Z	dS )zhRoutines to handle adaption of legacy call signatures,
generation of deprecation notes and docstrings.

é   )ÚutilNc                s   ‡ ‡‡fdd„}|S )Nc                s&   t | dƒsg | _| j ˆˆ ˆf¡ | S )NÚ_legacy_signatures)Úhasattrr   Úappend)Úfn)ÚargnamesÚ	converterÚsince© ú6lib/python3.7/site-packages/sqlalchemy/event/legacy.pyÚleg   s    
z_legacy_signature.<locals>.legr
   )r	   r   r   r   r
   )r   r   r	   r   Ú_legacy_signature   s    r   c                s’   xŒˆj D ]~\}‰ ‰ˆ d dkr0d‰ˆ dd… ‰ nd‰tˆ ƒt|jƒkrˆt|jƒkrˆrpˆr`t‚‡‡fdd„}n‡ ‡‡‡fdd„}|S qW ˆS d S )	Néÿÿÿÿz**kwTé    Fc                 s   ˆˆ | Ž Ž S )Nr
   )Úargs)Úconvr   r
   r   Úwrap_leg)   s    z%_wrap_fn_for_legacy.<locals>.wrap_legc                 s<   t tˆj| ƒƒ‰ ‡ fdd„ˆD ƒ} ˆr0ˆ| |ŽS ˆ| Ž S d S )Nc                s   g | ]}ˆ | ‘qS r
   r
   )Ú.0Úname)Úargdictr
   r   ú
<listcomp>0   s    z9_wrap_fn_for_legacy.<locals>.wrap_leg.<locals>.<listcomp>)ÚdictÚzipÚ	arg_names)r   Úkw)r   Údispatch_collectionr   Úhas_kw)r   r   r   .   s
    
)Úlegacy_signaturesÚlenr   ÚboolZvarkwÚAssertionError)r   r   Zargspecr	   r   r
   )r   r   r   r   r   r   Ú_wrap_fn_for_legacy   s    
r!   c                s   d  ‡ fdd„|  d¡D ƒ¡S )NÚ
c             3   s   | ]}ˆ | V  qd S )Nr
   )r   Úline)Úindentr
   r   ú	<genexpr><   s    z_indent.<locals>.<genexpr>)ÚjoinÚsplit)Útextr$   r
   )r$   r   Ú_indent;   s    r)   c             C   s˜   t d dd„ | jdd… D ƒ¡dƒ}| jr@tdd„ | jD ƒƒ}nd }d}t| jƒd	kr^|d
7 }||rld| nd|j| jr|dndd | j¡||dœ; }|S )Nr"   c             s   s   | ]}d d|i V  qdS )z%(arg)s = kw['%(arg)s']ÚargNr
   )r   r*   r
   r
   r   r%   B   s   z+_standard_listen_example.<locals>.<genexpr>r   r   z    c             s   s   | ]\}}}|V  qd S )Nr
   )r   r	   r   r   r
   r
   r   r%   I   s   a  from sqlalchemy import event

# standard decorator style%(current_since)s
@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ð
# named argument style (new in 0.9)
@event.listens_for(%(sample_target)s, '%(event_name)s', named=True)
def receive_%(event_name)s(**kw):
    "listen for the '%(event_name)s' event"
%(example_kw_arg)s

    # ... (event handling logic) ...
z (arguments as of %s)Ú z, **kwz, )Úcurrent_sinceÚ
event_nameÚhas_kw_argumentsÚnamed_event_argumentsÚexample_kw_argÚsample_target)r)   r&   r   r   Úmaxr   Ú__name__r   )r   r2   r   r1   r-   r(   r
   r
   r   Ú_standard_listen_example?   s.    		

r5   c          	   C   sH   d}x>| j D ]4\}}}|d||j| jr*dndd |¡|dœ 7 }qW |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 **kwz, )r	   r.   r/   r0   r2   )r   r4   r   r&   )r   r2   r   r(   r	   r   r   r
   r
   r   Ú_legacy_listen_examplesp   s    
r6   c             C   s:   |j d \}}}d|| j|jd |j¡|jr0dnddœ S )Nr   a>  
.. deprecated:: %(since)s
    The :class:`.%(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.z, z, **kwr,   )r	   Zclsnamer.   r0   r/   )r   r4   r   r&   r   r   )Úparent_dispatch_clsr   r	   r   r   r
   r
   r   Ú_version_signature_changesˆ   s    
r8   c             C   s`   d}t |ddƒ}|tt| ||ƒdƒ }| jrP|tt| ||ƒdƒ7 }|t|| ƒ7 }t |j|d¡S )Nz@.. container:: event_signatures

     Example argument forms::

Z_target_class_docÚobjz        é   )	Úgetattrr)   r5   r   r6   r8   r   Zinject_docstring_textÚ__doc__)r   r7   r   Úheaderr2   r(   r
   r
   r   Ú_augment_fn_docs›   s    


r>   )N)
r<   r,   r   r   r!   r)   r5   r6   r8   r>   r
   r
   r
   r   Ú<module>   s   

!1