ó
P'—^c           @@  sê   d  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 g  Z e e ƒ Z e d „  ƒ Z e d „  ƒ Z e d	 „  ƒ Z e d
 „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z d S(   s–   
    celery.app.builtins
    ~~~~~~~~~~~~~~~~~~~

    Built-in tasks that are always available in all
    app instances. E.g. chord, group and xmap.

i    (   t   absolute_import(   t   deque(   t   get_current_worker_taskt   connect_on_app_finalize(   t   uuid(   t
   get_loggerc         @  s1   ˆ  j  d d d t d t ƒ ‡  f d †  ƒ } | S(   s  The backend cleanup task can be used to clean up the default result
    backend.

    If the configured backend requires periodic cleanup this task is also
    automatically configured to run every day at 4am (requires
    :program:`celery beat` to be running).

    t   names   celery.backend_cleanupt   sharedt   _force_evaluatec           @  s   ˆ  j  j ƒ  d  S(   N(   t   backendt   cleanup(    (   t   app(    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyt   backend_cleanup!   s    (   t   taskt   Falset   True(   R   R   (    (   R   s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyt   add_backend_cleanup_task   s    
c         @  s²   d d l  m ‰ d d l m ‰  d d l m ‰ m } ˆ j j ‰ ˆ j	 d d d d d t d	 d
 d t d t d t ƒ d d d d ˆ j ˆ j | ‡  ‡ ‡ ‡ ‡ f d † ƒ } | S(   s™   This task is used by result backends without native chord support.

    It joins chords by creating a task chain polling the header for completion.

    i    (   t	   signature(   t
   ChordError(   t   allow_join_resultt   result_from_tupleR   s   celery.chord_unlockt   max_retriesR   t   default_retry_delayi   t   ignore_resultR   t   bindc
      	   @  s  | d  k r ˆ n | } | d  k r0 |  j } n  | | g  | D] }
 |	 |
 d ˆ ƒ^ q= d ˆ ƒ} | j rv | j n | j } y | j ƒ  } Wn1 t k
 rÂ } |  j d | d | d | ƒ ‚ n" X| sä |  j d | d | ƒ ‚ n  ˆ | d ˆ ƒ} y) ˆ ƒ   | d d d | ƒ } Wd  QXWn t k
 r®} y( t | j	 ƒ  ƒ } d j
 | | ƒ } Wn t k
 rxt | ƒ } n Xt j d	 | | d
 d ƒˆ j j | ˆ  | ƒ ƒ nf Xy | j | ƒ WnQ t k
 r} t j d	 | | d
 d ƒˆ j j | d ˆ  d j
 | ƒ ƒ ƒn Xd  S(   NR   t   exct	   countdownR   t   timeoutg      @t	   propagates   Dependency {0.id} raised {1!r}s   Chord %r raised: %rt   exc_infoi   s   Callback error: {0!r}(   t   NoneR   t   supports_native_joint   join_nativet   joint   readyt	   Exceptiont   retryt   nextt   _failed_join_reportt   formatt   StopIterationt   reprt   loggert   errorR	   t   chord_error_from_stackt   delay(   t   selft   group_idt   callbackt   intervalR   R   t   resultt   Resultt   GroupResultR   t   rt   depst   jR"   R   t   rett   culpritt   reason(   R   R   R   t   default_propagateR   (    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyt   unlock_chord5   sH    %		
	N(   t   celery.canvasR   t   celery.exceptionsR   t   celery.resultR   R   t   conft   CELERY_CHORD_PROPAGATESR   R   R   R   t   AsyncResultR4   (   R   R   R<   (    (   R   R   R   R;   R   s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyt   add_unlock_chord_task(   s    !4c         @  sD   d d l  m ‰ ˆ  j d d d t d t ƒ ‡  ‡ f d †  ƒ } | S(   Ni    (   R   R   s
   celery.mapR   R   c         @  s2   ˆ |  d ˆ  ƒj  }  g  | D] } |  | ƒ ^ q S(   NR   (   t   type(   R   t   itt   item(   R   R   (    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyt   xmapv   s    (   R=   R   R   R   R   (   R   RG   (    (   R   R   s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyt   add_map_taskr   s    0c         @  sD   d d l  m ‰ ˆ  j d d d t d t ƒ ‡  ‡ f d †  ƒ } | S(   Ni    (   R   R   s   celery.starmapR   R   c         @  s2   ˆ |  d ˆ  ƒj  }  g  | D] } |  | Œ  ^ q S(   NR   (   RD   (   R   RE   RF   (   R   R   (    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyt   xstarmap   s    (   R=   R   R   R   R   (   R   RI   (    (   R   R   s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyt   add_starmap_task}   s    0c         @  sA   d d l  m ‰  |  j d d d t d t ƒ ‡  f d †  ƒ } | S(   Ni    (   t   chunksR   s   celery.chunksR   R   c         @  s   ˆ  j  |  | | ƒ S(   N(   t   apply_chunks(   R   RE   t   n(   t   _chunks(    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyRK   Œ   s    (   R=   RK   R   R   R   (   R   RK   (    (   RN   s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyt   add_chunk_taskˆ   s    -c         @  s[   |  ‰ d d l  m ‰ m ‰ d d l m ‰ d |  j f ‡  ‡ ‡ ‡ ‡ f d †  ƒ  Y‰  ˆ  S(   Ni    (   t   maybe_signatureR   (   R   t   Groupc           @  sn   e  Z ˆ Z d  Z e Z e Z e ‡ ‡ f d † Z ‡ f d †  Z	 d i  ‡  f d † Z
 d i  ‡  f d † Z RS(   s   celery.groupc   
      @  sñ   |  j  ‰  ˆ | ˆ  ƒ } ‡  ‡ ‡ f d †  t | ƒ Dƒ } |  j j sR ˆ  j j r„ ˆ  j | j g  | D] } | j d | ƒ ^ qe ƒ Sˆ  j	 ƒ  6 } g  | D]$ } | j
 d | d | d t ƒ ^ qš Wd  QXt ƒ  }	 | rí |	 rí |	 j | ƒ n  | S(   Nc         3@  s0   |  ]& \ } } ˆ | d  ˆ  ƒj  ˆ ƒ Vq d S(   R   N(   t   clone(   t   .0t   iR   (   R   t   partial_argsR   (    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pys	   <genexpr>£   s   R/   t   producert   add_to_parent(   R   t	   enumeratet   requestt   is_eagerR@   t   CELERY_ALWAYS_EAGERR4   t   idt   applyt   producer_or_acquiret   apply_asyncR   R   t	   add_trail(
   R.   t   tasksR2   R/   RU   RW   t   taskitt   staskt   pubt   parent(   R   R   (   R   RU   s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyt   runž   s    	&2	c         @  s§   | j  d t ƒ  ƒ | d <‰  ‡  ‡ ‡ f d †  } y5 t t g  | D] } | | ƒ ^ qB Œ  ƒ \ } } Wn t k
 r‡ g  g  } } n X| ˆ j j ˆ  | ƒ ˆ  | f S(   Nt   task_idR/   c         @  s2   ˆ |  d ˆ j  ƒ}  ˆ  |  j d <|  |  j ƒ  f S(   NR   R/   (   R   t   optionst   freeze(   R   (   R/   RP   R.   (    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyt   prepare_member¶   s    (   t
   setdefaultR   t   listt   zipt
   ValueErrorR   R4   (   R.   Rh   Ra   t   argst   kwargsRj   R   t   res(   RP   (   R/   R.   s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyt   prepare²   s    /c         @  s{   |  j  j j r" |  j | | |  S|  j | d | | \ } } } } t ˆ  |  ƒ j t | ƒ | j ƒ  | | f |  | S(   NRo   (	   R   R@   R[   R]   Rr   t   superR_   Rl   t   as_tuple(   R.   RU   Rp   Rh   Ra   R2   t   gidRo   (   RQ   (    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyR_   Ã   s    "c         @  s1   t  ˆ  |  ƒ j |  j | d | | |  j ƒ  S(   NRo   (   Rs   R]   Rr   t   get(   R.   Ro   Rp   Rh   (   RQ   (    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyR]   Î   s    (    (    (   t   __name__t
   __module__R   R   R   t   accept_magic_kwargsR   t
   _decoratedRf   Rr   R_   R]   (    (   RQ   t   _appRP   R   R   (    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyRQ   ˜   s   (   R=   RP   R   R?   R   t   Task(   R   (    (   RQ   R{   RP   R   R   s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyt   add_group_task’   s
    +:c      	   @  si   d d l  m ‰  m ‰ m ‰ m ‰ m ‰ m ‰ |  ‰ d |  j f ‡  ‡ ‡ ‡ ‡ ‡ ‡ f d †  ƒ  Y} | S(   Ni    (   t	   Signaturet   chaint   chordt   groupRP   t   maybe_unroll_groupt   Chainc           @  sn   e  Z ˆ Z d  Z e Z e Z ‡  ‡ ‡ ‡ ‡ ‡ f d †  Z d i  d d d d d d „ Z
 d i  ˆ d „ Z RS(   s   celery.chainc         @  sÃ  |  j  } t | ƒ } d  } } } g  g  } } d }	 x€| r¸ˆ | j ƒ  d | ƒ}
 |	 ri |
 j ƒ  n |
 j | ƒ }
 |
 j ƒ  } |	 d 7}	 t |
 ˆ ƒ r¬ ˆ |
 ƒ }
 n  t |
 ˆ ƒ r× | j t |
 j	 ƒ ƒ q9 nz t |
 ˆ ƒ rQ| rQt | d ˆ ƒ rQy: | j ƒ  } ˆ  j | ƒ } ˆ |
 d | d | j
 ƒ}
 WqQt k
 rMqQXn  | r|| j |
 ƒ | j s|| | _ q|n  t | ˆ ƒ s¨| j | ƒ | j |
 ƒ n  |
 | } } q9 W| | f S(   Ni    R   i   t   bodyRg   (   R   R   R   t   popleftRR   Ri   t
   isinstancet
   extendleftt   reversedRa   Rg   t
   IndexErrort   linkRe   t   append(   R.   Ro   Ra   R   t   stepst	   next_stept	   prev_taskt   prev_rest   resultsRT   R   Rq   (   R~   R   R€   R   RP   R‚   (    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyt   prepare_stepsã   s@    		!
	c         [@  s!  |  j  j j r" |  j | | |  S| j d d  ƒ |  j | | d ƒ \ }	 }
 |
 d } | ru |	 d j d | ƒ n  | r’ |	 d j d | ƒ n  | rÅ |	 d j d | ƒ |	 d j j	 | ƒ } n  | râ |	 d j d | ƒ n  | rx! |	 D] } | j d | ƒ qï Wn  |	 d	 j
 |   | S(
   Nt	   publisherRa   iÿÿÿÿR/   R€   Rg   RŠ   t
   link_errori    (   R   R@   R[   R]   t   popR   R‘   t   setRD   RB   R_   (   R.   Ro   Rp   R/   R€   Rg   RŠ   R“   Rh   Ra   R   R2   R   (    (    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyR_     s&    
c   
      [@  sy   |  j  } d  | } } x\ | d D]P } | | d | ƒj | ƒ j | oT | j ƒ  f ƒ }	 | |	 d  |	 _ } } q! W| S(   NRa   R   (   R   R   RR   R]   Rv   Re   (
   R.   Ro   Rp   R   Rh   R   t   lastt   fargsR   Rq   (    (    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyR]   (  s    	(    N(    (   Rw   Rx   R   R   R   Ry   R   Rz   R‘   R   R_   R]   (    (   R~   R{   R   R€   R   RP   R‚   (    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyRƒ   Ý   s   -(   R=   R~   R   R€   R   RP   R‚   R|   (   R   Rƒ   (    (   R~   R{   R   R€   R   RP   R‚   s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyt   add_chain_taskÕ   s    .1Uc         @  sa   d d l  m ‰ d d l m ‰ |  ‰ |  j j ‰ d |  j f ‡  ‡ ‡ ‡ ‡ f d †  ƒ  Y‰  ˆ  S(   s”   Every chord is executed in a dedicated task, so that the chord
    can be used as a signature, and this generates the task
    responsible for that.i    (   R   (   RP   t   Chordc        	   @  s‰   e  Z ˆ Z d  Z e Z e Z e Z d d d d d e ‡ ‡ ‡ f d † Z
 d i  d d d ‡  ‡ f d † Z d i  e ‡  ‡ f d † Z RS(	   s   celery.chordi   c	         @  s  |  j  }
 | d  k r ˆ  n | } t ƒ  } t | ˆ ƒ rB | j n | } ˆ g  | D] } ˆ | d |
 ƒj ƒ  ^ qR d |  j  ƒ} | rž | j d | d | ƒ St | j ƒ | d <| j d | d | ƒ j	 } |  j
 j | | | | d | d | d	 | d
 | d | ƒS(   NR   Ro   Rg   t
   chord_sizeR/   R€   R1   R   R   R   R2   (   R   R   R   R†   Ra   RR   R]   t   lenRi   R   R	   t   apply_chord(   R.   t   headerR„   RU   R1   R   R   R   t   eagerRp   R   R/   Ra   t   sR   (   R;   R   RP   (    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyRf   F  s    		+		c         @  s>  |  j  } | j j r( |  j | | |  S| j d ƒ } | j d ƒ }	 ˆ | d | ƒˆ |	 d | ƒ} }	 | d  k	 r‡ | |	 j d <n  | d  k	 r£ | |	 j d <n  g  | j d g  ƒ D] }
 |	 j |
 ƒ ^ q¶ g  | j d g  ƒ D] }
 |	 j |
 ƒ ^ qâ |	 j	 | ƒ } t
 ˆ  |  ƒ j | |	 | f | |  } | | _ | S(   NR   R„   R   R€   R/   RŠ   R“   (   R   R@   R[   R]   R”   R   Rh   RŠ   R“   Ri   Rs   R_   Re   (   R.   Ro   Rp   Rg   R/   R€   Rh   R   R   R„   RŸ   t   body_resultRe   (   R™   RP   (    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyR_   _  s$    	,,	c         @  sh   | d } t  ˆ  |  ƒ j | t | d t ƒ|  } ˆ | d |  j ƒj d | j d | ƒ j ƒ  f ƒ S(   NR„   Rž   R   Ro   R   (   Rs   R]   t   dictR   R   Rv   (   R.   Ro   Rp   R   Rh   R„   Rq   (   R™   RP   (    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyR]   u  s
    
!	(    N(    (    (   Rw   Rx   R   R   R   Ry   R   R   Rz   R   Rf   R_   R]   (    (   R™   R{   R;   R   RP   (    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyR™   ?  s   		(   t   celeryR   R=   RP   R@   RA   R|   (   R   (    (   R™   R{   R;   R   RP   s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyt   add_chord_task5  s    +<N(   t   __doc__t
   __future__R    t   collectionsR   t   celery._stateR   R   t   celery.utilsR   t   celery.utils.logR   t   __all__Rw   R*   R   RC   RH   RJ   RO   R}   R˜   R£   (    (    (    s5   /tmp/pip-unpacked-wheel-gV1wwp/celery/app/builtins.pyt   <module>	   s   J
C`