提交 cd0a112f 编写于 作者: P peng.xu

add plugins base mixin

上级 1d39ec75
import os
import logging
from functools import partial
from utils.pluginextension import MiPluginBase as PluginBase
from discovery import DiscoveryConfig
from utils.plugins import BaseMixin
logger = logging.getLogger(__name__)
here = os.path.abspath(os.path.dirname(__file__))
get_path = partial(os.path.join, here)
PLUGIN_PACKAGE_NAME = 'discovery.plugins'
plugin_base = PluginBase(package=PLUGIN_PACKAGE_NAME,
searchpath=[get_path('./plugins')])
class DiscoveryFactory(object):
class DiscoveryFactory(BaseMixin):
PLUGIN_TYPE = 'Discovery'
def __init__(self, searchpath=None):
self.plugin_package_name = PLUGIN_PACKAGE_NAME
self.class_map = {}
searchpath = searchpath if searchpath else []
searchpath = [searchpath] if isinstance(searchpath, str) else searchpath
self.source = plugin_base.make_plugin_source(searchpath=searchpath,
identifier=self.__class__.__name__)
for plugin_name in self.source.list_plugins():
plugin = self.source.load_plugin(plugin_name)
plugin.setup(self)
super().__init__(searchpath=searchpath, package_name=PLUGIN_PACKAGE_NAME)
def on_plugin_setup(self, plugin_class):
name = getattr(plugin_class, 'name', plugin_class.__name__)
self.class_map[name.lower()] = plugin_class
def plugin(self, name):
return self.class_map.get(name, None)
def create(self, class_name, **kwargs):
def _create(self, plugin_class, **kwargs):
conn_mgr = kwargs.pop('conn_mgr', None)
if not conn_mgr:
raise RuntimeError('Please pass conn_mgr to create discovery!')
if not class_name:
raise RuntimeError('Please specify \'{}\' class_name first!'.format(self.PLUGIN_TYPE))
plugin_class = self.plugin(class_name.lower())
if not plugin_class:
raise RuntimeError('{} Plugin \'{}\' Not Installed!'.format(self.PLUGIN_TYPE, class_name))
plugin_config = DiscoveryConfig.Create()
plugin = plugin_class.create(plugin_config=plugin_config, conn_mgr=conn_mgr, **kwargs)
return plugin
import os
import inspect
from functools import partial
from utils.pluginextension import MiPluginBase as PluginBase
class BaseMixin(object):
def __init__(self, package_name, searchpath=None):
self.plugin_package_name = package_name
caller_path = os.path.dirname(inspect.stack()[1][1])
get_path = partial(os.path.join, caller_path)
plugin_base = PluginBase(package=self.plugin_package_name,
searchpath=[get_path('./plugins')])
self.class_map = {}
searchpath = searchpath if searchpath else []
searchpath = [searchpath] if isinstance(searchpath, str) else searchpath
self.source = plugin_base.make_plugin_source(searchpath=searchpath,
identifier=self.__class__.__name__)
for plugin_name in self.source.list_plugins():
plugin = self.source.load_plugin(plugin_name)
plugin.setup(self)
def on_plugin_setup(self, plugin_class):
name = getattr(plugin_class, 'name', plugin_class.__name__)
self.class_map[name.lower()] = plugin_class
def plugin(self, name):
return self.class_map.get(name, None)
def create(self, class_name, **kwargs):
if not class_name:
raise RuntimeError('Please specify \'{}\' class_name first!'.format(self.PLUGIN_TYPE))
plugin_class = self.plugin(class_name.lower())
if not plugin_class:
raise RuntimeError('{} Plugin \'{}\' Not Installed!'.format(self.PLUGIN_TYPE, class_name))
return self._create(plugin_class, **kwargs)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册