Skip to content
Snippets Groups Projects
Commit 98daaa9a authored by Stefano Borini's avatar Stefano Borini
Browse files

Readapted IO layer

parent 801d7e76
No related branches found
No related tags found
1 merge request!45Added support for MCO named parameters.
......@@ -7,7 +7,8 @@ from .bundle_registry_plugin import (
)
from .io.workflow_reader import WorkflowReader
from .workspecs.workflow import Workflow
from .mco.parameters.parameter_factory_registry import ParameterFactoryRegistry
from .mco.parameters.mco_parameter_factory_registry import (
MCOParameterFactoryRegistry)
from .mco.parameters.core_mco_parameters import all_core_factories
......@@ -16,9 +17,11 @@ class BaseCoreDriver(Plugin):
or the evaluation.
"""
#: The registry of the bundles.
bundle_registry = Instance(BundleRegistryPlugin)
parameter_factory_registry = Instance(ParameterFactoryRegistry)
#: The registry of the MCO parameters
parameter_factory_registry = Instance(MCOParameterFactoryRegistry)
#: Deserialized content of the workflow file.
workflow = Instance(Workflow)
......@@ -27,7 +30,7 @@ class BaseCoreDriver(Plugin):
return self.application.get_plugin(BUNDLE_REGISTRY_PLUGIN_ID)
def _parameter_factory_registry_default(self):
registry = ParameterFactoryRegistry()
registry = MCOParameterFactoryRegistry()
for f in all_core_factories():
self.register(f)
......
......@@ -6,6 +6,8 @@ from force_bdss.bundle_registry_plugin import BundleRegistryPlugin
from force_bdss.io.workflow_reader import (
WorkflowReader,
InvalidVersionException, InvalidFileException)
from force_bdss.mco.parameters.mco_parameter_factory_registry import \
MCOParameterFactoryRegistry
try:
import mock
......@@ -16,7 +18,12 @@ except ImportError:
class TestWorkflowReader(unittest.TestCase):
def setUp(self):
self.mock_bundle_registry = mock.Mock(spec=BundleRegistryPlugin)
self.wfreader = WorkflowReader(self.mock_bundle_registry)
self.mock_mco_parameter_registry = mock.Mock(
spec=MCOParameterFactoryRegistry)
self.wfreader = WorkflowReader(
self.mock_bundle_registry,
self.mock_mco_parameter_registry)
def test_initialization(self):
self.assertEqual(self.wfreader.bundle_registry,
......
......@@ -4,13 +4,18 @@ from six import StringIO
from force_bdss.bundle_registry_plugin import BundleRegistryPlugin
from force_bdss.io.workflow_reader import WorkflowReader
from force_bdss.mco.parameters.base_mco_parameter import BaseMCOParameter
from force_bdss.mco.parameters.base_mco_parameter_factory import \
BaseMCOParameterFactory
from force_bdss.mco.parameters.mco_parameter_factory_registry import \
MCOParameterFactoryRegistry
try:
import mock
except ImportError:
from unittest import mock
from force_bdss.ids import bundle_id
from force_bdss.ids import bundle_id, mco_parameter_id
from force_bdss.io.workflow_writer import WorkflowWriter
from force_bdss.mco.base_mco_model import BaseMCOModel
from force_bdss.mco.i_multi_criteria_optimizer_bundle import \
......@@ -33,6 +38,9 @@ class TestWorkflowWriter(unittest.TestCase):
self.mock_registry.mco_bundle_by_id = mock.Mock(
return_value=mock_mco_bundle)
self.mock_mco_parameter_registry = mock.Mock(
spec=MCOParameterFactoryRegistry)
def test_write(self):
wfwriter = WorkflowWriter()
fp = StringIO()
......@@ -51,7 +59,8 @@ class TestWorkflowWriter(unittest.TestCase):
wf = self._create_mock_workflow()
wfwriter.write(wf, fp)
fp.seek(0)
wfreader = WorkflowReader(self.mock_registry)
wfreader = WorkflowReader(self.mock_registry,
self.mock_mco_parameter_registry)
wf_result = wfreader.read(fp)
self.assertEqual(wf_result.multi_criteria_optimizer.bundle.id,
wf.multi_criteria_optimizer.bundle.id)
......@@ -62,4 +71,12 @@ class TestWorkflowWriter(unittest.TestCase):
mock.Mock(
spec=IMultiCriteriaOptimizerBundle,
id=bundle_id("enthought", "mock")))
wf.multi_criteria_optimizer.parameters = [
BaseMCOParameter(
factory=mock.Mock(
spec=BaseMCOParameterFactory,
id=mco_parameter_id("enthought", "mock")
)
)
]
return wf
......@@ -3,8 +3,8 @@ import logging
from traits.api import HasStrictTraits, Instance
from ..mco.parameters.parameter_factory_registry import (
ParameterFactoryRegistry)
from ..mco.parameters.mco_parameter_factory_registry import (
MCOParameterFactoryRegistry)
from ..bundle_registry_plugin import BundleRegistryPlugin
from ..workspecs.workflow import Workflow
......@@ -27,7 +27,10 @@ class WorkflowReader(HasStrictTraits):
#: The bundle registry. The reader needs it to create the
#: bundle-specific model objects.
bundle_registry = Instance(BundleRegistryPlugin)
mco_parameter_registry = Instance(ParameterFactoryRegistry)
#: The registry for the MCO parameters. At the moment this
#: is not extensible via plugins as the one above.
mco_parameter_registry = Instance(MCOParameterFactoryRegistry)
def __init__(self,
bundle_registry,
......@@ -126,7 +129,7 @@ class WorkflowReader(HasStrictTraits):
model = mco_bundle.create_model(
wf_data["multi_criteria_optimizer"]["model_data"])
model.parameters = self._extract_mco_parameters(
wf_data["multi_criteria_optimizer"]["parameters"])
wf_data["multi_criteria_optimizer"]["model_data"]["parameters"])
return model
def _extract_data_sources(self, wf_data):
......
......@@ -27,14 +27,19 @@ class WorkflowWriter(HasStrictTraits):
"id": workflow.multi_criteria_optimizer.bundle.id,
"model_data": workflow.multi_criteria_optimizer.__getstate__()
}
wf_data["multi_criteria_optimizer"]["parameters"] = []
for param in workflow.multi_criteria_optimizer.parameters:
wf_data["multi_criteria_optimizer"]["parameters"].append(
parameters_data = []
for param in wf_data["multi_criteria_optimizer"]["model_data"]["parameters"]: # noqa
parameters_data.append(
{
"id": param.factory.id,
"model_data": param.__getstate__()
}
)
wf_data["multi_criteria_optimizer"]["model_data"]["parameters"] = parameters_data # noqa
kpic_data = []
for kpic in workflow.kpi_calculators:
kpic_data.append({
......
......@@ -9,8 +9,14 @@ class BaseMCOParameter(HasStrictTraits):
Must be reimplemented by specific classes handling the specific parameter
that MCOs understand.
"""
factory = Instance(BaseMCOParameterFactory)
#: The generating factory. Used to retrieve the ID at serialization.
factory = Instance(BaseMCOParameterFactory, visible=False, transient=True)
#: A user defined name for the parameter
value_name = String()
#: A CUBA key describing the type of the parameter
value_type = String()
def __init__(self, factory, *args, **kwargs):
......
......@@ -4,7 +4,7 @@ from force_bdss.mco.parameters.base_mco_parameter_factory import \
BaseMCOParameterFactory
class ParameterFactoryRegistry(HasStrictTraits):
class MCOParameterFactoryRegistry(HasStrictTraits):
"""Registry to keep the parameter factories and lookup them.
"""
# Temp: this will become an extension point.
......
import unittest
from force_bdss.mco.parameters.base_mco_parameter_factory import \
BaseMCOParameterFactory
try:
import mock
except ImportError:
from unittest import mock
from force_bdss.mco.parameters.base_mco_parameter import BaseMCOParameter
class DummyParameter(BaseMCOParameter):
pass
class TestBaseMCOParameter(unittest.TestCase):
def test_instantiation(self):
factory = mock.Mock(spec=BaseMCOParameterFactory)
param = DummyParameter(factory)
self.assertEqual(param.factory, factory)
import unittest
from force_bdss.mco.parameters.parameter_factory_registry import \
ParameterFactoryRegistry
from force_bdss.mco.parameters.mco_parameter_factory_registry import \
MCOParameterFactoryRegistry
class TestParameterFactoryRegistry(unittest.TestCase):
def test_registry_init(self):
reg = ParameterFactoryRegistry()
reg = MCOParameterFactoryRegistry()
self.assertEqual(reg.factories, {})
......@@ -4,7 +4,6 @@
"multi_criteria_optimizer": {
"id": "force.bdss.bundles.enthought.dakota",
"model_data": {
"value_types": ["DUMMY"]
}
},
"data_sources": [
......
......@@ -6,7 +6,7 @@ from force_bdss.ids import bundle_id
class TestIdGenerators(unittest.TestCase):
def test_bundle_id(self):
self.assertEqual(bundle_id("foo", "bar"),
"force.bdss.bundles.foo.bar")
"force.bdss.bundle.foo.bar")
for bad_entry in ["", None, " ", "foo bar"]:
with self.assertRaises(ValueError):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment