U
    [hk5                     @   s<  d Z ddlZddl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Zdaedd dkrdZejrdanedd dkrdad0ddZdd Zd1ddZd2ddZd3ddZd4ddZd5d d!Zd6d"d#Zd$d% Zd7d&d'Zd(d) Zd*d+ Zd8d,d-Zd9d.d/ZdS ):zSHelpers related to deprecation of functions, methods, classes, other
functionality.    N   )compat)_hash_limit_string)_warnings_warn)	decorator)inject_docstring_text)inject_param_text   )excFSQLALCHEMY_WARN_20false)trueyes1TZSQLALCHEMY_SILENCE_UBER_WARNINGc                 C   sH   t |tjr"ts"tst|| d S || |d}||_t||d d d S )Ncoder   
stacklevel)
issubclassr
   Base20DeprecationWarningr   SILENCE_UBER_WARNING_emit_uber_warningdeprecated_sincer   )msgversiontype_r   r   warn r   @/tmp/pip-unpacked-wheel-joqu7d3y/sqlalchemy/util/deprecations.py_warn_with_version)   s    

r   c                 C   s   t rd S da tj}t|do2| o2tjddk}d}|rR|dddd	d
d }n|dddddd }| |}t||d d d S )NTisattyTERMZdumba  %(red)sDeprecated API features detected! These feature(s) are not compatible with SQLAlchemy 2.0. %(green)sTo prevent incompatible upgrades prior to updating applications, ensure requirements files are pinned to "sqlalchemy<2.0". %(cyan)sSet environment variable SQLALCHEMY_WARN_20=1 to show all deprecation warnings.  Set environment variable SQLALCHEMY_SILENCE_UBER_WARNING=1 to silence this message.%(nocolor)sz[31mz[36mz[32mz[35mz[0m)ZredZcyanZgreenZmagentaZnocolor r   r   )	r   sysstderrhasattrr    osenvirongetr   )r   r   file_Z	use_colorr   r   r   r   r   r   9   s8    


r      c                 C   s   t | |tj||d d S Nr   )r   r
   SADeprecationWarning)r   r   r   r   r   r   r   warn_deprecatedl   s        r-   c                 C   s(   |rt | d|} t| |tj||d dS )zhIssue a deprecation warning with a parameterized string,
    limiting the number of registrations.

    
   r   N)r   r   r
   r,   )r   argsr   r   r   r   r   r   warn_deprecated_limitedr   s        r0   c                 C   s   t | tjjtj||d d S r+   )r   r
   RemovedIn20Warningr   )r   r   r   r   r   r   warn_deprecated_20~   s    r2   __init__c                    s&   dp
df  fdd}|S )N.. deprecated:: %s %sr"   c                    s   t |  tjt d S )Nfunc)_decorate_cls_with_warningr
   r,   dictclsconstructorheadermessager   r   r   decorate   s    z deprecated_cls.<locals>.decorater   )r   r>   r<   r?   r   r;   r   deprecated_cls   s    
r@   c                    sJ   d| |sdndf |r$d| 7 |r0t jnt j fdd}|S )Nzg.. deprecated:: 1.4 The %s class is considered legacy as of the 1.x series of SQLAlchemy and %s in 2.0.will be removedbecomes a legacy construct c                    s   t |  jS )N)r7   r   r9   r<   r>   warning_clsr   r   r?      s    z#deprecated_20_cls.<locals>.decorate)r
   LegacyAPIWarningr1   )Zclsnamealternativer<   becomes_legacyr?   r   rD   r   deprecated_20_cls   s    
rI   c                    s|   dkrdkrt jd|r0dp(df nddkr@ddkrNt jt jk	rdd 7  fdd	}|S )
a  Decorates a function and issues a deprecation warning on use.

    :param version:
      Issue version in the warning.

    :param message:
      If provided, issue message in the warning.  A sensible default
      is used if not provided.

    :param add_deprecation_to_docstring:
      Default True.  If False, the wrapped function's __doc__ is left
      as-is.  If True, the 'message' is prepended to the docs if
      provided, or sensible default if message is omitted.

    2.0N1.4r4   r"   z$Call to deprecated function %(func)sz (deprecated since: %s)c                    s    t | t| jd  dS )Nr5   )enable_warnings)_decorate_with_warningr8   __name__)fnrL   r=   r>   r   warningr   r   r?      s    zdeprecated.<locals>.decorate)r
   r1   r,   )r   r>   Zadd_deprecation_to_docstringrQ   rL   r?   r   rP   r   
deprecated   s$    

rR   c                 K   s   t d| tjd|S )NrJ   r>   rQ   )rJ   )rR   r
   ZMovedIn20Warning)r>   kwr   r   r   moved_20   s      rU   c           	      K   s   t d| }|r(dddd|d }nd}d| ||s:d	nd
