From f00f0498f95462c905b916d4752d7d71ad4b3c7e Mon Sep 17 00:00:00 2001
From: Yves Noirjean <yves.noirjean@id.ethz.ch>
Date: Tue, 27 Mar 2018 12:06:42 +0200
Subject: [PATCH] obis: more convenient way to set data set properties

---
 .../14_config_data_set_properties_1.sh         |  6 ++++++
 .../14_config_data_set_properties_2.sh         |  6 ++++++
 .../integration_tests/integration_tests.py     |  9 ++++++++-
 src/python/OBis/obis/dm/config.py              | 18 ++++++------------
 src/python/OBis/obis/scripts/cli.py            | 11 +++++++----
 5 files changed, 33 insertions(+), 17 deletions(-)
 create mode 100755 src/python/OBis/integration_tests/14_config_data_set_properties_1.sh
 create mode 100755 src/python/OBis/integration_tests/14_config_data_set_properties_2.sh

diff --git a/src/python/OBis/integration_tests/14_config_data_set_properties_1.sh b/src/python/OBis/integration_tests/14_config_data_set_properties_1.sh
new file mode 100755
index 00000000000..fca02931ed0
--- /dev/null
+++ b/src/python/OBis/integration_tests/14_config_data_set_properties_1.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+cd $1/obis_data
+obis init data8 && cd data8
+obis config -p a 0
+
diff --git a/src/python/OBis/integration_tests/14_config_data_set_properties_2.sh b/src/python/OBis/integration_tests/14_config_data_set_properties_2.sh
new file mode 100755
index 00000000000..02cfccc8ac7
--- /dev/null
+++ b/src/python/OBis/integration_tests/14_config_data_set_properties_2.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+cd $1/obis_data/data8
+obis config data_set_properties '{ "a": "0", "b": "1", "c": "2"}'
+obis config -p c 3
+
diff --git a/src/python/OBis/integration_tests/integration_tests.py b/src/python/OBis/integration_tests/integration_tests.py
index f134ba5a8e9..0640be5f1a4 100644
--- a/src/python/OBis/integration_tests/integration_tests.py
+++ b/src/python/OBis/integration_tests/integration_tests.py
@@ -60,7 +60,6 @@ def test_obis(tmpdir):
     data_set = o.get_dataset(config['data_set_id']).data
     assert_matching(config, data_set, tmpdir, 'obis_data/data1')
 
-
     # 3. Second commit
     config_before = json.loads(run('./00_get_config.sh', tmpdir + '/obis_data/data1'))
     result = run('./03_second_commit_1_commit.sh', tmpdir)
@@ -189,3 +188,11 @@ def test_obis(tmpdir):
     assert_matching(config, data_set, tmpdir, 'obis_data/data7')
     result = run('./13_sync_2_only_sync.sh', tmpdir)
     assert 'Nothing to sync' in result
+
+    # 14. Configure data set properties
+    result = run('./14_config_data_set_properties_1.sh', tmpdir)
+    config = json.loads(run('./00_get_config.sh', tmpdir + '/obis_data/data8'))
+    assert config['data_set_properties'] == { 'a': '0' }
+    result = run('./14_config_data_set_properties_2.sh', tmpdir)
+    config = json.loads(run('./00_get_config.sh', tmpdir + '/obis_data/data8'))
+    assert config['data_set_properties'] == { 'a': '0', 'b': '1', 'c': '3' }
diff --git a/src/python/OBis/obis/dm/config.py b/src/python/OBis/obis/dm/config.py
index 019aeaf924e..a10eb8e6c7e 100644
--- a/src/python/OBis/obis/dm/config.py
+++ b/src/python/OBis/obis/dm/config.py
@@ -216,20 +216,13 @@ class ConfigResolverImpl(object):
         if not param.is_json:
             raise ValueError('Can not set json value for non-json parameter: ' + json_param_name)
 
-        import pdb; pdb.set_trace()
-        # TODO
-        json_value = json.loads(self.value_for_parameter(param, loc))
+        json_value = self.value_for_parameter(param, loc)
+        if json_value is None:
+            json_value = {}
         json_value[name] = value
 
-        location_config_dict = self.set_cache_value_for_parameter(param, value, loc)
-        location_path = param.location_path(loc)
-        location = self.env.location_at_path(location_path)
-        location_dir_path = self.location_resolver.resolve_location(location)
-        if not os.path.exists(location_dir_path):
-            os.makedirs(location_dir_path)
-        config_path = os.path.join(location_dir_path, self.config_file)
-        with open(config_path, "w") as f:
-            json.dump(location_config_dict, f, sort_keys=True)
+        self.set_value_for_parameter(json_param_name, json_value, loc)
+
 
     def value_for_parameter(self, param, loc):
         config = self.location_cache[loc]
@@ -289,6 +282,7 @@ class ConfigResolver(object):
         for resolver in self.resolvers:
             if name in resolver.env.params:
                 return resolver.set_value_for_parameter(name, value, loc)
+        raise ValueError('Config does not exist: ' + name)
 
     def set_value_for_json_parameter(self, json_param_name, name, value, loc):
         for resolver in self.resolvers:
diff --git a/src/python/OBis/obis/scripts/cli.py b/src/python/OBis/obis/scripts/cli.py
index 31f73483f4a..3340facdeaf 100644
--- a/src/python/OBis/obis/scripts/cli.py
+++ b/src/python/OBis/obis/scripts/cli.py
@@ -138,10 +138,13 @@ def set_property(data_mgmt, prop, value, is_global, is_data_set_property):
     """Helper function to implement the property setting semantics."""
     loc = 'global' if is_global else 'local'
     resolver = data_mgmt.config_resolver
-    if is_data_set_property:
-        resolver.set_value_for_json_parameter('data_set_properties', prop, value, loc)
-    else:
-        resolver.set_value_for_parameter(prop, value, loc)
+    try:
+        if is_data_set_property:
+            resolver.set_value_for_json_parameter('data_set_properties', prop, value, loc)
+        else:
+            resolver.set_value_for_parameter(prop, value, loc)
+    except ValueError as e:
+        return CommandResult(returncode=-1, output="Error: " + str(e))
     if not is_global:
         return data_mgmt.commit_metadata_updates(prop)
     else:
-- 
GitLab