U
    .e                     @   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-f4liivr4/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   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   D   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)r6   )r   r   )r1   r2   r6   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   )r1   Zreloaderr   r   r   r   k   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)r1   r   r   r   r   r   s   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   r7   mainr   )Zappr   module_namer1   r   r   r   r   y   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   getr0   selectr   value)	namespaceZ_entry_pointsepr   r   r   load_extension_class_names   s    
rJ   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: )rJ   r   r,   SyntaxErrorwarningswarn)rH   r   
class_nameclsexcr   r   r   load_extension_classes   s    rQ   )NN)NN)N)r   r"   r$   rL   
contextlibr   	importlibr   r   importlib.metadatar   r,   Zimportlib_metadataZkombu.utils.importsr   environrE   r   __all__	Exceptionr	   r
   r   r   r   r   r   r   r   rJ   rQ   r   r   r   r   <module>   s0   
	



