B
    [,                 @   s  d Z ddlmZ ddlmZ ddlmZm	Z	m
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 ddlmZ ddlmZmZmZ dd	lmZ ddlZdd
lmZm Z  ddl!m"Z" ddl#Z#e$e%e&Z'dd Z(dd Z)dd Z*dd Z+dd Z,G dd de-Z.G dd de"Z/e0eZ1e12ddi e12ddi e0e Z3ddd iid!fe3d< dd"d iid#fe3d"< G d$d de/Z4G d%d& d&e/Z5d'd( Z6d,d*d+Z7dS )-z7A lab app that runs a sub process for a demo or a test.    )path)join)S_IRUSRS_IRGRPS_IROTHN)TemporaryDirectory)patch)BoolDictUnicode)write_kernel_spec)base_aliases
base_flags)
ProcessAppc           	      s   t jdd tt d tt ddd} | d W dQ R X t dd}t|d} | d	 W dQ R X t|t	t
B tB  t fd
d  S )z6Create a temporary directory with some file structure.Zmock_contents)prefixsrcztemp.txtwZhelloNzreadonly-temp.txtzhello from a readonly filec                  s   t  dS )NT)shutilrmtree )root_dirr   8lib/python3.7/site-packages/jupyterlab/tests/test_app.py<lambda>-   s    z&_create_notebook_dir.<locals>.<lambda>)tempfilemkdtemposmkdirospr   openwritechmodr   r   r   atexitregister)fidZreadonly_filepathr   )r   r   _create_notebook_dir!   s    r$   c           	      s~   t jdd t dd} t|  tj}d}t	||}t
t| dd}||d W d	Q R X t fd
d  S )z)Create a temporary directory for schemas.Zmock_schemas)r   z@jupyterlabzapputils-extensionz8tests/schemas/@jupyterlab/apputils-extension/themes.jsonzthemes.jsonr   zutf-8Nc                  s   t  dS )NT)r   r   r   )r   r   r   r   >   s    z%_create_schemas_dir.<locals>.<lambda>)r   r   r   r   r   makedirsjupyterlab_server__name__pkg_resourcesZresource_stringr   r   decoder!   r"   )Zextension_dirZschema_packageZschema_pathZthemesr#   r   )r   r   _create_schemas_dir1   s    
r*   c                  s"   t jdd t fdd  S )z,Create a temporary directory for workspaces.Zmock_user_settings)r   c                  s   t  dS )NT)r   r   r   )r   r   r   r   E   s    z+_create_user_settings_dir.<locals>.<lambda>)r   r   r!   r"   r   r   )r   r   _create_user_settings_dirB   s    r+   c                  s"   t jdd t fdd  S )z,Create a temporary directory for workspaces.Zmock_workspaces)r   c                  s   t  dS )NT)r   r   r   )r   r   r   r   L   s    z(_create_workspaces_dir.<locals>.<lambda>)r   r   r!   r"   r   r   )r   r   _create_workspaces_dirI   s    r,   c           	   C   s   t jddddgddd} tj}t| dd}t| tt|d	d
}|	t
|  W d Q R X t| dd}t| d S )Nz-mzjupyterlab.tests.echo_kernelz-fz{connection_file}zEcho Kernelecho)argvZdisplay_nameZlanguageZkernelszkernel.jsonr   ipython)sys
executablejupyter_corepathspjoinZjupyter_data_dirr   r%   r   r   jsondumpsr   )Zkernel_jsonr3   Z
kernel_dirfZipykernel_dirr   r   r   _install_kernelsP   s    
r8   c               @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )	_test_envzuSet Jupyter path variables to a temporary directory

    Useful as a context manager or with explicit start/stop
    c          
   C   s   t   | _}ttjt|jdt|jdt|jdt|jdd| _| j	  tj
tjt|jddgt|jdddgt|jddgt|jdddgd	| _| j	  d S )
NZjupyterZjupyter_dataZjupyter_runtimer/   )ZJUPYTER_CONFIG_DIRZJUPYTER_DATA_DIRZJUPYTER_RUNTIME_DIRZ
IPYTHONDIRZshareenvetc)ZSYSTEM_JUPYTER_PATHZENV_JUPYTER_PATHZSYSTEM_CONFIG_PATHZENV_CONFIG_PATH)r   test_dirr   dictr   environr4   name	env_patchstartZmultipler2   r3   
path_patch)selftdr   r   r   rA   k   s    



z_test_env.startc          
   C   sJ   | j   | j  y| j  W n" tk
rD } zW d d }~X Y nX d S )N)r@   stoprB   r<   ZcleanupPermissionError)rC   er   r   r   rE   }   s    

z_test_env.stopc             C   s   |    | jjS )N)rA   r<   r?   )rC   r   r   r   	__enter__   s    z_test_env.__enter__c             G   s   |    d S )N)rE   )rC   exc_infor   r   r   __exit__   s    z_test_env.__exit__N)r'   
__module____qualname____doc__rA   rE   rH   rJ   r   r   r   r   r9   e   s
   r9   c               @   s`   e Zd ZdZedZee Zee Z	ee
 Zee Zdd Zdd Zdd Zd	d
 ZdS )ProcessTestAppzIA process app for running tests, includes a mock contents directory.
    *c             C   s    t  | _| j  t|  d S )N)r9   r@   rA   r   __init__)rC   r   r   r   rP      s    
zProcessTestApp.__init__c             C   s   dS )zDisable server extensionsNr   )rC   r   r   r   init_server_extensions   s    z%ProcessTestApp.init_server_extensionsc             C   s:   t   d| j_| j| j_| j| j_| j| j_t|  d S )Nr-   )	r8   Zkernel_managerZdefault_kernel_nameschemas_dirZ
lab_configuser_settings_dirworkspaces_dirr   rA   )rC   r   r   r   rA      s    


zProcessTestApp.startc          
   C   sr   | j   | j  | j  yt|  W n< tk
rl } z| j	t
| td W d d }~X Y nX d S )N   )Zhttp_serverrE   Zio_loopr@   r   _exitresult	Exceptionlogerrorstr)rC   ZfuturerG   r   r   r   _process_finished   s    


z ProcessTestApp._process_finishedN)r'   rK   rL   rM   r   Zallow_originr$   Znotebook_dirr*   rR   r+   rS   r,   rT   rP   rQ   rA   r\   r   r   r   r   rN      s   



rN   testPathPatternzJestApp.testPathPatterntestNamePatternzJestApp.testNamePatternJestAppcoverageTzRun coveragewatchAllzWatch all test filesc               @   s~   e Zd ZdZedddjddZedjddZedjddZ	edjddZ
eZeZedZeedd	ZdZd
d ZdS )r_   z%A notebook app that runs a jest test.FzWhether to run coverage)helpT)config bar)fooc          	      s  | j jd }| jjtjk}tdddd}d}t| j	}x<t
||krvtt||rjt||}P t
|}q<W |stddg}| jr||d	g7 }n:|r|d
|dg7 }| jr|dg7 }q|dg7 }n
||g7 }| jr|d| jg7 }| jr|d| jg7 }|dg7 }| jtjkr$|dg7 }t| jt|| jd}|jf | j t  t fdd tj d}t|d}	t !||	 W dQ R X tj"# }
||
d< |t| j	|
dfS )zGet the command to runterminals_availableZnode_modulesjestbinzjest.jsrd   zjest not found!Znodez
--coveragez--inspect-brkz
--no-cachez
--watchAllz--watchz--testPathPatternz--testNamePatternz--runInBandz--silent)baseUrlterminalsAvailabletokenc                  s   t  dS )NT)r   r   r   )rD   r   r   r   	  s    z%JestApp.get_command.<locals>.<lambda>zconfig.jsonr   NZJUPYTER_CONFIG_DATA)cwdr:   )$web_appsettingsrY   levelloggingDEBUGr   r   realpathjest_dirdirnameexistsRuntimeErrorr`   ra   r]   r^   Z	log_levelINFOr=   connection_urlr[   rl   updatetest_configr   r   r!   r"   r   r   r   r5   dumpr>   copy)rC   rk   debugtargetrh   rm   cmdrc   Zconfig_pathr#   r:   r   )rD   r   get_command   sP    




zJestApp.get_commandN)r'   rK   rL   rM   r	   tagr`   r   r]   r^   ra   jest_aliasesaliases
jest_flagsflagsrt   r
   r=   r{   Zopen_browserr   r   r   r   r   r_      s   c               @   s0   e Zd ZdZedZedZedZdd ZdS )KarmaTestAppz9A notebook app that runs the jupyterlab karma tests.
    zsrc/*.spec.ts*rd   c          	   C   s  | j jd }t| dd}t| j|t|dd}| j}t|dd}tj	
t|dsbtt|d t|d}|d	t|  W d
Q R X t }|jddd | \}}	|jp| j}
tt||
}|sd}t||
|f | jsRtt|d}t|}W d
Q R X |d dd}tttddd|}t
|sLtd| || _tj }||d< | d|
 | d| j | j}ddgt!j"dd
  }|t||dfS )zGet the command to run.rg   rl   rd   re   )rj   rl   rk   rf   Zbuildzinjector.jsr   ad  
            require('es6-promise/dist/es6-promise.js');
            require('@phosphor/widgets/style/index.css');

            var node = document.createElement('script');
            node.id = 'jupyter-config-data';
            node.type = 'application/json';
            node.textContent = '%s';
            document.body.appendChild(node);
            Nz	--patternZstore)actionz$No files matching "%s" found in "%s"zpackage.jsonr?   z@jupyterlab/test-z..ZpackageszaNo source package directory found for "%s", use the pattern "@jupyterlab/test-<package_dir_name>"ZKARMA_INJECT_FILEZKARMA_FILE_PATTERNZKARMA_COVER_FOLDERZkarmarA   rU   )r:   rm   )#rn   ro   getattrr=   ry   r[   karma_base_dirr4   r   r   rv   r%   r   r   r5   r6   argparseArgumentParseradd_argumentZparse_known_argspatternkarma_patternglob
ValueErrorkarma_coverage_dirloadreplacer   rs   HEREr>   r}   
setdefaultr0   r.   )rC   rk   rl   rc   rm   Zkarma_inject_filer#   parserargsr.   r   filesmsgdatar?   Zfolderr:   r   r   r   r   r     sJ    	
zKarmaTestApp.get_commandN)	r'   rK   rL   rM   r   r   r   r   r   r   r   r   r   r     s
   r   c             C   s"   t  }| |_|  |  dS )z1Run a jest test in the given base directory.
    N)r_   instancert   
initializerA   )rt   appr   r   r   run_jestV  s    r   rd   c             C   s6   t t j t }| |_||_|g  |  dS )z2Run a karma test in the given base directory.
    N)	rq   disableZWARNINGr   r   r   r   r   rA   )Zbase_dirZcoverage_dirr   r   r   r   	run_karma_  s    
r   )rd   )8rM   r   r   r   os.pathr   r4   statr   r   r   r   r!   r   r5   rq   r(   r   r0   r   r   Zunittest.mockr   Z	traitletsr	   r
   r   Zipykernel.kernelspecr   r2   Zjupyter_core.applicationr   r   Zjupyterlab_server.process_appr   r&   rs   ru   __file__r   r$   r*   r+   r,   r8   objectr9   rN   r=   r   rz   r   r_   r   r   r   r   r   r   r   <module>   sV   (%





NB	