
    xKgJ                        d Z ddlZddlZddlmZ ddlZ	 ddlZ	 ddl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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jJ                  jM                  edu d
      ejJ                  jO                  de dz   e!g      d               Z(ejJ                  jM                  edu d      d        Z)d Z*ejJ                  jV                  d        Z,ejJ                  jV                  d        Z-ejJ                  jV                  ejJ                  jO                  dedfedfedfgg d      d               Z.ejJ                  jV                  ejJ                  jO                  de!e"e$gg d      d               Z/ejJ                  jV                  d        Z0ejJ                  jV                  d        Z1ejJ                  jV                  ejJ                  jO                  ddd g      d!               Z2ejJ                  jV                  d"        Z3ejJ                  jV                  ejJ                  jM                  edu d#      d$               Z4ejJ                  jV                  ejJ                  jM                  edu d#      d%               Z5ejJ                  jM                  edud&      d'        Z6ejJ                  jM                  edud(      ejJ                  jO                  d)eeeg      d*               Z7ejJ                  jV                  ejJ                  jM                  edu d
      ejJ                  jO                  d+e efe!efgd,d-g      d.                      Z8ejJ                  jV                  ejJ                  jM                  edu d
      d/               Z9ejJ                  jV                  ejJ                  jM                  edu d
      ejJ                  jM                  edu d      d0                      Z:ejJ                  jV                  d1        Z; G d2 d3      Z<y# e$ r dZY @w xY w# e$ r dZY Iw xY w)4zK
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                 >    t        | d      }|j                  du sJ y)DThe progressbar keyword argument must pass through choose_downloaderTprogressbarNr
   r   r   
downloaders     `/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/pooch/tests/test_downloaders.pytest_progressbar_kwarg_passedr$   :   s$     #3D9J!!T)))    zrequires paramikoc                  B    d} t        | d      }|j                  du sJ y)r   /sftp://test.rebex.net/pub/example/pocketftp.pngTr   Nr    r!   s     r#   "test_progressbar_kwarg_passed_sftpr(   H   s)     <C"3D9J!!T)))r%   c                      t        j                  t              5  t        d       ddd       t        j                  t              5  t        d       ddd       y# 1 sw Y   7xY w# 1 sw Y   yxY w)z6Should raise ValueError when protocol is not supportedzhttpup://some-invalid-url.comNzdoii:XXX/XXX/file)pytestraises
ValueErrorr
    r%   r#   test_unsupported_protocolr.   P   sM    	z	"9: 
# 
z	"-. 
#	" 
#	" 
#	"s   AA(A%(A1c                      t        j                  t              5 }  t               ddd       ddd       dt	         j
                        v sJ y# 1 sw Y   #xY w)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excs    r#   test_invalid_doi_repositoryr6   Y   sL     
z	"c7TQU	
 
#
 6SYYGGG 
#	"s   AAc                      t        j                  t              5 } t        d       ddd       dt	         j
                        v sJ y# 1 sw Y   #xY w)z#Should fail if the DOI is not foundNOTAREALDOI)doiNzIs the DOI correct?)r*   r+   r,   r   r2   r3   r4   s    r#   test_doi_url_not_foundr:   d   s>     
z	"c}% 
# C		N222 
#	"s   A		Azrepository,doiz10.6084/m9.figshare.14763051.v1z10.5281/zenodo.4924875z10.11588/data/TKCFEF)figsharezenodo	dataverse)idsc                     t        j                  t              5 }t        |      }| j	                  ||      }|j                  d       ddd       dt        j                        v sJ y# 1 sw Y   #xY w)z3Should fail if the file is not found in the archivezbla.txt	file_nameNzFile 'bla.txt' not found)r*   r+   r,   r   
initializedownload_urlr2   r3   )
repositoryr9   r5   r   repos        r#    test_figshare_url_file_not_foundrF   l   sd     
z	"co$$S#.I. 
# &SYY777	 
#	"s   0A,,A5c                     t               5 }t               }t        j                  j	                  |d      } || dz   |d       t        |       ddd       y# 1 sw Y   yxY w)zTest the DOI downloaderr   N)r   r	   ospathjoinr   )r   local_storer"   outfiles       r#   test_doi_downloaderrM      sL     
	"_
'',,{O<3('48 	 
		s   AAA c                  0   t               5 } t        dz   }t               }t        j                  j                  | d      } |||d        t               |dd      }|D cg c]	  }d|v s| c}\  }t        |       ddd       yc c}w # 1 sw Y   yxY w)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)actionr1   r   )r   ZENODOURL_W_SLASHr	   rH   rI   rJ   r   r   )rK   base_urlr"   rL   fnamesffnames          r#   *test_zenodo_downloader_with_slash_in_fnamerV      s     
	$'JJ"_
'',,{O<8Wd+ 4@%>v!A)=Av> 
	 ? 
	s$   AB 	B*B.BBBc                  `   t         } | d| j                  d       dz   } | dd }d| d}t               5 }t               }t        j
                  j                  |d      }t        j                  t        |	      5   || dz   |d       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)
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	   rH   rI   rJ   r*   warnsUserWarning)r   r9   warning_msgrK   r"   rL   s         r#   !test_figshare_unspecified_versionrc      s     C


3
 3
&C
a)C&se+NOK		"_
'',,{O<\\+[9s_,gt< : 
	 :9 
	s$   AB$9BB$B!	B$$B-zversion, missing, present)r   7LC08_L2SP_218074_20190114_20200829_02_T1-cropped.tar.gzcropped-before.tar.gz)r   re   rd   c                     d|  }d| d}t        ||      }|j                  D cg c]  }|d   	 }}||v sJ ||vsJ yc c}w )zG
    Test if setting the version in Figshare DOI works as expected
    z10.6084/m9.figshare.21665630.vhttps://doi.org/rY   nameN)r   api_response)versionmissingpresentr9   r   r;   item	filenamess           r#   &test_figshare_data_repository_versionsro      sl    , +7)
4CSE
#C!#s+H*2*?*?@*?$f*?I@i)### As   Ac                    t        | d      5 }t               5 }t        | j                        }t        j
                  j                  |d      } |||d       t        |       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)zTest ftp downloaderr   )portN)r   r   r   server_portrH   rI   rJ   r   )	ftpserverr   rK   r"   rL   s        r#   test_ftp_downloaderrt      sm     
y/	2c![&I,A,ABJggll;@GsGT*G$	 " 
3	2!! 
3	2s#   BAA5$B5A>	:BB
zrequires paramiko to run SFTPc                      t               5 } t        dd      }d}t        j                  j	                  | d      } |||d       t        j                  j                  |      sJ 	 ddd       y# 1 sw Y   yxY w)zTest sftp downloaderdemopasswordusernamerw   r'   pocketftp.pngN)r   r   rH   rI   rJ   exists)rK   r"   r   rL   s       r#   test_sftp_downloaderr|      s_     
	#VjI
?'',,{O<3&ww~~g&&& 
		s   AA00A9c                  R   t               5 } t        dd      }d}t        j                  j	                  | d      }t        |d      5 }t        j                  t              5   |||d       ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)zFDownloader should fail when a file object rather than string is passedrv   rw   rx   r'   rz   wbN)	r   r   rH   rI   rJ   openr*   r+   	TypeError)rK   r"   r   rL   outfile_objs        r#   (test_sftp_downloader_fail_if_file_objectr      s     
	#VjI
?'',,{O<'4 Ky)3T2 * !	 
	
 *) ! 	 
	s;   <BB!B,B4BB
BB	BB&zparamiko must be missingc                      t        j                  t              5 } t                ddd       dt	         j
                        v sJ y# 1 sw Y   #xY w)z+test must fail if paramiko is not installedNz
'paramiko')r*   r+   r,   r   r2   r3   r4   s    r#   -test_sftp_downloader_fail_if_paramiko_missingr      s<     
z	"c 
#3syy>))) 
#	"s   AAztqdm must be missingr"   c                     t        j                  t              5 } | d       ddd       dt        j                        v sJ y# 1 sw Y   #xY w)zFMake sure an error is raised if trying to use progressbar without tqdmTr   Nz'tqdm')r*   r+   r,   r2   r3   )r"   r5   s     r#   !test_downloader_progressbar_failsr      s>     
z	"ct$ 
#s399~%%% 
#	"s   
AAzurl,downloaderhttpr;   c                     |d      }t               5 }d}| |z   } t        j                  j                  ||      } || |d       |j	                         }|j
                  j                  d      d   j                         }t        |      dk(  sJ t        j                  dk(  rd	}	nd
}	|dd |	k(  sJ t        |       ddd       y# 1 sw Y   yxY w)z@Setup a downloader function that prints a progress bar for fetchTr   r   Nr[   O   win32100%|####################A   100%|████████████████████   )r   rH   rI   rJ   
readouterrerrsplitstriplensysplatformr   )
r   r"   capsysrO   rK   rU   rL   capturedprintedprogresss
             r#   test_downloader_progressbarr   	  s     d+H		Ek'',,{E2gt$$$&,,$$T*2.4467|r!!!<<7"2HZHs|x''' ! 
		s   B+CCc                    t        |d      5 }t        d|j                        }t               5 }t        j
                  j                  |d      } |||d       | j                         }|j                  j                  d      d   j                         }t        |      dk(  sJ t        j                  dk(  rd	}nd
}|dd |k(  sJ t        |       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)zESetup an FTP downloader function that prints a progress bar for fetchr   T)r   rq   Nr   r[   r   r   r   r   r   )r   r   rr   r   rH   rI   rJ   r   r   r   r   r   r   r   r   )	r   rs   r   rO   rK   rL   r   r   r   s	            r#   test_downloader_progressbar_ftpr   &  s     
y/	2c T	8M8MN![ggll;@GS'4( ((*Hll((.r288:Gw<2%%%||w&6^ 3B<8+++G$! " 
3	2!! 
3	2s#   "C0B$C$C0$C-	)C00C9c                    t        ddd      }t               5 }d}t        j                  j	                  |d      } |||d       | j                         }|j                  j                  d      d	   j                         }t        |      d
k(  sJ t        j                  dk(  rd}nd}|dd |k(  sJ t        j                  j                  |      sJ 	 ddd       y# 1 sw Y   yxY w)zFSetup an SFTP downloader function that prints a progress bar for fetchTrv   rw   )r   ry   rw   r'   rz   Nr   r[   r   r   r   r   r   )r   r   rH   rI   rJ   r   r   r   r   r   r   r   r{   )r   r"   rK   r   rL   r   r   r   s           r#    test_downloader_progressbar_sftpr   ?  s    
  D6JWJ		?'',,{O<3&$$&,,$$T*2.4467|r!!!<<7"2HZHs|x'''ww~~g&&& 
		s   B<CC(c                     G d d      } |d      }t        |      }t               5 }d}t        |z   }t        j                  j                  |d      } |||d       | j                         }|j                  j                  d      d   j                         }	d	}
|	|
k(  sJ t        |       ddd       y# 1 sw Y   yxY w)
zASetup a downloader function with an arbitrary progress bar class.c                   >    e Zd ZdZd Zd Zd Zd Zd Ze	d        Z
y)	Etest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplayz&A minimalist replacement for tqdm.tqdmc                      d| _         || _        y )Nr   )counttotal)selfr   s     r#   __init__zNtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.__init__^  s    DJDJr%   c                 ^    t        | j                        dz   t        | j                        z   S )zrepresent current completionrY   )r2   r   r   r   s    r#   __repr__zNtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.__repr__b  s"    tzz?S(3tzz?::r%   c                 B    t        d|  t        j                  d       y)zprint self.__repr__ to stderrr    )fileendNprintr   stderrr   s    r#   renderzLtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.renderf  s    Btf+CJJB7r%   c                 2    || _         | j                          y)zmodify completion and renderN)r   r   )r   is     r#   updatezLtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.updatej  s    DJKKMr%   c                     d| _         y)zset counter to 0r   N)r   r   s    r#   resetzKtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.reseto  s	    DJr%   c                  :    t        dt        j                         y)zprint a new empty liner   )r   Nr   r-   r%   r#   closezKtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.closes  s     "3::&r%   N)__name__
__module____qualname____doc__r   r   r   r   r   staticmethodr   r-   r%   r#   MinimalProgressDisplayr   [  s2    4		;	8	
	 
	' 
	'r%   r   N)r   r   zlarge-data.txtr   r[   z336/336)r   r   BASEURLrH   rI   rJ   r   r   r   r   r   )r   r   pbarrO   rK   rU   r   rL   r   r   r   s              r#   %test_downloader_arbitrary_progressbarr   W  s    ' ': "-D$/H		 o'',,{,<=gt$$$&,,$$T*2.446(""" 	! 
		s   BB99Cc                      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                  j                  dde
