o
    ȷe(X                     @   sh  d 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mZmZmZmZ ddlmZ ddlmZmZmZmZmZmZmZ d	Zd
ZdZddlZedZ e !d 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Z'G dd de	Z(G dd deZ)G dd de)Z*G dd  d e(Z+G d!d" d"e	Z,dS )#z!Tests for traitlets.config.loader    N)chain)mkstemp)TestCase)DictIntegerListTupleUnicode)Configurable)ArgParseConfigLoaderConfigJSONFileConfigLoaderKeyValueConfigLoaderKVArgParseConfigLoaderLazyConfigValuePyFileConfigLoaderzj
c = get_config()
c.a=10
c.b=20
c.Foo.Bar.value=10
c.Foo.Bam.value=list(range(10))
c.D.C.value='hi there'
z
{
  "version": 1,
  "a": 10,
  "b": 20,
  "Foo": {
    "Bam": {
      "value": [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
    },
    "Bar": {
      "value": 10
    }
  },
  "D": {
    "C": {
      "value": "hi there"
    }
  }
}
z
{
  "version": 2
}
devnullc                   @   sD   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S )
TestFileCLc                 C   s^   |  |jd |  |jd |  |jjjd |  |jjjttd |  |j	j
jd d S )N
      hi there)assertEqualabFooBarvalueBamlistrangeDC)selfconfig r$   Y/var/www/ideatree/venv/lib/python3.10/site-packages/traitlets/config/tests/test_loader.py_check_confG   s
   zTestFileCL._check_confc                 C   P   t ddd\}}t|d}|t |  t|td}| }| 	| d S )Nz.py   μnïcø∂eprefixwlog)
r   osfdopenwritepyfilecloser   r-   load_configr&   r"   fdfnamefclr#   r$   r$   r%   test_pythonN      
zTestFileCL.test_pythonc                 C   r'   N.jsonr(   r)   r+   r,   )
r   r.   r/   r0   	json1filer2   r   r-   r3   r&   r4   r$   r$   r%   	test_jsonX   r:   zTestFileCL.test_jsonc                 C   s   t ddd\}}t|d}|d |  t|td}d}|}||j_W d    n1 s0w   Y  | 	|j
jj| t|td}| 	|j
jj| d S )Nr<   r(   r)   r+   {}r,   context_manager)r   r.   r/   r0   r2   r   r-   MyAttrr   r   r#   )r"   r5   r6   r7   r8   r   c_r$   r$   r%   test_context_managerb   s   

zTestFileCL.test_context_managerc              	   C   s   t ddd\}}t|d}|d |  t|td}d|j_W d    n1 s,w   Y  | 	t
$ t|td}dd	 |j_W d    n1 sNw   Y  W d    n1 s]w   Y  t|td}| }|jjdkstJ d
|jvs{J d S )Nr<   r(   r)   r+   r?   r,      c                 S   s   | S Nr$   )xr$   r$   r%   <lambda>   s    z8TestFileCL.test_json_context_bad_write.<locals>.<lambda>	cant_json)r   r.   r/   r0   r2   r   r-   Ar   assertRaises	TypeErrorrI   r3   )r"   r5   r6   r7   r#   loadercfgr$   r$   r%   test_json_context_bad_writev   s"   

z&TestFileCL.test_json_context_bad_writec                 C   s   t  }t  }| ||i  d|j_d|j_| ||i  d|j_| ||i  d|j_| ||dddii | ||dddii d|j_| ||ddd	d
i d S )NrE      r   rJ   trait1z1 ignored, using 0z0 ignored, using 1   z2 ignored, using 3)rQ   trait2)r   r   
collisionsrJ   rQ   rS   )r"   r   r   r$   r$   r%   test_collision   s@   zTestFileCL.test_collisionc                 C   sr   t ddd\}}t|d}|t |  t|td}| t	 |
  W d    d S 1 s2w   Y  d S r;   )r   r.   r/   r0   	json2filer2   r   r-   rK   
ValueErrorr3   )r"   r5   r6   r7   r8   r$   r$   r%   test_v2raise   s   

