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 zddlm	Z	 W n  e
k
rl   ddlm	Z	 Y nX ddlmZ ejdZdZG d	d
 d
eZdd Zdd Zedd ZdddZd ddZd!ddZdd Zdd Zdd Zdd ZdS )"z;Utilities related to importing modules and symbols by name.    N)contextmanager)reload)entry_pointssymbol_by_nameMP_MAIN_FILE)
NotAPackagequalnameinstantiater   cwd_in_pathfind_moduleimport_from_cwdreload_from_cwdmodule_filegen_task_namec                   @   s   e Zd ZdZdS )r   z8Raised when importing a package, but it's not a package.N)__name__
__module____qualname____doc__ r   r   8/tmp/pip-unpacked-wheel-mu1yl971/celery/utils/imports.pyr      s   r   c                 C   sB   t | dst | dr| j} t| dd}d|kr>d| j|f}|S )zReturn object name.r   	__class__r   N.)hasattrr   getattrjoinr   )objqr   r   r   r	   !   s    r	   c                 O   s   t | ||S )zNInstantiate class by name.

    See Also:
        :func:`symbol_by_name`.
    r   )nameargskwargsr   r   r   r
   +   s    r
   c                  c   s`   t  } | tjkrdV  nBtjd|  z
| V  W 5 ztj|  W n tk
rX   Y nX X dS )z9Context adding the current working directory to sys.path.Nr   )osgetcwdsyspathinsertremove
ValueError)cwdr   r   r   r   4   s    

r   c                 C   s   |dkrt j}t  z|| W W  5 Q R  S  tk
r   d| kr| d}t|dd D ]n\}}d|d|d  }z||}W n tk
r   Y  qY nX z
|j W q^ tk
r   t	|Y q^X q^ Y nX W 5 Q R X dS )z3Version of :func:`imp.find_module` supporting dots.Nr      )
	importlibimport_moduler   ImportErrorsplit	enumerater   __path__AttributeErrorr   )moduler$   imppartsipartpackageZmpartr   r   r   r   E   s&    

r   c              
   C   s8   |dkrt j}t  || |dW  5 Q R  S Q R X dS )zImport module, temporarily including modules in the current directory.

    Modules located in the current directory has
    precedence over modules located in `sys.path`.
    N)r7   )r+   r,   r   )r2   r3   r7   r   r   r   r   `   s    r   c              
   C   s2   |dkrt }t  || W  5 Q R  S Q R X dS )z1Reload module (ensuring that CWD is in sys.path).N)r   r   )r2   Zreloaderr   r   r   r   l   s    r   c                 C   s    | j }|dr|dd S |S )z2Return the correct original file name of a module.z.pycNr)   )__file__endswith)r2   r   r   r   r   r   t   s    r   c                 C   s   |pd}zt j| }W n tk
r.   d}Y nX |dk	rP|j}trP|jtkrPd}|dkrn| jrnd| j|gS ddd ||fD S )z)Generate task name from name/module pair.__main__Nr   c                 s   s   | ]}|r|V  qd S Nr   ).0pr   r   r   	<genexpr>   s      z gen_task_name.<locals>.<genexpr>)r#   modulesKeyErrorr   r   r8   mainr   )Zappr   module_namer2   r   r   r   r   z   s    
r   c                 c   s&   t  | g D ]}|j|jfV  qd S r;   )r   getr   value)	namespaceepr   r   r   load_extension_class_names   s    rG   c                 c   sp   t | D ]b\}}zt|}W nB ttfk
r^ } z td|  d|d| W 5 d }~X Y qX ||fV  qd S )NzCannot load z extension z: )rG   r   r-   SyntaxErrorwarningswarn)rE   r   
class_nameclsexcr   r   r   load_extension_classes   s    rN   )NN)NN)N)r   r+   r!   r#   rI   
contextlibr   r   importlib.metadatar   r-   Zimportlib_metadataZkombu.utils.importsr   environrC   r   __all__	Exceptionr   r	   r
   r   r   r   r   r   r   rG   rN   r   r   r   r   <module>   s2   
	



