fixed type errors when pylance type checking mode is strict.
This commit is contained in:
@ -1,6 +1,7 @@
|
||||
import os
|
||||
from argparse import Namespace, _SubParsersAction
|
||||
from argparse import Namespace
|
||||
from concurrent.futures import ThreadPoolExecutor
|
||||
from typing import Any
|
||||
|
||||
from pydantic.dataclasses import dataclass
|
||||
|
||||
@ -20,8 +21,7 @@ class DownloadFileInfo:
|
||||
|
||||
class DownloadCommand(BaseCommand):
|
||||
@classmethod
|
||||
def register(cls, parsers: _SubParsersAction) -> None:
|
||||
command = cls()
|
||||
def register(cls, parsers: Any) -> None:
|
||||
download_parser = parsers.add_parser("download", help="download the file or folder")
|
||||
download_parser.add_argument(
|
||||
"-r", "--recursive", help="download folders and their contents recursive", action="store_true"
|
||||
@ -29,19 +29,28 @@ class DownloadCommand(BaseCommand):
|
||||
download_parser.add_argument("-p", "--password", help="password to use when open locked folder")
|
||||
download_parser.add_argument("remote_path", help="remote file path (remote:/lab/path/file)")
|
||||
download_parser.add_argument("local_path", help="local folder path (/foo/bar/)")
|
||||
download_parser.set_defaults(func=command.download)
|
||||
download_parser.set_defaults(func=cls.func)
|
||||
|
||||
def download(self, args: Namespace) -> None:
|
||||
(remote, laboratory_name, r_path) = self._parse_remote_host_with_path(args.remote_path)
|
||||
@classmethod
|
||||
def func(cls, args: Namespace) -> None:
|
||||
remote_path = str(args.remote_path)
|
||||
local_path = str(args.local_path)
|
||||
is_recursive = bool(args.recursive)
|
||||
password = str(args.password) if args.password else None
|
||||
cls.download(remote_path, local_path, is_recursive, password)
|
||||
|
||||
@classmethod
|
||||
def download(cls, remote_path: str, local_path: str, is_recursive: bool, password: str | None) -> None:
|
||||
(remote, laboratory_name, r_path) = cls._parse_remote_host_with_path(remote_path)
|
||||
r_path = r_path.rstrip("/")
|
||||
r_dirname = os.path.dirname(r_path)
|
||||
r_basename = os.path.basename(r_path)
|
||||
connection = self._create_connection(remote)
|
||||
l_dirname = os.path.realpath(args.local_path)
|
||||
connection = cls._create_connection(remote)
|
||||
l_dirname = os.path.realpath(local_path)
|
||||
if not os.path.isdir(l_dirname):
|
||||
raise IllegalArgumentException(f"Local directory `{args.local_path}` not found.")
|
||||
laboratory = self._find_laboratory(connection, laboratory_name)
|
||||
r_parent_folder = self._find_folder(connection, laboratory, r_dirname, args.password)
|
||||
raise IllegalArgumentException(f"Local directory `{local_path}` not found.")
|
||||
laboratory = cls._find_laboratory(connection, laboratory_name)
|
||||
r_parent_folder = cls._find_folder(connection, laboratory, r_dirname, password)
|
||||
file = r_parent_folder.find_file(r_basename)
|
||||
download_files: list[DownloadFileInfo] = []
|
||||
if file is not None:
|
||||
@ -51,14 +60,15 @@ class DownloadCommand(BaseCommand):
|
||||
folder = r_parent_folder.find_sub_folder(r_basename)
|
||||
if folder is None:
|
||||
raise IllegalArgumentException(f"File or folder `{r_path}` not found.")
|
||||
if not args.recursive:
|
||||
if not is_recursive:
|
||||
raise IllegalArgumentException(f"Cannot download `{r_path}`: Is a folder.")
|
||||
folder_api = FolderApi(connection)
|
||||
self.__multiple_download_pickup_recursive_files(folder_api, download_files, folder.id, l_dirname)
|
||||
self.__multiple_download(connection, download_files)
|
||||
cls.__multiple_download_pickup_recursive_files(folder_api, download_files, folder.id, l_dirname)
|
||||
cls.__multiple_download(connection, download_files)
|
||||
|
||||
@classmethod
|
||||
def __multiple_download_pickup_recursive_files(
|
||||
self, folder_api: FolderApi, infolist: list[DownloadFileInfo], folder_id: str, basedir: str
|
||||
cls, folder_api: FolderApi, infolist: list[DownloadFileInfo], folder_id: str, basedir: str
|
||||
) -> None:
|
||||
folder = folder_api.retrieve(folder_id)
|
||||
dirname = os.path.join(basedir, folder.name)
|
||||
@ -69,13 +79,15 @@ class DownloadCommand(BaseCommand):
|
||||
path = os.path.join(dirname, file.name)
|
||||
infolist.append(DownloadFileInfo(file, path))
|
||||
for sub_folder in folder.sub_folders:
|
||||
self.__multiple_download_pickup_recursive_files(folder_api, infolist, sub_folder.id, dirname)
|
||||
cls.__multiple_download_pickup_recursive_files(folder_api, infolist, sub_folder.id, dirname)
|
||||
|
||||
def __multiple_download(self, connection: MDRSConnection, infolist: list[DownloadFileInfo]) -> None:
|
||||
@classmethod
|
||||
def __multiple_download(cls, connection: MDRSConnection, infolist: list[DownloadFileInfo]) -> None:
|
||||
file_api = FileApi(connection)
|
||||
with ThreadPoolExecutor(max_workers=CONCURRENT) as pool:
|
||||
pool.map(lambda x: self.__multiple_download_worker(file_api, x), infolist)
|
||||
pool.map(lambda x: cls.__multiple_download_worker(file_api, x), infolist)
|
||||
|
||||
def __multiple_download_worker(self, file_api: FileApi, info: DownloadFileInfo) -> None:
|
||||
@classmethod
|
||||
def __multiple_download_worker(cls, file_api: FileApi, info: DownloadFileInfo) -> None:
|
||||
file_api.download(info.file, info.path)
|
||||
print(info.path)
|
||||
|
Reference in New Issue
Block a user