U
    `»{j�J  ã                   @   s†  d Z ddlZddlZddlmZ ddlZzddlZW n ek
rL   dZY nX zddlZW n ek
rr   dZY nX 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mZmZmZmZmZmZmZ eƒ Z eƒ Z!eƒ Z"eƒ Z#eƒ Z$ej%j&edkd
d�ej% 'de d e!g¡dd„ ƒƒZ(ej%j&edkdd�dd„ ƒZ)dd„ Z*ej%j+dd„ ƒZ,ej%j+dd„ ƒZ-ej%j+ej%j'dedfedfedfgdddgd �d!d"„ ƒƒZ.ej%j+ej%j'de!e"e$gdddgd �d#d$„ ƒƒZ/ej%j+d%d&„ ƒZ0ej%j+d'd(„ ƒZ1ej%j+ej% 'd)d*d+g¡d,d-„ ƒƒZ2ej%j+d.d/„ ƒZ3ej%j+ej%j&edkd0d�d1d2„ ƒƒZ4ej%j+ej%j&edkd0d�d3d4„ ƒƒZ5ej%j&edk	d5d�d6d7„ ƒZ6ej%j&edk	d8d�ej% 'd9eeeg¡d:d;„ ƒƒZ7ej%j+ej%j&edkd
d�ej%j'd<e efe!efgd=dgd �d>d?„ ƒƒƒZ8ej%j+ej%j&edkd
d�d@dA„ ƒƒZ9ej%j+ej%j&edkd
d�ej%j&edkdd�dBdC„ ƒƒƒZ:ej%j+dDdE„ ƒZ;G dFdG„ dGƒZ<dS )HzK
Test the downloader classes and functions separately from the Pooch core.
é    N)ÚTemporaryDirectoryé   )ÚPooch)	ÚHTTPDownloaderÚFTPDownloaderÚSFTPDownloaderÚDOIDownloaderÚchoose_downloaderÚFigshareRepositoryÚZenodoRepositoryÚDataverseRepositoryÚ
doi_to_url)ÚUnzipé   )Úpooch_test_urlÚcheck_large_dataÚcheck_tiny_dataÚdata_over_ftpÚpooch_test_figshare_urlÚpooch_test_zenodo_urlÚ pooch_test_zenodo_with_slash_urlÚpooch_test_dataverse_urlzrequires tqdm)ÚreasonÚurlútiny-data.txtc                 C   s   t | dd�}|jdkst‚dS )úDThe progressbar keyword argument must pass through choose_downloaderT©ÚprogressbarN©r	   r   ÚAssertionError©r   Ú
downloader© r"   ú[/var/www/html/bwave/python/venv/lib/python3.8/site-packages/pooch/tests/test_downloaders.pyÚtest_progressbar_kwarg_passed:   s    
r$   zrequires paramikoc                  C   s"   d} t | dd�}|jdkst‚dS )r   ú/sftp://test.rebex.net/pub/example/pocketftp.pngTr   Nr   r    r"   r"   r#   Ú"test_progressbar_kwarg_passed_sftpH   s    r&   c                	   C   s@   t  t¡� tdƒ W 5 Q R X t  t¡� tdƒ W 5 Q R X dS )z6Should raise ValueError when protocol is not supportedzhttpup://some-invalid-url.comzdoii:XXX/XXX/fileN)ÚpytestÚraisesÚ
ValueErrorr	   r"   r"   r"   r#   Útest_unsupported_protocolP   s    r*   c               	   C   s<   t  t¡�} tƒ dddd� W 5 Q R X dt| jƒks8t‚dS )z/Should fail if data repository is not supportedz%doi:10.21105/joss.01943/file_name.txtN)r   Zoutput_fileÚpoochz(Invalid data repository 'joss.theoj.org')r'   r(   r)   r   ÚstrÚvaluer   ©Úexcr"   r"   r#   Útest_invalid_doi_repositoryY   s      ÿr0   c               	   C   s6   t  t¡�} tdd� W 5 Q R X dt| jƒks2t‚dS )z#Should fail if the DOI is not foundZNOTAREALDOI)ÚdoizIs the DOI correct?N)r'   r(   r)   r   r,   r-   r   r.   r"   r"   r#   Útest_doi_url_not_foundd   s    r2   zrepository,doiz10.6084/m9.figshare.14763051.v1z10.5281/zenodo.4924875z10.11588/data/TKCFEFÚfigshareZzenodoZ	dataverse)Zidsc              	   C   sL   t  t¡�&}t|ƒ}|  ||¡}|jdd� W 5 Q R X dt|jƒksHt‚dS )z3Should fail if the file is not found in the archivezbla.txt©Ú	file_namezFile 'bla.txt' not foundN)	r'   r(   r)   r   Z
initializeÚdownload_urlr,   r-   r   )Ú
repositoryr1   r/   r   Úrepor"   r"   r#   Ú test_figshare_url_file_not_foundl   s
    r9   c              	   C   sB   t ƒ �2}tƒ }tj |d¡}|| d |dƒ t|ƒ W 5 Q R X dS )zTest the DOI downloaderr   N)r   r   ÚosÚpathÚjoinr   )r   Úlocal_storer!   Úoutfiler"   r"   r#   Útest_doi_downloader   s
    	r?   c               	   C   sf   t ƒ �V} td }tƒ }tj | d¡}|||dƒ tƒ |ddd�}dd„ |D ƒ\}t|ƒ W 5 Q R X dS )zf
    Test the Zenodo downloader when the path contains a forward slash

    Related to issue #336
    z!santisoler/pooch-test-data-v1.zipztest-data.zipNÚdownload)Úactionr+   c                 S   s   g | ]}d |kr|‘qS )r   r"   )Ú.0Úfr"   r"   r#   Ú
<listcomp>Ÿ   s      z>test_zenodo_downloader_with_slash_in_fname.<locals>.<listcomp>)r   ÚZENODOURL_W_SLASHr   r:   r;   r<   r   r   )r=   Úbase_urlr!   r>   ÚfnamesÚfnamer"   r"   r#   Ú*test_zenodo_downloader_with_slash_in_fname�   s    rI   c               
   C   s†   t } | d|  d¡… d } | dd… }d|› d�}tƒ �D}tƒ }tj |d¡}tjt	|d	�� || d |dƒ W 5 Q R X W 5 Q R X dS )
zf
    Test if passing a Figshare url without a version warns about it, but still
    downloads it.
    NÚ.ú/é   éÿÿÿÿzThe Figshare DOI 'z#' doesn't specify which version of r   ©Úmatch)
ÚFIGSHAREURLÚrindexr   r   r:   r;   r<   r'   ZwarnsÚUserWarning)r   r1   Zwarning_msgr=   r!   r>   r"   r"   r#   Ú!test_figshare_unspecified_version£   s    rS   zversion, missing, present)r   ú7LC08_L2SP_218074_20190114_20200829_02_T1-cropped.tar.gzúcropped-before.tar.gz)r   rU   rT   c                 C   sL   d| › �}d|› d�}t ||ƒ}dd„ |jD ƒ}||ks<t‚||ksHt‚dS )zG
    Test if setting the version in Figshare DOI works as expected
    z10.6084/m9.figshare.21665630.vúhttps://doi.org/rK   c                 S   s   g | ]}|d  ‘qS )Únamer"   )rB   Úitemr"   r"   r#   rD   Ï   s     z:test_figshare_data_repository_versions.<locals>.<listcomp>N)r
   Úapi_responser   )ÚversionÚmissingZpresentr1   r   r3   Ú	filenamesr"   r"   r#   Ú&test_figshare_data_repository_versions¶   s    

r]   c              
   C   sZ   t | dƒ�F}tƒ �4}t| jd�}tj |d¡}|||dƒ t|ƒ W 5 Q R X W 5 Q R X dS )zTest ftp downloaderr   )ÚportN)r   r   r   Úserver_portr:   r;   r<   r   )Ú	ftpserverr   r=   r!   r>   r"   r"   r#   Útest_ftp_downloaderÔ   s    ra   zrequires paramiko to run SFTPc               	   C   sP   t ƒ �@} tddd�}d}tj | d¡}|||dƒ tj |¡sBt‚W 5 Q R X dS )zTest sftp downloaderÚdemoÚpassword©Úusernamerc   r%   úpocketftp.pngN)r   r   r:   r;   r<   Úexistsr   )r=   r!   r   r>   r"   r"   r#   Útest_sftp_downloaderß   s    rh   c                  C   sl   t ƒ �\} tddd�}d}tj | d¡}t|dƒ�(}t t¡� |||dƒ W 5 Q R X W 5 Q R X W 5 Q R X dS )zFDownloader should fail when a file object rather than string is passedrb   rc   rd   r%   rf   ÚwbN)	r   r   r:   r;   r<   Úopenr'   r(   Ú	TypeError)r=   r!   r   r>   Zoutfile_objr"   r"   r#   Ú(test_sftp_downloader_fail_if_file_objectë   s    rl   zparamiko must be missingc               	   C   s2   t  t¡�} tƒ  W 5 Q R X dt| jƒks.t‚dS )z+test must fail if paramiko is not installedz
'paramiko'N)r'   r(   r)   r   r,   r-   r   r.   r"   r"   r#   Ú-test_sftp_downloader_fail_if_paramiko_missingø   s    rm   ztqdm must be missingr!   c              	   C   s6   t  t¡�}| dd� W 5 Q R X dt|jƒks2t‚dS )zFMake sure an error is raised if trying to use progressbar without tqdmTr   z'tqdm'N)r'   r(   r)   r,   r-   r   )r!   r/   r"   r"   r#   Ú!test_downloader_progressbar_fails   s    rn   zurl,downloaderÚhttpc           
   	   C   s¢   |dd�}t ƒ �ˆ}d}| | } tj ||¡}|| |dƒ | ¡ }|j d¡d  ¡ }t|ƒdksdt	‚t
jdkrtd	}	nd
}	|dd… |	ksŒt	‚t|ƒ W 5 Q R X dS )z@Setup a downloader function that prints a progress bar for fetchTr   r   NúrM   éO   Úwin32ú100%|####################õA   100%|â–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆâ–ˆé   )r   r:   r;   r<   Ú
readouterrÚerrÚsplitÚstripÚlenr   ÚsysÚplatformr   )
r   r!   Úcapsysr@   r=   rH   r>   ÚcapturedÚprintedÚprogressr"   r"   r#   Útest_downloader_progressbar	  s    	

r�   c           	   
   C   s°   t |dƒ�œ}td|jd�}tƒ �|}tj |d¡}|||dƒ |  ¡ }|j 	d¡d  
¡ }t|ƒdksht‚tjdkrxd	}nd
}|dd… |ks�t‚t|ƒ W 5 Q R X W 5 Q R X dS )zESetup an FTP downloader function that prints a progress bar for fetchr   T)r   r^   Nrp   rM   rq   rr   rs   rt   ru   )r   r   r_   r   r:   r;   r<   rv   rw   rx   ry   rz   r   r{   r|   r   )	r}   r`   r   r@   r=   r>   r~   r   r€   r"   r"   r#   Útest_downloader_progressbar_ftp&  s    
r‚   c              	   C   s¦   t dddd�}tƒ �ˆ}d}tj |d¡}|||dƒ |  ¡ }|j d¡d	  ¡ }t	|ƒd
ks`t
‚tjdkrpd}nd}|dd… |ksˆt
‚tj |¡s˜t
‚W 5 Q R X dS )zFSetup an SFTP downloader function that prints a progress bar for fetchTrb   rc   )r   re   rc   r%   rf   Nrp   rM   rq   rr   rs   rt   ru   )r   r   r:   r;   r<   rv   rw   rx   ry   rz   r   r{   r|   rg   )r}   r!   r=   r   r>   r~   r   r€   r"   r"   r#   Ú test_downloader_progressbar_sftp?  s    
rƒ   c              	   C   s’   G dd„ dƒ}|dd�}t |d�}tƒ �`}d}t| }tj |d¡}|||dƒ |  ¡ }|j d¡d  	¡ }	d	}
|	|
ks|t
‚t|ƒ W 5 Q R X dS )
zASetup a downloader function with an arbitrary progress bar class.c                   @   sD   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Ze	dd„ ƒZ
dS )zEtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplayz&A minimalist replacement for tqdm.tqdmc                 S   s   d| _ || _d S )Nr   )ÚcountÚtotal)Úselfr…   r"   r"   r#   Ú__init__^  s    zNtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.__init__c                 S   s   t | jƒd t | jƒ S )zrepresent current completionrK   )r,   r„   r…   ©r†   r"   r"   r#   Ú__repr__b  s    zNtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.__repr__c                 S   s   t d| › �tjdd� dS )zprint self.__repr__ to stderrrp   Ú )ÚfileÚendN©Úprintr{   Ústderrrˆ   r"   r"   r#   Úrenderf  s    zLtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.renderc                 S   s   || _ |  ¡  dS )zmodify completion and renderN)r„   r�   )r†   Úir"   r"   r#   Úupdatej  s    zLtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.updatec                 S   s
   d| _ dS )zset counter to 0r   N)r„   rˆ   r"   r"   r#   Úreseto  s    zKtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.resetc                   S   s   t dtjd� dS )zprint a new empty linerŠ   )r‹   Nr�   r"   r"   r"   r#   Úcloses  s    zKtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.closeN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r‡   r‰   r�   r’   r“   Ústaticmethodr”   r"   r"   r"   r#   ÚMinimalProgressDisplay[  s   rš   N)r…   r   zlarge-data.txtrp   rM   z336/336)r   r   ÚBASEURLr:   r;   r<   rv   rw   rx   ry   r   r   )r}   rš   Zpbarr@   r=   rH   r   r>   r~   r   r€   r"   r"   r#   Ú%test_downloader_arbitrary_progressbarW  s    

