Source code for mhm_tools.common.provenance

"""Output provenance helpers."""

from __future__ import annotations

import logging
import shlex
import sys
from datetime import datetime, timezone

import xarray as xr

from mhm_tools import __version__

logger = logging.getLogger(__name__)


VERSION_ATTR = "mhm_tools_version"
CREATED_ATTR = "date_created"
HISTORY_ATTR = "history"
LEGACY_HISTORY_ATTR = "hist"


[docs] def creation_date() -> str: """Return the current creation date as an ISO-8601 UTC timestamp.""" return datetime.now(timezone.utc).replace(microsecond=0).isoformat()
[docs] def apply_output_provenance(ds: xr.Dataset) -> xr.Dataset: """Add mhm-tools version, creation date, and command to NetCDF global attrs.""" ds = ds.copy(deep=False) date = creation_date() if __version__ != "not_available": ds.attrs[VERSION_ATTR] = __version__ ds.attrs[CREATED_ATTR] = date ds.attrs[HISTORY_ATTR] = _append_history( ds.attrs.get(HISTORY_ATTR, ds.attrs.get(LEGACY_HISTORY_ATTR)), f"{date}: mhm-tools command: {_command_string()}", ) return ds
def _append_history(existing_history, new_entry: str) -> str: if existing_history is None or str(existing_history).strip() == "": return new_entry return f"{existing_history}\n{new_entry}" def _command_string() -> str: if not sys.argv: return "<unknown>" return shlex.join(str(arg) for arg in sys.argv)