B
    u9a0|                 @   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Zd dl	Z	d dl
Z
d dlmZmZmZmZmZmZmZ d dlmZmZmZmZ d dlZd dlmZmZmZmZ dZdddddddZeeddgejd  d	d	e ed
ddddZ!e!"e G dd dZ#G dd de j$e#Z%G dd de j$e#Z&G dd de j$e#Z'e(dkrZe )  dS )    N)forgetmake_legacy_pycunloadverbose
no_tracingcreate_empty_filetemp_dir)make_pkgmake_scriptmake_zip_pkgmake_zip_script)	_run_code_run_module_code
run_modulerun_patha  # Check basic code execution
result = ['Top level assignment']
def f():
    result.append('Lower level reference')
f()
del f
# Check the sys module
import sys
run_argv0 = sys.argv[0]
run_name_in_sys_modules = __name__ in sys.modules
module_in_sys_modules = (run_name_in_sys_modules and
                         globals() is sys.modules[__name__].__dict__)
# Check nested operation
import runpy
nested = runpy._run_module_code('x=1\n', mod_name='<run>')
)__name____file__
__cached____package____doc____spec__zTop level assignmentzLower level referenceF   z<run>)xr   
__loader__)sysrunpyresult	run_argv0run_name_in_sys_modulesmodule_in_sys_modulesnestedc               @   s,   e Zd ZddddddgZdd Zd	d
 ZdS )CodeExecutionMixinnameparentorigincachedhas_locationsubmodule_search_locationsc       	      C   s8  |  }|  }xPt|D ]D}|dr|dr||krD|| ||d kr|d | qW |d}|d}|d kr| | nb|jd k	r| t|jt|j x>| j	D ]4}d| }|t
||f}|t
||f}| || qW | t|t| x2|D ]*}||| f}||| f}| || qW d S )N__r    r   z	__spec__.)copylist
startswithendswithpopZassertIsNoneloaderassertEqualtypeCHECKED_SPEC_ATTRIBUTESgetattrset)	self	result_nsexpected_nskZresult_specZexpected_specattractualZexpected r:    /usr/lib/python3.7/test_runpy.pyassertNamespaceMatchesM   s2    




z)CodeExecutionMixin.assertNamespaceMatchesc       
      C   s   t  }| }|d }tjd }tj||}|d }| || | tjd | | tj||| d|i}	||d< ||	}| ||	 | || | tjd | | tj||| d S )Nr   r   sentinel)	objectr)   r   argvmodulesgetr<   ZassertIsZassertIsNot)
r4   Zcreate_namespaceZexpected_namespacer=   r6   run_nameZsaved_argv0Z	saved_modr5   Z
initial_nsr:   r:   r;   check_code_executionu   s     
z'CodeExecutionMixin.check_code_executionN)r   
__module____qualname__r1   r<   rC   r:   r:   r:   r;   r!   A   s   	(r!   c               @   s   e Zd Zdd Zdd ZdS )ExecutionLayerTestCasec             C   s.   t  }|dd i dd }| || d S )Nr   c             S   s   t ti | S )N)r   example_source)init_globalsr:   r:   r;   	create_ns   s    z7ExecutionLayerTestCase.test_run_code.<locals>.create_ns)example_namespacer)   updaterC   )r4   r6   rI   r:   r:   r;   test_run_code   s
    
