
0c@_*                 @   s  d  d l  Z  d  d l m Z d  d l Z d  d l m Z m Z m Z d  d l	 Z	 d  d l
 m Z m Z m Z d  d l Z d  d l m Z d d l m Z y d  d l j Z d d	   Z Wn$ e k
 r e d
 d	    Z Yn Xe d d    Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z d d d d  Z d d d d  Z d d   Z Gd d   d e   Z! Gd d   d e  j"  Z# d S)    N)contextmanager)dirnameabspathjoin)
check_callcheck_outputSTDOUT)mkdtemp   )compatc               C   s   t  j t d  S)Nz_in_process.py)	resourcespath__package__ r   r   :/tmp/pip-build-jynh7p1z/pip/pip/_vendor/pep517/wrappers.py_in_proc_script_path   s    r   c               c   s   t  t t t   d  Vd  S)Nz_in_process.py)pjoinr   r   __file__r   r   r   r   r      s    c              c   s'   t    }  z	 |  VWd  t j |   Xd  S)N)r	   shutilrmtree)tdr   r   r   tempdir   s    		r   c               @   s"   e  Z d  Z d Z d d   Z d S)BackendUnavailablezEWill be raised if the backend cannot be imported in the hook process.c             C   s   | |  _  d  S)N)	traceback)selfr   r   r   r   __init__#   s    zBackendUnavailable.__init__N)__name__
__module____qualname____doc__r   r   r   r   r   r   !   s   r   c               @   s"   e  Z d  Z d Z d d   Z d S)BackendInvalidz)Will be raised if the backend is invalid.c             C   s   | |  _  | |  _ | |  _ d  S)N)backend_namebackend_pathmessage)r   r!   r"   r#   r   r   r   r   )   s    		zBackendInvalid.__init__N)r   r   r   r   r   r   r   r   r   r    '   s   r    c                   s(   e  Z d  Z d Z   f d d   Z   S)HookMissingz Will be raised on missing hooks.c                s#   t  t |   j |  | |  _ d  S)N)superr$   r   	hook_name)r   r&   )	__class__r   r   r   1   s    zHookMissing.__init__)r   r   r   r   r   r   r   )r'   r   r$   /   s   r$   c               @   s"   e  Z d  Z d Z d d   Z d S)UnsupportedOperationzDMay be raised by build_sdist if the backend indicates that it can't.c             C   s   | |  _  d  S)N)r   )r   r   r   r   r   r   8   s    zUnsupportedOperation.__init__N)r   r   r   r   r   r   r   r   r   r(   6   s   r(   c             C   s<   t  j j   } | r" | j |  t |  d | d | d S)z5The default method of calling the wrapper subprocess.cwdenvN)osenvironcopyupdater   )cmdr)   extra_environr*   r   r   r   default_subprocess_runner<   s    r1   c             C   sB   t  j j   } | r" | j |  t |  d | d | d t d S)zDA method of calling the wrapper subprocess while suppressing output.r)   r*   stderrN)r+   r,   r-   r.   r   r   )r/   r)   r0   r*   r   r   r   quiet_subprocess_runnerE   s    r3   c             C   s   t  j j |  r t d   t  j j |   } t  j j t  j j | |   } t  j j |  } t  j j |  } t  j j | | g  | k r t d   | S)zNormalise and check a backend path.

    Ensure that the requested backend path is specified as a relative path,
    and resolves to a location under the given source tree.

    Return an absolute version of the requested path.
    zpaths must be relativez paths must be inside source tree)	r+   r   isabs
ValueErrorr   normpathr   normcasecommonprefix)Zsource_tree	requestedZ
abs_sourceZabs_requestedZnorm_sourceZnorm_requestedr   r   r   norm_and_checkN   s    !r:   c               @   s   e  Z d  Z d Z d d d d  Z e d d    Z d d d  Z d d	 d
 d  Z d d d d  Z	 d d d  Z
 d d d  Z d d   Z d S)Pep517HookCallerae  A wrapper around a source directory to be built with a PEP 517 backend.

    source_dir : The path to the source directory, containing pyproject.toml.
    build_backend : The build backend spec, as per PEP 517, from
        pyproject.toml.
    backend_path : The backend path, as per PEP 517, from pyproject.toml.
    runner : A callable that invokes the wrapper subprocess.

    The 'runner', if provided, must expect the following:
        cmd : a list of strings representing the command and arguments to
            execute, as would be passed to e.g. 'subprocess.check_call'.
        cwd : a string representing the working directory that must be
            used for the subprocess. Corresponds to the provided source_dir.
        extra_environ : a dict mapping environment variable names to values
            which must be set for the subprocess execution.
    Nc                s_   | d  k r t  } t |    _ |   _ | rI   f d d   | D } |   _ |   _ d  S)Nc                s"   g  |  ] } t    j |   q Sr   )r:   
source_dir).0p)r   r   r   
<listcomp>   s   	 z-Pep517HookCaller.__init__.<locals>.<listcomp>)r1   r   r<   build_backendr"   _subprocess_runner)r   r<   r@   r"   runnerr   )r   r   r   w   s    		zPep517HookCaller.__init__c             c   s,   |  j  } | |  _  z	 d VWd | |  _  Xd S)z\A context manager for temporarily overriding the default subprocess
        runner.
        N)rA   )r   rB   prevr   r   r   subprocess_runner   s
    			z"Pep517HookCaller.subprocess_runnerc             C   s   |  j  d d | i  S)aG  Identify packages required for building a wheel

        Returns a list of dependency specifications, e.g.:
            ["wheel >= 0.25", "setuptools"]

        This does not include requirements specified in pyproject.toml.
        It returns the result of calling the equivalently named hook in a
        subprocess.
        get_requires_for_build_wheelconfig_settings)
