U
    d                     @   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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-9cz4377o/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   r0   r/   r1   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_destinationr0   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   r/   r    r   )r   r'   r   r   r   r   r2   N   s    




zRouter.expand_destinationc           	      C   s8   | j }| jD ]&}|||||||}|d k	r|  S qd S r-   )query_routerr0   )	r   r#   r$   r%   r5   r6   queryrouterr'   r   r   r   r3   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%   r5   r6   r   r   r   r9   j   s    
zRouter.query_router)NNFN)r   NN)NNNN)	r)   r*   r+   r,   r   r'   r2   r3   r9   r   r   r   r   r   8   s       

       
r   c                 C   s   t | } t| dr|  } | S )Nr<   )r	   r>   )r;   r   r   r   expand_router_stringr   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
   r7   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   )r0   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$   
: