o
    :ήc*                     @   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y%   dZY nw zddlZW n ey7   dZY nw ddl	m
Z
mZmZmZmZmZmZmZ ddlmZmZmZmZmZmZ e Ze Ze Zejjedu dd	ejd
ed egdd Zejjedu dd	dd Z dd Z!dd Z"dd Z#ejjdedfedfgddgddd Z$ejjd
eegddgddd  Z%ejj&d!d" Z'ejj&ejjedu d#d	d$d% Z(ejj&ejjedu d#d	d&d' Z)ejjedud(d	d)d* Z*ejjedud+d	ejd,e
eegd-d. Z+ejj&ejjedu dd	ejjd/ee
feefgd0dgdd1d2 Z,ejj&ejjedu dd	d3d4 Z-ejj&ejjedu dd	ejjedu dd	d5d6 Z.ejj&d7d8 Z/dS )9zK
Test the downloader classes and functions separately from the Pooch core.
    N)TemporaryDirectory   )HTTPDownloaderFTPDownloaderSFTPDownloaderDOIDownloaderchoose_downloaderfigshare_download_urlzenodo_download_url
doi_to_url   )pooch_test_urlcheck_large_datacheck_tiny_datadata_over_ftppooch_test_figshare_urlpooch_test_zenodo_urlzrequires tqdm)reasonurltiny-data.txtc                 C   s   t | dd}|jdu sJ dS )DThe progressbar keyword argument must pass through choose_downloaderTprogressbarNr   r   r   
downloader r   C/tmp/pip-target-vg8gfxp4/lib/python/pooch/tests/test_downloaders.pytest_progressbar_kwarg_passed3   s   
r   zrequires paramikoc                  C   s"   d} t | dd}|jdu sJ dS )r   /sftp://test.rebex.net/pub/example/pocketftp.pngTr   Nr   r   r   r   r   "test_progressbar_kwarg_passed_sftpA   s   r    c                   C   sj   t t td W d   n1 sw   Y  t t td W d   dS 1 s.w   Y  dS )z6Should raise ValueError when protocol is not supportedzhttpup://some-invalid-url.comNzdoii:XXX/XXX/file)pytestraises
ValueErrorr   r   r   r   r   test_unsupported_protocolI   s   

"r$   c                  C   sP   t t} t dddd W d   n1 sw   Y  dt| jv s&J dS )z/Should fail if data repository is not supportedz%doi:10.21105/joss.01943/file_name.txtN)r   output_filepoochz(Invalid data repository 'joss.theoj.org')r!   r"   r#   r   strvalueexcr   r   r   test_invalid_doi_repositoryR   s   r+   c                  C   sJ   t t} tdd W d   n1 sw   Y  dt| jv s#J dS )z#Should fail if the DOI is not foundNOTAREALDOI)doiNzIs the DOI correct?r!   r"   r#   r   r'   r(   r)   r   r   r   test_doi_url_not_found\   s   r/   zconverter,doiz10.6084/m9.figshare.14763051.v1z10.5281/zenodo.4924875figsharezenodo)idsc                 C   sV   t t}t|}| |d|d W d   n1 sw   Y  dt|jv s)J dS )z3Should fail if the file is not found in the archivezbla.txt)archive_url	file_namer-   NzFile 'bla.txt' not foundr.   )	converterr-   r*   r   r   r   r    test_figshare_url_file_not_foundc   s
   
r6   c                 C   sX   t  }t }tj|d}|| d |d t| W d   dS 1 s%w   Y  dS )zTest the DOI downloaderr   N)r   r   ospathjoinr   )r   local_storer   outfiler   r   r   test_doi_downloaders   s   
"r<   c              	   C   s   t | d;}t }t| jd}tj|d}|||d t| W d   n1 s+w   Y  W d   dS W d   dS 1 sCw   Y  dS )zTest ftp downloaderr   )portN)r   r   r   server_portr7   r8   r9   r   )	ftpserverr   r:   r   r;   r   r   r   test_ftp_downloader~   s   
"r@   zrequires paramiko to run SFTPc                  C   sf   t  &} tddd}d}tj| d}|||d tj|s!J W d   dS 1 s,w   Y  dS )zTest sftp downloaderdemopasswordusernamerB   r   pocketftp.pngN)r   r   r7   r8   r9   exists)r:   r   r   r;   r   r   r   test_sftp_downloader   s   "rG   c               
   C   s   t  P} tddd}d}tj| d}t|d#}tt |||d W d   n1 s/w   Y  W d   n1 s>w   Y  W d   dS W d   dS 1 sVw   Y  dS )zFDownloader should fail when a file object rather than string is passedrA   rB   rC   r   rE   wbN)	r   r   r7   r8   r9   openr!   r"   	TypeError)r:   r   r   r;   outfile_objr   r   r   (test_sftp_downloader_fail_if_file_object   s   "rL   zparamiko must be missingc                  C   sF   t t} t  W d   n1 sw   Y  dt| jv s!J dS )z+test must fail if paramiko is not installedNz
