3
LY                 @   s   d Z ddl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
 ddlZg Zdd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd ZdS )z
Monkey patching of distutils.
    N   )import_module)sixc             C   s0   t | tjrtnt | tjr tndd }|| S )Nc             S   s   d S )N )itemr   r   k/private/var/folders/7d/20zwc49s3kn54d3vgq8bd4640000gn/T/pip-build-an2lx5zf/setuptools/setuptools/monkey.py<lambda>   s    zget_unpatched.<locals>.<lambda>)
isinstancer   class_typesget_unpatched_classtypesFunctionTypeget_unpatched_function)r   lookupr   r   r   get_unpatched   s    r   c             C   s:   x| j jdr| j\} qW | j jds6d|  }t|| S )zProtect against re-patching the distutils if reloaded

    Also ensures that no other distutils extension monkeypatched the distutils
    first.
    
setuptools	distutilsz(distutils has already been patched by %r)
__module__
startswith	__bases__AssertionError)clsmsgr   r   r   r       s    r   c              C   s*  t jtj_tjdk p6dtj  k o(dkn  p6dtjk } | rFt jtj_tjdk pdtj  k oddk n  pdtj  k o~dk n  pdtj  k odkn  pdtjk }|rd	}|tjj	_
t  t  x$tjtjtjfD ]}t jj|_ qW t jjtj_t jjtj_d
tjkr t jjtjd
 _t  d S )N                     r   zhttps://upload.pypi.org/legacy/zdistutils.command.build_ext)r   r   r   )r   r   )r   r   r   )r   r   )r   r   r   )r   r   )r   r   r   )r   r   )r   r   r   )r   r   )r   r   r   )r   r   )r   Commandr   coresysversion_infofindallfilelistconfigPyPIRCCommandDEFAULT_REPOSITORY+_patch_distribution_metadata_write_pkg_file+_patch_distribution_metadata_write_pkg_infodistcmdDistribution	extension	Extensionmodules#patch_for_msvc_specialized_compiler)Zhas_issue_12885Zneeds_warehouseZ	warehousemoduler   r   r   	patch_all.   s.    






r3   c               C   s   t jjtjj_dS )zDPatch write_pkg_file to also write Requires-Python/Requires-ExternalN)r   r+   write_pkg_filer   DistributionMetadatar   r   r   r   r)   `   s    r)   c              C   s<   dt jdd   kodk n  } | s*dS tjjtjj_dS )z
    Workaround issue #197 - Python 3 prior to 3.2.2 uses an environment-local
    encoding to save the pkg_info. Monkey-patch its write_pkg_info method to
    correct this undesirable behavior.
    r   Nr   )r   )r   r   r   )r"   r#   r   r+   write_pkg_infor   r5   )Zenvironment_localr   r   r   r*   g   s    "r*   c             C   s*   t ||}t| jd| t|||  dS )z
    Patch func_name in target_mod with replacement

    Important - original must be resolved by name to avoid
    patching an already patched function.
    	unpatchedN)getattrvars
setdefaultsetattr)ZreplacementZ
target_mod	func_nameoriginalr   r   r   
patch_funcv   s    
r>   c             C   s
   t | dS )Nr7   )r8   )	candidater   r   r   r      s    r   c                 s   t d tj dkrdS  fdd} tj| d}tj| d}yt|d  t|d	  W n tk
rl   Y nX yt|d
  W n tk
r   Y nX yt|d  W n tk
r   Y nX dS )z\
    Patch functions in distutils to use standalone Microsoft Visual C++
    compilers.
    zsetuptools.msvcWindowsNc                sL   d| krdnd}||j d }t |}t| }t||sBt||||fS )zT
        Prepare the parameters for patch_func to patch indicated function.
        msvc9Zmsvc9_Zmsvc14__)lstripr8   r   hasattrImportError)mod_namer<   Zrepl_prefixZ	repl_namereplmod)msvcr   r   patch_params   s    

z9patch_for_msvc_specialized_compiler.<locals>.patch_paramszdistutils.msvc9compilerzdistutils._msvccompilerZfind_vcvarsallZquery_vcvarsallZ_get_vc_envZgen_lib_options)r   platformsystem	functoolspartialr>   rE   )rJ   rA   Zmsvc14r   )rI   r   r1      s&    r1   )__doc__r"   distutils.filelistr   rK   r   rM   Z
py26compatr   Zsetuptools.externr   r   __all__r   r   r3   r)   r*   r>   r   r1   r   r   r   r   <module>   s"   	2