+
    BiO                     R
   R t ^ RIt^ RIt^ RIHt ^ RIt^ RIHt  ^ RIt ^ RI
t
^RIHt ^RIHtHtHtHtHtHtHtHtHtHt ^RIHt ^RIHtHtHtHtHtH t H!t!H"t" ]! 4       t#]! 4       t$] ! 4       t%]!! 4       t&]"! 4       t']PP                  PS                  ]RJ RR	7      ]PP                  PU                  R
]#R,           ]%.4      R 4       4       t+]PP                  PS                  ]
RJ RR	7      R 4       t,R t-]PP                  P\                  R 4       t/]PP                  P\                  R 4       t0]PP                  P\                  ]PP                  PU                  R]Pb                  ! ]R]PP                  Pd                  R7      ]R3]R3.. R2OR7      R 4       4       t3]PP                  P\                  ]PP                  PU                  R
]Pb                  ! ]$]PP                  Pd                  R7      ]%]'.. R2OR7      R 4       4       t4]PP                  P\                  R 4       t5]PP                  P\                  ]PP                  Pd                  R 4       4       t6]PP                  P\                  ]PP                  Pd                  ]PP                  PU                  RR3R4.4      R 4       4       4       t7]PP                  P\                  R 4       t8]PP                  P\                  ]PP                  PS                  ]
RJ R R	7      R! 4       4       t9]PP                  P\                  ]PP                  PS                  ]
RJ R R	7      R" 4       4       t:]PP                  PS                  ]
RJR#R	7      R$ 4       t;]PP                  PS                  ]RJR%R	7      ]PP                  PU                  R&]]].4      R' 4       4       t<]PP                  P\                  ]PP                  PS                  ]RJ RR	7      ]PP                  PU                  R(]#]3]Pb                  ! ]$]]PP                  Pd                  R7      .R)R.R7      R* 4       4       4       t=]PP                  P\                  ]PP                  PS                  ]RJ RR	7      R+ 4       4       t>]PP                  P\                  ]PP                  PS                  ]RJ RR	7      ]PP                  PS                  ]
RJ RR	7      R, 4       4       4       t?]PP                  P\                  R- 4       t@ ! R. R/4      tA ! R0 R14      tBR#   ]	 d    Rt ELi ; i  ]	 d    Rt
 EL i ; i)5zK
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                D    \        V RR7      pVP                  RJ g   Q hR# )DThe progressbar keyword argument must pass through choose_downloaderTprogressbarNr	   r   r   
downloaders   & Z/var/www/html/photoedit/myenv/lib/python3.14/site-packages/pooch/tests/test_downloaders.pytest_progressbar_kwarg_passedr#   ?   s$     #3D9J!!T)))    zrequires paramikoc                 H    Rp \        V RR7      pVP                  RJ g   Q hR# )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                 ,   \         P                  ! \        4      ;_uu_ 4        \        R4       RRR4       \         P                  ! \        4      ;_uu_ 4        \        R4       RRR4       R#   + '       g   i     LH; i  + '       g   i     R# ; i)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-   U   sV    	z	"	"9: 
# 
z	"	"-. 
#	" 
#	" 
#	"	"s   A/B/A?	B	c                     \         P                  ! \        4      ;_uu_ 4       p \        4       ! RRRR7       RRR4       R\	        X P
                  4      9   g   Q hR#   + '       g   i     L.; i)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_repositoryr5   ^   sM     
z	"	"c7TQU	
 
#
 6SYYGGG 
#	"s   AA-	c                     \         P                  ! \        4      ;_uu_ 4        \        RR7       RRR4       R#   + '       g   i     R# ; i)z#Should fail if the DOI is not foundNOTAREALDOI)doiN)r)   r*   r   r   r,   r$   r"   test_doi_url_not_foundr9   i   s*     
y	!	!}% 
"	!	!	!s	   :A	zrepository,doiz10.6084/m9.figshare.14763051.v1)marksz10.5281/zenodo.4924875z10.11588/data/TKCFEFfigshare)idsc                   \         P                  ! \        4      ;_uu_ 4       p\        V4      pV P	                  W4      pVP                  RR7       RRR4       R\        XP                  4      9   g   Q hR#   + '       g   i     L.; i)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_urlr1   r2   )
repositoryr8   r4   r   repos   &&   r"    test_figshare_url_file_not_foundrD   p   se      
z	"	"co$$S.I. 
# &SYY777	 
#	"s   /A88B	c                    \        4       ;_uu_ 4       p\        4       p\        P                  P	                  VR4      pV! V R,           VR4       \        V4       RRR4       R#   + '       g   i     R# ; i)zTest the DOI downloaderr   N)r   r   ospathjoinr   )r   local_storer!   outfiles   &   r"   test_doi_downloaderrK      sR     
		"_
