U kf. @sdZddlmZddlZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd lm Z dd lm Z dd lm Z dd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZededZedddZdNdddddd d!d"d#ZdOddddd d%d&d'ZdPdd(dddd d)d*d+ZdQdddd-d.d/d0ZdRddd2d3d2d4d5d6d7Zdd8d9d:d;d<Z dSddd8d4d=d>d?Z!d@d4dAdBdCZ"dddDdEdFZ#dTdGddddddGdHdIdJZ$dUdddddd2ddKdLdMZ%dS)VzSHelpers related to deprecation of functions, methods, classes, other functionality.) annotationsN)Any)Callable)Dict)Match)Optional)Sequence)Set)Tuple)Type)TypeVar)Union)compat)_hash_limit_string)_warnings_warn) decorator)inject_docstring_text)inject_param_text)exc_T)bound_FzCallable[..., Any]strzType[exc.SADeprecationWarning]intz Optional[str]None)msgversiontype_ stacklevelcodereturncCs&|||d}||_t||dddS)Nr!rr )Zdeprecated_sincer)rrrr r!warnr&L/opt/hc_python/lib64/python3.8/site-packages/sqlalchemy/util/deprecations.py_warn_with_version*s r()rrr r!r"cCst||tj||ddS)Nr#)r(rSADeprecationWarning)rrr r!r&r&r'warn_deprecated7sr+z Sequence[Any])rargsrr r!r"cCs(|rt|d|}t||tj||ddS)zhIssue a deprecation warning with a parameterized string, limiting the number of registrations. r#N)rr(rr*)rr,rr r!r&r&r'warn_deprecated_limited?s  r.__init__zCallable[[Type[_T]], Type[_T]])rmessage constructorr"cs.dp dfdddfdd }|S)N.. deprecated:: %s %sType[_T])clsr"cst|tjtdS)Nfunc)_decorate_cls_with_warningrr*dict)r5r1headerr0rr&r'decorateVs z deprecated_cls..decorater&)rr0r1r<r&r:r'deprecated_clsQs r=Tboolz(Optional[Type[exc.SADeprecationWarning]]zCallable[[_F], _F])rr0add_deprecation_to_docstringwarningenable_warningsr"cs`|rdpdfnddkr&ddkr4tjd7dddfdd }|S) aDecorates 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. r2r3Nz$Call to deprecated function %(func)sz (deprecated since: %s)rfnr"cs8dk s tdk stt|t|jddS)Nr6)rA)AssertionError_decorate_with_warningr9__name__)rCrAr;r0rr@r&r'r<s  zdeprecated..decorate)rr*)rr0r?r@rAr<r&rGr' deprecatedcs  rHrz0Callable[[Callable[..., _T]], Callable[..., _T]])r0kwr"cKstd|tjd|S)N2.0r0r@)rJ)rHrZMovedIn20Warning)r0rIr&r&r'moved_20srL)api_name alternativerIr"cKstd|}|r(dddd|d}nd}d||d f}d |krl|d d }|sl|d d ksltd||r||d|7}tj}td||d|S)Nz^:(attr|func|meth): attributefunctionmethod)attrr7methrZ constructzPThe %s %s is considered legacy as of the 1.x series of SQLAlchemy and %s in 2.0.zbecomes a legacy constructz:attr:Zwarn_on_attribute_accessFrAzattribute %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. rJrK)rJ) rematchgrouppopgetrDrZLegacyAPIWarningrH)rMrNrIZtype_regrr0Z attribute_okZ warning_clsr&r&r'became_legacy_20s2     rZzTuple[str, str])specsr"c s^iiiD]*\}\}}||<t||<tj|<qdddfdd }|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." ) ) rrBc st|}|jdk r\tt|jt|jt|jd|jtt n:|j dk r|j tt n dt|j t dddddfdd }|j dk r|j pd}|rt|dd D}||}||_ |S) Nr&rrrCr,kwargsr"csD]T}|dkr ||dk s<|dk r|||krt|||ddqkrt|rdk s|ttddD](}||krt|||ddq|||SNr)r$)r(set differencerD)rCr,r]m) check_any_kwcheck_defaultscheck_kwdefaultsmessagesversion_warningsversionsr&r'warneds>  z3deprecated_params..decorate..warnedr3cSs2i|]*\}\}}|d|dkr dn||p(dfqS)r2rJz1.4r3r&).0paramrr0r&r&r' s  z7deprecated_params..decorate..)rZinspect_getfullargspecrer9zipr,lenr_ intersectionr`kwonlydefaultsvarkwr__doc__ritems)rCspecridoc decoratedrfr[rgrh)rbrcrdrer'r<s<   &!z#deprecated_params..decorate)rs_sanitize_restructured_textrr*)r[rkrr0r<r&rwr'deprecated_paramss  Iry)textr"cCs0ddddd}tddd|}td ||S) Nz Match[str]r)rar"cSs$|dd\}}|dkr |d7}|S)Nrr)r7rSz()rW)rarnamer&r&r'repl-sz)_sanitize_restructured_text..replz:ref:`(.+) <.*>`cSsd|dS)Nz"%s"rr{)rar&r&r'3z-_sanitize_restructured_text..z\:(\w+)\:`~?(?:_\w+)?\.?(.+?)`)rUsub)rzr}r&r&r'rx,srxr4)r5r1wtyper0rdocstring_headerr"c Cs|jdk r|jpd}|dk r|dk r2|t|d;}t|tjrF|d7}t||d}d}t|tkrt|j}||d<|dd|ddt|j |j |}|dk r||}n||_|dk rt ||}|dk r|dk st |dk st t ||t||||d|S)Nr3r6@ (Background on SQLAlchemy 2.0 at: :ref:`migration_20_toplevel`)rrr__dict__ __weakref__)rrr9 issubclassrBase20DeprecationWarningrtyperrXrF __bases__getattrrDsetattrrE) r5r1rr0rrruZconstructor_fnZclsdictr&r&r'r87sH          r8)r7rr0rrrAr"c stttjrd}nd}tdddddfdd }|jdk rP|jpRd}|dk r|t|jd ;}||7}t||d }||} || _fd d | _ | S) z=Wrap a function with a warnings.warn and augmented docstring.rr3rrr\cs0 p|dd}|s&tdd|||S)NZ_sa_skip_warningFr)r$)rXr()rCr,r]Z skip_warningrAr0rrr&r'ri{s z&_decorate_with_warning..warnedNr6rcstddSr^)r(r&)r0rrr&r'r~s z(_decorate_with_warning..) rxrrrrrrr9rFrZ_sa_warn) r7rr0rrrAZdoc_onlyrirurvr&rr'rEgs    rE)N)r)N)r)N)r/)NTNT)N)N)NT)&rr __future__rrUtypingrrrrrrr r r r r r3rZ langhelpersrrrrrrrrr(r+r.r=rHrLrZryrxr8rEr&r&r&r' s^                      6 &e5