diff options
author | Florian Bruhin <me@the-compiler.org> | 2018-12-10 12:30:47 +0100 |
---|---|---|
committer | Florian Bruhin <me@the-compiler.org> | 2018-12-10 12:37:58 +0100 |
commit | 5b354164c5c4fbf6af1d58c185c7cd0510aedcbc (patch) | |
tree | 0c511e40e00c013e71e70f518a5e919ec0d5ae46 /qutebrowser/extensions/loader.py | |
parent | ec5a93a80dea06fed31f8779c837800658f8bb59 (diff) | |
download | qutebrowser-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.py | 35 |
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 |