diff --git a/cloudnet_api_client/client.py b/cloudnet_api_client/client.py index a72a2a0..ba7f634 100644 --- a/cloudnet_api_client/client.py +++ b/cloudnet_api_client/client.py @@ -322,7 +322,7 @@ def calibration(self, instrument_pid: str, date: datetime.date | str) -> dict: def download( self, - metadata: MetadataList, + metadata: MetadataList | TMetadata, output_directory: str | PathLike = ".", concurrency_limit: int = 5, progress: bool | None = None, @@ -340,7 +340,7 @@ def download( async def adownload( self, - metadata: MetadataList, + metadata: MetadataList | TMetadata, output_directory: str | PathLike = ".", concurrency_limit: int = 5, progress: bool | None = None, diff --git a/cloudnet_api_client/dl.py b/cloudnet_api_client/dl.py index 1856770..1f4c1e7 100644 --- a/cloudnet_api_client/dl.py +++ b/cloudnet_api_client/dl.py @@ -8,7 +8,10 @@ from tqdm import tqdm from cloudnet_api_client import utils -from cloudnet_api_client.containers import Metadata, ProductMetadata +from cloudnet_api_client.containers import ( + Metadata, + ProductMetadata, +) class BarConfig: @@ -49,13 +52,13 @@ class DlParams: async def download_files( base_url: str, - metadata: Iterable[Metadata], + metadata: Iterable[Metadata] | Metadata, output_path: Path, concurrency_limit: int, disable_progress: bool | None, validate_checksum: bool = False, ) -> list[Path]: - metas = list(metadata) + metas = list(metadata) if isinstance(metadata, Iterable) else [metadata] file_exists = _checksum_matches if validate_checksum else _size_and_name_matches semaphore = asyncio.Semaphore(concurrency_limit) total_bytes = sum(meta.size for meta in metas) diff --git a/tests/test_client.py b/tests/test_client.py index 8eb7008..3abe06d 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -462,6 +462,19 @@ def test_download_existing_file_skip(self, client: APIClient, tmp_path: Path): assert paths1 == paths2 assert paths2[0].stat().st_size == original_size + def test_downloading_single_metadata(self, client: APIClient, tmp_path: Path): + uuid = "ab872770-9136-4e61-8958-31e62abdfb1b" + meta = client.file(uuid) + paths = client.download(meta, output_directory=tmp_path, progress=False) + assert len(paths) == 1 + assert paths[0].exists() + + def test_downloading_single_metadata_II(self, client: APIClient, tmp_path: Path): + meta = client.raw_files(date_from="2025-08-01") + assert len(meta) == 3 + paths = client.download(meta[0], output_directory=tmp_path, progress=False) + assert len(paths) == 1 + async def test_async_download(self, client: APIClient, tmp_path: Path): meta = client.raw_files(date_from="2025-08-01") assert len(meta) == 3