
    !h                        % S r SSKJr  SSKrSSKrSSKJrJr  SSKJ	r	  SSS jjr
S\	SSSSS	4                   SS
 jjrSSS jjr/ rS\S'   \SS j5       r\SS j5       rSS jrSS jrg)z%Some helpers for deprecation messages    )annotationsN)Anyoverload)ScrapyDeprecationWarningc                    U R                   R                  n[        R                  " U SU SU SU SU S3
[        SS9  g )N.zC attribute is deprecated and will be no longer supported in Scrapy z, use z attribute instead   
stacklevel)	__class____name__warningswarnr   )objoldattrnewattrversioncnames        ]/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/scrapy/utils/deprecate.py	attributer      sM    MM""EMM'7) IVE7!G94F	H 	    TzF{cls} inherits from deprecated class {old}, please inherit from {new}.z/{cls} is deprecated, instantiate {new} instead.c	           
     l  ^^^^^^^^  " UUUUUUUU4S jSTR                   5      mT" U T4U=(       d    0 5      n	 [        R                  " 5       S   n
[        R                  " U
S   5      nUb  UR                  U	l        U	$ ! [         a%  n[        R                  " SU< 35         SnAU	$ SnAff = f)a  
Return a "deprecated" class that causes its subclasses to issue a warning.
Subclasses of ``new_class`` are considered subclasses of this class.
It also warns when the deprecated class is instantiated, but do not when
its subclasses are instantiated.

It can be used to rename a base class in a library. For example, if we
have

    class OldName(SomeClass):
        # ...

and we want to rename it to NewName, we can do the following::

    class NewName(SomeClass):
        # ...

    OldName = create_deprecated_class('OldName', NewName)

Then, if user class inherits from OldName, warning is issued. Also, if
some code uses ``issubclass(sub, OldName)`` or ``isinstance(sub(), OldName)``
checks they'll still return True if sub is a subclass of NewName instead of
OldName.
c                     >^  \ rS rSr% SrS\S'   SrS\S'           SU 4S jjrSU UUUUUU4S	 jjrSS
 jr	SUU U4S jjr
SUU UUUUU4S jjrSrU =r$ )0create_deprecated_class.<locals>.DeprecatedClass;   Nztype | Nonedeprecated_classFboolwarned_on_subclassc                N   > [         TU ]  XX#5      nU R                  c  X@l        U$ N)super__new__r   )metaclsnamebasesclsdict_clsr   s        r   r"   8create_deprecated_class.<locals>.DeprecatedClass.__new__@   s,     '/'AC''/+.(Jr   c                >  > U R                   nUR                  nXR;   ao  T(       a  UR                  (       dW  SUl        TR                  [	        U 5      [	        UT
5      [	        TT	5      S9nT(       a  US-  n[
        R                  " UTSS9  [        TU ]!  XU5        g )NT)r'   oldnewz6 (warning only on first subclass, there may be others)   r
   )	r   r   r   format_clspathr   r   r!   __init__)r'   r$   r%   r&   metar*   msgr   	new_classnew_class_pathold_class_pathsubclass_warn_messagewarn_category	warn_onces          r   r/   9create_deprecated_class.<locals>.DeprecatedClass.__init__H   s    ==D''C|Y43J3J*.'+22  n5 N; 3 
 SSCc=Q?GT(3r   c                X   ^  [        U 4S j[        U5      UR                  4 5       5      $ )Nc              3  F   >#    U  H  nTR                  U5      v   M     g 7fr    )__subclasscheck__).0cr'   s     r   	<genexpr>Ucreate_deprecated_class.<locals>.DeprecatedClass.__instancecheck__.<locals>.<genexpr>[   s!     V9UAs,,Q//9Us   !)anytyper   )r'   insts   ` r   __instancecheck__Bcreate_deprecated_class.<locals>.DeprecatedClass.__instancecheck__Z   s!    V$t*dnn9UVVVr   c                   >^  T TR                   La  [        TT ]	  U5      $ [        R                  " U5      (       d  [        S5      e[        USS5      n[        U U4S jU 5       5      $ )Nz"issubclass() arg 1 must be a class__mro__ c              3  0   >#    U  H  oTT1;   v   M     g 7fr    rG   )r<   r=   r'   r2   s     r   r>   Ucreate_deprecated_class.<locals>.DeprecatedClass.__subclasscheck__.<locals>.<genexpr>i   s     :cS),,cs   )r   r!   r;   inspectisclass	TypeErrorgetattrr@   )r'   submroDeprecatedClassr   r2   s   `  r   r;   Bcreate_deprecated_class.<locals>.DeprecatedClass.__subclasscheck__]   s]    /:::
 w055??3'' DEE#y"-C:c:::r   c                   > TR                   nXL a:  TR                  [        U T
5      [        TT	5      S9n[        R                  " UTSS9  [
        TU ]  " U0 UD6$ )N)r'   r+   r,   r
   )r   r-   r.   r   r   r!   __call__)r'   argskwargsr*   r1   rP   r   instance_warn_messager2   r3   r4   r6   s        r   rS   9create_deprecated_class.<locals>.DeprecatedClass.__call__k   sc    !22Cz+22 n5 N; 3  c=Q?7#T4V44r   rG   )r$   strr%   tuple[type, ...]r&   dict[str, Any]returnrA   )r$   rX   r%   rY   r&   rZ   )rB   r   r[   r   )rN   rA   r[   r   )rT   r   rU   r   r[   r   )r   
__module____qualname____firstlineno__r   __annotations__r   r"   r/   rC   r;   rS   __static_attributes____classcell__)	r   rP   rV   r2   r3   r4   r5   r6   r7   s	   @r   rP   r   ;   sg    (,+,#(D(		'7	CQ			4 	4$	W	; 	;	5 	5 	5r   rP      r   NzError detecting parent module: )	r   rJ   stack	getmoduler   r\   	Exceptionr   r   )r$   r2   clsdictr6   r7   r4   r3   r5   rV   deprecated_clsfrmparent_moduleerP   s    ` ``````    @r   create_deprecated_classrk      s    J85 85)-- 85t %TI<BGN
?mmoa ))#a&1$(5(>(>N%   ?
 	7u=>>?s   AB 
B3B..B3c                B    Ub  U$ U R                    SU R                   3$ )Nr   )r\   r   )r'   forceds     r   r.   r.      s'    nnQs||n--r   zlist[tuple[str, str]]DEPRECATION_RULESc                    g r    rG   paths    r   update_classpathrr          (+r   c                    g r    rG   rp   s    r   rr   rr      rs   r   c                    [          Hj  u  p[        U [        5      (       d  M  U R                  U5      (       d  M4  U R	                  XS5      n[
        R                  " SU  SU S3[        5        Us  $    U $ )z=Update a deprecated path from an object with its new locationrb   `z` class is deprecated, use `z	` instead)rn   
isinstancerX   
startswithreplacer   r   r   )rq   prefixreplacementnew_paths       r   rr   rr      sj    0dC  T__V%<%<||F;HMMD65hZyI( O  1 Kr   c                ^    [        X5      n[        X5      nUR                  UR                  L$ )a$  
Return True if a method named ``method_name`` of a ``base_class``
is overridden in a ``subclass``.

>>> class Base:
...     def foo(self):
...         pass
>>> class Sub1(Base):
...     pass
>>> class Sub2(Base):
...     def foo(self):
...         pass
>>> class Sub3(Sub1):
...     def foo(self):
...         pass
>>> class Sub4(Sub2):
...     pass
>>> method_is_overridden(Sub1, Base, 'foo')
False
>>> method_is_overridden(Sub2, Base, 'foo')
True
>>> method_is_overridden(Sub3, Base, 'foo')
True
>>> method_is_overridden(Sub4, Base, 'foo')
True
)rM   __code__)subclass
base_classmethod_namebase_method
sub_methods        r   method_is_overriddenr      s/    6 *2K/Jz':':::r   )z0.12)
r   r   r   rX   r   rX   r   rX   r[   None)r$   rX   r2   rA   rf   zdict[str, Any] | Noner6   ztype[Warning]r7   r   r4   
str | Noner3   r   r5   rX   rV   rX   r[   rA   r    )r'   rA   rm   r   r[   rX   )rq   rX   r[   rX   )rq   r   r[   r   )r   rA   r   rA   r   rX   r[   r   )__doc__
__future__r   rJ   r   typingr   r   scrapy.exceptionsr   r   rk   r.   rn   r_   rr   r   rG   r   r   <module>r      s    + "     6 &*#;!%!%!i!Rm
mm #m !	m
 m m m m m 
m`. ,. ( - 
 + 
 + 
 + 
 +
;r   