From dd72565d49cbd74835b06af0d5407e838be8ccb8 Mon Sep 17 00:00:00 2001
From: Stefano Borini <sborini@enthought.com>
Date: Fri, 14 Jul 2017 15:01:02 +0100
Subject: [PATCH] Added CSV extractor

---
 examples/foo.csv                              | 10 +++++++++
 examples/test_csv.json                        | 18 ++++++++++++++++
 force_bdss/core_mco_driver.py                 |  2 +-
 .../core_plugins/csv_extractor/__init__.py    |  0
 .../csv_extractor/csv_extractor/__init__.py   |  0
 .../csv_extractor/csv_extractor_bundle.py     | 21 +++++++++++++++++++
 .../csv_extractor_data_source.py              | 19 +++++++++++++++++
 .../csv_extractor/csv_extractor_model.py      | 17 +++++++++++++++
 .../csv_extractor/csv_extractor_plugin.py     | 18 ++++++++++++++++
 setup.py                                      |  2 ++
 10 files changed, 106 insertions(+), 1 deletion(-)
 create mode 100644 examples/foo.csv
 create mode 100644 examples/test_csv.json
 create mode 100644 force_bdss/core_plugins/csv_extractor/__init__.py
 create mode 100644 force_bdss/core_plugins/csv_extractor/csv_extractor/__init__.py
 create mode 100644 force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_bundle.py
 create mode 100644 force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_data_source.py
 create mode 100644 force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_model.py
 create mode 100644 force_bdss/core_plugins/csv_extractor/csv_extractor_plugin.py

diff --git a/examples/foo.csv b/examples/foo.csv
new file mode 100644
index 0000000..41d7a2f
--- /dev/null
+++ b/examples/foo.csv
@@ -0,0 +1,10 @@
+0,1,2,3,4,5,6,7
+0,1,2,3,4,5,6,7
+0,1,2,3,4,5,6,7
+0,1,2,3,4,42,6,7
+0,1,2,3,4,5,6,7
+0,1,2,3,4,5,6,7
+0,1,2,3,4,5,6,7
+0,1,2,3,4,5,6,7
+0,1,2,3,4,5,6,7
+0,1,2,3,4,5,6,7
diff --git a/examples/test_csv.json b/examples/test_csv.json
new file mode 100644
index 0000000..e17077c
--- /dev/null
+++ b/examples/test_csv.json
@@ -0,0 +1,18 @@
+{
+  "multi_criteria_optimizer": {
+    "name": "basic",
+    "model_data": {}
+  },
+  "data_sources": [
+    {
+      "name": "csv_extractor",
+      "model_data": {
+        "filename": "foo.csv",
+        "row": 3,
+        "column": 5,
+        "cuba_type": "PRESSURE"
+      }
+    }
+  ]
+}
+
diff --git a/force_bdss/core_mco_driver.py b/force_bdss/core_mco_driver.py
index 57051c1..a7775b5 100644
--- a/force_bdss/core_mco_driver.py
+++ b/force_bdss/core_mco_driver.py
@@ -42,7 +42,7 @@ class CoreMCODriver(Plugin):
                     ds_model = ds_bundle.create_model(requested_ds.model_data)
                     data_source = ds_bundle.create_data_source(
                         self.application, ds_model)
-                    data_source.run()
+                    print(data_source.run())
                 else:
                     raise Exception("Requested data source {} but don't know "
                                     "to find it.".format(requested_ds.name))
diff --git a/force_bdss/core_plugins/csv_extractor/__init__.py b/force_bdss/core_plugins/csv_extractor/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/force_bdss/core_plugins/csv_extractor/csv_extractor/__init__.py b/force_bdss/core_plugins/csv_extractor/csv_extractor/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_bundle.py b/force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_bundle.py
new file mode 100644
index 0000000..ac30500
--- /dev/null
+++ b/force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_bundle.py
@@ -0,0 +1,21 @@
+from traits.api import provides, HasStrictTraits
+from traits.trait_types import String
+
+from force_bdss.data_sources.i_data_source_bundle import IDataSourceBundle
+
+from .csv_extractor_model import CSVExtractorModel
+from .csv_extractor_data_source import CSVExtractorDataSource
+
+
+@provides(IDataSourceBundle)
+class CSVExtractorBundle(HasStrictTraits):
+    name = String("csv_extractor")
+
+    def create_model(self, model_data):
+        return CSVExtractorModel.from_json(model_data)
+
+    def create_ui(self, model):
+        return model.configure_traits()
+
+    def create_data_source(self, application, model):
+        return CSVExtractorDataSource(self, application, model)
diff --git a/force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_data_source.py b/force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_data_source.py
new file mode 100644
index 0000000..f01f355
--- /dev/null
+++ b/force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_data_source.py
@@ -0,0 +1,19 @@
+import csv
+from force_bdss.data_sources.base_data_source import BaseDataSource
+
+
+class CSVExtractorDataSource(BaseDataSource):
+    def run(self):
+        with open(self.model.filename) as csvfile:
+            reader = csv.reader(csvfile)
+            for rowindex, row in enumerate(reader):
+                if rowindex < self.model.row:
+                    continue
+
+                if rowindex == self.model.row:
+                    return {
+                        self.model.cuba_type: row[self.model.column]
+                    }
+
+                return None
+            return None
diff --git a/force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_model.py b/force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_model.py
new file mode 100644
index 0000000..220a64d
--- /dev/null
+++ b/force_bdss/core_plugins/csv_extractor/csv_extractor/csv_extractor_model.py
@@ -0,0 +1,17 @@
+from traits.api import HasStrictTraits, Int, String
+
+
+class CSVExtractorModel(HasStrictTraits):
+    filename = String()
+    row = Int()
+    column = Int()
+    cuba_type = String()
+
+    @classmethod
+    def from_json(cls, json_data):
+        return cls(
+            filename=json_data["filename"],
+            row=json_data["row"],
+            column=json_data["column"],
+            cuba_type=json_data["cuba_type"]
+        )
diff --git a/force_bdss/core_plugins/csv_extractor/csv_extractor_plugin.py b/force_bdss/core_plugins/csv_extractor/csv_extractor_plugin.py
new file mode 100644
index 0000000..8f10341
--- /dev/null
+++ b/force_bdss/core_plugins/csv_extractor/csv_extractor_plugin.py
@@ -0,0 +1,18 @@
+from envisage.plugin import Plugin
+from traits.api import List
+
+from force_bdss.data_sources.i_data_source_bundle import IDataSourceBundle
+
+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'
+    )
+
+    def _data_sources_default(self):
+        return [CSVExtractorBundle()]
diff --git a/setup.py b/setup.py
index 0c1ce48..7288092 100644
--- a/setup.py
+++ b/setup.py
@@ -14,6 +14,8 @@ setup(
             "multi_criteria_optimizers_plugin:MultiCriteriaOptimizersPlugin",
             "data_source = force_bdss.core_plugins.test_data_sources."
             "data_sources_plugin:DataSourcesPlugin",
+            "csv_extractor = force_bdss.core_plugins.csv_extractor"
+            ".csv_extractor_plugin:CSVExtractorPlugin",
         ]
     },
     packages=find_packages(),
-- 
GitLab