'',,{O<3('48 	 
			s   AA$$A5	c                 d   \        4       ;_uu_ 4       p \        R,           p\        4       p\        P                  P                  V R4      pV! WR4       \        4       ! VRRR7      pV Uu. uF  pRV9   g   K  VNK  	  upw  p\        V4       RRR4       R# u upi   + '       g   i     R# ; i)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)actionr0   r   )r   ZENODOURL_W_SLASHr   rF   rG   rH   r   r   )rI   base_urlr!   rJ   fnamesffnames          r"   *test_zenodo_downloader_with_slash_in_fnamerT      s     
		$'JJ"_
'',,{O<8d+ 4@%>v!A)=AAv> 
	 ? 
		s$   AB+	B9B?BBB/	c            	        \         p V RV P                  R4       R,           p V ^R pRV R2p\        4       ;_uu_ 4       p\        4       p\        P
                  P                  VR4      p\        P                  ! \        VR7      ;_uu_ 4        V! V R,           VR4       RRR4       RRR4       R#   + '       g   i     L; i  + '       g   i     R# ; i)	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   rF   rG   rH   r)   warnsUserWarning)r   r8   warning_msgrI   r!   rJ   s         r"   !test_figshare_unspecified_versionr`      s     C


3
 3
&C
a)C&se+NOK			"_
'',,{O<\\+[99s_,gt< : 
	 :9 
		s$   ACB2	 C2C=CC	zversion, missing, presentc                    RV  2pRV R2p\        W44      pVP                   Uu. uF  qfR,          NK  	  ppW'9   g   Q hW9  g   Q hR# u upi )z?
Test if setting the version in Figshare DOI works as expected
z10.6084/m9.figshare.21665630.vhttps://doi.org/rW   nameN)r
   api_response)versionmissingpresentr8   r   r;   item	filenamess   &&&     r"   &test_figshare_data_repository_versionsrj      sf    . +7)
4CSE
#C!#+H*2*?*?@*?$f*?I@### As   A
c           	     X   \        V R4      ;_uu_ 4       p\        4       ;_uu_ 4       p\        V P                  R7      p\        P
                  P                  VR4      pV! WR4       \        V4       RRR4       RRR4       R#   + '       g   i     L; i  + '       g   i     R# ; i)zTest ftp downloaderr   )portN)r   r   r   server_portrF   rG   rH   r   )	ftpserverr   rI   r!   rJ   s   &    r"   test_ftp_downloaderro      st     
y/	2	2c!![&I,A,ABJggll;@GsT*G$	 " 
3	2!! 
3	2	2s#   BAB	3BBBB)	zrequires paramiko to run SFTPc                 $   \        4       ;_uu_ 4       p \        RRR7      pRp\        P                  P	                  V R4      pV! W#R4       \        P                  P                  V4      '       g   Q h RRR4       R#   + '       g   i     R# ; i)zTest sftp downloaderdemopasswordusernamerr   r&   pocketftp.pngN)r   r   rF   rG   rH   exists)rI   r!   r   rJ   s       r"   test_sftp_downloaderrw      sf     
		#VjI
?'',,{O<3&ww~~g&&&& 
			s   A A>>B	c                    \        4       ;_uu_ 4       p \        RRR7      pRp\        P                  P	                  V R4      p\        VR4      ;_uu_ 4       p\        P                  ! \        4      ;_uu_ 4        V! W$R4       RRR4       RRR4       RRR4       R#   + '       g   i     L"; i  + '       g   i     L-; i  + '       g   i     R# ; i)zFDownloader should fail when a file object rather than string is passedrq   rr   rs   r&   ru   wbN)	r   r   rF   rG   rH   openr)   r*   	TypeError)rI   r!   r   rJ   outfile_objs        r"   (test_sftp_downloader_fail_if_file_objectr}      s     
		#VjI
?'',,{O<'4  Ky))3T2 * !	 
	
 *) ! 	 
		s<   AC#B1	:
BB1	CB.)B1	1C<CC	zparamiko must be missingc                     \         P                  ! \        4      ;_uu_ 4       p \        4        RRR4       R\	        X P
                  4      9   g   Q hR#   + '       g   i     L.; i)z+test must fail if paramiko is not installedNz
'paramiko')r)   r*   r+   r   r1   r2   r3   s    r"   -test_sftp_downloader_fail_if_paramiko_missingr     s?     
z	"	"c 
#3syy>))) 
#	"s   AA$	ztqdm must be missingr!   c                    \         P                  ! \        4      ;_uu_ 4       pV ! RR7       RRR4       R\        XP                  4      9   g   Q hR#   + '       g   i     L.; i)zFMake sure an error is raised if trying to use progressbar without tqdmTr   Nz'tqdm')r)   r*   r+   r1   r2   )r!   r4   s   & r"   !test_downloader_progressbar_failsr   
  sA     
z	"	"ct$ 
#s399~%%% 
#	"s   
AA#	zurl,downloaderhttpc                   V! RR7      p\        4       ;_uu_ 4       pRpW,           p \        P                  P                  WE4      pV! WR4       VP	                  4       pVP
                  P                  R4      R
,          P                  4       p\        V4      ^O8X  g   Q h\        P                  R8X  d   Rp	MRp	VR	,          V	8X  g   Q h\        V4       RRR4       R#   + '       g   i     R# ; i)z@Setup a downloader function that prints a progress bar for fetchTr   r   Nwin32100%|####################A   100%|████████████████████N   NrZ   )r   rF   rG   rH   
readouterrerrsplitstriplensysplatformr   )
r   r!   capsysrM   rI   rS   rJ   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  C1	c           	     R   \        VR4      ;_uu_ 4       p\        RVP                  R7      p\        4       ;_uu_ 4       p\        P
                  P                  VR4      pV! W%R4       V P                  4       pVP                  P                  R4      R
