Skip to content
Snippets Groups Projects
Commit 5704237c authored by Stefano Borini's avatar Stefano Borini Committed by GitHub
Browse files

Merge pull request #20 from force-h2020/use-ids-instead-of-names

Use ids instead of names in bundles.
parents 7352e20f 72d1a08a
No related branches found
No related tags found
No related merge requests found
Showing
with 111 additions and 30 deletions
......@@ -37,27 +37,27 @@ class BaseCoreDriver(Plugin):
List(IKPICalculatorBundle),
id='force.bdss.kpi_calculators.bundles')
def _data_source_bundle_by_name(self, name):
def _data_source_bundle_by_id(self, id):
for ds in self.data_source_bundles:
if ds.name == name:
if ds.id == id:
return ds
raise Exception("Requested data source {} but don't know "
"to find it.".format(name))
"to find it.".format(id))
def _kpi_calculator_bundle_by_name(self, name):
def _kpi_calculator_bundle_by_id(self, id):
for kpic in self.kpi_calculator_bundles:
if kpic.name == name:
if kpic.id == id:
return kpic
raise Exception(
"Requested kpi calculator {} but don't know "
"to find it.".format(name))
"to find it.".format(id))
def _mco_bundle_by_name(self, name):
def _mco_bundle_by_id(self, id):
for mco in self.mco_bundles:
if mco.name == name:
if mco.id == id:
return mco
raise Exception("Requested MCO {} but it's not available"
"to compute it.".format(name))
"to compute it.".format(id))
......@@ -2,6 +2,11 @@ import click
from ..bdss_application import BDSSApplication
# Makes the application rethrow the exception so that it exits return code
# different from zero.
from traits.api import push_exception_handler
push_exception_handler(reraise_exceptions=True)
@click.command()
@click.option("--evaluate", is_flag=True)
......
File moved
{
"multi_criteria_optimizer": {
"name": "dakota",
"id": "force.bdss.bundles.enthought.dakota",
"model_data": {
"value_types": ["DUMMY"]
}
},
"data_sources": [
{
"name": "csv_extractor",
"id": "force.bdss.bundles.enthought.csv_extractor",
"model_data": {
"filename": "foo.csv",
"row": 3,
......@@ -16,7 +16,7 @@
}
},
{
"name": "csv_extractor",
"id": "force.bdss.bundles.enthought.csv_extractor",
"model_data": {
"filename": "foo.csv",
"row": 3,
......@@ -27,7 +27,7 @@
],
"kpi_calculators": [
{
"name": "kpi_adder",
"id": "force.bdss.bundles.enthought.kpi_adder",
"model_data": {
"cuba_type_in": "PRESSURE",
"cuba_type_out": "TOTAL_PRESSURE"
......
import unittest
import subprocess
import os
from contextlib import contextmanager
@contextmanager
def cd(dir):
cwd = os.curdir
os.chdir(dir)
try:
yield
finally:
os.chdir(cwd)
def fixture_dir():
return os.path.join(
os.path.dirname(os.path.abspath(__file__)),
"fixtures")
class TestExecution(unittest.TestCase):
def test_plain_invocation_mco(self):
with cd(fixture_dir()):
out = subprocess.check_call(["force_bdss", "test_csv.json"])
self.assertEqual(out, 0)
if __name__ == '__main__':
unittest.main()
......@@ -13,7 +13,7 @@ class CoreEvaluationDriver(BaseCoreDriver):
workflow = self.application.workflow
mco_data = workflow.multi_criteria_optimizer
mco_bundle = self._mco_bundle_by_name(mco_data.name)
mco_bundle = self._mco_bundle_by_id(mco_data.id)
mco_model = mco_bundle.create_model(mco_data.model_data)
mco_communicator = mco_bundle.create_communicator(
self.application,
......@@ -23,8 +23,8 @@ class CoreEvaluationDriver(BaseCoreDriver):
ds_results = []
for requested_ds in workflow.data_sources:
ds_bundle = self._data_source_bundle_by_name(
requested_ds.name)
ds_bundle = self._data_source_bundle_by_id(
requested_ds.id)
ds_model = ds_bundle.create_model(requested_ds.model_data)
data_source = ds_bundle.create_data_source(
self.application, ds_model)
......@@ -32,8 +32,8 @@ class CoreEvaluationDriver(BaseCoreDriver):
kpi_results = []
for requested_kpic in workflow.kpi_calculators:
kpic_bundle = self._kpi_calculator_bundle_by_name(
requested_kpic.name)
kpic_bundle = self._kpi_calculator_bundle_by_id(
requested_kpic.id)
ds_model = kpic_bundle.create_model(
requested_kpic.model_data)
kpi_calculator = kpic_bundle.create_data_source(
......
......@@ -13,7 +13,7 @@ class CoreMCODriver(BaseCoreDriver):
workflow = self.application.workflow
mco_data = workflow.multi_criteria_optimizer
mco_bundle = self._mco_bundle_by_name(mco_data.name)
mco_bundle = self._mco_bundle_by_id(mco_data.id)
mco_model = mco_bundle.create_model(mco_data.model_data)
mco = mco_bundle.create_optimizer(self.application, mco_model)
......
......@@ -2,6 +2,7 @@ from traits.api import provides, HasStrictTraits
from traits.trait_types import String
from force_bdss.data_sources.i_data_source_bundle import IDataSourceBundle
from force_bdss.id_generators import bundle_id
from .csv_extractor_model import CSVExtractorModel
from .csv_extractor_data_source import CSVExtractorDataSource
......@@ -9,7 +10,7 @@ from .csv_extractor_data_source import CSVExtractorDataSource
@provides(IDataSourceBundle)
class CSVExtractorBundle(HasStrictTraits):
name = String("csv_extractor")
id = String(bundle_id("enthought", "csv_extractor"))
def create_model(self, model_data=None):
if model_data is None:
......
......@@ -7,8 +7,6 @@ from .csv_extractor.csv_extractor_bundle import CSVExtractorBundle
class CSVExtractorPlugin(Plugin):
id = "force.bdss.data_sources.csv_extractor"
data_sources = List(
IDataSourceBundle,
contributes_to='force.bdss.data_sources.bundles'
......
from traits.api import provides, HasStrictTraits
from traits.trait_types import String
from force_bdss.id_generators import bundle_id
from force_bdss.kpi.i_kpi_calculator_bundle import IKPICalculatorBundle
from .kpi_adder_model import KPIAdderModel
......@@ -9,7 +10,7 @@ from .kpi_adder_calculator import KPIAdderCalculator
@provides(IKPICalculatorBundle)
class KPIAdderBundle(HasStrictTraits):
name = String("kpi_adder")
id = String(bundle_id("enthought", "kpi_adder"))
def create_model(self, model_data=None):
if model_data is None:
......
......@@ -8,8 +8,6 @@ from .kpi_adder.kpi_adder_bundle import KPIAdderBundle
class TestKPICalculatorPlugin(Plugin):
id = "force.bdss.kpi_calculators.test_kpi_calculator_plugin"
kpi_calculators = List(
IKPICalculatorBundle,
contributes_to='force.bdss.kpi_calculators.bundles'
......
......@@ -3,6 +3,7 @@ from traits.trait_types import String
from force_bdss.core_plugins.test_mco.dakota.dakota_communicator import \
DakotaCommunicator
from force_bdss.id_generators import bundle_id
from force_bdss.mco.i_multi_criteria_optimizer_bundle import (
IMultiCriteriaOptimizerBundle)
......@@ -12,7 +13,7 @@ from .dakota_optimizer import DakotaOptimizer
@provides(IMultiCriteriaOptimizerBundle)
class DakotaBundle(HasStrictTraits):
name = String("dakota")
id = String(bundle_id("enthought", "dakota"))
def create_model(self, model_data=None):
if model_data is None:
......
......@@ -8,8 +8,6 @@ from .dakota.dakota_bundle import DakotaBundle
class MultiCriteriaOptimizersPlugin(Plugin):
id = "force.bdss.mco.plugins.multi_criteria_optimizers_plugin"
multi_criteria_optimizers = List(
IMultiCriteriaOptimizerBundle,
contributes_to='force.bdss.mco.bundles'
......
......@@ -2,6 +2,11 @@ from traits.api import Interface, String
class IDataSourceBundle(Interface):
#: Unique identifier that identifies the bundle uniquely in the
#: universe of bundles. Create one with the function bundle_id()
id = String()
#: A human readable name of the bundle
name = String()
def create_data_source(self, application, model):
......
import six
def bundle_id(producer, identifier):
"""Creates an id for the bundle.
Parameters
----------
producer: str
the company or research institute unique identifier (e.g. "enthought")
identifier: str
A unique identifier for the bundle. The producer has authority and
control over the uniqueness of this identifier.
Returns
-------
str: an identifier to be used in the bundle.
"""
def is_valid(entry):
return (
isinstance(entry, six.string_types) and
" " not in entry and
len(entry) != 0)
if not all(map(is_valid, [producer, identifier])):
raise ValueError("Invalid parameters specified.")
return "force.bdss.bundles.{}.{}".format(producer, identifier)
......@@ -2,7 +2,7 @@ from traits.api import Interface, String
class IKPICalculatorBundle(Interface):
name = String()
id = String()
def create_kpi_calculator(self, application, model):
pass
......
......@@ -2,7 +2,7 @@ from traits.api import Interface, String
class IMultiCriteriaOptimizerBundle(Interface):
name = String()
id = String()
def create_optimizer(self, application, model):
pass
......
import unittest
from force_bdss.id_generators import bundle_id
class TestIdGenerators(unittest.TestCase):
def test_bundle_id(self):
self.assertEqual(bundle_id("foo", "bar"),
"force.bdss.bundles.foo.bar")
for bad_entry in ["", None, " ", "foo bar"]:
with self.assertRaises(ValueError):
bundle_id(bad_entry, "bar")
with self.assertRaises(ValueError):
bundle_id("foo", bad_entry)
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