
    h                        S r SSKJr  SSKJrJr  SSKJr  SSKJ	r	  SSK
Jr   " S S5      r " S	 S
5      r " S S5      r " S S5      r " S S\5      r\" \R"                  5       " S S\5      5       r " S S\R&                  5      rS rg)z
Utility classes for spread.
    )implementer)defer
interfaces)basic)Failure)pbc                        \ rS rSrS rS rSrg)LocalMethod   c                     Xl         X l        g Nlocalname)selfr   r   s      Z/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/twisted/spread/util.py__init__LocalMethod.__init__   s    
	    c                 V    U R                   R                  " U R                  /UQ70 UD6$ r   )r   
callRemoter   )r   argskws      r   __call__LocalMethod.__call__   s%    zz$$TYY<<<<r   r   N)__name__
__module____qualname____firstlineno__r   r   __static_attributes__ r   r   r
   r
      s    =r   r
   c                   (    \ rS rSrSrSrS rS rSrg)LocalAsRemote   zF
A class useful for emulating the effects of remote behavior locally.
   c                 N   [        U SU-   5      (       a  [        U SU-   5      " U0 UD6$  [        U SU-   5      n[        R                  " U" U0 UD65      $ ! [         aD    [        5       nU R                  (       a  UR                  5         [        R                  " U5      s $ f = f)a@  
Call a specially-designated local method.

self.callRemote('x') will first try to invoke a method named
sync_x and return its result (which should probably be a
Deferred).  Second, it will look for a method called async_x,
which will be called and then have its result (or Failure)
automatically wrapped in a Deferred.
sync_async_)	hasattrgetattrr   succeedBaseExceptionr   reportAllTracebacksprintTracebackfail)r   r   r   r   methodfs         r   r   LocalAsRemote.callRemote#   s     44((440$="==	!T8d?3F==!4!455 	!	A''  "::a= 		!s   *A AB$#B$c                     [        X5      $ r   )r
   )r   r   s     r   remoteMethodLocalAsRemote.remoteMethod8   s    4&&r   r!   N)	r   r   r   r   __doc__r-   r   r4   r    r!   r   r   r#   r#      s     !*'r   r#   c                   .    \ rS rSrSrSS jrS rS rSrg)	LocalAsyncForwarder<   z<
A class useful for forwarding a locally-defined interface.
c                 X    UR                  U5      (       d   eXl        X l        X0l        g r   )
providedBy	forwardedinterfaceClassfailWhenNotImplemented)r   r<   r=   r>   s       r   r   LocalAsyncForwarder.__init__A   s*    ((3333",&<#r   c                 :    [        U R                  U5      " U0 UD6$ r   )r*   r<   )r   r0   r   r   s       r   _callMethodLocalAsyncForwarder._callMethodG   s    t~~v.;;;r   c                 ,   U R                   R                  U5      (       a'  [        R                  " U R                  U/UQ70 UD6nU$ U R
                  (       a'  [        R                  " [        [        SU-  5      5      $ [        R                  " S 5      $ )NzNo Such Method in Interface: %s)
r=   queryDescriptionForr   maybeDeferredrA   r>   r/   r   NotImplementedErrorr+   )r   r0   r   r   results        r   r   LocalAsyncForwarder.callRemoteJ   s}    226::(()9)96ODOBOFM((::+-NQW-WX  ==&&r   )r>   r<   r=   N)r   )	r   r   r   r   r6   r   rA   r   r    r!   r   r   r8   r8   <   s    =<	'r   r8   c                   :    \ rS rSrSrS
S jrS rS rS rS r	S	r
g)PagerV   z-
I am an object which pages out information.
Nc                     [        U5      (       a  X l        X0l        X@l        OSU l        SU l        Xl        UR                  R                  U 5        g)zk
Create a pager with a Reference to a remote collector and
an optional callable to invoke upon completion.
Nr%   )callablecallbackcallbackArgscallbackKeyword_stillPaging	collectorbrokerregisterPageProducer)r   rR   rN   r   r   s        r   r   Pager.__init__[   sH    
 H$M $#%  DM"--d3r   c                     U R                   (       dM  U R                  R                  SSS9  U R                  b&  U R                  " U R                  0 U R
                  D6  U R                   $ )%