z$ExecutionLayerTestCase.test_run_codec                sd   d d}d}d}t jj ||dt }| ||||ddd  fdd	}| || d S )
Nz
<Nonsense>zSome other nonsensezNow you're just being silly )r$   r.   T)r   r   r   r   r   r   r   r   c                s   t t|  S )N)r   rG   )rH   )mod_namemod_specr:   r;   rI      s    z>ExecutionLayerTestCase.test_run_module_code.<locals>.create_ns)	importlib	machinery
ModuleSpecrJ   r)   rK   rC   )r4   	mod_fnameZ
mod_loaderZmod_packager6   rI   r:   )rN   rO   r;   test_run_module_code   s&    
z+ExecutionLayerTestCase.test_run_module_codeN)r   rD   rE   rL   rT   r:   r:   r:   r;   rF      s   	rF   c               @   s   e Zd Zdd Zdd Zdd Zd9dd	Zd:dddddZdd Zdd Z	d;dddddZ
d<dddddZdd Zd=ddZdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 ZdS )>RunModuleTestCasec             C   s4   yt | W n tk
r    Y nX | d|  d S )NzExpected import error for )r   ImportErrorfail)r4   rN   r:   r:   r;   expect_import_error   s
    z%RunModuleTestCase.expect_import_errorc             C   s^   |  d |  d |  d |  d |  d |  d |  d |  d |  d	 d S )
Nr   zsys.imp.ericzos.path.halfza.beez.howardz..eatenz.test_runpyz	.unittestZmultiprocessing)rX   )r4   r:   r:   r;   test_invalid_names   s    







z$RunModuleTestCase.test_invalid_namesc             C   s   |  tdd d d S )Nr   r   )r/   r   )r4   r:   r:   r;   test_library_module   s    z%RunModuleTestCase.test_library_moduleFc             C   s,   t | |rd S t j|d}t| |S )Nz__init__.py)osmkdirpathjoinr   )r4   pkg_dir	namespace	pkg_fnamer:   r:   r;   _add_pkg_dir   s    
zRunModuleTestCase._add_pkg_dir
runpy_test)r`   parent_namespacesc            C   s<  |s|r|st dd}|tj d }tjt  }}	tdkrLtd|	 t	j
d| tdkrrtdt	jd  |r|g| }
||
d< xJ|
D ]B}tj|	|}	| |	|}tdkrtd	|	 tdkrtd
| qW tj|	|}t|d}|| |  tdkrtd
| |d | | }tj||}||||fS )Nz2Can't mark top level module as a namespace package__runpy_pkg__pyr   z  Package tree in:r   z  Updated sys.path:z  Next level in:z
  Created:w.)RuntimeErrorr[   extsepr]   realpathtempfileZmkdtempr   printr   insertr^   rb   openwritecloserP   utilspec_from_file_location)r4   sourcedepthZmod_baser`   rd   pkg_nameZ
test_fnamer_   Zsub_dirZnamespace_flagsZnamespace_flagra   rS   mod_filerN   rO   r:   r:   r;   	_make_pkg   s<     
 

 
 


 
zRunModuleTestCase._make_pkgc       	      C   s  x$t tjD ]}|drtj|= qW tdkr6td tjd= tdkrNtd xtj|ddD ]\}}}xX|D ]P}yt	tj
|| W qn tk
r } ztdkrt| W d d }~X Y qnX qnW x`|D ]X}tj
||}yt| W q tk
r } ztdkrt| W d d }~X Y qX qW q^W y t| tdkrFtd W n6 tk
r~ } ztdkrnt| W d d }~X Y nX d S )	Nre   r   z  Removed sys.modules entriesr   z  Removed sys.path entryF)topdownz  Removed package tree)r*   r   r@   r+   r   rn   r]   r[   walkremover^   OSErrorrmdir)	r4   topentryrootdirsfilesr"   Zexfullnamer:   r:   r;   _del_pkg   s:    
  
 

 "

 
 zRunModuleTestCase._del_pkgc             C   s\   d}|d  |7  < |d |d< |d }t j|j|d }||d< |rX|d  |7  < d S )Ncr   r   r   r   )rP   rs   rt   r"   )r4   ns	alter_sysZchar_to_addspecZnew_specr:   r:   r;   _fix_ns_for_legacy_pyc  s    

z(RunModuleTestCase._fix_ns_for_legacy_pycc      
   	      s  | j t|||d\}}}t t }|||jdd |d  rb||ddd  fdd}	ztd	krt	d
 | 
|	| t  t t| tjst| t t  td	krt	d | |  | 
|	| W d | | X td	krt	d d S )N)r`   rd   ri   r   )r   r   r   r   r   T)r   r   r   c                s   t |  dS )N)r   )r   )rH   )r   rN   r:   r;   rI   4  s    z2RunModuleTestCase._check_module.<locals>.create_nsr   zRunning from source:zRunning from compiled:zModule executed successfully)ry   rG   r   rJ   r)   rK   r%   
rpartitionr   rn   rC   rP   invalidate_caches
__import__r[   r|   r   dont_write_bytecoder   r   r   r   )
r4   rv   r   r`   rd   r_   rS   rO   r6   rI   r:   )r   rN   r;   _check_module  sF    

 

 

 zRunModuleTestCase._check_modulec         	      s$  | j t|d||d\}}}}|dd t| t }	|	||tj	||d  rn|	|ddd  fdd	}
zt
d
krtd | |
|	 t  t| t| tjst| t| t
d
krtd t  | |	  | |
|	 W d | | X t
d
kr td d S )N__main__)r`   rd   ri   r   )r   r   r   r   r   T)r   r   r   c                s   t |  dS )N)r   )r   )rH   )r   rw   r:   r;   rI   ]  s    z3RunModuleTestCase._check_package.<locals>.create_nsr   zRunning from source:zRunning from compiled:zPackage executed successfully)ry   rG   r   r   rJ   r)   rK   rP   rs   cache_from_sourcer   rn   rC   r   r   r[   r|   r   r   r   r   r   r   )r4   rv   r   r`   rd   r_   rS   rN   rO   r6   rI   r:   )r   rw   r;   _check_packageG  sH    



 

 

 z RunModuleTestCase._check_packagec             C   s   |dkrt dd}|}x"t|D ]}|}tj||}q"W tj|d}t| tdkrdtd| tj|d}	| |	 tdkrtd|	 tj|	d}
| |
 tdkrtd	|
 tj|
d
}t| tdkrtd| d S )Nr   z$Relative module test needs depth > 1re   z
sibling.pyz  Added sibling module:unclez  Added uncle package:Zcousinz  Added cousin package:z	nephew.pyz  Added nephew module:)	
ValueErrorranger[   r]   r^   r   r   rn   rb   )r4   Zbase_dirru   rv   rw   Z
module_diriZ
parent_dirZsibling_fnameZ	uncle_dirZ
cousin_dirZnephew_fnamer:   r:   r;   _add_relative_modulesp  s.     

 

 
 z'RunModuleTestCase._add_relative_modulesNc          	   C   sZ  d}|  ||\}}}}|d kr&|}n|}z
| ||| |dd }	tdkr\td| t||d}
| |
d | | |
d |	 | d	|
 | d
|
 ~
t	  t
| t| tjs4t| t| tdkrtd| t	  t||d}| |d | | |d |	 | d	| | d
| ~W d | | X tdkrVtd d S )Nza\
from __future__ import absolute_import
from . import sibling
from ..uncle.cousin import nephew
ri   r   r   zRunning from source:)rB   r   r   ZsiblingZnephewzRunning from compiled:zModule executed successfully)ry   r   r   r   rn   r   r/   assertInrP   r   r   r[   r|   r   r   r   r   r   )r4   rv   rB   contentsr_   rS   rN   rO   expected_namerw   Zd1Zd2r:   r:   r;   _check_relative_imports  sD     

 

 z)RunModuleTestCase._check_relative_importsc             C   s2   x,t dD ] }tdkr td| | | q
W d S )N   r   zTesting package depth:)r   r   rn   r   )r4   rv   r:   r:   r;   test_run_module  s     
z!RunModuleTestCase.test_run_modulec             C   s:   x4t ddD ]&}tdkr"td| | j|ddd qW d S )Nr   r   zTesting package depth:T)r`   rd   )r   r   rn   r   )r4   rv   r:   r:   r;   $test_run_module_in_namespace_package  s     
z6RunModuleTestCase.test_run_module_in_namespace_packagec             C   s4   x.t ddD ] }tdkr"td| | | qW d S )Nr   r   zTesting package depth:)r   r   rn   r   )r4   rv   r:   r:   r;   test_run_package  s     
z"RunModuleTestCase.test_run_packagec             C   sR  |  ddd}|\}}}}|dd}| | j| tj|dd}ttt	t
f}x|D ]}|j}| | d|}	t|dd	d
}
|
|	 W d Q R X yt| W n2 |k
r } z| dt| W d d }~X Y nX | d| yt|d  W n4 |k
r. } z| dt| W d d }~X Y nX | d| W d Q R X qVW d S )NrM   r   r   z	.__main__re   z__init__.pyz raise {0}('{0} in __init__.py.')Zwtascii)encodingzfinding speczNothing raised; expected {}z
.submodule)ry   replace
addCleanupr   r[   r]   r^   rV   AttributeError	TypeErrorr   r   ZsubTestformatrp   rq   r   ZassertNotInrW   )r4   r   r_   _rN   Zinit
exceptionsZ	exceptionr"   ru   rx   errr:   r:   r;    test_run_package_init_exceptions  s,    

