o
    ȷeQs                     @   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
m"Z" Y nw 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 Z9d3d4 Z:d5d6 Z;ej<d7d8 Z=ejj>ej?j@d9kd:d;d<d= ZAeBd>kre)C  dS dS )?z4
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.BrianzFirst name.+r   multiplicityN)__name__
__module____qualname__r
   tagijr   namer   lalir   fdict r*   r*   ^/var/www/ideatree/venv/lib/python3.10/site-packages/traitlets/config/tests/test_application.pyr   '   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   )value_trait)r$   b)per_key_traitsN)r    r!   r"   r
   r#   r0   r   enabledr   tbr   asetr   bdictidictr   key_dictr*   r*   r*   r+   r,   8   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)
)fooir$   )r%   foojr&   r'   r(   r3   Dr2   enablez	log-levelr,   r2   zSet Bar.enabled to TruezSet Bar.enabled to Falser   	log_levelzset level=CRITICAL))r>   e)ddisablecritc                 C      t | d| _d S N)parent)r   fooselfr*   r*   r+   init_fook      zMyApp.init_fooc                 C   rD   rE   )r,   barrH   r*   r*   r+   init_barn   rK   zMyApp.init_barN)r    r!   r"   r   r&   r   r#   runningr   r,   r   classesconfig_file	warn_tpyoaliasesupdater   flagsloggingCRITICALrJ   rM   r*   r*   r*   r+   r8   C   sF    r8   c                 C   s   dd | D S )Nc                 S   s   g | ]}|j qS r*   )r    ).0klassr*   r*   r+   
<listcomp>s   s    z"class_to_names.<locals>.<listcomp>r*   )rO   r*   r*   r+   class_to_namesr   s   rZ   c                   @   s0  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d3d4 Zejee d5 d6d7d8d9 Z!ejee d5 d6d7d:d; Z"d<d= Z#d>d? Z$d@dA Z%dBS )CTestApplicationc                 C   sR   t  }ttjd}t|}d|_d|_|g|j_|j	d d|
 v s'J d S )Nr?   z%(message)sz%Y-%m-%d %H:%Mhello)r   r8   rU   INFOStreamHandler
log_formatlog_datefmtloghandlersinfogetvalue)rI   streamapphandlerr*   r*   r+   test_logw   s   

zTestApplication.test_logc                 C   s.   t  }|dg |  |jjdksJ d S )Nz--Foo.name=11)r8   
initializerJ   rG   r&   rI   rg   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 )Nr9   Fr:   )r8   assertEqualr&   rN   rO   r,   r   rP   rl   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   r8   r,   r   )r   LoggingConfigurableSingletonConfigurabler   r8   r,   r   r   )r   rp   rq   r   r   r   r,   c                   @      e Zd ZdS )z2TestApplication.test_mro_discovery.<locals>.MyApp2Nr    r!   r"   r*   r*   r*   r+   MyApp2       rt   )r8   assertSequenceEqualrZ   _classes_with_config_traits_classes_inc_parentsr   r   r,   )rI   rg   rt   r*   r*   r+   test_mro_discovery   s2   

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   )r8   parse_command_liner   printrn   r   r$   r%   r,   r2   r?   rI   rg   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s)J |jj	dks1J | 
|jjdd	h |  |jjddgksIJ |jjddgksSJ |  | 
|jjdd	h |jj	dksiJ 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      rj   ab)ABS1S2)r8   r}   split
extra_argsr   r   r(   r'   r,   r3   rn   r4   rJ   rG   rM   rL   r   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s'J | |jj| | |jj	| |
  | |jj| |  |jj|ksOJ | |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 rj   r0   3)ar0   c33)kr   22r      r   )r   r0   r   )r8   r}   r   r   r,   r6   assertDictEqualr   r)   r5   rJ   rn   rG   rM   rL   )rI   rg   r)   r5   r6   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 )Nrz   r{   F)
r8   r}   rJ   rM   rn   rG   r$   r%   rL   r2   rl   r*   r*   r+   test_config_propagation   s   z'TestApplication.test_config_propagationc              	   C   s   d}G dd dt }| }t e}t||}t|d}|ddg W d   n1 s-w   Y  |dg d	|jjv s@J |jjjd
ksIJ |jd
ksPJ |j	||gd |j
s]J |jjjd
ksfJ |jd
ksmJ W d   dS 1 sxw   Y  dS )z<Test that loading config files does not override CLI options	config.pyc                   @   0   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_loadedrR   r*   r*   r*   r+   TestApp       r   w c.TestApp.value = 'config file'
$c.TestApp.config_file_loaded = True
N--v=clir   clipath)r   r   pjoinopen
writelinesr}   r   r   r   load_config_filer   )rI   r&   r   rg   tdrP   fr*   r*   r+   test_cli_priority   s&   