"zTestFileCL.test_v2raiseN)
__name__
__module____qualname__r&   r9   r>   rD   rO   rU   rX   r$   r$   r$   r%   r   F   s    

%r   c                 C   s&   zt | W S  ty   t|  Y S w rF   )int	Exceptionstr)vr$   r$   r%   _parse_int_or_str   s
   
r`   c                   @      e Zd ZdddZdS )	MyLoader1Nc                 C   sj   | j }|jdddtd |jddtd |jddd	d
 |jdtd |jddtd |jddtd d S )Nz-fz--fooz
Global.foo)desttypez-bzMyClass.barz-nn
store_true)rc   actionz
Global.bam)rd   z--list1append)rg   rd   z--list2+)nargsrd   )parseradd_argumentr^   r\   r`   )r"   aliasesflagsclassespr$   r$   r%   _add_arguments   s   zMyLoader1._add_argumentsNNNrY   rZ   r[   rq   r$   r$   r$   r%   rb          rb   c                   @   ra   )	MyLoader2Nc                 C   s>   | j jdd}|d}|jddd |d}|d d S )Nsubparser_name)rc   1z-xzGlobal.x2y)rk   add_subparsers
add_parserrl   )r"   rm   rn   ro   
subparsers
subparser1
subparser2r$   r$   r%   rq      s
   