(internal) Method called by Broker.
endedPagingFpbanswer)rQ   rR   r   rN   rO   rP   r   s    r   stillPagingPager.stillPagingj   sW       NN%%me%D}}(t00ID4H4HI   r   c                 V    U R                   R                  SU R                  5       SS9  g)rW   gotPageFrY   N)rR   r   nextPager[   s    r   sendNextPagePager.sendNextPaget   s#     	!!)T]]_u!Mr   c                     [        5       e)z?
Override this to return an object to be sent to my collector.
)rF   r[   s    r   r`   Pager.nextPagez   s     "##r   c                     SU l         g)z$
Call this when you're done paging.
r   N)rQ   r[   s    r   
stopPagingPager.stopPaging   s     r   )rQ   rN   rO   rP   rR   r   )r   r   r   r   r6   r   r\   ra   r`   rf   r    r!   r   r   rJ   rJ   V   s!    4!N$r   rJ   c                   (    \ rS rSrSrSS jrS rSrg)StringPager   z2
A simple pager that splits a string into chunks.
Nc                 `    X l         SU l        X0l        [        R                  " XU/UQ70 UD6  g )Nr   )stringpointer	chunkSizerJ   r   )r   rR   strn   rN   r   r   s          r   r   StringPager.__init__   s+    "t>4>2>r   c                 
   U R                   U R                  U R                  U R                  -    nU =R                  U R                  -  sl        U R                  [        U R                   5      :  a  U R	                  5         U$ r   )rl   rm   rn   lenrf   r   vals     r   r`   StringPager.nextPage   sY    kk$,,)FG&<<3t{{++OO
r   )rn   rm   rl   )i    N)r   r   r   r   r6   r   r`   r    r!   r   r   ri   ri      s    ?r   ri   c                   @    \ rS rSrSrSS jrS rS rS rS r	S	 r
S
rg)	FilePager   z;
Reads a file in chunks and sends the chunks as they come.
Nc                 j    / U l         [        R                  " XU/UQ70 UD6  U R                  U5        g r   )chunksrJ   r   startProducing)r   rR   fdrN   r   r   s         r   r   FilePager.__init__   s/    t>4>2>Br   c                    ^  [         R                  " 5       R                  UT 5      T l        T R                  R	                  U 4S j5        g )Nc                 $   > TR                  5       $ r   )rf   )xr   s    r   <lambda>*FilePager.startProducing.<locals>.<lambda>   s    (9r   )r   
FileSenderbeginFileTransferdeferredaddBoth)r   r|   s   ` r   r{   FilePager.startProducing   s3    ((*<<RF9:r   c                 T    Xl         U(       d  U R                   R                  5         g g r   )producerresumeProducing)r   r   	streamings      r   registerProducerFilePager.registerProducer   s     MM))+ r   c                     S U l         g r   )r   r[   s    r   unregisterProducerFilePager.unregisterProducer   s	    r   c                 :    U R                   R                  U5        g r   )rz   append)r   chunks     r   writeFilePager.write   s    5!r   c                     U R                   (       d  gU R                   R                  S5      nU R                  R                  5         U R                  R                  SUSS9  g)z4
Get the first chunk read and send it to collector.
Nr   r_   FrY   )rz   popr   r   rR   r   rs   s     r   ra   FilePager.sendNextPage   sI     {{kkooa %%'!!)S5!Ar   )rz   r   r   r   )r   r   r   r   r6   r   r{   r   r   r   ra   r    r!   r   r   rw   rw      s&     
;,
"Br   rw   c                   *    \ rS rSrSrS rS rS rSrg)CallbackPageCollector   z
I receive pages from the peer. You may instantiate a Pager with a
remote reference to me. I will call the callback with a list of pages
once they are all received.
c                     / U l         Xl        g r   )pagesrN   )r   rN   s     r   r   CallbackPageCollector.__init__   s    
 r   c                 :    U R                   R                  U5        g r   )r   r   )r   pages     r   remote_gotPage$CallbackPageCollector.remote_gotPage   s    

$r   c                 :    U R                  U R                  5        g r   rN   r   r[   s    r   remote_endedPaging(CallbackPageCollector.remote_endedPaging   s    djj!r   r   N)	r   r   r   r   r6   r   r   r   r    r!   r   r   r   r      s    ! "r   r   c                     [         R                  " 5       nU R                  " U[        UR                  5      /UQ70 UD6  U$ )zf
A utility method that will call a remote method which expects a
PageCollector as the first argument.
)r   Deferredr   r   rN   )referenceable
methodNamer   r   ds        r   getAllPagesr      s:    
 	AZ)>qzz)JXTXUWXHr   N)r6   zope.interfacer   twisted.internetr   r   twisted.protocolsr   twisted.python.failurer   twisted.spreadr   r
   r#   r8   rJ   ri   	IConsumerrw   Referenceabler   r   r!   r   r   <module>r      s    ' . # * = =' '@' '4. .b% & Z!!"!B !B #!BJ"B,, "$r   