From c1758230200814e84055f3e2954cb69f0fddf5d8 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 11 Jan 2021 12:00:30 +0100 Subject: Add objects.qapp to avoid needing to None-check We know that QApplication.instance() will always be non-None for practical purposes, but the stubs now (correctly) declare it as Optional. See https://github.com/stlehmann/PyQt5-stubs/pull/126 --- qutebrowser/app.py | 38 +++++++++++----------- qutebrowser/browser/commands.py | 2 +- .../browser/webkit/network/networkmanager.py | 12 +++---- qutebrowser/components/readlinecommands.py | 6 +++- qutebrowser/keyinput/eventfilter.py | 11 +++---- qutebrowser/keyinput/modeman.py | 4 +-- qutebrowser/mainwindow/mainwindow.py | 8 ++--- qutebrowser/mainwindow/windowundo.py | 6 ++-- qutebrowser/misc/backendproblem.py | 6 ++-- qutebrowser/misc/crashdialog.py | 7 ++-- qutebrowser/misc/objects.py | 2 ++ qutebrowser/misc/quitter.py | 8 ++--- qutebrowser/misc/sessions.py | 4 +-- qutebrowser/utils/debug.py | 6 ++-- qutebrowser/utils/qtutils.py | 3 +- qutebrowser/utils/version.py | 10 +++--- tests/helpers/stubs.py | 8 +---- tests/unit/keyinput/test_modeman.py | 6 ++++ tests/unit/utils/test_debug.py | 11 ++++--- tests/unit/utils/test_qtutils.py | 2 +- tests/unit/utils/test_version.py | 8 ++--- 21 files changed, 82 insertions(+), 86 deletions(-) diff --git a/qutebrowser/app.py b/qutebrowser/app.py index 32dbfe0cf..5dcc9a7de 100644 --- a/qutebrowser/app.py +++ b/qutebrowser/app.py @@ -92,20 +92,20 @@ def run(args): configinit.early_init(args) log.init.debug("Initializing application...") - global q_app - q_app = Application(args) - q_app.setOrganizationName("qutebrowser") - q_app.setApplicationName("qutebrowser") + app = Application(args) + objects.qapp = app + app.setOrganizationName("qutebrowser") + app.setApplicationName("qutebrowser") # Default DesktopFileName is org.qutebrowser.qutebrowser, set in `get_argparser()` - q_app.setDesktopFileName(args.desktop_file_name) - q_app.setApplicationVersion(qutebrowser.__version__) + app.setDesktopFileName(args.desktop_file_name) + app.setApplicationVersion(qutebrowser.__version__) if args.version: print(version.version_info()) sys.exit(usertypes.Exit.ok) quitter.init(args) - crashsignal.init(q_app=q_app, args=args, quitter=quitter.instance) + crashsignal.init(q_app=app, args=args, quitter=quitter.instance) try: server = ipc.send_or_listen(args) @@ -136,7 +136,7 @@ def qt_mainloop(): WARNING: misc/crashdialog.py checks the stacktrace for this function name, so if this is changed, it should be changed there as well! """ - return q_app.exec() + return objects.qapp.exec() def init(*, args: argparse.Namespace) -> None: @@ -145,7 +145,7 @@ def init(*, args: argparse.Namespace) -> None: crashsignal.crash_handler.init_faulthandler() - q_app.setQuitOnLastWindowClosed(False) + objects.qapp.setQuitOnLastWindowClosed(False) quitter.instance.shutting_down.connect(QApplication.closeAllWindows) _init_icon() @@ -165,7 +165,7 @@ def init(*, args: argparse.Namespace) -> None: eventfilter.init() log.init.debug("Connecting signals...") - q_app.focusChanged.connect(on_focus_changed) + objects.qapp.focusChanged.connect(on_focus_changed) _process_args(args) @@ -191,7 +191,7 @@ def _init_icon(): if icon.isNull(): log.init.warning("Failed to load icon") else: - q_app.setWindowIcon(icon) + objects.qapp.setWindowIcon(icon) def _init_pulseaudio(): @@ -228,7 +228,7 @@ def _process_args(args): window = mainwindow.MainWindow(private=private) if not args.nowindow: window.show() - q_app.setActiveWindow(window) + objects.qapp.setActiveWindow(window) process_pos_args(args.command) _open_startpage() @@ -423,7 +423,7 @@ def _init_modules(*, args): config.instance.changed.connect(_on_config_changed) log.init.debug("Initializing save manager...") - save_manager = savemanager.SaveManager(q_app) + save_manager = savemanager.SaveManager(objects.qapp) objreg.register('save-manager', save_manager) quitter.instance.shutting_down.connect(save_manager.shutdown) configinit.late_init(save_manager) @@ -450,7 +450,7 @@ def _init_modules(*, args): sql.init(os.path.join(standarddir.data(), 'history.sqlite')) log.init.debug("Initializing web history...") - history.init(q_app) + history.init(objects.qapp) except sql.KnownError as e: error.handle_fatal_exc(e, 'Error initializing SQL', pre_text='Error initializing SQL', @@ -460,7 +460,7 @@ def _init_modules(*, args): log.init.debug("Initializing command history...") cmdhistory.init() log.init.debug("Initializing sessions...") - sessions.init(q_app) + sessions.init(objects.qapp) log.init.debug("Initializing websettings...") websettings.init(args) @@ -470,18 +470,18 @@ def _init_modules(*, args): crashsignal.crash_handler.display_faulthandler() log.init.debug("Initializing quickmarks...") - quickmark_manager = urlmarks.QuickmarkManager(q_app) + quickmark_manager = urlmarks.QuickmarkManager(objects.qapp) objreg.register('quickmark-manager', quickmark_manager) log.init.debug("Initializing bookmarks...") - bookmark_manager = urlmarks.BookmarkManager(q_app) + bookmark_manager = urlmarks.BookmarkManager(objects.qapp) objreg.register('bookmark-manager', bookmark_manager) log.init.debug("Initializing cookies...") - cookies.init(q_app) + cookies.init(objects.qapp) log.init.debug("Initializing cache...") - cache.init(q_app) + cache.init(objects.qapp) log.init.debug("Initializing downloads...") qtnetworkdownloads.init() diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index fda645416..ec43a3210 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -65,7 +65,7 @@ class CommandDispatcher: def _new_tabbed_browser(self, private): """Get a tabbed-browser from a new window.""" - args = QApplication.instance().arguments() + args = objects.qapp.arguments() if private and '--single-process' in args: raise cmdutils.CommandError("Private windows are unavailable with " "the single-process process model.") diff --git a/qutebrowser/browser/webkit/network/networkmanager.py b/qutebrowser/browser/webkit/network/networkmanager.py index a1ef0463d..b56518675 100644 --- a/qutebrowser/browser/webkit/network/networkmanager.py +++ b/qutebrowser/browser/webkit/network/networkmanager.py @@ -24,10 +24,8 @@ import html from typing import TYPE_CHECKING, Dict, MutableMapping, Optional, Sequence import attr -from PyQt5.QtCore import (pyqtSlot, pyqtSignal, QCoreApplication, QUrl, - QByteArray) -from PyQt5.QtNetwork import (QNetworkAccessManager, QNetworkReply, QSslSocket, - QSslError) +from PyQt5.QtCore import pyqtSlot, pyqtSignal, QUrl, QByteArray +from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkReply, QSslSocket, QSslError from qutebrowser.config import config from qutebrowser.utils import (message, log, usertypes, utils, objreg, @@ -193,8 +191,7 @@ class NetworkManager(QNetworkAccessManager): # We have a shared cookie jar - we restore its parent so we don't # take ownership of it. self.setCookieJar(cookie_jar) - app = QCoreApplication.instance() - cookie_jar.setParent(app) + cookie_jar.setParent(objects.qapp) def _set_cache(self): """Set the cache of the NetworkManager correctly.""" @@ -202,9 +199,8 @@ class NetworkManager(QNetworkAccessManager): return # We have a shared cache - we restore its parent so we don't take # ownership of it. - app = QCoreApplication.instance() self.setCache(cache.diskcache) - cache.diskcache.setParent(app) + cache.diskcache.setParent(objects.qapp) def _get_abort_signals(self, owner=None): """Get a list of signals which should abort a question.""" diff --git a/qutebrowser/components/readlinecommands.py b/qutebrowser/components/readlinecommands.py index ea8f12edf..44772f10f 100644 --- a/qutebrowser/components/readlinecommands.py +++ b/qutebrowser/components/readlinecommands.py @@ -39,7 +39,11 @@ class _ReadlineBridge: def _widget(self) -> Optional[QLineEdit]: """Get the currently active QLineEdit.""" - w = QApplication.instance().focusWidget() + # FIXME add this to api.utils or so + qapp = QApplication.instance() + assert qapp is not None + w = qapp.focusWidget() + if isinstance(w, QLineEdit): return w else: diff --git a/qutebrowser/keyinput/eventfilter.py b/qutebrowser/keyinput/eventfilter.py index d77c8702d..2202ebd2d 100644 --- a/qutebrowser/keyinput/eventfilter.py +++ b/qutebrowser/keyinput/eventfilter.py @@ -23,10 +23,9 @@ from typing import cast from PyQt5.QtCore import pyqtSlot, QObject, QEvent from PyQt5.QtGui import QKeyEvent, QWindow -from PyQt5.QtWidgets import QApplication from qutebrowser.keyinput import modeman -from qutebrowser.misc import quitter +from qutebrowser.misc import quitter, objects from qutebrowser.utils import objreg @@ -50,11 +49,11 @@ class EventFilter(QObject): } def install(self) -> None: - QApplication.instance().installEventFilter(self) + objects.qapp.installEventFilter(self) @pyqtSlot() def shutdown(self) -> None: - QApplication.instance().removeEventFilter(self) + objects.qapp.removeEventFilter(self) def _handle_key_event(self, event: QKeyEvent) -> bool: """Handle a key press/release event. @@ -65,7 +64,7 @@ class EventFilter(QObject): Return: True if the event should be filtered, False if it's passed through. """ - active_window = QApplication.instance().activeWindow() + active_window = objects.qapp.activeWindow() if active_window not in objreg.window_registry.values(): # Some other window (print dialog, etc.) is focused so we pass the # event through. @@ -112,6 +111,6 @@ class EventFilter(QObject): def init() -> None: """Initialize the global EventFilter instance.""" - event_filter = EventFilter(parent=QApplication.instance()) + event_filter = EventFilter(parent=objects.qapp) event_filter.install() quitter.instance.shutting_down.connect(event_filter.shutdown) diff --git a/qutebrowser/keyinput/modeman.py b/qutebrowser/keyinput/modeman.py index dcc6fa949..df5f08e2c 100644 --- a/qutebrowser/keyinput/modeman.py +++ b/qutebrowser/keyinput/modeman.py @@ -25,7 +25,6 @@ from typing import Mapping, Callable, MutableMapping, Union, Set, cast import attr from PyQt5.QtCore import pyqtSlot, pyqtSignal, Qt, QObject, QEvent from PyQt5.QtGui import QKeyEvent -from PyQt5.QtWidgets import QApplication from qutebrowser.commands import runners from qutebrowser.keyinput import modeparsers, basekeyparser @@ -33,6 +32,7 @@ from qutebrowser.config import config from qutebrowser.api import cmdutils from qutebrowser.utils import usertypes, log, objreg, utils from qutebrowser.browser import hints +from qutebrowser.misc import objects INPUT_MODES = [usertypes.KeyMode.insert, usertypes.KeyMode.passthrough] PROMPT_MODES = [usertypes.KeyMode.prompt, usertypes.KeyMode.yesno] @@ -307,7 +307,7 @@ class ModeManager(QObject): self._releaseevents_to_pass.add(KeyEvent.from_event(event)) if curmode != usertypes.KeyMode.insert: - focus_widget = QApplication.instance().focusWidget() + focus_widget = objects.qapp.focusWidget() log.modes.debug("match: {}, forward_unbound_keys: {}, " "passthrough: {}, is_non_alnum: {}, dry_run: {} " "--> filter: {} (focused: {!r})".format( diff --git a/qutebrowser/mainwindow/mainwindow.py b/qutebrowser/mainwindow/mainwindow.py index 6273b3382..21fb704e1 100644 --- a/qutebrowser/mainwindow/mainwindow.py +++ b/qutebrowser/mainwindow/mainwindow.py @@ -27,7 +27,7 @@ from typing import List, MutableSequence, Optional, Tuple, cast from PyQt5.QtCore import (pyqtBoundSignal, pyqtSlot, QRect, QPoint, QTimer, Qt, QCoreApplication, QEventLoop, QByteArray) -from PyQt5.QtWidgets import QWidget, QVBoxLayout, QApplication, QSizePolicy +from PyQt5.QtWidgets import QWidget, QVBoxLayout, QSizePolicy from PyQt5.QtGui import QPalette from qutebrowser.commands import runners @@ -39,7 +39,7 @@ from qutebrowser.mainwindow import messageview, prompt from qutebrowser.completion import completionwidget, completer from qutebrowser.keyinput import modeman from qutebrowser.browser import commands, downloadview, hints, downloads -from qutebrowser.misc import crashsignal, keyhintwidget, sessions +from qutebrowser.misc import crashsignal, keyhintwidget, sessions, objects from qutebrowser.qt import sip @@ -100,7 +100,7 @@ def raise_window(window, alert=True): window.activateWindow() if alert: - QApplication.instance().alert(window) + objects.qapp.alert(window) def get_target_window(): @@ -275,7 +275,7 @@ class MainWindow(QWidget): QTimer.singleShot(0, self._connect_overlay_signals) config.instance.changed.connect(self._on_config_changed) - QApplication.instance().new_window.emit(self) + objects.qapp.new_window.emit(self) self._set_decoration(config.val.window.hide_decoration) self.state_before_fullscreen = self.windowState() diff --git a/qutebrowser/mainwindow/windowundo.py b/qutebrowser/mainwindow/windowundo.py index af7b2766a..34e1097c2 100644 --- a/qutebrowser/mainwindow/windowundo.py +++ b/qutebrowser/mainwindow/windowundo.py @@ -24,10 +24,10 @@ from typing import MutableSequence, cast import attr from PyQt5.QtCore import QObject -from PyQt5.QtWidgets import QApplication from qutebrowser.config import config from qutebrowser.mainwindow import mainwindow +from qutebrowser.misc import objects instance = cast('WindowUndoManager', None) @@ -49,7 +49,7 @@ class WindowUndoManager(QObject): def __init__(self, parent=None): super().__init__(parent) self._undos: MutableSequence[_WindowUndoEntry] = collections.deque() - QApplication.instance().window_closing.connect(self._on_window_closing) + objects.qapp.window_closing.connect(self._on_window_closing) config.instance.changed.connect(self._on_config_changed) @config.change_filter('tabs.undo_stack_size') @@ -88,4 +88,4 @@ class WindowUndoManager(QObject): def init(): global instance - instance = WindowUndoManager(parent=QApplication.instance()) + instance = WindowUndoManager(parent=objects.qapp) diff --git a/qutebrowser/misc/backendproblem.py b/qutebrowser/misc/backendproblem.py index aaa0e89fc..fc8afe603 100644 --- a/qutebrowser/misc/backendproblem.py +++ b/qutebrowser/misc/backendproblem.py @@ -30,8 +30,8 @@ from typing import Any, List, Sequence, Tuple import attr from PyQt5.QtCore import Qt -from PyQt5.QtWidgets import (QApplication, QDialog, QPushButton, QHBoxLayout, - QVBoxLayout, QLabel, QMessageBox, QWidget) +from PyQt5.QtWidgets import (QDialog, QPushButton, QHBoxLayout, QVBoxLayout, QLabel, + QMessageBox, QWidget) from PyQt5.QtNetwork import QSslSocket from qutebrowser.config import config, configfiles @@ -236,7 +236,7 @@ class _BackendProblemChecker: if os.environ.get('QUTE_SKIP_WAYLAND_WEBGL_CHECK'): return - platform = QApplication.instance().platformName() + platform = objects.qapp.platformName() if platform not in ['wayland', 'wayland-egl']: return diff --git a/qutebrowser/misc/crashdialog.py b/qutebrowser/misc/crashdialog.py index 41160198a..76791ae18 100644 --- a/qutebrowser/misc/crashdialog.py +++ b/qutebrowser/misc/crashdialog.py @@ -33,12 +33,12 @@ from typing import List, Tuple from PyQt5.QtCore import pyqtSlot, Qt, QSize from PyQt5.QtWidgets import (QDialog, QLabel, QTextEdit, QPushButton, QVBoxLayout, QHBoxLayout, QCheckBox, - QDialogButtonBox, QApplication, QMessageBox) + QDialogButtonBox, QMessageBox) import qutebrowser from qutebrowser.utils import version, log, utils from qutebrowser.misc import (miscwidgets, autoupdate, msgbox, httpclient, - pastebin) + pastebin, objects) from qutebrowser.config import config, configfiles from qutebrowser.browser import history @@ -241,8 +241,7 @@ class _CrashDialog(QDialog): exc: An exception tuple (type, value, traceback) """ try: - application = QApplication.instance() - launch_time = application.launch_time.ctime() + launch_time = objects.qapp.launch_time.ctime() crash_time = datetime.datetime.now().ctime() text = 'Launch: {}\nCrash: {}'.format(launch_time, crash_time) self._crash_info.append(('Timestamps', text)) diff --git a/qutebrowser/misc/objects.py b/qutebrowser/misc/objects.py index c2e20e9ad..e8815d13a 100644 --- a/qutebrowser/misc/objects.py +++ b/qutebrowser/misc/objects.py @@ -26,6 +26,7 @@ import argparse from typing import TYPE_CHECKING, Any, Dict, Set, Union, cast if TYPE_CHECKING: + from PyQt5.QtWidgets import QApplication from qutebrowser.utils import usertypes from qutebrowser.commands import command @@ -46,3 +47,4 @@ backend: Union['usertypes.Backend', NoBackend] = NoBackend() commands: Dict[str, 'command.Command'] = {} debug_flags: Set[str] = set() args = cast(argparse.Namespace, None) +qapp = cast('QApplication', None) diff --git a/qutebrowser/misc/quitter.py b/qutebrowser/misc/quitter.py index 86342d57b..2aadac52c 100644 --- a/qutebrowser/misc/quitter.py +++ b/qutebrowser/misc/quitter.py @@ -32,7 +32,6 @@ import subprocess from typing import Iterable, Mapping, MutableSequence, Sequence, cast from PyQt5.QtCore import QObject, pyqtSignal, QTimer -from PyQt5.QtWidgets import QApplication try: import hunter except ImportError: @@ -267,7 +266,7 @@ class Quitter(QObject): else: print("Now logging late shutdown.", file=sys.stderr) hunter.trace() - QApplication.instance().exit(status) + objects.qapp.exit(status) @cmdutils.register(name='quit') @@ -311,7 +310,6 @@ def restart() -> None: def init(args: argparse.Namespace) -> None: """Initialize the global Quitter instance.""" global instance - qapp = QApplication.instance() - instance = Quitter(args=args, parent=qapp) + instance = Quitter(args=args, parent=objects.qapp) instance.shutting_down.connect(log.shutdown_log) - qapp.lastWindowClosed.connect(instance.on_last_window_closed) + objects.qapp.lastWindowClosed.connect(instance.on_last_window_closed) diff --git a/qutebrowser/misc/sessions.py b/qutebrowser/misc/sessions.py index b4aa72f32..d38b538d4 100644 --- a/qutebrowser/misc/sessions.py +++ b/qutebrowser/misc/sessions.py @@ -28,7 +28,6 @@ import shutil from typing import Any, Iterable, MutableMapping, MutableSequence, Optional, Union, cast from PyQt5.QtCore import Qt, QUrl, QObject, QPoint, QTimer, QDateTime -from PyQt5.QtWidgets import QApplication import yaml from qutebrowser.utils import (standarddir, objreg, qtutils, log, message, @@ -38,6 +37,7 @@ from qutebrowser.config import config, configfiles from qutebrowser.completion.models import miscmodels from qutebrowser.mainwindow import mainwindow from qutebrowser.qt import sip +from qutebrowser.misc import objects _JsonType = MutableMapping[str, Any] @@ -283,7 +283,7 @@ class SessionManager(QObject): continue win_data: _JsonType = {} - active_window = QApplication.instance().activeWindow() + active_window = objects.qapp.activeWindow() if getattr(active_window, 'win_id', None) == win_id: win_data['active'] = True win_data['geometry'] = bytes(main_window.saveGeometry()) diff --git a/qutebrowser/utils/debug.py b/qutebrowser/utils/debug.py index 229a26ead..531996e03 100644 --- a/qutebrowser/utils/debug.py +++ b/qutebrowser/utils/debug.py @@ -29,9 +29,9 @@ from typing import ( Any, Callable, List, Mapping, MutableSequence, Optional, Sequence, Type, Union) from PyQt5.QtCore import Qt, QEvent, QMetaMethod, QObject, pyqtBoundSignal -from PyQt5.QtWidgets import QApplication from qutebrowser.utils import log, utils, qtutils, objreg +from qutebrowser.misc import objects from qutebrowser.qt import sip @@ -314,7 +314,7 @@ class log_time: # noqa: N801,N806 pylint: disable=invalid-name def _get_widgets() -> Sequence[str]: """Get a string list of all widgets.""" - widgets = QApplication.instance().allWidgets() + widgets = objects.qapp.allWidgets() widgets.sort(key=repr) return [repr(w) for w in widgets] @@ -338,7 +338,7 @@ def get_all_objects(start_obj: QObject = None) -> str: output += widget_lines if start_obj is None: - start_obj = QApplication.instance() + start_obj = objects.qapp pyqt_lines: List[str] = [] _get_pyqt_objects(pyqt_lines, start_obj) diff --git a/qutebrowser/utils/qtutils.py b/qutebrowser/utils/qtutils.py index 6be2ff1bb..a26438dd3 100644 --- a/qutebrowser/utils/qtutils.py +++ b/qutebrowser/utils/qtutils.py @@ -37,7 +37,6 @@ from PyQt5.QtCore import (qVersion, QEventLoop, QDataStream, QByteArray, QIODevice, QFileDevice, QSaveFile, QT_VERSION_STR, PYQT_VERSION_STR, QObject, QUrl) from PyQt5.QtGui import QColor -from PyQt5.QtWidgets import QApplication try: from PyQt5.QtWebKit import qWebKitVersion except ImportError: # pragma: no cover @@ -126,7 +125,7 @@ def is_single_process() -> bool: if objects.backend == usertypes.Backend.QtWebKit: return False assert objects.backend == usertypes.Backend.QtWebEngine, objects.backend - args = QApplication.instance().arguments() + args = objects.qapp.arguments() return '--single-process' in args diff --git a/qutebrowser/utils/version.py b/qutebrowser/utils/version.py index 175d0d715..3640aef10 100644 --- a/qutebrowser/utils/version.py +++ b/qutebrowser/utils/version.py @@ -529,8 +529,7 @@ def _backend() -> str: def _uptime() -> datetime.timedelta: - launch_time = QApplication.instance().launch_time - time_delta = datetime.datetime.now() - launch_time + time_delta = datetime.datetime.now() - objects.qapp.launch_time # Round off microseconds time_delta -= datetime.timedelta(microseconds=time_delta.microseconds) return time_delta @@ -576,11 +575,10 @@ def version_info() -> str: if QSslSocket.supportsSsl() else 'no'), ] - qapp = QApplication.instance() - if qapp: - style = qapp.style() + if objects.qapp: + style = objects.qapp.style() lines.append('Style: {}'.format(style.metaObject().className())) - lines.append('Platform plugin: {}'.format(qapp.platformName())) + lines.append('Platform plugin: {}'.format(objects.qapp.platformName())) lines.append('OpenGL: {}'.format(opengl_info())) importpath = os.path.dirname(os.path.abspath(qutebrowser.__file__)) diff --git a/tests/helpers/stubs.py b/tests/helpers/stubs.py index 47fb78f85..997f160ce 100644 --- a/tests/helpers/stubs.py +++ b/tests/helpers/stubs.py @@ -116,13 +116,7 @@ class FakeQApplication: UNSET = object() def __init__(self, *, style=None, all_widgets=None, active_window=None, - instance=UNSET, arguments=None, platform_name=None): - - if instance is self.UNSET: - self.instance = mock.Mock(return_value=self) - else: - self.instance = mock.Mock(return_value=instance) - + arguments=None, platform_name=None): self.style = mock.Mock(spec=QCommonStyle) self.style().metaObject().className.return_value = style diff --git a/tests/unit/keyinput/test_modeman.py b/tests/unit/keyinput/test_modeman.py index b473294f8..037b0098b 100644 --- a/tests/unit/keyinput/test_modeman.py +++ b/tests/unit/keyinput/test_modeman.py @@ -23,6 +23,7 @@ from PyQt5.QtCore import Qt, QObject, pyqtSignal from qutebrowser.utils import usertypes from qutebrowser.keyinput import keyutils +from qutebrowser.misc import objects class FakeKeyparser(QObject): @@ -46,6 +47,11 @@ def modeman(mode_manager): return mode_manager +@pytest.fixture(autouse=True) +def set_qapp(monkeypatch, qapp): + monkeypatch.setattr(objects, 'qapp', qapp) + + @pytest.mark.parametrize('key, modifiers, filtered', [ (Qt.Key_A, Qt.NoModifier, True), (Qt.Key_Up, Qt.NoModifier, False), diff --git a/tests/unit/utils/test_debug.py b/tests/unit/utils/test_debug.py index 68484e3c5..2424c2a0b 100644 --- a/tests/unit/utils/test_debug.py +++ b/tests/unit/utils/test_debug.py @@ -29,6 +29,7 @@ from PyQt5.QtCore import pyqtSignal, Qt, QEvent, QObject, QTimer from PyQt5.QtWidgets import QStyle, QFrame, QSpinBox from qutebrowser.utils import debug +from qutebrowser.misc import objects @debug.log_events @@ -271,7 +272,7 @@ class TestGetAllObjects: # pylint: disable=unused-variable widgets = [self.Object('Widget 1'), self.Object('Widget 2')] app = stubs.FakeQApplication(all_widgets=widgets) - monkeypatch.setattr(debug, 'QApplication', app) + monkeypatch.setattr(objects, 'qapp', app) root = QObject() o1 = self.Object('Object 1', root) @@ -293,9 +294,9 @@ class TestGetAllObjects: assert debug.get_all_objects(start_obj=root) == expected - @pytest.mark.usefixtures('qapp') - def test_get_all_objects_qapp(self): - objects = debug.get_all_objects() + def test_get_all_objects_qapp(self, qapp, monkeypatch): + monkeypatch.setattr(objects, 'qapp', qapp) + objs = debug.get_all_objects() event_dispatcher = '