a
    hbòfu4  ã                   @   s
  d dl Z d dlmZ d dlZd dl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 ddlmZ g d	¢Zed
d„ ƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZddd„Zddd„Zdd„ ZG dd„ deƒZG dd„ de j ƒZ!dS ) é    N)Úcontextmanager)ÚabspathÚjoin)Ú
check_callÚcheck_outputÚSTDOUT)Úmkdtempé   )Úcompat)Ú_in_proc_script_path)ÚBackendUnavailableÚBackendInvalidÚHookMissingÚUnsupportedOperationÚdefault_subprocess_runnerÚquiet_subprocess_runnerÚPep517HookCallerc               	   c   s,   t ƒ } z| V  W t | ¡ nt | ¡ 0 d S ©N)r   ÚshutilÚrmtree)Útd© r   úX/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/pip/_vendor/pep517/wrappers.pyÚtempdir   s    r   c                   @   s   e Zd ZdZdd„ ZdS )r   zEWill be raised if the backend cannot be imported in the hook process.c                 C   s
   || _ d S r   ©Ú	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 )r   z)Will be raised if the backend is invalid.c                 C   s   || _ || _|| _d S r   ©Úbackend_nameÚbackend_pathÚmessage)r   r%   r&   r'   r   r   r   r   )   s    zBackendInvalid.__init__Nr   r   r   r   r   r   '   s   r   c                       s    e Zd ZdZ‡ fdd„Z‡  ZS )r   z Will be raised on missing hooks.c                    s   t t| ƒ |¡ || _d S r   )Úsuperr   r   Ú	hook_name)r   r)   ©Ú	__class__r   r   r   1   s    zHookMissing.__init__)r    r!   r"   r#   r   Ú__classcell__r   r   r*   r   r   /   s   r   c                   @   s   e Zd ZdZdd„ ZdS )r   zDMay be raised by build_sdist if the backend indicates that it can't.c                 C   s
   || _ d S r   r   r   r   r   r   r   8   s    zUnsupportedOperation.__init__Nr   r   r   r   r   r   6   s   r   c                 C   s*   t j ¡ }|r| |¡ t| ||d� dS )z5The default method of calling the wrapper subprocess.)ÚcwdÚenvN)ÚosÚenvironÚcopyÚupdater   ©Úcmdr-   Úextra_environr.   r   r   r   r   <   s    

r   c                 C   s,   t j ¡ }|r| |¡ t| ||td� dS )zDA method of calling the wrapper subprocess while suppressing output.)r-   r.   ÚstderrN)r/   r0   r1   r2   r   r   r3   r   r   r   r   E   s    

r   c                 C   sn   t j |¡rtdƒ‚t j | ¡}t j t j ||¡¡}t j |¡}t j |¡}t j ||g¡|krjtdƒ‚|S )zèNormalise 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/   ÚpathÚisabsÚ
ValueErrorr   Únormpathr   ÚnormcaseÚcommonprefix)Úsource_treeÚ	requestedÚ
abs_sourceÚabs_requestedÚnorm_sourceÚnorm_requestedr   r   r   Únorm_and_checkN   s    rC   c                   @   s†   e Zd ZdZddd„Zedd„ ƒZdd„ Zdd	d
„Zddd„Z	ddd„Z
d dd„Zd!dd„Zd"dd„Zd#dd„Zd$dd„Zdd„ ZdS )%r   aº  A 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.
    Nc                    sR   |d u rt }t|ƒˆ _|ˆ _|r2‡ fdd„|D ƒ}|ˆ _|ˆ _|sHtj}|ˆ _d S )Nc                    s   g | ]}t ˆ j|ƒ‘qS r   )rC   Ú
source_dir)Ú.0Úp©r   r   r   Ú
<listcomp>ˆ   s   z-Pep517HookCaller.__init__.<locals>.<listcomp>)	r   r   rD   Úbuild_backendr&   Ú_subprocess_runnerÚsysÚ
executableÚpython_executable)r   rD   rI   r&   ÚrunnerrM   r   rG   r   r   z   s    

ÿzPep517HookCaller.__init__c                 c   s*   | j }|| _ zdV  W || _ n|| _ 0 dS )z\A context manager for temporarily overriding the default subprocess
        runner.
        N)rJ   )r   rN   Úprevr   r   r   Úsubprocess_runner‘   s
    z"Pep517HookCaller.subprocess_runnerc                 C   s   |   di ¡S )z>Return the list of optional features supported by the backend.Ú_supported_features©Ú
