o
    wvXjý0  ã                   @   sR  d Z ddl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 dd	lmZmZmZ dd
lmZmZ ddlmZmZ ddlmZ zddlmZ W n ey[   dZY nw efZdZdZdZ dZ!ee"ƒZ#dd„ Z$dd„ Z%G dd„ deƒZ&G dd„ de'ƒZ(G dd„ de)ƒZ*ee*ƒG dd„ de'ƒƒZ+G dd„ de+ƒZ,G d d!„ d!e,ƒZ-d"S )#z0A directed acyclic graph of reusable components.é    )Úabsolute_importÚunicode_literals)Údeque)ÚEvent)Úignore_errors)Úbytes_to_str©Úsymbol_by_nameé   )Úbytes_if_py2ÚvaluesÚwith_metaclass)ÚDependencyGraphÚGraphFormatter)ÚinstantiateÚqualname)Ú
get_logger)ÚGreenletExit© )Ú	BlueprintÚStepÚStartStopStepÚConsumerStepé   é   c                 C   s   d  | j|¡S )Nz
| {0}: {1})ÚformatÚalias)ÚnsÚfmtr   r   úM/var/www/html/myproject/venv/lib/python3.10/site-packages/celery/bootsteps.pyÚ_pre"   ó   r    c                 C   s   | j  dd¡d S )NÚ.r
   éÿÿÿÿ)ÚnameÚrsplit)Úsr   r   r   Ú_label&   s   r'   c                   @   sD   e Zd ZdZdZdZddddœZdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )ÚStepFormatterz'Graph formatter for :class:`Blueprint`.u   â§‰u   âˆ˜ÚparallelogramÚ
slategray4Ú
slategray3)ÚshapeÚcolorÚ	fillcolorc                 C   s,   |od  |  |¡t|jpt|ƒ dd¡ƒ¡S )Nz{0}{1}zutf-8Úignore)r   Ú_get_prefixr   Úlabelr'   Úencode©ÚselfÚstepr   r   r   r1   5   s   ÿþzStepFormatter.labelc                 C   s   |j r| jS |jr| jS dS )NÚ )ÚlastÚblueprint_prefixÚconditionalÚconditional_prefixr3   r   r   r   r0   <   s
   zStepFormatter._get_prefixc                 K   s    |j r| jn| j}|  |||¡S ©N)r7   Úblueprint_schemeÚnode_schemeÚ	draw_node)r4   ÚobjÚattrsÚschemer   r   r   ÚnodeC   s   zStepFormatter.nodec                 K   s&   |j r
|jddd� |  ||| j|¡S )NÚnoneÚdarkseagreen3)Ú	arrowheadr-   )r7   ÚupdateÚ	draw_edgeÚedge_scheme)r4   ÚaÚbr@   r   r   r   ÚedgeG   s   zStepFormatter.edgeN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r8   r:   r<   r1   r0   rB   rK   r   r   r   r   r(   *   s    ýr(   c                   @   sê   e Zd ZdZeZdZdZdZe	ƒ Z
ddededediZ		d3dd	„Zd
d„ Zdd„ Zdd„ Zdd„ Z		d4dd„Z	d5dd„Zd6dd„Zd7dd„Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Z e!d1d2„ ƒZ"dS )8r   aÁ  Blueprint containing bootsteps that can be applied to objects.

    Arguments:
        steps Sequence[Union[str, Step]]: List of steps.
        name (str): Set explicit name for this blueprint.
        on_start (Callable): Optional callback applied after blueprint start.
        on_close (Callable): Optional callback applied before blueprint close.
        on_stopped (Callable): Optional callback applied after
            blueprint stopped.
    Nr   ÚinitializingÚrunningÚclosingÚterminatingc                 C   sT   |p
| j p
tt| ƒƒ| _ t|pg ƒt| jƒB | _|| _|| _|| _t	ƒ | _
i | _d S r;   )r$   r   ÚtypeÚsetÚdefault_stepsÚtypesÚon_startÚon_closeÚ
on_stoppedr   Úshutdown_completeÚsteps)r4   r\   r$   rX   rY   rZ   r   r   r   Ú__init__f   s   
zBlueprint.__init__c                 C   sb   t | _| jr
|  ¡  tdd„ |jD ƒƒD ]\}}|  d|j¡ |d | _| |¡ t	 
d¡ qd S )Nc                 s   s   � | ]	}|d ur|V  qd S r;   r   ©Ú.0r&   r   r   r   Ú	<genexpr>t   s   € z"Blueprint.start.<locals>.<genexpr>zStarting %sr
   z^-- substep ok)ÚRUNÚstaterX   Ú	enumerater\   Ú_debugr   ÚstartedÚstartÚloggerÚdebug)r4   ÚparentÚir5   r   r   r   rf   p   s   

