o
    ›¨Êh�!  ã                   @   sò   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d�ZG dd„ de!ƒZ"G dd„ dƒZ#G d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                   @   s   e Zd ZdZdS )ÚSentinelzSignifies the end of something.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   úP/var/www/html/env/lib/python3.10/site-packages/celery/contrib/testing/manager.pyr      s    r   c                   @   s  e Zd ZdZ		d=dd„Zd>dd	„Zd
d„ Z									d?dd„Z			d@dd„Zdd„ Z	dAdd„Z
dBdd„ZdCd d!„ZdCd"d#„Z		$dDd%d&„Z		'dEd(d)„Z		*dFd+d,„Z	dCd-d.„Zed/d0„ ƒZdCd1d2„Zd3d4„ Zd5d6„ ZdCd7d8„Zd9d:„ Zd;d<„ ZdS )GÚManagerMixinz.Mixin that adds :class:`Manager` capabilities.ç      œ@FNc                 C   sF   |d u rt jn|| _|d u r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"   r   r   r   Ú_init_manager   s
   
zManagerMixin._init_managerú-c                 C   s   t |› |› �| jd� d S )N)Úfile)Úprintr!   )r)   ÚsÚsepr   r   r   Úremark(   s   zManagerMixin.remarkc                 C   s   dd„ |D ƒS )Nc                 S   s    g | ]}|j |jjvr|j ‘qS r   )ÚidÚbackendÚ_cache)Ú.0Úresr   r   r   Ú
<listcomp>.   s     z0ManagerMixin.missing_results.<locals>.<listcomp>r   )r)   Úrr   r   r   Úmissing_results,   s   zManagerMixin.missing_resultsÚthingr   é
   çš™™™™™¹?ç      à?ç      @c              	      s@   |si n|}‡ ‡‡‡fdd„}ˆj ||f||||||	dœ|¤ŽS )z‹Wait for event to happen.

        The `catch` argument specifies the exception that means the event
        has not happened yet.
        c                    s>   t |ƒ}ˆrˆ tjˆ t|ddƒ| d�¡ ˆrˆ| ||ƒ |S )NÚinú )ÚwhenÚexc)ÚnextÚwarnÚE_STILL_WAITINGÚformatr   )rA   Ú	intervalsÚretriesÚinterval©ÚdescÚemit_warningÚerrbackr)   r   r   Úon_errorG   s   ÿz'ManagerMixin.wait_for.<locals>.on_error)ÚargsÚkwargsrL   Úmax_retriesÚinterval_startÚinterval_stepr   )r)   ÚfunÚcatchrJ   rN   rO   rL   rP   rQ   rR   Úinterval_maxrK   ÚoptionsrM   r   rI   r   Úwait_for0   s   
ÿüûzManagerMixin.wait_foré   ç{®Gáz”?ç      ð?c	           
   
   K   s2   z| j ||||||||d�W S  |y   Y dS w )z;Make sure something does not happen (at least for a while).)rJ   rP   rQ   rR   rU   rK   zShould not have happened: N)rW   ÚAssertionError)
r)   rS   rT   rJ   rP   rQ   rR   rU   rK   rV   r   r   r   Úensure_not_for_a_whileY   s   ýÿz#ManagerMixin.ensure_not_for_a_whilec                 O   s   t |i |¤ŽS r   r   )r)   rN   rO   r   r   r   r   j   ó   zManagerMixin.retry_over_timec           	         s  | j rd S t|tƒs| j |g¡}g ‰ ‡ fdd„}|rt|ƒntdƒD ]d}g ˆ d d …< z|jd
||dœ|¤ŽW   S  tjt	fyl } z$|  
|¡}|  d t|ƒtˆ ƒ t|ƒtd |¡ƒ|¡d¡ W Y d }~q#d }~w | jy‡ } z|  d|›�d¡ W Y d }~q#d }~ww td	ƒ‚)Nc                    s   ˆ   | ¡ d S r   )Úappend)Útask_idÚvalue©Úreceivedr   r   Ú	on_resultt   r]   z$ManagerMixin.join.<locals>.on_resultr   )ÚcallbackÚ	propagatez#Still waiting for {}/{}: [{}]: {!r}z, ú!zjoin: connection lost: z!Test failed: Missing task resultsr   )r(   Ú
isinstancer   r#   Úranger   ÚgetÚsocketÚtimeoutr   r8   r0   rE   Úlenr   Újoinr&   r[   )	r)   r7   re   rP   rO   rc   ÚirA   Úwaiting_forr   ra   r   rm   m   s2   

