U
    `»{j4  ã                
   @   s$  d Z ddlZddlZddlZddlmZ ddlZddlmZ ddlm	Z	m
Z
 ddlZddlmZmZmZmZ dd	„ Zejjd
e	e
gddgd�dd„ ƒZdd„ Zdd„ Zejjddddddœfdddddœfdddddœfd dd!d"dœfgdddd#gd�d$d%„ ƒZd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ ZdS ).z
Test the utility functions.
é    N)ÚPath)ÚTemporaryDirectory)ÚThreadPoolExecutorÚProcessPoolExecutoré   )Ú	parse_urlÚmake_local_storageÚtemporary_fileÚunique_file_namec                  C   sj   dd› d�} t | ƒdkst‚t| ƒ}t |ƒdks4t‚|dd… dksHt‚| d¡d	 dd
… dksft‚dS )z8The file name should never be longer than 255 characterszhttps://www.something.com/dataAô  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaz.txtéÿ   iöÿÿÿNz
aaaaaa.txtú-é   é
   Z
aaaaaaaaaa)ÚlenÚAssertionErrorr
   Úsplit)ÚurlÚfname© r   úU/var/www/html/bwave/python/venv/lib/python3.8/site-packages/pooch/tests/test_utils.pyÚtest_unique_name_long   s    r   ÚpoolÚthreadsZ	processes)Zidsc              	      s°   t j‰d
‡fdd„	}| t d|¡ t j t jd¡‰ t j ˆ ¡rBt‚zP| ƒ �@‰‡ ‡fdd„t
dƒD ƒ}|D ]}| ¡  qht j ˆ ¡s†t‚W 5 Q R X W 5 t j ˆ ¡rªt 	ˆ ¡ X d	S )z*Try to create the cache folder in parallelFc                    s   t  d¡ ˆ | |d� dS )zDelay before calling makedirsg      ø?)Úexist_okN)ÚtimeÚsleep©Úpathr   )Úmakedirsr   r   Úmockmakedirs9   s    
z6test_make_local_storage_parallel.<locals>.mockmakedirsr   Ztest_parallel_cachec                    s   g | ]}ˆ  tˆ ¡‘qS r   )Zsubmitr   )Ú.0Úi)Ú
data_cacheÚexecutorr   r   Ú
<listcomp>E   s    z4test_make_local_storage_parallel.<locals>.<listcomp>é   N)F)Úosr   Úsetattrr   ÚjoinÚcurdirÚexistsr   ÚshutilÚrmtreeÚrangeÚresult)r   Úmonkeypatchr   ZfuturesÚfuturer   )r"   r#   r   r   Ú test_make_local_storage_parallel&   s    ÿ
r1   c              	   C   s~   ddd„}t j t jd¡}t j |¡r*t‚|  t d|¡ t t	¡�2}t
|dd� dt|ƒks`t‚d	t|ƒkspt‚W 5 Q R X d
S )z9Should warn the user when can't create the local data dirFc                 S   s   t dƒ‚dS ©z-Raise an exception to mimic permission issuesz
Fake errorN©ÚPermissionErrorr   r   r   r   r   S   s    zAtest_local_storage_makedirs_permissionerror.<locals>.mockmakedirsZtest_permissionr   ÚSOME_VARIABLE©r   Úenvz!Pooch could not create data cacheú'SOME_VARIABLE'N)F)r&   r   r(   r)   r*   r   r'   ÚpytestÚraisesr4   r   Ústr)r/   r   r"   Úerrorr   r   r   Ú+test_local_storage_makedirs_permissionerrorP   s    
þr=   c              
   C   s’   dd„ }t ƒ �z}t tj |d¡¡ tj |¡s4t‚|  td|¡ t	 
t¡�2}t|dd� dt|ƒksjt‚dt|ƒkszt‚W 5 Q R X W 5 Q R X d	S )
z;Should warn the user when can't write to the local data dirc                  [   s   t dƒ‚dS r2   r3   )Úkwargsr   r   r   Úmocktempfilej   s    z@test_local_storage_newfile_permissionerror.<locals>.mocktempfilez1.0ÚNamedTemporaryFiler5   r6   z#Pooch could not write to data cacher8   N)r   r&   r   r   r(   r*   r   r'   Útempfiler9   r:   r4   r   r;   )r/   r?   r"   r<   r   r   r   Ú*test_local_storage_newfile_permissionerrore   s    þrB   z
url,outputzhttp://127.0.0.1:8080/test.ncÚhttpz127.0.0.1:8080z/test.nc)ÚprotocolÚnetlocr   zftp://127.0.0.1:8080/test.ncÚftpz+doi:10.6084/m9.figshare.923450.v1/dike.jsonZdoiz10.6084/m9.figshare.923450.v1z
/dike.jsonz<doi:10.5281/zenodo.7632643/santisoler/pooch-test-data-v1.zipz10.5281/zenodo.7632643z"/santisoler/pooch-test-data-v1.zipzzenodo-doi-with-slashc                 C   s   t | ƒ|kst‚dS )zParse URL into 3 componentsN)r   r   )r   Úoutputr   r   r   Útest_parse_url}   s     rH   c                	   C   s"   t  t¡� tdƒ W 5 Q R X dS )z:Should fail if we forget to not include // in the DOI linkzdoi://XXX/XXX/fname.txtN)r9   r:   Ú
ValueErrorr   r   r   r   r   Útest_parse_url_invalid_doi    s    rJ   c               
   C   s†   t ƒ �f} t| ƒ ¡ st‚t| ddd��}| d¡ W 5 Q R X t| dd��}| ¡  ¡ dks^t‚W 5 Q R X W 5 Q R X t| ƒ ¡ r‚t‚dS )z8Make sure the file is writable and cleaned up in the endÚwúutf-8©ÚencodingÚMehN)r	   r   r*   r   ÚopenÚwriteÚreadÚstrip)ÚtmpÚoutfileÚinfiler   r   r   Útest_temporary_file¦   s    (rW   c                  C   s¦   t ƒ �–} t| ƒ�r}t|ƒ ¡ s"t‚| |ks.t‚t|ddd��}| d¡ W 5 Q R X t|dd��}| ¡  ¡ dkstt‚W 5 Q R X W 5 Q R X t|ƒ ¡ r˜t‚W 5 Q R X dS )zIMake sure the file is writable and cleaned up in the end when given a dirrK   rL   rM   rO   N)	r   r	   r   r*   r   rP   rQ   rR   rS   )r   rT   rU   rV   r   r   r   Útest_temporary_file_path±   s    
(rX   c               	   C   sX   z.t ƒ �} t| ƒ ¡ st‚tdƒ‚W 5 Q R X W n$ tk
rR   t| ƒ ¡ rNt‚Y nX dS )zHMake sure the file is writable and cleaned up when there is an exceptionzNooooooooo!N)r	   r   r*   r   rI   )rT   r   r   r   Útest_temporary_file_exception¾   s    rY   )Ú__doc__r&   r+   r   Úpathlibr   rA   r   Úconcurrent.futuresr   r   r9   Úutilsr   r   r	   r
   r   ÚmarkZparametrizer1   r=   rB   rH   rJ   rW   rX   rY   r   r   r   r   Ú<module>   s\   
ý
%
þ
þýþ	ýþï
ä
