U
    d"                     @   s   d 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 dd
lmZmZmZmZ dZdadZed Ze ZG dd dZdddZdd Z dS )zLoader base class.    N)datetime)json)cached_property)signals)reraise)DictAttributeforce_mapping)
maybe_list)NotAPackagefind_moduleimport_from_cwdsymbol_by_name)
BaseLoaderFzPError: Module '{module}' doesn't exist, or it's not a valid Python module name.
zDid you mean '{suggest}'?
c                   @   s  e Zd ZdZe ZdZi ZdZe	Z
dd Zd7ddZdd	 Zd
d Zdd Zdd Zdd Zdd Zd8ddZd9ddZdd Zdd Zdd Zdd  Zd:d!d"Zd;d#d$Zd%d& Zd'd( Zd)ed*ddfd+d,Zd<d.d/Z d=d1d2Z!e"d3d4 Z#e$d5d6 Z%dS )>r   a  Base class for loaders.

    Loaders handles,

        * Reading celery client/worker configurations.

        * What happens when a task starts?
            See :meth:`on_task_init`.

        * What happens when the worker starts?
            See :meth:`on_worker_init`.

        * What happens when the worker shuts down?
            See :meth:`on_worker_shutdown`.

        * What modules are imported to find tasks?
    Fc                 K   s   || _ t | _d S N)appsettask_modules)selfr   kwargs r   7/tmp/pip-unpacked-wheel-mu1yl971/celery/loaders/base.py__init__<   s    zBaseLoader.__init__Tc                 C   s   |rt  S t  S r   )r   utcnownow)r   utcr   r   r   r   @   s    zBaseLoader.nowc                 C   s   dS )z!Called before a task is executed.Nr   )r   Ztask_idZtaskr   r   r   on_task_initE   s    zBaseLoader.on_task_initc                 C   s   dS )z Called after a task is executed.Nr   r   r   r   r   on_process_cleanupH   s    zBaseLoader.on_process_cleanupc                 C   s   dS )z9Called when the worker (:program:`celery worker`) starts.Nr   r   r   r   r   on_worker_initK   s    zBaseLoader.on_worker_initc                 C   s   dS )z=Called when the worker (:program:`celery worker`) shuts down.Nr   r   r   r   r   on_worker_shutdownN   s    zBaseLoader.on_worker_shutdownc                 C   s   dS )z#Called when a child process starts.Nr   r   r   r   r   on_worker_process_initQ   s    z!BaseLoader.on_worker_process_initc                 C   s   | j | | |S r   )r   addr   r   moduler   r   r   import_task_moduleT   s    zBaseLoader.import_task_moduleNc                 C   s   t j||dS N)package)	importlibimport_module)r   r#   r&   r   r   r   r(   X   s    zBaseLoader.import_modulec                 C   s   t ||d kr| jn||dS r%   )r   r(   )r   r#   impr&   r   r   r   r   [   s
    zBaseLoader.import_from_cwdc                    s@   t jj jd}|D ]\}}t|tr|q fdd jD S )N)Zsenderc                    s   g | ]}  |qS r   )r$   ).0mr   r   r   
<listcomp>j   s     z5BaseLoader.import_default_modules.<locals>.<listcomp>)r   Zimport_modulessendr   
isinstance	Exceptiondefault_modules)r   	responses_responser   r   r   import_default_modulesb   s
    
z!BaseLoader.import_default_modulesc                 C   s    | j sd| _ |   |   d S )NT)worker_initializedr4   r   r   r   r   r   init_workerl   s    zBaseLoader.init_workerc                 C   s   |    d S r   )r   r   r   r   r   shutdown_workerr   s    zBaseLoader.shutdown_workerc                 C   s   |    d S r   )r    r   r   r   r   init_worker_processu   s    zBaseLoader.init_worker_processc              	   C   sn   t |trDz| j|| jd}W n$ ttfk
rB   |r<Y dS  Y nX t|| _| jdd k	rj| jd | _	dS )Nr)   Foverride_backendsT)
r.   str_smart_importr   ImportErrorAttributeErrorr   _confgetr:   )r   objZsilentr   r   r   config_from_objectx   s    

