Merge pull request #15095 from jjshoe/sort_plugins

Sort plugins by basename to support ordering callbacks
pull/15097/head
Toshio Kuratomi 9 years ago
commit 2f118e546f

@ -348,36 +348,38 @@ class PluginLoader:
''' instantiates all plugins with the same arguments ''' ''' instantiates all plugins with the same arguments '''
class_only = kwargs.pop('class_only', False) class_only = kwargs.pop('class_only', False)
all_matches = []
for i in self._get_paths(): for i in self._get_paths():
matches = glob.glob(os.path.join(i, "*.py")) all_matches.extend(glob.glob(os.path.join(i, "*.py")))
matches.sort()
for path in matches: for path in sorted(all_matches, key=lambda match: os.path.basename(match)):
name, _ = os.path.splitext(path) name, _ = os.path.splitext(path)
if '__init__' in name: if '__init__' in name:
continue continue
if path not in self._module_cache: if path not in self._module_cache:
self._module_cache[path] = self._load_module_source(name, path) self._module_cache[path] = self._load_module_source(name, path)
obj = getattr(self._module_cache[path], self.class_name) obj = getattr(self._module_cache[path], self.class_name)
if self.base_class: if self.base_class:
# The import path is hardcoded and should be the right place, # The import path is hardcoded and should be the right place,
# so we are not expecting an ImportError. # so we are not expecting an ImportError.
module = __import__(self.package, fromlist=[self.base_class]) module = __import__(self.package, fromlist=[self.base_class])
# Check whether this obj has the required base class. # Check whether this obj has the required base class.
try: try:
plugin_class = getattr(module, self.base_class) plugin_class = getattr(module, self.base_class)
except AttributeError: except AttributeError:
continue continue
if not issubclass(obj, plugin_class): if not issubclass(obj, plugin_class):
continue continue
if not class_only: if not class_only:
obj = obj(*args, **kwargs) obj = obj(*args, **kwargs)
# set extra info on the module, in case we want it later # set extra info on the module, in case we want it later
setattr(obj, '_original_path', path) setattr(obj, '_original_path', path)
yield obj yield obj
action_loader = PluginLoader( action_loader = PluginLoader(
'ActionModule', 'ActionModule',

Loading…
Cancel
Save