Add a wrapper around sip

Starting with PyQt 5.11, the sip module now is bundled with PyQt as PyQt.sip.
Having a qutebrowser.qt also helps with #3625, see #995
This commit is contained in:
Florian Bruhin 2018-06-23 15:57:30 +02:00
parent f7ae7e7d40
commit c3455d9082
17 changed files with 47 additions and 15 deletions

View File

@ -21,6 +21,7 @@ v1.4.0 (unreleased)
Added Added
~~~~~ ~~~~~
- Support for the bundled `sip` module in PyQt 5.11.
- New `--debug-flag log-requests` to log requests to the debug log for - New `--debug-flag log-requests` to log requests to the debug log for
debugging. debugging.
- New `--first` flag for `:hint` (bound to `gi` for inputs) which automatically - New `--first` flag for `:hint` (bound to `gi` for inputs) which automatically

View File

@ -22,7 +22,6 @@
import enum import enum
import itertools import itertools
import sip
import attr import attr
from PyQt5.QtCore import pyqtSignal, pyqtSlot, QUrl, QObject, QSizeF, Qt from PyQt5.QtCore import pyqtSignal, pyqtSlot, QUrl, QObject, QSizeF, Qt
from PyQt5.QtGui import QIcon from PyQt5.QtGui import QIcon
@ -38,6 +37,7 @@ from qutebrowser.utils import (utils, objreg, usertypes, log, qtutils,
urlutils, message) urlutils, message)
from qutebrowser.misc import miscwidgets, objects from qutebrowser.misc import miscwidgets, objects
from qutebrowser.browser import mouse, hints from qutebrowser.browser import mouse, hints
from qutebrowser.qt import sip
tab_id_gen = itertools.count(0) tab_id_gen = itertools.count(0)

View File

@ -29,7 +29,6 @@ import pathlib
import tempfile import tempfile
import enum import enum
import sip
from PyQt5.QtCore import (pyqtSlot, pyqtSignal, Qt, QObject, QModelIndex, from PyQt5.QtCore import (pyqtSlot, pyqtSignal, Qt, QObject, QModelIndex,
QTimer, QAbstractListModel, QUrl) QTimer, QAbstractListModel, QUrl)
@ -37,6 +36,7 @@ from qutebrowser.commands import cmdexc, cmdutils
from qutebrowser.config import config from qutebrowser.config import config
from qutebrowser.utils import (usertypes, standarddir, utils, message, log, from qutebrowser.utils import (usertypes, standarddir, utils, message, log,
qtutils) qtutils)
from qutebrowser.qt import sip
ModelRole = enum.IntEnum('ModelRole', ['item'], start=Qt.UserRole) ModelRole = enum.IntEnum('ModelRole', ['item'], start=Qt.UserRole)

View File

@ -21,13 +21,13 @@
import functools import functools
import sip
from PyQt5.QtCore import pyqtSlot, QSize, Qt, QTimer from PyQt5.QtCore import pyqtSlot, QSize, Qt, QTimer
from PyQt5.QtWidgets import QListView, QSizePolicy, QMenu, QStyleFactory from PyQt5.QtWidgets import QListView, QSizePolicy, QMenu, QStyleFactory
from qutebrowser.browser import downloads from qutebrowser.browser import downloads
from qutebrowser.config import config from qutebrowser.config import config
from qutebrowser.utils import qtutils, utils, objreg from qutebrowser.utils import qtutils, utils, objreg
from qutebrowser.qt import sip
def update_geometry(obj): def update_geometry(obj):

View File

@ -34,7 +34,6 @@ import urllib
import collections import collections
import pkg_resources import pkg_resources
import sip
from PyQt5.QtCore import QUrlQuery, QUrl from PyQt5.QtCore import QUrlQuery, QUrl
import qutebrowser import qutebrowser
@ -42,6 +41,7 @@ from qutebrowser.config import config, configdata, configexc, configdiff
from qutebrowser.utils import (version, utils, jinja, log, message, docutils, from qutebrowser.utils import (version, utils, jinja, log, message, docutils,
objreg, urlutils) objreg, urlutils)
from qutebrowser.misc import objects from qutebrowser.misc import objects
from qutebrowser.qt import sip
pyeval_output = ":pyeval was never called" pyeval_output = ":pyeval was never called"

View File

