σ
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 d d l m Z d d l m Z 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 y0 d d l Z d d l m  Z  d d l! m" Z" Wn# e# k
 r=d Z d Z  d Z" n Xd g Z% d Z& e e'  Z( e( j) Z) d e f d     YZ* d S(   sW   
    celery.backends.redis
    ~~~~~~~~~~~~~~~~~~~~~

    Redis result store backend.

i    (   t   absolute_import(   t   partial(   t   cached_propertyt   retry_over_time(   t
   _parse_url(   t   states(   t   maybe_signature(   t
   ChordErrort   ImproperlyConfigured(   t   string_t(   t   deprecated_propertyt	   strtobool(   t
   dictfilter(   t
   get_logger(   t   humanize_secondsi   (   t   KeyValueStoreBackendN(   t   ConnectionError(   t   get_redis_error_classest   RedisBackendsU   You need to install the redis library in order to use the Redis result store backend.c        
   B@  s  e  Z d  Z e Z d Z e Z e Z e Z	 d d d d d d d d e
 d 	 Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d	   Z d
   Z d   Z e j e j d  Z d d  Z d e j d  Z e
 d  Z d d d  Z d   Z e d    Z  e! d    Z" d i  d  Z# e$ d d  d    Z% e$ d d  d    Z& e$ d d  d    Z' e$ d d  d    Z( RS(   s   Redis task result store.c
         @  s½  t  t |   j |
   |  j j   |  j d  k r@ t t   n  |  j	   |  _
   f d   } | r d | k r | } d  } n  | p | d  p |  j |  _ | |  _ i | d  pΈ d d 6| d  pΛ d d	 6| d
  pή d d 6| d  d 6|  j d 6|  _ | r |  j | |  j  |  _ n  | |  _ |  j | d t |  _ y t |  j j d   }	 Wn t k
 rpn X|	 r|  j |  _ |  j |  _ n  t r‘t   n	 d d f \ |  _ |  _ d  S(   Nc         @  s>   x7 d D]/ } y   | j  |   SWq t k
 r5 q Xq Wd  S(   Ns   CELERY_REDIS_{0}s	   REDIS_{0}(   s   CELERY_REDIS_{0}s	   REDIS_{0}(   t   formatt   KeyError(   t   keyt   prefix(   t   conf(    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyt   _getE   s
    s   ://t   MAX_CONNECTIONSt   HOSTt	   localhostt   hostt   PORTiλ  t   portt   DBi    t   dbt   PASSWORDt   passwordt   max_connectionst   typet   new_join(    (    (   t   superR   t   __init__t   appR   t   redist   NoneR   t   REDIS_MISSINGt   _detect_client_capabilitiest   _client_capabilitiesR#   t   _ConnectionPoolt
   connparamst   _params_from_urlt   urlt   prepare_expirest   intt   expiresR   t   popR   t   _new_chord_applyt   apply_chordt   _new_chord_returnt   on_chord_part_returnR   t   connection_errorst   channel_errors(   t   selfR   R   R    R"   R4   R#   R1   t   connection_poolR%   t   kwargsR   (    (   R   s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyR'   ;   s<    			c         C@  s  t  |  \ } } } } } } }	 t | t i | d 6| d 6| d 6|	 j d d   d 6  }
 | d k r² |
 j i |  j j d 6d | d	 6 |
 j d d   |
 j d d   n
 | |
 d <|
 j d  pΞ d
 } t	 | t
  rο | j d  n | } t |  |
 d <|
 j |	  |
 S(   NR   R   R"   t   virtual_hostR    t   sockett   connection_classt   /t   pathi    (   R   t   dictR   R5   R*   t   updateR)   t   UnixDomainSocketConnectiont   gett
   isinstanceR	   t   stripR3   (   R<   R1   t   defaultst   schemeR   R   t   userR"   RC   t   queryR/   R    (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyR0   l   s"    !		
$c         C@  s   |  j  j |  S(   N(   t   clientRG   (   R<   R   (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyRG      s    c         C@  s   |  j  j |  S(   N(   RN   t   mget(   R<   t   keys(    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyRO      s    c         K@  sI   t  |  j |  } | j d  } t | |  j | i  t |  j |  |  S(   Nt   max_retries(   RD   t   retry_policyRG   R   R:   R   t   on_connection_error(   R<   t   funt   argst   policyRR   RQ   (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyt   ensure   s    c         C@  s2   t  |  } t d | | p d t | d   | S(   Ns+   Connection to Redis lost: Retry (%s/%s) %s.t   Infs   in (   t   nextt   errorR   (   R<   RQ   t   exct	   intervalst   retriest   tts(    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyRS      s
    c         K@  s   |  j  |  j | | f |  S(   N(   RW   t   _set(   R<   R   t   valueRR   (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyt   set    s    c         C@  sh   |  j  j   S } |  j r4 | j | | |  j  n | j | |  | j | |  | j   Wd  QXd  S(   N(   RN   t   pipelineR4   t   setexRa   t   publisht   execute(   R<   R   R`   t   pipe(    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyR_   £   s    	c         C@  s   |  j  j |  d  S(   N(   RN   t   delete(   R<   R   (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyRg   ¬   s    c         C@  s   |  j  j |  S(   N(   RN   t   incr(   R<   R   (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyRh   ―   s    c         C@  s   |  j  j | |  S(   N(   RN   t   expire(   R<   R   R`   (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyRi   ²   s    c   	      C@  sa   | |  \ } } } } | | k r6 |  j  |  } n  | | k r] t d j | |    n  | S(   Ns   Dependency {0} raised {1!r}(   t   exception_to_pythonR   R   (	   R<   t   tupt   decodet   EXCEPTION_STATESt   PROPAGATE_STATESt   _t   tidt   statet   retval(    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyt   _unpack_chord_result΅   s    c         K@  s   | d | |  S(   Nt   task_id(    (   R<   t   headert   partial_argst   group_idt   bodyt   resultt   options(    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyR6   Ώ   s    c         C@  se  |  j  } | d  k r' |  j  j j } n  | j } | j | j } }	 |	 sQ | rU d  S|  j }
 |  j |	 d  } |  j	 | |  } |
 j
   R } | j | |  j d | | | g   j |  j | d  j   \ } } } Wd  QXyό t | j d | } | d } | | k rέ|  j |  j } } |
 j
   1 } | j | d |  j |  j   \ } } Wd  QXy- | j g  | D] } | | |  ^ qr Wqέt k
 rΩ} t d | j | d d |  j | t d	 j |    SXn  Wn t k
 r} t d
 | j | d d |  j | |  St k
 r`} t d
 | j | d d |  j | t d j |    SXd  S(   Ns   .ji   iQ R(   t
   chord_sizei    s    Chord callback for %r raised: %rt   exc_infos   Callback error: {0!r}s   Chord %r raised: %rs   Join error: {0!r}(   R(   R*   R   t   CELERY_CHORD_PROPAGATESt   requestt   idt   groupRN   t   get_key_for_groupt   encode_resultRb   t   rpusht   encodet   llenRi   Re   R   t   chordRl   Rs   t   lrangeRg   t   delayt	   ExceptionRZ   t   chord_error_from_stackR   R   (   R<   t   taskRq   Ry   t	   propagateRn   R(   R~   Rp   t   gidRN   t   jkeyRf   Ro   t
   readycountt   callbackt   totalRl   t   unpackt   reslRk   R[   (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyR8   Δ   sN    			!	!
-c         C@  sP   |  j  j d k  r* t d j t     n  |  j  j d k rE t } n  i | d 6S(   Ni   i   sQ   Redis backend requires redis-py versions 2.4.4 or later. You have {0.__version__}i
   t   socket_connect_timeout(   i   i   i   (   i   i
   (   R)   t   VERSIONR   R   t   True(   R<   R   (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyR,   τ   s    	c         K@  s1   |  j  d | o t |  d | o* t |  |  S(   Nt   socket_timeoutR   (   t   _new_redis_clientt   float(   R<   R   R   t   params(    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyt   _create_clientύ   s    		c         K@  s<   |  j  d s  | j d d   n  |  j j d |  j |    S(   NR   R=   (   R-   R5   R*   R)   t   Redist   ConnectionPool(   R<   R   (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyR     s    c         C@  s(   |  j  d  k r! |  j j |  _  n  |  j  S(   N(   R.   R*   R)   R   (   R<   (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyR   
  s    c         C@  s   |  j  |  j   S(   N(   R   R/   (   R<   (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyRN     s    c         C@  s)   t  t |   j |  j f i |  j d 6 S(   NR4   (   R&   R   t
   __reduce__R1   R4   (   R<   RU   R>   (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyR     s    g	@gffffff
@c         C@  s   |  j  d S(   NR   (   R/   (   R<   (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyR     s    c         C@  s   |  j  d S(   NR   (   R/   (   R<   (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyR     s    c         C@  s   |  j  d S(   NR    (   R/   (   R<   (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyR    !  s    c         C@  s   |  j  d S(   NR"   (   R/   (   R<   (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyR"   %  s    N(    ()   t   __name__t
   __module__t   __doc__R)   R*   R#   R   t   supports_autoexpiret   supports_native_joint   implements_incrt   FalseR'   R0   RG   RO   RW   RS   Ra   R_   Rg   Rh   Ri   R   Rm   Rn   Rs   R6   R8   R,   R   R   t   propertyR   R   RN   R   R
   R   R   R    R"   (    (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyR   .   sD   	/													/		(+   R‘   t
   __future__R    t	   functoolsR   t   kombu.utilsR   R   t   kombu.utils.urlR   t   celeryR   t   celery.canvasR   t   celery.exceptionsR   R   t   celery.fiveR	   t   celery.utilsR
   R   t   celery.utils.functionalR   t   celery.utils.logR   t   celery.utils.timeutilsR   t   baseR   R)   t   redis.exceptionsR   t   kombu.transport.redisR   t   ImportErrorR*   t   __all__R+   R   t   loggerRZ   R   (    (    (    s7   /tmp/pip-unpacked-wheel-gV1wwp/celery/backends/redis.pyt   <module>   s4   
		