a
    7af                     @   s  d 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 ddl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 ddlmZ dd	lmZ dd
lmZ ddlmZm Z m!Z! zddl
m"Z" W n e#y   ddl"Z"Y n0 ej$j%Z&G dd deZ'G dd deZ(G dd deZ)dd Z*G dd deZ+dd Z,G dd deZ-G dd deZ.G dd deZ/G dd  d eZ0G d!d" d"eZ1d#d$ Z2d%d& Z3d'd( Z4d)d* Z5d+d, Z6d-d. Z7d/d0 Z8d1d2 Z9e:d3kre);  dS )4z4
Tests for traitlets.config.application.Application
    N)StringIO)TemporaryDirectory)TestCase)mark)	BoolBytesDict	HasTraitsIntegerListSetTupleUnicode)Application)Configurable)Config)check_help_all_outputcheck_help_outputget_output_error_code)mockc                   @   sz   e Zd ZedddjddZedddjddZedd	djddZe	g jddZ
e	e jddZe jdd
dZdS )Foor   z.
    The integer i.

    Details about i.
    helpTconfig   zThe integer j.ZBrianzFirst name.+r   ZmultiplicityN)__name__
__module____qualname__r
   tagijr   namer   lalir   fdict r(   r(   Flib/python3.9/site-packages/traitlets/config/tests/test_application.pyr   2   s   r   c                   @   s   e Zd ZedddjddZedddjddZedjddd	Z	e
 jdd
d	Ze jddZee djddZee e ddjddZdS )Barr   The integer b.r   Tr   zEnable bar.r(   *r   r   )Zvalue_trait)r"   b)Zper_key_traitsN)r   r   r    r
   r!   r-   r   enabledr   tbr   asetr   bdictidictr   Zkey_dictr(   r(   r(   r)   r*   @   s   r*   c                   @   s   e Zd ZedZedddjddZee	e
gZedddjddZed	dd
dZi Zeej eddddddddddd
 i Zeej edddiidfdddiidfddejiidfd dd Zd d! Zd"S )#MyAppmyappFzIs the app running?r   Tr    zLoad this config filez yes the name is wrong on purposezAShould print a warning if `MyApp.warn-typo=...` command is passed)r   r   zFoo.i)zFoo.jz`j` terse help msgzFoo.namezFoo.lazFoo.lizBar.tbz	Bar.bdictzBar.enabledzApplication.log_level)
)Zfooir"   )r#   Zfoojr$   r%   r&   r/   Dr.   enablez	log-levelr*   r.   zSet Bar.enabled to TruezSet Bar.enabled to Falser   	log_levelzset level=CRITICAL))r7   e)ddisableZcritc                 C   s   t | d| _d S N)parent)r   fooselfr(   r(   r)   init_fooq   s    zMyApp.init_fooc                 C   s   t | d| _d S r<   )r*   barr?   r(   r(   r)   init_bart   s    zMyApp.init_barN)r   r   r    r   r$   r   r!   runningr   r*   r   classesconfig_file	warn_tpyoaliasesupdater   flagsloggingCRITICALrA   rC   r(   r(   r(   r)   r3   K   sH   

r3   c                 C   s   dd | D S )Nc                 S   s   g | ]
}|j qS r(   )r   ).0klassr(   r(   r)   
<listcomp>y       z"class_to_names.<locals>.<listcomp>r(   )rE   r(   r(   r)   class_to_namesx   s    rQ   c                   @   s(  e Z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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+d, Zd-d. Zd/d0 Zd1d2 Zejeed3 d4d5d6d7 Z ejeed3 d4d5d8d9 Z!d:d; Z"d<d= Z#d>d? Z$d@S )ATestApplicationc                 C   sR   t  }ttjd}t|}|g|j_d|_d|_|j	d d|
 v sNJ d S )Nr8   z%(message)sz%Y-%m-%d %H:%MZhello)r   r3   rK   INFOStreamHandlerloghandlersZ
log_formatZlog_datefmtinfogetvalue)r@   streamappZhandlerr(   r(   r)   test_log}   s    

