U
    bh                     @   s   d 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 z
ejZW n ek
r   ejZY nX d
ZG dd dZG dd dZdd Zdd ZdS )z[Task Routing.

Contains utilities for working with task routers, (:setting:`task_routes`).
    N)OrderedDict)Mapping)Queue)QueueNotFound)lpmerge)maybe_evaluatemlazy)symbol_by_name)MapRouteRouterexpand_router_stringpreparec                   @   s    e Zd ZdZdd Zdd ZdS )r
   z(Creates a router out of a :class:`dict`.c                 C   sv   t |tr| n|}i | _t | _|D ]H\}}t |trF|| j|< q(d|krf|| jtt	
|< q(|| j|< q(d S )N*)
isinstancer   itemsmapr   patternsPatternrecompilefnmatch	translate)selfr   kv r   5/tmp/pip-unpacked-wheel-kcem4wq5/celery/app/routes.py__init__   s    
zMapRoute.__init__c              	   O   s   zt | j| W S  tk
r$   Y n" tk
rD   d| j| i Y S X | j D ]B\}}||rPzt |W   S  tk
r   d|i Y   S X qPd S Nqueue)dictr   KeyError
ValueErrorr   r   match)r   nameargskwargsregexrouter   r   r   __call__)   s    
zMapRoute.__call__N)__name__
__module____qualname____doc__r   r)   r   r   r   r   r
      s   r
   c                   @   s>   e Zd ZdZdddZdddZd	d
 ZdddZdd ZdS )r   z8Route tasks based on the :setting:`task_routes` setting.NFc                 C   s4   || _ |d kri n|| _|d kr$g n|| _|| _d S N)appqueuesroutescreate_missing)r   r1   r0   r2   r/   r   r   r   r   ;   s    zRouter.__init__r   c                 C   sd   |si n|}|  |}| jrB| |||||}|rBt|  ||S d|kr`t|  | jjj|}|S r   )expand_destinationr1   lookup_router   r/   confZtask_default_queue)r   optionsr$   r%   r&   	task_typer(   r   r   r   r(   B   s    
zRouter.routec                 C   sv   t |tr|i  }}n|dd }|rrt |tr:||d< n8z| j| |d< W n$ tk
rp   td|dY nX |S )Nr   zQueue z missing from task_queues)r   strpopr   r0   r!   r   )r   r(   r   r   r   r   r3   N   s    




zRouter.expand_destinationc           	      C   s8   | j }| jD ]&}|||||||}|d k	r|  S qd S r.   )query_routerr1   )	r   r$   r%   r&   r6   r7   queryrouterr(   r   r   r   r4   b   s
    
zRouter.lookup_routec                 C   s2   t |}t|dr ||||S ||||||dS )Nroute_for_task)task)r   hasattrr=   )r   r<   r>   r%   r&   r6   r7   r   r   r   r:   j   s    
zRouter.query_router)NNFN)r   NN)NNNN)	r*   r+   r,   r-   r   r(   r3   r4   r:   r   r   r   r   r   8   s       

       
r   c                 C   s   t | } t| dr|  } | S )Nr=   )r	   r?   )r<   r   r   r   r   r   s    
r   c                    s:   dd  | dkrdS t | ttfs(| f}  fdd| D S )z*Expand the :setting:`task_routes` setting.c                 S   s0   t | tttfrt| S t | tr,tt| S | S r.   )r   r   listtupler
   r8   r   r   )r(   r   r   r   expand_route}   s
    

zprepare.<locals>.expand_routeNr   c                    s   g | ]} |qS r   r   ).0r(   rB   r   r   
<listcomp>   s     zprepare.<locals>.<listcomp>)r   r@   rA   )r1   r   rD   r   r   z   s    r   )r-   r   r   collectionsr   collections.abcr   Zkombur   Zcelery.exceptionsr   Zcelery.utils.collectionsr   Zcelery.utils.functionalr   r   Zcelery.utils.importsr	   Z_pattern_typer   AttributeError__all__r
   r   r   r   r   r   r   r   <module>   s$   
: