Keep plugin order after reload to allow plugins to extend other ones
This commit is contained in:
parent
91513f15ae
commit
cb214476e4
1 changed files with 13 additions and 0 deletions
|
@ -12,6 +12,7 @@ class PluginManager:
|
|||
self.log = logging.getLogger("PluginManager")
|
||||
self.plugin_path = "plugins" # Plugin directory
|
||||
self.plugins = defaultdict(list) # Registered plugins (key: class name, value: list of plugins for class)
|
||||
self.subclass_order = {} # Record the load order of the plugins, to keep it after reload
|
||||
self.pluggable = {}
|
||||
self.plugin_names = [] # Loaded plugin names
|
||||
|
||||
|
@ -107,6 +108,18 @@ def acceptPlugins(base_class):
|
|||
plugin_manager.pluggable[class_name] = base_class
|
||||
if class_name in plugin_manager.plugins: # Has plugins
|
||||
classes = plugin_manager.plugins[class_name][:] # Copy the current plugins
|
||||
|
||||
# Restore the subclass order after reload
|
||||
if class_name in plugin_manager.subclass_order:
|
||||
classes = sorted(
|
||||
classes,
|
||||
key=lambda key:
|
||||
plugin_manager.subclass_order[class_name].index(str(key))
|
||||
if str(key) in plugin_manager.subclass_order[class_name]
|
||||
else 9999
|
||||
)
|
||||
plugin_manager.subclass_order[class_name] = map(str, classes)
|
||||
|
||||
classes.reverse()
|
||||
classes.append(base_class) # Add the class itself to end of inherience line
|
||||
plugined_class = type(class_name, tuple(classes), dict()) # Create the plugined class
|
||||
|
|
Loading…
Reference in a new issue