From c4b4e4e64c5ea5106858ca7a0b97632521b92849 Mon Sep 17 00:00:00 2001 From: Thomas Robitaille Date: Thu, 9 Jun 2016 10:53:46 +0100 Subject: [PATCH 1/8] Make tests.py into proper unit test, and add Qt version info to pytest header --- .travis.yml | 3 ++- tests/test_main.py | 32 ++++++++++++++++++++++++++++++++ tests/tests.py | 11 ----------- 3 files changed, 34 insertions(+), 12 deletions(-) create mode 100644 tests/test_main.py delete mode 100644 tests/tests.py diff --git a/.travis.yml b/.travis.yml index 90acd7e5..0192d8d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -64,8 +64,9 @@ install: conda create -q -n test-environment python=$TRAVIS_PYTHON_VERSION qt pyside; fi - source activate test-environment + - conda install -q pytest - python setup.py install before_script: - cd tests script: - - python tests.py + - py.test \ No newline at end of file diff --git a/tests/test_main.py b/tests/test_main.py new file mode 100644 index 00000000..71311a5b --- /dev/null +++ b/tests/test_main.py @@ -0,0 +1,32 @@ +import os + + +def test_qt_api(): + """ + If QT_API is specified, we check that the correct Qt wrapper was used + """ + + from qtpy import QtCore, QtGui, QtWidgets, QtWebEngineWidgets + + QT_API = os.environ.get('QT_API', None) + + if QT_API == 'pyside': + import PySide + assert QtCore.QEvent is PySide.QtCore.QEvent + assert QtGui.QPainter is PySide.QtGui.QPainter + assert QtWidgets.QWidget is PySide.QtGui.QWidget + assert QtWebEngineWidgets.QWebEnginePage is PySide.QtWebKit.QWebPage + elif QT_API in ('pyqt', 'pyqt4'): + import PyQt4 + assert QtCore.QEvent is PyQt4.QtCore.QEvent + assert QtGui.QPainter is PyQt4.QtGui.QPainter + assert QtWidgets.QWidget is PyQt4.QtGui.QWidget + assert QtWebEngineWidgets.QWebEnginePage is PyQt4.QtWebKit.QWebPage + elif QT_API == 'pyqt5': + import PyQt5 + assert QtCore.QEvent is PyQt5.QtCore.QEvent + assert QtGui.QPainter is PyQt5.QtGui.QPainter + assert QtWidgets.QWidget is PyQt5.QtWidgets.QWidget + assert QtWebEngineWidgets.QWebEnginePage is PyQt5.QtWebEngineWidgets.QWebEnginePage + else: + pass diff --git a/tests/tests.py b/tests/tests.py deleted file mode 100644 index c31ef507..00000000 --- a/tests/tests.py +++ /dev/null @@ -1,11 +0,0 @@ -import os - -os.environ['QT_API'] = os.environ['USE_QT_API'].lower() - -from qtpy import QtCore, QtGui, QtWidgets, QtWebEngineWidgets - -print('Qt version:{0}'.format(QtCore.__version__)) -print(QtCore.QEvent) -print(QtGui.QPainter) -print(QtWidgets.QWidget) -print(QtWebEngineWidgets.QWebEnginePage) From 6a9fb4f8ad3c8fda2b12688be5058e95d5e995e7 Mon Sep 17 00:00:00 2001 From: Thomas Robitaille Date: Thu, 9 Jun 2016 11:01:09 +0100 Subject: [PATCH 2/8] Check that the priority order is respected if QT_API or USE_QT_API are not specified. --- tests/test_main.py | 61 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/tests/test_main.py b/tests/test_main.py index 71311a5b..897c1b3d 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -1,32 +1,57 @@ import os +from qtpy import QtCore, QtGui, QtWidgets, QtWebEngineWidgets + + +def assert_pyside(): + import PySide + assert QtCore.QEvent is PySide.QtCore.QEvent + assert QtGui.QPainter is PySide.QtGui.QPainter + assert QtWidgets.QWidget is PySide.QtGui.QWidget + assert QtWebEngineWidgets.QWebEnginePage is PySide.QtWebKit.QWebPage + + +def assert_pyqt4(): + import PyQt4 + assert QtCore.QEvent is PyQt4.QtCore.QEvent + assert QtGui.QPainter is PyQt4.QtGui.QPainter + assert QtWidgets.QWidget is PyQt4.QtGui.QWidget + assert QtWebEngineWidgets.QWebEnginePage is PyQt4.QtWebKit.QWebPage + + +def assert_pyqt5(): + import PyQt5 + assert QtCore.QEvent is PyQt5.QtCore.QEvent + assert QtGui.QPainter is PyQt5.QtGui.QPainter + assert QtWidgets.QWidget is PyQt5.QtWidgets.QWidget + assert QtWebEngineWidgets.QWebEnginePage is PyQt5.QtWebEngineWidgets.QWebEnginePage + def test_qt_api(): """ If QT_API is specified, we check that the correct Qt wrapper was used """ - from qtpy import QtCore, QtGui, QtWidgets, QtWebEngineWidgets - QT_API = os.environ.get('QT_API', None) if QT_API == 'pyside': - import PySide - assert QtCore.QEvent is PySide.QtCore.QEvent - assert QtGui.QPainter is PySide.QtGui.QPainter - assert QtWidgets.QWidget is PySide.QtGui.QWidget - assert QtWebEngineWidgets.QWebEnginePage is PySide.QtWebKit.QWebPage + assert_pyside() elif QT_API in ('pyqt', 'pyqt4'): - import PyQt4 - assert QtCore.QEvent is PyQt4.QtCore.QEvent - assert QtGui.QPainter is PyQt4.QtGui.QPainter - assert QtWidgets.QWidget is PyQt4.QtGui.QWidget - assert QtWebEngineWidgets.QWebEnginePage is PyQt4.QtWebKit.QWebPage + assert_pyqt4() elif QT_API == 'pyqt5': - import PyQt5 - assert QtCore.QEvent is PyQt5.QtCore.QEvent - assert QtGui.QPainter is PyQt5.QtGui.QPainter - assert QtWidgets.QWidget is PyQt5.QtWidgets.QWidget - assert QtWebEngineWidgets.QWebEnginePage is PyQt5.QtWebEngineWidgets.QWebEnginePage + assert_pyqt5() else: - pass + # We should then be loading, in order of decreasing preference, PyQt5, + # PyQt4, and PySide. + try: + import PyQt5 + except ImportError: + try: + import PyQt4 + except ImportError: + import PySide + assert_pyside() + else: + assert_pyqt4() + else: + assert_pyqt5() From fffab16fb12bfe2fcb787824705a1b63a3d06555 Mon Sep 17 00:00:00 2001 From: Thomas Robitaille Date: Thu, 9 Jun 2016 11:02:11 +0100 Subject: [PATCH 3/8] Fix test with PyQt5 --- tests/test_main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_main.py b/tests/test_main.py index 897c1b3d..702ba9ec 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -24,7 +24,7 @@ def assert_pyqt5(): assert QtCore.QEvent is PyQt5.QtCore.QEvent assert QtGui.QPainter is PyQt5.QtGui.QPainter assert QtWidgets.QWidget is PyQt5.QtWidgets.QWidget - assert QtWebEngineWidgets.QWebEnginePage is PyQt5.QtWebEngineWidgets.QWebEnginePage + assert QtWebEngineWidgets.QWebEnginePage is PyQt5.QtWebKitWidgets.QWebPage def test_qt_api(): From 1ba8c363246e489af2a2831026d6853d7c8b7b94 Mon Sep 17 00:00:00 2001 From: Thomas Robitaille Date: Thu, 9 Jun 2016 11:16:55 +0100 Subject: [PATCH 4/8] Added conftest.py --- tests/conftest.py | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 tests/conftest.py diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 00000000..90da67e0 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,47 @@ +import os + + +def pytest_configure(config): + if 'USE_QT_API' in os.environ: + os.environ['QT_API'] = os.environ['USE_QT_API'].lower() + + +def pytest_report_header(config): + + versions = os.linesep + versions += 'PyQt4: ' + + try: + from PyQt4 import Qt + versions += "PyQt: {0} - Qt: {1}".format(Qt.PYQT_VERSION_STR, Qt.QT_VERSION_STR) + except ImportError: + versions += 'not installed' + except AttributeError: + versions += 'unknown version' + + versions += os.linesep + versions += 'PyQt5: ' + + try: + from PyQt5 import Qt + versions += "PyQt: {0} - Qt: {1}".format(Qt.PYQT_VERSION_STR, Qt.QT_VERSION_STR) + except ImportError: + versions += 'not installed' + except AttributeError: + versions += 'unknown version' + + versions += os.linesep + versions += 'PySide: ' + + try: + import PySide + from PySide import QtCore + versions += "PySide: {0} - Qt: {1}".format(PySide.__version__, QtCore.__version__) + except ImportError: + versions += 'not installed' + except AttributeError: + versions += 'unknown version' + + versions += os.linesep + + return versions From ac713eb7c9d039d62a78c55fa239152c9b09196c Mon Sep 17 00:00:00 2001 From: Thomas Robitaille Date: Thu, 9 Jun 2016 11:17:15 +0100 Subject: [PATCH 5/8] Fix whitespace --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0192d8d0..bd56fb2f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -69,4 +69,4 @@ install: before_script: - cd tests script: - - py.test \ No newline at end of file + - py.test From 1bba76808aa5c598f1558cd127d8ed4a006692e1 Mon Sep 17 00:00:00 2001 From: Thomas Robitaille Date: Thu, 9 Jun 2016 11:26:18 +0100 Subject: [PATCH 6/8] Make sure we import qtpy before importing any Qt wrappers directly --- tests/conftest.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index 90da67e0..b7101b83 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,9 +2,14 @@ def pytest_configure(config): + if 'USE_QT_API' in os.environ: os.environ['QT_API'] = os.environ['USE_QT_API'].lower() + # We need to import qtpy here to make sure that the API versions get set + # straight away. + import qtpy + def pytest_report_header(config): From 0260b4f72a1b652180387e1a44d4dd9c161d9c42 Mon Sep 17 00:00:00 2001 From: Thomas Robitaille Date: Thu, 9 Jun 2016 17:18:55 +0100 Subject: [PATCH 7/8] Added comment to explain why we consider the case where USE_QT_API and QT_API are not defined. --- tests/test_main.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_main.py b/tests/test_main.py index 702ba9ec..32b9d57f 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -41,6 +41,8 @@ def test_qt_api(): elif QT_API == 'pyqt5': assert_pyqt5() else: + # If the tests are run locally, USE_QT_API and QT_API may not be + # defined, but we still want to make sure qtpy is behaving sensibly. # We should then be loading, in order of decreasing preference, PyQt5, # PyQt4, and PySide. try: From a29af9e3887b866bf6766931b85a252601af3cd9 Mon Sep 17 00:00:00 2001 From: Thomas Robitaille Date: Thu, 9 Jun 2016 18:49:30 +0100 Subject: [PATCH 8/8] Minor improvements to coding style --- tests/conftest.py | 7 +++++++ tests/test_main.py | 11 ++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index b7101b83..c31a78aa 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,6 +2,9 @@ def pytest_configure(config): + """ + This function gets run by py.test at the very start + """ if 'USE_QT_API' in os.environ: os.environ['QT_API'] = os.environ['USE_QT_API'].lower() @@ -12,6 +15,10 @@ def pytest_configure(config): def pytest_report_header(config): + """ + This function is used by py.test to insert a customized header into the + test report. + """ versions = os.linesep versions += 'PyQt4: ' diff --git a/tests/test_main.py b/tests/test_main.py index 32b9d57f..3c8cfd99 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -4,6 +4,9 @@ def assert_pyside(): + """ + Make sure that we are using PySide + """ import PySide assert QtCore.QEvent is PySide.QtCore.QEvent assert QtGui.QPainter is PySide.QtGui.QPainter @@ -12,6 +15,9 @@ def assert_pyside(): def assert_pyqt4(): + """ + Make sure that we are using PyQt4 + """ import PyQt4 assert QtCore.QEvent is PyQt4.QtCore.QEvent assert QtGui.QPainter is PyQt4.QtGui.QPainter @@ -20,6 +26,9 @@ def assert_pyqt4(): def assert_pyqt5(): + """ + Make sure that we are using PyQt5 + """ import PyQt5 assert QtCore.QEvent is PyQt5.QtCore.QEvent assert QtGui.QPainter is PyQt5.QtGui.QPainter @@ -32,7 +41,7 @@ def test_qt_api(): If QT_API is specified, we check that the correct Qt wrapper was used """ - QT_API = os.environ.get('QT_API', None) + QT_API = os.environ.get('QT_API') if QT_API == 'pyside': assert_pyside()