""z2RunModuleTestCase.test_run_package_init_exceptionsc          	   C   sR   |  dd\}}}}z,t| | td t| W d Q R X W d | | X d S )NrM   r   zfound in sys\.modules)ry   r   assertWarnsRegexRuntimeWarningr   r   )r4   r_   r   rN   r:   r:   r;   test_submodule_imported_warning  s    z1RunModuleTestCase.test_submodule_imported_warningc          	   C   s   |  ddd\}}}}| | j| |dd}t| | |tj t	  t
dt t| W d Q R X t| | td t| W d Q R X d S )NrM   r   r   z	.__main__errorzfound in sys\.modules)ry   r   r   r   r   r   r   r@   warningscatch_warningssimplefilterr   r   r   )r4   r_   r   rN   packager:   r:   r;    test_package_imported_no_warning  s    
z2RunModuleTestCase.test_package_imported_no_warningc             C   s8   x2t ddD ]$}tdkr"td| | j|dd qW d S )Nr   r   zTesting package depth:T)rd   )r   r   rn   r   )r4   rv   r:   r:   r;   %test_run_package_in_namespace_package  s     
z7RunModuleTestCase.test_run_package_in_namespace_packagec             C   s8   x2t ddD ]$}tdkr"td| | j|dd qW d S )Nr   r   zTesting package depth:T)r`   )r   r   rn   r   )r4   rv   r:   r:   r;   test_run_namespace_package  s     
z,RunModuleTestCase.test_run_namespace_packagec             C   s:   x4t ddD ]&}tdkr"td| | j|ddd qW d S )Nr   r   zTesting package depth:T)r`   rd   )r   r   rn   r   )r4   rv   r:   r:   r;   /test_run_namespace_package_in_namespace_package  s     
zARunModuleTestCase.test_run_namespace_package_in_namespace_packagec             C   s6   x0t dD ]$}tdkr td| | j|dd q
W d S )Nr   r   zTesting package depth:T)r   )r   r   rn   r   )r4   rv   r:   r:   r;   test_run_module_alter_sys  s     
z+RunModuleTestCase.test_run_module_alter_sysc             C   s8   x2t ddD ]$}tdkr"td| | j|dd qW d S )Nr   r   zTesting package depth:T)r   )r   r   rn   r   )r4   rv   r:   r:   r;   test_run_package_alter_sys  s     
z,RunModuleTestCase.test_run_package_alter_sysc             C   s4   x.t ddD ] }tdkr"td| | | qW d S )N      r   z"Testing relative imports at depth:)r   r   rn   r   )r4   rv   r:   r:   r;   test_explicit_relative_import  s     
z/RunModuleTestCase.test_explicit_relative_importc             C   s6   x0t ddD ]"}tdkr"td| | |d qW d S )Nr   r   r   z'Testing main relative imports at depth:r   )r   r   rn   r   )r4   rv   r:   r:   r;   test_main_relative_import  s     
z+RunModuleTestCase.test_main_relative_importc          	      s   d}d|  t|\}} }t  t }||tj| 	dd |d  fdd}z| 
|| W d | | X d S )Nr   z*And now for something completely differentri   r   )r   r   r   r   r   c                s   t  | S )N)r   )rH   )rN   rB   r:   r;   rI   $  s    z2RunModuleTestCase.test_run_name.<locals>.create_ns)ry   rG   r   rJ   r)   rK   rP   rs   r   r   rC   r   )r4   rv   r_   rS   rO   r6   rI   r:   )rN   rB   r;   test_run_name  s    

