summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <git@the-compiler.org>2017-10-12 19:11:47 +0200
committerFlorian Bruhin <git@the-compiler.org>2017-10-12 19:13:20 +0200
commitdfe2f9e38c342ae9e36c85e8c8b4dc3c595c2a1d (patch)
tree213bd4b3afee887016c89dd56373e864c8b9d673
parent4f870f902c086d1cf2cecb33018ccc7a338c7057 (diff)
downloadqutebrowser-dfe2f9e38c342ae9e36c85e8c8b4dc3c595c2a1d.tar.gz
qutebrowser-dfe2f9e38c342ae9e36c85e8c8b4dc3c595c2a1d.zip
Also check PyQt version for qtutils.version_check()
With an older PyQt built against a newer Qt, we still don't have its features available. This also drops support for exact=True with compiled=True as the semantics for that are unclear, and it's not used.
-rw-r--r--qutebrowser/utils/qtutils.py11
-rw-r--r--tests/end2end/conftest.py5
-rw-r--r--tests/unit/utils/test_qtutils.py39
3 files changed, 33 insertions, 22 deletions
diff --git a/qutebrowser/utils/qtutils.py b/qutebrowser/utils/qtutils.py
index 3b00f7e71..87978274f 100644
--- a/qutebrowser/utils/qtutils.py
+++ b/qutebrowser/utils/qtutils.py
@@ -33,7 +33,8 @@ import contextlib
import pkg_resources
from PyQt5.QtCore import (qVersion, QEventLoop, QDataStream, QByteArray,
- QIODevice, QSaveFile, QT_VERSION_STR)
+ QIODevice, QSaveFile, QT_VERSION_STR,
+ PYQT_VERSION_STR)
try:
from PyQt5.QtWebKit import qWebKitVersion
except ImportError: # pragma: no cover
@@ -82,12 +83,18 @@ def version_check(version, exact=False, compiled=True):
# Catch code using the old API for this
assert exact not in [operator.gt, operator.lt, operator.ge, operator.le,
operator.eq], exact
+ if compiled and exact:
+ raise ValueError("Can't use compiled=True with exact=True!")
+
parsed = pkg_resources.parse_version(version)
op = operator.eq if exact else operator.ge
result = op(pkg_resources.parse_version(qVersion()), parsed)
if compiled and result:
- # v1 ==/>= parsed, now check if v2 ==/>= parsed too.
+ # qVersion() ==/>= parsed, now check if QT_VERSION_STR ==/>= parsed.
result = op(pkg_resources.parse_version(QT_VERSION_STR), parsed)
+ if compiled and result:
+ # FInally, check PYQT_VERSION_STR as well.
+ result = op(pkg_resources.parse_version(PYQT_VERSION_STR), parsed)
return result
diff --git a/tests/end2end/conftest.py b/tests/end2end/conftest.py
index 0b5b85505..d680a8d98 100644
--- a/tests/end2end/conftest.py
+++ b/tests/end2end/conftest.py
@@ -84,10 +84,11 @@ def _get_version_tag(tag):
if package == 'qt':
op = match.group('operator')
do_skip = {
- '==': not qtutils.version_check(version, exact=True),
+ '==': not qtutils.version_check(version, exact=True,
+ compiled=False),
'>=': not qtutils.version_check(version),
'<': qtutils.version_check(version),
- '!=': qtutils.version_check(version, exact=True),
+ '!=': qtutils.version_check(version, exact=True, compiled=False),
}
return pytest.mark.skipif(do_skip[op], reason='Needs ' + tag)
elif package == 'pyqt':
diff --git a/tests/unit/utils/test_qtutils.py b/tests/unit/utils/test_qtutils.py
index 64870f82c..c7372130f 100644
--- a/tests/unit/utils/test_qtutils.py
+++ b/tests/unit/utils/test_qtutils.py
@@ -39,34 +39,36 @@ from qutebrowser.utils import qtutils, utils
import overflow_test_cases
-@pytest.mark.parametrize('qversion, compiled, version, exact, expected', [
+@pytest.mark.parametrize(['qversion', 'compiled', 'pyqt', 'version', 'exact',
+ 'expected'], [
# equal versions
- ('5.4.0', None, '5.4.0', False, True),
- ('5.4.0', None, '5.4.0', True, True), # exact=True
- ('5.4.0', None, '5.4', True, True), # without trailing 0
+ ('5.4.0', None, None, '5.4.0', False, True),
+ ('5.4.0', None, None, '5.4.0', True, True), # exact=True
+ ('5.4.0', None, None, '5.4', True, True), # without trailing 0
# newer version installed
- ('5.4.1', None, '5.4', False, True),
- ('5.4.1', None, '5.4', True, False), # exact=True
+ ('5.4.1', None, None, '5.4', False, True),
+ ('5.4.1', None, None, '5.4', True, False), # exact=True
# older version installed
- ('5.3.2', None, '5.4', False, False),
- ('5.3.0', None, '5.3.2', False, False),
- ('5.3.0', None, '5.3.2', True, False), # exact=True
- # strict
- ('5.4.0', '5.3.0', '5.4.0', False, False),
- ('5.4.0', '5.4.0', '5.4.0', False, True),
- # strict and exact=True
- ('5.4.0', '5.5.0', '5.4.0', True, False),
- ('5.5.0', '5.4.0', '5.4.0', True, False),
- ('5.4.0', '5.4.0', '5.4.0', True, True),
+ ('5.3.2', None, None, '5.4', False, False),
+ ('5.3.0', None, None, '5.3.2', False, False),
+ ('5.3.0', None, None, '5.3.2', True, False), # exact=True
+ # compiled=True
+ # new Qt runtime, but compiled against older version
+ ('5.4.0', '5.3.0', '5.4.0', '5.4.0', False, False),
+ # new Qt runtime, compiled against new version, but old PyQt
+ ('5.4.0', '5.4.0', '5.3.0', '5.4.0', False, False),
+ # all up-to-date
+ ('5.4.0', '5.4.0', '5.4.0', '5.4.0', False, True),
])
-def test_version_check(monkeypatch, qversion, compiled, version, exact,
+def test_version_check(monkeypatch, qversion, compiled, pyqt, version, exact,
expected):
"""Test for version_check().
Args:
monkeypatch: The pytest monkeypatch fixture.
qversion: The version to set as fake qVersion().
- compiled: The value for QT_VERSION_STR (set strict=True)
+ compiled: The value for QT_VERSION_STR (set compiled=False)
+ pyqt: The value for PYQT_VERSION_STR (set compiled=False)
version: The version to compare with.
exact: Use exact comparing (==)
expected: The expected result.
@@ -74,6 +76,7 @@ def test_version_check(monkeypatch, qversion, compiled, version, exact,
monkeypatch.setattr(qtutils, 'qVersion', lambda: qversion)
if compiled is not None:
monkeypatch.setattr(qtutils, 'QT_VERSION_STR', compiled)
+ monkeypatch.setattr(qtutils, 'PYQT_VERSION_STR', pyqt)
compiled_arg = True
else:
compiled_arg = False