U
    /eA                     @   sv  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Zd dl	Z	d dl
Zd dl
mZmZmZmZmZmZmZ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 Zdd	 Zd
d Z dd Z!dd Z"edd Z#ej$j%ej&dkddej$'dddg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) Z0d*d+ Z1d,d- Z2d.d/ Z3ej$'d0d1d2gd3d4 Z4d5d6 Z5d7d8 Z6d9d: Z7ej$'d;d<d=d>d?d@gd?dAgfdBd?d@hd?dAhfdCd@idCdAifdDd?dEd@gdFdDd?dEdAgdFfgdGdH Z8dIdJ Z9dKdL Z:ej$'dMdNdOgdPdQ Z;dRdS Z<dTdU Z=dVdW Z>dXdY Z?dZd[ Z@d\d] ZAd^d_ ZBd`da ZCdbdc ZDddde ZEdS )f    N)OrderedDict)contextmanager)
_get_pathscanonical_namecollectcollect_envcollect_yamlconfigdeserializeensure_fileexpand_environment_variablesgetmergerefreshrename	serializeupdateupdate_defaults)tmpfilec                  C   sz   ddd} t d| dkstt d| dks.tt d| dks@tt d| dksRtt d| dksdtt d	| d	ksvtd S )
N      )foo-bar	fizz_buzzr   foo_barz	fizz-buzzr   znew-keyZnew_key)r   AssertionError)c r   :/tmp/pip-unpacked-wheel-dbjnr7gq/dask/tests/test_config.pytest_canonical_name!   s    
r   c                  C   s   dddid} ddt ddid}t||  |dddddd	ksFtdddid} dddddd}t|| d
d |dddddd	kstd S )Nr   axyr      br!   zr"   r   r$   r!   r"   r&   old)priority)r   r   r   r'   r   r   r   test_update+   s    
r+   c                  C   sJ   dddid} ddddid}dddddd	}t | |}||ksFtd S )
Nr   r   r    r   r#   r$   r%   r'   r(   )r   r   )r   r$   expectedr   r   r   r   
test_merge7   s
    
r-   c                  C   s   dddid} ddddid}dddddd	}t d
d~}t d
dh}t|d}t| | W 5 Q R X t|d}t|| W 5 Q R X tt||gd }||kstW 5 Q R X W 5 Q R X d S )Nr   r   r    r   r#   r$   r%   r'   r(   yaml	extensionwpaths)r   openr.   dumpr   r   r   )r   r$   r,   fn1fn2fr	   r   r   r   test_collect_yaml_pathsA   s    r9   c               
   C   s   dddid} ddddid}dddddd	}t  }t| ttj|d
dd}t| | W 5 Q R X ttj|ddd}t|| W 5 Q R X tt	|gd }||kst
W 5 Q R X d S )Nr   r   r    r   r#   r$   r%   r'   r(   a.yamlr1   modeb.yamlr2   )r   osmkdirr4   pathjoinr.   r5   r   r   r   )r   r$   r,   dirnamer8   r	   r   r   r   test_collect_yaml_dirR   s    
rC   c              
   c   sF   t t | j}|t jA }zt| | d V  W 5 t| | X d S N)statS_IMODEr>   st_modeS_IREADchmod)r@   Z	perm_origZperm_newr   r   r   no_read_permissionsc   s    

rJ   win32z$Can't make writeonly file on windows)reasonkind	directoryfilec              	   C   s   ddd}ddd}t | }tj|d}tj|d}t|d	d
}t|| W 5 Q R X t|d	d
}t|| W 5 Q R X |dkr|}i }	n|}|}	t|" tt	|gd }
|
|	kst
W 5 Q R X d S )Nr   r   r    r#      )r"   r&   r:   r=   r1   r;   rN   r2   )strr>   r@   rA   r4   r.   r5   rJ   r   r   r   )tmpdirrM   r   r$   dir_pathZa_pathZb_pathr8   Z	cant_readr,   r	   r   r   r   #test_collect_yaml_permission_errorsn   s"    


