
    yIfQ                    z   d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 ddl
mZ ddlmZmZ ddlmZ dd	lmZmZmZmZmZmZmZmZmZmZ dd
lmZ ddlmZ ddl m!Z! ej"        dk    rddl#Z#nddl$Z# ee%          j&        Z'eee(ef                  Z) G d ded          Z* G d de          Z+ G d de          Z, G d de          Z- G d de          Z. G d de          Z/ G d de          Z0 G d de          Z1 G d  d!e          Z2 G d" d#e          Z3 G d$ d%e4          Z5 G d& d'e          Z6dS )(zBuild frontend for PEP-517.    )annotationsN)ABCabstractmethod)contextmanager)Path)NamedTemporaryFileTemporaryDirectory)sleep)
AnyDictIteratorListLiteral
NamedTupleNoReturnOptional	TypedDictcast)ZipFileRequirement)ensure_empty_dir)      c                  P    e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded<   d	S )
OptionalHookszCA flag indicating if the backend supports the optional hook or not.boolget_requires_for_build_sdist prepare_metadata_for_build_wheelget_requires_for_build_wheelbuild_editableget_requires_for_build_editable#prepare_metadata_for_build_editableN__name__
__module____qualname____doc____annotations__     K/var/www/piapp/venv/lib/python3.11/site-packages/pyproject_api/_frontend.pyr   r      s`         MM&&&&****&&&&))))------r+   r   T)totalc                  N    e Zd Zeedd                        Zedd            ZdS )		CmdStatusreturnr   c                    t           )z3:return: truthful when the command finished runningNotImplementedErrorselfs    r,   donezCmdStatus.done'   s
     "!r+   tuple[str, str]c                    t           )z0:return: standard output and standard error textr2   r4   s    r,   out_errzCmdStatus.out_err-   
     "!r+   N)r0   r   )r0   r7   )r%   r&   r'   propertyr   r6   r9   r*   r+   r,   r/   r/   &   s\        " " " ^ X" " " " ^" " "r+   r/   c                  2    e Zd ZU dZded<   ded<   ded<   dS )RequiresBuildSdistResultzQInformation collected while acquiring the source distribution build dependencies.tuple[Requirement, ...]requiresstrouterrNr$   r*   r+   r,   r=   r=   3   s6         [[ &%%%HHHHHHHHr+   r=   c                  2    e Zd ZU dZded<   ded<   ded<   dS )RequiresBuildWheelResultCInformation collected while acquiring the wheel build dependencies.r>   r?   r@   rA   rB   Nr$   r*   r+   r,   rD   rD   >   6         MM &%%%HHHHHHHHr+   rD   c                  2    e Zd ZU dZded<   ded<   ded<   dS )RequiresBuildEditableResultrE   r>   r?   r@   rA   rB   Nr$   r*   r+   r,   rH   rH   I   rF   r+   rH   c                  2    e Zd ZU dZded<   ded<   ded<   dS )MetadataForBuildWheelResultz9Information collected while acquiring the wheel metadata.r   metadatar@   rA   rB   Nr$   r*   r+   r,   rJ   rJ   T   s3         CC NNNHHHHHHHHr+   rJ   c                  2    e Zd ZU dZded<   ded<   ded<   dS )MetadataForBuildEditableResultz<Information collected while acquiring the editable metadata.r   rK   r@   rA   rB   Nr$   r*   r+   r,   rM   rM   _   s3         FF NNNHHHHHHHHr+   rM   c                  2    e Zd ZU dZded<   ded<   ded<   dS )SdistResultz;Information collected while building a source distribution.r   sdistr@   rA   rB   Nr$   r*   r+   r,   rO   rO   j   s3         EE KKKHHHHHHHHr+   rO   c                  2    e Zd ZU dZded<   ded<   ded<   dS )WheelResultz-Information collected while building a wheel.r   wheelr@   rA   rB   Nr$   r*   r+   r,   rR   rR   u   s3         77 KKKHHHHHHHHr+   rR   c                  2    e Zd ZU dZded<   ded<   ded<   dS )EditableResultz7Information collected while building an editable wheel.r   rS   r@   rA   rB   Nr$   r*   r+   r,   rU   rU      s3         AA KKKHHHHHHHHr+   rU   c                  4     e Zd ZdZd fd	Zdd
ZddZ xZS )BackendFailedzAn error of the build backend.resultdict[str, Any]rA   r@   rB   r0   Nonec                   t                                                       || _        || _        |                    dd          | _        |                    dd          | _        |                    dd          | _        d S )Ncodeexc_typezmissing Exception typeexc_msgzmissing Exception message)super__init__rA   rB   getr\   r^   r_   )r5   rX   rA   rB   	__class__s       r,   ra   zBackendFailed.__init__   sl    FB//	#ZZ
4LMM"JJy2MNNr+   c           	         d| j         dn
d| j          d d| j         d| j         d| j         | j         	                                S )Nzpackaging backend failed z (code=)z, with z: 
)r\   r^   r_   rB   rA   rstripr4   s    r,   __str__zBackendFailed.__str__   s{    JTY->rrDZdiDZDZDZ J JMJ J%)\J J59XJ?CxJ J
&((	r+   c                p    | j         j         d| j         d| j        d| j        d| j        d| j        dS )Nz(result=dict(code=z, exc_type=z	,exc_msg=z), out=z, err=rf   )rc   r%   r\   r^   r_   rA   rB   r4   s    r,   __repr__zBackendFailed.__repr__   sj    ~& 4 4 $	4 46:m4 4PTP\4 4H4 4&*h4 4 4	
r+   )rX   rY   rA   r@   rB   r@   r0   rZ   r0   r@   )r%   r&   r'   r(   ra   ri   rk   __classcell__)rc   s   @r,   rW   rW      sq        ((O O O O O O   
 
 
 
 
 
 
 
r+   rW   c                     e Zd ZU dZdZded<    ed           ed          fZded<   	 dLdMdZe	dNd            Z
edOd            ZedPd            ZedQd            ZdRdSd#ZdRdTd%Z	 dRdUd'Z	 dRdVd*ZdWd+Z	 dRdXd-ZdRdYd0Z	 	 dZd[d4Z	 	 dZd\d6Zd]d>Z	 dRd^dBZed_dD            Zd`dGZeedadK                        ZdS )bFrontendz-Abstract base class for a pyproject frontend.z setuptools.build_meta:__legacy__r@   LEGACY_BUILD_BACKENDzsetuptools >= 40.8.0rS   r>   LEGACY_REQUIRESTrootr   backend_pathstuple[Path, ...]backend_modulebackend_obj
str | Noner?   reuse_backendr   r0   rZ   c                h    || _         || _        || _        || _        || _        || _        d| _        dS )a  
        Create a new frontend.

        :param root: the root path of the project
        :param backend_paths: paths to provision as available to import from for the build backend
        :param backend_module: the module where the backend lives
        :param backend_obj: the backend object key (will be lookup up within the backend module)
        :param requires: build requirements for the backend
        :param reuse_backend: a flag indicating if the communication channel should be kept alive between messages
        N)_root_backend_paths_backend_module_backend_objr?   _reuse_backend_optional_hooks)r5   rr   rs   ru   rv   r?   rx   s          r,   ra   zFrontend.__init__   s@    & 
