
     
3jO                     	   S r SSKrSSKrSSKJr  SSKrSSKJr   SSKr SSK
r
SSKJr  SSKJrJrJrJrJrJrJrJrJrJr  SSKJr  S	S
KJrJrJrJrJrJ r J!r!J"r"  \" 5       r#\" 5       r$\ " 5       r%\!" 5       r&\"" 5       r'\RP                  RS                  \SL SS9\RP                  RU                  S\#S-   \%/5      S 5       5       r+\RP                  RS                  \
SL SS9S 5       r,S r-\RP                  R\                  S 5       r/\RP                  R\                  S 5       r0\RP                  R\                  \RP                  RU                  S\Rb                  " \S\RP                  Rd                  S9\S4\S4// SQS9S 5       5       r3\RP                  R\                  \RP                  RU                  S\Rb                  " \$\RP                  Rd                  S9\%\'// SQS9S 5       5       r4\RP                  R\                  S 5       r5\RP                  R\                  \RP                  Rd                  S 5       5       r6\RP                  R\                  \RP                  Rd                  \RP                  RU                  S S!S"/5      S# 5       5       5       r7\RP                  R\                  S$ 5       r8\RP                  R\                  \RP                  RS                  \
SL S%S9S& 5       5       r9\RP                  R\                  \RP                  RS                  \
SL S%S9S' 5       5       r:\RP                  RS                  \
SLS(S9S) 5       r;\RP                  RS                  \SLS*S9\RP                  RU                  S+\\\/5      S, 5       5       r<\RP                  R\                  \RP                  RS                  \SL SS9\RP                  RU                  S-\#\4\Rb                  " \$\\RP                  Rd                  S9/S.S//S9S0 5       5       5       r=\RP                  R\                  \RP                  RS                  \SL SS9S1 5       5       r>\RP                  R\                  \RP                  RS                  \SL SS9\RP                  RS                  \
SL SS9S2 5       5       5       r?\RP                  R\                  S3 5       r@ " S4 S55      rA " S6 S75      rBg! \	 a    Sr GNf = f! \	 a    Sr
 GNf = f)8zK
Test the downloader classes and functions separately from the Pooch core.
    N)TemporaryDirectory)	HTTPError   )Pooch)
