Source code for autods_pet.manifest
"""Reproducibility manifest for autods_pet pipeline runs."""
from __future__ import annotations
import json
import logging
import platform
import sys
from datetime import datetime, timezone
from importlib.metadata import PackageNotFoundError, version
from pathlib import Path
from typing import Any
log = logging.getLogger(__name__)
_TRACKED_PACKAGES = (
"SimpleITK",
"TotalSegmentator",
"numpy",
"pandas",
"pydicom",
"typer",
"rich",
"openpyxl",
"tqdm",
)
[docs]
def collect_environment() -> dict[str, Any]:
"""Gather software environment information.
Returns
-------
dict
Contains ``autods_pet_version``, ``python_version``,
``platform``, and ``packages`` (name -> version mapping).
"""
from autods_pet import __version__
packages: dict[str, str] = {}
for pkg in _TRACKED_PACKAGES:
try:
packages[pkg] = version(pkg)
except PackageNotFoundError:
packages[pkg] = "not installed"
return {
"autods_pet_version": __version__,
"python_version": sys.version,
"platform": platform.platform(),
"packages": packages,
}
[docs]
def write_manifest(cfg: dict[str, Any], output_dir: Path) -> Path | None:
"""Write a reproducibility manifest to *output_dir*/``manifest.json``.
Parameters
----------
cfg : dict
Full configuration dict used for the pipeline run.
output_dir : Path
Root output directory where the manifest is saved.
Returns
-------
Path or None
Path to the written file, or *None* if writing failed.
"""
manifest = collect_environment()
manifest["config"] = cfg
manifest["timestamp"] = datetime.now(timezone.utc).isoformat()
path = output_dir / "manifest.json"
try:
path.write_text(json.dumps(manifest, indent=2, default=str))
except OSError:
log.warning("Could not write manifest to %s", path, exc_info=True)
return None
return path