
    `f!                     &   d 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
mZmZmZmZ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mZ ddlmZ ddlmZ dZ  eed          Z G d de!          Z" G d d          Z# G d de#          Z$dS )zIntegration testing utilities.    N)defaultdict)partial)count)AnyCallableDictSequenceTextIOTuple)ContentDisallowedretry_over_time)states)TimeoutError)AsyncResult	ResultSet)truncate)humanize_secondsz4Still waiting for {0}.  Trying again {when}: {exc!r}T)microsecondsc                       e Zd ZdZdS )SentinelzSignifies the end of something.N)__name__
__module____qualname____doc__     P/var/www/html/env/lib/python3.11/site-packages/celery/contrib/testing/manager.pyr   r      s        ))))r   r   c                       e Zd ZdZ	 	 d(dZd)dZd Z	 	 	 	 	 	 	 	 	 d*dZ	 	 	 d+dZd Z	d,dZ
d-dZd.dZd.dZ	 	 d/dZ	 	 d0dZ	 	 d1dZ	 d.d Zed!             Zd.d"Zd# Zd$ Zd.d%Zd& Zd' ZdS )2ManagerMixinz.Mixin that adds :class:`Manager` capabilities.      @FNc                     |t           j        n|| _        |t           j        n|| _        | j                                        j        | _        || _        || _        d S N)	sysstdoutstderrapp
connectionrecoverable_connection_errors
connerrorsblock_timeoutno_join)selfr+   r,   r%   r&   s        r   _init_managerzManagerMixin._init_manager   sQ     %+Ncjj$*Ncjj(--//M*r   -c                 :    t          | | | j                   d S )N)file)printr%   )r-   sseps      r   remarkzManagerMixin.remark(   s%    kakk,,,,,,r   c                     d |D             S )Nc                 B    g | ]}|j         |j        j        v|j         S r   )idbackend_cache).0ress     r   
<listcomp>z0ManagerMixin.missing_results.<locals>.<listcomp>.   s+    HHH3svS[5G'G'G'G'G'Gr   r   )r-   rs     r   missing_resultszManagerMixin.missing_results,   s    HH!HHHHr   thingr   
   皙?      ?      @c           
      R     |si n|} fd}  j         ||f||||||	d|S )zWait for event to happen.

        The `catch` argument specifies the exception that means the event
        has not happened yet.
        c           
          t          |          }r?                    t                              t	          |dd          |                      r | ||           |S )Nin )whenexc)nextwarnE_STILL_WAITINGformatr   )rJ   	intervalsretriesintervaldescemit_warningerrbackr-   s       r   on_errorz'ManagerMixin.wait_for.<locals>.on_errorG   sz    IH 		/00/$DD# 1       0Xw///Or   )argskwargsrT   max_retriesinterval_startinterval_stepr   )r-   funcatchrR   rV   rW   rT   rX   rY   rZ   interval_maxrS   optionsrU   s   `  `  `    `  r   wait_forzManagerMixin.wait_for0   s    * "-v	 	 	 	 	 	 	 	 $t#
f+)	
 

 
 
 	
r      {Gz?      ?c	           
      V    	 |                      ||||||||          S # |$ r Y dS w xY w)z;Make sure something does not happen (at least for a while).)rR   rX   rY   rZ   r]   rS   zShould not have happened: N)r_   AssertionError)
r-   r[   r\   rR   rX   rY   rZ   r]   rS   r^   s
             r   ensure_not_for_a_whilez#ManagerMixin.ensure_not_for_a_whileY   sZ    		F==U;-]) !   
  	 	 	DD	s    ((c                     t          |i |S r#   r   )r-   rV   rW   s      r   r   zManagerMixin.retry_over_timej   s    ////r   c                   	 | j         rd S t          |t                    s| j                            |g          }g 		fd}|rt	          |          nt          d          D ]}g 	d d <   	  |j        d	||d|c S # t          j        t          f$ r}| 
                    |          }|                     d                    t          |          t          	          z
  t          |          t          d                    |                    |          d           Y d }~d }~w| j        $ r#}|                     d|d           Y d }~d }~ww xY wt#          d          )
Nc                 2                         |            d S r#   )append)task_idvaluereceiveds     r   	on_resultz$ManagerMixin.join.<locals>.on_resultt   s    OOG$$$$$r   r   )callback	propagatez#Still waiting for {}/{}: [{}]: {!r}z, !zjoin: connection lost: z!Test failed: Missing task resultsr   )r,   
isinstancer   r'   ranger   getsockettimeoutr   r?   r5   rN   lenr   joinr*   rd   )
r-   r>   ro   rX   rW   rm   irJ   waiting_forrl   s
            @r   rw   zManagerMixin.joinm   s   < 	F!Y'' 	(""A3''A	% 	% 	% 	% 	% (3@{###a 	D 	DAHQQQK
DquOi9OOOOOOONL1   "221559@@AX.A ;!7!788#? ?@C       
 ? D D D=c==sCCCCCCCCD@AAAs%   ,A>>EBD$$E1EE      @c                 B    | j         j                            |          S Nru   )r'   controlinspect)r-   ru   s     r   r   zManagerMixin.inspect   s    x'''888r   c              #   |   K    |                      |          j        | pi }|                                E d {V  d S r#   )r   
query_taskitems)r-   idsru   taskss       r   query_taskszManagerMixin.query_tasks   sL      0W%%0#6<";;==         r   c                     t          t                    }|                     ||          D ]=\  }}|                                D ]#\  }\  }}||                             |           $>|S r|   )r   setr   r   add)	r-   r   ru   r   hostnamereplyrj   state_s	            r   query_task_stateszManagerMixin.query_task_states   sz    S!!#//W/EE 	+ 	+OHe',{{}} + +#%u!!'****+r    waiting for tasks to be acceptedc                 0     | j         | j        |f||d|S N)rQ   rR   )assert_task_worker_stateis_acceptedr-   r   rQ   rR   policys        r   assert_acceptedzManagerMixin.assert_accepted   8    ,t,c
,44
 
CI
 
 	
r    waiting for tasks to be receivedc                 0     | j         | j        |f||d|S r   )r   is_receivedr   s        r   assert_receivedzManagerMixin.assert_received   r   r   ,waiting for tasks to be started or completedc                 0     | j         | j        |f||d|S r   )assert_task_state_from_resultis_result_task_in_progress)r-   async_resultsrQ   rR   r   s        r   ,assert_result_tasks_in_progress_or_completedz9ManagerMixin.assert_result_tasks_in_progress_or_completed   s?     2t1+
 D
 
 -3
 
 	
r   c                 X     | j         t          | j        |||          t          ffi |S r|   r_   r   true_or_raiser   )r-   r[   resultsrQ   r   s        r   r   z*ManagerMixin.assert_task_state_from_result   sA    t}D&WhGGGK
 
!
 
 	
r   c                 j    t           j        t           j        ft          fd| D                       S )Nc              3   *   K   | ]}|j         v V  d S r#   )r   )r;   resultpossible_statess     r   	<genexpr>z:ManagerMixin.is_result_task_in_progress.<locals>.<genexpr>   s*      IIv6<?2IIIIIIr   )r   STARTEDSUCCESSall)r   rW   r   s     @r   r   z'ManagerMixin.is_result_task_in_progress   s4    !>6>:IIIIIIIIIIr   c                 X     | j         t          | j        |||          t          ffi |S r|   r   )r-   r[   r   rQ   r   s        r   r   z%ManagerMixin.assert_task_worker_state   sA    t}D&S(CCCK
 
!
 
 	
r   c                 $     | j         g d|fi |S )N)reservedactiveready_ids_matches_stater-   r   rW   s      r   r   zManagerMixin.is_received   s1    &t&+++S< <4:< < 	<r   c                 $     | j         ddg|fi |S )Nr   r   r   r   s      r   r   zManagerMixin.is_accepted   s$    &t&'':CJJ6JJJr   c                 l    |                      ||          t          fd|D                       S )Nr}   c              3   h   K   | ]+t          fd fdD             D                       V  ,dS )c              3       K   | ]}|v V  	d S r#   r   )r;   r3   ts     r   r   z<ManagerMixin._ids_matches_state.<locals>.<genexpr>.<genexpr>   s'      EE1QEEEEEEr   c                      g | ]
}|         S r   r   )r;   kr   s     r   r=   z=ManagerMixin._ids_matches_state.<locals>.<genexpr>.<listcomp>   s     D D Dq D D Dr   N)any)r;   r   expected_statesr   s    @r   r   z2ManagerMixin._ids_matches_state.<locals>.<genexpr>   sj       
 
 EEEE D D D DO D D DEEEEE
 
 
 
 
 
r   )r   r   )r-   r   r   ru   r   s    `  @r   r   zManagerMixin._ids_matches_state   sY    ''W'== 
 
 
 
 

 
 
 
 
 	
r   c                 6     ||i |}|st                      |S r#   )r   )r-   r[   rV   rW   r<   s        r   r   zManagerMixin.true_or_raise   s-    c4"6"" 	**
r   c                    | j         j        }| j                                         5 }	 |                    |          }|dk    rn|                                }||_        	 	 t          d |                                                                D                       }n# t          $ r Y nw xY w|dk    rnWd d d            d S # 1 swxY w Y   d S )NT)r(   r   c              3   4   K   | ]}t          |          V  d S r#   )rv   )r;   r   s     r   r   z/ManagerMixin.wait_until_idle.<locals>.<genexpr>   s(      JJ1AJJJJJJr   )	r'   r~   r(   purger   sumr   valuesr   )r-   r~   r(   r   r   s        r   wait_until_idlezManagerMixin.wait_until_idle   s4   ("X  "" 	j<<A:: oo''G!+GJJ0@0@0G0G0I0IJJJJJEE(   E A::	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s5   <C#=B! C!
B.+C-B..CC
C
)r!   FNN)r/   )	r@   r   NNrA   rB   rC   rD   F)r@   r`   rB   ra   rb   F)FrA   )rz   )rC   )rC   r   )rC   r   )rC   r   )r   r   r   r   r.   r5   r?   r_   re   r   rw   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r    r       s       88 8=*.   - - - -I I I '
 '
 '
 '
T :<AE>CF F F F"0 0 0B B B B29 9 9 9! ! ! !    -0?
 
 
 
 -0?
 
 
 
 ?	
 
 
 
 03
 
 
 
 J J \J
 
 
 
< < <K K K
 
 
 
      r   r    c                       e Zd ZdZd ZdS )Managerz(Test helpers for task integration tests.c                 .    || _          | j        di | d S )Nr   )r'   r.   )r-   r'   rW   s      r   __init__zManager.__init__   s(    $$V$$$$$r   N)r   r   r   r   r   r   r   r   r   r      s)        22% % % % %r   r   )%r   rt   r$   collectionsr   	functoolsr   	itertoolsr   typingr   r   r   r	   r
   r   kombu.exceptionsr   kombu.utils.functionalr   celeryr   celery.exceptionsr   celery.resultr   r   celery.utils.textr   celery.utils.timer   _humanize_secondsrM   	Exceptionr   r    r   r   r   r   <module>r      s   $ $  



 # # # # # #             ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? . . . . . . 2 2 2 2 2 2       * * * * * * 0 0 0 0 0 0 0 0 & & & & & & C C C C C CH7,4@@@ * * * * *y * * *L L L L L L L L^% % % % %l % % % % %r   