
§|jA  ã               @   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-5c7ija6t/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)z•Protect 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