'paramiko')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   sJ   t t}| dd W d   n1 sw   Y  dt|jv s#J dS )zFMake sure an error is raised if trying to use progressbar without tqdmTr   Nz'tqdm')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  J}d}| | } tj||}|| |d | }|jdd  }t|dks2J t	j
dkr:d	}	nd
}	|dd |	ksFJ t| W d   dS 1 sUw   Y  dS )z@Setup a downloader function that prints a progress bar for fetchTr   r   NO   win32100%|####################A   100%|████████████████████   )r   r7   r8   r9   
readouterrerrsplitstriplensysplatformr   )
r   r   capsysdownloadr:   fnamer;   capturedprintedprogressr   r   r   test_downloader_progressbar   s   
	

"rd   c           	   	   C   s   t |df}td|jd}t C}tj|d}|||d |  }|j	dd 
 }t|dks4J tjdkr<d	}nd
}|dd |ksHJ t| W d   n1 sVw   Y  W d   dS W d   dS 1 snw   Y  dS )zESetup an FTP downloader function that prints a progress bar for fetchr   T)r   r=   NrP   rQ   rR   rS   rT   rU   rV   )r   r   r>   r   r7   r8   r9   rW   rX   rY   rZ   r[   r\   r]   r   )	r^   r?   r   r_   r:   r;   ra   rb   rc   r   r   r   test_downloader_progressbar_ftp   s"   

"re   c                 C   s   t dddd}t J}d}tj|d}|||d |  }|jdd	  }t	|d
ks0J t
jdkr8d}nd}|dd |ksDJ tj|sLJ W d   dS 1 sWw   Y  dS )zFSetup an SFTP downloader function that prints a progress bar for fetchTrA   rB   )r   rD   rB   r   rE   NrP   rQ   rR   rS   rT   rU   rV   )r   r   r7   r8   r9   rW   rX   rY   rZ   r[   r\   r]   rF   )r^   r   r:   r   r;   ra   rb   rc   r   r   r    test_downloader_progressbar_sftp   s   
"rf   c                 C   s   G dd d}|dd}t |d}t 6}d}t| }tj|d}|||d |  }|jdd 	 }	d	}
|	|
ks>J t
| W d   dS 1 sMw   Y  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)selfrh   r   r   r   __init__  s   
zNtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.__init__c                 S   s   t | jd t | j S )zrepresent current completion/)r'   rg   rh   ri   r   r   r   __repr__  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\   stderrrl   r   r   r   render  s   zLtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.renderc                 S   s   || _ |   dS )zmodify completion and renderN)rg   rt   )ri   ir   r   r   update  s   zLtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.updatec                 S   s
   d| _ dS )zset counter to 0r   N)rg   rl   r   r   r   reset  s   
zKtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.resetc                   S   s   t dtjd dS )zprint a new empty linern   )ro   Nrq   r   r   r   r   close  s   zKtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.closeN)__name__
__module____qualname____doc__rj   rm   rt   rv   rw   staticmethodrx   r   r   r   r   MinimalProgressDisplay  s    r~   N)rh   r   zlarge-data.txtrP   rQ   z336/336)r   r   BASEURLr7   r8   r9   rW   rX   rY   rZ   r   )r^   r~   pbarr_   r:   r`   r   r;   ra   rb   rc   r   r   r   %test_downloader_arbitrary_progressbar  s   


"r   )0r|   r7   r\   tempfiler   r!   tqdmImportErrorparamikodownloadersr   r   r   r   r   r	   r
   r   utilsr   r   r   r   r   r   r   FIGSHAREURL	ZENODOURLmarkskipifparametrizer   r    r$   r+   r/   r6   r<   networkr@   rG   rL   rM   rN   rd   re   rf   r   r   r   r   r   <module>   s   ( 


	




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