a
    lc(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$   ^/var/www/html/django/DPS/env/lib/python3.9/site-packages/traitlets/config/tests/test_loader.py_check_confG   s
    zTestFileCL._check_confc                 C   sP   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   s    
zTestFileCL.test_pythonc                 C   sP   t ddd\}}t|d}|t |  t|td}| }| 	| d S N.jsonr'   r(   r*   r+   )
r   r-   r.   r/   	json1filer1   r   r,   r2   r&   r3   r$   r$   r%   	test_jsonX   s    
zTestFileCL.test_jsonc                 C   s   t ddd\}}t|d}|d |  t|td}d}|}||j_W d    n1 s`0    Y  | 	|j
jj| t|td}| 	|j
jj| d S )Nr:   r'   r(   r*   {}r+   Zcontext_manager)r   r-   r.   r/   r1   r   r,   ZMyAttrr   r   r#   )r"   r4   r5   r6   r7   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 sX0    Y  | 	t
H t|td}dd	 |j_W d    n1 s0    Y  W d    n1 s0    Y  t|td}| }|jjdksJ d
|jvsJ d S )Nr:   r'   r(   r*   r=   r+      c                 S   s   | S Nr$   )xr$   r$   r%   <lambda>       z8TestFileCL.test_json_context_bad_write.<locals>.<lambda>	cant_json)r   r-   r.   r/   r1   r   r,   Ar   assertRaises	TypeErrorrF   r2   )r"   r4   r5   r6   r#   loadercfgr$   r$   r%   test_json_context_bad_writev   s    
&H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 )NrA      r   rG   trait1z1 ignored, using 0z0 ignored, using 1   z2 ignored, using 3)rN   trait2)r   r   Z
collisionsrG   rN   rP   )r"   r   r   r$   r$   r%   test_collision   s@    zTestFileCL.test_collisionc                 C   sp   t ddd\}}t|d}|t |  t|td}| t	 |
  W d    n1 sb0    Y  d S r9   )r   r-   r.   r/   	json2filer1   r   r,   rH   
ValueErrorr2   )r"   r4   r5   r6   r7   r$   r$   r%   test_v2raise   s    
zTestFileCL.test_v2raiseN)
__name__
__module____qualname__r&   r8   r<   r@   rL   rQ   rT   r$   r$   r$   r%   r   F   s   

%r   c                 C   s*   z
t | W S  ty$   t|  Y S 0 d S rB   )int	Exceptionstr)vr$   r$   r%   _parse_int_or_str   s    
r\   c                   @   s   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)r^   actionz
Global.bam)r_   z--list1append)rb   r_   z--list2+)nargsr_   )parseradd_argumentrZ   rX   r\   )r"   aliasesflagsclassespr$   r$   r%   _add_arguments   s    zMyLoader1._add_arguments)NNNrU   rV   rW   rl   r$   r$   r$   r%   r]      s   r]   c                   @   s   e Zd ZdddZdS )	MyLoader2Nc                 C   s>   | j jdd}|d}|jddd |d}|d d S )Nsubparser_name)r^   1z-xzGlobal.x2y)rf   add_subparsers
add_parserrg   )r"   rh   ri   rj   Z
subparsersZ
subparser1Z
subparser2r$   r$   r%   rl      s
    

zMyLoader2._add_arguments)NNNrm   r$   r$   r$   r%   rn      s   rn   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)r]   r2   splitr   ry   fooMyClassbarr`   rz   r   keysr"   r7   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 frobblerq   Zfrobblez1 -x frobblerp   )rn   r2   r{   r   ro   rr   ry   rC   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 )Nrv   )argvrw   r   Trx   )
r]   r{   r2   r   ry   r|   r}   r~   r`   rz   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 Brz   rx   rA   B)rA   rM   rO   )
r]   r2   r{   r   r   ry   r   rz   Zlist1Zlist2r   r$   r$   r%   test_list_args   s    zTestArgParseCL.test_list_argsN)rU   rV   rW   r   r   r   r   r$   r$   r$   r%   ru      s   	ru   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_traitZvalue_traitr#   )rX   rZ   )r   Zper_key_traitsr#   N)rU   rV   rW   r	   	str_traitr   	int_traitr   
list_traitZlist_of_intsr   
dict_traitdict_of_intsZ
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s2J |jdks@J |jddgksRJ d S )Nr+   z<--C.str_trait=all --C.int_trait=5 --C.list_trait=["hello",5]r   all   Zhello)klassr,   r2   r{   r!   r   r   r   )r"   r7   r#   r>   r$   r$   r%   	test_eval  s    
zTestKeyValueCL.test_evalc                 C   s   | j td}dd tdD }||}|jdks8J |jdksFJ |jjj	dksXJ | 
|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.--rM   N)
startswith).0sr$   r$   r%   
<listcomp>  rE   z-TestKeyValueCL.test_basic.<locals>.<listcomp>
10Z20zlist(range(10))r   )r   r,   r0   r{   r2   r   r   r   r   r   r   r   r	   from_stringr    r!   r"   r7   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,   r2   r	   r   r   r   r-   path
expanduserr   r>   d)r"   r7   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sHJ |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,   r2   r   
extra_argsr   r>   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,   r2   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s2J t|d}|jddgksNJ d S )Nr+   )--C.list_traitrC   r   rr   rC   rr   r   r   r,   r2   r!   r   r"   r7   r   r#   r>   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s8J d S )Nr+   r   rC   r   r   r   r$   r$   r%   test_list_single_itemM  s
    

z$TestKeyValueCL.test_list_single_itemc                 C   s@   | 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   )rC   rr   )r   r,   r2   r!   r   r   r$   r$   r%   	test_dictT  s
    

zTestKeyValueCL.test_dictc                 C   s@   | j td}g d}||}t|d}|jdddks<J d S )Nr+   )--C.dict_of_intsz1=2r   z3=4r   rM      )rA   rO   )r   r,   r2   r!   r   r   r$   r$   r%   test_dict_key_traits[  s
    

z#TestKeyValueCL.test_dict_key_traitsN)rU   rV   rW   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#   Zmultiplicityrc   N)rU   rV   rW   r   tagr   r   r   r>   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   rd   r   r   N)	rU   rV   rW   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   s<   | j td}ddg}|j|tddd}|jjdks8J d S Nr+   -crp   zIPython.command_to_runr>   rh   r   r,   r2   dictZIPythonZcommand_to_runr   r$   r$   r%   test_no_cast_literalss  s    z&TestArgParseKVCL.test_no_cast_literalsc                 C   s<   | j td}ddg}|j|tddd}|jjdks8J d S r   r   r   r$   r$   r%   test_int_literalsz  s    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,   r2   r   r   r   rh   r   rG   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)rU   rV   rW   r	   r   r   r$   r$   r$   r%   rG     s   
rG   r   r   )r   r,   r2   r   r
   r   r   r-   r   r   r   )r"   r7   r   r#   rG   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,   r2   r   r   rG   r>   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sDJ |jjdd	gksXJ |jjd
dgkslJ | 	|jj
ddg |jjdksJ |jjdksJ d S )Nr,   rj   CBase.czCSub.e)a3Z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   r>   rG   rq   rA   rO   ZAABB)rp   ZBBB)rp   Zbcd)r   r,   r   r   r{   r2   r   r   r   r   r>   r   r   r"   r7   rh   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   Zseqoptr   z--seqopt r   )r   r,   r   r2   r   r>   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sRJ |jdddksfJ 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   v1rq   zv 3)Zk1Zk2Zk3r[   Z222)kZ22)r   r,   r   r   r2   r   r   )r"   r7   rh   r   r#   r>   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 ]Z}|d d  }|f|||< tt| }||}|jjg dks~J |j	g dks6J q6d S )Nr>   zClass.trait)r,   rh   ))r   rp   )z--Class.trait=2)z--c=3)z--Class.trait4r   rA   )rp   rq   3r   )
r   r,   r   lenr   r   r2   Classtraitr   )	r"   rh   r7   ZassignmentspositionalsidxZ
argv_partsr   r#   r$   r$   r%   test_mixed_seq_positional  s    
z*TestArgParseKVCL.test_mixed_seq_positionalc                 C   sL   | j td}g d}tt || W d   n1 s>0    Y  dS )zFSplitting positionals across flags is no longer allowed in traitlets 5r+   )r   z--Class.trait=5r   N)r   r,   pytestZraises
SystemExitr2   )r"   r7   r   r$   r$   r%   test_split_positional  s    z&TestArgParseKVCL.test_split_positionalN)rU   rV   rW   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"   r>   r$   r$   r%   test_setget  s    zTestConfig.test_setgetc                 C   sn   t  }| d| |dr J |j}d|_| d| |dsFJ | |jjd |`| |jt   d S )NrG   r   )r   assertNotInZ_has_sectionrG   r|   assertInr   )r"   r>   rG   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~   rz   rx   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   Zasdftest)r   r   r~   rz   r   r   r   loggingLoggerZTestlogger	getLoggerZ
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~   rA   )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   bazrM   r~   rA   )r   r   r   r   r  r~   r  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   r  rM   r~   rA   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 NrA   )r   r   r~   pickledumpsloadsr   )r"   rK   ZpcfgZ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"   rK   r   r$   r$   r%   test_getattr_section:  s
    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  s
    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"   rK   r|   r$   r$   r%   test_getattr_not_sectionH  s
    z#TestConfig.test_getattr_not_sectionc                 C   sb   t  }| d| | t |j}W d    n1 s80    Y  | d| | t|d d S )N_repr_html_r   )r   r   rH   AttributeErrorr  r   r   )r"   rK   r?   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 s4J d|v s@J d|vsLJ |jjdg t|}tddg|v sxJ d|v sJ d S )NrA   z<LazyConfigValueextendz [1]}>zvalue=r   )r   r   Zlazyrc   repr	get_value)r"   rK   Zcfg_reprZ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 r  )r   r   r  r   r   r  r$   r$   r%   test_getitem_not_sectiond  s
    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 r  )r   r   r   r   rc   ZassertIsr   )r"   r>   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.
        rA   rM   N)r   r   r   rc   r   r   r"   r   r   r>   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.
        rA   rM   N)r   r   r   rc   r   r   Z_extendr  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.
        rA   r   N)r   r   r   prependr   r   r  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
        rA   r   N)r   r   r   r!  r   r   Z_prependr  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.
        rA      r   zr   r   )r   r   r&  Nr   r   r   updater   r   r  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   rA   r   r$  r%  Nr'  r  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   rA   r   r$  r%  )r   r&  r   N)r   r   r   r(  r   r   _updater  r$   r$   r%    test_merge_multi_lazy_update_III  s    

z+TestConfig.test_merge_multi_lazy_update_IIIN)rU   rV   rW   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-  r$   r$   r$   r%   r     s2   	
r   )-__doc__r   r-   r	  	itertoolsr   tempfiler   Zunittestr   r   Z	traitletsr   r   r   r   r	   Ztraitlets.configr
   Ztraitlets.config.loaderr   r   r   r   r   r   r   r0   r;   rR   r   r   r,   setLevelr   r\   r]   rn   ru   r!   r   r   r   r   r   r$   r$   r$   r%   <module>   s6   $
	

r	'Td