U
    bh                     @   s   d Z ddlZddlZddlZddlmZ ddlmZmZ zddl	m
Z
 W n  ek
rh   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)import_module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-kcem4wq5/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   zt  } W n tk
r$   d} Y nX | s2dV  nT| tjkrDdV  nBtjd|  z
| V  W 5 ztj|  W n tk
r   Y nX X dS )z9Context adding the current working directory to sys.path.Nr   )osgetcwdFileNotFoundErrorsyspathinsertremove
ValueError)cwdr   r   r   r   3   s    


r   c                 C   s   |dkrt }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      )	r   r   ImportErrorsplit	enumerater   __path__AttributeErrorr	   )moduler&   imppartsipartpackageZmpartr   r   r   r   I   s&    

r   c              
   C   s6   |dkrt }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   )r2   r3   r7   r   r   r   r   d   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   p   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   x   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   ~   s    
r   c                 c   sh   t jdkrt| d}n6zt | g }W n" tk
rJ   t j| d}Y nX |D ]}|j|jfV  qPd S )N)   
   )group)r%   version_infor   getr1   selectr   value)	namespaceZ_entry_pointsepr   r   r   load_extension_class_names   s    
rK   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: )rK   r   r-   SyntaxErrorwarningswarn)rI   r   
class_nameclsexcr   r   r   load_extension_classes   s    rR   )NN)NN)N)r   r"   r%   rM   
contextlibr   	importlibr   r   importlib.metadatar   r-   Zimportlib_metadataZkombu.utils.importsr   environrF   r   __all__	Exceptionr	   r
   r   r   r   r   r   r   r   rK   rR   r   r   r   r   <module>   s0   
	



