TST: all the testing
This commit is contained in:
parent
e7fbddcb3c
commit
ed35993ae1
@ -1,6 +1,8 @@
|
||||
import sys, os
|
||||
import pyqtgraph as pg
|
||||
|
||||
import subprocess
|
||||
from pyqtgraph.python2_3 import basestring
|
||||
from pyqtgraph.Qt import QtGui, USE_PYSIDE, USE_PYQT5
|
||||
|
||||
if __name__ == "__main__" and (__package__ is None or __package__==''):
|
||||
parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
@ -8,7 +10,112 @@ if __name__ == "__main__" and (__package__ is None or __package__==''):
|
||||
import examples
|
||||
__package__ = "examples"
|
||||
|
||||
from .utils import buildFileList, testFile, run, path, examples
|
||||
from .utils import buildFileList, testFile, path, examples
|
||||
|
||||
if USE_PYSIDE:
|
||||
from .exampleLoaderTemplate_pyside import Ui_Form
|
||||
elif USE_PYQT5:
|
||||
from .exampleLoaderTemplate_pyqt5 import Ui_Form
|
||||
else:
|
||||
from .exampleLoaderTemplate_pyqt import Ui_Form
|
||||
|
||||
class ExampleLoader(QtGui.QMainWindow):
|
||||
def __init__(self):
|
||||
QtGui.QMainWindow.__init__(self)
|
||||
self.ui = Ui_Form()
|
||||
self.cw = QtGui.QWidget()
|
||||
self.setCentralWidget(self.cw)
|
||||
self.ui.setupUi(self.cw)
|
||||
|
||||
self.codeBtn = QtGui.QPushButton('Run Edited Code')
|
||||
self.codeLayout = QtGui.QGridLayout()
|
||||
self.ui.codeView.setLayout(self.codeLayout)
|
||||
self.codeLayout.addItem(QtGui.QSpacerItem(100,100,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding), 0, 0)
|
||||
self.codeLayout.addWidget(self.codeBtn, 1, 1)
|
||||
self.codeBtn.hide()
|
||||
|
||||
global examples
|
||||
self.itemCache = []
|
||||
self.populateTree(self.ui.exampleTree.invisibleRootItem(), examples)
|
||||
self.ui.exampleTree.expandAll()
|
||||
|
||||
self.resize(1000,500)
|
||||
self.show()
|
||||
self.ui.splitter.setSizes([250,750])
|
||||
self.ui.loadBtn.clicked.connect(self.loadFile)
|
||||
self.ui.exampleTree.currentItemChanged.connect(self.showFile)
|
||||
self.ui.exampleTree.itemDoubleClicked.connect(self.loadFile)
|
||||
self.ui.codeView.textChanged.connect(self.codeEdited)
|
||||
self.codeBtn.clicked.connect(self.runEditedCode)
|
||||
|
||||
def populateTree(self, root, examples):
|
||||
for key, val in examples.items():
|
||||
item = QtGui.QTreeWidgetItem([key])
|
||||
self.itemCache.append(item) # PyQt 4.9.6 no longer keeps references to these wrappers,
|
||||
# so we need to make an explicit reference or else the .file
|
||||
# attribute will disappear.
|
||||
if isinstance(val, basestring):
|
||||
item.file = val
|
||||
else:
|
||||
self.populateTree(item, val)
|
||||
root.addChild(item)
|
||||
|
||||
def currentFile(self):
|
||||
item = self.ui.exampleTree.currentItem()
|
||||
if hasattr(item, 'file'):
|
||||
global path
|
||||
return os.path.join(path, item.file)
|
||||
return None
|
||||
|
||||
def loadFile(self, edited=False):
|
||||
|
||||
extra = []
|
||||
qtLib = str(self.ui.qtLibCombo.currentText())
|
||||
gfxSys = str(self.ui.graphicsSystemCombo.currentText())
|
||||
|
||||
if qtLib != 'default':
|
||||
extra.append(qtLib.lower())
|
||||
elif gfxSys != 'default':
|
||||
extra.append(gfxSys)
|
||||
|
||||
if edited:
|
||||
path = os.path.abspath(os.path.dirname(__file__))
|
||||
proc = subprocess.Popen([sys.executable, '-'] + extra, stdin=subprocess.PIPE, cwd=path)
|
||||
code = str(self.ui.codeView.toPlainText()).encode('UTF-8')
|
||||
proc.stdin.write(code)
|
||||
proc.stdin.close()
|
||||
else:
|
||||
fn = self.currentFile()
|
||||
if fn is None:
|
||||
return
|
||||
if sys.platform.startswith('win'):
|
||||
os.spawnl(os.P_NOWAIT, sys.executable, '"'+sys.executable+'"', '"' + fn + '"', *extra)
|
||||
else:
|
||||
os.spawnl(os.P_NOWAIT, sys.executable, sys.executable, fn, *extra)
|
||||
|
||||
def showFile(self):
|
||||
fn = self.currentFile()
|
||||
if fn is None:
|
||||
self.ui.codeView.clear()
|
||||
return
|
||||
if os.path.isdir(fn):
|
||||
fn = os.path.join(fn, '__main__.py')
|
||||
text = open(fn).read()
|
||||
self.ui.codeView.setPlainText(text)
|
||||
self.ui.loadedFileLabel.setText(fn)
|
||||
self.codeBtn.hide()
|
||||
|
||||
def codeEdited(self):
|
||||
self.codeBtn.show()
|
||||
|
||||
def runEditedCode(self):
|
||||
self.loadFile(edited=True)
|
||||
|
||||
def run():
|
||||
app = QtGui.QApplication([])
|
||||
loader = ExampleLoader()
|
||||
|
||||
app.exec_()
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
|
@ -1,14 +1,32 @@
|
||||
from __future__ import print_function, division, absolute_import
|
||||
from pyqtgraph import Qt
|
||||
from . import utils
|
||||
from examples import utils
|
||||
import importlib
|
||||
import itertools
|
||||
import pytest
|
||||
|
||||
files = utils.buildFileList(utils.examples)
|
||||
|
||||
import pytest
|
||||
frontends = {Qt.PYQT4: False, Qt.PYSIDE: False}
|
||||
# frontends = {Qt.PYQT4: False, Qt.PYQT5: False, Qt.PYSIDE: False}
|
||||
|
||||
# sort out which of the front ends are available
|
||||
for frontend in frontends.keys():
|
||||
try:
|
||||
importlib.import_module(frontend)
|
||||
frontends[frontend] = True
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
@pytest.mark.parametrize("f", files)
|
||||
def test_examples(f):
|
||||
@pytest.mark.parametrize(
|
||||
"frontend, f", itertools.product(sorted(list(frontends.keys())), files))
|
||||
def test_examples(frontend, f):
|
||||
# Test the examples with whatever the current QT_LIB front
|
||||
# end is
|
||||
utils.testFile(f[0], f[1], utils.sys.executable, Qt.QT_LIB)
|
||||
print('frontend = %s. f = %s' % (frontend, f))
|
||||
if not frontends[frontend]:
|
||||
pytest.skip('{} is not installed. Skipping tests'.format(frontend))
|
||||
utils.testFile(f[0], f[1], utils.sys.executable, frontend)
|
||||
|
||||
if __name__ == "__main__":
|
||||
pytest.cmdline.main()
|
||||
|
@ -4,17 +4,8 @@ import time
|
||||
import os
|
||||
import sys
|
||||
from pyqtgraph.pgcollections import OrderedDict
|
||||
from pyqtgraph.Qt import QtGui, USE_PYSIDE, USE_PYQT5
|
||||
from pyqtgraph.python2_3 import basestring
|
||||
|
||||
if USE_PYSIDE:
|
||||
from .exampleLoaderTemplate_pyside import Ui_Form
|
||||
elif USE_PYQT5:
|
||||
from .exampleLoaderTemplate_pyqt5 import Ui_Form
|
||||
else:
|
||||
from .exampleLoaderTemplate_pyqt import Ui_Form
|
||||
|
||||
|
||||
path = os.path.abspath(os.path.dirname(__file__))
|
||||
|
||||
|
||||
@ -96,103 +87,6 @@ examples = OrderedDict([
|
||||
('Custom Flowchart Nodes', 'FlowchartCustomNode.py'),
|
||||
])
|
||||
|
||||
class ExampleLoader(QtGui.QMainWindow):
|
||||
def __init__(self):
|
||||
QtGui.QMainWindow.__init__(self)
|
||||
self.ui = Ui_Form()
|
||||
self.cw = QtGui.QWidget()
|
||||
self.setCentralWidget(self.cw)
|
||||
self.ui.setupUi(self.cw)
|
||||
|
||||
self.codeBtn = QtGui.QPushButton('Run Edited Code')
|
||||
self.codeLayout = QtGui.QGridLayout()
|
||||
self.ui.codeView.setLayout(self.codeLayout)
|
||||
self.codeLayout.addItem(QtGui.QSpacerItem(100,100,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding), 0, 0)
|
||||
self.codeLayout.addWidget(self.codeBtn, 1, 1)
|
||||
self.codeBtn.hide()
|
||||
|
||||
global examples
|
||||
self.itemCache = []
|
||||
self.populateTree(self.ui.exampleTree.invisibleRootItem(), examples)
|
||||
self.ui.exampleTree.expandAll()
|
||||
|
||||
self.resize(1000,500)
|
||||
self.show()
|
||||
self.ui.splitter.setSizes([250,750])
|
||||
self.ui.loadBtn.clicked.connect(self.loadFile)
|
||||
self.ui.exampleTree.currentItemChanged.connect(self.showFile)
|
||||
self.ui.exampleTree.itemDoubleClicked.connect(self.loadFile)
|
||||
self.ui.codeView.textChanged.connect(self.codeEdited)
|
||||
self.codeBtn.clicked.connect(self.runEditedCode)
|
||||
|
||||
def populateTree(self, root, examples):
|
||||
for key, val in examples.items():
|
||||
item = QtGui.QTreeWidgetItem([key])
|
||||
self.itemCache.append(item) # PyQt 4.9.6 no longer keeps references to these wrappers,
|
||||
# so we need to make an explicit reference or else the .file
|
||||
# attribute will disappear.
|
||||
if isinstance(val, basestring):
|
||||
item.file = val
|
||||
else:
|
||||
self.populateTree(item, val)
|
||||
root.addChild(item)
|
||||
|
||||
def currentFile(self):
|
||||
item = self.ui.exampleTree.currentItem()
|
||||
if hasattr(item, 'file'):
|
||||
global path
|
||||
return os.path.join(path, item.file)
|
||||
return None
|
||||
|
||||
def loadFile(self, edited=False):
|
||||
|
||||
extra = []
|
||||
qtLib = str(self.ui.qtLibCombo.currentText())
|
||||
gfxSys = str(self.ui.graphicsSystemCombo.currentText())
|
||||
|
||||
if qtLib != 'default':
|
||||
extra.append(qtLib.lower())
|
||||
elif gfxSys != 'default':
|
||||
extra.append(gfxSys)
|
||||
|
||||
if edited:
|
||||
path = os.path.abspath(os.path.dirname(__file__))
|
||||
proc = subprocess.Popen([sys.executable, '-'] + extra, stdin=subprocess.PIPE, cwd=path)
|
||||
code = str(self.ui.codeView.toPlainText()).encode('UTF-8')
|
||||
proc.stdin.write(code)
|
||||
proc.stdin.close()
|
||||
else:
|
||||
fn = self.currentFile()
|
||||
if fn is None:
|
||||
return
|
||||
if sys.platform.startswith('win'):
|
||||
os.spawnl(os.P_NOWAIT, sys.executable, '"'+sys.executable+'"', '"' + fn + '"', *extra)
|
||||
else:
|
||||
os.spawnl(os.P_NOWAIT, sys.executable, sys.executable, fn, *extra)
|
||||
|
||||
def showFile(self):
|
||||
fn = self.currentFile()
|
||||
if fn is None:
|
||||
self.ui.codeView.clear()
|
||||
return
|
||||
if os.path.isdir(fn):
|
||||
fn = os.path.join(fn, '__main__.py')
|
||||
text = open(fn).read()
|
||||
self.ui.codeView.setPlainText(text)
|
||||
self.ui.loadedFileLabel.setText(fn)
|
||||
self.codeBtn.hide()
|
||||
|
||||
def codeEdited(self):
|
||||
self.codeBtn.show()
|
||||
|
||||
def runEditedCode(self):
|
||||
self.loadFile(edited=True)
|
||||
|
||||
def run():
|
||||
app = QtGui.QApplication([])
|
||||
loader = ExampleLoader()
|
||||
|
||||
app.exec_()
|
||||
|
||||
def buildFileList(examples, files=None):
|
||||
if files == None:
|
||||
@ -250,6 +144,7 @@ except:
|
||||
while True:
|
||||
c = process.stdout.read(1).decode()
|
||||
output += c
|
||||
print(output)
|
||||
#sys.stdout.write(c)
|
||||
#sys.stdout.flush()
|
||||
if output.endswith('test complete'):
|
||||
|
Loading…
Reference in New Issue
Block a user