"z!TestApplication.test_cli_priorityc              	   C   s  d}G dd dt }| }t m}t||}t|d}|ddg W d    n1 s-w   Y  |dg |j}d|jjv sCJ |jjjd	ksLJ |jd	ksSJ |j	||gd
 |j
s`J || |jjjd	ksnJ |jd	ksuJ W d    d S 1 sw   Y  d S )Nr   c                   @   r   )z:TestApplication.test_ipython_cli_priority.<locals>.TestAppTr   r   )r   z	some helpNr   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   update_config)rI   r&   r   rg   r   rP   r   
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 sJ 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)
allow_noner   Nr    r!   r"   rR   r   r   r*   r*   r*   r+   App8  s    r   z
--opt=None)r   r}   r   )rI   r   rg   r*   r*   r+   test_cli_allow_none7  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)r8   r}   rM   rn   rL   r2   rl   r*   r*   r+   
test_flags@  s    zTestApplication.test_flagsc                 C   s|   t  }t }t| |  W d    n1 sw   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])	r8   ior   
contextlibredirect_stdoutprint_flag_helpre   assertRegexassertInrI   rg   stdouthmsgr*   r*   r+   test_flags_help_msgU  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   r{   z-i=5z-j=10z--fooi=5z	--fooj=10)r8   r}   rJ   rn   rG   r$   r%   rl   r*   r*   r+   test_aliases`  s$   zTestApplication.test_aliasesc                 C   sz   G dd dt }| }|ddg | |jd | }|ddg | |jd | }|d	d
g | |jd d S )Nc                   @   s   e Zd ZeddZddiZdS )z@TestApplication.test_aliases_multiple.<locals>.TestMultiAliasAppTr   )r   rL   quxzTestMultiAliasApp.fooN)r    r!   r"   r
   rG   rR   r*   r*   r*   r+   TestMultiAliasAppx  s    
r   z-fr   r   z--bar4   z--qux5r   )r   r}   rn   rG   )rI   r   rg   r*   r*   r+   test_aliases_multiplev  s   z%TestApplication.test_aliases_multiplec                 C   s   t  }t }t| |  W d    n1 sw   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])	r8   r   r   r   r   print_alias_helpre   r   r   r   r*   r*   r+   test_aliases_help_msg  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=10Tr{   N)r8   r}   rM   rn   rL   r2   r0   rl   r*   r*   r+   test_flag_clobber  s   z!TestApplication.test_flag_clobberc                 C   sZ   t  }ttjd}t|g|j_t }d|j_||_	| 
d|  | 
d|  d S )Nr\   WOOOO	warn_typorQ   )r   r8   rU   r^   r_   rb   rc   r   r   r   r   re   )rI   rf   rg   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   rU   WARNr8   r?   r   rn   r   rk   rV   rI   r   rg   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-levelrV   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   )r8   r}   rM   rn   rL   r2   r0   r   rl   r*   r*   r+   test_extra_args  s   zTestApplication.test_extra_argsc                 C   s   t  }|dg d S )Nu   ünîcødé)r8   r}   rl   r*   r*   r+   test_unicode_argv  s   z!TestApplication.test_unicode_argvc                 C   s   t  }|  d S N)r8   document_config_optionsrl   r*   r*   r+   test_document_config_option  s   z+TestApplication.test_document_config_optionc                 C   s   t  }d| v sJ d S )Nr-   )r8   generate_config_filerl   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xzFFrom hidden class

            Details about from_hidden.
            r   Tr   N)r    r!   r"   r   r#   from_hiddenr*   r*   r*   r+   NotInConfig  s    
r   c                   @   rr   )zNTestApplication.test_generate_config_file_classes_to_include.<locals>.NoTraitsNrs   r*   r*   r*   r+   NoTraits  ru   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,   r8   rO   appendr   r~   r   assertNotInrn   count)rI   r   r   rg   conf_txtr*   r*   r+   ,test_generate_config_file_classes_to_include  s(   	z<TestApplication.test_generate_config_file_classes_to_includec              
   C   sB  t  }t |_d}td}tt||d}|d W d    n1 s'w   Y  tdO}tt||d}|d W d    n1 sIw   Y  |j|||gd |	  | 
|jjd |j|||gd |	  | 
|jjd	 W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )
Nr   _1r   zget_config().MyApp.Bar.b = 1_2zget_config().MyApp.Bar.b = 2r   r   r   )r8   rU   	getLoggerrb   r   r   r   writer   rM   rn   rL   r0   )rI   rg   r&   td1f1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o}tt||d d}|	d W d    n1 s0w   Y  tt||d d}t
ddd	ii| W d    n1 sTw   Y  | |jtj}|j||gd
 |  W d    n1 sxw   Y  W d    n1 sw   Y  |jjd	ksJ d|j}d|v sJ d|v sJ t||d |v sJ t||d |v sJ d S )Nr   r   z.pyr   zget_config().Bar.b = 1z.jsonr,   r0   r   r   
	Collisionz1 ignored, using 2)r8   rU   r   rb   setLevelr^   r   r   r   r   jsondumpr   WARNINGr   rM   rL   r0   joinoutputrI   rg   r&   r   r   capturedr   r*   r*   r+   test_log_collisions  s.   


z#TestApplication.test_log_collisionsc              	   C   s   t  }t |_d}t E}tt||d}|d W d    n1 s&w   Y  | |jtj	}|j
||gd W d    n1 sFw   Y  W d    n1 sUw   Y  d|j}| d| d S )Nr   r   syntax error()r   r   SyntaxError)r8   rU   r   rb   r   r   r   r   r   ERRORr   r   r   r   r   r*   r*   r+   test_log_bad_config/  s   
z#TestApplication.test_log_bad_configc              	   C   s   t  }d|_t |_d}t K}tt||d}|d W d    n1 s)w   Y  | 	t
 |j||gd W d    n1 sFw   Y  W d    d S W d    d S 1 s^w   Y  d S )NTr   r   r  r   )r8   raise_config_file_errorsrU   r   rb   r   r   r   r   assertRaisesr  r   )rI   rg   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instancer}   assertIsInstancesubappSub1assertIsrF   clear_instanceSub2Sub3
assertTrueflagrl   r*   r*   r+   test_subcommands_instanciationG  s*   z.TestApplication.test_subcommands_instanciationc              	   C   s  t  }t |_d}td}t||}t|d}|dg W d    n1 s*w   Y  |j||gd | 	t
|jd | 	|jd | |  | 	|jd t|d}|d	g W d    n1 sjw   Y  |j||gd | 	t
|jd | 	|jd
 | t d|_W d    n1 sw   Y  |jd | 	t
|jd |j||gd | 	t
|jd | 	|jd
 W d    d S 1 sw   Y  d S )Nr   r   r   zc.MyApp.running = True
r   r   r   Tzc.MyApp.running = False
Fz/fooz/bar)r8   rU   r   rb   r   r   r   r   r   rn   lenloaded_config_filesstartrN   r  AttributeErrorr   )rI   rg   r&   r   rP   r   r*   r*   r+   test_loaded_config_filesg  s8   


"z(TestApplication.test_loaded_config_filesN)&r    r!   r"   ri   rm   ro   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   skipifhasattrr   r   r  r  r  r  r*   r*   r*   r+   r[   v   sD    )	$	%

 r[   c                 C   s   G dd dt }|t d}tt |g d W d    n1 s&w   Y  | dd }|j}d|v s;J d|v sAJ d	|v sGJ |j	tj
ksOJ 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     s    r   )rb   )--optrj   r  r   callzError loading argumentzApp.opt=['1', '2']zopt only accepts one value)r   rU   r   pytestraises
SystemExitr}   get_recordsmessagelevelnorV   )caplogr   rg   recordr%  r*   r*   r+   test_cli_multi_scalar  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                   @   rr   )r  Nrs   r*   r*   r*   r+   r    ru   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)rF   r  )r  )rootr*   r*   r+   <lambda>  s    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                    sZ   d _  fdd}tj jd| t ||| W d    d S 1 s&w   Y  d S )NTc                     s
   d _ d S )NT)parent_called)r   rH   r*   r+   _capture  s   
z/DeprecatedApp._config_changed.<locals>._capturedebug)override_calledr   patchobjectrb   super_config_changed)rI   r&   oldnewr0  	__class__rH   r+   r6    s
   "zDeprecatedApp._config_changed)r    r!   r"   r2  r/  r6  __classcell__r*   r*   r9  r+   r.    s    r.  c                  C   sD   t  } | jrJ | jrJ tdddii| _| jsJ | js J d S )NAr0   r   )r.  r2  r/  r   r   )rg   r*   r*   r+   test_deprecated_notifier  s   


r=  c                   C      t t d S r   )r   r    r*   r*   r*   r+   test_help_output     r?  c                   C   r>  r   )r   r    r*   r*   r*   r+   test_help_all_output  r@  rA  c                  C   4   t tjdtdg\} }}|dksJ d| vsJ d S )N-mz--show-configr   show_configr   sys
executabler    outerrecr*   r*   r+   test_show_config_cli     rL  c                  C   rB  )NrC  z--show-config-jsonr   rD  rE  rH  r*   r*   r+   test_show_config_json_cli  rM  rN  c                 C   s\   t  }d|j_|j t|dd}|  |  \}}d|v s J d|v s&J d|vs,J d S )Nr   T)r   rD  r8   zi = 5OtherApp)r   r8   r$   rO  r  
readouterr)capsysr   rg   rI  rJ  r*   r*   r+   test_show_config  s   rR  c                 C   sR   t  }d|j_|j t|dd}|  |  \}}t|}t ||ks'J d S )Nr   T)r   show_config_json)r   r8   r$   rO  r  rP  r   loads)rQ  r   rg   rI  rJ  	displayedr*   r*   r+   test_show_config_json  s   
rV  c                     s   ddl m ddlm} 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sKJ d S )Nr   Int)r   r   c                       s   e Zd Z ddjddZdS )ztest_deep_alias.<locals>.Foor   )default_valueTr   N)r    r!   r"   r#   valr*   rW  r*   r+   r         r   c                       s   e Zd Z fddZ  ZS )ztest_deep_alias.<locals>.Barc                    "   t  j|i |  | d| _d S rE   )r5  __init__rG   rI   r   kwargs)r   r:  r*   r+   r]       z%test_deep_alias.<locals>.Bar.__init__)r    r!   r"   r]  r;  r*   )r   r9  r+   r,      r[  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testrZ  zBar.Foo.valc                    r\  rE   )r5  rk   rL   r^  )r,   r:  r*   r+   rk     r`  z+test_deep_alias.<locals>.TestApp.initialize)r    r!   r"   r&   rR   rO   rk   r;  r*   )r,   r   r9  r+   r     s
    r   z--val=10r{   )	traitletsrX  traitlets.configr   r   rk   rL   rG   rZ  r  listemit_alias_help)r   r   r   rg   r*   )r,   r   rX  r+   test_deep_alias  s   
rf  c                 C   s   | d }t ddddt|diddddgd	id
d}t|jjdks&J |jd |jd t|}| dks?J W d   n1 sIw   Y  |	 j
dksWJ dS )z7We should be able to configure additional log handlers.log_filer   filezlogging.FileHandlerDEBUG)classlevelfilenamer   console)rk  rc   )versionrc   loggers)logging_configr   rd   warnz
info
warn
Nz[Application] WARNING | warn
)r   strr  rb   rc   rd   warningr   readrP  rJ  )tmp_pathrQ  rg  rg   
log_handler*   r*   r+   test_logging_config  s.   
rw  c                 C   s`   |  dd t  }d|vsJ d|vsJ |  dd t  }d|v s(J d|v s.J dS )z7Ensure logging is correctly disabled for pythonw usage.z'traitlets.config.application.IS_PYTHONWTrc   ro  FN)setattrr   get_default_logging_config)monkeypatchr   r*   r*   r+   'test_get_default_logging_config_pythonw9  s   

r{  c                    s    g   fdd}|  d|  S )zCapture logging config events for DictConfigurator objects.

    This suppresses the event (so the configuration doesn't happen).

    Returns a list of (args, kwargs).
    c                     s     | |f d S r   )r   )r   r_  callsr*   r+   
_configureP  s   z caplogconfig.<locals>._configurez)logging.config.DictConfigurator.configure)rx  )rz  r~  r*   r|  r+   caplogconfigF  s   r  pypyzTest does not work on pypyr   c                 C   sR   t  }~t|dksJ |  \}}d|vsJ t  }d|_~t|dks'J dS )zEnsure we don't try to open logs in order to close them (See #722).

    If you try to configure logging handlers whilst Python is shutting down
    you may get traceback.
    r   	TracebackTr   N)r   r  rP  _logging_configured)rQ  r  rg   rI  rJ  r*   r*   r+   test_logging_teardown_on_error\  s   	r  __main__)D__doc__r   r   r   rU   osrF  r   tempfiler   unittestr   r!  r   rb  r   r   r   r	   r
   r   r   r   r   traitlets.config.applicationr   traitlets.config.configurabler   traitlets.config.loaderr   traitlets.tests.utilsr   r   r   r   ImportErrorr   r   r   r   r,   r8   rZ   r[   r)  r  r  r  r  r.  r=  r?  rA  rL  rN  rR  rV  rf  rw  r{  fixturer  r  implementationr&   r  r    launch_instancer*   r*   r*   r+   <module>   sn    ,/    	$