_call_hook)r   rF   r   r   r   rE      s    
	z-Pep517HookCaller.get_requires_for_build_wheelTc             C   s(   |  j  d d t |  d | d | i  S)aq  Prepare a *.dist-info folder with metadata for this project.

        Returns the name of the newly created folder.

        If the build backend defines a hook with this name, it will be called
        in a subprocess. If not, the backend will be asked to build a wheel,
        and the dist-info extracted from that (unless _allow_fallback is
        False).
         prepare_metadata_for_build_wheelmetadata_directoryrF   _allow_fallback)rG   r   )r   rI   rF   rJ   r   r   r   rH      s    	z1Pep517HookCaller.prepare_metadata_for_build_wheelc             C   s@   | d k	 r t  |  } |  j d d t  |  d | d | i  S)av  Build a wheel from this project.

        Returns the name of the newly created file.

        In general, this will call the 'build_wheel' hook in the backend.
        However, if that was previously called by
        'prepare_metadata_for_build_wheel', and the same metadata_directory is
        used, the previously built wheel will be copied to wheel_directory.
        Nbuild_wheelwheel_directoryrF   rI   )r   rG   )r   rL   rF   rI   r   r   r   rK      s    	zPep517HookCaller.build_wheelc             C   s   |  j  d d | i  S)a<  Identify packages required for building a wheel

        Returns a list of dependency specifications, e.g.:
            ["setuptools >= 26"]

        This does not include requirements specified in pyproject.toml.
        It returns the result of calling the equivalently named hook in a
        subprocess.
        get_requires_for_build_sdistrF   )rG   )r   rF   r   r   r   rM      s    
	z-Pep517HookCaller.get_requires_for_build_sdistc             C   s"   |  j  d d t |  d | i  S)zBuild an sdist from this project.

        Returns the name of the newly created file.

        This calls the 'build_sdist' backend hook in a subprocess.
        build_sdistsdist_directoryrF   )rG   r   )r   rO   rF   r   r   r   rN      s    	zPep517HookCaller.build_sdistc       
      C   s  t  j d d k r( |  j j d  } n	 |  j } d | i } |  j r t j j |  j  } t  j d d k r | j t  j    } | | d <t	   ;} d | i } t
 j | t | d  d d t   8 } |  j t  j t |  | | g d	 |  j d
 | Wd  QRXt
 j t | d   }	 |	 j d  rGt |	 j d d    |	 j d  rnt |	 j d d    |	 j d  rt d |  j d |  j d |	 j d d    |	 j d  rt |   |	 d SWd  QRXd  S)Nr      ASCIIZPEP517_BUILD_BACKENDZPEP517_BACKEND_PATHkwargsz
input.jsonindentr)   r0   zoutput.jsonZunsupportedr    Z
no_backendZbackend_invalidr!   r"   r#   Zbackend_errorZhook_missingZ
return_val)sysversion_infor@   encoder"   r+   pathsepr   getfilesystemencodingr   r   Z
write_jsonr   r   rA   
executablestrr<   Z	read_jsongetr(   r   r    r$   )
r   r&   rR   r@   r0   r"   r   Z
hook_inputscriptdatar   r   r   rG      s>    		
			zPep517HookCaller._call_hook)r   r   r   r   r   r   rD   rE   rH   rK   rM   rN   rG   r   r   r   r   r;   f   s   r;   c               @   sX   e  Z d  Z d Z d d   Z d d   Z e d d    Z d d	   Z d
 d   Z	 d S)LoggerWrapperzd
    Read messages from a pipe and redirect them
    to a logger (see python's logging module).
    c             C   sf   t  j j |   d |  _ | |  _ | |  _ t j   \ |  _ |  _	 t j
 |  j  |  _ |  j   d  S)NT)	threadingThreadr   daemonloggerlevelr+   pipeZfd_readfd_writefdopenreaderstart)r   rc   rd   r   r   r   r     s    			zLoggerWrapper.__init__c             C   s   |  j  S)N)rf   )r   r   r   r   fileno(  s    zLoggerWrapper.filenoc             C   s$   |  j  t j  r  |  d  d  S|  S)Nr
   )endswithr+   linesep)msgr   r   r   remove_newline+  s    zLoggerWrapper.remove_newlinec             C   s.   x' |  j  D] } |  j |  j |   q
 Wd  S)N)rh   _writero   )r   liner   r   r   run/  s    zLoggerWrapper.runc             C   s   |  j  j |  j |  d  S)N)rc   logrd   )r   r#   r   r   r   rp   3  s    zLoggerWrapper._writeN)
r   r   r   r   r   rj   staticmethodro   rr   rp   r   r   r   r   r_     s   r_   )$r`   
contextlibr   r+   os.pathr   r   r   r   r   
subprocessr   r   r   rU   tempfiler	   rT   r   Zimportlib.resourcesr   r   ImportErrorr   	Exceptionr   r    r$   r(   r1   r3   r:   objectr;   ra   r_   r   r   r   r   <module>   s.   			