B
    KLc-                 @   s  d 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edd dkrdZd-ddZd.ddZd/ddZd0ddZd1ddZd2ddZd3dd Zd!d" Zd4d#d$Zd%d& Zd'd( Zd5d)d*Zd6d+d,ZdS )7zSHelpers 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_20Zfalse)trueZyes1Tc             C   s:   t |tjrtsd S || |d}||_t||d d d S )N)coder   )
stacklevel)
issubclassr
   Base20DeprecationWarningr   deprecated_sincer   )msgversiontype_r   r   warn r   ;lib/python3.7/site-packages/sqlalchemy/util/deprecations.py_warn_with_version   s    r      c             C   s   t | |tj||d d S )N)r   )r   r
   SADeprecationWarning)r   r   r   r   r   r   r   warn_deprecated*   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_limited0   s    r   c             C   s   t | tjjtj||d d S )N)r   )r   r
   RemovedIn20Warningr   )r   r   r   r   r   r   warn_deprecated_20<   s    r!   __init__c                s&   dp
df  fdd}|S )Nz.. deprecated:: %s %s c                s   t |  tjt d S )N)func)_decorate_cls_with_warningr
   r   dict)cls)constructorheadermessager   r   r   decorateJ   s    z deprecated_cls.<locals>.decorater   )r   r*   r(   r+   r   )r(   r)   r*   r   r   deprecated_clsG   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.zwill be removedzbecomes a legacy construct c                s   t |  jS )N)r%   r   )r'   )r(   r*   warning_clsr   r   r+   m   s    z#deprecated_20_cls.<locals>.decorate)r
   LegacyAPIWarningr    )Zclsnamealternativer(   becomes_legacyr+   r   )r(   r*   r.   r   deprecated_20_clsW   s    
r2   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.

    z2.0Nz1.4z.. deprecated:: %s %sr#   z$Call to deprecated function %(func)sz (deprecated since: %s)c                s    t | t| jd  dS )N)r$   )enable_warnings)_decorate_with_warningr&   __name__)fn)r3   r)   r*   r   warningr   r   r+      s    zdeprecated.<locals>.decorate)r
   r    r   )r   r*   Zadd_deprecation_to_docstringr7   r3   r+   r   )r3   r)   r*   r   r7   r   
deprecatedz   s"    

r8   c             K   s   t d| tjd|S )N2.0)r*   r7   )r9   )r8   r
   ZMovedIn20Warning)r*   kwr   r   r   moved_20   s    r;   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):Z	attributeZfunctionmethod)attrr$   methr   Z	constructzPThe %s %s is considered legacy as of the 1.x series of SQLAlchemy and %s in 2.0.zwill be removedzbecomes a legacy constructz:attr:Zwarn_on_attribute_accessFr3   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.r-   2.0)r*   r7   )r?   )
rematchgrouppopgetAssertionErrorr
   r/   r    r8   )	Zapi_namer0   r1   r:   Ztype_regr   r*   Zattribute_okr.   r   r   r   deprecated_20   s,    
rF   c                 sh   i  i i xD  D ]8\}\}}||< t| |< |dkrDtjntj|< qW  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."
            )

        )

    z2.0c                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   x\D ]T}| d kr"|| d k	s>| d k	r|| | krt | | | dd qW  krt|rt       dd x0D ](}||krt | | | dd qW | ||S )Nr   )r   )r   set
difference)r6   r   kwargsm)check_any_kwcheck_defaultscheck_kwdefaultsmessagesversion_warningsversionsr   r   warned  s.    

z3deprecated_params.<locals>.decorate.<locals>.warnedr#   c             S   s2   i | ]*\}\}}d |dkrdn||p&df |qS )z.. deprecated:: %s %sz2.0z1.4r#   r   ).0paramr   r*   r   r   r   
<dictcomp>;  s   z7deprecated_params.<locals>.decorate.<locals>.<dictcomp>)r   Zinspect_getfullargspecrN   r&   zipr   lenrG   intersectionrH   Zvarkwr   __doc__r   items)r6   specrR   doc	decorated)rO   specsrP   rQ   )rK   rL   rM   rN   r   r+     s*    


"z#deprecated_params.<locals>.decorate)rZ   _sanitize_restructured_textr
   r    r   )r^   rT   r   r*   r+   r   )rO   r^   rP   rQ   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	   )r$   r>   z())rB   )rJ   r   namer   r   r   replI  s    z)_sanitize_restructured_text.<locals>.replz:ref:`(.+) <.*>`c             S   s   d|  d S )Nz"%s"r   )rB   )rJ   r   r   r   <lambda>O      z-_sanitize_restructured_text.<locals>.<lambda>z\:(\w+)\:`~?(?:_\w+)?\.?(.+?)`)r@   sub)textrb   r   r   r   r_   H  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#   )r$   z@ (Background on SQLAlchemy 2.0 at: :ref:`migration_20_toplevel`)r   rY   __dict____weakref__)rY   r&   r   r
   r   r   typerg   rC   r5   	__bases__getattrsetattrr4   )	r'   r(   wtyper*   r   docstring_headerr\   ZclsdictZconstructor_fnr   r   r   r%   S  s4    


r%   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.z@ (Background on SQLAlchemy 2.0 at: :ref:`migration_20_toplevel`)r#   c                s0     p| dd}|s&tdd | ||S )NZ_sa_skip_warningFr   )r   )rC   r   )r6   r   rI   Zskip_warning)r3   r*   r   rm   r   r   rR     s
    
z&_decorate_with_warning.<locals>.warnedN)r$   r   c                  s   t  ddS )Nr   )r   )r   r   )r*   r   rm   r   r   rc     s   z(_decorate_with_warning.<locals>.<lambda>)
r_   r   r
   r   r   rY   r&   r5   r   Z_sa_warn)
r$   rm   r*   r   rn   r3   Zdoc_onlyrR   r\   r]   r   )r3   r*   r   rm   r   r4   |  s    	r4   )N)r   N)r   N)r   N)r"   )Nr"   F)NTNT)NF)N)NT)rY   osr@   r#   r   Zlanghelpersr   r   r   r   r   r
   r   getenvlowerr   r   r   r!   r,   r2   r8   r;   rF   r`   r_   r%   r4   r   r   r   r   <module>	   s8   





$   
8
)b
)