wic: refactor pluginbase

Wic plugin machinery implemented using metaclasses.

Reimplemented plugin machinery using this advice from
https://wiki.python.org/moin/PortingToPy3k/BilingualQuickRef
Syntax for creating instances with different metaclasses is very
different between Python 2 and 3. Use the ability to call type instances
as a way to portably create such instances.

Now it should work under both Python 2 and Python 3.

[YOCTO #9412]

(From OE-Core rev: e62fe5a41bdcdd72b9b257fecff7ccdc59c76d33)

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 2016-05-04 16:06:21 +03:00 committed by Richard Purdie
parent d4ded7fcb1
commit 5fedb5d3cc
1 changed files with 15 additions and 29 deletions

View File

@ -15,34 +15,26 @@
# with this program; if not, write to the Free Software Foundation, Inc., 59
# Temple Place - Suite 330, Boston, MA 02111-1307, USA.
__all__ = ['ImagerPlugin', 'SourcePlugin', 'get_plugins']
import sys
from collections import defaultdict
from wic import msger
class _Plugin(object):
class __metaclass__(type):
def __init__(cls, name, bases, attrs):
if not hasattr(cls, 'plugins'):
cls.plugins = {}
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
elif 'wic_plugin_type' in attrs:
if attrs['wic_plugin_type'] not in cls.plugins:
cls.plugins[attrs['wic_plugin_type']] = {}
return class_type
elif hasattr(cls, 'wic_plugin_type') and 'name' in attrs:
cls.plugins[cls.wic_plugin_type][attrs['name']] = cls
def show_plugins(cls):
for cls in cls.plugins[cls.wic_plugin_type]:
print cls
def get_plugins(cls):
return cls.plugins
class ImagerPlugin(_Plugin):
class ImagerPlugin(PluginMeta("Plugin", (), {})):
wic_plugin_type = "imager"
class SourcePlugin(_Plugin):
class SourcePlugin(PluginMeta("Plugin", (), {})):
wic_plugin_type = "source"
"""
The methods that can be implemented by --source plugins.
@ -99,10 +91,4 @@ class SourcePlugin(_Plugin):
msger.debug("SourcePlugin: do_prepare_partition: part: %s" % part)
def get_plugins(typen):
plugins = ImagerPlugin.get_plugins()
if typen in plugins:
return plugins[typen]
else:
return None
__all__ = ['ImagerPlugin', 'SourcePlugin', 'get_plugins']
return PluginMeta.plugins.get(typen)