+-'19+59r+   folderMtuple[Path, tuple[Path, ...], str, str | None, tuple[Requirement, ...], bool]c                   dz  }|                                 r|                    d          5 }t          j        |          }ddd           n# 1 swxY w Y   |                    di           }d|v r"t          fd|d         D                       }nd}d|v r-t          d	 |                    d          D                       }n| j        }|                    d
| j                  }nd}| j        }| j        }|                    d          }	|	d         }
t          |	          dk    r|	d         nd}||
||dfS )a  
        Frontend creation arguments from a python project folder (thould have a ``pypyproject.toml`` file per PEP-518).

        :param folder: the python project folder
        :return: the frontend creation args

        E.g., to create a frontend from a python project folder:

        .. code:: python

            frontend = Frontend(*Frontend.create_args_from_folder(project_folder))
        zpyproject.tomlrbNzbuild-systemzbackend-pathc              3  "   K   | ]	}|z  V  
d S Nr*   ).0pr   s     r,   	<genexpr>z3Frontend.create_args_from_folder.<locals>.<genexpr>   s'      7i7iq
7i7i7i7i7i7ir+   r*   r?   c              3  4   K   | ]}t          |          V  d S r   r   r   rs     r,   r   z3Frontend.create_args_from_folder.<locals>.<genexpr>   s(      9o9oQ+a..9o9o9o9o9o9or+   zbuild-backend:r      T)
existsopentomllibloadrb   tuplerq   rp   splitlen)clsr   py_project_tomlfile_handler
py_projectbuild_systemrs   r?   build_backendpathsru   rv   s    `          r,   create_args_from_folderz Frontend.create_args_from_folder   s   " !#33!!## 	5 %%d++ 8|$\,77
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8%>>."==L--277i7i7i7iLYgLh7i7i7i2i2i "\))499o9oR^RbRbcmRnRn9o9o9o4o4o.(,,_c>VWWMMM*H4M##C((#Ah.1%jj1nn%(($}nk8TQQs   AAAc                :    | j          | j        r
d| j         nd S )z:return: backend keyr   re   )r|   r}   r4   s    r,   backendzFrontend.backend   s2     &^4CT(\(?D,=(?(?(?Z\^^^r+   	list[str]c                    t          t          dz            t          | j                  | j        g}| j        r|                    | j                   |S )z(:return: startup arguments for a backendz_backend.py)r@   _HEREr~   r|   r}   append)r5   rX   s     r,   backend_argszFrontend.backend_args   sQ     !!677T=P9Q9QSWSgh 	-MM$+,,,r+   r   c                ^    | j          |                     d          \  }}}|| _         | j         S )zI:return: a dictionary indicating if the optional hook is supported or notNr   )r   _send)r5   rX   ___s       r,   optional_hookszFrontend.optional_hooks  s6     ' JJ'899MFAr#)D ##r+   Nconfig_settingsConfigSettings | Noner=   c           	     z   | j         d         r|                     d|          \  }}}ng dd}}}t          |t                    rt	          d |D                       s|                     d|d||           t          t          d t          t          t                   |          D                       ||          S )z
        Get build requirements for a source distribution (per PEP-517).

        :param config_settings: run arguments
        :return: outcome
        r   cmdr   re   c              3  @   K   | ]}t          |t                    V  d S r   
isinstancer@   r   is     r,   r   z8Frontend.get_requires_for_build_sdist.<locals>.<genexpr>  ,      2V2V!:a3E3E2V2V2V2V2V2Vr+   list of stringc              3  4   K   | ]}t          |          V  d S r   r   r   s     r,   r   z8Frontend.get_requires_for_build_sdist.<locals>.<genexpr>  (      -^-^k!nn-^-^-^-^-^-^r+   )r   r   r   listall_unexpected_responser=   r   r   r   r@   r5   r   rX   rA   rB   s        r,   r   z%Frontend.get_requires_for_build_sdist	       => 	*#zz.L^mznnFC!2rCF&$'' 	js2V2Vv2V2V2V/V/V 	j%%&DfN^`cehiii'-^-^d4PS9V\F]F]-^-^-^(^(^`cehiiir+   rD   c           	     z   | j         d         r|                     d|          \  }}}ng dd}}}t          |t                    rt	          d |D                       s|                     d|d||           t          t          d t          t          t                   |          D                       ||          S )z
        Get build requirements for a wheel (per PEP-517).

        :param config_settings: run arguments
        :return: outcome
        r    r   re   c              3  @   K   | ]}t          |t                    V  d S r   r   r   s     r,   r   z8Frontend.get_requires_for_build_wheel.<locals>.<genexpr>#  r   r+   r   c              3  4   K   | ]}t          |          V  d S r   r   r   s     r,   r   z8Frontend.get_requires_for_build_wheel.<locals>.<genexpr>%  r   r+   )r   r   r   r   r   r   rD   r   r   r   r@   r   s        r,   r    z%Frontend.get_requires_for_build_wheel  r   r+   rH   c           	     z   | j         d         r|                     d|          \  }}}ng dd}}}t          |t                    rt	          d |D                       s|                     d|d||           t          t          d t          t          t                   |          D                       ||          S )z
        Get build requirements for an editable wheel build (per PEP-660).

        :param config_settings: run arguments
        :return: outcome
        r"   r   re   c              3  @   K   | ]}t          |t                    V  d S r   r   r   s     r,   r   z;Frontend.get_requires_for_build_editable.<locals>.<genexpr>5  r   r+   r   c              3  4   K   | ]}t          |          V  d S r   r   r   s     r,   r   z;Frontend.get_requires_for_build_editable.<locals>.<genexpr>7  s(      0a0aAQ0a0a0a0a0a0ar+   )r   r   r   r   r   r   rH   r   r   r   r@   r   s        r,   r"   z(Frontend.get_requires_for_build_editable'  s     @A 	*#zz.OapzqqFC!2rCF&$'' 	ms2V2Vv2V2V2V/V/V 	m%%&GQacfhklll*50a0adSViY_I`I`0a0a0a+a+acfhklllr+   metadata_directory"MetadataForBuildWheelResult | Nonec                   |                      |           d}| j        d         r|                     d||          \  }}}|dS t          |t                    s|                     d|t          ||           t          ||z  ||          S )z
        Build wheel metadata (per PEP-517).

        :param metadata_directory: where to generate the metadata
        :param config_settings: build arguments
        :return: metadata generation result
        Nr   r   r   r   )_check_metadata_dirr   r   r   r@   r   rJ   )r5   r   r   basenamerA   rB   s         r,   r   z)Frontend.prepare_metadata_for_build_wheel9  s     	  !3444#AB 	!%6#5 / ", " "Hc3
 4(C(( 	c%%&H(TWY\^abbb*+=+H#sSSSr+   c                    || j         k    rd| j          }t          |          |                                rt          |           |                    dd           d S )Nz>the project root and the metadata directory can't be the same Tparentsexist_ok)rz   RuntimeErrorr   r   mkdir)r5   r   msgs      r,   r   zFrontend._check_metadata_dirS  sp    ++_SWS]__Cs###$$&& 	1/000   =====r+   %MetadataForBuildEditableResult | Nonec                   |                      |           d}| j        d         r|                     d||          \  }}}|dS t          |t                    s|                     d|t          ||           ||z  }t          |||          S )z
        Build editable wheel metadata (per PEP-660).

        :param metadata_directory: where to generate the metadata
        :param config_settings: build arguments
        :return: metadata generation result
        Nr#   r   r   )r   r   r   r   r@   r   rM   )r5   r   r   r   rA   rB   rX   s          r,   r#   z,Frontend.prepare_metadata_for_build_editable[  s     	  !3444#DE 	!%9#5 / ", " "Hc3
 4(C(( 	c%%&H(TWY\^abbb#h.-fc3???r+   sdist_directoryrO   c                    |                     dd           |                     d||          \  }}}t          |t                    s|                     d|t          ||           t          ||z  ||          S )z
        Build a source distribution (per PEP-517).

        :param sdist_directory: the folder where to build the source distribution
        :param config_settings: build arguments
        :return: source distribution build result
        Tr   build_sdist)r   r   r   )r   r   r   r@   r   rO   )r5   r   r   r   rA   rB   s         r,   r   zFrontend.build_sdistv  s     	dT:::!ZZ++ ( 
 
#s
 (C(( 	N%%mXsCMMM?X5sC@@@r+   wheel_directoryPath | NonerR   c                    |                     dd           |                     d|||          \  }}}t          |t                    s|                     d|t          ||           t          ||z  ||          S )a  
        Build a wheel file (per PEP-517).

        :param wheel_directory: the folder where to build the wheel
        :param config_settings: build arguments
        :param metadata_directory: wheel metadata folder
        :return: wheel build result
        Tr   build_wheelr   r   r   r   )r   r   r   r@   r   rR   r5   r   r   r   r   rA   rB   s          r,   r   zFrontend.build_wheel  s     	dT:::!ZZ++1	 ( 
 
#s (C(( 	N%%mXsCMMM?X5sC@@@r+   rU   c                    |                     dd           |                     d|||          \  }}}t          |t                    s|                     d|t          ||           t          ||z  ||          S )a  
        Build an editable wheel file (per PEP-660).

        :param wheel_directory: the folder where to build the editable wheel
        :param config_settings: build arguments
        :param metadata_directory: wheel metadata folder
        :return: wheel build result
        Tr   r!   r   )r   r   r   r@   r   rU   r   s          r,   r!   zFrontend.build_editable  s     	dT:::!ZZ ++1	 ( 
 
#s (C(( 	Q%%&6#sCPPPo8#sCCCr+   r   gotr   expected_typerA   rB   r   c                d    |d| j         d|d|}t          d t          j        |d||          )Nz on z
 returned z but expected type r\   r^   r_   )r   rW   	TypeErrorr%   )r5   r   r   r   rA   rB   r   s          r,   r   zFrontend._unexpected_response  sL     aaDLaacaaP]aaTy7IVYZZ\_adeeer+   targetLiteral['wheel', 'editable']tuple[Path, str, str]c                   t          | d|           }|                                 5 } |||          }|j        }|                                sd|}t	          |          |j        |j        }
}	t          |          }d}t          t          |          d          5 }|	                                D ]I}t          |          j        d         }|                    d          r|}|                    ||           J	 ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   |d| }t	          |          ||z  |	|
fS )a^  
        Create metadata from building the wheel (use when the prepare endpoints are not present or don't work).

        :param metadata_directory: directory where to put the metadata
        :param target: the type of wheel metadata to build
        :param config_settings: config settings to pass in to the build endpoint
        :return:
        build_z$missing wheel file return by backed Nr   r   z
.dist-infoz+no .dist-info found inside generated wheel )getattr_wheel_directoryrS   r   r   rA   rB   r@   r   namelistr   partsendswithextract)r5   r   r   r   hookr   rX   rS   r   rA   rB   
extract_tor   zip_filenamerr   s                   r,   metadata_from_builtzFrontend.metadata_from_built  s    t.f..//""$$ 	;3743Y3YFLE<<>> (FUFF"3'''z6:C/00JHUS)) ;X$--// ; ;D::+A.D}}\22 ;#' ((z:::	;; ; ; ; ; ; ; ; ; ; ; ; ; ; ;	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; GGGCs###!H,c366s7   A8D# AD D#D	D#D	D##D'*D'Iterator[Path]c              #  z   K   t                      5 }t          |          V  d d d            d S # 1 swxY w Y   d S r   )r	   r   )r5   r   s     r,   r   zFrontend._wheel_directory  s      !! 	(_'''''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   044kwargstuple[Any, str, str]c                L   t          d| d          5 }t          |j                                      d          }t	          j        |d |                                D             t          |          d          }|                     |||          5 }|j	        st          d           |j	        d d d            n# 1 swxY w Y   |                                rp	 |                    d          5 }t	          j        |          }d d d            n# 1 swxY w Y   |                                 n## |                                 w xY wd	d
d| dd}d d d            n# 1 swxY w Y   |                                \  }	}
d|v r|d         |	|
fS t!          ||	|
          )Npep517_-)prefixz.jsonc                b    i | ],\  }}|t          |t                    rt          |          n|-S r*   )r   r   r@   )r   kvs      r,   