rT   c              	   C   s   t | }tj|d}t|dd}|d W 5 Q R X tt}t	|gd W 5 Q R X t
|t |jksptdt |jkstdt |jkstd S )Nr:   wbr;      {r2   is malformedzoriginal error messagerQ   r>   r@   rA   r4   writepytestraises
ValueErrorr   reprvaluer   rR   rS   Zfil_pathr8   Zrecr   r   r    test_collect_yaml_malformed_file   s    r`   c              	   C   s   t | }tj|d}t|dd}|d W 5 Q R X tt}t	|gd W 5 Q R X t
|t |jksptdt |jkstdt |jkstd S )Nr:   rU   r;   s   [1234]r2   rW   zmust have a dictrX   r_   r   r   r   #test_collect_yaml_no_top_level_dict   s    ra   c               	   C   sL   ddddddddd} d	d
dd	dddddgdd}t | }||ksHtd S )N123TruehelloZ456z[1, 2, "3"]z/not/parsable/as/literalznot included)DASK_A_BDASK_CZDASK_DZ	DASK_E__XZ	DASK_E__YZDASK_FZDASK_GFOO{   T  r    r   r   3)a_br   der8   g)r   r   )envr,   resr   r   r   test_env   s$    	rq   c                  C   s   dddid} ddddid}dd	i}d	dddd
dd}t dd|}t ddf}t|d}t| | W 5 Q R X t|d}t|| W 5 Q R X t||g|d}||kstW 5 Q R X W 5 Q R X d S )Nr   r   r    r   r#   r$   r%   ZDASK_WrP   r'   )r1   r!   r"   r&   r.   r/   r1   )ro   )r   r4   r.   r5   r   r   )r   r$   ro   r,   r6   r7   r8   r	   r   r   r   test_collect   s    rr   c                 C   s(   |  dd tg }|ddiks$td S )NZDASK_FOObarfoo)setenvr   r   )monkeypatchr	   r   r   r   test_collect_env_none   s    rw   c               	   C   sr   dddid} t d| ddks"tt d| ddks6tt dd	| dd	ksLttt t d| d W 5 Q R X d S )
Nr   r   r   r    r!   r	   zy.azy.brh   )r   r   rZ   r[   KeyErrorrl   r   r   r   test_get   s    r{   c           	   	   C   sj  dddid}ddi}t jt| d}t jt| d}t j|d}t|d}t|| W 5 Q R X t||d	d
 t|}t|}W 5 Q R X ||kst	t|d}t|| W 5 Q R X t||d	d
 t|}t|}W 5 Q R X ||kst	t 
| t||dd
 t|}| }W 5 Q R X d|ks>t	t|}t|}W 5 Q R X |rft	d S )Nr   r   r    r!   rh   source.yamldestr1   F)sourcedestinationcommentTrb   )r>   r@   rA   rQ   r4   r.   r5   r   	safe_loadr   removeread)	rR   r   r$   r~   r}   r   r8   resulttextr   r   r   test_ensure_file   s2    




r   c               
   C   s"  t jjddP td dks tt jjdd td dks@tW 5 Q R X td dksZtW 5 Q R X dtksptt jddi td dkstW 5 Q R X dtkstt jdddd" td ddd	did
kstW 5 Q R X dtksti } t jjddi| d | d d dkstd S )Nrh   )abcr   ri   r   r   r#   )abc.xabc.yzabc.z.ar   r(   r   rx   r!   daskr	   setr   rz   r   r   r   test_set  s    &r   c                	   C   s   t jjddd td dddks(tW 5 Q R X dtks>tt jjdddddd	 td dddd
ksptW 5 Q R X dtkstt jjddddiddd	 td dddd
kstW 5 Q R X dtkstd S )Nr   r   )foo__barZfoo__bazrt   )rs   baz)foo.barzfoo.bazr#   rP   )Z	foo__buzzr   )rs   r   Zbuzzr   r   r   r   r   test_set_kwargs!  s     ""r   c                
   C   s   t jdddii` td ddiks*tt jddi td dddksRtW 5 Q R X td ddiksptW 5 Q R X dtkstd S )Nr   r!   rh   r   ri   r    r   r   r   r   r   test_set_nested1  s     r   c               
   C   sD   dd l } tjj|  d  tjjdd W 5 Q R X W 5 Q R X d S )Nr   )r!   r   )r"   )	threadingr   r	   r   Lock)r   r   r   r   test_set_hard_to_copyables:  s    r   r?   TFc              	   C   s   dddid}t jt|d}t jt|d}t|d}t|| W 5 Q R X | rbt | t||d t j	|s~t
