diff --git a/misc/qutebrowser.spec b/misc/qutebrowser.spec index ff1b10577..b40172754 100644 --- a/misc/qutebrowser.spec +++ b/misc/qutebrowser.spec @@ -6,6 +6,8 @@ import os sys.path.insert(0, os.getcwd()) from scripts import setupcommon +from qutebrowser.extensions import loader + block_cipher = None @@ -27,6 +29,13 @@ def get_data_files(): return data_files +def get_hidden_imports(): + imports = ['PyQt5.QtOpenGL', 'PyQt5._QOpenGLFunctions_2_0'] + for info in loader.walk_components(): + imports.append('qutebrowser.components.' + info.name) + return imports + + setupcommon.write_git_file() @@ -42,7 +51,7 @@ a = Analysis(['../qutebrowser/__main__.py'], pathex=['misc'], binaries=None, datas=get_data_files(), - hiddenimports=['PyQt5.QtOpenGL', 'PyQt5._QOpenGLFunctions_2_0'], + hiddenimports=get_hidden_imports(), hookspath=[], runtime_hooks=[], excludes=['tkinter'], diff --git a/qutebrowser/extensions/loader.py b/qutebrowser/extensions/loader.py index 9674ad707..d6fdc675e 100644 --- a/qutebrowser/extensions/loader.py +++ b/qutebrowser/extensions/loader.py @@ -22,22 +22,37 @@ import importlib.abc import pkgutil import types +import typing + +import attr from qutebrowser import components from qutebrowser.utils import log +@attr.s +class ComponentInfo: + + name = attr.ib() # type: str + finder = attr.ib() # type: importlib.abc.PathEntryFinder + + def load_components() -> None: """Load everything from qutebrowser.components.""" + for info in walk_components(): + _load_component(info) + + +def walk_components() -> typing.Iterator[ComponentInfo]: + """Yield ComponentInfo objects for all modules.""" for finder, name, ispkg in pkgutil.walk_packages(components.__path__): if ispkg: continue - _load_module(finder, name) + yield ComponentInfo(name=name, finder=finder) -def _load_module(finder: importlib.abc.PathEntryFinder, - name: str) -> types.ModuleType: - log.extensions.debug("Importing {}".format(name)) - loader = finder.find_module(name) +def _load_component(info: ComponentInfo) -> types.ModuleType: + log.extensions.debug("Importing {}".format(info.name)) + loader = info.finder.find_module(info.name) assert loader is not None - return loader.load_module(name) + return loader.load_module(info.name)