
|_A                 @   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 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   sF   t  |  t j  r t n! t  |  t j  r0 t n	 d d   } | |   S)Nc             S   s   d  S)N )itemr   r   7/tmp/pip-build-3_sjtvrs/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   sT   d d   t  j |   D } t |  } | j j d  sP d |  } t |   | S)zProtect against re-patching the distutils if reloaded

    Also ensures that no other distutils extension monkeypatched the distutils
    first.
    c             s   s'   |  ] } | j  j d   s | Vq d S)
setuptoolsN)
__module__
startswith).0clsr   r   r   	<genexpr>(   s   z&get_unpatched_class.<locals>.<genexpr>	distutilsz(distutils has already been patched by %r)inspectZgetmronextr   r   AssertionError)r   Zexternal_basesbasemsgr   r   r   r   !   s    	
r   c              C   s  t  j t j _ t j d k  pI d t j k  o8 d k n pI d t j k  }  |  ra t  j t j _ t j d k  p d t j k  o d k  n p d t j k  o d k  n p d t j k  o d k n p d t j k  } | r d	 } | t j j	 _
 t   t   x/ t j t j t j f D] } t  j j | _ qWt  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_all3   s.    r7   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-   e   s    r-   c              C   sL   d t  j d d  k o$ d k  n }  |  s3 d St 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   r9   )Zenvironment_localr   r   r   r.   l   s    )r.   c             C   s9   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)replacementZ
target_mod	func_nameoriginalr   r   r   
patch_func{   s    rC   c             C   s   t  |  d  S)Nr;   )r<   )	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	    Wn t k
 r Yn Xy t | d
    Wn t k
 r Yn Xy t | d    Wn t k
 r Yn Xd S)z\
    Patch functions in distutils to use standalone Microsoft Visual C++
    compilers.
    zsetuptools.msvcWindowsNc                sn   d |  k r d n d } | | j  d  } t   |  } t |   } t | |  sa t |   | | | f S)zT
        Prepare the parameters for patch_func to patch indicated function.
        msvc9Zmsvc9_Zmsvc14__)lstripr<   r   hasattrImportError)mod_namerA   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partialrC   rJ   )rO   rF   Zmsvc14r   )rN   r   r5      s&    r5   )__doc__r&   distutils.filelistr   rP   r   rR   r   Z
py26compatr   Zsetuptools.externr   r   __all__r   r   r7   r-   r.   rC   r   r5   r   r   r   r   <module>   s$   	2