zRunModuleTestCase.test_run_namec             C   s  dd l }d}d}ddg}d|d g}t }t }xltd|D ]^}d	|g| }	||	 x|D ]}
||	d	 |
  q`W x|D ]}
||	d	 |
  qW q<W d	|g| }	||	 ||	d
  | d|\}}}}| | j| x$td|d D ]}| |d| qW xX|	|gD ]H}| 
||j | 
|jtjj |jrV||j n||j qW | t|d| | t|d| d S )Nr   r   re   r   zuncle.cousinzuncle.cousin.nephewz.siblingr   ri   z.runpy_testrM   r   )pkgutilr3   r   r^   addry   r   r   r   Zwalk_packagesZassertIsInstanceZ
ModuleInfoZmodule_finderrP   rQ   
FileFinderZispkgr|   r"   r/   len)r4   r   Z	max_depthZ	base_nameZpackage_suffixesZmodule_suffixesZexpected_packagesZexpected_modulesrv   rw   r"   r_   rS   rN   rO   Z
moduleinfor:   r:   r;   test_pkgutil_walk_packages+  s<    




z,RunModuleTestCase.test_pkgutil_walk_packages)F)rc   )F)F)N)r   rD   rE   rX   rY   rZ   rb   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r:   r:   r:   r;   rU      s:   
'(
(
rU   c               @   s   e Zd Zd ddZd!ddZdd	 Zd
d Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zedd Zdd ZdS )"RunPathTestCaseNFc             C   s   |d krt }t||||S )N)rG   r
   )r4   
script_dirZscript_basenameru   omit_suffixr:   r:   r;   _make_test_scriptR  s    z!RunPathTestCase._make_test_scriptTc                s   fdd}t  }	|d kr"|}
n|}
|rJtj|
|}|j}|sRd |_nd  }}|	|||d||ddd | ||	 d  fdd}|r|d krtj |}|sd |_||	d<  |	d	<  	d
d |	d< | ||	 d S )Nc                s
   t  | S )N)r   )rH   )script_namer:   r;   rI   ]  s    z0RunPathTestCase._check_script.<locals>.create_nsrM   T)r   r   r   r   r   r   r   r   zprove.issue15230.is.fixedc                s   t |  S )N)r   )rH   )rB   r   r:   r;   rI   z  s    r   r   ri   r   r   )
rJ   r)   rP   rs   rt   r%   r.   rK   rC   r   )r4   r   r   Zexpected_fileZexpected_argv0rN   expect_speccheck_loaderrI   r6   Z	spec_namerO   Z
mod_cachedr:   )rB   r   r;   _check_scriptY  sB    
zRunPathTestCase._check_scriptc             C   s   t |}| t|t| d S )N)reescapeassertRaisesRegexrV   r   )r4   r   msgr:   r:   r;   _check_import_error  s    
z#RunPathTestCase._check_import_errorc          	   C   s:   t  *}d}| ||}| j|d||dd W d Q R X d S )Nscriptz
<run_path>F)r   )r   r   r   )r4   r   rN   r   r:   r:   r;   test_basic_script  s
    
z!RunPathTestCase.test_basic_scriptc          	   C   s>   t  .}d}| j||dd}| j|d||dd W d Q R X d S )Nr   T)r   z
<run_path>F)r   )r   r   r   )r4   r   rN   r   r:   r:   r;   test_basic_script_no_suffix  s    
z+RunPathTestCase.test_basic_script_no_suffixc          	   C   sR   t  B}d}| ||}tj|dd}t| | j|d||dd W d Q R X d S )Nr   T)doraisez
<run_path>F)r   )r   r   
py_compilecompiler[   r|   r   )r4   r   rN   r   compiled_namer:   r:   r;   test_script_compiled  s    

z$RunPathTestCase.test_script_compiledc          	   C   s:   t  *}d}| ||}| j|d|||d W d Q R X d S )Nr   z
<run_path>)rN   )r   r   r   )r4   r   rN   r   r:   r:   r;   test_directory  s
    
zRunPathTestCase.test_directoryc          	   C   s`   t  P}d}| ||}tj|dd}t| tjsRt|}| j	|d|||d W d Q R X d S )Nr   T)r   z
<run_path>)rN   )
r   r   r   r   r[   r|   r   r   r   r   )r4   r   rN   r   r   Z
legacy_pycr:   r:   r;   test_directory_compiled  s    

