U
    ]g*                     @   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 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e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_spec   )ObjectProxyFc                    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-8a6eta5t/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_hook0   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   T   s
    

z8_create_import_hook_from_entrypoint.<locals>.import_hookr   )r(   r   r   r'   r   #_create_import_hook_from_entrypointS   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_hooks\   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_loadedk   s
    r2   c                   @   s   e Zd Zdd ZdS )_ImportHookLoaderc                 C   s   t j| }t| |S r&   )r
   r   r2   selffullnamer   r   r   r   load_module   s    
z_ImportHookLoader.load_moduleN)r/   
__module____qualname__r7   r   r   r   r   r3   }   s   r3   c                       s<   e Zd Z fddZdd Zdd Zdd Zd	d
 Z  ZS )_ImportHookChainedLoaderc                    s\   t t| | t|dr(| d| j t|dr@| d| j t|drX| d| j d S )Nr7   create_moduleexec_module)superr:   __init__hasattrZ__self_setattr___self_load_module_self_create_module_self_exec_module)r5   loader	__class__r   r   r>      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 )z<_ImportHookChainedLoader._self_set_loader.<locals>.UNDEFINEDN)r/   r8   r9   r   r   r   r   	UNDEFINED   s    rF   
__loader____spec__rC   )r   __wrapped__rG   AttributeErrorrH   rC   )r5   r   rF   r   r   r   _self_set_loader   s    z)_ImportHookChainedLoader._self_set_loaderc                 C   s"   | j |}| | t| |S r&   )rI   r7   rK   r2   r4   r   r   r   r@      s    
z*_ImportHookChainedLoader._self_load_modulec                 C   s   | j |S r&   )rI   r;   )r5   specr   r   r   rA      s    z,_ImportHookChainedLoader._self_create_modulec                 C   s"   |  | | j| t| d S r&   )rK   rI   r<   r2   )r5   r   r   r   r   rB      s    
z*_ImportHookChainedLoader._self_exec_module)	r/   r8   r9   r>   rK   r@   rA   rB   __classcell__r   r   rD   r   r:      s
   

r:   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)r5   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 NTrC   )	r   r!   rN   r   r	   r3   r   r   r:   )r5   r6   pathrC   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 rO   )r   r!   rN   r   r   r   r:   rC   )r5   r6   rP   targetrL   rC   r   r   r   r      s    		


zImportHookFinder.find_spec)N)NN)r/   r8   r9   r>   rQ   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   rS   r   r   r   when_imported#  s    rT   )__doc__r
   	threadingversion_infoPY2
basestringr   r   strimportlib.utilZ	__wrapt__r   r!   r   RLockr   r   r%   r)   r.   r2   r3   r:   r   rT   r   r   r   r   <module>   s*   	#	6h