wic: pluginbase: use global dictionary

Made PluginMeta to populate global PLUGINS dictionary that
is accessed by PluginMgr. This should make the code more
understandable as PluginMgr don't need to get data directly
from PlugnMeta attribute.

(From OE-Core rev: 68df14eb43103537279824c5f627cc5914b5282c)

Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Ed Bartosh 2017-02-16 12:53:30 +02:00 committed by Richard Purdie
parent 0c0ed61992
commit c4b96817e5
1 changed files with 15 additions and 17 deletions

View File

@ -32,9 +32,10 @@ SCRIPTS_PLUGIN_DIR = "scripts/lib/wic/plugins"
logger = logging.getLogger('wic')
PLUGINS = defaultdict(dict)
class PluginMgr:
_plugin_dirs = []
_plugins = {}
@classmethod
def get_plugins(cls, ptype):
@ -42,9 +43,6 @@ class PluginMgr:
if ptype not in PLUGIN_TYPES:
raise WicError('%s is not valid plugin type' % ptype)
if ptype in cls._plugins:
return cls._plugins[ptype]
# collect plugin directories
if not cls._plugin_dirs:
cls._plugin_dirs = [os.path.join(os.path.dirname(__file__), 'plugins')]
@ -55,25 +53,25 @@ class PluginMgr:
if path not in cls._plugin_dirs and os.path.isdir(path):
cls._plugin_dirs.insert(0, path)
# load plugins
for pdir in cls._plugin_dirs:
ppath = os.path.join(pdir, ptype)
if os.path.isdir(ppath):
for fname in os.listdir(ppath):
if fname.endswith('.py'):
mname = fname[:-3]
mpath = os.path.join(ppath, fname)
SourceFileLoader(mname, mpath).load_module()
if ptype not in PLUGINS:
# load all ptype plugins
for pdir in cls._plugin_dirs:
ppath = os.path.join(pdir, ptype)
if os.path.isdir(ppath):
for fname in os.listdir(ppath):
if fname.endswith('.py'):
mname = fname[:-3]
mpath = os.path.join(ppath, fname)
logger.debug("loading plugin module %s", mpath)
SourceFileLoader(mname, mpath).load_module()
cls._plugins[ptype] = PluginMeta.plugins.get(ptype)
return cls._plugins[ptype]
return PLUGINS.get(ptype)
class PluginMeta(type):
plugins = defaultdict(dict)
def __new__(cls, name, bases, attrs):
class_type = type.__new__(cls, name, bases, attrs)
if 'name' in attrs:
cls.plugins[class_type.wic_plugin_type][attrs['name']] = class_type
PLUGINS[class_type.wic_plugin_type][attrs['name']] = class_type
return class_type