z'RunPathTestCase.test_directory_compiledc          	   C   s:   t  *}d}| ||}d| }| || W d Q R X d S )Nnot_mainz"can't find '__main__' module in %r)r   r   r   )r4   r   rN   r   r   r:   r:   r;   test_directory_error  s
    z$RunPathTestCase.test_directory_errorc          	   C   sL   t  <}d}| ||}t|d|\}}| j|d|||dd W d Q R X d S )Nr   test_zipz
<run_path>F)rN   r   )r   r   r   r   )r4   r   rN   r   zip_namefnamer:   r:   r;   test_zipfile  s    zRunPathTestCase.test_zipfilec          	   C   sZ   t  J}d}| ||}tj|dd}t|d|\}}| j|d|||dd W d Q R X d S )Nr   T)r   r   z
<run_path>F)rN   r   )r   r   r   r   r   r   )r4   r   rN   r   r   r   r   r:   r:   r;   test_zipfile_compiled  s    
z%RunPathTestCase.test_zipfile_compiledc          	   C   sJ   t  :}d}| ||}t|d|\}}d| }| || W d Q R X d S )Nr   r   z"can't find '__main__' module in %r)r   r   r   r   )r4   r   rN   r   r   r   r   r:   r:   r;   test_zipfile_error  s    z"RunPathTestCase.test_zipfile_errorc       	   
   C   sf   t  V}t  D}d}d| }| |||}t|d|\}}d}| t|t| W d Q R X W d Q R X d S )Nr   z import runpy
runpy.run_path(%r)
r   zrecursion depth exceeded)r   r   r   r   RecursionErrorr   )	r4   r   Z	dummy_dirrN   ru   r   r   r   r   r:   r:   r;   test_main_recursion_error  s    z)RunPathTestCase.test_main_recursion_errorc          
   C   s`   t  P}tj|d}t|ddd}|d W d Q R X t|}| |d d W d Q R X d S )Nz	script.pyrh   latin1)r   u%   
#coding:latin1
s = "non-ASCII: hé"
su   non-ASCII: hé)r   r[   r]   r^   rp   rq   r   r/   )r4   r   filenamefr   r:   r:   r;   test_encoding  s    zRunPathTestCase.test_encoding)NF)NTT)r   rD   rE   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r:   r:   r:   r;   r   O  s   
 
+	
r   r   )*Zunittestr[   Zos.pathr   r   rm   rP   Zimportlib.machineryimportlib.utilr   r   Ztest.supportr   r   r   r   r   r   r   Ztest.support.script_helperr	   r
   r   r   r   r   r   r   r   rG   Zimplicit_namespacer?   dictrJ   rK   r!   ZTestCaserF   rU   r   r   mainr:   r:   r:   r;   <module>   sL   $
O'    