rœ   c                   @   s  e Zd ZdZdZde› �Zde› �ZdZdZdZ	ddeeed	ed
e	› �deidœgdœZ
ddeeed	ee	deidœgdœZddeeed	ee	deidœd	ed
e	› �deidœgdœZej dde
fdefdefg¡dd„ ƒZej dde
fdefg¡dd„ ƒZej de
eg¡dd„ ƒZdS )ÚTestZenodoAPISupportz0
    Test support for different Zenodo APIs
    i@â z10.0001/zenodo.rV   zmy-file.zipzMhttps://zenodo.org/api/files/513d7033-93a2-4eeb-821c-2fb0bbab0012/my-file.zipZ 2942bfabb3d05332b66eb128e0842cffz 2021-20-19T08:00:00.000000+00:00z$513d7033-93a2-4eeb-821c-2fb0bbab0012úmd5:r†   )ÚidÚkeyÚchecksumÚlinks)ÚcreatedÚmodifiedrŸ   r1   Údoi_urlÚfiles)rŸ   Úfilenamer¡   r¢   zapi_version, api_responseÚlegacyÚnewÚinvalidc              	   C   st   |  d| j› �¡ |¡ t| j| jd�}| d¡|_|dkrL|j|kspt	‚n$d}t
jt|d�� |j}W 5 Q R X dS )z@
        Test if the API version is correctly detected.
        ú/zenodo.©r1   Zarchive_urlrŠ   rª   z0Couldn't determine the version of the Zenodo APIrN   N)Úexpect_requestÚ
