
    h:                       S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKJrJ	r	J
r
Jr  S SKJr  S SKJrJrJr  S SKJr  S SKJr   " S S	\5      r " S
 S\R.                  5      r " S S\R.                  5      r " S S\5      r " S S\\5      r " S S\5      r " S S\R:                  5      r " S S\5      r " S S5      r  " S S5      r! " S S5      r" " S S5      r#S3S  jr$\R                  " \"\$5         " S! S"5      r% " S# S$5      r&S4S% jr' " S& S'\5      r( " S( S)\5      r) " S* S+5      r* " S, S-5      r+\
\S.\,4      r- " S/ S0\5      r. " S1 S2\5      r/\\\(/r0g)5    )annotationsN)AnyCallableListTuple)NoReturn)aotcrefutilstyles)unittest)TestCasec                  <    \ rS rSrSS jrSS jrSS jrSS jrSrg)	VersionTests   c                    " S S5      q [        R                  " [        5       5      n " S S[        R                  5      q [        R
                  " U5      n[        R                  " 5         UR                  (       d   S5       eg )Nc                      \ rS rSrSS jrSrg)NullVersioned   c                    SU l         g )Nr   okselfs    b/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/twisted/test/test_persisted.py__init__NullVersioned.__init__   	        r   NreturnNone__name__