zBaseLoader.config_from_objectc                 C   sV   |d kr| j n|}d|kr&t||dS z
||W S  tk
rP   t||d Y S X d S )N:r9   )r(   r   r=   )r   pathr)   r   r   r   r<      s    
zBaseLoader._smart_importc                 C   s   z|  | W nh tk
rv } zJ|drTttttj||d d dt d  ttj|d|W 5 d }~X Y nX | 	|S d S )Nz.py)r#   Zsuggest   )r#   )
r   r
   endswithr   CONFIG_WITH_SUFFIXformatsysexc_infoCONFIG_INVALID_NAMEr   )r   nameexcr   r   r   _import_config_module   s    

 

$z BaseLoader._import_config_modulec                 C   s   t |S r   )r   r"   r   r   r   r      s    zBaseLoader.find_moduleceleryz	\((\w+)\)c                    sz   |r|ndt ji}rn
ddddddlm m} o@ t|jf| fddtfdd|D S )	Nr   )tuplelistdictr   )
NAMESPACESOptionc              
      s  |  dd\}}| dd}|d dkr@|dd  }}n| dd\}}|r\|d p^d| }|}|r| d }||}|t| d }| |}nPz |  | |}W n4 t	k
r } zt	|d| W 5 d}~X Y nX ||fS )	z-Parse single configuration from command-line.=   .r2   r   N z: )
splitlowerreplacematchgroupsr@   lengroupZ	to_python
ValueError)argkeyvaluensZns_keycasttype_rN   )rT   	namespaceoverride_typesre_typetypemapr   r   getarg   s"    
$z0BaseLoader.cmdline_config_parser.<locals>.getargc                 3   s   | ]} |V  qd S r   r   )r*   rb   )rl   r   r   	<genexpr>   s     z3BaseLoader.cmdline_config_parser.<locals>.<genexpr>)r   loadsZcelery.app.defaultsrT   rU   r[   rS   rk   )r   argsrh   rj   Zextra_typesri   rU   r   )rT   rl   rh   ri   rj   rk   r   cmdline_config_parser   s    z BaseLoader.cmdline_config_parserCELERY_CONFIG_MODULEc                 C   s>   zt j| }W n tk
r"   Y nX |r:| |}t|S d S r   )osenvironKeyErrorrO   r   )r   envZcustom_configZusercfgr   r   r   read_configuration   s    
zBaseLoader.read_configurationtasksc                 C   s$   | j dd t|pd|D  d S )Nc                 s   s   | ]}|r|j V  qd S r   )__name__)r*   modr   r   r   rm      s   z0BaseLoader.autodiscover_tasks.<locals>.<genexpr>r   )r   updateautodiscover_tasks)r   packagesrelated_namer   r   r   r{      s
    zBaseLoader.autodiscover_tasksc                 C   s.   t | jt t| jjj t t| jjj S r   )rQ   builtin_modulesr	   r   confZimportsincluder   r   r   r   r0      s    zBaseLoader.default_modulesc                 C   s   | j tkr|  | _ | j S )zLoader configuration.)r?   unconfiguredrv   r   r   r   r   r      s    

zBaseLoader.conf)T)N)NN)F)N)rq   )rw   )&rx   
__module____qualname____doc__	frozensetr~   Z
configuredr:   r5   r   r?   r   r   r   r   r   r   r    r$   r(   r   r4   r6   r7   r8   rB   r<   rO   r   recompilerp   rv   r{   r   r0   propertyr   r   r   r   r   r   "   sF   






/



r   rw   c                    s.   t rdS da z fdd| D W S da X d S )Nr   TFc                    s   g | ]}t | qS r   )find_related_module)r*   pkgr}   r   r   r,      s     z&autodiscover_tasks.<locals>.<listcomp>)_RACE_PROTECTION)r|   r}   r   r   r   r{      s    r{   c              
   C   s   zt | }|s|r|W S W n* tk
rF   | d\} }}| sB Y nX |  d| }zt |W S  tk
r } z*t|d|}|dk	r||kr|W Y dS d}~X Y nX dS )zFind module in package.rX   rM   N)r'   r(   r=   
rpartitiongetattr)r&   r}   r#   r2   module_nameeZimport_exc_namer   r   r   r      s     

r   )rw   )!r   r'   rr   r   rJ   r   Zkombu.utilsr   Zkombu.utils.objectsr   rP   r   Zcelery.exceptionsr   Zcelery.utils.collectionsr   r   Zcelery.utils.functionalr	   Zcelery.utils.importsr
   r   r   r   __all__r   rL   rH   objectr   r   r{   r   r   r   r   r   <module>   s*    O
