o
    wvXjc  ã                   @   s"  d Z ddlmZm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mZ ddlmZ dd	lmZmZ dd
lmZ zddlmZ W n eyW   ddlmZ Y nw zejZW n eyi   ejZY nw dZej dd¡fdd„ZG dd„ de ƒZ!G dd„ de ƒZ"dd„ Z#dd„ Z$dS )z[Task Routing.

Contains utilities for working with task routers, (:setting:`task_routes`).
é    )Úabsolute_importÚunicode_literalsN)ÚOrderedDict)ÚQueue)ÚQueueNotFound)ÚitemsÚstring_t)Úlpmerge)Úmaybe_evaluateÚmlazy)Úsymbol_by_name)ÚMapping)ÚMapRouteÚRouterÚprepareÚ*Ú c                    s$   d  ‡ fdd„| D ƒ¡} |  dd¡S )Nr   c                 3   s$   � | ]}|ˆ v rd | n|V  qdS )ú\N© )Ú.0Úc©Úquoter   úN/var/www/html/myproject/venv/lib/python3.10/site-packages/celery/app/routes.pyÚ	<genexpr>%   s   €" zglob_to_re.<locals>.<genexpr>r   z.+?)ÚjoinÚreplace)Úglobr   r   r   r   Ú
glob_to_re$   s   r   c                   @   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   st   t |tƒr	t|ƒn|}i | _tƒ | _|D ]#\}}t |tƒr#|| j|< qd|v r2|| jt t	|ƒ¡< q|| j|< qd S )Nr   )
Ú
isinstancer   r   Úmapr   ÚpatternsÚPatternÚreÚcompiler   )Úselfr    ÚkÚvr   r   r   Ú__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 t| 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__8   s    ÿ
ÿýÿzMapRoute.__call__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r(   r4   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%   r<   r;   r=   r:   r   r   r   r(   J   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_destinationr<   Úlookup_router	   r:   ÚconfÚtask_default_queue)r%   Úoptionsr/   r0   r1   Ú	task_typer3   r   r   r   r3   Q   s   
ÿÿzRouter.routec                 C   sr   t |tƒr|i }}n| dd ¡}|r7t |tƒr||d< |S z
| j| |d< W |S  ty6   td |¡ƒ‚w |S )Nr*   z$Queue {0!r} missing from task_queues)r   r   Úpopr   r;   r,   r   Úformat)r%   r3   r*   r   r   r   r>   ]   s    

ûýÿÿzRouter.expand_destinationc           	      C   s8   | j }| jD ]}|||||||ƒ}|d ur|  S qd S r9   )Úquery_routerr<   )	r%   r/   r0   r1   rB   rC   ÚqueryÚrouterr3   r   r   r   r?   q   s   
ÿþzRouter.lookup_routec                 C   s2   t |ƒ}t|dƒr| |||¡S ||||||d�S )NÚroute_for_task)Útask)r
   ÚhasattrrI   )r%   rH   rJ   r0   r1   rB   rC   r   r   r   rF   y   s   
zRouter.query_router)NNFN)r   NN)NNNN)	r5   r6   r7   r8   r(   r3   r>   r?   rF   r   r   r   r   r   G   s    
ÿ

ÿr   c                 C   s   t | ƒ} t| dƒr| ƒ } | S )NrI   )r   rK   )rH   r   r   r   Úexpand_router_string�   s   
rL   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 r9   )r   r   ÚlistÚtupler   r   r   rL   )r3   r   r   r   Úexpand_route‹   s
   

zprepare.<locals>.expand_routeNr   c                    s   g | ]}ˆ |ƒ‘qS r   r   )r   r3   ©rO   r   r   Ú
<listcomp>–   s    zprepare.<locals>.<listcomp>)r   rM   rN   )r<   r   rP   r   r   ‰   s   r   )%r8   Ú
__future__r   r   r#   ÚstringÚcollectionsr   Úkombur   Úcelery.exceptionsr   Úcelery.fiver   r   Úcelery.utils.collectionsr	   Úcelery.utils.functionalr
   r   Úcelery.utils.importsr   Úcollections.abcr   ÚImportErrorÚ_pattern_typer"   ÚAttributeErrorÚ__all__Úpunctuationr   r   Úobjectr   r   rL   r   r   r   r   r   Ú<module>   s6   þ

þ: