
O'^c           @@ s`  d  Z  d d l m Z m Z d d l Z d d l 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 m Z d d
 l m Z m Z m Z d d l m Z m Z 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' e j( d d k r_d n d Z) d Z* d Z+ d e, f d     YZ- d e. f d     YZ/ d e0 f d     YZ1 d e, f d     YZ2 d e, f d      YZ3 d! e# j4 f d"     YZ4 d# e, f d$     YZ5 d% e5 e# j6 f d&     YZ7 d' e# j8 f d(     YZ8 d) e# j9 f d*     YZ9 d S(+   u   
kombu.transport.virtual
=======================

Virtual transport implementation.

Emulates the AMQ API for non-AMQ transports.

i    (   t   absolute_importt   unicode_literalsN(   t   array(   t   count(   t   Finalize(   t   sleep(   t   queue_declare_ok_t(   t   ResourceErrort   ChannelError(   t   Emptyt   itemst	   monotonic(   t   emergency_dump_statet   kwdictt   sayt   uuid(   t   OrderedDict(   t   str_to_bytest   bytes_to_str(   t   basei   (   t	   FairCycle(   t   STANDARD_EXCHANGE_TYPESi   u   Ht   Hul   Message could not be delivered: No queues bound to exchange {exchange!r} using binding key {routing_key!r}.
uk   Cannot redeclare exchange {0!r} in vhost {1!r} with different type, durable, autodelete or arguments value.t   Base64c           B@ s   e  Z d    Z d   Z RS(   c         C@ s   t  t j t |    S(   N(   R   t   base64t	   b64encodeR   (   t   selft   s(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   encode2   s    c         C@ s   t  j t |   S(   N(   R   t	   b64decodeR   (   R   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   decode5   s    (   t   __name__t
   __module__R   R   (    (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR   0   s   	t   NotEquivalentErrorc           B@ s   e  Z d  Z RS(   uA   Entity declaration is not equivalent to the previous declaration.(   R   R    t   __doc__(    (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR!   9   s   t   UndeliverableWarningc           B@ s   e  Z d  Z RS(   u.   The message could not be delivered to a queue.(   R   R    R"   (    (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR#   >   s   t   BrokerStatec           B@ s,   e  Z d Z d Z d d d   Z d   Z RS(   c         C@ s:   | d  k r i  n | |  _ | d  k r- i  n | |  _ d  S(   N(   t   Nonet	   exchangest   bindings(   R   R&   R'   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   __init__K   s    c         C@ s   |  j  j   |  j j   d  S(   N(   R&   t   clearR'   (   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR)   O   s    N(   R   R    R%   R&   R'   R(   R)   (    (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR$   C   s   t   QoSc           B@ s   e  Z d  Z d Z d Z d Z e Z d d  Z	 d   Z
 d   Z d   Z d   Z d   Z d   Z e d	  Z d
   Z d   Z d   Z RS(   u   Quality of Service guarantees.

    Only supports `prefetch_count` at this point.

    :param channel: AMQ Channel.
    :keyword prefetch_count: Initial prefetch count (defaults to 0).

    i    c         C@ sy   | |  _  | p d |  _ t   |  _ t |  j _ t   |  _ |  j j |  _	 |  j j
 |  _ t |  |  j d d |  _ d  S(   Ni    t   exitpriorityi   (   t   channelt   prefetch_countR   t
   _deliveredt   Falset   restoredt   sett   _dirtyt   addt
   _quick_ackt   __setitem__t   _quick_appendR   t   restore_unacked_oncet   _on_collect(   R   R,   R-   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR(   n   s    	c         C@ s0   |  j  } | p/ t |  j  t |  j  | k  S(   u   Return true if the channel can be consumed from.

        Used to ensure the client adhers to currently active
        prefetch limits.

        (   R-   t   lenR.   R2   (   R   t   pcount(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   can_consume{   s    	c         C@ s:   |  j  } | r6 t | t |  j  t |  j  d  Sd S(   uz  Returns the maximum number of messages allowed to be returned.

        Returns an estimated number of messages that a consumer may be allowed
        to consume at once from the broker. This is used for services where
        bulk 'get message' calls are preferred to many individual 'get message'
        calls - like SQS.

        returns:
            An integer > 0
        i    N(   R-   t   maxR9   R.   R2   (   R   R:   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   can_consume_max_estimate   s    	c         C@ s*   |  j  r |  j   n  |  j | |  d S(   u&   Append message to transactional state.N(   R2   t   _flushR6   (   R   t   messaget   delivery_tag(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   append   s    	c         C@ s   |  j  | S(   N(   R.   (   R   R@   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   get   s    c         C@ sR   |  j  } |  j } x9 y | j   } Wn t k
 r9 Pn X| j | d  q Wd S(   u'   Flush dirty (acked/rejected) tags from.N(   R2   R.   t   popt   KeyErrorR%   (   R   t   dirtyt	   deliveredt	   dirty_tag(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR>      s    		c         C@ s   |  j  |  d S(   u8   Acknowledge message and remove from transactional state.N(   R4   (   R   R@   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   ack   s    c         C@ s1   | r  |  j  j |  j |  n  |  j |  d S(   u4   Remove from transactional state and requeue message.N(   R,   t   _restore_at_beginningR.   R4   (   R   R@   t   requeue(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   reject   s    c         C@ s   |  j    |  j } g  } |  j j } | j } xi | r y |   \ } } Wn t k
 r^ Pn Xy | |  Wq1 t k
 r } | j | | f  q1 Xq1 W| j   | S(   u$   Restore all unacknowledged messages.(	   R>   R.   R,   t   _restoret   popitemRD   t   BaseExceptionRA   R)   (   R   RF   t   errorst   restoret   pop_messaget   _R?   t   exc(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   restore_unacked   s     
			
c         C@ s   |  j  j   |  j   |  j } |  j s7 |  j j r; d St | d d  r^ | sZ t	  d Szp | r t
 d t |  j   |  j   } | r t t |    \ } } t
 d t |  |  t |  q n  Wd t | _ Xd S(   uy   Restores all unacknowledged messages at shutdown/gc collect.

        Will only be done once for each instance.

        Nu   restoredu*   Restoring {0!r} unacknowledged message(s).u#   UNABLE TO RESTORE {0} MESSAGES: {1}(   R8   t   cancelR>   R.   t   restore_at_shutdownR,   t
   do_restoret   getattrR%   t   AssertionErrorR   R9   RT   t   listt   zipR   t   TrueR0   (   R   t   statet
   unrestoredRO   t   messages(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR7      s&    
	c         O@ s   d S(   u   Restore any pending unackwnowledged messages for visibility_timeout
        style implementations.

        Optional: Currently only used by the Redis transport.

        N(    (   R   t   argst   kwargs(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   restore_visible   s    N(   R   R    R"   R-   R%   R.   R2   R\   RV   R(   R;   R=   RA   RB   R>   RH   R/   RK   RT   R7   Rb   (    (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR*   T   s    	
							t   Messagec           B@ s   e  Z d    Z d   Z RS(   c         K@ s   | |  _  | d } | j d  } | rF | j | | j d   } n  | j i | d 6| d d 6| j d  d 6| j d  d 6| j d	  d	 6| d 6| j d
  d
 6d d 6 t t |   j | t |   d  S(   Nu
   propertiesu   bodyu   body_encodingu   delivery_tagu   content-typeu   content_typeu   content-encodingu   content_encodingu   headersu   delivery_infou   utf-8u
   postencode(   t   _rawRB   t   decode_bodyt   updatet   superRc   R(   R   (   R   R,   t   payloadRa   t
   propertiest   body(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR(      s    	
	c         C@ s|   |  j  } |  j j |  j | j d   \ } } t |  j  } | j d d   i | d 6| d 6|  j	 d 6|  j
 d 6| d 6S(   Nu   body_encodingu   compressionu   bodyu
   propertiesu   content-typeu   content-encodingu   headers(   Ri   R,   t   encode_bodyRj   RB   t   dictt   headersRC   R%   t   content_typet   content_encoding(   R   t   propsRj   RR   Rm   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   serializable  s    	

(   R   R    R(   Rq   (    (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyRc      s   	t   AbstractChannelc           B@ s\   e  Z d  Z d	 d  Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 d	 d  Z RS(
   u   This is an abstract class defining the channel methods
    you'd usually want to implement in a virtual channel.

    Do not subclass directly, but rather inherit from :class:`Channel`
    instead.

    c         C@ s   t  d   d S(   u   Get next message from `queue`.u$   Virtual channels must implement _getN(   t   NotImplementedError(   R   t   queuet   timeout(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   _get  s    c         C@ s   t  d   d S(   u   Put `message` onto `queue`.u$   Virtual channels must implement _putN(   Rs   (   R   Rt   R?   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   _put  s    c         C@ s   t  d   d S(   u!   Remove all messages from `queue`.u&   Virtual channels must implement _purgeN(   Rs   (   R   Rt   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   _purge#  s    c         C@ s   d S(   u<   Return the number of messages in `queue` as an :class:`int`.i    (    (   R   Rt   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   _size'  s    c         O@ s   |  j  |  d S(   u{   Delete `queue`.

        This just purges the queue, if you need to do more you can
        override this method.

        N(   Rx   (   R   Rt   R`   Ra   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   _delete+  s    c         K@ s   d S(   u   Create new queue.

        Your transport can override this method if it needs
        to do something whenever a new queue is declared.

        N(    (   R   Rt   Ra   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt
   _new_queue4  s    c         K@ s   t  S(   u   Verify that queue exists.

        Should return :const:`True` if the queue exists or :const:`False`
        otherwise.

        (   R\   (   R   Rt   Ra   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt
   _has_queue=  s    c         C@ s
   | j    S(   u-   Poll a list of queues for available messages.(   RB   (   R   t   cycleRu   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   _pollF  s    N(   R   R    R"   R%   Rv   Rw   Rx   Ry   Rz   R{   R|   R~   (    (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyRr     s   									t   Channelc           B@ s^  e  Z d  Z e Z e Z e Z e e  Z	 e
 Z i e   d 6Z d Z e d  Z d0 Z d1 Z d   Z d0 d e
 e
 d0 e
 e
 d  Z e
 e
 d  Z d0 e
 d	  Z e
 e
 d
  Z d   Z d d e
 d0 d  Z d d e
 d0 d  Z d0 d d0 d  Z d0 d d0 d  Z d   Z d   Z d   Z  d   Z! d   Z" d   Z# e
 d  Z$ d   Z% e
 d  Z& e
 d  Z' d d e
 d  Z( d   Z) d   Z* d d  Z+ d0 d   Z, d!   Z- d"   Z. d0 d#  Z/ d$   Z0 d0 d0 d0 d0 d0 d%  Z1 e d&  Z2 d'   Z3 d0 d(  Z4 d0 d)  Z5 d*   Z6 d+   Z7 d,   Z8 e9 d-    Z: e9 d.    Z; e9 d/    Z< RS(2   u^   Virtual channel.

    :param connection: The transport instance this channel is part of.

    u   base64i   u   body_encodingu   deadletter_queuec         @ s  |   _  t     _ d    _ i    _ g    _ d    _ t   _	 t
   f d   t   j  D    _ y   j  j j     _ Wn> t k
 r t d j t   j  j    j  j  d   n X  j  j j } x=   j D]2 } y t   | | |  Wq t k
 rq Xq Wd  S(   Nc         3@ s'   |  ] \ } } | |    f Vq d  S(   N(    (   t   .0t   typt   cls(   R   (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pys	   <genexpr>}  s    u1   No free channel ids, current={0}, channel_max={1}i   i
   (   i   i
   (   t
   connectionR1   t
   _consumersR%   t   _cyclet   _tag_to_queuet   _active_queuest   _qosR/   t   closedRl   R
   t   exchange_typest   _avail_channel_idsRC   t
   channel_idt
   IndexErrorR   t   formatR9   t   channelst   channel_maxt   clientt   transport_optionst   from_transport_optionst   setattrRD   (   R   R   Ra   t   toptst   opt_name(    (   R   sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR(   r  s,    						%u   directc   	      C@ s!  | p	 d } | p d | } | rk | |  j  j k rg t d j | |  j j j pR d  d d d   n  d	 Sye |  j  j | } |  j |  j | | | | | |  s t	 t
 j | |  j j j p d    n  WnJ t k
 ri | d
 6| d 6| d 6| pi  d 6g  d 6|  j  j | <n Xd	 S(   u   Declare exchange.u   directu   amq.%su,   NOT_FOUND - no exchange {0!r} in vhost {1!r}u   /i2   i
   u   Channel.exchange_declareu   404Nu   typeu   durableu   auto_deleteu	   argumentsu   table(   i2   i
   (   R]   R&   R   R   R   R   t   virtual_hostt   typeoft
   equivalentR!   t   NOT_EQUIVALENT_FMTRD   (	   R   t   exchanget   typet   durablet   auto_deletet	   argumentst   nowaitt   passivet   prev(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   exchange_declare  s.    		%c         C@ sV   x9 |  j  |  D]( \ } } } |  j | d t d t q W|  j j j | d  d S(   u'   Delete `exchange` and all its bindings.t	   if_unusedt   if_emptyN(   t	   get_tablet   queue_deleteR\   R]   R&   RC   R%   (   R   R   R   R   t   rkeyRR   Rt   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   exchange_delete  s    c         K@ s   | p d t    } | r_ |  j | |  r_ t d j | |  j j j pJ d  d	 d d   n |  j | |  t | |  j	 |  d  S(
   u   Declare queue.u
   amq.gen-%su)   NOT_FOUND - no queue {0!r} in vhost {1!r}u   /i2   i
   u   Channel.queue_declareu   404i    (   i2   i
   (
   R   R|   R   R   R   R   R   R{   R   Ry   (   R   Rt   R   Ra   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   queue_declare  s    c   	      K@ s   | r |  j  |  r d Sy |  j j | \ } } } Wn t k
 rJ d SX|  j |  j | | | |  } |  j | | |  |  j j j | d  d S(   u   Delete queue.N(	   Ry   R]   R'   RD   R   t   prepare_bindRz   RC   R%   (	   R   Rt   R   R   Ra   R   t   routing_keyR   t   meta(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR     s    c         C@ s   |  j  |  d  S(   N(   R   (   R   Rt   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   after_reply_message_received  s    u    c         C@ s   t  d   d  S(   Nu(   transport does not support exchange_bind(   Rs   (   R   t   destinationt   sourceR   R   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   exchange_bind  s    c         C@ s   t  d   d  S(   Nu*   transport does not support exchange_unbind(   Rs   (   R   R   R   R   R   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   exchange_unbind  s    c         K@ s   | |  j  j k r d S| p d } |  j  j | j d g   } | | | f |  j  j | <|  j |  j | | | |  } | j |  |  j r |  j | |  n  d S(   u.   Bind `queue` to `exchange` with `routing key`.Nu
   amq.directu   table(	   R]   R'   R&   t
   setdefaultR   R   RA   t   supports_fanoutt   _queue_bind(   R   Rt   R   R   R   Ra   t   tableR   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt
   queue_bind  s    	c         K@ s   t  d   d  S(   Nu'   transport does not support queue_unbind(   Rs   (   R   Rt   R   R   R   Ra   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   queue_unbind  s    c         @ s     f d     j  j D S(   Nc         3@ s=   |  ]3 }   j  |  D] \ } } } | | | f Vq q d  S(   N(   R   (   R   R   R   t   patternRt   (   R   (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pys	   <genexpr>  s   (   R]   R&   (   R   (    (   R   sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   list_bindings  s    c         K@ s   |  j  |  S(   u%   Remove all ready messages from queue.(   Rx   (   R   Rt   Ra   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   queue_purge  s    c         C@ s   t    S(   N(   R   (   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   _next_delivery_tag  s    c         K@ s   |  j  | d |  j  \ | d <} | d } | j d | d |  j    | d j d | d |  | r |  j |  j | | | |  S|  j | | |  S(   u   Publish message.u   bodyu
   propertiest   body_encodingR@   u   delivery_infoR   R   (   Rk   R   Rf   R   R   t   deliverRw   (   R   R?   R   R   Ra   R   Rp   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   basic_publish  s    
	c         @ s`   |  j  | < j j |      f d   } |  j j | < j j |   j   d S(   u   Consume from `queue`c         @ s;    j   |   }  s1  j j | | j  n    |  S(   N(   Rc   t   qosRA   R@   (   t   raw_messageR?   (   t   callbackt   no_ackR   (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt	   _callback  s    N(   R   R   RA   R   t
   _callbacksR   R3   t   _reset_cycle(   R   Rt   R   R   t   consumer_tagRa   R   (    (   R   R   R   sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   basic_consume  s    c         C@ s   | |  j  k r |  j  j |  |  j   |  j j | d  } y |  j j |  Wn t k
 re n X|  j j	 j | d  n  d S(   u    Cancel consumer by consumer tag.N(
   R   t   removeR   R   RC   R%   R   t
   ValueErrorR   R   (   R   R   Rt   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   basic_cancel  s    
c         K@ sZ   yB |  j  |  |  j |   } | s= |  j j | | j  n  | SWn t k
 rU n Xd S(   u+   Get message by direct access (synchronous).N(   Rc   Rv   R   RA   R@   R	   (   R   Rt   R   Ra   R?   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt	   basic_get*  s    c         C@ s   |  j  j |  d S(   u   Acknowledge message.N(   R   RH   (   R   R@   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt	   basic_ack4  s    c         C@ s#   | r |  j  j   St d   d S(   u   Recover unacked messages.u'   Does not support recover(requeue=False)N(   R   RT   Rs   (   R   RJ   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   basic_recover8  s    c         C@ s   |  j  j | d | d S(   u   Reject message.RJ   N(   R   RK   (   R   R@   RJ   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   basic_reject>  s    i    c         C@ s   | |  j  _ d S(   u\   Change QoS settings for this channel.

        Only `prefetch_count` is supported.

        N(   R   R-   (   R   t   prefetch_sizeR-   t   apply_global(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt	   basic_qosB  s    c         C@ s   t  |  j j  S(   N(   RZ   R]   R&   (   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   get_exchangesK  s    c         C@ s   |  j  j | d S(   u%   Get table of bindings for `exchange`.u   table(   R]   R&   (   R   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR   N  s    c         C@ s=   y |  j  j | d } Wn t k
 r1 | } n X|  j | S(   u.   Get the exchange type instance for `exchange`.u   type(   R]   R&   RD   R   (   R   R   t   defaultR   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR   R  s
    
c         C@ s   | d k r |  j } n  y. |  j |  j |  j |  | | |  } Wn t k
 r_ g  } n X| r | d k	 r t j t t	 j
 d | d |    |  j |  | g } n  | S(   u   Find all queues matching `routing_key` for the given `exchange`.

        Must return the string `default` if no queues matched.

        R   R   N(   R%   t   deadletter_queueR   t   lookupR   RD   t   warningst   warnR#   t   UNDELIVERABLE_FMTR   R{   (   R   R   R   R   t   R(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   _lookupZ  s    
c         C@ sX   | j  } | j   } t | d <x2 |  j | d | d  D] } |  j | |  q: Wd S(   u.   Redeliver message to its original destination.u   redeliveredu   exchangeu   routing_keyN(   t   delivery_infoRq   R\   R   Rw   (   R   R?   R   Rt   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyRL   r  s    	
	c         C@ s   |  j  |  S(   N(   RL   (   R   R?   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyRI   {  s    c         C@ s`   |  j  rS |  j j   rS t |  d  r= |  j |  j d | S|  j |  j d | St    d  S(   Nu	   _get_manyRu   (	   R   R   R;   t   hasattrt	   _get_manyR   R~   R}   R	   (   R   Ru   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   drain_events~  s
    c         C@ s)   t  | |  j  s% |  j |  d | S| S(   u1   Convert raw message to :class:`Message` instance.Rh   (   t
   isinstanceRc   (   R   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   message_to_python  s    c         C@ sa   | p	 i  } | j  d i   } | p' d | d <i | d 6| d 6| d 6| pO i  d 6| p\ i  d 6S(	   u   Prepare message data.u   delivery_infoi    u   priorityu   bodyu   content-encodingu   content-typeu   headersu
   properties(   R   (   R   Rj   t   priorityRn   Ro   Rm   Ri   t   info(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   prepare_message  s    
c         C@ s   t  d   d S(   u   Enable/disable message flow.

        :raises NotImplementedError: as flow
            is not implemented by the base virtual implementation.

        u%   virtual channels do not support flow.N(   Rs   (   R   t   active(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   flow  s    c         C@ s   |  j  s t |  _  x$ t |  j  D] } |  j |  q" W|  j rR |  j j   n  |  j d k	 rz |  j j	   d |  _ n  |  j
 d k	 r |  j
 j |   q n  d |  _ d S(   uJ   Close channel, cancel all consumers, and requeue unacked
        messages.N(   R   R\   RZ   R   R   R   R7   R   R%   t   closeR   t   close_channelR   (   R   t   consumer(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR     s    			c         C@ s/   | r% |  j  j |  j |  | f S| | f S(   N(   t   codecsRB   R   (   R   Rj   t   encoding(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyRk     s    c         C@ s#   | r |  j  j |  j |  S| S(   N(   R   RB   R   (   R   Rj   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyRe     s    c         C@ s   t  |  j |  j t  |  _ d  S(   N(   R   Rv   R   R	   R   (   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR     s    c         C@ s   |  S(   N(    (   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt	   __enter__  s    c         G@ s   |  j    d  S(   N(   R   (   R   t   exc_info(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   __exit__  s    c         C@ s
   |  j  j S(   u/   Broker state containing exchanges and bindings.(   R   R]   (   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR]     s    c         C@ s+   |  j  d k r$ |  j |   |  _  n  |  j  S(   u&   :class:`QoS` manager for this channel.N(   R   R%   R*   (   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR     s    c         C@ s#   |  j  d  k r |  j   n  |  j  S(   N(   R   R%   R   (   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR}     s    N(   u   body_encodingu   deadletter_queue(=   R   R    R"   Rc   R*   R\   RW   Rl   R   R   R/   R   R   R   R   R   t   _delivery_tagsR%   R   R   R(   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   RL   RI   R   R   R   R   R   Rk   Re   R   R   R   t   propertyR]   R   R}   (    (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR   K  sv   									
												t
   Managementc           B@ s#   e  Z d    Z d   Z d   Z RS(   c         C@ s,   t  t |   j |  | j j   |  _ d  S(   N(   Rg   R   R(   R   R,   (   R   t	   transport(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR(     s    c      	   C@ s>   g  |  j  j   D]* \ } } } t d | d | d |  ^ q S(   NR   R   R   (   R,   R   Rl   (   R   t   qt   et   r(    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   get_bindings  s    c         C@ s   |  j  j   d  S(   N(   R,   R   (   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR     s    (   R   R    R(   R   R   (    (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR     s   		t	   Transportc           B@ s   e  Z d  Z e Z e Z e Z e   Z d Z
 d Z d Z d Z d Z d Z d   Z d   Z d   Z d   Z d   Z d d  Z d d	  Z e d
    Z RS(   uP   Virtual transport.

    :param client: :class:`~kombu.Connection` instance

    g      ?i  c         K@ s   | |  _  g  |  _ g  |  _ i  |  _ |  j |  j |  j t  |  _ | j j	 d  } | d  k	 rl | |  _ n  t t t |  j d d   |  _ d  S(   Nu   polling_intervali    i(   R   R   t   _avail_channelsR   t   Cyclet   _drain_channelR	   R}   R   RB   R%   t   polling_intervalR   t   ARRAY_TYPE_Ht   rangeR   R   (   R   R   Ra   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR(     s    				c         C@ sI   y |  j  j   SWn1 t k
 rD |  j |  } |  j j |  | SXd  S(   N(   R   RC   R   R   R   RA   (   R   R   R,   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   create_channel  s    c         C@ sP   z? |  j  j | j  y |  j j |  Wn t k
 r= n XWd  d  | _ Xd  S(   N(   R   RA   R   R   R   R   R%   R   (   R   R,   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR     s    c         C@ s   |  j  j |  j |    |  S(   N(   R   RA   R   (   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   establish_connection%  s    c         C@ so   |  j  j   x[ |  j |  j f D]G } x> | rf y | j   } Wn t t f k
 rX q) X| j   q) Wq  Wd  S(   N(   R}   R   R   R   RC   R   RD   (   R   R   t   lR,   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   close_connection,  s    	c         C@ s   d } t    } |  j j } |  j } x} y | d |  \ } } Wn\ t k
 r | rx t    | | k rx t j    n  | d 7} | d  k	 r t |  q q' XPq' W| \ }	 }
 |
 s |
 |  j	 k r t
 d j |
 |	    n  |  j	 |
 |	  d  S(   Ni    Ru   i   u.   Message for queue {0!r} without consumers: {1}(   R   R}   RB   R   R	   t   socketRu   R%   R   R   RD   R   (   R   R   Ru   t   loopt
   time_startRB   R   t   itemR,   R?   Rt   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR   7  s(    		
c         C@ s   | j  d |  S(   NRu   (   R   (   R   R,   Ru   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR   Q  s    c         C@ s   i |  j  d 6d d 6S(   Nu   portu	   localhostu   hostname(   t   default_port(   R   (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   default_connection_paramsT  s    N(   R   R    R"   R   R   R   R   R$   R]   R%   R}   R  R   R   R   R   R(   R   R   R   R  R   R   R   R  (    (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyR     s&   				
		(:   R"   t
   __future__R    R   R   R  t   sysR   R   t	   itertoolsR   t   multiprocessing.utilR   t   timeR   t   amqp.protocolR   t   kombu.exceptionsR   R   t
   kombu.fiveR	   R
   R   t   kombu.utilsR   R   R   R   t   kombu.utils.compatR   t   kombu.utils.encodingR   R   t   kombu.transportR   t
   schedulingR   R   R   t   version_infoR   R   R   t   objectR   t	   ExceptionR!   t   UserWarningR#   R$   R*   Rc   Rr   t
   StdChannelR   R   R   (    (    (    sB   /tmp/pip-unpacked-wheel-UAnTfW/kombu/transport/virtual/__init__.pyt   <module>	   s@   "	$9 