From 3ea2eece93438de061fecb29baa38821071aca65 Mon Sep 17 00:00:00 2001
From: Chandrasekhar Ramakrishnan <chandrasekhar.ramakrishnan@id.ethz.ch>
Date: Thu, 2 Feb 2017 11:35:17 +0100
Subject: [PATCH] SSDM-4670: Implement structure for obis commands.

---
 src/python/OBis/obis/__init__.py          |  1 +
 src/python/OBis/obis/conftest.py          | 21 ++++++
 src/python/OBis/obis/dm/__init__.py       | 12 ++++
 src/python/OBis/obis/dm/data_mgmt.py      | 88 +++++++++++++++++++++++
 src/python/OBis/obis/dm/data_mgmt_test.py | 17 +++++
 5 files changed, 139 insertions(+)
 create mode 100644 src/python/OBis/obis/conftest.py
 create mode 100644 src/python/OBis/obis/dm/__init__.py
 create mode 100644 src/python/OBis/obis/dm/data_mgmt.py
 create mode 100644 src/python/OBis/obis/dm/data_mgmt_test.py

diff --git a/src/python/OBis/obis/__init__.py b/src/python/OBis/obis/__init__.py
index ef4501d1cfe..3998a335320 100644
--- a/src/python/OBis/obis/__init__.py
+++ b/src/python/OBis/obis/__init__.py
@@ -1,3 +1,4 @@
 __author__ = 'Chandrasekhar Ramakrishnan <chandrasekhar.ramakrishnan@id.ethz.ch>'
 __version__ = '0.1.0'
 
+from .dm import *
diff --git a/src/python/OBis/obis/conftest.py b/src/python/OBis/obis/conftest.py
new file mode 100644
index 00000000000..62e900b6617
--- /dev/null
+++ b/src/python/OBis/obis/conftest.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+conftest.py
+
+Global fixtures for tests.
+
+Created by Chandrasekhar Ramakrishnan on 2017-02-02.
+Copyright (c) 2017 Chandrasekhar Ramakrishnan. All rights reserved.
+"""
+
+import pytest
+from . import dm
+
+pytest.fixture(scope="session")
+
+
+def shared_obis():
+    git_config = {'find_git': True}
+    return dm.DataMgmt(git_config=git_config)
diff --git a/src/python/OBis/obis/dm/__init__.py b/src/python/OBis/obis/dm/__init__.py
new file mode 100644
index 00000000000..a7bb27293c9
--- /dev/null
+++ b/src/python/OBis/obis/dm/__init__.py
@@ -0,0 +1,12 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+__init__.py
+
+
+Created by Chandrasekhar Ramakrishnan on 2017-02-01.
+Copyright (c) 2017 Chandrasekhar Ramakrishnan. All rights reserved.
+"""
+
+from .data_mgmt import *
diff --git a/src/python/OBis/obis/dm/data_mgmt.py b/src/python/OBis/obis/dm/data_mgmt.py
new file mode 100644
index 00000000000..424f7f21898
--- /dev/null
+++ b/src/python/OBis/obis/dm/data_mgmt.py
@@ -0,0 +1,88 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+data_mgmt.py
+
+Module implementing data management operations.
+
+Created by Chandrasekhar Ramakrishnan on 2017-02-01.
+Copyright (c) 2017 Chandrasekhar Ramakrishnan. All rights reserved.
+"""
+
+import pybis
+import abc
+
+
+# noinspection PyPep8Naming
+def DataMgmt(openbis_config={}, git_config={}):
+    """Factory method for DataMgmt instances"""
+    complete_openbis_config(openbis_config)
+    complete_git_config(git_config)
+
+    openbis = pybis.Openbis(**openbis_config)
+    git_wrapper = GitWrapper(**git_config)
+    if git_wrapper.can_run():
+        return GitDataMgmt(openbis, git_wrapper)
+    return NoGitDataMgmt(openbis, git_wrapper)
+
+
+def complete_openbis_config(config):
+    """Add default values for empty entries in the config."""
+    if not config.get('url'):
+        config['url'] = 'https://localhost:8443'
+    if not config.get('verify_certificates'):
+        config['verify_certificates'] = True
+    if not config.get('token'):
+        config['token'] = None
+
+
+def complete_git_config(config):
+    """Add default values for empty entries in the config."""
+
+    find_git = config['find_git'] if config.get('find_git') else False
+    if find_git:
+        config['git_path'] = locate_path('git')
+        config['git_annex_path'] = locate_path('git-annex')
+
+
+def locate_path(command):
+    return None
+
+
+class AbstractDataMgmt(object):
+    __metaclass__ = abc.ABCMeta
+    """Abstract object that implements operations."""
+
+    def __init__(self, openbis, git_wrapper):
+        self.openbis = openbis
+        self.git_wrapper = git_wrapper
+
+    def init_data(self, path):
+        return None
+
+
+class NoGitDataMgmt(AbstractDataMgmt):
+    """DataMgmt operations when git is not available -- show error messages."""
+    pass
+
+
+class GitDataMgmt(AbstractDataMgmt):
+    """DataMgmt operations in normal state."""
+    pass
+
+
+class GitWrapper(object):
+    """A wrapper on commands to git."""
+
+    def __init__(self, git_path=None, git_annex_path=None):
+        self.git_path = git_path
+        self.git_annex_path = git_annex_path
+
+    def can_run(self):
+        """Return true if the perquisites are satisfied to run"""
+        if self.git_path is None:
+            return False
+        if self.git_annex_path is None:
+            return False
+        return False
diff --git a/src/python/OBis/obis/dm/data_mgmt_test.py b/src/python/OBis/obis/dm/data_mgmt_test.py
new file mode 100644
index 00000000000..a7f093d378d
--- /dev/null
+++ b/src/python/OBis/obis/dm/data_mgmt_test.py
@@ -0,0 +1,17 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+data_mgmt_test.py
+
+
+Created by Chandrasekhar Ramakrishnan on 2017-02-02.
+Copyright (c) 2017 Chandrasekhar Ramakrishnan. All rights reserved.
+"""
+
+from . import data_mgmt
+
+
+def test_no_git(tmpdir):
+    dm = data_mgmt.DataMgmt()
+    dm.init_data(str(tmpdir))
-- 
GitLab