zTestApplication.test_logc                 C   s.   t  }|dg |  |jjdks*J d S )Nz--Foo.name=11)r3   
initializerA   r>   r$   r@   r[   r(   r(   r)   test_no_eval_cli_text   s    z%TestApplication.test_no_eval_cli_textc                 C   sH   t  }| |jd | |jd | |jt ttg | |jd d S )Nr4   Fr5   )r3   assertEqualr$   rD   rE   r*   r   rF   r_   r(   r(   r)   
test_basic   s
    zTestApplication.test_basicc                 C   s   t  }| t| g d | t| g d | t|tgdg | t|tgg d | t|tgdg | t|tgddg G dd	 d	t}| t|tgdg | t|tgddg d S )
N)r   r3   r*   r   )r   LoggingConfigurableSingletonConfigurabler   r3   r*   r   r   )r   rc   rd   r   r   r   r*   c                   @   s   e Zd ZdS )z2TestApplication.test_mro_discovery.<locals>.MyApp2Nr   r   r    r(   r(   r(   r)   MyApp2   s   rf   )r3   ZassertSequenceEqualrQ   Z_classes_with_config_traitsZ_classes_inc_parentsr   r   r*   )r@   r[   rf   r(   r(   r)   test_mro_discovery   s4    z"TestApplication.test_mro_discoveryc                 C   sf   t  }|g d |j}t| | |jjd | |jjd | |jj	d | |j j
d d S )Nz--i=10z
--Foo.j=10z--enable=Falsez--log-level=50
   F2   )r3   parse_command_liner   printra   r   r"   r#   r*   r.   r8   r@   r[   r   r(   r(   r)   test_config   s    zTestApplication.test_configc                 C   s   t  }|d  |jdgks$J |j}|jjddgks>J |jjddgksRJ |jj	dksbJ | 
|jjdd	h |  |jjddgksJ |jjddgksJ |  | 
|jjdd	h |jj	dksJ d S )
NzT--li 1 --li 3 --la 1 --tb AB 2 --Foo.la=ab --Bar.aset S1 --Bar.aset S2 --Bar.aset S12r      r]   ab)ZABZS1ZS2)r3   rk   split
extra_argsr   r   r&   r%   r*   r/   ra   r0   rA   r>   rC   rB   rm   r(   r(   r)   test_config_seq_args   s    z$TestApplication.test_config_seq_argsc                 C   s   t  }|d  dddd}dddd}dd	d
d}|j}|jj|ksNJ | |jj| | |jj	| |
  | |jj| |  |jj|ksJ | |jj	| d S )Nz--Foo.fdict a=1 --Foo.fdict b=b --Foo.fdict c=3 --Bar.bdict k=1 -D=a=b -D 22=33 --Bar.idict k=1 --Bar.idict b=2 --Bar.idict c=3 r]   r-   3)ar-   cZ33)krv   Z22r      rp   )rx   r-   rw   )r3   rk   rr   r   r*   r2   ZassertDictEqualr   r'   r1   rA   ra   r>   rC   rB   )r@   r[   r'   r1   r2   r   r(   r(   r)   test_config_dict_args   s     z%TestApplication.test_config_dict_argsc                 C   sX   t  }|g d |  |  | |jjd | |jjd | |jj	d d S )Nrh   ri   F)
r3   rk   rA   rC   ra   r>   r"   r#   rB   r.   r_   r(   r(   r)   test_config_propagation   s    z'TestApplication.test_config_propagationc              	   C   s   d}G dd dt }| }t }t||}t|d}|ddg W d   n1 sZ0    Y  |dg d	|jjv sJ |jjjd
ksJ |jd
ksJ |j	||gd |j
sJ |jjjd
ksJ |jd
ksJ W d   n1 s0    Y  dS )z<Test that loading config files does not override CLI options	config.pyc                   @   s0   e Zd Ze jddZe jddZddiZdS )z2TestApplication.test_cli_priority.<locals>.TestAppTr   vTestApp.valueN	r   r   r    r   r!   valuer   config_file_loadedrH   r(   r(   r(   r)   TestApp   s   r   w c.TestApp.value = 'config file'
$c.TestApp.config_file_loaded = True
N--v=clir   clipath)r   r   pjoinopen
writelinesrk   r   r   r   load_config_filer   )r@   r$   r   r[   tdrF   fr(   r(   r)   test_cli_priority   s$    
$
z!TestApplication.test_cli_priorityc              	   C   s  d}G dd dt }| }t }t||}t|d}|ddg W d    n1 sZ0    Y  |dg |j}d|jjv sJ |jjjd	ksJ |jd	ksJ |j	||gd
 |j
sJ || |jjjd	ksJ |jd	ksJ W d    n1 s0    Y  d S )Nr|   c                   @   s0   e Zd Ze jddZe jddZddiZdS )z:TestApplication.test_ipython_cli_priority.<locals>.TestAppTr   r}   )r~   z	some helpNr   r(   r(   r(   r)   r     s   r   r   r   r   r   r   r   r   )r   r   r   r   r   rk   r   r   r   r   r   update_config)r@   r$   r   r[   r   rF   r   Z
cli_configr(   r(   r)   test_ipython_cli_priority  s(    
$

z)TestApplication.test_ipython_cli_priorityc                 C   s4   G dd dt }| }|dg |jd u s0J d S )Nc                   @   s    e Zd ZddiZedddZdS )z0TestApplication.test_cli_allow_none.<locals>.AppoptApp.optT)Z
allow_noner   Nr   r   r    rH   r   r   r(   r(   r(   r)   App,  s   r   z
--opt=None)r   rk   r   )r@   r   r[   r(   r(   r)   test_cli_allow_none+  s    z#TestApplication.test_cli_allow_nonec                 C   s   t  }|dg |  | |jjd t  }|dg |  | |jjd t  }|dg |  | |jjd t  }|dg |  | |jjd d S )N	--disableFz-d--enableTz-e)r3   rk   rC   ra   rB   r.   r_   r(   r(   r)   
test_flags4  s     zTestApplication.test_flagsc                 C   s|   t  }t }t| |  W d    n1 s60    Y  | }| |d | |d | d| | d| d S )Nz(?<!-)-e, --enable\bz(?<!-)-d, --disable\bz#Equivalent to: [--Bar.enabled=True]z$Equivalent to: [--Bar.enabled=False])	r3   ior   
contextlibredirect_stdoutZprint_flag_helprY   assertRegexassertInr@   r[   stdoutZhmsgr(   r(   r)   test_flags_help_msgI  s    &z#TestApplication.test_flags_help_msgc                 C   s   t  }|ddg |  | |jjd |  | |jjd t  }|ddg |  | |jjd |  | |jjd t  }|ddg |  | |jjd |  | |jjd d S )	Nz--i=5z--j=10   ri   z-i=5z-j=10z--fooi=5z	--fooj=10)r3   rk   rA   ra   r>   r"   r#   r_   r(   r(   r)   test_aliasesT  s$    zTestApplication.test_aliasesc                 C   s   t  }t }t| |  W d    n1 s60    Y  | }| |d | |d | d| | d| | d| d S )Nz(?<!-)-i, --fooi\bz(?<!-)-j, --fooj\bzEquivalent to: [--Foo.i]zEquivalent to: [--Foo.j]zEquivalent to: [--Foo.name])	r3   r   r   r   r   Zprint_alias_helprY   r   r   r   r(   r(   r)   test_aliases_help_msgj  s    &z%TestApplication.test_aliases_help_msgc                 C   sv   t  }|ddg |  | |jjd | |jjd |ddg |  | |jjd | |jjd d	S )
z9test that setting flags doesn't clobber existing settings	--Bar.b=5r   Fr   r   z
--Bar.b=10Tri   N)r3   rk   rC   ra   rB   r.   r-   r_   r(   r(   r)   test_flag_clobberv  s    z!TestApplication.test_flag_clobberc                 C   sZ   t  }ttjd}t|g|j_t }d|j_||_	| 
d|  | 
d|  d S )NrS   ZWOOOO	warn_typorG   )r   r3   rK   rT   rU   rV   rW   r   r   r   r   rY   )r@   rZ   r[   cfgr(   r(   r)   test_warn_autocorrect  s    z%TestApplication.test_warn_autocorrectc                 C   sx   t  }tj|j_t }|| | |jtj | |jjjtj |dg | |jtj	 | |jjjtj	 d S )Nz--crit
r   rK   ZWARNr3   r8   r   ra   r   r^   rL   r@   r   r[   r(   r(   r)   test_flatten_flags  s    

z"TestApplication.test_flatten_flagsc                 C   sx   t  }tj|j_t }|| | |jtj | |jjjtj |ddg | |jtj	 | |jjjd d S )Nz--log-levelrL   r   r   r(   r(   r)   test_flatten_aliases  s    

z$TestApplication.test_flatten_aliasesc                 C   s   t  }|g d |  | |jjd | |jjd | |jddg t  }|g d |  | |jjd | |jjd | |jg d t  }|g d	 | |jg d
 d S )N)r   extraargsr   Fr   r   r   )r   --r   r   r   T)r   r   r   )r   z--la-r   z	--Bar.b=1r   r   r   )r   r   r   )r3   rk   rC   ra   rB   r.   r-   rs   r_   r(   r(   r)   test_extra_args  s"    zTestApplication.test_extra_argsc                 C   s   t  }|dg d S )Nu   ünîcødé)r3   rk   r_   r(   r(   r)   test_unicode_argv  s    z!TestApplication.test_unicode_argvc                 C   s   t  }|  d S N)r3   Zdocument_config_optionsr_   r(   r(   r)   test_document_config_option  s    z+TestApplication.test_document_config_optionc                 C   s   t  }d| v sJ d S )Nr+   )r3   generate_config_filer_   r(   r(   r)   test_generate_config_file  s    z)TestApplication.test_generate_config_filec                 C   s   G dd dt }G dd dtt|}t }|j| | }t| | d| | d| | 	d| | d| | d	| | d
| | d| | d| | d| | 
|dd | d| | 	d| | 
|dd | 	d| d S )Nc                   @   s    e Zd ZedddjddZdS )zQTestApplication.test_generate_config_file_classes_to_include.<locals>.NotInConfigxzRFrom hidden class
            
            Details about from_hidden.
            r   Tr   N)r   r   r    r   r!   Zfrom_hiddenr(   r(   r(   r)   NotInConfig  s   r   c                   @   s   e Zd ZdS )zNTestApplication.test_generate_config_file_classes_to_include.<locals>.NoTraitsNre   r(   r(   r(   r)   NoTraits  s   r   r+   z# Foo(Configurable)z# Configurablez# NoTraits(Foo, Bar)z# c.NoTraits.iz# c.NoTraits.jz# c.NoTraits.nz#  See also: Foo.jz#  See also: Bar.bzDetails about i.r   z# c.NoTraits.from_hiddenz#  See also: NotInConfig.zDetails about from_hidden.)r	   r   r*   r3   rE   appendr   rl   r   ZassertNotInra   count)r@   r   r   r[   Zconf_txtr(   r(   r)   ,test_generate_config_file_classes_to_include  s(    z<TestApplication.test_generate_config_file_classes_to_includec              
   C   s6  t  }t |_d}td}tt||d}|d W d    n1 sP0    Y  td}tt||d}|d W d    n1 s0    Y  |j|||gd |	  | 
|jjd |j|||gd |	  | 
|jjd	 W d    n1 s0    Y  W d    n1 s(0    Y  d S )
Nr|   _1r   zget_config().MyApp.Bar.b = 1Z_2zget_config().MyApp.Bar.b = 2r   ry   r   )r3   rK   	getLoggerrV   r   r   r   writer   rC   ra   rB   r-   )r@   r[   r$   td1f1Ztd2f2r(   r(   r)   test_multi_file  s    
(
(zTestApplication.test_multi_file
assertLogszrequires TestCase.assertLogs)reasonc              	   C   s  t  }t |_|jtj d}td}tt||d d}|	d W d    n1 s`0    Y  tt||d d$}t
ddd	ii| W d    n1 s0    Y  | |jtj(}|j||gd
 |  W d    n1 s0    Y  W d    n1 s0    Y  |jjd	ks,J d|j}d|v sFJ d|v sTJ t||d |v slJ t||d |v sJ d S )Nr   r   z.pyr   zget_config().Bar.b = 1z.jsonr*   r-   ry   r   
Z	Collisionz1 ignored, using 2)r3   rK   r   rV   ZsetLevelrT   r   r   r   r   jsondumpr   ZWARNINGr   rC   rB   r-   joinoutputr@   r[   r$   r   r   Zcapturedr   r(   r(   r)   test_log_collisions  s0    

("Fz#TestApplication.test_log_collisionsc              	   C   s   t  }t |_d}t }tt||d}|d W d    n1 sL0    Y  | |jtj	 }|j
||gd W d    n1 s0    Y  W d    n1 s0    Y  d|j}| d| d S )Nr|   r   syntax error()r   r   SyntaxError)r3   rK   r   rV   r   r   r   r   r   ZERRORr   r   r   r   r   r(   r(   r)   test_log_bad_config  s    
(Lz#TestApplication.test_log_bad_configc              	   C   s   t  }d|_t |_d}t }tt||d}|d W d    n1 sR0    Y  | 	t
  |j||gd W d    n1 s0    Y  W d    n1 s0    Y  d S )NTr|   r   r   r   )r3   Zraise_config_file_errorsrK   r   rV   r   r   r   r   assertRaisesr   r   )r@   r[   r$   r   r   r(   r(   r)   test_raise_on_bad_config"  s    
(z(TestApplication.test_raise_on_bad_configc                 C   s  t  }|dg | |jt | |jj| t   t  t  }|ddg | |jt | |jjt	 | |jj| | |jjj|j t   t  t  }|ddg | |jt | |jjt
 | |jjj | |jj| | |jjj|j dS )z/Try all ways to specify how to create sub-apps.sub1sub2sub3N)Rootinstancerk   ZassertIsInstanceZsubappSub1ZassertIsr=   Zclear_instanceSub2Sub3Z
assertTrueflagr_   r(   r(   r)   test_subcommands_instanciation-  s*    z.TestApplication.test_subcommands_instanciationc              	   C   s  t  }t |_d}td}t||}t|d}|dg W d    n1 sV0    Y  |j||gd | 	t
|jd | 	|jd | |  | 	|jd t|d}|d	g W d    n1 s0    Y  |j||gd | 	t
|jd | 	|jd
 | t d|_W d    n1 s80    Y  |jd | 	t
|jd |j||gd | 	t
|jd | 	|jd
 W d    n1 s0    Y  d S )Nr|   r   r   zc.MyApp.running = True
r   r   r   Tzc.MyApp.running = False
Fz/fooz/bar)r3   rK   r   rV   r   r   r   r   r   ra   lenZloaded_config_filesstartrD   r   AttributeErrorr   )r@   r[   r$   r   rF   r   r(   r(   r)   test_loaded_config_filesM  s8    

$$&z(TestApplication.test_loaded_config_filesN)%r   r   r    r\   r`   rb   rg   rn   rt   rz   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zskipifhasattrr   r   r   r   r   r   r(   r(   r(   r)   rR   |   s@   	#	"

 rR   c                 C   s   G dd dt }|t d}tt |g d W d    n1 sL0    Y  | dd }|j}d|v svJ d|v sJ d	|v sJ |j	tj