__module____qualname____firstlineno__r   __static_attributes__ r   r   r   r      s    r   r   c                  "    \ rS rSrSrSS jrSrg)r         c                    SU l         g Nr+   r   r   s    r   upgradeToVersion1NullVersioned.upgradeToVersion1"   r   r   r   Nr   )r#   r$   r%   r&   persistenceVersionr.   r'   r(   r   r   r   r      s    !"r   zinitial upgrade not run!)r   pickledumpsr   	Versionedloads	doUpgrader   )r   pkclmnvs      r   test_nullVersionUpgrade$VersionTests.test_nullVersionUpgrade   s^    	 	 ||MO,	F,, 	 ll4 vv111vr   c                r    " S S[         R                  5      q[        5       nUR                  (       d  UR                  (       a   S5       e[
        R                  " U5      nS[        l        [
        R                  " U5      n[         R                  " 5         UR                  (       d   S5       eUR                  (       d   S5       e[
        R                  " U5      n[
        R                  " U5      n[         R                  " 5         UR                  S:X  d   S5       eUR                  S:X  d   S5       eg )	Nc                  D    \ rS rSrSrS/rSrSrS
S jrS
S jr	S
S jr
Srg	)MyVersioned,      garbagedatar   c                "    SU l         S U l        g )Nxxxc                    g)Nzcant persistr(   )qs    r   <lambda>&MyVersioned.__init__.<locals>.<lambda>5   s    ^r   )somedatar?   r   s    r   r   MyVersioned.__init__3   s     %#; r   c                .    U =R                   S-  sl         g r-   )v3r   s    r   upgradeToVersion3MyVersioned.upgradeToVersion37       1r   c                .    U =R                   S-  sl         g r-   )v4r   s    r   upgradeToVersion4MyVersioned.upgradeToVersion4:   rL   r   )r?   rF   Nr   )r#   r$   r%   r&   r0   persistenceForgetsrI   rN   r   rJ   rO   r'   r(   r   r   r<   r<   ,   s)    !""/BB<r   r<   zhasn't been upgraded yet   zdidn't do version 3 upgradezdidn't do version 4 upgrader+   zupgraded unnecessarily)
r   r3   r<   rI   rN   r1   r2   r0   r4   r5   )r   mvpicklobjs       r   test_versionUpgrade VersionTests.test_versionUpgrade)   s    	&** 	" ]EERUU?%??#R )*&ll5!vv444vvv444vS!ll5!vv{444{vv{444{r   c                    " S S[         R                  5      q[        SS5      n[        SS5      n[        R                  " X45      nAAS[        l        S [        l        [        R                  " U5      u  p[         R                  " 5         U R                  UR                  S5        U R                  UR                  S5        U R                  UR                  5        U R                  UR                  5        g )Nc                  (    \ rS rSrSS jrSS jrSrg)ClassWithCustomHashN   c                    Xl         X l        g N)uniquehash)r   r^   r_   s      r   r   ClassWithCustomHash.__init__O   s    $ 	r   c                    U R                   $ r]   )r_   r   s    r   __hash__ClassWithCustomHash.__hash__S   s    yy r   )r_   r^   N)r^   strr_   intr    r!   r    re   )r#   r$   r%   r&   r   rb   r'   r(   r   r   rZ   rZ   N   s    !!r   rZ   v1r   v2r+   c                    [        U SS5      $ NupgradedTsetattrr   s    r   rD   3VersionTests.test_nonIdentityHash.<locals>.<lambda>\   s    W*d>
r   )r   r3   rZ   r1   r2   r0   r.   r4   r5   assertEqualr^   
assertTruerk   )r   rg   rh   pkls       r   test_nonIdentityHash!VersionTests.test_nonIdentityHashK   s    	!&"2"2 	! !q) q)llB8$12.1
- c"D)D)$$r   c                  ^  " S S[         R                  5      q " S S[         R                  5      q[        5       n[        5       n[        R
                  " U5      [        R
                  " U5      snmAAS[        l        SU4S jjnU[        l        S[        l        S	S jnU[        l        [        R                  " U5      n[         R                  " 5         U R                  UR                  R                  5        g )
Nc                      \ rS rSrSrg)	ToyClassAi   r(   Nr#   r$   r%   r&   r'   r(   r   r   rv   rv   i       r   rv   c                      \ rS rSrSrg)	ToyClassBl   r(   Nrx   r(   r   r   r{   r{   l   ry   r   r{   r+   c                f   > [         R                  " T5      U l        [        R                  " 5         g r]   )r1   r4   yr   r5   )r   pklBs    r   r.   WVersionTests.test_upgradeDeserializesObjectsRequiringUpgrade.<locals>.upgradeToVersion1u   s    \\$'DFr   c                    [        U SS5        g rj   rl   r   s    r   setUpgradedQVersionTests.test_upgradeDeserializesObjectsRequiringUpgrade.<locals>.setUpgraded|   s    D*d+r   )r   r   r    r!   )r   objectr    r!   )r   r3   rv   r{   r1   r2   r0   r.   r4   r5   rp   r~   rk   )r   xr~   pklAr.   r   r   s         @r   /test_upgradeDeserializesObjectsRequiringUpgrade<VersionTests.test_upgradeDeserializesObjectsRequiringUpgradef   s    	(( 		(( 	 KK\\!_fll1o
dq'(	$	 '8	#'(	$	, '2	#LL%r   )r~   Nr   )	r#   r$   r%   r&   r8   rV   rr   r   r'   r(   r   r   r   r      s    2& 5D%6&r   r   c                      \ rS rSrSrg)VersionedSubClass   r(   Nrx   r(   r   r   r   r          r   r   c                      \ rS rSrSrg)SecondVersionedSubClass   r(   Nrx   r(   r   r   r   r      r   r   r   c                      \ rS rSrSrg)VersionedSubSubClass   r(   Nrx   r(   r   r   r   r      r   r   r   c                      \ rS rSrSrg)VersionedDiamondSubClass   r(   Nrx   r(   r   r   r   r      r   r   r   c                  @    \ rS rSrSrS	S jrS	S jrS	S jrS	S jrSr	g)
AybabtuTests   z
L{styles._aybabtu} gets all of classes in the inheritance hierarchy of its
argument that are strictly between L{Versioned} and the class itself.
c                l    U R                  [        R                  " [        R                  5      / 5        g)z=
L{styles._aybabtu} of L{Versioned} itself is an empty list.
N)ro   r   _aybabtur3   r   s    r   test_aybabtuStrictEmpty$AybabtuTests.test_aybabtuStrictEmpty   s#     	)9)9:B?r   c                X    U R                  [        R                  " [        5      / 5        g)zu
There are no classes I{between} L{VersionedSubClass} and L{Versioned},
so L{styles._aybabtu} returns an empty list.
N)ro   r   r   r   r   s    r   test_aybabtuStrictSubclass'AybabtuTests.test_aybabtuStrictSubclass   s    
 	):;R@r   c                b    U R                  [        R                  " [        5      [        /5        g)zn
With a sub-sub-class of L{Versioned}, L{styles._aybabtu} returns a list
containing the intervening subclass.
N)ro   r   r   r   r   r   s    r   test_aybabtuSubsubclass$AybabtuTests.test_aybabtuSubsubclass   s"    
 	)=>AR@STr   c                v    U R                  [        R                  " [        5      [        [
        [        /5        g)zw
For a diamond-shaped inheritance graph, L{styles._aybabtu} returns a
list containing I{both} intermediate subclasses.
N)ro   r   r   r   r   r   r   r   s    r   test_aybabtuStrictAybabtuTests.test_aybabtuStrict   s+    
 	OO45!#46MN	
r   r(   Nr   )
r#   r$   r%   r&   __doc__r   r   r   r   r'   r(   r   r   r   r      s    
@AU
r   r   c                      \ rS rSrSS jrSrg)MyEphemeral   c                    Xl         g r]   r   r   r   s     r   r   MyEphemeral.__init__       r   r   Nr   re   r    r!   r"   r(   r   r   r   r      s    r   r   c                      \ rS rSrSS jrSrg)EphemeralTests   c                t   [        S5      nU R                  UR                  [         5        U R                  UR                  S5        [        R
                  " U5      n[        R                  " U5      nU R                  UR                  [        R                  5        U R                  [        US5      5        g )N   r   )r   ro   	__class__r   r1   r2   r4   r   	EphemeralassertFalsehasattr)r   orT   s      r   test_ephemeralEphemeralTests.test_ephemeral   s|    Nk2a QLLf&6&67C)r   r(   Nr   )r#   r$   r%   r&   r   r'   r(   r   r   r   r      s    	*r   r   c                  (    \ rS rSrSS jrSS jrSrg)
Pickleable   c                    Xl         g r]   r   r   s     r   r   Pickleable.__init__   r   r   c                    U R                   $ r]   r   r   s    r   getXPickleable.getX   s    vvr   r   Nr   rf   )r#   r$   r%   r&   r   r   r'   r(   r   r   r   r      s    r   r   c                  "    \ rS rSrSrSS jrSrg)NotPickleable   z!
A class that is not pickleable.
c                    [        S5      e)z)
Raise an exception instead of pickling.
zNot serializable.)	TypeErrorr   s    r   
__reduce__NotPickleable.__reduce__   s     +,,r   r(   Nr    r   )r#   r$   r%   r&   r   r   r'   r(   r   r   r   r      s    -r   r   c                  "    \ rS rSrSrSS jrSrg)CopyRegistered   zV
A class that is pickleable only because it is registered with the
C{copyreg} module.
c                "    [        5       U l        g)z5
Ensure that this object is normally not pickleable.
N)r   notPickleabler   s    r   r   CopyRegistered.__init__   s     +_r   )r   Nr   )r#   r$   r%   r&   r   r   r'   r(   r   r   r   r      s    
-r   r   c                      \ rS rSrSrSrg)CopyRegisteredLoaded   z*
L{CopyRegistered} after unserialization.
r(   N)r#   r$   r%   r&   r   r'   r(   r   r   r   r      s    r   r   c                    [         S4$ )z
Externally implement C{__reduce__} for L{CopyRegistered}.

@param cr: The L{CopyRegistered} instance.

@return: a 2-tuple of callable and argument list, in this case
    L{CopyRegisteredLoaded} and no arguments.