,          P                  4       p\        V4      ^O8X  g   Q h\        P                  R8X  d   RpMRpVR	,          V8X  g   Q h\        V4       RRR4       RRR4       R#   + '       g   i     L; i  + '       g   i     R# ; i)zESetup an FTP downloader function that prints a progress bar for fetchr   T)r   rl   Nr   r   r   r   r   rZ   )r   r   rm   r   rF   rG   rH   r   r   r   r   r   r   r   r   )	r   rn   r   rM   rI   rJ   r   r   r   s	   &&       r"   test_downloader_progressbar_ftpr   3  s     
y/	2	2c T	8M8MN!![ggll;@GS4( ((*Hll((.r288:Gw<2%%%||w&6^ 3<8+++G$! " 
3	2!! 
3	2	2s#   *DB1D	0DDDD&	c                   \        RRRR7      p\        4       ;_uu_ 4       pRp\        P                  P	                  VR4      pV! W4R4       V P                  4       pVP                  P                  R4      R,          P                  4       p\        V4      ^O8X  g   Q h\        P                  R	8X  d   R
pMRpVR,          V8X  g   Q h\        P                  P                  V4      '       g   Q h RRR4       R#   + '       g   i     R# ; i)zFSetup an SFTP downloader function that prints a progress bar for fetchTrq   rr   )r   rt   rr   r&   ru   Nr   r   r   r   r   rZ   )r   r   rF   rG   rH   r   r   r   r   r   r   r   rv   )r   r!   rI   r   rJ   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;.C;;D	c                    ! R R4      pV! RR7      p\        VR7      p\        4       ;_uu_ 4       pRp\        V,           p\        P                  P                  VR4      pV! WgR4       V P                  4       pVP                  P                  R4      R	,          P                  4       p	Rp
W8X  g   Q h\        V4       RRR4       R#   + '       g   i     R# ; i)
zASetup a downloader function with an arbitrary progress bar class.c                   R   a  ] tR tRt o RtR tR tR tR tR t	]
R 4       tR	tV tR
# )Etest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplayih  z&A minimalist replacement for tqdm.tqdmc                     ^ V n         Wn        R# )    Ncounttotal)selfr   s   &&r"   __init__Ntest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.__init__k  s    DJJr$   c                n    \        V P                  4      R,           \        V P                  4      ,           # )zrepresent current completionrW   )r1   r   r   r   s   &r"   __repr__Ntest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.__repr__o  s"    tzz?S(3tzz?::r$   c                D    \        RV  2\        P                  RR7       R# )zprint self.__repr__ to stderrr    )fileendNprintr   stderrr   s   &r"   renderLtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.renders  s    Btf+CJJB7r$   c                2    Wn         V P                  4        R# )zmodify completion and renderN)r   r   )r   is   &&r"   updateLtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.updatew  s    JKKMr$   c                    ^ V n         R# )zset counter to 0N)r   r   s   &r"   resetKtest_downloader_arbitrary_progressbar.<locals>.MinimalProgressDisplay.reset|  s	    DJr$   c                 <    \        R\        P                  R7       R# )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____classdictcell____classdict__s   @r"   MinimalProgressDisplayr   h  s5     4		;	8	
	 
	' 
	'r$   r   N)r   r   zlarge-data.txtr   z336/336rZ   )r   r   BASEURLrF   rG   rH   r   r   r   r   r   )r   r   pbarrM   rI   rS   r   rJ   r   r   r   s   &          r"   %test_downloader_arbitrary_progressbarr   d  s    ' ': "-D$/H			 o'',,{,<=t$$$&,,$$T*2.446""" 	! 
			s   BC

C	c                     a  ] tR tRt o RtRtR] 2tR] 2tRtRt	Rt
R	R
RR
R]R]R]RRRR]RR]
 2RR]	//./tR	R
