@@ -577,11 +577,51 @@ def download(
577
577
if to_info .scheme != "local" :
578
578
raise NotImplementedError
579
579
580
- logger .debug ("Downloading '{}' to '{}'" .format (from_info , to_info ))
580
+ if self .isdir (from_info ):
581
+ return self ._download_dir (
582
+ from_info , to_info , name , no_progress_bar , file_mode , dir_mode
583
+ )
584
+ return self ._download_file (
585
+ from_info , to_info , name , no_progress_bar , file_mode , dir_mode
586
+ )
581
587
582
- name = name or to_info .name
588
+ def _download_dir (
589
+ self , from_info , to_info , name , no_progress_bar , file_mode , dir_mode
590
+ ):
591
+ file_to_infos = (
592
+ to_info / file_to_info .relative_to (from_info )
593
+ for file_to_info in self .walk_files (from_info )
594
+ )
583
595
596
+ with ThreadPoolExecutor (max_workers = self .JOBS ) as executor :
597
+ file_from_info = list (self .walk_files (from_info ))
598
+ download_files = partial (
599
+ self ._download_file ,
600
+ name = name ,
601
+ no_progress_bar = True ,
602
+ file_mode = file_mode ,
603
+ dir_mode = dir_mode ,
604
+ )
605
+ futures = executor .map (
606
+ download_files , file_from_info , file_to_infos
607
+ )
608
+ with Tqdm (
609
+ futures ,
610
+ total = len (file_from_info ),
611
+ desc = "Downloading directory" ,
612
+ unit = "Files" ,
613
+ disable = no_progress_bar ,
614
+ ) as futures :
615
+ return sum (futures )
616
+
617
+ def _download_file (
618
+ self , from_info , to_info , name , no_progress_bar , file_mode , dir_mode
619
+ ):
584
620
makedirs (to_info .parent , exist_ok = True , mode = dir_mode )
621
+
622
+ logger .debug ("Downloading '{}' to '{}'" .format (from_info , to_info ))
623
+ name = name or to_info .name
624
+
585
625
tmp_file = tmp_fname (to_info )
586
626
587
627
try :
0 commit comments