
    yIf?                        d dl mZ d dlZd dl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 ddlmZmZ erd d	lmZ d d
lmZ  G d dee
          Z G d de          ZdZdS )    )annotationsN)contextmanager)PIPEPopen)Thread)IOTYPE_CHECKINGAnyIteratorTuplecast   )	CmdStatusFrontend)Path)Requirementc                  H     e Zd Zd fdZddZedd            Zdd
Z xZS )SubprocessCmdStatusprocess
Popen[str]returnNonec                    t                                                       || _        d | _        |                                  d S N)super__init__r   _out_errstart)selfr   	__class__s     W/var/www/piapp/venv/lib/python3.11/site-packages/pyproject_api/_via_fresh_subprocess.pyr   zSubprocessCmdStatus.__init__   s8    04

    c                B    | j                                         | _        d S r   )r   communicater   r   s    r!   runzSubprocessCmdStatus.run   s    0022r"   boolc                    | j         j        d uS r   )r   
returncoder%   s    r!   donezSubprocessCmdStatus.done   s    |&d22r"   tuple[str, str]c                Z    t          t          t          t          f         | j                  S r   )r   r   strr   r%   s    r!   out_errzSubprocessCmdStatus.out_err    s    E#s(OT]333r"   )r   r   r   r   )r   r   )r   r'   )r   r+   )	__name__
__module____qualname__r   r&   propertyr*   r.   __classcell__r    s   @r!   r   r      s             3 3 3 3 3 3 3 X34 4 4 4 4 4 4 4r"   r   c                  D     e Zd ZdZd fdZedd            ZddZ xZS )SubprocessFrontendzWA frontend that creates fresh subprocess at every call to communicate with the backend.rootr   backend_pathstuple[Path, ...]backend_moduler-   backend_obj
str | Nonerequirestuple[Requirement, ...]r   r   c                x    t                                          |||||d           t          j        | _        dS )a  
        Create a subprocess frontend.

        :param root: the root path to the built project
        :param backend_paths: paths that are available on the python path for the backend
        :param backend_module: module where the backend is located
        :param backend_obj: object within the backend module identifying the backend
        :param requires: seed requirements for the backend
        F)reuse_backendN)r   r   sys
executable)r   r7   r8   r:   r;   r=   r    s         r!   r   zSubprocessFrontend.__init__'   s8    " 	}nk8chiii.r"   cmdresult_filemsgIterator[SubprocessCmdStatus]c           	   #    K   t           j                                        }t           j                            d | j        D                                                       }|r||d<   t          | j        g| j	        t          t          t          d| j        |          }t          t          t                   |j                                      t           j         | t           j                    t%          |          V  d S )Nc              3  4   K   | ]}t          |          V  d S r   )r-   ).0is     r!   	<genexpr>z/SubprocessFrontend._send_msg.<locals>.<genexpr>>   s(      !F!FQ#a&&!F!F!F!F!F!Fr"   
PYTHONPATHT)argsstdoutstderrstdinuniversal_newlinescwdenv)osenvironcopypathsepjoin_backend_pathsstripr   rB   backend_argsr   _rootr   r   r-   rP   writelinesepr   )r   rC   rD   rE   rS   backendr   s          r!   	_send_msgzSubprocessFrontend._send_msg;   s      joo*//!F!F$2E!F!F!FFFLLNN 	( 'C/6D$56#

 
 
 	RWgm$$**bj+K#+Krz+K+KLLL!'*******r"   kwargsr
   tuple[Any, str, str]c                     | j         |fi |S )z
        Send a command to the backend.

        :param cmd: the command to send
        :param kwargs: keyword arguments to the backend
        :return: a tuple of: backend response, standard output text, standard error text
        )_send)r   rC   ra   s      r!   send_cmdzSubprocessFrontend.send_cmdM   s     tz#(((((r"   )r7   r   r8   r9   r:   r-   r;   r<   r=   r>   r   r   )rC   r-   rD   r   rE   r-   r   rF   )rC   r-   ra   r
   r   rb   )	r/   r0   r1   __doc__r   r   r`   re   r3   r4   s   @r!   r6   r6   $   sw        aa) ) ) ) ) )( + + + ^+") ) ) ) ) ) ) )r"   r6   )r6   )
__future__r   rT   rA   
contextlibr   
subprocessr   r   	threadingr   typingr   r	   r
   r   r   r   	_frontendr   r   pathlibr   packaging.requirementsr   r   r6   __all__ r"   r!   <module>rq      s;   " " " " " " 				 



 % % % % % % " " " " " " " "       @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ * * * * * * * * 32222224 4 4 4 4)V 4 4 4$1) 1) 1) 1) 1) 1) 1) 1)h "r"   