summaryrefslogtreecommitdiff
path: root/qutebrowser/extensions/loader.py
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2018-12-10 12:30:47 +0100
committerFlorian Bruhin <me@the-compiler.org>2018-12-10 12:37:58 +0100
commit5b354164c5c4fbf6af1d58c185c7cd0510aedcbc (patch)
tree0c511e40e00c013e71e70f518a5e919ec0d5ae46 /qutebrowser/extensions/loader.py
parentec5a93a80dea06fed31f8779c837800658f8bb59 (diff)
downloadqutebrowser-5b354164c5c4fbf6af1d58c185c7cd0510aedcbc.tar.gz
qutebrowser-5b354164c5c4fbf6af1d58c185c7cd0510aedcbc.zip
Make it possible for extensions to define init hooks
Diffstat (limited to 'qutebrowser/extensions/loader.py')
-rw-r--r--qutebrowser/extensions/loader.py35
1 files changed, 34 insertions, 1 deletions
diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py
index b2481b969..f8cafa9e3 100644
--- a/qutebrowser/extensions/loader.py
+++ b/qutebrowser/extensions/loader.py
@@ -32,6 +32,23 @@ from qutebrowser.utils import log
@attr.s
+class InitContext:
+
+ """Context an extension gets in its init hook."""
+
+
+@attr.s
+class ModuleInfo:
+
+ """Information attached to an extension module.
+
+ This gets used by qutebrowser.api.hook.
+ """
+
+ init_hook = attr.ib(None) # type: typing.Optional[typing.Callable]
+
+
+@attr.s
class ExtensionInfo:
"""Information about a qutebrowser extension."""
@@ -39,6 +56,13 @@ class ExtensionInfo:
name = attr.ib() # type: str
+def add_module_info(module: types.ModuleType) -> ModuleInfo:
+ """Add ModuleInfo to a module (if not added yet)."""
+ if not hasattr(module, '__qute_module_info'):
+ module.__qute_module_info = ModuleInfo()
+ return module.__qute_module_info
+
+
def load_components() -> None:
"""Load everything from qutebrowser.components."""
for info in walk_components():
@@ -88,5 +112,14 @@ def _walk_pyinstaller() -> typing.Iterator[ExtensionInfo]:
def _load_component(info: ExtensionInfo) -> types.ModuleType:
+ """Load the given extension and run its init hook (if any)."""
log.extensions.debug("Importing {}".format(info.name))
- return importlib.import_module(info.name)
+ mod = importlib.import_module(info.name)
+
+ info = add_module_info(mod)
+ if info.init_hook is not None:
+ log.extensions.debug("Running init hook {!r}"
+ .format(info.init_hook.__name__))
+ info.init_hook(InitContext())
+
+ return mod