aboutsummaryrefslogtreecommitdiffstats
path: root/mediagoblin/tools/pluginapi.py
diff options
context:
space:
mode:
authorChristopher Allan Webber <cwebber@dustycloud.org>2013-04-07 17:46:11 -0500
committerChristopher Allan Webber <cwebber@dustycloud.org>2013-04-07 17:46:11 -0500
commite495e28ee0f94936aeae802fe16cc522546e3869 (patch)
treedb9de0c86adc066e548008d7f634b4bce4fa3cde /mediagoblin/tools/pluginapi.py
parent7d503a897bddfadcd98d278bdb648503485a19de (diff)
downloadmediagoblin-e495e28ee0f94936aeae802fe16cc522546e3869.tar.lz
mediagoblin-e495e28ee0f94936aeae802fe16cc522546e3869.tar.xz
mediagoblin-e495e28ee0f94936aeae802fe16cc522546e3869.zip
Convenience functions for callable hooks
Diffstat (limited to 'mediagoblin/tools/pluginapi.py')
-rw-r--r--mediagoblin/tools/pluginapi.py65
1 files changed, 65 insertions, 0 deletions
diff --git a/mediagoblin/tools/pluginapi.py b/mediagoblin/tools/pluginapi.py
index 784bede9..f233fe51 100644
--- a/mediagoblin/tools/pluginapi.py
+++ b/mediagoblin/tools/pluginapi.py
@@ -272,3 +272,68 @@ def get_hook_templates(hook_name):
A list of strings representing template paths.
"""
return PluginManager().get_template_hooks(hook_name)
+
+
+###########################
+# Callable convenience code
+###########################
+
+class CantHandleIt(Exception):
+ """
+ A callable may call this method if they look at the relevant
+ arguments passed and decide it's not possible for them to handle
+ things.
+ """
+ pass
+
+class UnhandledCallable(Exception):
+ """
+ Raise this method if no callables were available to handle the
+ specified hook. Only used by callable_runone.
+ """
+ pass
+
+
+def callable_runone(hookname, unhandled_okay=False, *args, **kwargs):
+ """
+ Run the callable hook HOOKNAME... run until the first response,
+ then return.
+
+ This function will run stop at the first hook that handles the
+ result. Hooks raising CantHandleIt will be skipped.
+
+ Unless unhandled_okay is True, this will error out if no hooks
+ have been registered to handle this function.
+ """
+ callables = PluginManager().get_hook_callables(hookname)
+
+ for callable in callables:
+ try:
+ return callable(*args, **kwargs)
+ except CantHandleIt:
+ continue
+
+ if unhandled_okay is False:
+ raise UnhandledCallable(
+ "No hooks registered capable of handling '%s'" % hookname)
+
+
+def callable_runall(hookname, *args, **kwargs):
+ """
+ Run all callables for HOOKNAME.
+
+ This method will run *all* hooks that handle this method (skipping
+ those that raise CantHandleIt), and will return a list of all
+ results.
+ """
+ callables = PluginManager().get_hook_callables(hookname)
+
+ results = []
+
+ for callable in callables:
+ try:
+ results.append(callable(*args, **kwargs))
+ except CantHandleIt:
+ continue
+
+ return results