Source code for kspecdr.utils.args

"""Argument parsing, validation, and normalization utilities."""

from pathlib import Path
from typing import Any, Dict, Iterable

from .fiber import parse_fib_overrides


[docs] def init_args(args: Dict[str, Any]) -> Dict[str, Any]: """ Initialize and normalize args in place. - Parse and cache fiber type overrides from FIB<no> keys. """ if args is None: return {} # Cache fiber overrides for later use. if "_FIB_TYPE_OVERRIDES" not in args: args["_FIB_TYPE_OVERRIDES"] = parse_fib_overrides(args) return args
[docs] def validate_files_exist( args: Dict[str, Any], keys: Iterable[str], *, required: bool ) -> None: """ Validate that files referenced by args exist. Parameters ---------- args : dict Argument dictionary. keys : iterable Argument keys to validate. required : bool Whether missing values should raise immediately. """ for key in keys: value = args.get(key, "") if not value: if required: raise FileNotFoundError(f"{key} not specified in arguments.") continue if not Path(value).exists(): raise FileNotFoundError(f"Cannot find {key} file {value}")
[docs] def validate_reduce_object_args(args: Dict[str, Any]) -> None: """ Sanity checks matching 2dfdr REDUCE_OBJECT_ARG_CHECKS. """ required = ("TLMAP_FILENAME", "WAVEL_FILENAME", "FFLAT_FILENAME") validate_files_exist(args, required, required=True) if args.get("USEDARKIM", False) and args.get("DARK_FILENAME"): validate_files_exist(args, ("DARK_FILENAME",), required=True) optional = ("BIAS_FILENAME", "LFLAT_FILENAME", "THPUT_FILENAME") validate_files_exist(args, optional, required=False)