import os
import json
from info import __version__
import copy
import transport
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