summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2021-01-11 12:00:30 +0100
committerFlorian Bruhin <me@the-compiler.org>2021-01-11 18:47:15 +0100
commitc1758230200814e84055f3e2954cb69f0fddf5d8 (patch)
treeb9123f2c04e3337084e0894c0bb17574b9704311
parent8760dc1b17dcf06f7253a9ce7ac7a15af0785492 (diff)
downloadqutebrowser-c1758230200814e84055f3e2954cb69f0fddf5d8.tar.gz
qutebrowser-c1758230200814e84055f3e2954cb69f0fddf5d8.zip
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
-rw-r--r--qutebrowser/app.py38
-rw-r--r--qutebrowser/browser/commands.py2
-rw-r--r--qutebrowser/browser/webkit/network/networkmanager.py12
-rw-r--r--qutebrowser/components/readlinecommands.py6
-rw-r--r--qutebrowser/keyinput/eventfilter.py11
-rw-r--r--qutebrowser/keyinput/modeman.py4
-rw-r--r--qutebrowser/mainwindow/mainwindow.py8
-rw-r--r--qutebrowser/mainwindow/windowundo.py6
-rw-r--r--qutebrowser/misc/backendproblem.py6
-rw-r--r--qutebrowser/misc/crashdialog.py7
-rw-r--r--qutebrowser/misc/objects.py2
-rw-r--r--qutebrowser/misc/quitter.py8
-rw-r--r--qutebrowser/misc/sessions.py4
-rw-r--r--qutebrowser/utils/debug.py6
-rw-r--r--qutebrowser/utils/qtutils.py3
-rw-r--r--qutebrowser/utils/version.py10
-rw-r--r--tests/helpers/stubs.py8
-rw-r--r--tests/unit/keyinput/test_modeman.py6
-rw-r--r--tests/unit/utils/test_debug.py11
-rw-r--r--tests/unit/utils/test_qtutils.py2
-rw-r--r--tests/unit/utils/test_version.py8
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 = '<PyQt5.QtCore.QAbstractEventDispatcher object at'
session_manager = '<PyQt5.QtGui.QSessionManager object at'
- assert event_dispatcher in objects or session_manager in objects
+ assert event_dispatcher in objs or session_manager in objs
diff --git a/tests/unit/utils/test_qtutils.py b/tests/unit/utils/test_qtutils.py
index 816cd8621..e68136695 100644
--- a/tests/unit/utils/test_qtutils.py
+++ b/tests/unit/utils/test_qtutils.py
@@ -122,7 +122,7 @@ def test_is_new_qtwebkit(monkeypatch, version, is_new):
])
def test_is_single_process(monkeypatch, stubs, backend, arguments, single_process):
qapp = stubs.FakeQApplication(arguments=arguments)
- monkeypatch.setattr(qtutils, 'QApplication', qapp)
+ monkeypatch.setattr(qtutils.objects, 'qapp', qapp)
monkeypatch.setattr(qtutils.objects, 'backend', backend)
assert qtutils.is_single_process() == single_process
diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py
index e16bd2318..7633cd92b 100644
--- a/tests/unit/utils/test_version.py
+++ b/tests/unit/utils/test_version.py
@@ -989,10 +989,8 @@ def test_version_info(params, stubs, monkeypatch, config_stub):
'platform.architecture': lambda: ('ARCHITECTURE', ''),
'_os_info': lambda: ['OS INFO 1', 'OS INFO 2'],
'_path_info': lambda: {'PATH DESC': 'PATH NAME'},
- 'QApplication': (stubs.FakeQApplication(style='STYLE',
- platform_name='PLATFORM')
- if params.qapp else
- stubs.FakeQApplication(instance=None)),
+ 'objects.qapp': (stubs.FakeQApplication(style='STYLE', platform_name='PLATFORM')
+ if params.qapp else None),
'QLibraryInfo.location': (lambda _loc: 'QT PATH'),
'sql.version': lambda: 'SQLITE VERSION',
'_uptime': lambda: datetime.timedelta(hours=1, minutes=23, seconds=45),
@@ -1214,6 +1212,8 @@ def test_pastebin_version_error(pbclient, caplog, message_mock, monkeypatch):
def test_uptime(monkeypatch, qapp):
"""Test _uptime runs and check if microseconds are dropped."""
+ monkeypatch.setattr(objects, 'qapp', qapp)
+
launch_time = datetime.datetime(1, 1, 1, 1, 1, 1, 1)
monkeypatch.setattr(qapp, "launch_time", launch_time, raising=False)