Source code for dolomite_base.save_object

from typing import Any
from functools import singledispatch, wraps
from .validate_object import validate_object
from importlib import import_module


_save_object_implementations = {
    "GenomicRanges": "dolomite_ranges",
    "GenomicRangesList": "dolomite_ranges",
    "SeqInfo": "dolomite_ranges",

    "ndarray": "dolomite_matrix",
    "csc_matrix": "dolomite_matrix",
    "csr_matrix": "dolomite_matrix",
    "coo_matrix": "dolomite_matrix",
    "DelayedArray": "dolomite_matrix",

    "SummarizedExperiment": "dolomite_se",
    "RangedSummarizedExperiment": "dolomite_se",

    "SingleCellExperiment": "dolomite_sce",
    "MultiAssayExperiment": "dolomite_mae"
}


[docs] @singledispatch def save_object(x: Any, path: str, **kwargs): """ Save an object to its on-disk representation. **dolomite** extensions should define methods for this generic to stage different object classes. Saver methods may accept additional arguments in the ``kwargs``; these should be prefixed by the object type to avoid conflicts (see :py:func:`~dolomite_base.save_data_frame.save_data_frame` for examples). Saver methods should also use the :py:func:`~validate_saves` decorator to ensure that the generated output in ``path`` is valid. Args: x: Object to be saved. path: Path to the output directory. kwargs: Further arguments to be passed to individual methods. Returns: `x` is saved to `path`. """ if hasattr(type(x), "mro"): import sys hierarchy = type(x).mro() for y in hierarchy: nm = y.__name__ if nm not in _save_object_implementations: continue pkg = _save_object_implementations[nm] try: import_module(pkg) # this should hopefully register the methods to the dispatcher. except: raise ModuleNotFoundError("cannot find '" + pkg + "', which contains a 'save_object' method for type '" + type(x).__name__ + "'") return save_object(x, path, **kwargs) raise NotImplementedError("'save_object' is not implemented for type '" + type(x).__name__ + "'")
[docs] def validate_saves(fn): """ Decorator to validate the output of :py:func:`~save_object`. Args: fn: Function that implements a method for ``save_object``. Returns: A wrapped version of the function that validates the directory containing the on-disk representation of the saved object. """ @wraps(fn) def wrapper(x, path, **kwargs): out = fn(x, path, **kwargs) validate_object(path) return out return wrapper