Skip to content

Commit

Permalink
Fix PyQt5 version check (#1325)
Browse files Browse the repository at this point in the history
  • Loading branch information
vkbo authored Jan 29, 2023
2 parents e2f7e77 + c9fe0ca commit fe6d4de
Show file tree
Hide file tree
Showing 8 changed files with 18 additions and 78 deletions.
4 changes: 2 additions & 2 deletions novelwriter/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,12 +179,12 @@ def main(sysArgs=None):
"At least Python 3.7 is required, found %s" % CONFIG.verPyString
)
errorCode |= 0x04
if CONFIG.verQtValue < 51000:
if CONFIG.verQtValue < 0x050a00:
errorData.append(
"At least Qt5 version 5.10 is required, found %s" % CONFIG.verQtString
)
errorCode |= 0x08
if CONFIG.verPyQtValue < 51000:
if CONFIG.verPyQtValue < 0x050a00:
errorData.append(
"At least PyQt5 version 5.10 is required, found %s" % CONFIG.verPyQtString
)
Expand Down
27 changes: 0 additions & 27 deletions novelwriter/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -277,33 +277,6 @@ def yesNo(value):
return "yes" if value else "no"


def splitVersionNumber(value):
"""Split a version string on the form aa.bb.cc into major, minor
and patch, and computes an integer value aabbcc.
"""
if not isinstance(value, str):
return 0, 0, 0, 0

vMajor = 0
vMinor = 0
vPatch = 0
vInt = 0

vBits = value.split(".")
nBits = len(vBits)

if nBits > 0:
vMajor = checkInt(vBits[0], 0)
if nBits > 1:
vMinor = checkInt(vBits[1], 0)
if nBits > 2:
vPatch = checkInt(vBits[2], 0)

vInt = vMajor*10000 + vMinor*100 + vPatch

return vMajor, vMinor, vPatch, vInt


def transferCase(source, target):
"""Transfers the case of the source word to the target word. This
will consider all upper or lower, and first char capitalisation.
Expand Down
25 changes: 6 additions & 19 deletions novelwriter/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,13 @@
from time import time
from pathlib import Path

from PyQt5.Qt import PYQT_VERSION_STR
from PyQt5.QtCore import (
QT_VERSION_STR, QStandardPaths, QSysInfo, QLocale, QLibraryInfo,
QTranslator
QT_VERSION, QT_VERSION_STR, PYQT_VERSION, PYQT_VERSION_STR, QStandardPaths,
QSysInfo, QLocale, QLibraryInfo, QTranslator
)

from novelwriter.error import logException, formatException
from novelwriter.common import checkPath, splitVersionNumber, formatTimeStamp, NWConfigParser
from novelwriter.common import checkPath, formatTimeStamp, NWConfigParser
from novelwriter.constants import nwFiles, nwUnicode

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -190,25 +189,13 @@ def __init__(self):
# ==========================

# Check Qt5 Versions
verQt = splitVersionNumber(QT_VERSION_STR)
self.verQtString = QT_VERSION_STR
self.verQtMajor = verQt[0]
self.verQtMinor = verQt[1]
self.verQtPatch = verQt[2]
self.verQtValue = verQt[3]

verQt = splitVersionNumber(PYQT_VERSION_STR)
self.verQtString = QT_VERSION_STR
self.verQtValue = QT_VERSION
self.verPyQtString = PYQT_VERSION_STR
self.verPyQtMajor = verQt[0]
self.verPyQtMinor = verQt[1]
self.verPyQtPatch = verQt[2]
self.verPyQtValue = verQt[3]
self.verPyQtValue = PYQT_VERSION

# Check Python Version
self.verPyString = sys.version.split()[0]
self.verPyMajor = sys.version_info[0]
self.verPyMinor = sys.version_info[1]
self.verPyPatch = sys.version_info[2]
self.verPyHexVal = sys.hexversion

# Check OS Type
Expand Down
3 changes: 1 addition & 2 deletions novelwriter/error.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,7 @@ def setMessage(self, exType, exValue, exTrace):
"""
from traceback import format_tb
from novelwriter import __issuesurl__, __version__
from PyQt5.Qt import PYQT_VERSION_STR
from PyQt5.QtCore import QT_VERSION_STR, QSysInfo
from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR, QSysInfo