article_idÚrespond_with_jsonr   r1   r¥   Úurl_forÚbase_api_urlÚapi_versionr   r'   r(   r)   )r†   Ú
httpserverr²   rY   r!   Úmsgr"   r"   r#   Útest_api_versionÖ  s    ÿz%TestZenodoAPISupport.test_api_versionc                 C   s€   |  d| j› �¡ |¡ t| j| jd�}| d¡|_|j| j	d�}|dkrZ|| j
ks|t‚n"d| j› d| j	› d�}||ks|t‚d	S )
zK
        Test if the download url is correct for each API version.
        r«   r¬   rŠ   r4   r¨   zhttps://zenodo.org/records/z/files/z?download=1N)r­   r®   r¯   r   r1   r¥   r°   r±   r6   r5   Úfile_urlr   )r†   r³   r²   rY   r!   r6   Zexpected_urlr"   r"   r#   Útest_download_urlò  s    	ÿÿz&TestZenodoAPISupport.test_download_urlrY   c                 C   sj   |  d| j› �¡ |¡ td|d�}t| j| jd�}| d¡|_| 	|¡ |j
| jd| j› �iksft‚dS )zX
        Test if population of registry is correctly done for each API version.
        r«   rŠ   )rF   r;   r¬   rž   N)r­   r®   r¯   r   r   r1   r¥   r°   r±   Zpopulate_registryÚregistryr5   Úfile_checksumr   )r†   r³   Ztmp_pathrY   Zpuppyr!   r"   r"   r#   Útest_populate_registry  s    	ÿ
z+TestZenodoAPISupport.test_populate_registryN)r•   r–   r—   r˜   r®   r1   r¥   r5   r¶   r¹   Zlegacy_api_responseZnew_api_responseZinvalid_api_responser'   ÚmarkÚparametrizerµ   r·   rº   r"   r"   r"   r#   r�   Š  s–   

ÿ ÿüÿú ÿüÿú ÿü	 ÿü÷úýþ
þ
þr�   )=r˜   r:   r{   Útempfiler   r'   ZtqdmÚImportErrorZparamikorŠ   r   Zdownloadersr   r   r   r   r	   r
   r   r   r   Z
processorsr   Úutilsr   r   r   r   r   r   r   r   r›   rP   Z	ZENODOURLrE   ZDATAVERSEURLr»   Zskipifr¼   r$   r&   r*   Únetworkr0   r2   r9   r?   rI   rS   r]   ra   rh   rl   rm   rn   r�   r‚   rƒ   rœ   r�   r"   r"   r"   r#   Ú<module>   sÀ   

,(þþ
	


ýù		ý


úþ



ý
2