Source code for quantem.data.cli

"""Command-line interface for quantem.data."""

import argparse
import json
import sys

import numpy as np


[docs] def main(): parser = argparse.ArgumentParser( prog="quantem-data", description="Manage quantem electron microscopy datasets on Hugging Face Hub", ) sub = parser.add_subparsers(dest="command") # list p_list = sub.add_parser("list", help="List available datasets") p_list.add_argument("--technique", help="Filter by technique") # info p_info = sub.add_parser("info", help="Show dataset metadata") p_info.add_argument("name", help="Dataset name") # files p_files = sub.add_parser("files", help="List all files on HF Hub") p_files.add_argument("--technique", help="Filter by technique") # upload p_upload = sub.add_parser("upload", help="Upload a dataset") p_upload.add_argument("file", help="Path to .npy file") p_upload.add_argument("--name", required=True, help="Dataset name") p_upload.add_argument("--technique", required=True, help="Technique folder") p_upload.add_argument("--description", default="", help="Description") p_upload.add_argument("--contributor", default="", help="Contributor name") p_upload.add_argument("--metadata", help="Path to metadata JSON file") p_upload.add_argument("--token", help="HF token") p_upload.add_argument("--direct", action="store_true", help="Commit directly instead of creating a PR") # download p_download = sub.add_parser("download", help="Download a dataset") p_download.add_argument("name", help="Dataset name") p_download.add_argument("-o", "--output", help="Output path (default: {name}.npy)") args = parser.parse_args() if args.command is None: parser.print_help() sys.exit(1) from quantem.data import available, info, load, upload, list_files if args.command == "list": names = available(technique=args.technique) if not names: print("No datasets found.") for name in names: meta = info(name) desc = meta.get("description", "") shape = meta.get("data", {}).get("shape", "") print(f" {name:40s} {str(shape):25s} {desc}") elif args.command == "info": meta = info(args.name) meta.pop("_npy_path", None) print(json.dumps(meta, indent=2)) elif args.command == "files": files = list_files(technique=args.technique) for f in files: print(f" {f['path']:50s} {f['size_mb']:8.2f} MB [{f['type']}]") elif args.command == "upload": meta = args.metadata if meta: with open(meta) as f: meta = json.load(f) upload( args.file, name=args.name, technique=args.technique, metadata=meta, description=args.description, contributor=args.contributor, token=args.token, create_pr=not args.direct, ) elif args.command == "download": data = load(args.name) output = args.output or f"{args.name}.npy" np.save(output, data) print(f"Saved {output} ({data.nbytes / (1024**2):.1f} MB)")
if __name__ == "__main__": main()