üzBlueprint.startc                 C   s   | j | jpd S ©Nr   )Ústate_to_namerb   ©r4   r   r   r   Úhuman_statez   ó   zBlueprint.human_statec                 C   s(   i }|j D ]}| | |¡pi ¡ q|S r;   )r\   rF   Úinfo)r4   ri   rp   r5   r   r   r   rp   }   s   
zBlueprint.infoc                 C   s$   | j r|   ¡  | j|dddd� d S )NÚcloserR   F)Úreverse)rY   Úsend_all©r4   ri   r   r   r   rq   ƒ   s   zBlueprint.closeÚstopÚ
restartingFc                 C   s   | j ||||d� d S )N)Ú	propagate)rs   )r4   ri   ÚmethodÚdescriptionrw   r   r   r   Úrestartˆ   s   zBlueprint.restartTr   c                 C   s°   |p|  dd¡}|rt|jƒn|j}|D ]A}|rUt||d ƒ}	|	d urU|  d| ¡ |j¡ z
|	|g|¢R Ž  W q tyT }
 z|rA‚ t 	d||j|
¡ W Y d }
~
qd }
~
ww qd S )NÚ_ú z%s %s...zError on %s %s: %r)
ÚreplaceÚreversedr\   Úgetattrrd   Ú
capitalizer   Ú	Exceptionrg   Ú	exception)r4   ri   rx   ry   rr   rw   Úargsr\   r5   ÚfunÚexcr   r   r   rs   Œ   s*   
ÿ
ÿ€ý€øzBlueprint.send_allc                 C   s˜   |rdnd}| j ttfv rd S | j tks| jt|jƒkr&t| _ | j ¡  d S |  	|¡ t| _ | j
||r5dnd|dd� | jrB|  ¡  t| _ | j ¡  d S )NrS   ÚstoppingÚ	terminateru   F)ry   rw   )rb   ÚCLOSEÚ	TERMINATEra   re   Úlenr\   r[   rU   rq   rz   rZ   )r4   ri   rq   r‡   Úwhatr   r   r   ru   ž   s"   

þzBlueprint.stopc                 C   s*   z
| j j|d� W d S  ty   Y d S w )N)Útimeout)r[   ÚwaitÚIGNORE_ERRORS)r4   rŒ   r   r   r   Újoinµ   s
   ÿzBlueprint.joinc                 K   s–   |   d¡ g  }| _|  ¡  }| _|   d¡ |  |¡D ]}||fi |¤Ž}|||j< | |¡ q|   dd dd„ | jD ƒ¡¡ |D ]}| |¡ qA| S )ar  Apply the steps in this blueprint to an object.

        This will apply the ``__init__`` and ``include`` methods
        of each step, with the object as argument::

            step = Step(obj)
            ...
            step.include(obj)

        For :class:`StartStopStep` the services created
        will also be added to the objects ``steps`` attribute.
        zPreparing bootsteps.zBuilding graph...zNew boot order: {%s}z, c                 s   ó   � | ]}|j V  qd S r;   )r   r^   r   r   r   r`   Ô   ó   € z"Blueprint.apply.<locals>.<genexpr>)	rd   ÚorderÚclaim_stepsr\   Ú_finalize_stepsr$   Úappendr�   Úinclude)r4   ri   Úkwargsr’   r\   ÚSr5   r   r   r   Úapply½   s   



ÿzBlueprint.applyc                 C   s8   | j j |j j¡ | j  t|jd ƒt| jd ƒ¡ d S )Nr   r#   )ÚgraphÚadjacentrF   Úadd_edgerT   r’   )r4   Úotherr   r   r   Úconnect_withÙ   s   &zBlueprint.connect_withc                 C   s
   | j | S r;   )r\   )r4   r$   r   r   r   Ú__getitem__Ý   ó   
zBlueprint.__getitem__c                 C   s   t dd„ t| jƒD ƒd ƒS )Nc                 s   s   � | ]}|j r|V  qd S r;   )r7   ©r_   ÚCr   r   r   r`   á   ó   € z'Blueprint._find_last.<locals>.<genexpr>)Únextr   r\   rm   r   r   r   Ú
_find_lastà   s   zBlueprint._find_lastc                 C   s~   t |ƒD ]}dd„ |jD ƒ|_qtdd„ t |ƒD ƒƒ}|r=| ¡ D ]}t|ƒ}|j| jvr2|||j< | |j¡ q!|sd S d S )Nc                 S   s   g | ]}t |ƒ‘qS r   r   )r_   Údepr   r   r   Ú
<listcomp>å   s    z(Blueprint._firstpass.<locals>.<listcomp>c                 s   r�   r;   ©Úrequires©r_   r5   r   r   r   r`   æ   r‘   z'Blueprint._firstpass.<locals>.<genexpr>)r   r©   r   Úpopleftr	   r$   r\   r•   )r4   r\   r5   ÚstreamrB   r   r   r   Ú
_firstpassã   s   
ûzBlueprint._firstpassc              
   C   s�   |   ¡ }|  |¡ dd„ t|ƒD ƒ}t|| j|d�d� }| _|r0|D ]}||kr/| ||¡ q#z| ¡ W S  tyG } ztd| ƒ‚d }~ww )Nc                 s   s   � | ]}||j fV  qd S r;   r¨   r¡   r   r   r   r`   ñ   r£   z,Blueprint._finalize_steps.<locals>.<genexpr>)Úroot)Ú	formatterzunknown bootstep: %s)	r¥   r­   r   r   r   rš   rœ   ÚtopsortÚKeyError)r4   r\   r7   ÚitÚGr?   r…   r   r   r   r”   î   s"   