self.msgHead.setText((
"<p>An unhandled error has been encountered.</p>"
Expand Down
2 changes: 1 addition & 1 deletion novelwriter/gui/doceditor.py
Original file line number Diff line number Diff line change
Expand Up @@ -2512,7 +2512,7 @@ def getSearchObject(self):
# Using the Unicode-capable QRegularExpression class was
# only added in Qt 5.13. Otherwise, 5.3 and up supports
# only the QRegExp class.
if self.mainConf.verQtValue >= 51300:
if self.mainConf.verQtValue >= 0x050d00:
rxOpt = QRegularExpression.UseUnicodePropertiesOption
if not self.isCaseSense:
rxOpt |= QRegularExpression.CaseInsensitiveOption
Expand Down
6 changes: 3 additions & 3 deletions novelwriter/guimain.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,9 +87,9 @@ def __init__(self):
logger.info("OS: %s", self.mainConf.osType)
logger.info("Kernel: %s", self.mainConf.kernelVer)
logger.info("Host: %s", self.mainConf.hostName)
logger.info("Qt5: %s (%d)", self.mainConf.verQtString, self.mainConf.verQtValue)
logger.info("PyQt5: %s (%d)", self.mainConf.verPyQtString, self.mainConf.verPyQtValue)
logger.info("Python: %s (0x%x)", self.mainConf.verPyString, self.mainConf.verPyHexVal)
logger.info("Qt5: %s (0x%06x)", self.mainConf.verQtString, self.mainConf.verQtValue)
logger.info("PyQt5: %s (0x%06x)", self.mainConf.verPyQtString, self.mainConf.verPyQtValue)
logger.info("Python: %s (0x%08x)", self.mainConf.verPyString, self.mainConf.verPyHexVal)
logger.info("GUI Language: %s", self.mainConf.guiLocale)

# Core Classes
Expand Down
25 changes: 3 additions & 22 deletions tests/test_base/test_base_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@
checkStringNone, checkString, checkInt, checkFloat, checkBool, checkHandle,
checkUuid, checkPath, isHandle, isTitleTag, isItemClass, isItemType,
isItemLayout, hexToInt, minmax, checkIntTuple, formatInt, formatTimeStamp,
formatTime, simplified, yesNo, splitVersionNumber, transferCase, fuzzyTime,
numberToRoman, jsonEncode, readTextFile, makeFileNameSafe, sha256sum,
getGuiItem, NWConfigParser
formatTime, simplified, yesNo, transferCase, fuzzyTime, numberToRoman,
jsonEncode, readTextFile, makeFileNameSafe, sha256sum, getGuiItem,
NWConfigParser
)


Expand Down Expand Up @@ -398,25 +398,6 @@ def testBaseCommon_YesNo():
# END Test testBaseCommon_YesNo


@pytest.mark.base
def testBaseCommon_SplitVersionNumber():
"""Test the splitVersionNumber function.
"""
# OK Values
assert splitVersionNumber("1") == (1, 0, 0, 10000)
assert splitVersionNumber("1.2") == (1, 2, 0, 10200)
assert splitVersionNumber("1.2.3") == (1, 2, 3, 10203)
assert splitVersionNumber("1.2.3.4") == (1, 2, 3, 10203)
assert splitVersionNumber("99.99.99") == (99, 99, 99, 999999)

# Failed Values
assert splitVersionNumber(None) == (0, 0, 0, 0)
assert splitVersionNumber(1234) == (0, 0, 0, 0)
assert splitVersionNumber("1.2abc") == (1, 0, 0, 10000)

# END Test testBaseCommon_SplitVersionNumber


@pytest.mark.base
def testBaseCommon_FormatInt():
"""Test the formatInt function.
Expand Down
4 changes: 2 additions & 2 deletions tests/test_base/test_base_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,8 +155,8 @@ def testBaseInit_Imports(caplog, monkeypatch, tmpPath):
monkeypatch.setattr("PyQt5.QtWidgets.QErrorMessage.showMessage", lambda *a: None)
monkeypatch.setitem(sys.modules, "lxml", None)
monkeypatch.setattr("sys.hexversion", 0x0)
monkeypatch.setattr("novelwriter.CONFIG.verQtValue", 50000)
monkeypatch.setattr("novelwriter.CONFIG.verPyQtValue", 50000)
monkeypatch.setattr("novelwriter.CONFIG.verQtValue", 0x050000)
monkeypatch.setattr("novelwriter.CONFIG.verPyQtValue", 0x050000)

with pytest.raises(SystemExit) as ex:
_ = novelwriter.main(
Expand Down

0 comments on commit fe6d4de

Please sign in to comment.