aboutsummaryrefslogtreecommitdiffstats
path: root/mediagoblin/init
diff options
context:
space:
mode:
authorWill Kahn-Greene <willg@bluesock.org>2012-07-17 21:02:12 -0400
committerWill Kahn-Greene <willg@bluesock.org>2012-07-17 21:02:12 -0400
commit05e007c1dbe7b5b8a092f1a99ed361c4e6b71f26 (patch)
tree36a0d1ba4174baff5a003871a28e08a512b57a84 /mediagoblin/init
parent8464bcc3e86e223db0739101c0b5d914eea225af (diff)
downloadmediagoblin-05e007c1dbe7b5b8a092f1a99ed361c4e6b71f26.tar.lz
mediagoblin-05e007c1dbe7b5b8a092f1a99ed361c4e6b71f26.tar.xz
mediagoblin-05e007c1dbe7b5b8a092f1a99ed361c4e6b71f26.zip
Rework plugin infrastructure to nix side-effects
This reworks the plugin infrastructure so as to remove module-loading side-effects which were making things a pain in the ass to test. With the new system, there's no auto-registering meta class. Instead plugins do whatever they want and then specify a hooks dict that maps hook names to callables for the things they're tying into. The most common one (and the only one we've implemented so far) is "setup". This also simplifies the sampleplugin a little by moving the code to __init__.py.
Diffstat (limited to 'mediagoblin/init')
-rw-r--r--mediagoblin/init/plugins/__init__.py26
1 files changed, 12 insertions, 14 deletions
diff --git a/mediagoblin/init/plugins/__init__.py b/mediagoblin/init/plugins/__init__.py
index 279a5ede..4ac7a140 100644
--- a/mediagoblin/init/plugins/__init__.py
+++ b/mediagoblin/init/plugins/__init__.py
@@ -15,6 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
+import sys
from mediagoblin import mg_globals
from mediagoblin.tools import pluginapi
@@ -36,24 +37,21 @@ def setup_plugins():
_log.info("No plugins to load")
return
- pcache = pluginapi.PluginCache()
+ pman = pluginapi.PluginManager()
# Go through and import all the modules that are subsections of
- # the [plugins] section.
+ # the [plugins] section and read in the hooks.
for plugin_module, config in plugin_section.items():
_log.info("Importing plugin module: %s" % plugin_module)
+ pman.register_plugin(plugin_module)
# If this throws errors, that's ok--it'll halt mediagoblin
# startup.
__import__(plugin_module)
-
- # Note: One side-effect of importing things is that anything that
- # subclassed pluginapi.Plugin is registered.
-
- # Go through all the plugin classes, instantiate them, and call
- # setup_plugin so they can figure things out.
- for plugin_class in pcache.plugin_classes:
- name = plugin_class.__module__ + "." + plugin_class.__name__
- _log.info("Loading plugin: %s" % name)
- plugin_obj = plugin_class()
- plugin_obj.setup_plugin()
- pcache.register_plugin_object(plugin_obj)
+ plugin = sys.modules[plugin_module]
+ if hasattr(plugin, 'hooks'):
+ pman.register_hooks(plugin.hooks)
+
+ # Execute anything registered to the setup hook.
+ setup_list = pman.get_hook_callables('setup')
+ for fun in setup_list:
+ fun()