B
    v9a)                 @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZmZ dadd ZG dd de ddZd	d
 Zdd Zdd Zdd ZejejdddZdd Zd!ddZd"ddZd#ddZd$dd ZdS )%    N)source_from_cache)make_legacy_pycstrip_python_stderrc               C   sV   t d krRdtjkrda dS yttjdddg W n tjk
rL   da Y nX da t S )NZ
PYTHONHOMETz-Ez-czimport sys; sys.exit(0)F)$__cached_interp_requires_environmentosenviron
subprocessZ
check_callsys
executableZCalledProcessError r   r   #/usr/lib/python3.7/script_helper.py interpreter_requires_environment   s    


r   c               @   s   e Zd Zdd ZdS )_PythonRunResultc             C   s   d}| j | j }}t||kr0d|| d   }t||krNd|| d   }|dd }|dd }td| j|||f d S )Ni@  s   (... truncated stdout ...)s   (... truncated stderr ...)asciireplacezRProcess return code is %d
command line: %r

stdout:
---
%s
---

stderr:
---
%s
---)outerrlendecoderstripAssertionErrorrc)selfcmd_linemaxlenr   r   r   r   r   fail;   s    z_PythonRunResult.failN)__name__
__module____qualname__r   r   r   r   r   r   8   s   r   )r   r   r   c           	   O   s&  t  }|dd }d|kr&|d}n| o0| }tjddg}|rN|d n|s`|s`|d |dd ri }tjdkrtjd	 |d	< n
tj }d
|krd|d
< |	| |
|  tj|tjtjtj||d}|* z| \}}	W d |  t  X W d Q R X |j}
t|	}	t|
||	|fS )NZ__cwdZ
__isolatedz-XZfaulthandlerz-Iz-EZ
__cleanenvwin32Z
SYSTEMROOTTERM )stdinstdoutstderrenvcwd)r   popr	   r
   appendplatformr   r   copyupdateextendr   PopenPIPEZcommunicatekill_cleanup
returncoder   r   )argsenv_varsZenv_requiredr&   isolatedr   r%   procr   r   r   r   r   r   run_python_until_endX   s<    






r6   c             O   s0   t ||\}}|jr| s"|js,| s,|| |S )N)r6   r   r   )Zexpected_successr2   r3   Zresr   r   r   r   _assert_python   s    
r7   c              O   s   t d| |S )NT)T)r7   )r2   r3   r   r   r   assert_python_ok   s    r8   c              O   s   t d| |S )NF)F)r7   )r2   r3   r   r   r   assert_python_failure   s    r9   )r#   r$   c             O   sX   t jg}t s|d || |dttj}d|d< t	j
|ft	j| |d|S )Nz-Er%   Zvt100r    )r"   r#   r$   )r	   r
   r   r(   r,   
setdefaultdictr   r   r   r-   r.   )r#   r$   r2   kwr   r%   r   r   r   spawn_python   s    

r=   c             C   s2   | j   | j }| j  |   t  |S )N)r"   closer#   readwaitr   r0   )pdatar   r   r   kill_python   s    


rC   Fc             C   sP   |}|s|t jd 7 }t j| |}t|ddd}|| |  t  |S )Npywzutf-8)encoding)	r   extseppathjoinopenwriter>   	importlibinvalidate_caches)Z
script_dirscript_basenamesourceZomit_suffixZscript_filenamescript_nameZscript_filer   r   r   make_script   s    
rQ   c       	      C   s   |t j d }t j| |}t|d}|d kr~|t j}t|dkrr|d dkrrt	t
|}t j|}|}nt j|}||| |  |t j||fS )NziprE      __pycache__)r   rG   rH   rI   zipfileZipFilesplitsepr   r   r   basenamerK   r>   )	zip_dirzip_basenamerP   Zname_in_zipzip_filenamezip_namezip_filepartsZ
legacy_pycr   r   r   make_zip_script   s    ra   r!   c             C   s   t |  t| d| d S )N__init__)r   mkdirrQ   )Zpkg_dirZinit_sourcer   r   r   make_pkg   s    
rd      c                s0  g }t | dd}|| tj|}	t | ||}
||
 |rjtj|dd}tj|
dd}
|||
f  fddtd|d D }tj	|d tj|
}|tj
 d	 }tj	| |}t|d
}x&|D ]}tj	||	}||| qW ||
| |  x|D ]}t| q
W |tj	||fS )Nrb   r!   T)doraisec                s   g | ]}t j g| qS r   )r   rY   rI   ).0i)pkg_namer   r   
<listcomp>   s    z make_zip_pkg.<locals>.<listcomp>re   rR   rE   )rQ   r(   r   rH   rZ   
py_compilecompiler,   rangerI   rG   rV   rW   rK   r>   unlink)r[   r\   ri   rN   rO   depthZcompiledro   Z	init_nameZinit_basenamerP   Z	pkg_namesZscript_name_in_zipr]   r^   r_   nameZinit_name_in_zipr   )ri   r   make_zip_pkg   s.    



rr   )F)N)r!   )re   F)collectionsrL   r	   r   Zos.pathr   rl   rV   importlib.utilr   Ztest.supportr   r   r   r   
namedtupler   r6   r7   r8   r9   r.   ZSTDOUTr=   rC   rQ   ra   rd   rr   r   r   r   r   <module>   s.   $4



