from argparse import Namespace from typing import Any from mdrsclient.commands.base import BaseCommand class DownloadCommand(BaseCommand): @classmethod 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" ) download_parser.add_argument( "-s", "--skip-if-exists", help="skip the download if file is already uploaded and file size is the same", action="store_true", ) download_parser.add_argument( "-e", "--exclude", help="exclude to download path matched file or folders", action="append" ) 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=cls.func) @classmethod def func(cls, args: Namespace) -> None: remote_path = str(args.remote_path) local_path = str(args.local_path) is_recursive = bool(args.recursive) is_skip_if_exists = bool(args.skip_if_exists) password = str(args.password) if args.password else None excludes = list(map(lambda x: str(x).rstrip("/").lower(), args.exclude)) if args.exclude is not None else [] cls.download(remote_path, local_path, is_recursive, is_skip_if_exists, password, excludes) @classmethod def download( cls, remote_path: str, local_path: str, is_recursive: bool, is_skip_if_exists: bool, password: str | None, excludes: list[str], ) -> None: remote = remote_path.split(":", 1)[0] if ":" in remote_path else "" from mdrsclient.client import MdrsClient client = MdrsClient.from_remote(remote) client.download(remote_path, local_path, is_recursive, is_skip_if_exists, password, excludes) return