o 7]hu4@s ddlZddlmZddlZddlmZmZddlZddl m Z m Z m Z ddl Z ddlmZddlmZddlmZgd Zed d ZGd d d eZGdddeZGdddeZGdddeZdddZdddZddZGdddeZGdddej Z!dS)N)contextmanager)abspathjoin) check_call check_outputSTDOUT)mkdtemp)compat)_in_proc_script_path)BackendUnavailableBackendInvalid HookMissingUnsupportedOperationdefault_subprocess_runnerquiet_subprocess_runnerPep517HookCallerc cs,t}z |VWt|dSt|wN)rshutilrmtree)tdr=/usr/lib/python3/dist-packages/pip/_vendor/pep517/wrappers.pytempdirs rc@eZdZdZddZdS)r zEWill be raised if the backend cannot be imported in the hook process.cC ||_dSr tracebackselfrrrr__init__# zBackendUnavailable.__init__N__name__ __module__ __qualname____doc__r rrrrr ! r c@r)r z)Will be raised if the backend is invalid.cCs||_||_||_dSr backend_name backend_pathmessage)rr)r*r+rrrr )s zBackendInvalid.__init__Nr"rrrrr 'r'r cs eZdZdZfddZZS)rz Will be raised on missing hooks.cstt||||_dSr)superrr hook_name)rr- __class__rrr 1s zHookMissing.__init__)r#r$r%r&r __classcell__rrr.rr/src@r)rzDMay be raised by build_sdist if the backend indicates that it can't.cCrrrrrrrr 8r!zUnsupportedOperation.__init__Nr"rrrrr6r'rcCs*tj}|r ||t|||ddS)z5The default method of calling the wrapper subprocess.)cwdenvN)osenvironcopyupdatercmdr1 extra_environr2rrrr<s  rcCs,tj}|r ||t|||tddS)zDA method of calling the wrapper subprocess while suppressing output.)r1r2stderrN)r3r4r5r6rrr7rrrrEs  rcCsntj|r tdtj|}tjtj||}tj|}tj|}tj||g|kr5td|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. zpaths must be relativez paths must be inside source tree) r3pathisabs ValueErrorrnormpathrnormcase commonprefix) source_tree requested abs_source abs_requested norm_sourcenorm_requestedrrrnorm_and_checkNs    rGc@seZdZdZ   dddZeddZddZdd d Z  dd d Z  dddZ dddZ  dddZ  dddZ dddZdddZddZdS) raA wrapper around a source directory to be built with a PEP 517 backend. :param source_dir: The path to the source directory, containing pyproject.toml. :param build_backend: The build backend spec, as per PEP 517, from pyproject.toml. :param backend_path: The backend path, as per PEP 517, from pyproject.toml. :param runner: A callable that invokes the wrapper subprocess. :param python_executable: The Python executable used to invoke the backend 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. NcsR|durt}t|_|_|rfdd|D}|_|_|s$tj}|_dS)Ncsg|]}tj|qSr)rG source_dir).0prrr s z-Pep517HookCaller.__init__..) rrrH build_backendr*_subprocess_runnersys executablepython_executable)rrHrMr*runnerrQrrKrr zs   zPep517HookCaller.__init__ccs*|j}||_z dVW||_dS||_w)z\A context manager for temporarily overriding the default subprocess runner. N)rN)rrRprevrrrsubprocess_runners z"Pep517HookCaller.subprocess_runnercCs |diS)z>Return the list of optional features supported by the backend._supported_features _call_hookrKrrrrUs z$Pep517HookCaller._supported_featurescC|dd|iS)aIIdentify 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_wheelconfig_settingsrVrrZrrrrY z-Pep517HookCaller.get_requires_for_build_wheelTcC|dt|||dS)auPrepare 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_wheelmetadata_directoryrZ_allow_fallbackrWrrr`rZrarrrr^  z1Pep517HookCaller.prepare_metadata_for_build_wheelcC(|durt|}|dt|||dS)avBuild 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_wheelwheel_directoryrZr`rrWrrhrZr`rrrrf zPep517HookCaller.build_wheelcCrX)aSIdentify packages required for building an editable 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_editablerZrVr[rrrrlr\z0Pep517HookCaller.get_requires_for_build_editablecCr])aPrepare 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 an editable wheel, and the dist-info extracted from that (unless _allow_fallback is False). #prepare_metadata_for_build_editabler_rbrcrrrrmrdz4Pep517HookCaller.prepare_metadata_for_build_editablecCre)aBuild an editable wheel from this project. Returns the name of the newly created file. In general, this will call the 'build_editable' hook in the backend. However, if that was previously called by 'prepare_metadata_for_build_editable', and the same metadata_directory is used, the previously built wheel will be copied to wheel_directory. Nbuild_editablergrirjrrrrnrkzPep517HookCaller.build_editablecCrX)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_sdistrZrVr[rrrro r\z-Pep517HookCaller.get_requires_for_build_sdistcCs|dt||dS)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_directoryrZrb)rrqrZrrrrpszPep517HookCaller.build_sdistc Cstjddkr|jd}n|j}d|i}|jr1tj|j}tjddkr-|t}||d<t }d|i}t j |t |dddt }|j} |j| tt|||g|j|d Wdn1sfwYt t |d } | d rt| d d | drt| d d | drt|j|j| dd d| drt| dp|| dWdS1swYdS)NrASCIIPEP517_BUILD_BACKENDPEP517_BACKEND_PATHkwargsz input.json)indent)r1r9z output.json unsupportedr no_backendbackend_invalid backend_errorr( hook_missingmissing_hook_name return_val)rO version_inforMencoder*r3pathseprgetfilesystemencodingrr write_jsonpjoinr rQrNrstrrH read_jsongetrr r r) rr-rvrMr9r*r hook_inputscriptpythondatarrrrW&sJ     $zPep517HookCaller._call_hook)NNNrNTNN)r#r$r%r&r rrTrUrYr^rfrlrmrnrorprWrrrrrfs4         rc@s<eZdZdZddZddZeddZdd Zd d Z d S) LoggerWrapperzd Read messages from a pipe and redirect them to a logger (see python's logging module). cCsHtj|d|_||_||_t\|_|_ t |j|_ | dSr) threadingThreadr daemonloggerlevelr3pipefd_readfd_writefdopenreaderstart)rrrrrrr ^s  zLoggerWrapper.__init__cCs|jSr)rrKrrrfilenokszLoggerWrapper.filenocCs|tjr |ddS|S)N)endswithr3linesep)msgrrrremove_newlinenszLoggerWrapper.remove_newlinecCs |jD] }|||qdSr)r_writer)rlinerrrrunrs zLoggerWrapper.runcCs|j|j|dSr)rlogr)rr+rrrrvszLoggerWrapper._writeN) r#r$r%r&r r staticmethodrrrrrrrrXs   rr)"r contextlibrr3os.pathrrrr subprocessrrrrOtempfilerryr in_processr __all__r Exceptionr r rrrrrGobjectrrrrrrrs.        s