ksJ d S )
Nc                   @   s   e Zd ZddiZeddZdS )z"test_cli_multi_scalar.<locals>.Appr   r   Tr   Nr   r(   r(   r(   r)   r   y  s   r   )rV   )--optr]   r   ro   callzError loading argumentzApp.opt=['1', '2']zopt only accepts one value)r   rK   r   pytestZraises
SystemExitrk   Zget_recordsmessageZlevelnorL   )Zcaplogr   r[   recordr   r(   r(   r)   test_cli_multi_scalarx  s    ,r   c                   @   s   e Zd ZddiZdS )r   r   )z,traitlets.config.tests.test_application.Sub1zimport stringN)r   r   r    subcommandsr(   r(   r(   r)   r     s   r   c                   @   s   e Zd ZedZdS )r   FN)r   r   r    r   r   r(   r(   r(   r)   r     s   r   c                   @   s   e Zd ZdS )r   Nre   r(   r(   r(   r)   r     s   r   c                   @   s"   e Zd Zedfdd dfdZdS )r   zApplication classc                 C   s   t | ddS )NT)r=   r   )r   )rootr(   r(   r)   <lambda>  rP   zSub1.<lambda>factory)r   r   N)r   r   r    r   r   r(   r(   r(   r)   r     s   
r   c                       s$   e Zd ZdZdZ fddZ  ZS )DeprecatedAppFc                    s\   d _  fdd}tj jd|$ tt ||| W d    n1 sN0    Y  d S )NTc                     s
   d _ d S )NT)parent_called)r   r?   r(   r)   _capture  s    z/DeprecatedApp._config_changed.<locals>._capturedebug)override_calledr   ZpatchobjectrV   superr   _config_changed)r@   r$   oldnewr   	__class__r?   r)   r     s    zDeprecatedApp._config_changed)r   r   r    r   r   r   __classcell__r(   r(   r   r)   r     s   r   c                  C   sD   t  } | jrJ | jrJ tdddii| _| js6J | js@J d S )NAr-   rw   )r   r   r   r   r   )r[   r(   r(   r)   test_deprecated_notifier  s    


r   c                   C   s   t t d S r   )r   r   r(   r(   r(   r)   test_help_output  s    r   c                   C   s   t t d S r   )r   r   r(   r(   r(   r)   test_help_all_output  s    r   c                  C   s4   t tjdtdg\} }}|dks$J d| vs0J d S )N-mz--show-configr   show_configr   sys
executabler   outerrZecr(   r(   r)   test_show_config_cli  s    r  c                  C   s4   t tjdtdg\} }}|dks$J d| vs0J d S )Nr   z--show-config-jsonr   r  r  r  r(   r(   r)   test_show_config_json_cli  s    r	  c                 C   s\   t  }d|j_|j t|dd}|  |  \}}d|v s@J d|v sLJ d|vsXJ d S )Nr   T)r   r  r3   zi = 5OtherApp)r   r3   r"   r
  r   