<dictcomp>z"Frontend._send.<locals>.<dictcomp>  s8    dddTQPQqZ4-@-@#G3q666adddr+   )r   r   rX   gMbP?rtr   r   zBackend response file z is missingr   r0   )r   r   r   with_suffixjsondumpsitemsr@   	_send_msgr6   r
   r   r   r   unlinkr9   rW   )r5   r   r   result_file_markerresult_filer   statusresult_handlerrX   rA   rB   s              r,   r   zFrontend._send  s   '7'7'7'7888 	<N1677CCGLLK*ddU[UaUaUcUcddd!+..  C [#66 !& + !%LLL !+ !! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !!## )$))$// ;>!%>!:!:; ; ; ; ; ; ; ; ; ; ; ; ; ; ;  &&((((K&&((((  .PPPP '	 	 	 	 	 	 	 	 	 	 	 	 	 	 	0 >>##Sv(#S#--FC---sr   B E$B?3E$?C	E$C	E$D54D	D5D	D5D	D5 E$5EE$$E(+E(r  r   Iterator[CmdStatus]c                    t           r   r2   )r5   r   r  r   s       r,   r  zFrontend._send_msg  r:   r+   )T)rr   r   rs   rt   ru   r@   rv   rw   r?   r>   rx   r   r0   rZ   )r   r   r0   r   rl   )r0   r   )r0   r   r   )r   r   r0   r=   )r   r   r0   rD   )r   r   r0   rH   )r   r   r   r   r0   r   )r   r   r0   rZ   )r   r   r   r   r0   r   )r   r   r   r   r0   rO   )NN)r   r   r   r   r   r   r0   rR   )r   r   r   r   r   r   r0   rU   )r   r@   r   r   r   r   rA   r@   rB   r@   r0   r   )r   r   r   r   r   r   r0   r   )r0   r   )r   r@   r   r   r0   r   )r   r@   r  r   r   r@   r0   r  )r%   r&   r'   r(   rp   r)   r   rq   ra   classmethodr   r;   r   r   r   r   r    r"   r   r   r#   r   r   r!   r   r   r   r   r   r   r  r*   r+   r,   ro   ro      s        77 !CBBBB0;<R0S0SU`U`ahUiUi/jOjjjj #: : : : :6 %R %R %R [%RN _ _ _ X_    X $ $ $ X$j j j j jj j j j j" 26m m m m m* 26T T T T T4> > > > 26@ @ @ @ @6A A A A A* 26*.	A A A A A8 26*.	D D D D D2	f 	f 	f 	f 26	!7 !7 !7 !7 !7F ( ( ( ^(. . . .< " " " ^ ^" " "r+   ro   )7r(   
__future__r   r   sysabcr   r   
contextlibr   pathlibr   tempfiler   r	   timer
   typingr   r   r   r   r   r   r   r   r   r   zipfiler   packaging.requirementsr   pyproject_api._utilr   version_infor   tomli__file__parentr   r@   ConfigSettingsr   r/   r=   rD   rH   rJ   rM   rO   rR   rU   r   rW   ro   r*   r+   r,   <module>r     sm   ! ! " " " " " "  



 # # # # # # # # % % % % % %       ; ; ; ; ; ; ; ;       f f f f f f f f f f f f f f f f f f f f f f f f       . . . . . . 0 0 0 0 0 0wNNNNX$sCx.). . . . .IT . . . .
" 
" 
" 
" 
" 
" 
" 
"    z       z       *       *       Z       *       *       Z   
 
 
 
 
L 
 
 
<e" e" e" e" e"s e" e" e" e" e"r+   