From cfb4cfd490efe183af658c63809625d6c06ee5b6 Mon Sep 17 00:00:00 2001 From: Stefano Borini <sborini@enthought.com> Date: Tue, 1 Aug 2017 16:26:43 +0100 Subject: [PATCH] defined input slot maps and its input output as part of the model --- force_bdss/core/input_slot_map.py | 12 +++++++++ .../data_sources/base_data_source_model.py | 18 ++++++++++++- force_bdss/io/workflow_reader.py | 17 ++++++++++-- force_bdss/kpi/base_kpi_calculator_model.py | 18 ++++++++++++- force_bdss/tests/fixtures/test_csv.json | 27 ++++++++++++++++--- 5 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 force_bdss/core/input_slot_map.py diff --git a/force_bdss/core/input_slot_map.py b/force_bdss/core/input_slot_map.py new file mode 100644 index 0000000..d43af95 --- /dev/null +++ b/force_bdss/core/input_slot_map.py @@ -0,0 +1,12 @@ +from traits.api import HasStrictTraits, Enum, String + + +class InputSlotMap(HasStrictTraits): + """Class that specifies the origin of data for the slots of a data source. + """ + #: If MCO, the source is the MCO parameter with name specified at + #: value_name. If Fixed, the value specified in "value" will be used + #: instead. + source = Enum('MCO', 'Fixed') + name = String() + value = String() diff --git a/force_bdss/data_sources/base_data_source_model.py b/force_bdss/data_sources/base_data_source_model.py index cc3f30e..75f7c53 100644 --- a/force_bdss/data_sources/base_data_source_model.py +++ b/force_bdss/data_sources/base_data_source_model.py @@ -1,5 +1,6 @@ -from traits.api import ABCHasStrictTraits, Instance +from traits.api import ABCHasStrictTraits, Instance, List, String +from force_bdss.core.input_slot_map import InputSlotMap from .i_data_source_bundle import IDataSourceBundle @@ -15,6 +16,21 @@ class BaseDataSourceModel(ABCHasStrictTraits): #: retrieve it as the originating factory. bundle = Instance(IDataSourceBundle, visible=False, transient=True) + #: Specifies binding between input slots and source for that value. + #: Each InputSlotMap instance specifies this information for each of the + #: slots. + input_slot_maps = List(Instance(InputSlotMap)) + + #: Allows to assign names to the output slots, so that they can be + #: referenced somewhere else (e.g. the KPICalculators). + output_slot_names = List(String()) + def __init__(self, bundle, *args, **kwargs): self.bundle = bundle super(BaseDataSourceModel, self).__init__(*args, **kwargs) + + def __getstate__(self): + state = super(BaseDataSourceModel, self).__getstate__() + state["input_slot_maps"] = [ + x.__getstate__() for x in self.input_slot_maps + ] diff --git a/force_bdss/io/workflow_reader.py b/force_bdss/io/workflow_reader.py index 44677cf..c55536b 100644 --- a/force_bdss/io/workflow_reader.py +++ b/force_bdss/io/workflow_reader.py @@ -3,6 +3,7 @@ import logging from traits.api import HasStrictTraits, Instance +from force_bdss.core.input_slot_map import InputSlotMap from ..bundle_registry_plugin import BundleRegistryPlugin from ..workspecs.workflow import Workflow @@ -145,7 +146,11 @@ class WorkflowReader(HasStrictTraits): for ds_entry in wf_data["data_sources"]: ds_id = ds_entry["id"] ds_bundle = registry.data_source_bundle_by_id(ds_id) - data_sources.append(ds_bundle.create_model(ds_entry["model_data"])) + model_data = ds_entry["model_data"] + model_data["input_slot_maps"] = self._extract_input_slot_maps( + model_data["input_slot_maps"] + ) + data_sources.append(ds_bundle.create_model(model_data)) return data_sources @@ -169,9 +174,14 @@ class WorkflowReader(HasStrictTraits): for kpic_entry in wf_data["kpi_calculators"]: kpic_id = kpic_entry["id"] kpic_bundle = registry.kpi_calculator_bundle_by_id(kpic_id) + model_data = kpic_entry["model_data"] + model_data["input_slot_maps"] = self._extract_input_slot_maps( + model_data["input_slot_maps"] + ) kpi_calculators.append( - kpic_bundle.create_model(kpic_entry["model_data"])) + kpic_bundle.create_model(model_data) + ) return kpi_calculators @@ -198,3 +208,6 @@ class WorkflowReader(HasStrictTraits): parameters.append(model) return parameters + + def _extract_input_slot_maps(self, maps_data): + return [InputSlotMap(**d) for d in maps_data] diff --git a/force_bdss/kpi/base_kpi_calculator_model.py b/force_bdss/kpi/base_kpi_calculator_model.py index 1b254a9..92794c5 100644 --- a/force_bdss/kpi/base_kpi_calculator_model.py +++ b/force_bdss/kpi/base_kpi_calculator_model.py @@ -1,5 +1,6 @@ -from traits.api import ABCHasStrictTraits, Instance +from traits.api import ABCHasStrictTraits, Instance, List, String +from ..core.input_slot_map import InputSlotMap from .i_kpi_calculator_bundle import IKPICalculatorBundle @@ -15,6 +16,21 @@ class BaseKPICalculatorModel(ABCHasStrictTraits): #: retrieve it as the originating factory. bundle = Instance(IKPICalculatorBundle, visible=False, transient=True) + #: Specifies binding between input slots and source for that value. + #: Each InputSlotMap instance specifies this information for each of the + #: slots. + input_slot_maps = List(Instance(InputSlotMap)) + + #: Allows to assign names to the output slots, so that they can be + #: referenced somewhere else (e.g. the KPICalculators). + output_slot_names = List(String()) + def __init__(self, bundle, *args, **kwargs): self.bundle = bundle super(BaseKPICalculatorModel, self).__init__(*args, **kwargs) + + def __getstate__(self): + state = super(BaseKPICalculatorModel, self).__getstate__() + state["input_slot_maps"] = [ + x.__getstate__() for x in self.input_slot_maps + ] diff --git a/force_bdss/tests/fixtures/test_csv.json b/force_bdss/tests/fixtures/test_csv.json index 726de30..880e66e 100644 --- a/force_bdss/tests/fixtures/test_csv.json +++ b/force_bdss/tests/fixtures/test_csv.json @@ -23,7 +23,12 @@ "filename": "foo.csv", "row": 3, "column": 5, - "cuba_type": "PRESSURE" + "cuba_type": "PRESSURE", + "input_slot_maps": [ + ], + "output_slot_names": [ + "p1" + ] } }, { @@ -32,7 +37,12 @@ "filename": "foo.csv", "row": 3, "column": 5, - "cuba_type": "PRESSURE" + "cuba_type": "PRESSURE", + "input_slot_maps": [ + ], + "output_slot_names": [ + "p2" + ] } } ], @@ -41,7 +51,18 @@ "id": "force.bdss.enthought.bundle.kpi_adder", "model_data": { "cuba_type_in": "PRESSURE", - "cuba_type_out": "TOTAL_PRESSURE" + "cuba_type_out": "TOTAL_PRESSURE", + "input_slot_maps": [ + { + "name": "p1" + }, + { + "name": "p2" + } + ], + "output_slot_names": [ + "ptot" + ] } } ] -- GitLab