þý€€ÿzManagerMixin.joinç      @c                 C   s   | j jj|d�S ©N©rk   )r#   ÚcontrolÚinspect)r)   rk   r   r   r   rt   †   s   zManagerMixin.inspectc                 c   s(   � |   |¡j|Ž p
i }| ¡ E d H  d S r   )rt   Ú
query_taskÚitems)r)   Úidsrk   Útasksr   r   r   Úquery_tasks‰   s   €zManagerMixin.query_tasksc           	      C   sH   t tƒ}| j||d�D ]\}}| ¡ D ]\}\}}||  |¡ qq|S rq   )r   Úsetry   rv   Úadd)	r)   rw   rk   r   ÚhostnameÚreplyr_   ÚstateÚ_r   r   r   Úquery_task_states�   s   ÿzManagerMixin.query_task_statesú waiting for tasks to be acceptedc                 K   ó   | j | j|f||dœ|¤ŽS ©N)rH   rJ   )Úassert_task_worker_stateÚis_accepted©r)   rw   rH   rJ   Úpolicyr   r   r   Úassert_accepted”   ó   ÿÿÿzManagerMixin.assert_acceptedú waiting for tasks to be receivedc                 K   r‚   rƒ   )r„   Úis_receivedr†   r   r   r   Úassert_receivedš   r‰   zManagerMixin.assert_receivedú,waiting for tasks to be started or completedc                 K   r‚   rƒ   )Úassert_task_state_from_resultÚis_result_task_in_progress)r)   Úasync_resultsrH   rJ   r‡   r   r   r   Ú,assert_result_tasks_in_progress_or_completed    s   þýýz9ManagerMixin.assert_result_tasks_in_progress_or_completedc                 K   ó$   | j t| j|||d�tffi |¤ŽS rq   ©rW   r   Útrue_or_raiser   )r)   rS   ÚresultsrH   r‡   r   r   r   rŽ   ­   s   þþz*ManagerMixin.assert_task_state_from_resultc                    s"   t jt jf‰ t‡ fdd„| D ƒƒS )Nc                 3   s   � | ]}|j ˆ v V  qd S r   )r~   )r4   Úresult©Úpossible_statesr   r   Ú	<genexpr>·   s   € z:ManagerMixin.is_result_task_in_progress.<locals>.<genexpr>)r   ÚSTARTEDÚSUCCESSÚall)r•   rO   r   r—   r   r�   ´   s   z'ManagerMixin.is_result_task_in_progressc                 K   r’   rq   r“   )r)   rS   rw   rH   r‡   r   r   r   r„   ¹   s   þþz%ManagerMixin.assert_task_worker_statec                 K   s   | j g d¢|fi |¤ŽS )N)ÚreservedÚactiveÚready©Ú_ids_matches_state©r)   rw   rO   r   r   r   r‹   ¿   s
   ÿÿzManagerMixin.is_receivedc                 K   s   | j ddg|fi |¤ŽS )Nrž   rŸ   r    r¢   r   r   r   r…   Ã   s   zManagerMixin.is_acceptedc                    s&   | j ||d�‰t‡ ‡fdd„|D ƒƒS )Nrr   c                 3   s4   � | ]‰ t ‡ fd d„‡fdd„ˆD ƒD ƒƒV  qdS )c                 3   s   � | ]}ˆ |v V  qd S r   r   )r4   r.   ©Útr   r   r™   É   ó   € z<ManagerMixin._ids_matches_state.<locals>.<genexpr>.<genexpr>c                    s   g | ]}ˆ | ‘qS r   r   )r4   Úkr   r   r   r6   É   s    z=ManagerMixin._ids_matches_state.<locals>.<genexpr>.<listcomp>N)Úany)r4   ©Úexpected_statesr   r£   r   r™   È   s
   € "ÿ
ÿz2ManagerMixin._ids_matches_state.<locals>.<genexpr>)r€   rœ   )r)   r©   rw   rk   r   r¨   r   r¡   Æ   s   þzManagerMixin._ids_matches_statec                 O   s   ||i |¤Ž}|st ƒ ‚|S r   )r   )r)   rS   rN   rO   r5   r   r   r   r”   Í   s   zManagerMixin.true_or_raisec              	   C   s°   | j j}| j  ¡ �E}	 |j|d�}|dkrnq| ¡ }||_	 ztdd„ | ¡  ¡ D ƒƒ}W n	 ty7   Y nw |dkr=n	qW d   ƒ d S W d   ƒ d S 1 sQw   Y  d S )NT)r$   r   c                 s   s   � | ]}t |ƒV  qd S r   )rl   )r4   r¤   r   r   r   r™   â   r¥   z/ManagerMixin.wait_until_idle.<locals>.<genexpr>)	r#   rs   r$   Úpurgert   Úsumrž   Úvaluesr   )r)   rs   r$   r   rt   r   r   r   Úwait_until_idleÓ   s,   ýþùð"îzManagerMixin.wait_until_idle)r   FNN)r+   )	r9   r   NNr:   r;   r<   r=   F)r9   rX   r;   rY   rZ   F)Fr:   )rp   )r<   )r<   r�   )r<   rŠ   )r<   r�   )r   r   r   r   r*   r0   r8   rW   r\   r   rm   rt   ry   r€   rˆ   rŒ   r‘   rŽ   Ústaticmethodr�   r„   r‹   r…   r¡   r”   r­   r   r   r   r   r      sZ    
þ


ô*
ý




ÿ
ÿ	
ü
ÿ


r   c                   @   s   e Zd ZdZdd„ ZdS )ÚManagerz(Test helpers for task integration tests.c                 K   s   || _ | jdi |¤Ž d S )Nr   )r#   r*   )r)   r#   rO   r   r   r   Ú__init__í   s   zManager.__init__N)r   r   r   r   r°   r   r   r   r   r¯   ê   s    r¯   )%r   rj   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_secondsrD   Ú	Exceptionr   r   r¯   r   r   r   r   Ú<module>   s(      P