Source code for sc_tools.utils.save
"""
Versioned save utilities: datetime-prefixed filenames for figures and h5ad.
Format: YYDDMM.hh.mm.filename.extension (e.g. 250208.14.30.volcano_faceted.pdf)
"""
from __future__ import annotations
from datetime import datetime
from pathlib import Path
# Default DPI for raster figure exports
DEFAULT_FIGURE_DPI = 300
[docs]
def get_version_prefix(dt: datetime | None = None) -> str:
"""
Return a version prefix string for filenames: YYDDMM.hh.mm.
Parameters
----------
dt : datetime, optional
Use this datetime; if None, uses now().
Returns
-------
str
e.g. "250208.14.30" for 2025-02-08 14:30
"""
if dt is None:
dt = datetime.now()
return dt.strftime("%y%d%m.%H.%M")
[docs]
def versioned_filename(basename: str, ext: str, dt: datetime | None = None) -> str:
"""
Build a versioned filename: YYDDMM.hh.mm.basename.ext (no path).
Parameters
----------
basename : str
Base name (no extension), e.g. "volcano_faceted"
ext : str
Extension without dot, e.g. "pdf" or "png"
dt : datetime, optional
Use this datetime; if None, uses now().
Returns
-------
str
e.g. "250208.14.30.volcano_faceted.pdf"
"""
prefix = get_version_prefix(dt)
ext = ext.lstrip(".")
return f"{prefix}.{basename}.{ext}"
[docs]
def versioned_path(
base_dir: str | Path,
basename: str,
ext: str,
subdir: str | None = None,
dt: datetime | None = None,
) -> Path:
"""
Build full path for a versioned file, optionally under a subdir (e.g. pdf/, png/).
Parameters
----------
base_dir : str or Path
Root output directory (e.g. figures/process_colocalization)
basename : str
Base name (no extension)
ext : str
Extension without dot (e.g. "pdf", "png")
subdir : str, optional
Subdirectory under base_dir (e.g. "pdf", "png"). Created if missing.
dt : datetime, optional
Use this datetime; if None, uses now().
Returns
-------
Path
e.g. base_dir/pdf/250208.14.30.volcano_faceted.pdf
"""
base_dir = Path(base_dir)
if subdir:
base_dir = base_dir / subdir
base_dir.mkdir(parents=True, exist_ok=True)
fname = versioned_filename(basename, ext, dt=dt)
return base_dir / fname