From c4b3ea680c7f77d1056e2ac28b1f76b6e161796f Mon Sep 17 00:00:00 2001
From: Yves Noirjean <yves.noirjean@id.ethz.ch>
Date: Fri, 7 Sep 2018 10:24:00 +0200
Subject: [PATCH] SSDM-7140: refactoring

---
 obis/src/python/obis/dm/data_mgmt.py          | 79 ++++++++++++++++++-
 obis/src/python/obis/scripts/cli.py           | 57 +------------
 obis/src/python/obis/scripts/click_util.py    |  9 ++-
 obis/src/python/obis/scripts/config_util.py   | 19 -----
 .../python/obis/scripts/data_mgmt_runner.py   |  5 +-
 5 files changed, 88 insertions(+), 81 deletions(-)
 delete mode 100644 obis/src/python/obis/scripts/config_util.py

diff --git a/obis/src/python/obis/dm/data_mgmt.py b/obis/src/python/obis/dm/data_mgmt.py
index 5c54b14b3ad..75a08e38acd 100644
--- a/obis/src/python/obis/dm/data_mgmt.py
+++ b/obis/src/python/obis/dm/data_mgmt.py
@@ -10,6 +10,7 @@ Created by Chandrasekhar Ramakrishnan on 2017-02-01.
 Copyright (c) 2017 Chandrasekhar Ramakrishnan. All rights reserved.
 """
 import abc
+import json
 import os
 import shutil
 import traceback
@@ -33,6 +34,7 @@ from .utils import complete_git_config
 from .utils import complete_openbis_config
 from .utils import cd
 from ..scripts import cli
+from ..scripts.click_util import click_echo, check_result
 
 
 # noinspection PyPep8Naming
@@ -315,7 +317,7 @@ class GitDataMgmt(AbstractDataMgmt):
             return CommandResult(returncode=-1, output="Not within a repository and no parent set.")
         # set data_set_id to analysis repository so it will be used as parent when committing
         with cd(path):
-            cli.set_property(self, self.settings_resolver.repository, "data_set_id", parent_data_set_id, False, False)
+            self.set_property(self.settings_resolver.repository, "data_set_id", parent_data_set_id, False, False)
         return result
 
 
@@ -332,9 +334,9 @@ class GitDataMgmt(AbstractDataMgmt):
     def commit(self, msg, auto_add=True, ignore_missing_parent=False, sync=True, path=None):
         if path is not None:
             with cd(path):
-                return self._commit(msg, auto_add, ignore_missing_parent, sync);
+                return self._commit(msg, auto_add, ignore_missing_parent, sync)
         else:
-            return self._commit(msg, auto_add, ignore_missing_parent, sync);
+            return self._commit(msg, auto_add, ignore_missing_parent, sync)
 
 
     @with_restore
@@ -415,3 +417,74 @@ class GitDataMgmt(AbstractDataMgmt):
     def download(self, data_set_id, content_copy_index, file, skip_integrity_check):
         cmd = Download(self, data_set_id, content_copy_index, file, skip_integrity_check)
         return cmd.run()
+
+    #
+    # settings
+    #
+
+    def config(self, resolver, is_global, is_data_set_property, prop=None, value=None, set=False, get=False, clear=False):
+        if set == True:
+            assert get == False
+            assert clear == False
+            assert prop is not None
+            assert value is not None
+        elif get == True:
+            assert set == False
+            assert clear == False
+            assert value is None
+        elif clear == True:
+            assert get == False
+            assert set == False
+            assert value is None
+
+        assert set == True or get == True or clear == True
+        if is_global:
+            resolver.set_location_search_order(['global'])
+        else:
+            top_level_path = self.git_wrapper.git_top_level_path()
+            if top_level_path.success():
+                resolver.set_resolver_location_roots('data_set', top_level_path.output)
+                resolver.set_location_search_order(['local'])
+            else:
+                resolver.set_location_search_order(['global'])
+
+        config_dict = resolver.config_dict()
+        if is_data_set_property:
+            config_dict = config_dict['properties']
+        if get == True:
+            if prop is None:
+                config_str = json.dumps(config_dict, indent=4, sort_keys=True)
+                click_echo("{}".format(config_str), with_timestamp=False)
+            else:
+                if not prop in config_dict:
+                    raise ValueError("Unknown setting {} for {}.".format(prop, resolver.categoty))
+                little_dict = {prop: config_dict[prop]}
+                config_str = json.dumps(little_dict, indent=4, sort_keys=True)
+                click_echo("{}".format(config_str), with_timestamp=False)
+        elif set == True:
+            return check_result("config", self.set_property(resolver, prop, value, is_global, is_data_set_property))
+        elif clear == True:
+            if prop is None:
+                returncode = 0
+                for prop in config_dict.keys():
+                    returncode += check_result("config", self.set_property(resolver, prop, None, is_global, is_data_set_property))
+                return returncode
+            else:
+                return check_result("config", self.set_property(resolver, prop, None, is_global, is_data_set_property))
+
+    def set_property(self, resolver, prop, value, is_global, is_data_set_property=False):
+        """Helper function to implement the property setting semantics."""
+        loc = 'global' if is_global else 'local'
+        try:
+            if is_data_set_property:
+                resolver.set_value_for_json_parameter('properties', prop, value, loc, apply_rules=True)
+            else:
+                resolver.set_value_for_parameter(prop, value, loc, apply_rules=True)
+        except ValueError as e:
+            if self.debug ==  True:
+                raise e
+            return CommandResult(returncode=-1, output="Error: " + str(e))
+        if not is_global:
+            return self.commit_metadata_updates(prop)
+        else:
+            return CommandResult(returncode=0, output="")
diff --git a/obis/src/python/obis/scripts/cli.py b/obis/src/python/obis/scripts/cli.py
index 4e3568f3f48..e889c6977c5 100644
--- a/obis/src/python/obis/scripts/cli.py
+++ b/obis/src/python/obis/scripts/cli.py
@@ -16,14 +16,12 @@ from datetime import datetime
 
 import click
 
-from .. import dm
 from ..dm.command_result import CommandResult
 from ..dm.command_result import CommandException
 from ..dm.utils import cd
 from ..dm.command_log import CommandLog
 from .data_mgmt_runner import DataMgmtRunner
 from .click_util import click_echo, check_result
-from .config_util import set_property
 
 
 def click_progress(progress_data):
@@ -152,57 +150,6 @@ def _join_settings_get(setting_lists):
     return joined
 
 
-def config_internal(data_mgmt, resolver, is_global, is_data_set_property, prop=None, value=None, set=False, get=False, clear=False):
-    if set == True:
-        assert get == False
-        assert clear == False
-        assert prop is not None
-        assert value is not None
-    elif get == True:
-        assert set == False
-        assert clear == False
-        assert value is None
-    elif clear == True:
-        assert get == False
-        assert set == False
-        assert value is None
-
-    assert set == True or get == True or clear == True
-    if is_global:
-        resolver.set_location_search_order(['global'])
-    else:
-        top_level_path = data_mgmt.git_wrapper.git_top_level_path()
-        if top_level_path.success():
-            resolver.set_resolver_location_roots('data_set', top_level_path.output)
-            resolver.set_location_search_order(['local'])
-        else:
-            resolver.set_location_search_order(['global'])
-
-    config_dict = resolver.config_dict()
-    if is_data_set_property:
-        config_dict = config_dict['properties']
-    if get == True:
-        if prop is None:
-            config_str = json.dumps(config_dict, indent=4, sort_keys=True)
-            click.echo("{}".format(config_str))
-        else:
-            if not prop in config_dict:
-                raise ValueError("Unknown setting {} for {}.".format(prop, resolver.categoty))
-            little_dict = {prop: config_dict[prop]}
-            config_str = json.dumps(little_dict, indent=4, sort_keys=True)
-            click.echo("{}".format(config_str))            
-    elif set == True:
-        return check_result("config", set_property(data_mgmt, resolver, prop, value, is_global, is_data_set_property))
-    elif clear == True:
-        if prop is None:
-            returncode = 0
-            for prop in config_dict.keys():
-                returncode += check_result("config", set_property(data_mgmt, resolver, prop, None, is_global, is_data_set_property))
-            return returncode
-        else:
-            return check_result("config", set_property(data_mgmt, resolver, prop, None, is_global, is_data_set_property))
-
-
 def _access_settings(ctx, prop=None, value=None, set=False, get=False, clear=False):
     is_global = ctx.obj['is_global']
     data_mgmt = ctx.obj['data_mgmt']
@@ -210,7 +157,7 @@ def _access_settings(ctx, prop=None, value=None, set=False, get=False, clear=Fal
     is_data_set_property = False
     if 'is_data_set_property' in ctx.obj:
         is_data_set_property = ctx.obj['is_data_set_property']
-    config_internal(data_mgmt, resolver, is_global, is_data_set_property, prop=prop, value=value, set=set, get=get, clear=clear)
+    data_mgmt.config(resolver, is_global, is_data_set_property, prop=prop, value=value, set=set, get=get, clear=clear)
 
 
 def _set(ctx, settings):
@@ -253,7 +200,7 @@ def settings(ctx, is_global):
 @click.pass_context
 def settings_get(ctx):
     runner = DataMgmtRunner(ctx, halt_on_error_log=False)
-    settings = runner.dm.settings_resolver.config_dict()
+    settings = runner.get_settings()
     settings_str = json.dumps(settings, indent=4, sort_keys=True)
     click.echo("{}".format(settings_str))
 
diff --git a/obis/src/python/obis/scripts/click_util.py b/obis/src/python/obis/scripts/click_util.py
index 5ac2e7b3de1..d54984ae424 100644
--- a/obis/src/python/obis/scripts/click_util.py
+++ b/obis/src/python/obis/scripts/click_util.py
@@ -1,9 +1,12 @@
 import click
 from datetime import datetime
 
-def click_echo(message):
-    timestamp = datetime.now().strftime("%H:%M:%S")
-    click.echo("{} {}".format(timestamp, message))
+def click_echo(message, with_timestamp=True):
+    if with_timestamp:
+        timestamp = datetime.now().strftime("%H:%M:%S")
+        click.echo("{} {}".format(timestamp, message))
+    else:
+        click.echo(message)
 
 def check_result(command, result):
     if result.failure():
diff --git a/obis/src/python/obis/scripts/config_util.py b/obis/src/python/obis/scripts/config_util.py
deleted file mode 100644
index beef878e91f..00000000000
--- a/obis/src/python/obis/scripts/config_util.py
+++ /dev/null
@@ -1,19 +0,0 @@
-from ..dm.command_result import CommandResult
-
-
-def set_property(data_mgmt, resolver, prop, value, is_global, is_data_set_property=False):
-    """Helper function to implement the property setting semantics."""
-    loc = 'global' if is_global else 'local'
-    try:
-        if is_data_set_property:
-            resolver.set_value_for_json_parameter('properties', prop, value, loc, apply_rules=True)
-        else:
-            resolver.set_value_for_parameter(prop, value, loc, apply_rules=True)
-    except ValueError as e:
-        if data_mgmt.debug ==  True:
-            raise e
-        return CommandResult(returncode=-1, output="Error: " + str(e))
-    if not is_global:
-        return data_mgmt.commit_metadata_updates(prop)
-    else:
-        return CommandResult(returncode=0, output="")
diff --git a/obis/src/python/obis/scripts/data_mgmt_runner.py b/obis/src/python/obis/scripts/data_mgmt_runner.py
index 8b49f8984ba..f2be2842408 100644
--- a/obis/src/python/obis/scripts/data_mgmt_runner.py
+++ b/obis/src/python/obis/scripts/data_mgmt_runner.py
@@ -10,7 +10,6 @@ from ..dm.command_result import CommandResult
 from ..dm.command_result import CommandException
 from ..dm.command_log import CommandLog
 from .click_util import click_echo, check_result
-from .config_util import set_property
 
 
 class DataMgmtRunner(object):
@@ -48,3 +47,7 @@ class DataMgmtRunner(object):
             click_echo("Error: A previous command did not finish. Please check the log ({}) and remove it when you want to continue using obis".format(log.folder_path))
             sys.exit(-1)
         return dm.DataMgmt(openbis_config=openbis_config, git_config=git_config, log=log, debug=context['debug'])
+
+
+    def get_settings(self):
+        return self.dm.settings_resolver.config_dict()
-- 
GitLab