f }d| krt|dd}|st|ddksttd|  |r|d| 7 }|rtj}ntj}t	d||d|S )Nz^:(attr|func|meth):	attributefunctionmethod)attrr6   methr   Z	constructzPThe %s %s is considered legacy as of the 1.x series of SQLAlchemy and %s in 2.0.rA   rB   z:attr:Zwarn_on_attribute_accessFrL   zattribute %s will emit a warning on read access.  If you *really* want this, add warn_on_attribute_access=True.  Otherwise please add enable_warnings=False.rC   rJ   rS   )rJ   )
rematchgrouppopr(   AssertionErrorr
   rF   r1   rR   )	Zapi_namerG   rH   rT   Ztype_regr   r>   Zattribute_okrE   r   r   r   deprecated_20   s:    
r`   c                     sd   i  i i   D ]8\}\}}||< t| |< |dkrBtjntj|< q fdd}|S )a"  Decorates a function to warn on use of certain parameters.

    e.g. ::

        @deprecated_params(
            weak_identity_map=(
                "0.7",
                "the :paramref:`.Session.weak_identity_map parameter "
                "is deprecated."
            )

        )

    rJ   c                    s   t | }|jd k	r\tt|jt|jt|j d  |jtt	ndt|j
 t fdd}| jd k	r| jpd}|rt|dd  D }|| }||_|S )Nr   c                    s   D ]T}| d kr || d k	s<| d k	r|| | krt | | | dd q krt|rt       dd D ](}||krt | | | dd q| ||S Nr*   r   )r   set
difference)rO   r/   kwargsm)check_any_kwcheck_defaultscheck_kwdefaultsmessagesversion_warningsversionsr   r   warnedW  s<    
z3deprecated_params.<locals>.decorate.<locals>.warnedr"   c                 S   s2   i | ]*\}\}}|d |dkr dn||p(df qS )r4   rJ   rK   r"   r   ).0paramr   r>   r   r   r   
<dictcomp>}  s
   
 z7deprecated_params.<locals>.decorate.<locals>.<dictcomp>)r   Zinspect_getfullargspecri   r8   zipr/   lenrb   intersectionrc   varkwr   __doc__r   items)rO   specrm   doc	decoratedrj   specsrk   rl   )rf   rg   rh   ri   r   r?   E  s4    

!z#deprecated_params.<locals>.decorate)rv   _sanitize_restructured_textr
   r1   r,   )r{   ro   r   r>   r?   r   rz   r   deprecated_params(  s    Br}   c                 C   s(   dd }t ddd | } t d|| S )Nc                 S   s$   |  dd\}}|dkr |d7 }|S )Nr   r	   )r6   rZ   z()r]   )re   r   namer   r   r   repl  s    z)_sanitize_restructured_text.<locals>.replz:ref:`(.+) <.*>`c                 S   s   d|  d S )Nz"%s"r   r~   )re   r   r   r   <lambda>      z-_sanitize_restructured_text.<locals>.<lambda>z\:(\w+)\:`~?(?:_\w+)?\.?(.+?)`)r[   sub)textr   r   r   r   r|     s    r|   c           	   	   C   s   | j d k	r| j pd}|d k	r|d k	r2|t|d; }t|tjrF|d7 }t||d}t| tkrt| j}||d< |dd  |dd  t| j	| j
|} |d k	r|| }n|| _ |d k	rt| |}|d k	rt| |t||||d  | S )Nr"   r5   @ (Background on SQLAlchemy 2.0 at: :ref:`migration_20_toplevel`)r   ru   __dict____weakref__)ru   r8   r   r
   r   r   typer   r^   rN   	__bases__getattrsetattrrM   )	r:   r<   wtyper>   r   docstring_headerrx   ZclsdictZconstructor_fnr   r   r   r7     sB    


    r7   c           
         s   t ttjrd}nd}t fdd}| jdk	rD| jpFd}|dk	rt|t| jd; }||7 }t||d}|| }	||	_fdd	|	_	|	S )
z=Wrap a function with a warnings.warn and augmented docstring.r   r"   c                    s0     p| dd}|s&tdd | ||S )NZ_sa_skip_warningFr*   r   )r^   r   )rO   r/   rd   Zskip_warningrL   r>   r   r   r   r   rm     s    
 z&_decorate_with_warning.<locals>.warnedNr5   r   c                      s   t  ddS ra   )r   r   )r>   r   r   r   r   r     s
      z(_decorate_with_warning.<locals>.<lambda>)
r|   r   r
   r   r   ru   r8   rN   r   Z_sa_warn)
r6   r   r>   r   r   rL   Zdoc_onlyrm   rx   ry   r   r   r   rM     s     rM   )N)r*   N)r*   N)r*   N)r3   )Nr3   F)NTNT)NF)N)NT) ru   r&   r[   r#   r"   r   Zlanghelpersr   r   r   r   r   r
   r   r   getenvlowerZpy2kr   r   r-   r0   r2   r@   rI   rR   rU   r`   r}   r|   r7   rM   r   r   r   r   <module>   sT   
3



     
%    
=
)b 
*   