...
 
Commits (15)
image: tomogui:latest
test:
stage: test
# TODO: have at least one unit test with the lastest version of freeart to insure compatibility
# do the same for the different silx versions
test:debian.8-python2.7-silx0.8-PySide2-latest_freeartrelease:
type: test
image: docker-registry.esrf.fr/dau/opengl:python2.7-jessie
script:
- echo 'current dir is '
- pwd
- echo '--------------- Unit test under - PySide2 WITHOUT freeart ---------'
- echo 'source /home/gitlab-runner/venvs/tomogui_python2_no_freeart/bin/activate'
- source /home/gitlab-runner/venvs/tomogui_python2_no_freeart/bin/activate
- python info_version.py
- xvfb-run --server-args="-screen 0 1024x768x24" -a ./bootstrap.py run_tests.py -v
- deactivate
- echo '--------------- Unit test under python3 - PyQt5 with freeart ------'
- echo 'source /home/gitlab-runner/venvs/tomogui_python2/bin/activate'
- source /home/gitlab-runner/venvs/tomogui_python3/bin/activate
- python info_version.py
- xvfb-run --server-args="-screen 0 1024x768x24" -a ./bootstrap.py run_tests.py -v
- deactivate
- echo '--------------- Unit test under - PySide2 WITH freeart ------------'
- echo 'source /home/gitlab-runner/venvs/tomogui_python2/bin/activate'
- source /home/gitlab-runner/venvs/tomogui_python2/bin/activate
- python info_version.py
- xvfb-run --server-args="-screen 0 1024x768x24" -a ./bootstrap.py run_tests.py -v
- deactivate
- export http_proxy=http://proxy.esrf.fr:3128/
- export https_proxy=http://proxy.esrf.fr:3128/
- python --version
- python -m pip install pip --upgrade
- python -m pip install setuptools --upgrade
- python -m pip install PySide2
- python -m pip install silx
- python -m pip install matplotlib
- source ./ci/tomogui_install.sh
- install_freeart 'master'
- freeart_version
- python -m pip install .
- xvfb-run --server-args="-screen 0 1024x768x24" -a tomogui test -v
#
#test:debian.8-python3.4-silx0.8-PySide2-freeartmaster:
# type: test
# image: docker-registry.esrf.fr/dau/opengl:python3.4-jessie
# script:
# - export http_proxy=http://proxy.esrf.fr:3128/
# - export https_proxy=http://proxy.esrf.fr:3128/
# - python --version
# - pip install pip --upgrade
# - pip install setuptools --upgrade
# - pip install PyQt5
# - pip install silx
# - pip install matplotlib
# - source ./ci/tomogui_install.sh
# - install_freeart 'master'
# - pip install .
# - xvfb-run --server-args="-screen 0 1024x768x24" -a tomogui test -v
test:debian.9-python3.5-silx0.8-PyQt5-freeartmaster:
type: test
image: docker-registry.esrf.fr/dau/opengl:python3.5-stretch
script:
- export http_proxy=http://proxy.esrf.fr:3128/
- export https_proxy=http://proxy.esrf.fr:3128/
- python --version
- python -m pip install pip --upgrade
- python -m pip install setuptools --upgrade
- python -m pip install PyQt5
- python -m pip install matplotlib
- python -m pip install -r requirements.txt
- source ./ci/tomogui_install.sh
- install_freeart 'master'
- freeart_version
- python -m pip install .
- xvfb-run --server-args="-screen 0 1024x768x24" -a tomogui test -v
# TODO: add this, but require opencl at least installed and configure...
#test:debian.9-python3.5-silx0.8-PyQt5-nofreeart:
# type: test
# image: docker-registry.esrf.fr/dau/opengl:python3.5-stretch
# script:
# - export http_proxy=http://proxy.esrf.fr:3128/
# - export https_proxy=http://proxy.esrf.fr:3128/
# - python --version
# - pip install pip --upgrade
# - pip install setuptools --upgrade
# - pip install PyQt5
# - pip install matplotlib
# - pip install -r requirements.txt
# - pip install .
# - xvfb-run --server-args="-screen 0 1024x768x24" -a tomogui test -v
#!/bin/bash
function install_freeart(){
if [ "$2" = 'latest' ]; then
pip install freeart
else
unset http_proxy
unset https_proxy
mkdir freeart
cd freeart
wget https://gitlab.esrf.fr/freeart/freeart/repository/master/archive.tar
tar -xvf archive.tar
rm archive.tar
cd ./*
python -m pip install -r requirements.txt
python -m pip install .
cd ../../
export http_proxy=http://proxy.esrf.fr:3128/
export https_proxy=http://proxy.esrf.fr:3128/
fi
}
function freeart_version(){
python -c 'import freeart; print(freeart.version)'
}
import silx
print('silx version is ', silx._version.version)
from silx.gui import qt
print('qt version is ', qt.qVersion())
try:
import freeart
except:
pass
else:
print('freeart version is ', freeart._version.version)
import numpy
print('numpy version is ', numpy.version.version)
import fisx
print('fisx version is ', fisx.version())
# List all dependencies of freeart
# Requires pip >= 8.0
silx >= 0.6 # for GUI
silx >= 0.8 # for GUI
fabio # for IO
h5py
......@@ -71,6 +71,9 @@ def main():
launcher.add_command("materials",
module_name="tomogui.app.materials",
description="Allow materials edition from a .h5")
launcher.add_command("test",
module_name="tomogui.app.test_",
description="Launch tomogui unittest")
status = launcher.execute(sys.argv)
return status
......
......@@ -36,6 +36,7 @@ import sys
import argparse
import logging
def getinputinfo():
return "tomogui norm [] []"
......
# coding: utf-8
# /*##########################################################################
# Copyright (C) 2016-2018 European Synchrotron Radiation Facility
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
# ############################################################################*/
"""Launch unittests of the library"""
__authors__ = ["V. Valls"]
__license__ = "MIT"
__date__ = "12/01/2018"
import sys
import argparse
import logging
import unittest
class StreamHandlerUnittestReady(logging.StreamHandler):
"""The unittest class TestResult redefine sys.stdout/err to capture
stdout/err from tests and to display them only when a test fail.
This class allow to use unittest stdout-capture by using the last sys.stdout
and not a cached one.
"""
def emit(self, record):
"""
:type record: logging.LogRecord
"""
self.stream = sys.stderr
super(StreamHandlerUnittestReady, self).emit(record)
def flush(self):
pass
def createBasicHandler():
"""Create the handler using the basic configuration"""
hdlr = StreamHandlerUnittestReady()
fs = logging.BASIC_FORMAT
dfs = None
fmt = logging.Formatter(fs, dfs)
hdlr.setFormatter(fmt)
return hdlr
# Use an handler compatible with unittests, else use_buffer is not working
for h in logging.root.handlers:
logging.root.removeHandler(h)
logging.root.addHandler(createBasicHandler())
logging.captureWarnings(True)
_logger = logging.getLogger(__name__)
"""Module logger"""
class TextTestResultWithSkipList(unittest.TextTestResult):
"""Override default TextTestResult to display list of skipped tests at the
end
"""
def printErrors(self):
unittest.TextTestResult.printErrors(self)
# Print skipped tests at the end
self.printErrorList("SKIPPED", self.skipped)
def main(argv):
"""
Main function to launch the unittests as an application
:param argv: Command line arguments
:returns: exit status
"""
from silx.test import utils
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("-v", "--verbose", default=0,
action="count", dest="verbose",
help="Increase verbosity. Option -v prints additional " +
"INFO messages. Use -vv for full verbosity, " +
"including debug messages and test help strings.")
parser.add_argument("--qt-binding", dest="qt_binding", default=None,
help="Force using a Qt binding: 'PyQt5' or 'PySide2'")
utils.test_options.add_parser_argument(parser)
options = parser.parse_args(argv[1:])
test_verbosity = 1
use_buffer = True
if options.verbose == 1:
logging.root.setLevel(logging.INFO)
_logger.info("Set log level: INFO")
test_verbosity = 2
use_buffer = False
elif options.verbose > 1:
logging.root.setLevel(logging.DEBUG)
_logger.info("Set log level: DEBUG")
test_verbosity = 2
use_buffer = False
if options.qt_binding:
binding = options.qt_binding.lower()
if binding == "pyqt4":
_logger.info("Force using PyQt4")
import PyQt4.QtCore # noqa
elif binding == "pyqt5":
_logger.info("Force using PyQt5")
import PyQt5.QtCore # noqa
elif binding == "pyside":
_logger.info("Force using PySide")
import PySide.QtCore # noqa
elif binding == "pyside2":
_logger.info("Force using PySide2")
import PySide2.QtCore # noqa
else:
raise ValueError("Qt binding '%s' is unknown" % options.qt_binding)
# Configure test options
utils.test_options.configure(options)
# Run the tests
runnerArgs = {}
runnerArgs["verbosity"] = test_verbosity
runnerArgs["buffer"] = use_buffer
runner = unittest.TextTestRunner(**runnerArgs)
runner.resultclass = TextTestResultWithSkipList
# Display the result when using CTRL-C
unittest.installHandler()
import tomogui.test
test_suite = unittest.TestSuite()
test_suite.addTest(tomogui.test.suite())
result = runner.run(test_suite)
if result.wasSuccessful():
exit_status = 0
else:
exit_status = 1
return exit_status
......@@ -81,7 +81,6 @@ class AbsMatCreator(qt.QMainWindow):
def _load(self):
dialog = ImageFileDialog(self)
dialog.setFileType(TomoGUIFileTypeCB(dialog))
dialog.setDirectory(_getDefaultFolder())
result = dialog.exec_()
......
......@@ -77,6 +77,10 @@ class QDataSourceWidget(qt.QWidget, ConfigurationActor):
FREEART_FLUO_DEF: freeartconfig._ReconsConfig.FLUO_ID,
}
DICT_IDS_DEF = {}
for key, value in list(DICT_IDS.items()):
DICT_IDS_DEF[value] = key
sigReconstructionTypeChanged = qt.Signal(object)
@staticmethod
......@@ -306,14 +310,10 @@ class QDataSourceWidget(qt.QWidget, ConfigurationActor):
Value can be freeartconfig.FLUO_ID,
freeartconfig.COMPTON_ID or freeartconfig.TX_ID
"""
if val == tomoguiconfig.FBPConfig.FBP_ID:
self.qcbReconstructionType.setCurrentIndex(0)
elif val == freeartconfig._ReconsConfig.TX_ID:
self.qcbReconstructionType.setCurrentIndex(1)
elif val == freeartconfig._ReconsConfig.COMPTON_ID:
self.qcbReconstructionType.setCurrentIndex(2)
elif val == freeartconfig._ReconsConfig.FLUO_ID:
self.qcbReconstructionType.setCurrentIndex(3)
if val in self.DICT_IDS_DEF:
index = self.qcbReconstructionType.findText(self.DICT_IDS_DEF[val])
assert index >= 0
self.qcbReconstructionType.setCurrentIndex(index)
else:
err = "Given reconsparam type (%s) is not recognize" % val
raise ValueError(err)
......
......@@ -177,7 +177,7 @@ class QSampleComposition(qt.QWidget, ConfigurationActor):
self.tryToGuessBackground()
else:
self.addImage(self.config.absMat.data)
elif (self.materials is not None and self.self.materials.matComposition
elif (self.materials is not None and self.materials.matComposition
and self.materials.matComposition.data is not None):
self.addImage(numpy.zeros(self.materials.matComposition.data.shape))
self.setMaterials(self.materials)
......
......@@ -140,6 +140,8 @@ class QFileSelection(qt.QWidget):
"""
if url is None:
return
if type(url) is str and url == '':
return
_url = url
if isinstance(_url, DataUrl) is False:
_url = DataUrl(path=_url)
......
......@@ -45,6 +45,11 @@ try:
freeart_missing = False
except ImportError:
freeart_missing = True
try:
from silx.opencl.backprojection import Backprojection
has_silx_FBP = True
except ImportError:
has_silx_FBP = False
@unittest.skipIf(freeart_missing, "freeart missing")
......@@ -263,6 +268,7 @@ class FluoProject(ScenarioProject):
))
@unittest.skipIf(has_silx_FBP is False, "silx FBP missing")
class FBPProject(ScenarioProject):
"""Test that the usage of the project window for Tx is correct"""
......