t jt j|dst
d S )Nr   r   r    r|   r}   r1   )r~   r   )r>   r@   rA   rQ   r4   r.   r5   r?   r   isdirr   exists)r?   rR   r   r~   r}   r8   r   r   r   test_ensure_file_directoryB  s    
r   c              	   C   s   dddid}t jt| d}t|d}t|| W 5 Q R X t jt| d}tjj	}z|tj_	t
|d W 5 |tj_	X t j|stt |\}t j|d t j|d kstd S )Nr   r   r    r|   r1   r   )r~   )r>   r@   rA   rQ   r4   r.   r5   r   r	   PATHr   r   r   listdirsplit)rR   r   r~   r8   r   r   fnr   r   r   2test_ensure_file_defaults_to_DASK_CONFIG_directoryU  s    
r   c                  C   s4   ddi} ddi}t | |d |dddiiks0td S )Nr   r   r   rh   rx   rt   rs   )r   r   )aliasesr	   r   r   r   test_renameh  s    r   c                  C   sz   g } i }t ddi|| d |ddiks*ttg ddi|| d |dddksPttg d	d
i|| d |dddksvtd S )Nr   r   )r	   defaultsZDASK_B2)r3   ro   r	   r   r   r'   rf   rj   r#   r   r   )r   r   r   )r   r	   r   r   r   test_refresho  s    r   zinp,out)1r   )r   r   )$FOOrt   r   r   rt   ))r   r   )r   rt   r   Ar   r'   c                 C   s    |  dd t||kstd S )Nrg   rt   )ru   r   r   )rv   inpoutr   r   r   !test_expand_environment_variables}  s    r   c                 C   sR   d}|  dt| i }tjj|d td|d|ks:ttd|d|ksNtd S )Nr#   re   rx   rk   a-b)ru   rQ   r   r	   r   r   r   )rv   r^   rl   r   r   r   test_env_var_canonical_name  s    r   c               	   C   s   dddii} dddg}|D ]}t jj|| ddkstqt jjdd	d
ii| d( |D ]}t jj|| dd
ksVtqVW 5 Q R X t jjdddiddi| d: t jjd| dddikstt jjd| ddkstW 5 Q R X d S )Nzx-yrk   rh   zx_y.a_bzx-y.a-bzx_y.a-brx   Zx_yr   ri   c_dr   r   )r   ze-fzx_y.e_f)r   r	   r   r   r   )r   keyskr   r   r   test_get_set_canonical_name  s    
$ r   key
custom_key
custom-keyc              	   C   sL   d}t j| |i. t jd|ks*tt jd|ks>tW 5 Q R X d S )Nrh   r   r   r   r	   r   r   r   )r   r^   r   r   r   test_get_set_roundtrip  s    r   c                   C   s2   t jd dddddiiddiddks.td S )Nr   r   r   r$   r   )r   r	   r   r   r   r   r   r   test_merge_None_to_dict  s    r   c                   C   s8   dt jjkstdt jjks tdt jdks4td S )Nztemporary-directoryZ	dataframezshuffle-compression)r   r	   r   r   r   r   r   r   test_core_file  s    r   c               	   C   s   t d} tjtjtdd}tjtjtdd}t|}t	|}W 5 Q R X t|}t	|}W 5 Q R X | 
|| d S )N
jsonschema..	dask.yamldask-schema.yaml)rZ   Zimportorskipr>   r@   rA   rB   __file__r4   r.   r   validate)r   	config_fn	schema_fnr8   r	   schemar   r   r   test_schema  s    


