Source code for dubfi.meta

# Copyright 2025 DWD
# SPDX-License-Identifier: BSD-3-Clause

"""Common metadata for netCDF output.

.. codeauthor:: Valentin Bruch, DWD <valentin.bruch@dwd.de>
.. versionadded:: 0.1.0 (initial release)
"""

import functools
import os
import sys
from datetime import datetime, timezone
from importlib.metadata import PackageNotFoundError, metadata

from . import __version__, log


[docs] @functools.cache def package_info() -> dict[str, str]: """Get package information including versions of dependencies.""" info = dict(pkg_version_dubfi=__version__, python_version=sys.version) for pkg in ( "numpy", "scipy", "pandas", "xarray", "netCDF4", "mpi4py", "PyYAML", "numba", "llvmlite", ): try: info[f"pkg_version_{pkg:s}"] = metadata(pkg)["version"] except PackageNotFoundError: log.warning(f"Package not found: {pkg}") info[f"pkg_version_{pkg:s}"] = "unknown" return info
[docs] def common_info() -> dict[str, str]: """Return common metadata that can be saved to netCDF output.""" info = package_info() user = os.environ.get("USER", "unknown") host = os.environ.get("HOST", os.environ.get("HOSTNAME", "unknown")) info.update( creating_software="dubfi", creating_user=f"{user:s}@{host:s}", creation_date=datetime.now(timezone.utc).isoformat(), ) return info
[docs] def add_common_metadata(attrs: dict[str, str]) -> None: """Update given dict by adding common metadata.""" attrs.update(common_info()) if "history" in attrs: attrs["history"] = ( f"{attrs['creating_software']:s} by {attrs['creating_user']:s} on {attrs['creation_date']:s}; {attrs['history']:s}" ) else: attrs["history"] = ( f"{attrs['creating_software']:s} by {attrs['creating_user']:s} on {attrs['creation_date']:s}" )