r(   )r   )crs    r   reduceCopyRegisteredr      s      ##r   c                  .    \ rS rSr% SrS\S'   SS jrSrg)	Ai  
dummy class
zCallable[[], None]bmethodc                    g r]   r(   r   s    r   amethod	A.amethod
      r   r(   Nr   )r#   r$   r%   r&   r   __annotations__r   r'   r(   r   r   r   r     s      r   r   c                  .    \ rS rSr% SrS\S'   SS jrSrg)	Bi  r   r   ac                    g r]   r(   r   s    r   r   	B.bmethod  r   r   r(   Nr   )r#   r$   r%   r&   r   r   r   r'   r(   r   r   r   r     s     	Dr   r   c                     g r]   r(   r(   r   r   funktionr     s    r   c                  ,    \ rS rSrSrSS jrSS jrSrg)PicklingTestsi  z$Test pickling of extra object types.c                    [         R                  " [        5      n[         R                  " U5      nU R	                  U[        5        g r]   )r1   r2   r   r4   ro   )r   rT   r   s      r   test_modulePicklingTests.test_module   s.    V$LLF#r   c                   [        S5      n[        R                  " UR                  5      n[        R                  " U5      nU R                  U" 5       S5        U R                  [        U5      [        UR                  5      5        g )NrR   )r   r1   r2   r   r4   ro   type)r   rU   rT   r   s       r   test_instanceMethod!PicklingTests.test_instanceMethod%  sY    mSXX&LLa a$sxx.1r   r(   Nr   )r#   r$   r%   r&   r   r   r   r'   r(   r   r   r   r     s    .$
2r   r   c                  "    \ rS rSrSrSS jrSrg)StringIOTransitionTestsi-  z
When pickling a cStringIO in Python 2, it should unpickle as a BytesIO or a
StringIO in Python 3, depending on the type of its contents.
c                    Sn[         R                  " U5      nU R                  U[        R                  5        U R                  UR                  5       S5        g)zO
A cStringIO pickled with bytes in it will yield an L{io.BytesIO} on
python 3.
sE   ctwisted.persisted.styles
unpickleStringI
p0
(S'test'
p1
I0
tp2
Rp3
.testN)r1   r4   assertIsInstanceioStringIOro   getvalue)r   pickledStringIWithTextloadeds      r   test_unpickleBytesIO,StringIOTransitionTests.test_unpickleBytesIO3  sH    - 	 45fbkk2*F3r   r(   Nr   )r#   r$   r%   r&   r   r   r'   r(   r   r   r   r   -  s    
4r   r   c                  >    \ rS rSr% S \S'   S \S'   S\S'   S	S jrSrg)
EvilSourceroriA  r   br   cc                d    X l         X R                   l        XR                   R                  l        g r]   )r   r   r   r   s     r   r   EvilSourceror.__init__F  s    
r   )r   N)r   r   r    r!   )r#   r$   r%   r&   r   r   r'   r(   r   r   r   r   A  s    Ir   r   c                  4    \ rS rSr% S\S'   SS jrS	S jrSrg)
NonDictStateiL  rd   statec                    U R                   $ r]   r  r   s    r   __getstate__NonDictState.__getstate__O  s    zzr   c                    Xl         g r]   r  )r   r  s     r   __setstate__NonDictState.__setstate__R  s    
r   r  N)r    rd   )r  rd   r    r!   )r#   r$   r%   r&   r   r  r  r'   r(   r   r   r  r  L  s    Jr   r  _CircularTupleTypec                  x    \ rS rSrSS jrSS jrSS jrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSS jrSrg)AOTTestsiY  c           
         SSSS[        SSS5      SS[        R                  S-   S [        4
n[        R
                  " [        R                  " U5      5      nU R                  X5        g )	Nr+   g       @y              @Tr>   r   helloworld)slicesysmaxsizeEllipsisr	   unjellyFromSourcejellyToSourcero   )r   rU   rtObjs      r   test_simpleTypesAOTTests.test_simpleTypesZ  sb    !QNKK!O
 %%c&7&7&<=$r   c                ^   [        5       n[        5       nUR                  Ul        Xl        [        R
                  " [        R                  " U5      5      R                  R                  nU R                  [        R                  " U5      R                  [        R                  " U5      5        g r]   )r   r   r   r   r	   r  r  ro   _selfOfMethodr   _classOfMethod)r   r   r   im_s       r   test_methodSelfIdentity AOTTests.test_methodSelfIdentityj  ss    CCII	##C$5$5a$89;;CC**3/993;M;Mc;RSr   c                0   [        5       n[        5       nUR                  Ul        Xl        [        R                  n[        ? U R	                  [
        [        R                  [        R                  " U5      5        U[        l        g! U[        l        f = f)z
If a class change after an instance has been created,
L{aot.unjellyFromSource} shoud raise a C{TypeError} when trying to
unjelly the instance.
N)	r   r   r   r   assertRaisesr   r	   r  r  )r   r   r   savedbmethods       r   test_methodNotSelfIdentity#AOTTests.test_methodNotSelfIdentityr  sh     CCII	yyI	%i)>)>@Q@QRS@TU$AIAIs   9B Bc                l     " S S5      nU R                  [        [        R                  U" 5       5        g)z
L{aot.jellyToSource} should raise a C{TypeError} when trying to jelly
an unknown type without a C{__dict__} property or C{__getstate__}
method.
c                  <    \ rS rSr\SS j5       r\SS j5       rSrg)2AOTTests.test_unsupportedType.<locals>.UnknownTypei  c                    [        5       er]   AttributeErrorr   s    r   __dict__;AOTTests.test_unsupportedType.<locals>.UnknownType.__dict__      $&&r   c                    [        5       er]   r+  r   s    r   r  ?AOTTests.test_unsupportedType.<locals>.UnknownType.__getstate__  r/  r   r(   Nr   )r#   r$   r%   r&   propertyr-  r  r'   r(   r   r   UnknownTyper)    s(    ' ' ' 'r   r3  N)r#  r   r	   r  )r   r3  s     r   test_unsupportedTypeAOTTests.test_unsupportedType  s(    	' 	' 	)S%6%6Fr   c                   [         R                  " 5       R                  nSUS.nSSSSSSSS	S	-  [        [         R                  U[        /n[        U5      nUR                  U5        UR                  U5        UR                  U5        [         R                  " [         R                  " X3/5      5      nUS
   US   L d   eUS   S
S US
S :X  d   eg )Nr  )r  methodr+   r>   r   zhe	llo

"x world!u   goodbye 
	တ world!g      ?d   r      )	r	   
AOTJellier	jellyToAOr   r   tupleappendr  r  )r   ajdltujs         r   test_basicIdentityAOTTests.test_basicIdentity  s     ^^'',"'HNN
 !H			""3#4#4aV#<=!u1~~!uQqzQqV###r   c                    [        5       nSUl        [        R                  " [        R                  " U5      5      R                  UR                  :X  d   eg )Nz	meringue!)r  r  r	   r  r  )r   r   s     r   test_nonDictStateAOTTests.test_nonDictState  s>    N$$S%6%6q%9:@@AGGKKKr   c                    [         R                  " [         R                  " [        5       5      5      nU R	                  U[
        5        g)zk
L{aot.jellyToSource} and L{aot.unjellyFromSource} honor functions
registered in the pickle copy registry.
N)r	   r  r  r   r   r   )r   rB  s     r   test_copyRegAOTTests.test_copyReg  s3    
 ""3#4#4^5E#FGb"67r   c                :   [        [        / 5      5      n[        R                  " U5      n[        R                  " U5      nUR                  UL d   eUR                  R
                  UR
                  L d   eUR                  UR                  R                  Ld   eg r]   )r   r	   
jellyToAOTunjellyFromAOTr   r   r   )r   r   j1ojs       r   test_funkyReferencesAOTTests.test_funkyReferences  sq    -+,^^A#ttrzzttvv~~tt24466!!!r   c                   / nUS4nUR                  U5        [        R                  " U5      n[        R                  " U5      nU R	                  US   [
        5        U R                  US   S   U5        U R                  US   S   S5        g)zC
L{aot.jellyToAOT} can persist circular references through tuples.
i  r   r+   N)r=  r	   rL  rM  r   r<  assertIsro   )r   r@  rA  rN  rO  s        r   test_circularTupleAOTTests.test_circularTuple  s}     !#I	^^A#beU+beAh#Aq4(r   c                    U R                  [        R                  " SS/ 005      [        R                  " S5      5        g)z*
The generated serialization is indented.
r  r  z|                app={
                  'hello':{
                    'world':[],
                    },
                  }N)ro   r	   r  textwrapdedentr   s    r   testIndentifyAOTTests.testIndentify  s:     	w"67OO
	
r   r(   Nr   )r#   r$   r%   r&   r  r   r%  r4  rC  rF  rI  rP  rT  rY  r'   r(   r   r   r  r  Y  s7    % T%"G$$6L
8")
r   r  c                  J    \ rS rSrSrS
S jrS
S jrS
S jrS
S jrS
S jr	Sr
g	)CrefUtilTestsi  z
Tests for L{crefutil}.
c                t    [         R                  " 0 5      nU R                  [        UR                  SS5        g)z?
L{crefutil._DictKeyAndValue} only support keys C{0} and C{1}.
r>   r   N)r
   _DictKeyAndValuer#  RuntimeError__setitem__r   r?  s     r   test_dictUnknownKey!CrefUtilTests.test_dictUnknownKey  s,     %%b),q!<r   c                |    [         R                  " 5       nSUS'   U R                  [        UR                  SS5        g)z9
L{crefutil._Defer} can be assigned a key only one time.
r+   r   N)r
   _Deferr#  r_  r`  ra  s     r   test_deferSetMultipleTimes(CrefUtilTests.test_deferSetMultipleTimes  s1     OO!,q!<r   c                    [         R                  " / SQ[        5      nU R                  [        UR
                  0 S5        g)z
A L{crefutil._Container} where all of its elements are known at
construction time is nonsensical and will result in errors in any call
to addDependant.
)r+   r>   r   z	ignore-meN)r
   
_Containerlistr#  AssertionErroraddDependant)r   	containers     r   &test_containerWhereAllElementsAreKnown4CrefUtilTests.test_containerWhereAllElementsAreKnown  s0     ''	48	.)*@*@"kRr   c                ~    U R                  [        [        5       R                  [        R
                  " 5       S5        g)z
If a dictionary key contains a circular reference (which is probably a
bad practice anyway) it will be resolved by a
L{crefutil._DictKeyAndValue}, not by placing a L{crefutil.NotKnown}
into a dictionary key.
valueN)r#  rk  dictr`  r
   NotKnownr   s    r   .test_dontPutCircularReferencesInDictionaryKeys<CrefUtilTests.test_dontPutCircularReferencesInDictionaryKeys  s,     	DF..0A0A0CW	
r   c                    U R                  [        [        R                  " S[        R                  " 5       [
        5      5        g)z
L{crefutil._InstanceMethod} raises L{AssertionError} to indicate it
should not be called.  This should not be possible with any of its API
clients, but is provided for helping to debug.
no_nameN)r#  rk  r
   _InstanceMethodrs  r   r   s    r   *test_dontCallInstanceMethodsThatArentReady8CrefUtilTests.test_dontCallInstanceMethodsThatArentReady  s0     	$$Y0A0A0CTJ	
r   r(   Nr   )r#   r$   r%   r&   r   rb  rf  rn  rt  ry  r'   r(   r   r   r\  r\    s!    ==S	
	
r   r\  )r   r   r    z,tuple[type[CopyRegisteredLoaded], tuple[()]]r   )1
__future__r   copyregr   r1   r  rW  typingr   r   r   r   typing_extensionsr   twisted.persistedr	   r
   r   twisted.trialr   twisted.trial.unittestr   r   r3   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  re   r  r  r\  	testCasesr(   r   r   <module>r     sr   #  	  
  - - & 4 3 " +n&8 n&b	(( 		f.. 		, 		35L 	"
8 "
J&"" 

*X 
* 	- 	-
- 
- 	$ ~3 4  	2H 2 4h 4(   % 4c 9:; H
x H
V1
H 1
h >=9	r   