r   c               	      s   t jt jtdd} t jt jtdd}t| }t|}W 5 Q R X t|}t|}W 5 Q R X  fdd  || d S )Nr   r   r   c                    sf   |   D ]X\}}t| t|d kr@tdt| t|d t|tr | | |d |  qd S )NZ
propertiesa  
The dask.yaml and dask-schema.yaml files are not in sync.
This usually happens when we add a new configuration value,
but don't add the schema of that value to the dask-schema.yaml file
Please modify these files to include the missing values: 

    dask.yaml:        {}
    dask-schema.yaml: {}

Examples in these files should be a good start, 
even if you are not familiar with the jsonschema spec)itemslistr\   formatsorted
isinstancedict)r   sr   vtest_matchesr   r   r     s     

z-test_schema_is_complete.<locals>.test_matches)r>   r@   rA   rB   r   r4   r.   r   )r   r   r8   r	   r   r   r   r   test_schema_is_complete  s    

r   c               
   C   s^   t t4} tjjdd tjddks0tW 5 Q R X W 5 Q R X dt| d j	ksZtd S )Nrh   )Zfuse_ave_widthzoptimization.fuse.ave-widthr   )
rZ   ZwarnsWarningr   r	   r   r   r   rQ   message)infor   r   r   test_deprecations  s    (r   c                	   C   s   t jddi t jddks&tt jjdd ddks>tt jjddddksVtt jjddddksntt jjddddkstt jjddddkstt jjddd	iddd	ikstt jjdd
gdd
gkstW 5 Q R X d S )Nrt   rs   )Zoverride_withr   FTrh   rd   ZworldZoner   r   r   r   r   test_get_override_with  s     
r   c               	   C   sj   t jdt jdiH tddddiii} t| }t jt jj| t jddks\tW 5 Q R X d S )Narray.svg.sizearraysvgsize   )	r   r	   r   r   r   r
   r   Zglobal_configr   )Z
serializedr	   r   r   r   test_config_serialization  s
    r   c                  C   s8   t dtddddiiii} tjjd| ddks4td S )NZDASK_INTERNAL_INHERIT_CONFIGr   r   r   r   r   rx   )r   r   r   r	   r   r   rx   r   r   r   test_config_inheritance  s    r   c              	   C   s  | j ddd | j ddd | tdg  dtjtjddtjtjd	d
dg}t	 }||ksht
t|tt|kst
|  B}|dd t	 }||dg kst
t|tt|kst
W 5 Q R X |  N}|dd t	 }|dg|dd   kst
t|tt|ks"t
W 5 Q R X |  f}tjddd}|tdtj|g  t	 }tj|dd|ks|t
t|tt|kst
W 5 Q R X d S )NZDASK_CONFIGF)ZraisingZDASK_ROOT_CONFIGPREFIXESz	/etc/dasketcr   ~z.configr   r   includethisr@   )Zdelenvsetattrsiter>   r@   rA   sysprefix
expanduserr   r   lenr   contextru   r   )rv   r,   r3   mr   r   r   r   test__get_paths  s4    
"
$
r   c                   C   s   t jjt kstd S rD   )r   r	   r3   r   r   r   r   r   r   test_default_search_paths=  s    r   )Fr>   r   rE   r   collectionsr   
contextlibr   rZ   r.   Zdask.configr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   Z
dask.utilsr   r   r+   r-   r9   rC   rJ   markZskipifplatformZparametrizerT   r`   ra   rq   rr   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   <module>   s   H



 
)	

	
%