zMyLoader2._add_argumentsrr   rs   r$   r$   r$   r%   ru      rt   ru   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestArgParseCLc                 C   s   t  }|d }| |jjd | |jjd | |jd | |jj	d |dg}| t
| dg | t
|j dg | |jj	d d S )N-f hi -b 10 -n wowhir   TwowGlobalbam)rb   r3   splitr   r   fooMyClassbarre   r   r   keysr"   r8   r#   r$   r$   r%   
test_basic   s   zTestArgParseCL.test_basicc                 C   s`   t  }|d }| |jd | |jd |d }| |jd | |jjd d S )Nz	2 frobblerx   frobblez1 -x frobblerw   )ru   r3   r   r   rv   ry   r   rG   r   r$   r$   r%   test_add_arguments   s   z!TestArgParseCL.test_add_argumentsc                 C   sX   t d d}| }| |jjd | |jjd | |jd | |jj	d d S )Nr   )argvr   r   Tr   )
rb   r   r3   r   r   r   r   r   re   r   r   r$   r$   r%   	test_argv   s   zTestArgParseCL.test_argvc                 C   sd   t  }|d }| t|j dg | |jjd | |jddg | |j	g d d S )Nz%--list1 1 wow --list2 1 2 3 --list1 Br   r   rE   B)rE   rP   rR   )
rb   r3   r   r   r   r   r   r   list1list2r   r$   r$   r%   test_list_args   s   zTestArgParseCL.test_list_argsN)rY   rZ   r[   r   r   r   r   r$   r$   r$   r%   r      s
    	r   c                   @   sn   e Zd ZeddZeddZeddZee ddZ	e
ddZe
e e ddZe
e e e dddZdS )r!   Tr#   )	key_traitvalue_traitr#   )r\   r^   )r   per_key_traitsr#   N)rY   rZ   r[   r	   	str_traitr   	int_traitr   
list_traitlist_of_intsr   
dict_traitdict_of_ints
dict_multir$   r$   r$   r%   r!      s$    




r!   c                   @   sX   e Zd Ze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S )TestKeyValueCLc                 C   sV   | j td}|d }t|d}|jdksJ |jdks J |jddgks)J d S )Nr,   z<--C.str_trait=all --C.int_trait=5 --C.list_trait=["hello",5]r   all   hello)klassr-   r3   r   r!   r   r   r   )r"   r8   r#   rB   r$   r$   r%   	test_eval  s   
zTestKeyValueCL.test_evalc                 C   s   | j td}dd tdD }||}|jdksJ |jdks#J |jjj	dks,J | 
|jjj	d | 
t |jjj	d d S )	Nr,   c                 S   s&   g | ]}| d rd|dd  qS )zc.--rP   N)
startswith).0sr$   r$   r%   
<listcomp>  s   & z-TestKeyValueCL.test_basic.<locals>.<listcomp>
1020zlist(range(10))r   )r   r-   r1   r   r3   r   r   r   r   r   r   r   r	   from_stringr    r!   r"   r8   r   r#   r$   r$   r%   r     s   
zTestKeyValueCL.test_basicc                 C   s   | j td}g d}||}t }| ||jtj	d | ||j
tj	d | ||jtj	d | ||jd d S )Nr,   )z--a=~/1/2/3z--b=~z--c=~/z--d="~/"~/1/2/3~z~/)r   r-   r3   r	   r   r   r   r.   path
expanduserr   rB   d)r"   r8   r   r#   ur$   r$   r%   test_expanduser'  s   
zTestKeyValueCL.test_expanduserc                 C   s   | j td}|g d}| |jddg |jdksJ |jdks$J |g d}| |jdd	g | j td}|g d
}| |jddg d S )Nr,   )--a=5r   r   --c=10r   r   5r   )r   r   r   r   r   )extraz--a=2z--c=1r   -r   r   )r   r-   r3   r   
extra_argsr   rB   r   r$   r$   r%   test_extra_args1  s   zTestKeyValueCL.test_extra_argsc                 C   s:   | j td}dg}||}t||j | |jd d S )Nr,      --a=épsîlön
   épsîlön)r   r-   r3   printr   r   r   r   r$   r$   r%   test_unicode_args>  s
   
z TestKeyValueCL.test_unicode_argsc                 C   sR   | j td}g d}||}|jjddgksJ t|d}|jddgks'J d S )Nr,   )--C.list_traitrG   r   ry   rG   ry   r   r   r-   r3   r!   r   r"   r8   r   r#   rB   r$   r$   r%   test_list_appendE  s   

zTestKeyValueCL.test_list_appendc                 C   s<   | j td}ddg}||}t|d}|jdgksJ d S )Nr,   r   rG   r   r   r   r$   r$   r%   test_list_single_itemM  s
   

z$TestKeyValueCL.test_list_single_itemc                 C   @   | j td}g d}||}t|d}|jdddksJ d S )Nr,   )--C.dict_traitzx=5r   zy=10r   r   r   )rG   ry   )r   r-   r3   r!   r   r   r$   r$   r%   	test_dictT  
   

zTestKeyValueCL.test_dictc                 C   r   )Nr,   )--C.dict_of_intsz1=2r   z3=4r   rP      )rE   rR   )r   r-   r3   r!   r   r   r$   r$   r%   test_dict_key_traits[  r   z#TestKeyValueCL.test_dict_key_traitsN)rY   rZ   r[   r   r   r   r   r   r   r   r   r   r   r   r$   r$   r$   r%   r     s    

r   c                   @   sL   e Zd Ze jddZee jdddZe jdddZe	 jddZ
dS )CBaseTr   *r#   multiplicityrh   N)rY   rZ   r[   r   tagr   r   r   rB   r   adictr$   r$   r$   r%   r   c  s
    r   c                   @   s:   e Zd Ze jddZe jdddZe jdddZdS )CSubTr   ri   r   r   N)	rY   rZ   r[   r   r   r   er   bdictr$   r$   r$   r%   r   j  s    r   c                   @   s`   e Zd Ze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S )TestArgParseKVCLc                 C   <   | j td}ddg}|j|tddd}|jjdksJ d S Nr,   -crw   zIPython.command_to_runrB   rm   r   r-   r3   dictIPythoncommand_to_runr   r$   r$   r%   test_no_cast_literalss     z&TestArgParseKVCL.test_no_cast_literalsc                 C   r   r   r   r   r$   r$   r%   test_int_literalsz  r   z"TestArgParseKVCL.test_int_literalsc                 C   sZ   | j td}dg}|j|tddd}tt| t|j t|j | |jj	d d S )Nr,   r   A.a)r   r   r   )
r   r-   r3   r   r   r   rm   r   rJ   r   r   r$   r$   r%   test_unicode_alias  s   

z#TestArgParseKVCL.test_unicode_aliasc                 C   sl   | j td}g d}|j|tdddd}G dd dt}||d	}| |jtj	d
 | |j
d
 d S )Nr,   )z-ar   z--bz	'~/1/2/3'r   zA.br   r   r   c                   @   s    e Zd ZeddZeddZdS )z,TestArgParseKVCL.test_expanduser2.<locals>.ATr   N)rY   rZ   r[   r	   r   r   r$   r$   r$   r%   rJ     s    
rJ   r   r   )r   r-   r3   r   r
   r   r   r.   r   r   r   )r"   r8   r   r#   rJ   r   r$   r$   r%   test_expanduser2  s   
z!TestArgParseKVCL.test_expanduser2c                 C   s<   | j td}ddg}|j|tddd}| |jjd d S )Nr,   r   za=5zA.cr   r   )r   r-   r3   r   r   rJ   rB   r   r$   r$   r%   r     s   zTestArgParseKVCL.test_evalc                 C   s   | j tttfd}ddd}d }|j||d}|jg dks"J |jjdd	gks,J |jjd
dgks6J | 	|jj
ddg |jjdksHJ |jjdksPJ d S )Nr-   ro   CBase.czCSub.e)a3a5z{--CBase.a A --CBase.a 2 --CBase.b 1 --CBase.b 3 --a3 AA --CBase.c BB --CSub.d 1 --CSub.d BBB --CSub.e 1 --CSub.e=bcd a b c r   r   r   rB   rJ   rx   rE   rR   AABB)rw   BBB)rw   bcd)r   r-   r   r   r   r3   r   r   r   r   rB   r   r   r"   r8   rm   r   r#   r$   r$   r%   test_seq_traits  s   
z TestArgParseKVCL.test_seq_traitsc                 C   sD   | j ttfd}ddi}ddg}|j||d}| |jjdg d S )Nr   seqoptr   z--seqopt r   )r   r-   r   r3   r   rB   r   r$   r$   r%   #test_seq_traits_single_empty_string  s
   z4TestArgParseKVCL.test_seq_traits_single_empty_stringc                 C   sj   | j tttfd}ddd}g d}|j||d}t|d}|jdd	d
dks)J |jdddks3J d S )Nr   zCBase.adictz
CSub.bdict)r    E)	-Dzk1=v1z-D=k2=2r   zk3=v 3-Ezk=vr   z22=222r   r   v1rx   zv 3)k1k2k3r_   222)k22)r   r-   r   r   r3   r   r   )r"   r8   rm   r   r#   rB   r$   r$   r%   test_dict_traits  s   

z!TestArgParseKVCL.test_dict_traitsc           	      C   s   ddi}| j t|d}g d}g d}tt|d D ]-}|d d  }|f|||< tt| }||}|jjg dks?J |j	g dksHJ qd S )NrB   zClass.trait)r-   rm   ))r   rw   )z--Class.trait=2)z--c=3)z--Class.trait4r   rE   )rw   rx   3r   )
r   r-   r   lenr   r   r3   Classtraitr   )	r"   rm   r8   assignmentspositionalsidx
argv_partsr   r#   r$   r$   r%   test_mixed_seq_positional  s   
z*TestArgParseKVCL.test_mixed_seq_positionalc                 C   sN   | j td}g d}tt || W d   dS 1 s w   Y  dS )zFSplitting positionals across flags is no longer allowed in traitlets 5r,   )r   z--Class.trait=5r   N)r   r-   pytestraises
SystemExitr3   )r"   r8   r   r$   r$   r%   test_split_positional  s
   "z&TestArgParseKVCL.test_split_positionalN)rY   rZ   r[   r   r   r   r   r   r   r   r   r   r   r	  r  r$   r$   r$   r%   r   p  s    		r   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d3S )4
TestConfigc                 C   s.   t  }d|_| |jd | d|v d d S )Nr   r   F)r   r   r   )r"   rB   r$   r$   r%   test_setget  s   zTestConfig.test_setgetc                 C   sn   t  }| d| |drJ |j}d|_| d| |ds#J | |jjd |`| |jt   d S )NrJ   r   )r   assertNotIn_has_sectionrJ   r   assertInr   )r"   rB   rJ   r$   r$   r%   test_auto_section  s   zTestConfig.test_auto_sectionc                 C   sh   t  }t  }d|_d|j_|| | |jjd | |jd d|j_|| | |jjd d S )Nr   )r   r   r   merger   r   r"   c1c2r$   r$   r%   test_merge_doesnt_exist  s   

z"TestConfig.test_merge_doesnt_existc                 C   s   t  }t  }d|j_d|j_d|j_d|j_|| | |jjd | |jjd | |jjd d|jj_|| | |jjjd d S )Nr      r   (   )r   r   r   r   r   r  r   r   r  r$   r$   r%   test_merge_exists  s   


zTestConfig.test_merge_existsc                 C   s   t  }d|j_d|j_d|_td|_td|j	_
td|j	_t|}| || | ||u | |j|ju | |j	|j	u | |j	j
|j	j
u  | |j	j|j	ju  d S )Nr   r  asdftest)r   r   r   r   r   r   r   loggingLoggerTestlogger	getLogger
get_loggercopydeepcopyr   
assertTruer  r$   r$   r%   test_deepcopy  s   

zTestConfig.test_deepcopyc                 C   s   t  }d|_d S )Njson)r   formatr"   r  r$   r$   r%   test_builtin  s   
zTestConfig.test_builtinc                 C   s4   t dddii}| |jjt  | |jjd d S Nr   r   rE   )r   r   r   	__class__r   r*  r$   r$   r%   test_fromdict  s   zTestConfig.test_fromdictc                 C   sD   t  }t dddii}|| | |jjt  | |jjd d S r,  )r   r  r   r   r-  r   r  r$   r$   r%   test_fromdictmerge  s
   
zTestConfig.test_fromdictmergec                 C   sl   t dddii}t dddii}|| | |jjt  | |jjd | |jjd | d|j d S )Nr   bazrP   r   rE   )r   r  r   r   r-  r   r0  r  r  r$   r$   r%   test_fromdictmerge2"  s   
zTestConfig.test_fromdictmerge2c                 C   sT   t dddii}t dddii}| d| | d| | d| | d| d S )Nr   r0  rP   r   rE   zFoo.bazzFoo.bar)r   r  r  r  r$   r$   r%   test_contains+  s   zTestConfig.test_containsc                 C   s2   t  }d|j_t|}t|}| || d S NrE   )r   r   r   pickledumpsloadsr   )r"   rN   pcfgcfg2r$   r$   r%   test_pickle_config3  s
   

zTestConfig.test_pickle_configc                 C   s6   t  }| d| |j}t|t sJ | d| d S Nr   )r   r  r   
isinstancer  r"   rN   r   r$   r$   r%   test_getattr_section:  
   zTestConfig.test_getattr_sectionc                 C   s8   t  }| d| |d }t|t sJ | d| d S r:  )r   r  r;  r  r<  r$   r$   r%   test_getitem_sectionA  
   zTestConfig.test_getitem_sectionc                 C   s6   t  }| d| |j}t|tsJ | d| d S Nr   )r   r  r   r;  r   r  r"   rN   r   r$   r$   r%   test_getattr_not_sectionH  r>  z#TestConfig.test_getattr_not_sectionc                 C   sb   t  }| d| | t |j}W d    n1 sw   Y  | d| | t|d d S )N_repr_html_r   )r   r  rK   AttributeErrorrD  r   r  )r"   rN   rC   r$   r$   r%   test_getattr_private_missingO  s   z'TestConfig.test_getattr_private_missingc                 C   s   t  }|jjd t|}d|v sJ d|v sJ d|v s J d|vs&J |jjdg t|}tddg|v s<J d|v sBJ d S )NrE   z<LazyConfigValueextendz [1]}>zvalue=r   )r   r  lazyrh   repr	get_value)r"   rN   cfg_reprrepr2r$   r$   r%   test_lazy_config_reprW  s   z TestConfig.test_lazy_config_reprc                 C   s8   t  }| d| |d }t|tsJ | d| d S rA  )r   r  r;  r   r  rB  r$   r$   r%   test_getitem_not_sectiond  r@  z#TestConfig.test_getitem_not_sectionc                 C   sd   t  }t  }g |j_|| |jjd | |j|j | |jjdg | |jjdg d S r3  )r   r   r  r  rh   assertIsr   )r"   rB   r  r$   r$   r%   test_merge_no_copiesk  s   
zTestConfig.test_merge_no_copiesc                 C   sV   t  }t  }dg|j_|jjd t  }|| || | |jjddg dS )z
        With multiple config files (systemwide and users), we want compounding.

        If systemwide overwirte and user append, we want both in the right
        order.
        rE   rP   N)r   r   r  rh   r  r   r"   r  r  rB   r$   r$   r%   test_merge_multi_lazyu  s   


z TestConfig.test_merge_multi_lazyc                 C   s\   t  }t  }|jjd |jjd t  }|| || | |jjjddg dS )z
        With multiple config files (systemwide and users), we want compounding.

        If both are lazy we still want a lazy config.
        rE   rP   N)r   r   r  rh   r  r   _extendrQ  r$   r$   r%   test_merge_multi_lazyII  s   

z"TestConfig.test_merge_multi_lazyIIc                 C   sX   t  }t  }dg|j_|jjdg t  }|| || | |jjddg dS )z
        With multiple config files (systemwide and users), we want compounding.

        Prepend should prepend in the right order.
        rE   r   N)r   r   r  prependr  r   rQ  r$   r$   r%   test_merge_multi_lazy_III  s   


z$TestConfig.test_merge_multi_lazy_IIIc                 C   s`   t  }t  }|jjdg |jjdg t  }|| || | |jjjddg dS )z
        With multiple config files (systemwide and users), we want compounding.

        Both prepending should be lazy
        rE   r   N)r   r   r  rU  r  r   _prependrQ  r$   r$   r%   test_merge_multi_lazy_IV  s   

z#TestConfig.test_merge_multi_lazy_IVc                 C   sd   t  }t  }ddd|j_|jjddd t  }|| || | |jjdddd dS )z
        With multiple config files (systemwide and users), we want compounding.

        dict update shoudl be in the right order.
        rE      r   zr   r   )r   r   r[  Nr   r   r  updater  r   rQ  r$   r$   r%   test_merge_multi_lazy_update_I  s   

z)TestConfig.test_merge_multi_lazy_update_Ic                 C   sb   t  }t  }|jjddd ddd|j_t  }|| || | |jjddd dS )
        With multiple config files (systemwide and users), we want compounding.

        Later dict overwrite lazyness
        r   rE   r   rY  rZ  Nr\  rQ  r$   r$   r%   test_merge_multi_lazy_update_II  s   

z*TestConfig.test_merge_multi_lazy_update_IIc                 C   sl   t  }t  }|jjddd |jjddd t  }|| || | |jjjdddd dS )r_  r   rE   r   rY  rZ  )r   r[  r   N)r   r   r  r]  r  r   _updaterQ  r$   r$   r%    test_merge_multi_lazy_update_III  s   

z+TestConfig.test_merge_multi_lazy_update_IIIN)rY   rZ   r[   r  r  r  r  r'  r+  r.  r/  r1  r2  r9  r=  r?  rC  rF  rM  rN  rP  rR  rT  rV  rX  r^  r`  rb  r$   r$   r$   r%   r    s4    	
r  )-__doc__r$  r.   r4  	itertoolsr   tempfiler   unittestr   r
  	traitletsr   r   r   r   r	   traitlets.configr
   traitlets.config.loaderr   r   r   r   r   r   r   r1   r=   rV   r  r"  r-   setLevelr   r`   rb   ru   r   r!   r   r   r   r   r  r$   r$   r$   r%   <module>   s8    $
	

r	'Td