diff --git a/force_bdss/core/input_slot_map.py b/force_bdss/core/input_slot_map.py new file mode 100644 index 0000000000000000000000000000000000000000..d43af9550c5a5432f5af956197bc39b24f542e88 --- /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 cc3f30ea2f0c37f693fa222e5783a96d04654fa2..75f7c5396c13e869f270bd22bc5713080dbfb624 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 44677cf92b767fab18496bae2b972061ed3dd8fd..c55536ba8343d4bf19efc5c69b223e205a72b399 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 1b254a96b5198709e437b8a90187730caafe2919..92794c57b5471a95a27604bfe22bd6dc7ba9b2ad 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 726de30843d158ec3b1aeb4afcc96e92b9ecaa5d..880e66ee9afa5f3b4a8ebcd7ac0c364d5474ffff 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" + ] } } ]