@ -25,7 +25,6 @@ import sys
import re import re
import html as html_utils import html as html_utils
import sip
from PyQt5.QtCore import (pyqtSignal, pyqtSlot, Qt, QEvent, QPoint, QPointF, from PyQt5.QtCore import (pyqtSignal, pyqtSlot, Qt, QEvent, QPoint, QPointF,
QUrl, QTimer, QObject, qVersion) QUrl, QTimer, QObject, qVersion)
from PyQt5.QtGui import QKeyEvent, QIcon from PyQt5.QtGui import QKeyEvent, QIcon
@ -42,6 +41,7 @@ from qutebrowser.browser.webengine import (webview, webengineelem, tabhistory,
from qutebrowser.misc import miscwidgets from qutebrowser.misc import miscwidgets
from qutebrowser.utils import (usertypes, qtutils, log, javascript, utils, from qutebrowser.utils import (usertypes, qtutils, log, javascript, utils,
message, objreg, jinja, debug) message, objreg, jinja, debug)
from qutebrowser.qt import sip
_qute_scheme_handler = None _qute_scheme_handler = None

View File

@ -19,7 +19,6 @@
"""The main browser widget for QtWebEngine.""" """The main browser widget for QtWebEngine."""
import sip
from PyQt5.QtCore import pyqtSignal, QUrl, PYQT_VERSION from PyQt5.QtCore import pyqtSignal, QUrl, PYQT_VERSION
from PyQt5.QtGui import QPalette from PyQt5.QtGui import QPalette
from PyQt5.QtWidgets import QWidget from PyQt5.QtWidgets import QWidget
@ -30,6 +29,7 @@ from qutebrowser.browser.webengine import webenginesettings, certificateerror
from qutebrowser.config import config from qutebrowser.config import config
from qutebrowser.utils import log, debug, usertypes, objreg, qtutils from qutebrowser.utils import log, debug, usertypes, objreg, qtutils
from qutebrowser.misc import miscwidgets from qutebrowser.misc import miscwidgets
from qutebrowser.qt import sip
class WebEngineView(QWebEngineView): class WebEngineView(QWebEngineView):

View File

@ -23,7 +23,6 @@ import re
import functools import functools
import xml.etree.ElementTree import xml.etree.ElementTree
import sip
from PyQt5.QtCore import (pyqtSlot, Qt, QEvent, QUrl, QPoint, QTimer, QSizeF, from PyQt5.QtCore import (pyqtSlot, Qt, QEvent, QUrl, QPoint, QTimer, QSizeF,
QSize) QSize)
from PyQt5.QtGui import QKeyEvent, QIcon from PyQt5.QtGui import QKeyEvent, QIcon
@ -35,6 +34,7 @@ from qutebrowser.browser import browsertab, shared
from qutebrowser.browser.webkit import (webview, tabhistory, webkitelem, from qutebrowser.browser.webkit import (webview, tabhistory, webkitelem,
webkitsettings) webkitsettings)
from qutebrowser.utils import qtutils, usertypes, utils, log, debug from qutebrowser.utils import qtutils, usertypes, utils, log, debug
from qutebrowser.qt import sip
class WebKitAction(browsertab.AbstractAction): class WebKitAction(browsertab.AbstractAction):

View File

@ -22,7 +22,6 @@
import html import html
import functools import functools
import sip
from PyQt5.QtCore import pyqtSlot, pyqtSignal, Qt, QUrl, QPoint from PyQt5.QtCore import pyqtSlot, pyqtSignal, Qt, QUrl, QPoint
from PyQt5.QtGui import QDesktopServices from PyQt5.QtGui import QDesktopServices
from PyQt5.QtNetwork import QNetworkReply, QNetworkRequest from PyQt5.QtNetwork import QNetworkReply, QNetworkRequest
@ -35,6 +34,7 @@ from qutebrowser.browser import pdfjs, shared
from qutebrowser.browser.webkit import http from qutebrowser.browser.webkit import http
from qutebrowser.browser.webkit.network import networkmanager from qutebrowser.browser.webkit.network import networkmanager
from qutebrowser.utils import message, usertypes, log, jinja, objreg from qutebrowser.utils import message, usertypes, log, jinja, objreg
from qutebrowser.qt import sip
class BrowserPage(QWebPage): class BrowserPage(QWebPage):

View File

@ -24,7 +24,6 @@ import html
import collections import collections
import attr import attr
import sip
from PyQt5.QtCore import (pyqtSlot, pyqtSignal, Qt, QTimer, QDir, QModelIndex, from PyQt5.QtCore import (pyqtSlot, pyqtSignal, Qt, QTimer, QDir, QModelIndex,
QItemSelectionModel, QObject, QEventLoop) QItemSelectionModel, QObject, QEventLoop)
from PyQt5.QtWidgets import (QWidget, QGridLayout, QVBoxLayout, QLineEdit, from PyQt5.QtWidgets import (QWidget, QGridLayout, QVBoxLayout, QLineEdit,
@ -36,6 +35,7 @@ from qutebrowser.config import config
from qutebrowser.utils import usertypes, log, utils, qtutils, objreg, message from qutebrowser.utils import usertypes, log, utils, qtutils, objreg, message
from qutebrowser.keyinput import modeman from qutebrowser.keyinput import modeman
from qutebrowser.commands import cmdutils, cmdexc from qutebrowser.commands import cmdutils, cmdexc
from qutebrowser.qt import sip
prompt_queue = None prompt_queue = None

View File

@ -246,7 +246,7 @@ def configure_pyqt():
from PyQt5.QtCore import pyqtRemoveInputHook from PyQt5.QtCore import pyqtRemoveInputHook
pyqtRemoveInputHook() pyqtRemoveInputHook()
import sip from qutebrowser.qt import sip
try: try:
# Added in sip 4.19.4 # Added in sip 4.19.4
sip.enableoverflowchecking(True) sip.enableoverflowchecking(True)

View File

@ -24,7 +24,6 @@ import os.path
import itertools import itertools
import urllib import urllib
import sip
from PyQt5.QtCore import QUrl, QObject, QPoint, QTimer from PyQt5.QtCore import QUrl, QObject, QPoint, QTimer
from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QApplication
import yaml import yaml
@ -35,6 +34,7 @@ from qutebrowser.commands import cmdexc, cmdutils
from qutebrowser.config import config, configfiles from qutebrowser.config import config, configfiles
from qutebrowser.completion.models import miscmodels from qutebrowser.completion.models import miscmodels
from qutebrowser.mainwindow import mainwindow from qutebrowser.mainwindow import mainwindow
from qutebrowser.qt import sip
default = object() # Sentinel value default = object() # Sentinel value

View File

@ -29,7 +29,6 @@ try:
except ImportError: except ImportError:
hunter = None hunter = None
import sip
from PyQt5.QtCore import QUrl from PyQt5.QtCore import QUrl
# so it's available for :debug-pyeval # so it's available for :debug-pyeval
from PyQt5.QtWidgets import QApplication # pylint: disable=unused-import from PyQt5.QtWidgets import QApplication # pylint: disable=unused-import
@ -40,6 +39,7 @@ from qutebrowser.commands import cmdutils, runners, cmdexc
from qutebrowser.config import config, configdata from qutebrowser.config import config, configdata
from qutebrowser.misc import consolewidget from qutebrowser.misc import consolewidget
from qutebrowser.utils.version import pastebin_version from qutebrowser.utils.version import pastebin_version
from qutebrowser.qt import sip
@cmdutils.register(maxsplit=1, no_cmd_split=True, no_replace_variables=True) @cmdutils.register(maxsplit=1, no_cmd_split=True, no_replace_variables=True)

28
qutebrowser/qt.py Normal file
View File

@ -0,0 +1,28 @@
# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et:
# Copyright 2018 Florian Bruhin (The Compiler) <mail@qutebrowser.org>
#
# This file is part of qutebrowser.
#
# qutebrowser is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# qutebrowser is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>.
"""Wrappers around Qt/PyQt code."""
# pylint: disable=unused-import
# PyQt 5.11 comes with a bundled sip,
# for older PyQt versions it's a separate module.
try:
from PyQt5 import sip
except ImportError:
import sip

View File

@ -62,7 +62,10 @@ check_pyqt() {
python3 <<EOF python3 <<EOF
import sys import sys
from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR, qVersion from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR, qVersion
from sip import SIP_VERSION_STR try:
from PyQt.sip import SIP_VERSION_STR
except ModuleNotFoundError:
from sip import SIP_VERSION_STR
print("Python {}".format(sys.version)) print("Python {}".format(sys.version))
print("PyQt5 {}".format(PYQT_VERSION_STR)) print("PyQt5 {}".format(PYQT_VERSION_STR))

View File

@ -25,7 +25,6 @@ import os
import sys import sys
import warnings import warnings
import sip
import pytest import pytest
import hypothesis import hypothesis
from PyQt5.QtCore import qVersion, PYQT_VERSION from PyQt5.QtCore import qVersion, PYQT_VERSION
@ -38,6 +37,7 @@ from helpers.messagemock import message_mock
from helpers.fixtures import * # noqa: F403 from helpers.fixtures import * # noqa: F403
from qutebrowser.utils import qtutils, standarddir, usertypes, utils, version from qutebrowser.utils import qtutils, standarddir, usertypes, utils, version
from qutebrowser.misc import objects from qutebrowser.misc import objects
from qutebrowser.qt import sip
import qutebrowser.app # To register commands import qutebrowser.app # To register commands

View File

@ -659,7 +659,7 @@ class TestModuleVersions:
The aim of this test is to fail if that gets missing in some future The aim of this test is to fail if that gets missing in some future
version of sip. version of sip.
""" """
import sip from qutebrowser.qt import sip
assert isinstance(sip.SIP_VERSION_STR, str) assert isinstance(sip.SIP_VERSION_STR, str)