o
    wvXjæ  ã                   @   sä   d Z ddlmZmZm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 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 ddlmZ dZe
edd�ZG dd„ deƒZG dd„ deƒZ G dd„ de ƒZ!dS )zIntegration testing utilities.é    )Úabsolute_importÚprint_functionÚunicode_literalsN)Údefaultdict)Úpartial)Úcount©Úretry_over_time©Ústates)ÚTimeoutError)Úitems)Ú	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   ú[/var/www/html/myproject/venv/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	d?dd„Z
d@dd„ZdAd d!„ZdAd"d#„Z		$dBd%d&„Z		'dCd(d)„Z		*dDd+d,„Z	dAd-d.„Zed/d0„ ƒZdAd1d2„Zd3d4„ Zd5d6„ ZdAd7d8„Zd9d:„ ZdS )EÚ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 d ||¡| jd� d S )Nz{0}{1})Úfile)ÚprintÚformatr   )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_WAITINGr*   r   )r>   Ú	intervalsÚretriesÚinterval©ÚdescÚemit_warningÚerrbackr%   r   r   Úon_error>   s   ÿz'ManagerMixin.wait_for.<locals>.on_error)ÚargsÚkwargsrH   Úmax_retriesÚinterval_startÚinterval_stepr   )r%   ÚfunÚcatchrF   rJ   rK   rH   rL   rM   rN   Úinterval_maxrG   ÚoptionsrI   r   rE   r   Úwait_for1   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).)rF   rL   rM   rN   rQ   rG   zShould not have happened: {0}N)rS   ÚAssertionErrorr*   )
r%   rO   rP   rF   rL   rM   rN   rQ   rG   rR   r   r   r   Úensure_not_for_a_whileP   s   ýÿz#ManagerMixin.ensure_not_for_a_whilec                 O   s   t |i |¤ŽS r   r   )r%   rJ   rK   r   r   r   r	   a   ó   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_resultk   rY   z$ManagerMixin.join.<locals>.on_resultr   )ÚcallbackÚ	propagatez'Still waiting for {0}/{1}: [{2}]: {3!r}z, ú!zjoin: connection lost: {0!r}z!Test failed: Missing task resultsr   )r$   Ú
isinstancer   r   Úranger   ÚgetÚsocketÚtimeoutr   r5   r-   r*   Úlenr   Újoinr"   rW   )	r%   r4   ra   rL   rK   r_   Úir>   Úwaiting_forr   r]   r   ri   d   s2   

þý€€ÿzManagerMixin.joinç      @c                 C   s   | j jj|d�S ©N©rg   )r   ÚcontrolÚinspect)r%   rg   r   r   r   rp   }   s   zManagerMixin.inspectc                 c   s*   � t |  |¡j|Ž pi ƒD ]}|V  qd S r   )r   rp   Ú
query_task)r%   Úidsrg   Úreplyr   r   r   Úquery_tasks€   s   €ÿzManagerMixin.query_tasksc           	      C   sH   t tƒ}| j||d�D ]\}}t|ƒD ]\}\}}||  |¡ qq|S rm   )r   Úsetrt   r   Úadd)	r%   rr   rg   r   Úhostnamers   r[   Ú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)rD   rF   ©Úassert_task_worker_stateÚis_accepted©r%   rr   rD   rF   Úpolicyr   r   r   Úassert_accepted‹   ó   ÿÿÿzManagerMixin.assert_acceptedú waiting for tasks to be receivedc                 K   r|   r}   r~   r�   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_resultsrD   rF   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 rm   ©rS   r   Útrue_or_raiser   )r%   rO   ÚresultsrD   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   )rx   )r1   Úresult©Úpossible_statesr   r   Ú	<genexpr>®   s   € z:ManagerMixin.is_result_task_in_progress.<locals>.<genexpr>)r   ÚSTARTEDÚSUCCESSÚall)r�   rK   r   r‘   r   r‰   «   s   z'ManagerMixin.is_result_task_in_progressc                 K   rŒ   rm   r�   )r%   rO   rr   rD   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%   rr   rK   r   r   r   Úis_received¶   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 )Nrn   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   )r1   r+   ©Útr   r   r“   À   s   € z<ManagerMixin._ids_matches_state.<locals>.<genexpr>.<genexpr>c                    s   g | ]}ˆ | ‘qS r   r   )r1   Úkr
   r   r   r3   À   s    z=ManagerMixin._ids_matches_state.<locals>.<genexpr>.<listcomp>N)Úany)r1   ©Úexpected_statesr   rž   r   r“   ¿   s
   € "ÿ
ÿz2ManagerMixin._ids_matches_state.<locals>.<genexpr>)rz   r–   )r%   r£   rr   rg   r   r¢   r   r›   ½   s   þzManagerMixin._ids_matches_statec                 O   s   ||i |¤Ž}|st ƒ ‚|S r   )r   )r%   rO   rJ   rK   r2   r   r   r   rŽ   Ä   s   zManagerMixin.true_or_raise)r   FNN)r'   )	r6   r   NNr7   r8   r9   r:   F)r6   rT   r8   rU   rV   F)Fr7   )rl   )r9   )r9   r{   )r9   r…   )r9   r‡   )r   r   r   r   r&   r-   r5   rS   rX   r	   ri   rp   rt   rz   rƒ   r†   r‹   rˆ   Ústaticmethodr‰   r   r�   r€   r›   rŽ   r   r   r   r   r      sL    
þ


ý 
ý




ÿ
ÿ	
ü
ÿ


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   rK   r   r   r   Ú__init__Î   s   zManager.__init__N)r   r   r   r   r¦   r   r   r   r   r¥   Ë   s    r¥   )"r   Ú
__future__r   r   r   rf   r   Úcollectionsr   Ú	functoolsr   Ú	itertoolsr   Úkombu.utils.functionalr	   Úceleryr   Úcelery.exceptionsr   Úcelery.fiver   Úcelery.resultr   Úcelery.utils.textr   Úcelery.utils.timer   Ú_humanize_secondsrA   Ú	Exceptionr   Úobjectr   r¥   r   r   r   r   Ú<module>   s(     0