From c5ee7f90806fc2eaed987ea257a9f681b2234426 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 17 Aug 2014 11:29:23 +0530 Subject: [PATCH] Plugin loading: When multiple plugin classes are present in the __init__.py namespace, use the one with the qualified name that has the least components --- src/calibre/customize/zipplugin.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/calibre/customize/zipplugin.py b/src/calibre/customize/zipplugin.py index 4d795e8be3..031b913e3e 100644 --- a/src/calibre/customize/zipplugin.py +++ b/src/calibre/customize/zipplugin.py @@ -195,14 +195,18 @@ class PluginLoader(object): reload(m) else: m = importlib.import_module(plugin_module) + plugin_classes = [] for obj in m.__dict__.itervalues(): if isinstance(obj, type) and issubclass(obj, Plugin) and \ obj.name != 'Trivial Plugin': - ans = obj - break - if ans is None: + plugin_classes.append(obj) + if not plugin_classes: raise InvalidPlugin('No plugin class found in %s:%s'%( as_unicode(path_to_zip_file), plugin_name)) + if len(plugin_classes) > 1: + plugin_classes.sort(key=lambda c:(getattr(c, '__module__', None) or '').count('.')) + + ans = plugin_classes[0] if ans.minimum_calibre_version > numeric_version: raise InvalidPlugin(