HTTPDownloaderFTPDownloaderSFTPDownloaderDOIDownloaderchoose_downloaderFigshareRepositoryZenodoRepositoryDataverseRepository
doi_to_urlREQUESTS_HEADERS)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                 :    [        U SS9nUR                  SL d   eg)DThe progressbar keyword argument must pass through choose_downloaderTprogressbarNr   r!   r   
downloaders     V/home/wildlama/miniconda3/lib/python3.13/site-packages/pooch/tests/test_downloaders.pytest_progressbar_kwarg_passedr&   ?   s$     #3D9J!!T)))    zrequires paramikoc                  >    Sn [        U SS9nUR                  SL d   eg)r   /sftp://test.rebex.net/pub/example/pocketftp.pngTr    Nr"   r#   s     r%   "test_progressbar_kwarg_passed_sftpr*   M   s)     <C"3D9J!!T)))r'   c                      [         R                  " [        5         [        S5        SSS5        [         R                  " [        5         [        S5        SSS5        g! , (       d  f       N== f! , (       d  f       g= f)z6Should raise ValueError when protocol is not supportedzhttpup://some-invalid-url.comNzdoii:XXX/XXX/file)pytestraises
ValueErrorr    r'   r%   test_unsupported_protocolr0   U   sM    	z	"9: 
# 
z	"-. 
#	" 
#	" 
#	"s   A	A/
A,/
A=c                      [         R                  " [        5       n [        5       " SSSS9  SSS5        S[	        W R
                  5      ;   d   eg! , (       d  f       N*= f)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_repositoryr8   ^   sJ     
z	"c7TQU	
 
#
 6SYYGGG 
#	"s   A
Ac                  ~    [         R                  " [        5         [        SS9  SSS5        g! , (       d  f       g= f)z#Should fail if the DOI is not foundNOTAREALDOI)doiN)r,   r-   r   r   r/   r'   r%   test_doi_url_not_foundr<   i   s$     
y	!}% 
"	!	!s   
.
<zrepository,doiz10.6084/m9.figshare.14763051.v1)marksz10.5281/zenodo.4924875z10.11588/data/TKCFEF)figsharezenodo	dataverse)idsc                     [         R                  " [        5       n[        U5      nU R	                  X5      nUR                  SS9  SSS5        S[        WR                  5      ;   d   eg! , (       d  f       N*= f)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_urlr4   r5   )
repositoryr;   r7   r   repos        r%    test_figshare_url_file_not_foundrI   p   sb      
z	"co$$S.I. 
# &SYY777	 
#	"s   ,A++
A9c                     [        5        n[        5       n[        R                  R	                  US5      nU" U S-   US5        [        U5        SSS5        g! , (       d  f       g= f)zTest the DOI downloaderr   N)r   r
   ospathjoinr   )r   local_storer$   outfiles       r%   test_doi_downloaderrP      sL     
	"_
'',,{O<3('48 	 
		s   AA
A%c                  >   [        5        n [        S-   n[        5       n[        R                  R                  U S5      nU" XS5        [        5       " USSS9nU Vs/ s H  nSU;   d  M  UPM     snu  n[        U5        SSS5        gs  snf ! , (       d  f       g= f)zZ
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)actionr3   r   )r   ZENODOURL_W_SLASHr
   rK   rL   rM   r   r   )rN   base_urlr$   rO   fnamesffnames          r%   *test_zenodo_downloader_with_slash_in_fnamerY      s     
	$'JJ"_
'',,{O<8d+ 4@%>v!A)=Av> 
	 ? 
	s$   AB
B	*B	0B	B
Bc                  p   [         n U SU R                  S5       S-   n U SS nSU S3n[        5        n[        5       n[        R
                  R                  US5      n[        R                  " [        US	9   U" U S-   US5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)
zZ
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
   rK   rL   rM   r,   warnsUserWarning)r   r;   warning_msgrN   r$   rO   s         r%   !test_figshare_unspecified_versionrf      s     C


3
 3
&C
a)C&se+NOK		"_
'',,{O<\\+[9s_,gt< : 
	 :9 
	s$   AB'7BB'
B$	 B''
B5zversion, missing, present)r   7LC08_L2SP_218074_20190114_20200829_02_T1-cropped.tar.gzcropped-before.tar.gz)r   rh   rg   c                     SU  3nSU S3n[        X45      nUR                   Vs/ s H  ofS   PM	     nnX';   d   eX;  d   egs  snf )z?
Test if setting the version in Figshare DOI works as expected
z10.6084/m9.figshare.21665630.vhttps://doi.org/r\   nameN)r   api_response)versionmissingpresentr;   r   r>   item	filenamess           r%   &test_figshare_data_repository_versionsrr      sd    . +7)
4CSE
#C!#+H*2*?*?@*?$f*?I@### As   Ac                 &   [        U S5       n[        5        n[        U R                  S9n[        R
                  R                  US5      nU" XS5        [        U5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)zTest ftp downloaderr   )portN)r   r   r   server_portrK   rL   rM   r   )	ftpserverr   rN   r$   rO   s        r%   test_ftp_downloaderrw      sk     
y/	2c![&I,A,ABJggll;@GsT*G$	 " 
3	2!! 
3	2s#   BAA1 B1
A?	;B
Bzrequires paramiko to run SFTPc                     [        5        n [        SSS9nSn[        R                  R	                  U S5      nU" X#S5        [        R                  R                  U5      (       d   e SSS5        g! , (       d  f       g= f)zTest sftp downloaderdemopasswordusernamerz   r)   pocketftp.pngN)r   r	   rK   rL   rM   exists)rN   r$   r   rO   s       r%   test_sftp_downloaderr      s`     
	#VjI
?'',,{O<3&ww~~g&&&& 
		s   AA11
A?c                  j   [        5        n [        SSS9nSn[        R                  R	                  U S5      n[        US5       n[        R                  " [        5         U" X$S5        SSS5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       N(= f! , (       d  f       g= f)zFDownloader should fail when a file object rather than string is passedry   rz   r{   r)   r}   wbN)	r   r	   rK   rL   rM   openr,   r-   	TypeError)rN   r$   r   rO   outfile_objs        r%   (test_sftp_downloader_fail_if_file_objectr      s     
	#VjI
?'',,{O<'4 Ky)3T2 * !	 
	
 *) ! 	 
	s;   9B$B
B)B1B$
BB
B!	B$$
B2zparamiko must be missingc                      [         R                  " [        5       n [        5         SSS5        S[	        W R
                  5      ;   d   eg! , (       d  f       N*= f)z+test must fail if paramiko is not installedNz
'paramiko')r,   r-   r.   r	   r4   r5   r6   s    r%   -test_sftp_downloader_fail_if_paramiko_missingr     s<     
z	"c 
#3syy>))) 
#	"s   A


Aztqdm must be missingr$   c                     [         R                  " [        5       nU " SS9  SSS5        S[        WR                  5      ;   d   eg! , (       d  f       N*= f)zFMake sure an error is raised if trying to use progressbar without tqdmTr    Nz'tqdm')r,   r-   r.   r4   r5   )r$   r7   s     r%   !test_downloader_progressbar_failsr   
  s>     
z	"ct$ 
#s399~%%% 
#	"s   A
Azurl,downloaderhttpr>   c                    U" SS9n[        5        nSnX-   n [        R                  R                  XE5      nU" XS5        UR	                  5       nUR
                  R                  S5      S   R                  5       n[        U5      S:X  d   e[        R                  S:X  a  S	n	OS
n	USS U	:X  d   e[        U5        SSS5        g! , (       d  f       g= f)z@Setup a downloader function that prints a progress bar for fetchTr    r   Nr^   O   win32100%|####################A   100%|████████████████████   )r   rK   rL   rM   
readouterrerrsplitstriplensysplatformr   )
r   r$   capsysrR   rN   rX   rO   capturedprintedprogresss
             r%   test_downloader_progressbarr     s     d+H		k'',,{2t$$$&,,$$T*2.4467|r!!!<<7"2HZHs|x''' ! 
		s   B+C
Cc                 
   [        US5       n[        SUR                  S9n[        5        n[        R
                  R                  US5      nU" X%S5        U R                  5       nUR                  R                  S5      S   R                  5       n[        U5      S:X  d   e[        R                  S:X  a  S	nOS
nUSS U:X  d   e[        U5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)zESetup an FTP downloader function that prints a progress bar for fetchr   T)r!   rt   Nr   r^   r   r   r   r   r   )r   r   ru   r   rK   rL   rM   r   r   r   r   r   r   r   r   )	r   rv   r   rR   rN   rO   r   r   r   s	            r%   test_downloader_progressbar_ftpr   3  s     
y/	2c T	8M8MN![ggll;@GS4( ((*Hll((.r288:Gw<2%%%||w&6^ 3B<8+++G$! " 
3	2!! 
3	2s#   C4B&C#C4#
C1	-C44
Dc                    [        SSSS9n[        5        nSn[        R                  R	                  US5      nU" X4S5        U R                  5       nUR                  R                  S5      S	   R                  5       n[        U5      S
:X  d   e[        R                  S:X  a  SnOSnUSS U:X  d   e[        R                  R                  U5      (       d   e SSS5        g! , (       d  f       g= f)zFSetup an SFTP downloader function that prints a progress bar for fetchTry   rz   )r!   r|   rz   r)   r}   Nr   r^   r   r   r   r   r   )r	   r   rK   rL   rM   r   r   r   r   r   r   r   r~   )r   r$   rN   r   rO   r   r   r   s           r%    test_downloader_progressbar_sftpr   L  s    
  D6JWJ		?'',,{O<3&$$&,,$$T*2.4467|r!!!<<7"2HZHs|x'''ww~~g&&&& 
		s   CC##
C1c                     " S S5      nU" SS9n[        US9n[        5        nSn[        U-   n[        R                  R                  US5      nU" XgS5        U R                  5       nUR                  R                  S5      S   R                  5       n	S	n
X:X  d   e[        U5        SSS5        g! , (       d  f       g= f)
zASetup a downloader function with an arbitrary progress bar class.c                   F    \ rS rSrSrS rS rS rS rS r	\
S 5       rS	rg
)Etest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplayih  z&A minimalist replacement for tqdm.tqdmc                     SU l         Xl        g )Nr   counttotal)selfr   s     r%   __init__Ntest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.__init__k  s    DJJr'   c                 ^    [        U R                  5      S-   [        U R                  5      -   $ )zrepresent current completionr\   )r4   r   r   r   s    r%   __repr__Ntest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.__repr__o  s"    tzz?S(3tzz?::r'   c                 <    [        SU  3[        R                  SS9  g)zprint self.__repr__ to stderrr    )fileendNprintr   stderrr   s    r%   renderLtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.renders  s    Btf+CJJB7r'   c                 0    Xl         U R                  5         g)zmodify completion and renderN)r   r   )r   is     r%   updateLtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.updatew  s    JKKMr'   c                     SU l         g)zset counter to 0r   N)r   r   s    r%   resetKtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.reset|  s	    DJr'   c                  4    [        S[        R                  S9  g)zprint a new empty liner   )r   Nr   r/   r'   r%   closeKtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.close  s     "3::&r'   r   N)__name__
__module____qualname____firstlineno____doc__r   r   r   r   r   staticmethodr   __static_attributes__r/   r'   r%   MinimalProgressDisplayr   h  s2    4		;	8	
	 
	' 
	'r'   r   N)r   r    zlarge-data.txtr   r^   z336/336)r   r   BASEURLrK   rL   rM   r   r   r   r   r   )r   r   pbarrR   rN   rX   r   rO   r   r   r   s              r%   %test_downloader_arbitrary_progressbarr   d  s    ' ': "-D$/H		 o'',,{,<=t$$$&,,$$T*2.446""" 	! 
		s   BB22
C c                      \ rS rSrSrSrS\ 3rS\ 3rSrSr	Sr
S	S	\\\S
\S\
 3S\	0S./S.rS	S	\\\S
\\
S\	0S./S.rS	S	\\\S
\\
S\	0S.S
\S\
 3S\	0S./S.r\R                  R!                  SS\4S\4S\4/5      S 5       r\R                  R!                  SS\4S\4/5      S 5       r\R                  R!                  S\\/5      S 5       rSrg)TestZenodoAPISupporti  z(
Test support for different Zenodo APIs
i@ z10.0001/zenodo.rj   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   r;   doi_urlfiles)r   filenamer   r   zapi_version, api_responselegacynewinvalidc                 z   UR                  SU R                   35      R                  U5        [        U R                  U R
                  S9nUR                  S5      Ul        US:w  a  UR                  U:X  d   egSn[        R                  " [        US9   UR                  nSSS5        g! , (       d  f       g= f)z0
Test if the API version is correctly detected.
/zenodo.r;   archive_urlr   r   z0Couldn't determine the version of the Zenodo APIr_   N)expect_request
article_idrespond_with_jsonr   r;   r   url_forbase_api_urlapi_versionr,   r-   r.   )r   
httpserverr   rl   r$   msgs         r%   test_api_version%TestZenodoAPISupport.test_api_version  s     	!!HT__,=">?QQ	
 &$((M
","4"4R"8
)#))[888DCz5(44 655s   B,,
B:c                 p   UR                  SU R                   35      R                  U5        [        U R                  U R
                  S9nUR                  S5      Ul        UR                  U R                  S9nUS:X  a  XPR                  :X  d   eg	SU R                   SU R                   S3nXV:X  d   eg	)
z;
Test if the download url is correct for each API version.
r   r   r   rC   r   zhttps://zenodo.org/records/z/files/z?download=1N)r   r   r   r   r;   r   r   r   rF   rD   file_url)r   r   r   rl   r$   rF   expected_urls          r%   test_download_url&TestZenodoAPISupport.test_download_url  s     	!!HT__,=">?QQ	
 &$((M
","4"4R"8
!...H("==000 .??#74>>*:+G   ///r'   rl   c                 R   UR                  SU R                   35      R                  U5        [        SUS9n[	        U R
                  U R                  S9nUR                  S5      Ul        UR                  U5        UR                  U R                  SU R                   30:X  d   eg)zH
Test if population of registry is correctly done for each API version.
r   r   )rU   rL   r   r   N)r   r   r   r   r   r;   r   r   r   populate_registryregistryrD   file_checksum)r   r   tmp_pathrl   puppyr$   s         r%   test_populate_registry+TestZenodoAPISupport.test_populate_registry  s     	!!HT__,=">?QQ	
 r1%$((M
","4"4R"8
$$U+~~$..D9K9K8L2M!NNNNr'   r/   N)r   r   r   r   r   r   r;   r   rD   r   r   legacy_api_responsenew_api_responseinvalid_api_responser,   markparametrizer   r   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   c                   *    \ rS rSrSrS rS rS rSrg)TestDOIDownloaderHeadersi1  z+Test the headers argument in DOIDownloader.c                     [        5       nUR                  [        :X  d   e[        SS9nUR                  [        :X  d   eg)z#Test the default value for headers.Nheaders)r
   r  r   r   r$   s     r%   test_default_headers-TestDOIDownloaderHeaders.test_default_headers4  s=    "_
!!%5555"40
!!%5555r'   c                 F    [        SS0S9nSS0nUR                  U:X  d   eg)zTest overwriting for headers.customfieldr  Nr
   r  )r   r$   expected_headerss      r%   test_overwrite_headers/TestDOIDownloaderHeaders.test_overwrite_headers;  s5    "Hg+>?
g
 !!%5555r'   c                 :    [        0 S9nUR                  0 :X  d   eg)z&Test passing an emtpy dict to headers.r  Nr	  r  s     r%   test_headers_empty_dict0TestDOIDownloaderHeaders.test_headers_empty_dictC  s     "2.
!!R'''r'   r/   N)	r   r   r   r   r   r  r  r  r   r/   r'   r%   r   r   1  s    566(r'   r   )Cr   rK   r   tempfiler   r,   requestsr   tqdmImportErrorparamikor   r   downloadersr   r   r	   r
   r   r   r   r   r   r   
processorsr   utilsr   r   r   r   r   r   r   r   r   ra   	ZENODOURLrT   DATAVERSEURLr   skipifr   r&   r*   r0   networkr8   r<   paramr>   rI   rP   rY   rf   rr   rw   r   r   r   r   r   r   r   r   r   r   r/   r'   r%   <module>r     sv   
 
 '  
    	 	 	 
%'!#	46 ') DDL9	/!* :* H$-@A* B*/ H H & & -++&&	

 
34	45 	,  8 8 	\\+V[[%9%9:I|T+  
! !  & =  =$ 	

	
$  "$ % % H$-LM' N ' H$-LM3 N 3 HD(1KL* M* D$-CD~'VW& X E& DDL9	.![-v{{7K7KL 
  ! : !, DDL9% : %. DDL9H$-@A' B : '* /" /"dWO WOt( (w  D
  Hs"   S S# S S #S/.S/