|
@@ -3,6 +3,10 @@ import json
|
|
from info import __version__
|
|
from info import __version__
|
|
import copy
|
|
import copy
|
|
import transport
|
|
import transport
|
|
|
|
+import importlib
|
|
|
|
+import importlib.util
|
|
|
|
+import shutil
|
|
|
|
+
|
|
|
|
|
|
"""
|
|
"""
|
|
This class manages data from the registry and allows (read only)
|
|
This class manages data from the registry and allows (read only)
|
|
@@ -16,28 +20,182 @@ REGISTRY_PATH=os.sep.join([os.environ['HOME'],'.data-transport'])
|
|
if 'DATA_TRANSPORT_REGISTRY_PATH' in os.environ :
|
|
if 'DATA_TRANSPORT_REGISTRY_PATH' in os.environ :
|
|
REGISTRY_PATH = os.environ['DATA_TRANSPORT_REGISTRY_PATH']
|
|
REGISTRY_PATH = os.environ['DATA_TRANSPORT_REGISTRY_PATH']
|
|
REGISTRY_FILE= 'transport-registry.json'
|
|
REGISTRY_FILE= 'transport-registry.json'
|
|
-
|
|
|
|
DATA = {}
|
|
DATA = {}
|
|
|
|
+class plugins:
|
|
|
|
+ #
|
|
|
|
+ # This is a utility function that should enable management of plugins-registry
|
|
|
|
+ # The class allows to add/remove elements
|
|
|
|
+ #
|
|
|
|
+ # @TODO: add read/write properties to the class (better design practice)
|
|
|
|
+ #
|
|
|
|
+ _data = {}
|
|
|
|
+ FOLDER = os.sep.join([REGISTRY_PATH,'plugins'])
|
|
|
|
+ CODE = os.sep.join([REGISTRY_PATH,'plugins','code'])
|
|
|
|
+ FILE = os.sep.join([REGISTRY_PATH,'plugin-registry.json'])
|
|
|
|
+ @staticmethod
|
|
|
|
+ def init():
|
|
|
|
+
|
|
|
|
+ if not os.path.exists(plugins.FOLDER) :
|
|
|
|
+ os.makedirs(plugins.FOLDER)
|
|
|
|
+ if not os.path.exists(plugins.CODE):
|
|
|
|
+ os.makedirs(plugins.CODE)
|
|
|
|
+ if not os.path.exists(plugins.FILE):
|
|
|
|
+ f = open(plugins.FILE,'w')
|
|
|
|
+ f.write("{}")
|
|
|
|
+ f.close()
|
|
|
|
+ plugins._read() #-- will load data as a side effect
|
|
|
|
+
|
|
|
|
+ @staticmethod
|
|
|
|
+ def copy (path) :
|
|
|
|
+
|
|
|
|
+ shutil.copy2(path,plugins.CODE)
|
|
|
|
+ @staticmethod
|
|
|
|
+ def _read ():
|
|
|
|
+ f = open(plugins.FILE)
|
|
|
|
+ try:
|
|
|
|
+ _data = json.loads(f.read())
|
|
|
|
+ f.close()
|
|
|
|
+ except Exception as e:
|
|
|
|
+ print (f"Corrupted registry, resetting ...")
|
|
|
|
+ _data = {}
|
|
|
|
+ plugins._write(_data)
|
|
|
|
+
|
|
|
|
+ plugins._data = _data
|
|
|
|
+ @staticmethod
|
|
|
|
+ def _write (_data):
|
|
|
|
+ f = open(plugins.FILE,'w')
|
|
|
|
+ f.write(json.dumps(_data))
|
|
|
|
+ f.close()
|
|
|
|
+ plugins._data = _data
|
|
|
|
+
|
|
|
|
+ @staticmethod
|
|
|
|
+ def inspect (_path):
|
|
|
|
+ _names = []
|
|
|
|
+
|
|
|
|
+ if os.path.exists(_path) :
|
|
|
|
+ _filename = _path.split(os.sep)[-1]
|
|
|
|
+ spec = importlib.util.spec_from_file_location(_filename, _path)
|
|
|
|
+ module = importlib.util.module_from_spec(spec)
|
|
|
|
+ spec.loader.exec_module(module)
|
|
|
|
+
|
|
|
|
+ # _names = [{'name':getattr(getattr(module,_name),'name'),'pointer':getattr(module,_name)} for _name in dir(module) if type( getattr(module,_name)).__name__ == 'function']
|
|
|
|
+ for _name in dir(module) :
|
|
|
|
+ _pointer = getattr(module,_name)
|
|
|
|
+ if hasattr(_pointer,'transport') :
|
|
|
|
+ _item = {'real_name':_name,'name':getattr(_pointer,'name'),'pointer':_pointer,'version':getattr(_pointer,'version')}
|
|
|
|
+ _names.append(_item)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ return _names
|
|
|
|
+ @staticmethod
|
|
|
|
+ def add (alias,path):
|
|
|
|
+ """
|
|
|
|
+ Add overwrite the registry entries
|
|
|
|
+ """
|
|
|
|
+ _names = plugins.inspect (path)
|
|
|
|
+ _log = []
|
|
|
|
+
|
|
|
|
+ if _names :
|
|
|
|
+ #
|
|
|
|
+ # We should make sure we have all the plugins with the attributes (transport,name) set
|
|
|
|
+ _names = [_item for _item in _names if hasattr(_item['pointer'],'transport') ]
|
|
|
|
+ if _names :
|
|
|
|
+ plugins.copy(path)
|
|
|
|
+ _content = []
|
|
|
|
+
|
|
|
|
+ for _item in _names :
|
|
|
|
+ _key = '@'.join([alias,_item['name']])
|
|
|
|
+ _log.append(_item['name'])
|
|
|
|
+ #
|
|
|
|
+ # Let us update the registry
|
|
|
|
+ #
|
|
|
|
+ plugins.update(alias,path,_log)
|
|
|
|
+ return _log
|
|
|
|
+
|
|
|
|
+ @staticmethod
|
|
|
|
+ def update (alias,path,_log) :
|
|
|
|
+ """
|
|
|
|
+ updating the registry entries of the plugins (management data)
|
|
|
|
+ """
|
|
|
|
+ # f = open(plugins.FILE)
|
|
|
|
+ # _data = json.loads(f.read())
|
|
|
|
+ # f.close()
|
|
|
|
+ _data = plugins._data
|
|
|
|
+ # _log = plugins.add(alias,path)
|
|
|
|
+
|
|
|
|
+ if _log :
|
|
|
|
+ _data[alias] = {'content':_log,'name':path.split(os.sep)[-1]}
|
|
|
|
+ plugins._write(_data) #-- will update data as a side effect
|
|
|
|
+
|
|
|
|
+ return _log
|
|
|
|
+ @staticmethod
|
|
|
|
+ def get(**_args) :
|
|
|
|
+ # f = open(plugins.FILE)
|
|
|
|
+ # _data = json.loads(f.read())
|
|
|
|
+ # f.close()
|
|
|
|
+ # if 'key' in _args :
|
|
|
|
+ # alias,name = _args['key'].split('.') if '.' in _args['key'] else _args['key'].split('@')
|
|
|
|
+ # else :
|
|
|
|
+ # alias = _args['alias']
|
|
|
|
+ # name = _args['name']
|
|
|
|
+
|
|
|
|
+ # if alias in _data :
|
|
|
|
+
|
|
|
|
+ # _path = os.sep.join([plugins.CODE,_data[alias]['name']])
|
|
|
|
+ # _item = [_item for _item in plugins.inspect(_path) if name == _item['name']]
|
|
|
|
+
|
|
|
|
+ # _item = _item[0] if _item else None
|
|
|
|
+ # if _item :
|
|
|
|
+
|
|
|
|
+ # return _item['pointer']
|
|
|
|
+ # return None
|
|
|
|
+ _item = plugins.has(**_args)
|
|
|
|
+ return _item['pointer'] if _item else None
|
|
|
|
+
|
|
|
|
+ @staticmethod
|
|
|
|
+ def has (**_args):
|
|
|
|
+ f = open(plugins.FILE)
|
|
|
|
+ _data = json.loads(f.read())
|
|
|
|
+ f.close()
|
|
|
|
+ if 'key' in _args :
|
|
|
|
+ alias,name = _args['key'].split('.') if '.' in _args['key'] else _args['key'].split('@')
|
|
|
|
+ else :
|
|
|
|
+ alias = _args['alias']
|
|
|
|
+ name = _args['name']
|
|
|
|
+
|
|
|
|
+ if alias in _data :
|
|
|
|
+
|
|
|
|
+ _path = os.sep.join([plugins.CODE,_data[alias]['name']])
|
|
|
|
+ _item = [_item for _item in plugins.inspect(_path) if name == _item['name']]
|
|
|
|
+
|
|
|
|
+ _item = _item[0] if _item else None
|
|
|
|
+ if _item :
|
|
|
|
+
|
|
|
|
+ return copy.copy(_item)
|
|
|
|
+ return None
|
|
|
|
+ @staticmethod
|
|
|
|
+ def synch():
|
|
|
|
+ pass
|
|
|
|
|
|
def isloaded ():
|
|
def isloaded ():
|
|
return DATA not in [{},None]
|
|
return DATA not in [{},None]
|
|
-def exists (path=REGISTRY_PATH) :
|
|
|
|
|
|
+def exists (path=REGISTRY_PATH,_file=REGISTRY_FILE) :
|
|
"""
|
|
"""
|
|
This function determines if there is a registry at all
|
|
This function determines if there is a registry at all
|
|
"""
|
|
"""
|
|
p = os.path.exists(path)
|
|
p = os.path.exists(path)
|
|
- q = os.path.exists( os.sep.join([path,REGISTRY_FILE]))
|
|
|
|
|
|
+ q = os.path.exists( os.sep.join([path,_file]))
|
|
|
|
|
|
return p and q
|
|
return p and q
|
|
-def load (_path=REGISTRY_PATH):
|
|
|
|
|
|
+def load (_path=REGISTRY_PATH,_file=REGISTRY_FILE):
|
|
global DATA
|
|
global DATA
|
|
|
|
|
|
if exists(_path) :
|
|
if exists(_path) :
|
|
- path = os.sep.join([_path,REGISTRY_FILE])
|
|
|
|
|
|
+ path = os.sep.join([_path,_file])
|
|
f = open(path)
|
|
f = open(path)
|
|
DATA = json.loads(f.read())
|
|
DATA = json.loads(f.read())
|
|
f.close()
|
|
f.close()
|
|
-def init (email,path=REGISTRY_PATH,override=False):
|
|
|
|
|
|
+def init (email,path=REGISTRY_PATH,override=False,_file=REGISTRY_FILE):
|
|
"""
|
|
"""
|
|
Initializing the registry and will raise an exception in the advent of an issue
|
|
Initializing the registry and will raise an exception in the advent of an issue
|
|
"""
|
|
"""
|
|
@@ -47,7 +205,7 @@ def init (email,path=REGISTRY_PATH,override=False):
|
|
_config = {"email":email,'version':__version__}
|
|
_config = {"email":email,'version':__version__}
|
|
if not os.path.exists(path):
|
|
if not os.path.exists(path):
|
|
os.makedirs(path)
|
|
os.makedirs(path)
|
|
- filename = os.sep.join([path,REGISTRY_FILE])
|
|
|
|
|
|
+ filename = os.sep.join([path,_file])
|
|
if not os.path.exists(filename) or override == True :
|
|
if not os.path.exists(filename) or override == True :
|
|
|
|
|
|
f = open(filename,'w')
|
|
f = open(filename,'w')
|