U
    r\jk5                     @   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   S/root/pica-gateway/venv/lib/python3.8/site-packages/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TERM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)redcyangreen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        r2   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
   r1   )r   argsr   r   r   r   r   r   warn_deprecated_limitedr   s        r5   c                 C   s   t | tjjtj||d d S r0   )r   r
   RemovedIn20Warningr   )r   r   r   r   r   r   warn_deprecated_20~   s    r7   __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
   r1   dictclsconstructorheadermessager   r   r   decorate   s    z deprecated_cls.<locals>.decorater   )r   rC   rA   rD   r   r@   r   deprecated_cls   s    
rE   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)r<   r   r>   rA   rC   warning_clsr   r   rD      s    z#deprecated_20_cls.<locals>.decorate)r
   LegacyAPIWarningr6   )ZclsnamealternativerA   becomes_legacyrD   r   rI   r   deprecated_20_cls   s    
rN   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.4r9   r'   z$Call to deprecated function %(func)sz (deprecated since: %s)c                    s    t | t| jd  dS )Nr:   )enable_warnings)_decorate_with_warningr=   __name__)fnrQ   rB   rC   r   warningr   r   rD      s    zdeprecated.<locals>.decorate)r
   r6   r1   )r   rC   Zadd_deprecation_to_docstringrV   rQ   rD   r   rU   r   
deprecated   s$    

rW   c                 K   s   t d| tjd|S )NrO   rC   rV   )rO   )rW   r
   ZMovedIn20Warning)rC   kwr   r   r   moved_20   s      rZ   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)attrr;   methr   Z	constructzPThe %s %s is considered legacy as of the 1.x series of SQLAlchemy and %s in 2.0.rF   rG   z:attr:Zwarn_on_attribute_accessFrQ   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.rH   rO   rX   )rO   )
rematchgrouppopr-   AssertionErrorr
   rK   r6   rW   )	Zapi_namerL   rM   rY   Ztype_regr   rC   Zattribute_okrJ   r   r   r   deprecated_20   s:    
re   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."
            )

        )

    rO   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)rT   r4   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 )r9   rO   rP   r'   r   ).0paramr   rC   r   r   r   
<dictcomp>}  s
   
 z7deprecated_params.<locals>.decorate.<locals>.<dictcomp>)r   Zinspect_getfullargspecrn   r=   zipr4   lenrg   intersectionrh   varkwr   __doc__r   items)rT   specrr   doc	decoratedro   specsrp   rq   )rk   rl   rm   rn   r   rD   E  s4    

!z#deprecated_params.<locals>.decorate)r{   _sanitize_restructured_textr
   r6   r1   )r   rt   r   rC   rD   r   r   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   repl  s    z)_sanitize_restructured_text.<locals>.replz:ref:`(.+) <.*>`c                 S   s   d|  d S )Nz"%s"r   r   )rj   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'   r:   @ (Background on SQLAlchemy 2.0 at: :ref:`migration_20_toplevel`)r   rz   __dict____weakref__)rz   r=   r   r
   r   r   typer   rc   rS   	__bases__getattrsetattrrR   )	r?   rA   wtyperC   r   docstring_headerr}   ZclsdictZconstructor_fnr   r   r   r<     sB    


    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.r   r'   c                    s0     p| dd}|s&tdd | ||S )NZ_sa_skip_warningFr/   r   )rc   r   )rT   r4   ri   Zskip_warningrQ   rC   r   r   r   r   rr     s    
 z&_decorate_with_warning.<locals>.warnedNr:   r   c                      s   t  ddS rf   )r   r   )rC   r   r   r   r   r     s
      z(_decorate_with_warning.<locals>.<lambda>)
r   r   r
   r   r   rz   r=   rS   r   Z_sa_warn)
r;   r   rC   r   r   rQ   Zdoc_onlyrr   r}   r~   r   r   r   rR     s     rR   )N)r/   N)r/   N)r/   N)r8   )Nr8   F)NTNT)NF)N)NT) rz   r+   r`   r(   r'   r   Zlanghelpersr   r   r   r   r   r
   r   r   getenvlowerZpy2kr   r   r2   r5   r7   rE   rN   rW   rZ   re   r   r   r<   rR   r   r   r   r   <module>   sT   
3



     
%    
=
)b 
*   