Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions cloudnet_api_client/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down
9 changes: 6 additions & 3 deletions cloudnet_api_client/dl.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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)
Expand Down
13 changes: 13 additions & 0 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down