Source code for imednet.cli.utils.export
"""CLI utilities for exporting data to files."""
from __future__ import annotations
import csv
import json
import sys
from collections.abc import Sequence
from pathlib import Path
from typing import Any, Protocol
from imednet.utils import sanitize_csv_formula
[docs]class Model(Protocol):
"""Protocol for objects that can be dumped to a dictionary."""
[docs] def model_dump(self, *, by_alias: bool = False) -> dict[str, Any]:
"""Dump the model to a dictionary."""
...
[docs]def export_list_to_file(
items: Sequence[Model],
filename_prefix: str,
output_format: str,
) -> None:
"""Export a list of Pydantic models to a file."""
fmt = output_format.lower()
if fmt not in {"csv", "json"}:
print(f"Error: Invalid output format: '{fmt}'. Supported: csv, json.")
sys.exit(1)
path = Path(f"{filename_prefix}.{fmt}")
data = [item.model_dump(by_alias=True) for item in items]
if fmt == "csv":
if data:
for row in data:
for k, v in row.items():
row[k] = sanitize_csv_formula(v)
keys = data[0].keys()
with open(path, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=keys)
writer.writeheader()
writer.writerows(data)
else:
path.touch()
else:
with open(path, "w", encoding="utf-8") as f:
json.dump(data, f, indent=2, default=str)
print(f"Saved {len(items)} {filename_prefix} to {path}")