_call_hookrG   r   r   r   rQ   �   s    z$Pep517HookCaller._supported_featuresc                 C   s   |   dd|i¡S )aI  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_settingsrR   ©r   rU   r   r   r   rT   ¡   s    ÿz-Pep517HookCaller.get_requires_for_build_wheelTc                 C   s   |   dt|ƒ||dœ¡S )au  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_directoryrU   Ú_allow_fallback©rS   r   ©r   rY   rU   rZ   r   r   r   rW   °   s
    ýz1Pep517HookCaller.prepare_metadata_for_build_wheelc                 C   s(   |durt |ƒ}|  dt |ƒ||dœ¡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_directoryrU   rY   ©r   rS   ©r   r_   rU   rY   r   r   r   r]   Â   s    ýzPep517HookCaller.build_wheelc                 C   s   |   dd|i¡S )aS  Identify 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_editablerU   rR   rV   r   r   r   rb   Ö   s    ÿz0Pep517HookCaller.get_requires_for_build_editablec                 C   s   |   dt|ƒ||dœ¡S )a  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 an editable
        wheel, and the dist-info extracted from that (unless _allow_fallback is
        False).
        Ú#prepare_metadata_for_build_editablerX   r[   r\   r   r   r   rc   å   s
    ýz4Pep517HookCaller.prepare_metadata_for_build_editablec                 C   s(   |durt |ƒ}|  dt |ƒ||dœ¡S )a†  Build 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.
        NÚbuild_editabler^   r`   ra   r   r   r   rd   ÷   s    ýzPep517HookCaller.build_editablec                 C   s   |   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_sdistrU   rR   rV   r   r   r   re     s    ÿz-Pep517HookCaller.get_requires_for_build_sdistc                 C   s   |   dt|ƒ|dœ¡S )z£Build 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_directoryrU   r[   )r   rg   rU   r   r   r   rf     s    þzPep517HookCaller.build_sdistc              	   C   s’  t jd dkr| j d¡}n| j}d|i}| jrbtj | j¡}t jd dkrZ| t  ¡ ¡}||d< t	ƒ ��}d|i}t
j|t|dƒdd� tƒ �8}| j}	| j|	tt|ƒƒ||g| j|d	� W d   ƒ n1 sÎ0    Y  t
 t|d
ƒ¡}
|
 d¡�rt|
 dd¡ƒ‚|
 d¡�r t|
 dd¡ƒ‚|
 d¡�rFt| j| j|
 dd¡d�‚|
 d¡�rft|
 d¡�pb|ƒ‚|
d W  d   ƒ S 1 �s„0    Y  d S )Nr   é   ÚASCIIÚPEP517_BUILD_BACKENDÚPEP517_BACKEND_PATHÚkwargsz
input.json)Úindent)r-   r5   zoutput.jsonÚunsupportedr   Ú Ú
no_backendÚbackend_invalidÚbackend_errorr$   Úhook_missingÚmissing_hook_nameÚ
return_val)rK   Úversion_inforI   Úencoder&   r/   Úpathsepr   Úgetfilesystemencodingr   r
   Ú
write_jsonÚpjoinr   rM   rJ   r   ÚstrrD   Ú	read_jsonÚgetr   r   r   r   )r   r)   rl   rI   r5   r&   r   Ú
hook_inputÚscriptÚpythonÚdatar   r   r   rS   &  sF    
ÿý$
ýzPep517HookCaller._call_hook)NNN)N)NT)NN)N)NT)NN)N)N)r    r!   r"   r#   r   r   rP   rQ   rT   rW   r]   rb   rc   rd   re   rf   rS   r   r   r   r   r   f   s2      ú


  þ
  þ

  þ
  þ


r   c                   @   s<   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   sH   t j | ¡ d| _|| _|| _t ¡ \| _| _	t 
| j¡| _|  ¡  d S )NT)Ú	threadingÚThreadr   ÚdaemonÚloggerÚlevelr/   ÚpipeÚfd_readÚfd_writeÚfdopenÚreaderÚstart)r   r‡   rˆ   r   r   r   r   ^  s    zLoggerWrapper.__init__c                 C   s   | j S r   )r‹   rG   r   r   r   Úfilenok  s    zLoggerWrapper.filenoc                 C   s   |   tj¡r| d d… S | S )Néÿÿÿÿ)Úendswithr/   Úlinesep)Úmsgr   r   r   Úremove_newlinen  s    zLoggerWrapper.remove_newlinec                 C   s    | j D ]}|  |  |¡¡ qd S r   )r�   Ú_writer”   )r   Úliner   r   r   Úrunr  s    
zLoggerWrapper.runc                 C   s   | j  | j|¡ d S r   )r‡   Úlogrˆ   )r   r'   r   r   r   r•   v  s    zLoggerWrapper._writeN)
r    r!   r"   r#   r   r�   Ústaticmethodr”   r—   r•   r   r   r   r   rƒ   X  s   
rƒ   )NN)NN)"r„   Ú
contextlibr   r/   Úos.pathr   r   r{   r   Ú
subprocessr   r   r   rK   Útempfiler   ro   r
   Ú
in_processr   Ú__all__r   Ú	Exceptionr   r   r   r   r   r   rC   Úobjectr   r…   rƒ   r   r   r   r   Ú<module>   s,   

	
	 s