RR
R]R]R]RRRR]R]
RR]	//./tR	R
RR
R]R]R]RRRR]R]
RR]	//RRR]RR]
 2RR]	//./t]P                  P!                  RR]3R]3R]3.4      R 4       t]P                  P!                  RR]3R]3.4      R 4       t]P                  P!                  R]].4      R 4       tRtV tR # )!TestZenodoAPISupporti  z(
Test support for different Zenodo APIs
i@ z10.0001/zenodo.rb   zmy-file.zipzMhttps://zenodo.org/api/files/513d7033-93a2-4eeb-821c-2fb0bbab0012/my-file.zip 2942bfabb3d05332b66eb128e0842cffcreatedz 2021-20-19T08:00:00.000000+00:00modifiedidr8   doi_urlfilesz$513d7033-93a2-4eeb-821c-2fb0bbab0012keychecksummd5:linksr   filenamezapi_version, api_responselegacynewinvalidc                   VP                  RV P                   24      P                  V4       \        V P                  V P
                  R7      pVP                  R4      Vn        VR8w  d   VP                  V8X  g   Q hR# Rp\        P                  ! \        VR7      ;_uu_ 4        VP                  pRRR4       R#   + '       g   i     R# ; i)z0
Test if the API version is correctly detected.
/zenodo.r8   archive_urlr   r   z0Couldn't determine the version of the Zenodo APIrX   N)expect_request
article_idrespond_with_jsonr   r8   r   url_forbase_api_urlapi_versionr)   r*   r+   )r   
httpserverr   rd   r!   msgs   &&&&  r"   test_api_version%TestZenodoAPISupport.test_api_version  s     	!!HT__,=">?QQ	
 &$((M
","4"4R"8
)#))[888DCz55(44 6555s   'B>>C	c                   VP                  RV P                   24      P                  V4       \        V P                  V P
                  R7      pVP                  R4      Vn        VP                  V P                  R7      pVR8X  d   WPP                  8X  g   Q hR	# RV P                   RV P                   R2pWV8X  g   Q hR	# )
z;
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   r8   r   r   r   rA   r?   file_url)r   r   r   rd   r!   rA   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$   rd   c                b   VP                  RV P                   24      P                  V4       \        RVR7      p\	        V P
                  V P                  R7      pVP                  R4      Vn        VP                  V4       VP                  V P                  RV P                   2/8X  g   Q hR# )zH
Test if population of registry is correctly done for each API version.
r   r   )rP   rG   r   r   N)r   r   r   r   r   r8   r   r   r   populate_registryregistryr?   file_checksum)r   r   tmp_pathrd   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   r8   r   r?   r   r   legacy_api_responsenew_api_responseinvalid_api_responser)   markparametrizer   r   r   r   r   r   s   @r"   r   r     s     JJ<
(C &GIW  7M 	56js7<yd=/2H		
& 	56js7<IMH		
& 	56js7<IMH	 <yd=/2H	
4 [[#*+$%,-	
55( [[#
'	(52B*CD0	0. [[	./O	Or$   r   c                   6   a  ] tR tRt o RtR tR tR tRtV t	R# )TestDOIDownloaderHeadersi1  z+Test the headers argument in DOIDownloader.c                    \        4       pVP                  \        8X  g   Q h\        RR7      pVP                  \        8X  g   Q hR# )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                P    \        RR/R7      pRR/pVP                  V8X  g   Q hR# )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                D    \        / R7      pVP                  / 8X  g   Q hR# )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   s   @r"   r   r   1  s     566( (r$   r   )r;   zenodo	dataverse)   7LC08_L2SP_218074_20190114_20200829_02_T1-cropped.tar.gzcropped-before.tar.gz)   r  r  )Cr   rF   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   r[   	ZENODOURLrO   DATAVERSEURLr   skipifr   r#   r'   r-   networkr5   r9   paramr;   rD   rK   rT   r`   rj   ro   rw   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"   T	 T 		TT	T&%T&