readouterr)capsysr   r[   r  r  r(   r(   r)   test_show_config  s    r  c                 C   sR   t  }d|j_|j t|dd}|  |  \}}t|}t ||ksNJ d S )Nr   T)r   Zshow_config_json)r   r3   r"   r
  r   r  r   loads)r  r   r[   r  r  Z	displayedr(   r(   r)   test_show_config_json  s    
r  c                     s   ddl m} m} ddlm G fddd|G fddd| G  fdd	d	| }| }|d
g |jjjdks~J t	t
| dksJ d S )Nr   )r   r   Intc                       s   e Zd Z ddjddZdS )ztest_deep_alias.<locals>.Foor   )Zdefault_valueTr   N)r   r   r    r!   valr(   r  r(   r)   r     s   r   c                       s   e Zd Z fddZ  ZS )ztest_deep_alias.<locals>.Barc                    s"   t  j|i |  | d| _d S r<   )r   __init__r>   r@   r   kwargs)r   r   r(   r)   r    s    z%test_deep_alias.<locals>.Bar.__init__)r   r   r    r  r   r(   )r   r   r)   r*     s   r*   c                       s2   e Zd ZdZddiZgZ fddZ  ZS )z test_deep_alias.<locals>.TestApptestr  zBar.Foo.valc                    s"   t  j|i |  | d| _d S r<   )r   r^   rB   r  )r*   r   r(   r)   r^     s    z+test_deep_alias.<locals>.TestApp.initialize)r   r   r    r$   rH   rE   r^   r   r(   )r*   r   r   r)   r     s   r   z--val=10ri   )Ztraitlets.configr   r   	traitletsr  r^   rB   r>   r  r   listZemit_alias_help)r   r   r   r[   r(   )r*   r   r  r)   test_deep_alias  s    
r  __main__)<__doc__r   r   r   rK   osr  r   Ztempfiler   Zunittestr   r   r   r  r   r   r   r	   r
   r   r   r   r   Ztraitlets.config.applicationr   Ztraitlets.config.configurabler   Ztraitlets.config.loaderr   Ztraitlets.tests.utilsr   r   r   r   ImportErrorr   r   r   r   r*   r3   rQ   rR   r   r   r   r   r   r   r   r   r   r  r	  r  r  r  r   Zlaunch_instancer(   r(   r(   r)   <module>   s\   ,-     	
