summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2021-01-11 21:17:36 +0100
committerGitHub <noreply@github.com>2021-01-11 21:17:36 +0100
commit4b7d52ae7cdf52ebef038b4a90b9fe95ab002105 (patch)
treeb9123f2c04e3337084e0894c0bb17574b9704311
parent5c23ac8429b194ad60ba846e94ec39f6b466114e (diff)
parentc1758230200814e84055f3e2954cb69f0fddf5d8 (diff)
downloadqutebrowser-4b7d52ae7cdf52ebef038b4a90b9fe95ab002105.tar.gz
qutebrowser-4b7d52ae7cdf52ebef038b4a90b9fe95ab002105.zip
Merge pull request #6030 from qutebrowser/update-dependencies
Update dependencies
-rw-r--r--misc/requirements/requirements-check-manifest.txt2
-rw-r--r--misc/requirements/requirements-dev.txt4
-rw-r--r--misc/requirements/requirements-mypy.txt6
-rw-r--r--misc/requirements/requirements-sphinx.txt2
-rw-r--r--misc/requirements/requirements-tests.txt6
-rw-r--r--misc/requirements/requirements-tox.txt4
-rw-r--r--pytest.ini2
-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--requirements.txt2
-rw-r--r--tests/conftest.py13
-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
30 files changed, 106 insertions, 103 deletions
diff --git a/misc/requirements/requirements-check-manifest.txt b/misc/requirements/requirements-check-manifest.txt
index f2a5f00dd..1fe41314d 100644
--- a/misc/requirements/requirements-check-manifest.txt
+++ b/misc/requirements/requirements-check-manifest.txt
@@ -1,7 +1,7 @@
# This file is automatically generated by scripts/dev/recompile_requirements.py
build==0.1.0
-check-manifest==0.45
+check-manifest==0.46
packaging==20.8
pep517==0.9.1
pyparsing==2.4.7
diff --git a/misc/requirements/requirements-dev.txt b/misc/requirements/requirements-dev.txt
index 2dd1e96b9..3089e2843 100644
--- a/misc/requirements/requirements-dev.txt
+++ b/misc/requirements/requirements-dev.txt
@@ -15,10 +15,10 @@ packaging==20.8
pycparser==2.20
Pympler==0.9
pyparsing==2.4.7
-PyQt-builder==1.6.0
+PyQt-builder==1.7.0
python-dateutil==2.8.1
requests==2.25.1
-sip==5.5.0
+sip==6.0.0
six==1.15.0
toml==0.10.2
uritemplate==3.0.1
diff --git a/misc/requirements/requirements-mypy.txt b/misc/requirements/requirements-mypy.txt
index 4e370dfb7..99907efa2 100644
--- a/misc/requirements/requirements-mypy.txt
+++ b/misc/requirements/requirements-mypy.txt
@@ -1,7 +1,7 @@
# This file is automatically generated by scripts/dev/recompile_requirements.py
-diff-cover==4.0.1
-importlib-resources==4.1.1
+diff-cover==4.1.1
+importlib-resources==5.0.0
inflect==5.0.2
Jinja2==2.11.2
jinja2-pluralize==0.3.0
@@ -11,6 +11,6 @@ mypy==0.790
mypy-extensions==0.4.3
pluggy==0.13.1
Pygments==2.7.3
--e git+https://github.com/stlehmann/PyQt5-stubs.git@998632b9d6771137f9665732b03eba25c8b4e920#egg=PyQt5_stubs
+-e git+https://github.com/stlehmann/PyQt5-stubs.git@307eb693f63bd91ac67631ea57c4620e2c363435#egg=PyQt5_stubs
typed-ast==1.4.2
typing-extensions==3.7.4.3
diff --git a/misc/requirements/requirements-sphinx.txt b/misc/requirements/requirements-sphinx.txt
index 54eb185bc..f8a1b773e 100644
--- a/misc/requirements/requirements-sphinx.txt
+++ b/misc/requirements/requirements-sphinx.txt
@@ -15,7 +15,7 @@ pyparsing==2.4.7
pytz==2020.5
requests==2.25.1
snowballstemmer==2.0.0
-Sphinx==3.4.1
+Sphinx==3.4.3
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==1.0.3
diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt
index dd5daf9ef..9141378cd 100644
--- a/misc/requirements/requirements-tests.txt
+++ b/misc/requirements/requirements-tests.txt
@@ -15,7 +15,7 @@ filelock==3.0.12
Flask==1.1.2
glob2==0.7
hunter==3.3.1
-hypothesis==5.46.0
+hypothesis==6.0.0
icdiff==1.9.1
idna==2.10
iniconfig==1.1.1
@@ -43,13 +43,13 @@ pytest-cov==2.10.1
pytest-forked==1.3.0
pytest-icdiff==0.5
pytest-instafail==0.4.2
-pytest-mock==3.4.0
+pytest-mock==3.5.1
pytest-qt==3.3.0
pytest-repeat==0.9.1
pytest-rerunfailures==9.1.1
pytest-xdist==2.2.0
pytest-xvfb==2.0.0
-PyVirtualDisplay==1.3.2
+PyVirtualDisplay==2.0
requests==2.25.1
requests-file==1.5.1
six==1.15.0
diff --git a/misc/requirements/requirements-tox.txt b/misc/requirements/requirements-tox.txt
index c72393868..f7161c3f6 100644
--- a/misc/requirements/requirements-tox.txt
+++ b/misc/requirements/requirements-tox.txt
@@ -9,5 +9,5 @@ py==1.10.0
pyparsing==2.4.7
six==1.15.0
toml==0.10.2
-tox==3.20.1
-virtualenv==20.2.2
+tox==3.21.0
+virtualenv==20.3.0
diff --git a/pytest.ini b/pytest.ini
index 3705a17ef..73c0d7adf 100644
--- a/pytest.ini
+++ b/pytest.ini
@@ -79,7 +79,5 @@ qt_log_ignore =
xfail_strict = true
filterwarnings =
error
- # See https://github.com/HypothesisWorks/hypothesis/issues/2370
- ignore:.*which is reset between function calls but not between test cases generated by:hypothesis.errors.HypothesisDeprecationWarning
default:Test process .* failed to terminate!:UserWarning
faulthandler_timeout = 90
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/requirements.txt b/requirements.txt
index 48c1991a3..f253f0f9b 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -3,7 +3,7 @@
adblock==0.4.0
attrs==20.3.0
colorama==0.4.4
-importlib-resources==4.1.1 ; python_version<"3.9"
+importlib-resources==5.0.0 ; python_version<"3.9"
Jinja2==2.11.2
MarkupSafe==1.1.1
Pygments==2.7.3
diff --git a/tests/conftest.py b/tests/conftest.py
index fd317d6c4..524325595 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -49,11 +49,20 @@ _qute_scheme_handler = None
# Set hypothesis settings
hypothesis.settings.register_profile(
- 'default', hypothesis.settings(deadline=600))
+ 'default', hypothesis.settings(
+ deadline=600,
+ suppress_health_check=[hypothesis.HealthCheck.function_scoped_fixture],
+ )
+)
hypothesis.settings.register_profile(
'ci', hypothesis.settings(
deadline=None,
- suppress_health_check=[hypothesis.HealthCheck.too_slow]))
+ suppress_health_check=[
+ hypothesis.HealthCheck.function_scoped_fixture,
+ hypothesis.HealthCheck.too_slow,
+ ]
+ )
+)
hypothesis.settings.load_profile('ci' if testutils.ON_CI else 'default')
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)