fdefdefg      d        Zej                  j                  dde
fdefg      d        Zej                  j                  de
eg      d        Zy)TestZenodoAPISupportz0
    Test support for different Zenodo APIs
    i@ z10.0001/zenodo.rg   zmy-file.zipzMhttps://zenodo.org/api/files/513d7033-93a2-4eeb-821c-2fb0bbab0012/my-file.zip 2942bfabb3d05332b66eb128e0842cffz 2021-20-19T08:00:00.000000+00:00z$513d7033-93a2-4eeb-821c-2fb0bbab0012md5:r   )idkeychecksumlinks)createdmodifiedr   r9   doi_urlfiles)r   filenamer   r   zapi_version, api_responselegacynewinvalidc                 v   |j                  d| j                         j                  |       t        | j                  | j
                        }|j                  d      |_        |dk7  r|j                  |k(  sJ yd}t        j                  t        |      5  |j                  }ddd       y# 1 sw Y   yxY w)z@
        Test if the API version is correctly detected.
        /zenodo.r9   archive_urlr   r   z0Couldn't determine the version of the Zenodo APIr\   N)expect_request
article_idrespond_with_jsonr   r9   r   url_forbase_api_urlapi_versionr*   r+   r,   )r   
httpserverr   ri   r"   msgs         r#   test_api_versionz%TestZenodoAPISupport.test_api_version  s     	!!HT__,=">?QQ	
 &$((M
","4"4R"8
)#))[888DCz5(44 655s   B//B8c                 z   |j                  d| j                         j                  |       t        | j                  | j
                        }|j                  d      |_        |j                  | j                        }|dk(  r|| j                  k(  sJ y	d| j                   d| j                   d}||k(  sJ y	)
zK
        Test if the download url is correct for each API version.
        r   r   r   r@   r   zhttps://zenodo.org/records/z/files/z?download=1N)r   r   r   r   r9   r   r   r   rC   rA   file_url)r   r   r   ri   r"   rC   expected_urls          r#   test_download_urlz&TestZenodoAPISupport.test_download_url  s     	!!HT__,=">?QQ	
 &$((M
","4"4R"8
!...H("4==000 .??#74>>*:+G   <///r%   ri   c                 \   |j                  d| j                         j                  |       t        d|      }t	        | j
                  | j                        }|j                  d      |_        |j                  |       |j                  | j                  d| j                   ik(  sJ y)zX
        Test if population of registry is correctly done for each API version.
        r   r   )rR   rI   r   r   N)r   r   r   r   r   r9   r   r   r   populate_registryregistryrA   file_checksum)r   r   tmp_pathri   puppyr"   s         r#   test_populate_registryz+TestZenodoAPISupport.test_populate_registry  s     	!!HT__,=">?QQ	
 r1%$((M
","4"4R"8
$$U+~~$..D9K9K8L2M!NNNNr%   N)r   r   r   r   r   r9   r   rA   r   r   legacy_api_responsenew_api_responseinvalid_api_responser*   markparametrizer   r   r   r-   r%   r#   r   r     s    JJ<
(C &GIW  7M 66 = "=/2H		
& 66 =%)H		
& 66 =%)H	 = "=/2H	
4 [[#*+$%,-	
55( [[#
'	(52B*CD0	0. [[	./O	Or%   r   )=r   rH   r   tempfiler   r*   tqdmImportErrorparamikor   r   downloadersr   r   r   r	   r
   r   r   r   r   
processorsr   utilsr   r   r   r   r   r   r   r   r   r^   	ZENODOURLrQ   DATAVERSEURLr   skipifr   r$   r(   r.   networkr6   r:   rF   rM   rV   rc   ro   rt   r|   r   r   r   r   r   r   r   r   r-   r%   r#   <module>r      s    
 
 '  
 
 
 	 	 	 
%'!#	46 ') DDL9	/!* :* H$-@A* B*/ H H 3 3 	>?	34	45
 	,  8 8 	)\*+  
! !  & = =$ 	

	
$  $ % % H$-LM' N ' H$-LM3 N 3 HD(1KL* M* D$-CD~'VW& X E& DDL9~m <=	  
! : !, DDL9% : %. DDL9H$-@A' B : '* /" /"dWO WOq  D
  Hs"   Q Q QQQ)(Q)