ÿ€
€ÿzBlueprint._finalize_stepsc                    s   t ‡ fdd„ˆ jD ƒƒS )Nc                 3   s   � | ]}ˆ   |¡V  qd S r;   )Ú	load_steprª   rm   r   r   r`   ÿ   r£   z(Blueprint.claim_steps.<locals>.<genexpr>)ÚdictrW   rm   r   rm   r   r“   þ   ó   zBlueprint.claim_stepsc                 C   s   t |ƒ}|j|fS r;   )r	   r$   r3   r   r   r   r´     s   
zBlueprint.load_stepc                 G   s   t jt| |ƒg|¢R Ž S r;   )rg   rh   r    )r4   Úmsgrƒ   r   r   r   rd     r¶   zBlueprint._debugc                 C   s   t | ƒS r;   )r'   rm   r   r   r   r     s   zBlueprint.alias)NNNNN)ru   rv   F)NTTr   )TFr;   )#rL   rM   rN   rO   r(   r   r$   rb   re   rU   rV   ra   rˆ   r‰   rl   r]   rf   rn   rp   rq   rz   rs   ru   r�   r™   rž   rŸ   r¥   r­   r”   r“   r´   rd   Úpropertyr   r   r   r   r   r   M   sJ    ü
ÿ


ÿ
ÿ

r   c                       s8   e Zd ZdZdZdZ‡ fdd„Zdd„ Zdd„ Z‡  Z	S )	ÚStepTypezMeta-class for steps.Nc                    sL   |  d¡}|rd ||¡n|}|j||  d¡p|d� tt| ƒ | |||¡S )NrM   z{0}.{1}r$   )rN   r$   )Úgetr   rF   Úsuperr¹   Ú__new__)Úclsr$   Úbasesr@   ÚmoduleÚqname©Ú	__class__r   r   r¼     s   
þzStepType.__new__c                 C   s
   t | jƒS r;   )r   r$   ©r½   r   r   r   Ú__str__  r    zStepType.__str__c                 C   ó   t d | ¡ƒS )Nzstep:{0.name}{{{0.requires!r}}}©r   r   rÃ   r   r   r   Ú__repr__  r!   zStepType.__repr__)
rL   rM   rN   rO   r$   r©   r¼   rÄ   rÇ   Ú__classcell__r   r   rÁ   r   r¹     s    	r¹   c                   @   st   e Zd ZdZdZdZdZdZdZdZ	dd„ Z
dd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zedd„ ƒZdd„ ZdS )r   zÖA Bootstep.

    The :meth:`__init__` method is called when the step
    is bound to a parent object, and can as such be used
    to initialize attributes in the parent object at
    parent instantiation-time.
    NFr   Tc                 K   ó   d S r;   r   )r4   ri   r—   r   r   r   r]   C  ó   zStep.__init__c                 C   s   | j S )z¤Return true if bootstep should be included.

        You can define this as an optional predicate that decides whether
        this step should be created.
        )Úenabledrt   r   r   r   Ú
include_ifF  s   zStep.include_ifc                 O   s   t |g|¢R i |¤ŽS r;   )r   )r4   r$   rƒ   r—   r   r   r   r   N  s   zStep.instantiatec                 C   s   |   |¡rd|  |¡fS dS )NT)FN)rÌ   Úcreatert   r   r   r   Ú_should_includeQ  s   
zStep._should_includec                 C   s   |   |¡d S rk   )rÎ   rt   r   r   r   r–   V  r!   zStep.includec                 C   s   dS )zCreate the step.Nr   rt   r   r   r   rÍ   Y  s    zStep.createc                 C   rÅ   )Nz<step: {0.alias}>rÆ   rm   r   r   r   rÇ   \  r!   zStep.__repr__c                 C   s   | j pt| ƒS r;   )r1   r'   rm   r   r   r   r   _  s   z
Step.aliasc                 C   rÉ   r;   r   )r4   r?   r   r   r   rp   c  rÊ   z	Step.info)rL   rM   rN   rO   r$   r1   r9   r©   r7   rË   r]   rÌ   r   rÎ   r–   rÍ   rÇ   r¸   r   rp   r   r   r   r   r   #  s$    	
r   c                   @   s<   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )r   z3Bootstep that must be started and stopped in order.Nc                 C   ó   | j r| j  ¡ S d S r;   )r?   rf   rt   r   r   r   rf   o  ó   
ÿzStartStopStep.startc                 C   rÏ   r;   )r?   ru   rt   r   r   r   ru   s  rÐ   zStartStopStep.stopc                 C   rÉ   r;   r   rt   r   r   r   rq   w  rÊ   zStartStopStep.closec                 C   s   | j rt| j d| j jƒƒ S d S )Nr‡   )r?   r   ru   rt   r   r   r   r‡   z  s   ÿzStartStopStep.terminatec                 C   s(   |   |¡\}}|r|| _|j | ¡ |S r;   )rÎ   r?   r\   r•   )r4   ri   ÚincÚretr   r   r   r–   ~  s
   zStartStopStep.include)
rL   rM   rN   rO   r?   rf   ru   rq   r‡   r–   r   r   r   r   r   g  s    r   c                   @   sB   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	ddd„Z
dS )r   z(Bootstep that starts a message consumer.)z!celery.worker.consumer:ConnectionNc                 C   s   t dƒ‚)Nzmissing get_consumers)ÚNotImplementedError)r4   Úchannelr   r   r   Úget_consumersŒ  s   zConsumerStep.get_consumersc                 C   s2   |j  ¡ }|  |¡| _| jpg D ]}| ¡  qd S r;   )Ú
connectionrÔ   rÕ   Ú	consumersÚconsume)r4   ÚcrÔ   Úconsumerr   r   r   rf   �  s
   

ÿzConsumerStep.startc                 C   ó   |   |d¡ d S )NT©Ú_close©r4   rÙ   r   r   r   ru   •  ro   zConsumerStep.stopc                 C   rÛ   )NFrÜ   rÞ   r   r   r   Úshutdown˜  ro   zConsumerStep.shutdownTc                 C   sV   t ƒ }| jpg D ]}|rt|j|jƒ |jr| |j¡ q|D ]	}t|j|jƒ qd S r;   )rU   r×   r   rÖ   ÚcancelrÔ   Úaddrq   )r4   rÙ   Úcancel_consumersÚchannelsrÚ   rÔ   r   r   r   rÝ   ›  s   €ÿzConsumerStep._close)T)rL   rM   rN   rO   r©   r×   rÕ   rf   ru   rß   rÝ   r   r   r   r   r   †  s    r   N).rO   Ú
__future__r   r   Úcollectionsr   Ú	threadingr   Úkombu.commonr   Úkombu.utils.encodingr   Úkombu.utils.importsr	   Úfiver   r   r   Úutils.graphr   r   Úutils.importsr   r   Ú	utils.logr   Úgreenletr   ÚImportErrorrŽ   Ú__all__ra   rˆ   r‰   rL   rg   r    r'   r(   Úobjectr   rT   r¹   r   r   r   r   r   r   r   Ú<module>   s@   ÿ# AC