Fix PyQt5 version check (#1325)
This commit is contained in:
@@ -179,12 +179,12 @@ def main(sysArgs=None):
|
|||||||
"At least Python 3.7 is required, found %s" % CONFIG.verPyString
|
"At least Python 3.7 is required, found %s" % CONFIG.verPyString
|
||||||
)
|
)
|
||||||
errorCode |= 0x04
|
errorCode |= 0x04
|
||||||
if CONFIG.verQtValue < 51000:
|
if CONFIG.verQtValue < 0x050a00:
|
||||||
errorData.append(
|
errorData.append(
|
||||||
"At least Qt5 version 5.10 is required, found %s" % CONFIG.verQtString
|
"At least Qt5 version 5.10 is required, found %s" % CONFIG.verQtString
|
||||||
)
|
)
|
||||||
errorCode |= 0x08
|
errorCode |= 0x08
|
||||||
if CONFIG.verPyQtValue < 51000:
|
if CONFIG.verPyQtValue < 0x050a00:
|
||||||
errorData.append(
|
errorData.append(
|
||||||
"At least PyQt5 version 5.10 is required, found %s" % CONFIG.verPyQtString
|
"At least PyQt5 version 5.10 is required, found %s" % CONFIG.verPyQtString
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -277,33 +277,6 @@ def yesNo(value):
|
|||||||
return "yes" if value else "no"
|
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):
|
def transferCase(source, target):
|
||||||
"""Transfers the case of the source word to the target word. This
|
"""Transfers the case of the source word to the target word. This
|
||||||
will consider all upper or lower, and first char capitalisation.
|
will consider all upper or lower, and first char capitalisation.
|
||||||
|
|||||||
+6
-19
@@ -30,14 +30,13 @@ import logging
|
|||||||
from time import time
|
from time import time
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from PyQt5.Qt import PYQT_VERSION_STR
|
|
||||||
from PyQt5.QtCore import (
|
from PyQt5.QtCore import (
|
||||||
QT_VERSION_STR, QStandardPaths, QSysInfo, QLocale, QLibraryInfo,
|
QT_VERSION, QT_VERSION_STR, PYQT_VERSION, PYQT_VERSION_STR, QStandardPaths,
|
||||||
QTranslator
|
QSysInfo, QLocale, QLibraryInfo, QTranslator
|
||||||
)
|
)
|
||||||
|
|
||||||
from novelwriter.error import logException, formatException
|
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
|
from novelwriter.constants import nwFiles, nwUnicode
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@@ -190,25 +189,13 @@ class Config:
|
|||||||
# ==========================
|
# ==========================
|
||||||
|
|
||||||
# Check Qt5 Versions
|
# Check Qt5 Versions
|
||||||
verQt = splitVersionNumber(QT_VERSION_STR)
|
self.verQtString = QT_VERSION_STR
|
||||||
self.verQtString = QT_VERSION_STR
|
self.verQtValue = QT_VERSION
|
||||||
self.verQtMajor = verQt[0]
|
|
||||||
self.verQtMinor = verQt[1]
|
|
||||||
self.verQtPatch = verQt[2]
|
|
||||||
self.verQtValue = verQt[3]
|
|
||||||
|
|
||||||
verQt = splitVersionNumber(PYQT_VERSION_STR)
|
|
||||||
self.verPyQtString = PYQT_VERSION_STR
|
self.verPyQtString = PYQT_VERSION_STR
|
||||||
self.verPyQtMajor = verQt[0]
|
self.verPyQtValue = PYQT_VERSION
|
||||||
self.verPyQtMinor = verQt[1]
|
|
||||||
self.verPyQtPatch = verQt[2]
|
|
||||||
self.verPyQtValue = verQt[3]
|
|
||||||
|
|
||||||
# Check Python Version
|
# Check Python Version
|
||||||
self.verPyString = sys.version.split()[0]
|
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
|
self.verPyHexVal = sys.hexversion
|
||||||
|
|
||||||
# Check OS Type
|
# Check OS Type
|
||||||
|
|||||||
@@ -112,8 +112,7 @@ class NWErrorMessage(QDialog):
|
|||||||
"""
|
"""
|
||||||
from traceback import format_tb
|
from traceback import format_tb
|
||||||
from novelwriter import __issuesurl__, __version__
|
from novelwriter import __issuesurl__, __version__
|
||||||
from PyQt5.Qt import PYQT_VERSION_STR
|
from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR, QSysInfo
|
||||||
from PyQt5.QtCore import QT_VERSION_STR, QSysInfo
|
|
||||||
|
|
||||||
self.msgHead.setText((
|
self.msgHead.setText((
|
||||||
"<p>An unhandled error has been encountered.</p>"
|
"<p>An unhandled error has been encountered.</p>"
|
||||||
|
|||||||
@@ -2512,7 +2512,7 @@ class GuiDocEditSearch(QFrame):
|
|||||||
# Using the Unicode-capable QRegularExpression class was
|
# Using the Unicode-capable QRegularExpression class was
|
||||||
# only added in Qt 5.13. Otherwise, 5.3 and up supports
|
# only added in Qt 5.13. Otherwise, 5.3 and up supports
|
||||||
# only the QRegExp class.
|
# only the QRegExp class.
|
||||||
if self.mainConf.verQtValue >= 51300:
|
if self.mainConf.verQtValue >= 0x050d00:
|
||||||
rxOpt = QRegularExpression.UseUnicodePropertiesOption
|
rxOpt = QRegularExpression.UseUnicodePropertiesOption
|
||||||
if not self.isCaseSense:
|
if not self.isCaseSense:
|
||||||
rxOpt |= QRegularExpression.CaseInsensitiveOption
|
rxOpt |= QRegularExpression.CaseInsensitiveOption
|
||||||
|
|||||||
@@ -87,9 +87,9 @@ class GuiMain(QMainWindow):
|
|||||||
logger.info("OS: %s", self.mainConf.osType)
|
logger.info("OS: %s", self.mainConf.osType)
|
||||||
logger.info("Kernel: %s", self.mainConf.kernelVer)
|
logger.info("Kernel: %s", self.mainConf.kernelVer)
|
||||||
logger.info("Host: %s", self.mainConf.hostName)
|
logger.info("Host: %s", self.mainConf.hostName)
|
||||||
logger.info("Qt5: %s (%d)", self.mainConf.verQtString, self.mainConf.verQtValue)
|
logger.info("Qt5: %s (0x%06x)", self.mainConf.verQtString, self.mainConf.verQtValue)
|
||||||
logger.info("PyQt5: %s (%d)", self.mainConf.verPyQtString, self.mainConf.verPyQtValue)
|
logger.info("PyQt5: %s (0x%06x)", self.mainConf.verPyQtString, self.mainConf.verPyQtValue)
|
||||||
logger.info("Python: %s (0x%x)", self.mainConf.verPyString, self.mainConf.verPyHexVal)
|
logger.info("Python: %s (0x%08x)", self.mainConf.verPyString, self.mainConf.verPyHexVal)
|
||||||
logger.info("GUI Language: %s", self.mainConf.guiLocale)
|
logger.info("GUI Language: %s", self.mainConf.guiLocale)
|
||||||
|
|
||||||
# Core Classes
|
# Core Classes
|
||||||
|
|||||||
@@ -33,9 +33,9 @@ from novelwriter.common import (
|
|||||||
checkStringNone, checkString, checkInt, checkFloat, checkBool, checkHandle,
|
checkStringNone, checkString, checkInt, checkFloat, checkBool, checkHandle,
|
||||||
checkUuid, checkPath, isHandle, isTitleTag, isItemClass, isItemType,
|
checkUuid, checkPath, isHandle, isTitleTag, isItemClass, isItemType,
|
||||||
isItemLayout, hexToInt, minmax, checkIntTuple, formatInt, formatTimeStamp,
|
isItemLayout, hexToInt, minmax, checkIntTuple, formatInt, formatTimeStamp,
|
||||||
formatTime, simplified, yesNo, splitVersionNumber, transferCase, fuzzyTime,
|
formatTime, simplified, yesNo, transferCase, fuzzyTime, numberToRoman,
|
||||||
numberToRoman, jsonEncode, readTextFile, makeFileNameSafe, sha256sum,
|
jsonEncode, readTextFile, makeFileNameSafe, sha256sum, getGuiItem,
|
||||||
getGuiItem, NWConfigParser
|
NWConfigParser
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -398,25 +398,6 @@ def testBaseCommon_YesNo():
|
|||||||
# END Test 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
|
@pytest.mark.base
|
||||||
def testBaseCommon_FormatInt():
|
def testBaseCommon_FormatInt():
|
||||||
"""Test the formatInt function.
|
"""Test the formatInt function.
|
||||||
|
|||||||
@@ -155,8 +155,8 @@ def testBaseInit_Imports(caplog, monkeypatch, tmpPath):
|
|||||||
monkeypatch.setattr("PyQt5.QtWidgets.QErrorMessage.showMessage", lambda *a: None)
|
monkeypatch.setattr("PyQt5.QtWidgets.QErrorMessage.showMessage", lambda *a: None)
|
||||||
monkeypatch.setitem(sys.modules, "lxml", None)
|
monkeypatch.setitem(sys.modules, "lxml", None)
|
||||||
monkeypatch.setattr("sys.hexversion", 0x0)
|
monkeypatch.setattr("sys.hexversion", 0x0)
|
||||||
monkeypatch.setattr("novelwriter.CONFIG.verQtValue", 50000)
|
monkeypatch.setattr("novelwriter.CONFIG.verQtValue", 0x050000)
|
||||||
monkeypatch.setattr("novelwriter.CONFIG.verPyQtValue", 50000)
|
monkeypatch.setattr("novelwriter.CONFIG.verPyQtValue", 0x050000)
|
||||||
|
|
||||||
with pytest.raises(SystemExit) as ex:
|
with pytest.raises(SystemExit) as ex:
|
||||||
_ = novelwriter.main(
|
_ = novelwriter.main(
|
||||||
|
|||||||
Reference in New Issue
Block a user