diff --git a/force_bdss/data_sources/base_data_source_bundle.py b/force_bdss/data_sources/base_data_source_bundle.py index 6ad3d7667a738d96eb7cfa0ac107c19a88de7b5b..ab53763fd294b025edfefd25b90e8ff200227641 100644 --- a/force_bdss/data_sources/base_data_source_bundle.py +++ b/force_bdss/data_sources/base_data_source_bundle.py @@ -6,22 +6,51 @@ from .i_data_source_bundle import IDataSourceBundle @provides(IDataSourceBundle) class BaseDataSourceBundle(ABCHasStrictTraits): + """Base class for DataSource bundles. Reimplement this class to + create your own DataSource. + """ + # NOTE: changes to this class must be ported also to the IDataSourceBundle + #: 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 + #: A human readable name of the bundle. Spaces allowed name = String() @abc.abstractmethod def create_data_source(self, application, model): """Factory method. Must return the bundle-specific BaseDataSource instance. + + Parameters + ---------- + application: Application + The envisage application. + model: BaseDataSourceModel + The model of the data source, instantiated with create_model() + + Returns + ------- + BaseDataSource + The specific instance of the generated DataSource """ - pass @abc.abstractmethod def create_model(self, model_data=None): """Factory method. - Must return the bundle-specific BaseDataSourceModel instance. + Creates the model object (or network of model objects) of the KPI + calculator. The model can provide a traits UI View according to + traitsui specifications, so that a UI can be provided automatically. + + Parameters + ---------- + model_data: dict or None + A dictionary containing the information to recreate the model. + If None, an empty (with defaults) model will be returned. + + Returns + ------- + BaseDataSourceModel + The model """ diff --git a/force_bdss/data_sources/i_data_source_bundle.py b/force_bdss/data_sources/i_data_source_bundle.py index 5270245c23d05b36fda603bd723d843a6777ecd7..8ed2556078382854920a999ce5c1bf1a8d6ed19f 100644 --- a/force_bdss/data_sources/i_data_source_bundle.py +++ b/force_bdss/data_sources/i_data_source_bundle.py @@ -13,7 +13,6 @@ class IDataSourceBundle(Interface): """Factory method. Must return the bundle-specific BaseDataSource instance. """ - pass def create_model(self, model_data=None): """Factory method. diff --git a/force_bdss/data_sources/tests/test_base_data_source_bundle.py b/force_bdss/data_sources/tests/test_base_data_source_bundle.py new file mode 100644 index 0000000000000000000000000000000000000000..3564a7eb423a4ea3e265b4996be184744c8b1d6f --- /dev/null +++ b/force_bdss/data_sources/tests/test_base_data_source_bundle.py @@ -0,0 +1,23 @@ +import unittest + +from force_bdss.data_sources.base_data_source_bundle import \ + BaseDataSourceBundle + + +class DummyDataSourceBundle(BaseDataSourceBundle): + id = "foo" + + name = "bar" + + def create_data_source(self, application, model): + pass + + def create_model(self, model_data=None): + pass + + +class TestBaseDataSourceBundle(unittest.TestCase): + def test_initialization(self): + bundle = DummyDataSourceBundle() + self.assertEqual(bundle.id, 'foo') + self.assertEqual(bundle.name, 'bar') diff --git a/force_bdss/kpi/base_kpi_calculator_bundle.py b/force_bdss/kpi/base_kpi_calculator_bundle.py index 75705c70f9f587ab1ea3a550a2f86bcb6e1dd564..5ae40637ebae8a75b0fed7089cfa6a629383e11c 100644 --- a/force_bdss/kpi/base_kpi_calculator_bundle.py +++ b/force_bdss/kpi/base_kpi_calculator_bundle.py @@ -6,14 +6,53 @@ from .i_kpi_calculator_bundle import IKPICalculatorBundle @provides(IKPICalculatorBundle) class BaseKPICalculatorBundle(ABCHasStrictTraits): + """Base class for the Key Performance Indicator calculator bundles. + Inherit from this class to create a bundle, and reimplement the abstract + methods. + """ + # NOTE: any changes in this interface must be ported to + # IKPICalculatorBundle + + #: A unique ID generated with bundle_id() routine id = String() + #: A UI friendly name for the bundle. Can contain spaces. name = String() @abc.abstractmethod def create_kpi_calculator(self, application, model): - pass + """Factory method. + Creates and returns an instance of a KPI Calculator, associated + to the given application and model. + + Parameters + ---------- + application: Application + The envisage application. + model: BaseKPICalculatorModel + The model of the calculator, instantiated with create_model() + + Returns + ------- + BaseKPICalculator + The specific instance of the generated KPICalculator + """ @abc.abstractmethod def create_model(self, model_data=None): - pass + """Factory method. + Creates the model object (or network of model objects) of the KPI + calculator. The model can provide a traits UI View according to + traitsui specifications, so that a UI can be provided automatically. + + Parameters + ---------- + model_data: dict or None + A dictionary containing the information to recreate the model. + If None, an empty (with defaults) model will be returned. + + Returns + ------- + BaseKPICalculatorModel + The model + """ diff --git a/force_bdss/kpi/i_kpi_calculator_bundle.py b/force_bdss/kpi/i_kpi_calculator_bundle.py index 84b8f90307b0ab11ded8c21fd8e152015c78421a..938e7de719990cf5e672c1c350adbf36bfca2a31 100644 --- a/force_bdss/kpi/i_kpi_calculator_bundle.py +++ b/force_bdss/kpi/i_kpi_calculator_bundle.py @@ -2,6 +2,8 @@ from traits.api import Interface, String class IKPICalculatorBundle(Interface): + """Envisage required interface for the BaseKPICalculatorBundle. + You should not need to use this directly.""" id = String() name = String() diff --git a/force_bdss/kpi/tests/test_base_kpi_calculator_bundle.py b/force_bdss/kpi/tests/test_base_kpi_calculator_bundle.py new file mode 100644 index 0000000000000000000000000000000000000000..30dc60e7f8a5d4e6ebbc7598b14a03f247b61f3c --- /dev/null +++ b/force_bdss/kpi/tests/test_base_kpi_calculator_bundle.py @@ -0,0 +1,23 @@ +import unittest + +from force_bdss.kpi.base_kpi_calculator_bundle import \ + BaseKPICalculatorBundle + + +class DummyKPICalculatorBundle(BaseKPICalculatorBundle): + id = "foo" + + name = "bar" + + def create_kpi_calculator(self, application, model): + pass + + def create_model(self, model_data=None): + pass + + +class TestBaseKPICalculatorBundle(unittest.TestCase): + def test_initialization(self): + bundle = DummyKPICalculatorBundle() + self.assertEqual(bundle.id, 'foo') + self.assertEqual(bundle.name, 'bar') diff --git a/force_bdss/mco/base_multi_criteria_optimizer_bundle.py b/force_bdss/mco/base_multi_criteria_optimizer_bundle.py index d44f3877d97bfc9e244a28614ccf14014643308d..228ec4c9c3546b6428a1226028af3acabb11c3c8 100644 --- a/force_bdss/mco/base_multi_criteria_optimizer_bundle.py +++ b/force_bdss/mco/base_multi_criteria_optimizer_bundle.py @@ -10,18 +10,67 @@ from force_bdss.mco.i_multi_criteria_optimizer_bundle import ( @provides(IMultiCriteriaOptimizerBundle) class BaseMultiCriteriaOptimizerBundle(ABCHasStrictTraits): + """Base class for the MultiCriteria Optimizer bundle. + """ + # NOTE: any changes to the interface of this class must be replicated + # in the IMultiCriteriaOptimizerBundle interface class. + + #: A unique ID produced with the bundle_id() routine. id = String() + #: A user friendly name of the bundle. Spaces allowed. name = String() @abc.abstractmethod def create_optimizer(self, application, model): - pass + """Factory method. + Creates the optimizer with the given application + and model and returns it to the caller. + + Parameters + ---------- + application: Application + The envisage application instance + model: BaseMCOModel + The model to associate to the optimizer, instantiated through + create_model() + + Returns + ------- + BaseMCOOptimizer + The optimizer + """ @abc.abstractmethod def create_model(self, model_data=None): - pass + """Factory method. + Creates the model object (or network of model objects) of the MCO. + The model can provide a traits UI View according to traitsui + specifications, so that a UI can be provided automatically. + + Parameters + ---------- + model_data: dict or None + A dictionary of data that can be interpreted appropriately to + recreate the model. If None, an empty (with defaults) model will + be created and returned. + + Returns + ------- + BaseMCOModel + The MCOModel + """ @abc.abstractmethod - def create_communicator(self, model_data): - pass + def create_communicator(self, application, model): + """Factory method. Returns the communicator class that allows + exchange between the MCO and the evaluator code. + + Parameters + ---------- + application: Application + The envisage application instance + model: BaseMCOModel + The model to associate to the optimizer, instantiated through + create_model() + """ diff --git a/force_bdss/mco/i_multi_criteria_optimizer_bundle.py b/force_bdss/mco/i_multi_criteria_optimizer_bundle.py index 24557e42c39c27d3913dfb16913d3050b60fb4ab..82a857ae03fc9976247770f8aa095ac9528381a6 100644 --- a/force_bdss/mco/i_multi_criteria_optimizer_bundle.py +++ b/force_bdss/mco/i_multi_criteria_optimizer_bundle.py @@ -2,6 +2,9 @@ from traits.api import Interface, String class IMultiCriteriaOptimizerBundle(Interface): + """Interface for the MultiCriteria Optimizer bundle. + You should not need it, as its main use is for envisage support. + """ id = String() name = String() @@ -12,5 +15,5 @@ class IMultiCriteriaOptimizerBundle(Interface): def create_model(self, model_data=None): pass - def create_communicator(self, model_data): + def create_communicator(self, application, model): pass diff --git a/force_bdss/mco/tests/test_base_multi_criteria_optimizer_bundle.py b/force_bdss/mco/tests/test_base_multi_criteria_optimizer_bundle.py new file mode 100644 index 0000000000000000000000000000000000000000..de89488eb3ae413fb83236c2582618e43535a40f --- /dev/null +++ b/force_bdss/mco/tests/test_base_multi_criteria_optimizer_bundle.py @@ -0,0 +1,27 @@ +import unittest + +from force_bdss.mco.base_multi_criteria_optimizer_bundle import ( + BaseMultiCriteriaOptimizerBundle +) + + +class DummyMCOBundle(BaseMultiCriteriaOptimizerBundle): + id = "foo" + + name = "bar" + + def create_optimizer(self, application, model): + pass + + def create_model(self, model_data=None): + pass + + def create_communicator(self, model_data): + pass + + +class TestBaseDataSourceBundle(unittest.TestCase): + def test_initialization(self): + bundle = DummyMCOBundle() + self.assertEqual(bundle.id, 'foo') + self.assertEqual(bundle.name, 'bar')