U
    l/e*                     @   s   d Z ddlZddlZejd dkZer2efZdZnefZddl	mZ i Z
dae Zdd Zdd	 Zd
d Zdd Zdd ZG dd dZG dd dZG dd dZdd ZdS )zThis module implements a post import hook mechanism styled after what is
described in PEP-369. Note that it doesn't cope with modules being reloaded.

    N   )	find_specFc                    s    fdd}|S )Nc                    sF     d\}}| d}t| tj| }|D ]}t||}q.|| S )N:.)split
__import__sysmodulesgetattr)modulemodule_namefunctionattrscallbackattrname 2/tmp/pip-unpacked-wheel-8a8nxbh1/wrapt/importer.pyimport_hook$   s    

z4_create_import_hook_from_string.<locals>.import_hookr   )r   r   r   r   r   _create_import_hook_from_string#   s    r   c              	   C   sv   t | trt| } tF ts0datjdt  tj	
|d }|d krXt|g |  W 5 Q R X |d k	rr| | d S )NTr   )
isinstancestring_typesr   _post_import_hooks_lock_post_import_hooks_initr   	meta_pathinsertImportHookFinderr	   get_post_import_hooks
setdefaultappend)hookr   r   r   r   r   register_post_import_hook.   s    
r#   c                    s    fdd}|S )Nc                    s4   t  j tj j } jD ]}t||}q|| S N)r   r   r   r	   r   r
   )r   r   r   
entrypointr   r   r   R   s
    

z8_create_import_hook_from_entrypoint.<locals>.import_hookr   )r&   r   r   r%   r   #_create_import_hook_from_entrypointQ   s    r'   c                 C   sN   zdd l }W n tk
r"   Y d S X |j| dD ]}t|}t||j q0d S )Nr   )group)pkg_resourcesImportErroriter_entry_pointsr'   r#   r   )r(   r)   r&   r   r   r   r   discover_post_import_hooksZ   s    r,   c              	   C   s>   t | dd }t t|d}W 5 Q R X |D ]}||  q,d S )N__name__r   )r
   r   r   pop)r   r   hooksr"   r   r   r   notify_module_loadedi   s
    r0   c                   @   s   e Zd Zdd ZdS )_ImportHookLoaderc                 C   s   t j| }t| |S r$   )r   r	   r0   selffullnamer   r   r   r   load_module}   s    
z_ImportHookLoader.load_moduleN)r-   
__module____qualname__r5   r   r   r   r   r1   {   s   r1   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )_ImportHookChainedLoaderc                 C   s@   || _ t|dr| j| _t|dr*| j| _t|dr<| j| _d S )Nr5   create_moduleexec_module)loaderhasattr_load_moduler5   _create_moduler9   _exec_moduler:   )r3   r;   r   r   r   __init__   s    


z!_ImportHookChainedLoader.__init__c                 C   st   G dd d}t |d|d | fkrDz| j|_W n tk
rB   Y nX t |dd d k	rpt |jdd | krp| j|j_d S )Nc                   @   s   e Zd ZdS )z7_ImportHookChainedLoader._set_loader.<locals>.UNDEFINEDN)r-   r6   r7   r   r   r   r   	UNDEFINED   s    rA   
__loader____spec__r;   )r
   r;   rB   AttributeErrorrC   )r3   r   rA   r   r   r   _set_loader   s    z$_ImportHookChainedLoader._set_loaderc                 C   s"   | j |}| | t| |S r$   )r;   r5   rE   r0   r2   r   r   r   r=      s    
z%_ImportHookChainedLoader._load_modulec                 C   s   | j |S r$   )r;   r9   )r3   specr   r   r   r>      s    z'_ImportHookChainedLoader._create_modulec                 C   s"   |  | | j| t| d S r$   )rE   r;   r:   r0   )r3   r   r   r   r   r?      s    
z%_ImportHookChainedLoader._exec_moduleN)r-   r6   r7   r@   rE   r=   r>   r?   r   r   r   r   r8      s
   

r8   c                   @   s(   e Zd Zdd ZdddZd	ddZdS )
r   c                 C   s
   i | _ d S r$   )in_progress)r3   r   r   r   r@      s    zImportHookFinder.__init__Nc              	   C   s   t  |tkrW 5 Q R  d S W 5 Q R X || jkr4d S d| j|< zDtsVt| t W 0S tt|dd }|rt|tst|W S W 5 | j|= X d S NTr;   )	r   r   rG   r   r   r1   r
   r   r8   )r3   r4   pathr;   r   r   r   find_module   s    	

	
zImportHookFinder.find_modulec              	   C   s   t  |tkrW 5 Q R  d S W 5 Q R X || jkr4d S d| j|< z4t|}t|dd }|rlt|tslt||_|W S | j|= X d S rH   )r   r   rG   r   r
   r   r8   r;   )r3   r4   rI   targetrF   r;   r   r   r   r      s    		


zImportHookFinder.find_spec)N)NN)r-   r6   r7   r@   rJ   r   r   r   r   r   r      s   
6r   c                    s    fdd}|S )Nc                    s   t |   | S r$   )r#   )r"   r   r   r   register"  s    
zwhen_imported.<locals>.registerr   )r   rL   r   r   r   when_imported!  s    rM   )__doc__r   	threadingversion_infoPY2
basestringr   r   strimportlib.utilr   r   RLockr   r   r#   r'   r,   r0   r1   r8   r   rM   r   r   r   r   <module>   s(   	#	6h