σ
P'^c           @@  sA  d  Z  d d l m Z d d l Z d d l m Z d d l m Z d d l m	 Z	 m
 Z
 m Z 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 d l m Z d d l m Z d d g Z e e  Z d e f d     YZ  d   Z! d e
 f d     YZ" d e f d     YZ# d S(   s   
    celery.backends.amqp
    ~~~~~~~~~~~~~~~~~~~~

    The AMQP result backend.

    This backend publishes results as messages.

i    (   t   absolute_importN(   t   deque(   t
   itemgetter(   t   Exchanget   Queuet   Producert   Consumer(   t   states(   t   TimeoutError(   t   ranget	   monotonic(   t
   dictfilter(   t
   get_logger(   t   maybe_s_to_msi   (   t   BaseBackendt   BacklogLimitExceededt   AMQPBackendc           B@  s   e  Z d  Z RS(   s'   Too much state history to fast-forward.(   t   __name__t
   __module__t   __doc__(    (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyR   "   s   c         C@  s4   d |  d  |  d d !|  d d !|  d d !|  d f S(   Ns   %s-%s-%s-%s-%si   i   i   i   (    (   t   s(    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt   repair_uuid&   s    t   NoCacheQueuec           B@  s   e  Z e Z RS(    (   R   R   t   Falset   can_cache_declaration(    (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyR   -   s   c           B@  s  e  Z d  Z e Z e Z e Z e Z e Z e	 Z
 e	 Z e	 Z i d d 6d d 6d d 6d d 6Z d" d" d" d" d" e	 d  Z d	 d
 d  Z d   Z d   Z d   Z d   Z d" d" d  Z d   Z d" e	 e	 d" e j e j d  Z d d  Z e Z d" d" e d" d  Z d" e	 d" d  Z d   Z  d" e	 e e! d d  e j e j d  Z" d   Z# d   Z$ d   Z% e	 d  Z& d   Z' e	 d   Z( d# i  d!  Z) RS($   s&   Publishes results by sending messages.i   t   max_retriesi    t   interval_starti   t   interval_stept   interval_maxc   
      K@  s  t  t |   j | |  |  j j }	 | |  _ |  j |  |  _ |  j rO d n d |  _ | pd |	 j	 } | ps |	 j
 } |  j | | |  j  |  _ | p |	 j |  _ | |  _ d  |  _ d | k sΡ | d d  k	 rο |  j | j d   |  _ n  t i t |  j  d 6 |  _ d  S(   Ni   i   t   expiress	   x-expires(   t   superR   t   __init__t   appt   conft   _connectiont   prepare_persistentt
   persistentt   delivery_modet   CELERY_RESULT_EXCHANGEt   CELERY_RESULT_EXCHANGE_TYPEt   _create_exchanget   exchanget   CELERY_RESULT_SERIALIZERt
   serializert   auto_deletet   NoneR   t   prepare_expirest   getR   R   t   queue_arguments(
   t   selfR    t
   connectionR)   t   exchange_typeR$   R+   R,   t   kwargsR!   (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyR   E   s     			t   directi   c         C@  s+   |  j  d | d | d | d |  j d t  S(   Nt   namet   typeR%   t   durableR,   (   R   R$   R   (   R1   R6   R7   R%   (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyR(   [   s
    	c         C@  sI   |  j  |  } |  j d | d |  j d | d |  j d |  j d |  j  S(   NR6   R)   t   routing_keyR8   R,   R0   (   t   rkeyR   R)   R$   R,   R0   (   R1   t   task_idR6   (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt   _create_bindingb   s    			c         C@  s   d  S(   N(    (   R1   t   channel(    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt   revivek   s    c         C@  s   | j  d d  S(   Nt   -t    (   t   replace(   R1   R;   (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyR:   n   s    c         C@  s5   | r" |  j  |  | j p | f S|  j  |  | f S(   N(   R:   t   correlation_id(   R1   R;   t   request(    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt   destination_forq   s    c   
      K@  sΤ   |  j  | |  \ } } | s" d S|  j j j j d t   }	 |	 j i | d 6| d 6|  j | |  d 6| d 6|  j |  d 6d |  j	 d	 | d
 | d |  j
 d t d |  j d |  j |  d |  j Wd QX| S(   s"   Send task return value and status.Nt   blockR;   t   statust   resultt	   tracebackt   childrenR)   R9   RB   R+   t   retryt   retry_policyt   declareR%   (   RD   R    t   amqpt   producer_poolt   acquiret   Truet   publisht   encode_resultt   current_task_childrenR)   R+   RK   t   on_reply_declareR%   (
   R1   R;   RG   RF   RH   RC   R4   R9   RB   t   producer(    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt   store_resultv   s"    		c         C@  s   |  j  |  g S(   N(   R<   (   R1   R;   (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyRT      s    c   
      K@  s|   |  j  j |  }	 | r2 |	 r2 |	 d | k r2 |	 Sy# |  j | d | d | d | SWn  t j k
 rw t d   n Xd  S(   NRF   t   timeoutt   no_ackt   on_intervals   The operation timed out.(   t   _cacheR/   t   consumet   socketRW   R   (
   R1   R;   RW   t   cacheRX   RY   t   READY_STATESt   PROPAGATE_STATESR4   t   cached_meta(    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt   wait_for   s    iθ  c      
   C@  sE  |  j  j j d t  '\ } } |  j |  |  } | j   d  } } } x t |  D]g }	 | j d |  j	 d t
  } | s Pn  | j d | k r© | | } } n  | r[ | j   d  } q[ q[ W|  j |   | r|  j | j  }
 |  j | <| j   |
 Sy |  j | SWn# t k
 r:i t j d 6d  d 6SXWd  QXd  S(   NRE   t   acceptRX   R;   RF   RG   (   R    t   poolt   acquire_channelRP   R<   RL   R-   R	   R/   Rb   R   t   payloadt   ackR   t   meta_from_decodedRZ   t   requeuet   KeyErrorR   t   PENDING(   R1   R;   t   backlog_limitt   _R=   t   bindingt   prevt   latestt   acct   iRe   (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt   get_task_meta   s.    !
	

c   	      @  sΒ   | p | j  } i       f d   } | g | j (|   } xn | rh |   | | k rh t j    n  y | d d  Wn t j k
 r n X| r  |   n    r@ Pq@ q@ W j j      S(   Nc         @  s1   |  d t  j k r-  j |     |  d <n  d  S(   NRF   R;   (   R   R^   Rg   (   t   metat   message(   t   resultsR1   (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt   callbackΙ   s    RW   i   (   t   drain_eventst	   callbacksR\   RW   RZ   t   update(	   R1   R2   t   consumerRW   RY   t   nowt   waitRv   t
   time_start(    (   Ru   R1   s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyRw   Δ   s$    	
c   
      C@  s¦   |  j  } |  j j j d t   \ } } |  j |  } |  j | | d | d |  j @ }	 x6 y | | |	 | |  | SWq` t k
 r q` q` Xq` WWd  QXWd  QXd  S(   NRE   RX   Rb   (	   Rw   R    Rc   Rd   RP   R<   R   Rb   Ri   (
   R1   R;   RW   RX   RY   R|   t   connR=   Rm   Rz   (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyR[   ί   s    	!c         C@  s    g  | D] } |  j  |  ^ q S(   N(   R<   (   R1   t   idsR;   (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt   _many_bindingsμ   s    RF   R;   c         +@  s§  |  j  j j d t  \ }	 }
 t   } t   } | j } x[ | D]S } y |  j | } Wn t k
 rp qF X| d   k rF | | f V| |  qF qF W| j |  t	   } | j
  |  j j  |  j         f d   } |  j   } |  j |
 | d | d |  j d | v |	 j } | j } x\ | r| d |  xB | r|   } | d } | j |   | |  | | f VqQWq;WWd  QXWd  QXd  S(	   NRE   RF   c         @  s\    |  j     }  |  \ } } |   k rX |  k rH  |  n  | |  n  d  S(   N(   t   decode(   Rt   t   bodyt   statet   uid(   R^   t   decode_resultt	   getfieldst
   push_cachet   push_resultt   task_ids(    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt
   on_message  s    R   Rb   RX   RW   R;   (   R    Rc   Rd   RP   t   sett   addRZ   Ri   t   difference_updateR   t   appendt   __setitem__Rg   R   R   Rb   Rw   t   popleftt   discard(   R1   R   RW   RX   R{   R   R^   R_   R4   R~   R=   R   t
   cached_idst   mark_cachedR;   t   cachedRu   R   t   bindingsR|   R   R   (    (   R^   R   R   R   R   R   s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt   get_manyο   s>    !										
c         C@  s   t  d   d  S(   Ns4   reload_task_result is not supported by this backend.(   t   NotImplementedError(   R1   R;   (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt   reload_task_result  s    c         C@  s   t  d   d S(   s<   Reload group result, even if it has been previously fetched.s5   reload_group_result is not supported by this backend.N(   R   (   R1   R;   (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt   reload_group_result  s    c         C@  s   t  d   d  S(   Ns,   save_group is not supported by this backend.(   R   (   R1   t   group_idRG   (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt
   save_group$  s    c         C@  s   t  d   d  S(   Ns/   restore_group is not supported by this backend.(   R   (   R1   R   R]   (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt   restore_group(  s    c         C@  s   t  d   d  S(   Ns.   delete_group is not supported by this backend.(   R   (   R1   R   (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt   delete_group,  s    c         C@  s   d S(   Ns   amqp://(    (   R1   t   include_password(    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt   as_uri0  s    c         C@  sh   | j  d |  j d |  j j d |  j j d |  j d |  j d |  j d |  j  t	 t
 |   j | |  S(   NR2   R)   R3   R$   R+   R,   R   (   Ry   R"   R)   R6   R7   R$   R+   R,   R   R   R   t
   __reduce__(   R1   t   argsR4   (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyR    3  s    					
N(    (*   R   R   R   R   R   R   R   R   R   RP   R$   t   supports_autoexpiret   supports_native_joinRK   R-   R   R(   R<   R>   R:   RD   RV   RT   R   R^   R_   Ra   Rr   t   pollR
   Rw   R[   R   R   R   R   R   R   R   R   R   R    (    (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyR   1   sV   
							#	)				($   R   t
   __future__R    R\   t   collectionsR   t   operatorR   t   kombuR   R   R   R   t   celeryR   t   celery.exceptionsR   t   celery.fiveR	   R
   t   celery.utils.functionalR   t   celery.utils.logR   t   celery.utils.timeutilsR   t   baseR   t   __all__R   t   loggert	   ExceptionR   R   R   R   (    (    (    s6   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/amqp.pyt   <module>
   s$   "	