Skip to content
Snippets Groups Projects
workflow_writer.py 1.88 KiB
Newer Older
import json
Stefano Borini's avatar
Stefano Borini committed
from traits.api import HasStrictTraits


class WorkflowWriter(HasStrictTraits):
    """A Writer for writing the Workflow onto disk.
    """
    def write(self, workflow, f):
        """Writes the workflow model object to a file f in JSON format.

        Parameters
        ----------
        workflow: Workflow
            The Workflow instance to write to file

        f: File
            A file object on which to write the workflow, properly serialized
            into JSON.
        """
        data = {
            "version": "1",
        }

        data["workflow"] = self._workflow_data(workflow)
        json.dump(data, f)

    def _workflow_data(self, workflow):
        workflow_data = {
            "mco": self._mco_data(workflow.mco),
            "kpi_calculators": [
                self._bundle_model_data(kpic)
                for kpic in workflow.kpi_calculators],
            "data_sources": [
                self._bundle_model_data(ds)
                for ds in workflow.data_sources]
        return workflow_data

    def _mco_data(self, mco):
        """Extracts the data from the MCO object and returns its dictionary.
        If the MCO is None, returns None"""
        if mco is None:
            return None

        data = self._bundle_model_data(mco)

Stefano Borini's avatar
Stefano Borini committed
        parameters_data = []
        for param in data["model_data"]["parameters"]:
Stefano Borini's avatar
Stefano Borini committed
            parameters_data.append(
                {
                    "id": param.factory.id,
                    "model_data": param.__getstate__()
                }
            )
        data["model_data"]["parameters"] = parameters_data
        return data
    def _bundle_model_data(self, bundle_model):
        """
        Extracts the data from a bundle model and returns its dictionary
        """
        return {
            "id": bundle_model.bundle.id,
            "model_data": bundle_model.__getstate__()
        }