o
    Df                     @   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yG   ejZY nw 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 ]$\}}t |tr#|| j|< qd|v r3|| jtt	
|< q|| j|< qd S )N*)
isinstancer   itemsmapr   patternsPatternrecompilefnmatch	translate)selfr   kv r   J/home/ubuntu/webapp/venv/lib/python3.10/site-packages/celery/app/routes.py__init__   s   
zMapRoute.__init__c              	   O   s   zt | j| W S  ty   Y n ty    d| j| i Y S w | j D ] \}}||rFzt |W   S  tyE   d|i Y   S w q&d 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                   @   sD   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 u r	i n|| _|d u 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r!| |||||}|r!t|  ||S d|vr0t|  | jjj|}|S r   )expand_destinationr0   lookup_router   r.   conftask_default_queue)r   optionsr#   r$   r%   	task_typer'   r   r   r   r'   B   s   
zRouter.routec                 C   st   t |tr|i }}n|dd }|r8t |tr||d< |S z
| j| |d< W |S  ty7   td|dw |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 ur|  S qd S r-   )query_routerr0   )	r   r#   r$   r%   r6   r7   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%   r6   r7   r   r   r   r:   j   s   
zRouter.query_router)NNFN)r   NN)NNNN)	r)   r*   r+   r,   r   r'   r2   r3   r:   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u 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'   rC   r   r   
<listcomp>   s    zprepare.<locals>.<listcomp>)r   rA   rB   )r0   r   rE   r   r   z   s   r   )r,   r   r   collectionsr   collections.abcr   kombur   celery.exceptionsr   celery.utils.collectionsr   celery.utils.functionalr   r   celery.utils.importsr	   _pattern_typer   AttributeError__all__r
   r   r@   r   r   r   r   r   <module>   s(    

: